UNPKG

@alauda-fe/custom-resource-quota

Version:

custom resource

98 lines 15 kB
import { K8sApiService, K8sUtilService, matchLabelsToString, PUBLIC_NAMESPACE, publishRef, RESOURCE_TYPES, skipError, } from '@alauda-fe/common'; import { HttpClient } from '@angular/common/http'; import { inject, Injectable } from '@angular/core'; import { keys } from 'lodash-es'; import { forkJoin, map, switchMap } from 'rxjs'; import * as i0 from "@angular/core"; export class CustomResourceQuotaService { constructor() { this.httpClient = inject(HttpClient); this.k8sUtil = inject(K8sUtilService); this.k8sApi = inject((K8sApiService)); this.resourceQuota$Cache = new Map(); } getResourceQuota$(cluster, namespace) { let resourceQuota$; const cacheKey = [cluster, namespace].join(','); if ((resourceQuota$ = this.resourceQuota$Cache.get(cacheKey))) { return resourceQuota$; } resourceQuota$ = forkJoin([ this.k8sApi .getResourceList({ type: RESOURCE_TYPES.CONFIG_MAP, cluster, namespace: PUBLIC_NAMESPACE, queryParams: { labelSelector: matchLabelsToString({ [this.k8sUtil.normalizeType('type', 'features')]: 'CustomResourceLimitation', }), }, }) .pipe(map(res => res.items), skipError([])), this.k8sApi .getResource({ type: RESOURCE_TYPES.RESOURCE_QUOTA, cluster, namespace, name: 'default', }) .pipe(skipError(null)), this.getAvailableCustomResourceKeysInNodes({ namespace, cluster, }), ]).pipe(map(([configMaps, resourceQuota, availableKeys]) => { return { customResourceConfigs: configMaps .map(c => c.data) .filter((config) => config.ignoreNodeCheck === 'true' || availableKeys.includes(config?.key)), resourceQuota, }; }), publishRef()); this.resourceQuota$Cache.set(cacheKey, resourceQuota$); return resourceQuota$; } getAvailableCustomResourceKeysInNodes(workspace) { return this.k8sApi .getResource({ type: RESOURCE_TYPES.NAMESPACE, cluster: workspace.cluster, name: workspace.namespace, }) .pipe(switchMap(namespace => this.k8sApi .getResourceList({ type: RESOURCE_TYPES.NODE, cluster: workspace.cluster, }) .pipe(map(({ items }) => { const groupInNamespace = this.k8sUtil.getLabel(namespace, 'node-group-name', 'acp'); const availableNodes = items?.filter(node => { const groupInNode = this.k8sUtil.getLabel(node, 'node-group-name', 'acp'); const groupInNodeSharedMode = this.k8sUtil.getLabel(node, 'node-group-share-mode', 'acp'); return (!groupInNode || groupInNodeSharedMode === 'Share' || groupInNode === groupInNamespace); }); const allocatableInAllNodes = availableNodes?.reduce((acc, curr) => { return { ...acc, ...curr?.status?.allocatable, }; }, []); return keys(allocatableInAllNodes); })))); } removeCache(cluster, namespace) { const cacheKey = [cluster, namespace].join(','); this.resourceQuota$Cache.delete(cacheKey); } static { this.ɵfac = function CustomResourceQuotaService_Factory(t) { return new (t || CustomResourceQuotaService)(); }; } static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: CustomResourceQuotaService, factory: CustomResourceQuotaService.ɵfac, providedIn: 'root' }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CustomResourceQuotaService, [{ type: Injectable, args: [{ providedIn: 'root' }] }], null, null); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL21vZHVsZXMvY3VzdG9tLXJlc291cmNlLXF1b3RhL3NyYy9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxhQUFhLEVBQ2IsY0FBYyxFQUVkLG1CQUFtQixFQUVuQixnQkFBZ0IsRUFDaEIsVUFBVSxFQUNWLGNBQWMsRUFFZCxTQUFTLEdBSVYsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBYyxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBSzVELE1BQU0sT0FBTywwQkFBMEI7SUFEdkM7UUFFRSxlQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2YsWUFBTyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNqQyxXQUFNLEdBQUcsTUFBTSxDQUFDLENBQUEsYUFBMkIsQ0FBQSxDQUFDLENBQUM7UUFFN0Msd0JBQW1CLEdBQUcsSUFBSSxHQUFHLEVBTTNDLENBQUM7S0E0SEw7SUExSEMsaUJBQWlCLENBQUMsT0FBZSxFQUFFLFNBQWlCO1FBQ2xELElBQUksY0FHRixDQUFDO1FBRUgsTUFBTSxRQUFRLEdBQUcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWhELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDOUQsT0FBTyxjQUFjLENBQUM7UUFDeEIsQ0FBQztR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cUJBQXFCLEtBQUssT0FBTztvQkFDakMsV0FBVyxLQUFLLGdCQUFnQixDQUNqQyxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7WUFDSCxNQUFNLHFCQUFxQixHQUFHLGNBQWMsRUFBRSxNQUFNLENBQ2xELENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFO2dCQUNaLE9BQU87b0JBQ0wsR0FBRyxHQUFHO29CQUNOLEdBQUcsSUFBSSxFQUFFLE1BQU0sRUFBRSxXQUFXO2lCQUM3QixDQUFDO1lBQ0osQ0FBQyxFQUNELEVBQWMsQ0FDZixDQUFDO1lBQ0YsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FDSCxDQUNKLENBQ0YsQ0FBQztJQUNOLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBZSxFQUFFLFNBQWlCO1FBQzVDLE1BQU0sUUFBUSxHQUFHLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVDLENBQUM7MkZBdElVLDBCQUEwQjt1RUFBMUIsMEJBQTBCLFdBQTFCLDBCQUEwQixtQkFEYixNQUFNOztpRkFDbkIsMEJBQTBCO2NBRHRDLFVBQVU7ZUFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb25maWdNYXAsXG4gIEs4c0FwaVNlcnZpY2UsXG4gIEs4c1V0aWxTZXJ2aWNlLFxuICBLdWJlcm5ldGVzUmVzb3VyY2UsXG4gIG1hdGNoTGFiZWxzVG9TdHJpbmcsXG4gIE5hbWVzcGFjZSxcbiAgUFVCTElDX05BTUVTUEFDRSxcbiAgcHVibGlzaFJlZixcbiAgUkVTT1VSQ0VfVFlQRVMsXG4gIFJlc291cmNlVHlwZSxcbiAgc2tpcEVycm9yLFxuICBTdHJpbmdNYXAsXG4gIFdvcmtzcGFjZSxcbiAgTm9kZSxcbn0gZnJvbSAnQGFsYXVkYS1mZS9jb21tb24nO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsga2V5cyB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBmb3JrSm9pbiwgbWFwLCBPYnNlcnZhYmxlLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgUmVzb3VyY2VRdW90YSB9IGZyb20gJy4vdHlwZXMnO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIEN1c3RvbVJlc291cmNlUXVvdGFTZXJ2aWNlIHtcbiAgaHR0cENsaWVudCA9IGluamVjdChIdHRwQ2xpZW50KTtcbiAgcHJpdmF0ZSByZWFkb25seSBrOHNVdGlsID0gaW5qZWN0KEs4c1V0aWxTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBrOHNBcGkgPSBpbmplY3QoSzhzQXBpU2VydmljZTxSZXNvdXJjZVR5cGU+KTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlUXVvdGEkQ2FjaGUgPSBuZXcgTWFwPFxuICAgIHN0cmluZyxcbiAgICBPYnNlcnZhYmxlPHtcbiAgICAgIHJlc291cmNlUXVvdGE6IFJlc291cmNlUXVvdGE7XG4gICAgICBjdXN0b21SZXNvdXJjZUNvbmZpZ3M6IFN0cmluZ01hcFtdO1xuICAgIH0+XG4gID4oKTtcblxuICBnZXRSZXNvdXJjZVF1b3RhJChjbHVzdGVyOiBzdHJpbmcsIG5hbWVzcGFjZTogc3RyaW5nKSB7XG4gICAgbGV0IHJlc291cmNlUXVvdGEkOiBPYnNlcnZhYmxlPHtcbiAgICAgIHJlc291cmNlUXVvdGE6IFJlc291cmNlUXVvdGE7XG4gICAgICBjdXN0b21SZXNvdXJjZUNvbmZpZ3M6IFN0cmluZ01hcFtdO1xuICAgIH0+O1xuXG4gICAgY29uc3QgY2FjaGVLZXkgPSBbY2x1c3RlciwgbmFtZXNwYWNlXS5qb2luKCcsJyk7XG5cbiAgICBpZiAoKHJlc291cmNlUXVvdGEkID0gdGhpcy5yZXNvdXJjZVF1b3RhJENhY2hlLmdldChjYWNoZUtleSkpKSB7XG4gICAgICByZXR1cm4gcmVzb3VyY2VRdW90YSQ7XG4gICAgfVxuXG4gICAgcmVzb3VyY2VRdW90YSQgPSBmb3JrSm9pbihbXG4gICAgICB0aGlzLms4c0FwaVxuICAgICAgICAuZ2V0UmVzb3VyY2VMaXN0PENvbmZpZ01hcD4oe1xuICAgICAgICAgIHR5cGU6IFJFU09VUkNFX1RZUEVTLkNPTkZJR19NQVAsXG4gICAgICAgICAgY2x1c3RlcixcbiAgICAgICAgICBuYW1lc3BhY2U6IFBVQkxJQ19OQU1FU1BBQ0UsXG4gICAgICAgICAgcXVlcnlQYXJhbXM6IHtcbiAgICAgICAgICAgIGxhYmVsU2VsZWN0b3I6IG1hdGNoTGFiZWxzVG9TdHJpbmcoe1xuICAgICAgICAgICAgICBbdGhpcy5rOHNVdGlsLm5vcm1hbGl6ZVR5cGUoJ3R5cGUnLCAnZmVhdHVyZXMnKV06XG4gICAgICAgICAgICAgICAgJ0N1c3RvbVJlc291cmNlTGltaXRhdGlvbicsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBtYXAocmVzID0+IHJlcy5pdGVtcyksXG4gICAgICAgICAgc2tpcEVycm9yKFtdIGFzIENvbmZpZ01hcFtdKSxcbiAgICAgICAgKSxcbiAgICAgIHRoaXMuazhzQXBpXG4gICAgICAgIC5nZXRSZXNvdXJjZTxSZXNvdXJjZVF1b3RhPih7XG4gICAgICAgICAgdHlwZTogUkVTT1VSQ0VfVFlQRVMuUkVTT1VSQ0VfUVVPVEEsXG4gICAgICAgICAgY2x1c3RlcixcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgbmFtZTogJ2RlZmF1bHQnLFxuICAgICAgICB9KVxuICAgICAgICAucGlwZShza2lwRXJyb3IobnVsbCBhcyBSZXNvdXJjZVF1b3RhKSksXG4gICAgICB0aGlzLmdldEF2YWlsYWJsZUN1c3RvbVJlc291cmNlS2V5c0luTm9kZXMoe1xuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIGNsdXN0ZXIsXG4gICAgICB9IGFzIFdvcmtzcGFjZSksXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW2NvbmZpZ01hcHMsIHJlc291cmNlUXVvdGEsIGF2YWlsYWJsZUtleXNdKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY3VzdG9tUmVzb3VyY2VDb25maWdzOiBjb25maWdNYXBzXG4gICAgICAgICAgICAubWFwKGMgPT4gYy5kYXRhKVxuICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgKGNvbmZpZzogU3RyaW5nTWFwKSA9PlxuICAgICAgICAgICAgICAgIGNvbmZpZy5pZ25vcmVOb2RlQ2hlY2sgPT09ICd0cnVlJyB8fFxuICAgICAgICAgICAgICAgIGF2YWlsYWJsZUtleXMuaW5jbHVkZXMoY29uZmlnPy5rZXkpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICByZXNvdXJjZVF1b3RhLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgICBwdWJsaXNoUmVmKCksXG4gICAgKTtcblxuICAgIHRoaXMucmVzb3VyY2VRdW90YSRDYWNoZS5zZXQoY2FjaGVLZXksIHJlc291cmNlUXVvdGEkKTtcblxuICAgIHJldHVybiByZXNvdXJjZVF1b3RhJDtcbiAgfVxuXG4gIGdldEF2YWlsYWJsZUN1c3RvbVJlc291cmNlS2V5c0luTm9kZXMoXG4gICAgd29ya3NwYWNlOiBXb3Jrc3BhY2UsXG4gICk6IE9ic2VydmFibGU8c3RyaW5nW10+IHtcbiAgICByZXR1cm4gdGhpcy5rOHNBcGlcbiAgICAgIC5nZXRSZXNvdXJjZTxOYW1lc3BhY2U+KHtcbiAgICAgICAgdHlwZTogUkVTT1VSQ0VfVFlQRVMuTkFNRVNQQUNFLFxuICAgICAgICBjbHVzdGVyOiB3b3Jrc3BhY2UuY2x1c3RlcixcbiAgICAgICAgbmFtZTogd29ya3NwYWNlLm5hbWVzcGFjZSxcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKG5hbWVzcGFjZSA9PlxuICAgICAgICAgIHRoaXMuazhzQXBpXG4gICAgICAgICAgICAuZ2V0UmVzb3VyY2VMaXN0PE5vZGU+KHtcbiAgICAgICAgICAgICAgdHlwZTogUkVTT1VSQ0VfVFlQRVMuTk9ERSxcbiAgICAgICAgICAgICAgY2x1c3Rlcjogd29ya3NwYWNlLmNsdXN0ZXIsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgIG1hcCgoeyBpdGVtcyB9KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBJbk5hbWVzcGFjZSA9IHRoaXMuazhzVXRpbC5nZXRMYWJlbChcbiAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgICAgICdub2RlLWdyb3VwLW5hbWUnLFxuICAgICAgICAgICAgICAgICAgJ2FjcCcsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhdmFpbGFibGVOb2RlcyA9IGl0ZW1zPy5maWx0ZXIobm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBncm91cEluTm9kZSA9IHRoaXMuazhzVXRpbC5nZXRMYWJlbChcbiAgICAgICAgICAgICAgICAgICAgbm9kZSBhcyBLdWJlcm5ldGVzUmVzb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICdub2RlLWdyb3VwLW5hbWUnLFxuICAgICAgICAgICAgICAgICAgICAnYWNwJyxcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBncm91cEluTm9kZVNoYXJlZE1vZGUgPSB0aGlzLms4c1V0aWwuZ2V0TGFiZWwoXG4gICAgICAgICAgICAgICAgICAgIG5vZGUgYXMgS3ViZXJuZXRlc1Jlc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAnbm9kZS1ncm91cC1zaGFyZS1tb2RlJyxcbiAgICAgICAgICAgICAgICAgICAgJ2FjcCcsXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgIWdyb3VwSW5Ob2RlIHx8XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwSW5Ob2RlU2hhcmVkTW9kZSA9PT0gJ1NoYXJlJyB8fFxuICAgICAgICAgICAgICAgICAgICBncm91cEluTm9kZSA9PT0gZ3JvdXBJbk5hbWVzcGFjZVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0YWJsZUluQWxsTm9kZXMgPSBhdmFpbGFibGVOb2Rlcz8ucmVkdWNlKFxuICAgICAgICAgICAgICAgICAgKGFjYywgY3VycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgIC4uLmFjYyxcbiAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyPy5zdGF0dXM/LmFsbG9jYXRhYmxlLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIFtdIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleXMoYWxsb2NhdGFibGVJbkFsbE5vZGVzKTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgfVxuXG4gIHJlbW92ZUNhY2hlKGNsdXN0ZXI6IHN0cmluZywgbmFtZXNwYWNlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjYWNoZUtleSA9IFtjbHVzdGVyLCBuYW1lc3BhY2VdLmpvaW4oJywnKTtcbiAgICB0aGlzLnJlc291cmNlUXVvdGEkQ2FjaGUuZGVsZXRlKGNhY2hlS2V5KTtcbiAgfVxufVxuIl19