1
0
Fork 0
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:
Alice Groux 2021-02-26 16:50:33 +01:00 committed by GitHub
parent 158bdae10e
commit ccf6babc02
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
40 changed files with 951 additions and 976 deletions

View file

@ -1,4 +1,4 @@
import * as _ from 'lodash-es';
import _ from 'lodash-es';
import angular from 'angular';
import PortainerError from 'Portainer/error';

View file

@ -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);

View file

@ -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);

View file

@ -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);