mirror of
https://github.com/portainer/portainer.git
synced 2025-08-04 13:25:26 +02:00
refactor(app): backport technical changes (#4679)
* refactor(app): backport technical changes * refactor(app): remove EE only features * feat(app): small review changes to match EE codebase layout on some files Co-authored-by: xAt0mZ <baron_l@epitech.eu>
This commit is contained in:
parent
158bdae10e
commit
ccf6babc02
40 changed files with 951 additions and 976 deletions
|
@ -1,4 +1,4 @@
|
|||
import * as _ from 'lodash-es';
|
||||
import _ from 'lodash-es';
|
||||
import angular from 'angular';
|
||||
import PortainerError from 'Portainer/error';
|
||||
|
||||
|
|
|
@ -1,35 +1,22 @@
|
|||
import * as _ from 'lodash-es';
|
||||
import { KubernetesResourceQuota } from 'Kubernetes/models/resource-quota/models';
|
||||
import _ from 'lodash-es';
|
||||
|
||||
import angular from 'angular';
|
||||
import KubernetesResourcePoolConverter from 'Kubernetes/converters/resourcePool';
|
||||
import KubernetesResourceQuotaHelper from 'Kubernetes/helpers/resourceQuotaHelper';
|
||||
import { KubernetesNamespace } from 'Kubernetes/models/namespace/models';
|
||||
import KubernetesResourceReservationHelper from 'Kubernetes/helpers/resourceReservationHelper';
|
||||
import { KubernetesIngressConverter } from 'Kubernetes/ingress/converter';
|
||||
import KubernetesCommonHelper from 'Kubernetes/helpers/commonHelper';
|
||||
|
||||
class KubernetesResourcePoolService {
|
||||
/* @ngInject */
|
||||
constructor($async, KubernetesNamespaceService, KubernetesResourceQuotaService, KubernetesIngressService) {
|
||||
this.$async = $async;
|
||||
this.KubernetesNamespaceService = KubernetesNamespaceService;
|
||||
this.KubernetesResourceQuotaService = KubernetesResourceQuotaService;
|
||||
this.KubernetesIngressService = KubernetesIngressService;
|
||||
/* @ngInject */
|
||||
export function KubernetesResourcePoolService($async, KubernetesNamespaceService, KubernetesResourceQuotaService, KubernetesIngressService) {
|
||||
return {
|
||||
get,
|
||||
create,
|
||||
patch,
|
||||
delete: _delete,
|
||||
};
|
||||
|
||||
this.getAsync = this.getAsync.bind(this);
|
||||
this.getAllAsync = this.getAllAsync.bind(this);
|
||||
this.createAsync = this.createAsync.bind(this);
|
||||
this.deleteAsync = this.deleteAsync.bind(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* GET
|
||||
*/
|
||||
async getAsync(name) {
|
||||
async function getOne(name) {
|
||||
try {
|
||||
const namespace = await this.KubernetesNamespaceService.get(name);
|
||||
const [quotaAttempt] = await Promise.allSettled([this.KubernetesResourceQuotaService.get(name, KubernetesResourceQuotaHelper.generateResourceQuotaName(name))]);
|
||||
const namespace = await KubernetesNamespaceService.get(name);
|
||||
const [quotaAttempt] = await Promise.allSettled([KubernetesResourceQuotaService.get(name, KubernetesResourceQuotaHelper.generateResourceQuotaName(name))]);
|
||||
const pool = KubernetesResourcePoolConverter.apiToResourcePool(namespace);
|
||||
if (quotaAttempt.status === 'fulfilled') {
|
||||
pool.Quota = quotaAttempt.value;
|
||||
|
@ -41,13 +28,13 @@ class KubernetesResourcePoolService {
|
|||
}
|
||||
}
|
||||
|
||||
async getAllAsync() {
|
||||
async function getAll() {
|
||||
try {
|
||||
const namespaces = await this.KubernetesNamespaceService.get();
|
||||
const namespaces = await KubernetesNamespaceService.get();
|
||||
const pools = await Promise.all(
|
||||
_.map(namespaces, async (namespace) => {
|
||||
const name = namespace.Name;
|
||||
const [quotaAttempt] = await Promise.allSettled([this.KubernetesResourceQuotaService.get(name, KubernetesResourceQuotaHelper.generateResourceQuotaName(name))]);
|
||||
const [quotaAttempt] = await Promise.allSettled([KubernetesResourceQuotaService.get(name, KubernetesResourceQuotaHelper.generateResourceQuotaName(name))]);
|
||||
const pool = KubernetesResourcePoolConverter.apiToResourcePool(namespace);
|
||||
if (quotaAttempt.status === 'fulfilled') {
|
||||
pool.Quota = quotaAttempt.value;
|
||||
|
@ -62,66 +49,75 @@ class KubernetesResourcePoolService {
|
|||
}
|
||||
}
|
||||
|
||||
get(name) {
|
||||
function get(name) {
|
||||
if (name) {
|
||||
return this.$async(this.getAsync, name);
|
||||
return $async(getOne, name);
|
||||
}
|
||||
return this.$async(this.getAllAsync);
|
||||
return $async(getAll);
|
||||
}
|
||||
|
||||
/**
|
||||
* CREATE
|
||||
* @param {KubernetesResourcePoolFormValues} formValues
|
||||
*/
|
||||
async createAsync(formValues) {
|
||||
formValues.Owner = KubernetesCommonHelper.ownerToLabel(formValues.Owner);
|
||||
function create(formValues) {
|
||||
return $async(async () => {
|
||||
try {
|
||||
const [namespace, quota, ingresses] = KubernetesResourcePoolConverter.formValuesToResourcePool(formValues);
|
||||
await KubernetesNamespaceService.create(namespace);
|
||||
|
||||
try {
|
||||
const namespace = new KubernetesNamespace();
|
||||
namespace.Name = formValues.Name;
|
||||
namespace.ResourcePoolName = formValues.Name;
|
||||
namespace.ResourcePoolOwner = formValues.Owner;
|
||||
await this.KubernetesNamespaceService.create(namespace);
|
||||
if (formValues.HasQuota) {
|
||||
const quota = new KubernetesResourceQuota(formValues.Name);
|
||||
quota.CpuLimit = formValues.CpuLimit;
|
||||
quota.MemoryLimit = KubernetesResourceReservationHelper.bytesValue(formValues.MemoryLimit);
|
||||
quota.ResourcePoolName = formValues.Name;
|
||||
quota.ResourcePoolOwner = formValues.Owner;
|
||||
await this.KubernetesResourceQuotaService.create(quota);
|
||||
}
|
||||
const ingressPromises = _.map(formValues.IngressClasses, (c) => {
|
||||
if (c.Selected) {
|
||||
c.Namespace = namespace.Name;
|
||||
const ingress = KubernetesIngressConverter.resourcePoolIngressClassFormValueToIngress(c);
|
||||
return this.KubernetesIngressService.create(ingress);
|
||||
if (quota) {
|
||||
await KubernetesResourceQuotaService.create(quota);
|
||||
}
|
||||
});
|
||||
await Promise.all(ingressPromises);
|
||||
} catch (err) {
|
||||
throw err;
|
||||
}
|
||||
const ingressPromises = _.map(ingresses, (i) => KubernetesIngressService.create(i));
|
||||
await Promise.all(ingressPromises);
|
||||
} catch (err) {
|
||||
throw err;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
create(formValues) {
|
||||
return this.$async(this.createAsync, formValues);
|
||||
function patch(oldFormValues, newFormValues) {
|
||||
return $async(async () => {
|
||||
try {
|
||||
const [oldNamespace, oldQuota, oldIngresses] = KubernetesResourcePoolConverter.formValuesToResourcePool(oldFormValues);
|
||||
const [newNamespace, newQuota, newIngresses] = KubernetesResourcePoolConverter.formValuesToResourcePool(newFormValues);
|
||||
void oldNamespace, newNamespace;
|
||||
|
||||
if (oldQuota && newQuota) {
|
||||
await KubernetesResourceQuotaService.patch(oldQuota, newQuota);
|
||||
} else if (!oldQuota && newQuota) {
|
||||
await KubernetesResourceQuotaService.create(newQuota);
|
||||
} else if (oldQuota && !newQuota) {
|
||||
await KubernetesResourceQuotaService.delete(oldQuota);
|
||||
}
|
||||
|
||||
const create = _.filter(newIngresses, (ing) => !_.find(oldIngresses, { Name: ing.Name }));
|
||||
const del = _.filter(oldIngresses, (ing) => !_.find(newIngresses, { Name: ing.Name }));
|
||||
const patch = _.without(newIngresses, ...create);
|
||||
|
||||
const createPromises = _.map(create, (i) => KubernetesIngressService.create(i));
|
||||
const delPromises = _.map(del, (i) => KubernetesIngressService.delete(i));
|
||||
const patchPromises = _.map(patch, (ing) => {
|
||||
const old = _.find(oldIngresses, { Name: ing.Name });
|
||||
ing.Paths = angular.copy(old.Paths);
|
||||
ing.PreviousHost = old.Host;
|
||||
return KubernetesIngressService.patch(old, ing);
|
||||
});
|
||||
|
||||
const promises = _.flatten([createPromises, delPromises, patchPromises]);
|
||||
await Promise.all(promises);
|
||||
} catch (err) {
|
||||
throw err;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* DELETE
|
||||
*/
|
||||
async deleteAsync(pool) {
|
||||
try {
|
||||
await this.KubernetesNamespaceService.delete(pool.Namespace);
|
||||
} catch (err) {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
|
||||
delete(pool) {
|
||||
return this.$async(this.deleteAsync, pool);
|
||||
function _delete(pool) {
|
||||
return $async(async () => {
|
||||
try {
|
||||
await KubernetesNamespaceService.delete(pool.Namespace);
|
||||
} catch (err) {
|
||||
throw err;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export default KubernetesResourcePoolService;
|
||||
angular.module('portainer.kubernetes').service('KubernetesResourcePoolService', KubernetesResourcePoolService);
|
||||
|
|
|
@ -5,105 +5,85 @@ import PortainerError from 'Portainer/error';
|
|||
import { KubernetesCommonParams } from 'Kubernetes/models/common/params';
|
||||
import KubernetesResourceQuotaConverter from 'Kubernetes/converters/resourceQuota';
|
||||
|
||||
class KubernetesResourceQuotaService {
|
||||
/* @ngInject */
|
||||
constructor($async, KubernetesResourceQuotas) {
|
||||
this.$async = $async;
|
||||
this.KubernetesResourceQuotas = KubernetesResourceQuotas;
|
||||
/* @ngInject */
|
||||
export function KubernetesResourceQuotaService($async, KubernetesResourceQuotas) {
|
||||
return {
|
||||
get,
|
||||
create,
|
||||
patch,
|
||||
delete: _delete,
|
||||
};
|
||||
|
||||
this.getAsync = this.getAsync.bind(this);
|
||||
this.getAllAsync = this.getAllAsync.bind(this);
|
||||
this.createAsync = this.createAsync.bind(this);
|
||||
this.updateAsync = this.updateAsync.bind(this);
|
||||
this.deleteAsync = this.deleteAsync.bind(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* GET
|
||||
*/
|
||||
async getAsync(namespace, name) {
|
||||
async function getOne(namespace, name) {
|
||||
try {
|
||||
const params = new KubernetesCommonParams();
|
||||
params.id = name;
|
||||
const [raw, yaml] = await Promise.all([this.KubernetesResourceQuotas(namespace).get(params).$promise, this.KubernetesResourceQuotas(namespace).getYaml(params).$promise]);
|
||||
const [raw, yaml] = await Promise.all([KubernetesResourceQuotas(namespace).get(params).$promise, KubernetesResourceQuotas(namespace).getYaml(params).$promise]);
|
||||
return KubernetesResourceQuotaConverter.apiToResourceQuota(raw, yaml);
|
||||
} catch (err) {
|
||||
throw new PortainerError('Unable to retrieve resource quota', err);
|
||||
}
|
||||
}
|
||||
|
||||
async getAllAsync(namespace) {
|
||||
async function getAll(namespace) {
|
||||
try {
|
||||
const data = await this.KubernetesResourceQuotas(namespace).get().$promise;
|
||||
const data = await KubernetesResourceQuotas(namespace).get().$promise;
|
||||
return _.map(data.items, (item) => KubernetesResourceQuotaConverter.apiToResourceQuota(item));
|
||||
} catch (err) {
|
||||
throw new PortainerError('Unable to retrieve resource quotas', err);
|
||||
}
|
||||
}
|
||||
|
||||
get(namespace, name) {
|
||||
function get(namespace, name) {
|
||||
if (name) {
|
||||
return this.$async(this.getAsync, namespace, name);
|
||||
return $async(getOne, namespace, name);
|
||||
}
|
||||
return this.$async(this.getAllAsync, namespace);
|
||||
return $async(getAll, namespace);
|
||||
}
|
||||
|
||||
/**
|
||||
* CREATE
|
||||
*/
|
||||
async createAsync(quota) {
|
||||
try {
|
||||
const payload = KubernetesResourceQuotaConverter.createPayload(quota);
|
||||
const namespace = payload.metadata.namespace;
|
||||
const params = {};
|
||||
const data = await this.KubernetesResourceQuotas(namespace).create(params, payload).$promise;
|
||||
return KubernetesResourceQuotaConverter.apiToResourceQuota(data);
|
||||
} catch (err) {
|
||||
throw new PortainerError('Unable to create quota', err);
|
||||
}
|
||||
function create(quota) {
|
||||
return $async(async () => {
|
||||
try {
|
||||
const payload = KubernetesResourceQuotaConverter.createPayload(quota);
|
||||
const namespace = payload.metadata.namespace;
|
||||
const params = {};
|
||||
const data = await KubernetesResourceQuotas(namespace).create(params, payload).$promise;
|
||||
return KubernetesResourceQuotaConverter.apiToResourceQuota(data);
|
||||
} catch (err) {
|
||||
throw new PortainerError('Unable to create quota', err);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
create(quota) {
|
||||
return this.$async(this.createAsync, quota);
|
||||
function patch(oldQuota, newQuota) {
|
||||
return $async(async () => {
|
||||
try {
|
||||
const params = new KubernetesCommonParams();
|
||||
params.id = newQuota.Name;
|
||||
const namespace = newQuota.Namespace;
|
||||
const payload = KubernetesResourceQuotaConverter.patchPayload(oldQuota, newQuota);
|
||||
if (!payload.length) {
|
||||
return;
|
||||
}
|
||||
const data = await KubernetesResourceQuotas(namespace).patch(params, payload).$promise;
|
||||
return data;
|
||||
} catch (err) {
|
||||
throw new PortainerError('Unable to update resource quota', err);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* UPDATE
|
||||
*/
|
||||
async updateAsync(quota) {
|
||||
try {
|
||||
const payload = KubernetesResourceQuotaConverter.updatePayload(quota);
|
||||
const params = new KubernetesCommonParams();
|
||||
params.id = payload.metadata.name;
|
||||
const namespace = payload.metadata.namespace;
|
||||
const data = await this.KubernetesResourceQuotas(namespace).update(params, payload).$promise;
|
||||
return data;
|
||||
} catch (err) {
|
||||
throw new PortainerError('Unable to update resource quota', err);
|
||||
}
|
||||
}
|
||||
|
||||
update(quota) {
|
||||
return this.$async(this.updateAsync, quota);
|
||||
}
|
||||
|
||||
/**
|
||||
* DELETE
|
||||
*/
|
||||
async deleteAsync(quota) {
|
||||
try {
|
||||
const params = new KubernetesCommonParams();
|
||||
params.id = quota.Name;
|
||||
await this.KubernetesResourceQuotas(quota.Namespace).delete(params).$promise;
|
||||
} catch (err) {
|
||||
throw new PortainerError('Unable to delete quota', err);
|
||||
}
|
||||
}
|
||||
|
||||
delete(quota) {
|
||||
return this.$async(this.deleteAsync, quota);
|
||||
function _delete(quota) {
|
||||
return $async(async () => {
|
||||
try {
|
||||
const params = new KubernetesCommonParams();
|
||||
params.id = quota.Name;
|
||||
await KubernetesResourceQuotas(quota.Namespace).delete(params).$promise;
|
||||
} catch (err) {
|
||||
throw new PortainerError('Unable to delete quota', err);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export default KubernetesResourceQuotaService;
|
||||
angular.module('portainer.kubernetes').service('KubernetesResourceQuotaService', KubernetesResourceQuotaService);
|
||||
|
|
|
@ -21,7 +21,7 @@ class KubernetesVolumeService {
|
|||
*/
|
||||
async getAsync(namespace, name) {
|
||||
try {
|
||||
const [pvc, pool] = await Promise.all([await this.KubernetesPersistentVolumeClaimService.get(namespace, name), await this.KubernetesResourcePoolService.get(namespace)]);
|
||||
const [pvc, pool] = await Promise.all([this.KubernetesPersistentVolumeClaimService.get(namespace, name), this.KubernetesResourcePoolService.get(namespace)]);
|
||||
return KubernetesVolumeConverter.pvcToVolume(pvc, pool);
|
||||
} catch (err) {
|
||||
throw err;
|
||||
|
@ -30,7 +30,8 @@ class KubernetesVolumeService {
|
|||
|
||||
async getAllAsync(namespace) {
|
||||
try {
|
||||
const pools = await this.KubernetesResourcePoolService.get(namespace);
|
||||
const data = await this.KubernetesResourcePoolService.get(namespace);
|
||||
const pools = data instanceof Array ? data : [data];
|
||||
const res = await Promise.all(
|
||||
_.map(pools, async (pool) => {
|
||||
const pvcs = await this.KubernetesPersistentVolumeClaimService.get(pool.Namespace.Name);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue