@alauda-fe/common
Version:
Alauda frontend team common codes.
98 lines • 14.2 kB
JavaScript
import { Inject, Injectable } from '@angular/core';
import { get, sortBy } from 'lodash-es';
import { ANNOTATIONS, LABELS, METADATA, TOKEN_BASE_DOMAIN, } from '../public-api';
import { emptyObjectRemoveRuleFactory, prefixFilterRuleFactory, stringify, yamlFilterField, } from '../utils/public-api';
import * as i0 from "@angular/core";
export class YamlUtilService {
constructor(baseDomain) {
this.baseDomain = baseDomain;
}
// https://confluence.alauda.cn/pages/viewpage.action?pageId=112060211
// 所有资源规则全平台通用
getConciseResource(r) {
const commonFilters = [
'metadata.namespace',
'metadata.managedFields',
'metadata.creationTimestamp',
'metadata.generation',
'metadata.resourceVersion',
'metadata.uid',
'metadata.ownerReferences',
'metadata.finalizers',
'metadata.selfLink',
`metadata.labels.['app.${this.baseDomain}/uuid']`,
prefixFilterRuleFactory(this.baseDomain, [METADATA, ANNOTATIONS]),
prefixFilterRuleFactory('kubernetes.io', [METADATA, ANNOTATIONS], 'includes'),
'status',
];
const specificFilters = [];
switch (r.kind) {
case 'Application': {
specificFilters.push('metadata.labels.sync-from-helmrequest');
break;
}
case 'Deployment':
case 'StatefulSet':
case 'DaemonSet': {
specificFilters.push('spec.template.annotations.updateTimestamp');
break;
}
case 'Job': {
specificFilters.push('spec.selector.matchLabels', 'spec.template.metadata.labels.controller-uid', `${METADATA}.${LABELS}.controller-uid`, prefixFilterRuleFactory('batch.kubernetes.io/controller-uid', ['spec', 'template', METADATA, LABELS], 'includes'));
break;
}
case 'PersistentVolumeClaim': {
specificFilters.push(prefixFilterRuleFactory('pv.kubernetes.io', [METADATA, ANNOTATIONS], 'startsWith'), prefixFilterRuleFactory('volume.beta.kubernetes.io', [METADATA, ANNOTATIONS], 'startsWith'), 'spec.volumeName');
break;
}
case 'Service': {
specificFilters.push(resource => {
// ExternalName 类型的 Service 没有 ports
const ports = get(resource, ['spec', 'ports']) ?? [];
return ports.map((_, i) => ['spec', 'ports', `[${i}]`, 'nodePort'].join('.'));
}, 'spec.clusterIPs', 'spec.clusterIP', 'spec.ipFamilies', 'spec.ipFamilyPolicy');
break;
}
default: {
break;
}
}
specificFilters.push(emptyObjectRemoveRuleFactory([METADATA, ANNOTATIONS]), emptyObjectRemoveRuleFactory([METADATA, LABELS]));
return yamlFilterField(r, [...commonFilters, ...specificFilters]);
}
/**
*
*
* @template T
* @param {T} resource
* @param {boolean} [concise=false] 精简 Yaml
* @param {boolean} [reduce=false] 隐藏 managedFields
* @returns
* @memberof YamlUtilService
*/
generateFilteredYamlResource(resource, concise = false, reduce = false) {
return sortBy(Array.isArray(resource) ? resource : [resource], 'kind')
.map((resource) => concise
? this.getConciseResource(resource)
: reduce
? yamlFilterField(resource, ['metadata.managedFields'])
: resource)
.map(res => stringify(res, {
strict: false,
sortMapEntries: true,
}))
.join('\n---\r\n\n');
}
static { this.ɵfac = function YamlUtilService_Factory(t) { return new (t || YamlUtilService)(i0.ɵɵinject(TOKEN_BASE_DOMAIN)); }; }
static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: YamlUtilService, factory: YamlUtilService.ɵfac, providedIn: 'root' }); }
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(YamlUtilService, [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], () => [{ type: undefined, decorators: [{
type: Inject,
args: [TOKEN_BASE_DOMAIN]
}] }], null); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieWFtbC11dGlsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvY29yZS9zZXJ2aWNlcy95YW1sLXV0aWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV4QyxPQUFPLEVBQ0wsV0FBVyxFQUdYLE1BQU0sRUFDTixRQUFRLEVBRVIsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCw0QkFBNEIsRUFDNUIsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxlQUFlLEdBRWhCLE1BQU0scUJBQXFCLENBQUM7O0FBSzdCLE1BQU0sT0FBTyxlQUFlO0lBQzFCLFlBQXdELFVBQWtCO1FBQWxCLGVBQVUsR0FBVixVQUFVLENBQVE7SUFBRyxDQUFDO0lBRTlFLHNFQUFzRTtJQUN0RSxjQUFjO0lBQ2Qsa0JBQWtCLENBQUMsQ0FBcUI7UUFDdEMsTUFBTSxhQUFhLEdBQXFCO1lBQ3RDLG9CQUFvQjtZQUNwQix3QkFBd0I7WUFDeEIsNEJBQTRCO1lBQzVCLHFCQUFxQjtZQUNyQiwwQkFBMEI7WUFDMUIsY0FBYztZQUNkLDBCQUEwQjtZQUMxQixxQkFBcUI7WUFDckIsbUJBQW1CO1lBQ25CLHlCQUF5QixJQUFJLENBQUMsVUFBVSxTQUFTO1lBQ2pELHVCQUF1QixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDakUsdUJBQXVCLENBQ3JCLGVBQWUsRUFDZixDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsRUFDdkIsVUFBVSxDQUNYO1lBQ0QsUUFBUTtTQUNULENBQUM7UUFDRixNQUFNLGVBQWUsR0FBcUIsRUFBRSxDQUFD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QXdCLENBQUMsQ0FBQztnQkFDdkQsQ0FBQyxDQUFDLFFBQVEsQ0FDYjthQUNBLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUNULFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDYixNQUFNLEVBQUUsS0FBSztZQUNiLGNBQWMsRUFBRSxJQUFJO1NBQ3JCLENBQUMsQ0FDSDthQUNBLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN6QixDQUFDO2dGQTVIVSxlQUFlLGNBQ04saUJBQWlCO3VFQUQxQixlQUFlLFdBQWYsZUFBZSxtQkFGZCxNQUFNOztpRkFFUCxlQUFlO2NBSDNCLFVBQVU7ZUFBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7c0JBRWMsTUFBTTt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGdldCwgc29ydEJ5IH0gZnJvbSAnbG9kYXNoLWVzJztcblxuaW1wb3J0IHtcbiAgQU5OT1RBVElPTlMsXG4gIEFycmF5YWJsZSxcbiAgS3ViZXJuZXRlc1Jlc291cmNlLFxuICBMQUJFTFMsXG4gIE1FVEFEQVRBLFxuICBTZXJ2aWNlUG9ydCxcbiAgVE9LRU5fQkFTRV9ET01BSU4sXG59IGZyb20gJy4uL3B1YmxpYy1hcGknO1xuaW1wb3J0IHtcbiAgZW1wdHlPYmplY3RSZW1vdmVSdWxlRmFjdG9yeSxcbiAgcHJlZml4RmlsdGVyUnVsZUZhY3RvcnksXG4gIHN0cmluZ2lmeSxcbiAgeWFtbEZpbHRlckZpZWxkLFxuICBZYW1sRmlsdGVySXRlbSxcbn0gZnJvbSAnLi4vdXRpbHMvcHVibGljLWFwaSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBZYW1sVXRpbFNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihASW5qZWN0KFRPS0VOX0JBU0VfRE9NQUlOKSBwcml2YXRlIHJlYWRvbmx5IGJhc2VEb21haW46IHN0cmluZykge31cblxuICAvLyBodHRwczovL2NvbmZsdWVuY2UuYWxhdWRhLmNuL3BhZ2VzL3ZpZXdwYWdlLmFjdGlvbj9wYWdlSWQ9MTEyMDYwMjExXG4gIC8vIOaJgOaciei1hOa6kOinhOWImeWFqOW5s+WPsOmAmueUqFxuICBnZXRDb25jaXNlUmVzb3VyY2UocjogS3ViZXJuZXRlc1Jlc291cmNlKSB7XG4gICAgY29uc3QgY29tbW9uRmlsdGVyczogWWFtbEZpbHRlckl0ZW1bXSA9IFtcbiAgICAgICdtZXRhZGF0YS5uYW1lc3BhY2UnLFxuICAgICAgJ21ldGFkYXRhLm1hbmFnZWRGaWVsZHMnLFxuICAgICAgJ21ldGFkYXRhLmNyZWF0aW9uVGltZXN0YW1wJyxcbiAgICAgICdtZXRhZGF0YS5nZW5lcmF0aW9uJyxcbiAgICAgICdtZXRhZGF0YS5yZXNvdXJjZVZlcnNpb24nLFxuICAgICAgJ21ldGFkYXRhLnVpZCcsXG4gICAgICAnbWV0YWRhdGEub3duZXJSZWZlcmVuY2VzJyxcbiAgICAgICdtZXRhZGF0YS5maW5hbGl6ZXJzJyxcbiAgICAgICdtZXRhZGF0YS5zZWxmTGluaycsXG4gICAgICBgbWV0YWRhdGEubGFiZWxzLlsnYXBwLiR7dGhpcy5iYXNlRG9tYWlufS91dWlkJ11gLFxuICAgICAgcHJlZml4RmlsdGVyUnVsZUZhY3RvcnkodGhpcy5iYXNlRG9tYWluLCBbTUVUQURBVEEsIEFOTk9UQVRJT05TXSksXG4gICAgICBwcmVmaXhGaWx0ZXJSdWxlRmFjdG9yeShcbiAgICAgICAgJ2t1YmVybmV0ZXMuaW8nLFxuICAgICAgICBbTUVUQURBVEEsIEFOTk9UQVRJT05TXSxcbiAgICAgICAgJ2luY2x1ZGVzJyxcbiAgICAgICksXG4gICAgICAnc3RhdHVzJyxcbiAgICBdO1xuICAgIGNvbnN0IHNwZWNpZmljRmlsdGVyczogWWFtbEZpbHRlckl0ZW1bXSA9IFtdO1xuICAgIHN3aXRjaCAoci5raW5kKSB7XG4gICAgICBjYXNlICdBcHBsaWNhdGlvbic6IHtcbiAgICAgICAgc3BlY2lmaWNGaWx0ZXJzLnB1c2goJ21ldGFkYXRhLmxhYmVscy5zeW5jLWZyb20taGVsbXJlcXVlc3QnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdEZXBsb3ltZW50JzpcbiAgICAgIGNhc2UgJ1N0YXRlZnVsU2V0JzpcbiAgICAgIGNhc2UgJ0RhZW1vblNldCc6IHtcbiAgICAgICAgc3BlY2lmaWNGaWx0ZXJzLnB1c2goJ3NwZWMudGVtcGxhdGUuYW5ub3RhdGlvbnMudXBkYXRlVGltZXN0YW1wJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnSm9iJzoge1xuICAgICAgICBzcGVjaWZpY0ZpbHRlcnMucHVzaChcbiAgICAgICAgICAnc3BlYy5zZWxlY3Rvci5tYXRjaExhYmVscycsXG4gICAgICAgICAgJ3NwZWMudGVtcGxhdGUubWV0YWRhdGEubGFiZWxzLmNvbnRyb2xsZXItdWlkJyxcbiAgICAgICAgICBgJHtNRVRBREFUQX0uJHtMQUJFTFN9LmNvbnRyb2xsZXItdWlkYCxcbiAgICAgICAgICBwcmVmaXhGaWx0ZXJSdWxlRmFjdG9yeShcbiAgICAgICAgICAgICdiYXRjaC5rdWJlcm5ldGVzLmlvL2NvbnRyb2xsZXItdWlkJyxcbiAgICAgICAgICAgIFsnc3BlYycsICd0ZW1wbGF0ZScsIE1FVEFEQVRBLCBMQUJFTFNdLFxuICAgICAgICAgICAgJ2luY2x1ZGVzJyxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1BlcnNpc3RlbnRWb2x1bWVDbGFpbSc6IHtcbiAgICAgICAgc3BlY2lmaWNGaWx0ZXJzLnB1c2goXG4gICAgICAgICAgcHJlZml4RmlsdGVyUnVsZUZhY3RvcnkoXG4gICAgICAgICAgICAncHYua3ViZXJuZXRlcy5pbycsXG4gICAgICAgICAgICBbTUVUQURBVEEsIEFOTk9UQVRJT05TXSxcbiAgICAgICAgICAgICdzdGFydHNXaXRoJyxcbiAgICAgICAgICApLFxuICAgICAgICAgIHByZWZpeEZpbHRlclJ1bGVGYWN0b3J5KFxuICAgICAgICAgICAgJ3ZvbHVtZS5iZXRhLmt1YmVybmV0ZXMuaW8nLFxuICAgICAgICAgICAgW01FVEFEQVRBLCBBTk5PVEFUSU9OU10sXG4gICAgICAgICAgICAnc3RhcnRzV2l0aCcsXG4gICAgICAgICAgKSxcbiAgICAgICAgICAnc3BlYy52b2x1bWVOYW1lJyxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdTZXJ2aWNlJzoge1xuICAgICAgICBzcGVjaWZpY0ZpbHRlcnMucHVzaChcbiAgICAgICAgICByZXNvdXJjZSA9PiB7XG4gICAgICAgICAgICAvLyBFeHRlcm5hbE5hbWUg57G75Z6L55qEIFNlcnZpY2Ug5rKh5pyJIHBvcnRzXG4gICAgICAgICAgICBjb25zdCBwb3J0cyA9XG4gICAgICAgICAgICAgIChnZXQocmVzb3VyY2UsIFsnc3BlYycsICdwb3J0cyddKSBhcyBTZXJ2aWNlUG9ydFtdKSA/PyBbXTtcbiAgICAgICAgICAgIHJldHVybiBwb3J0cy5tYXAoKF8sIGkpID0+XG4gICAgICAgICAgICAgIFsnc3BlYycsICdwb3J0cycsIGBbJHtpfV1gLCAnbm9kZVBvcnQnXS5qb2luKCcuJyksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgJ3NwZWMuY2x1c3RlcklQcycsXG4gICAgICAgICAgJ3NwZWMuY2x1c3RlcklQJyxcbiAgICAgICAgICAnc3BlYy5pcEZhbWlsaWVzJyxcbiAgICAgICAgICAnc3BlYy5pcEZhbWlseVBvbGljeScsXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgc3BlY2lmaWNGaWx0ZXJzLnB1c2goXG4gICAgICBlbXB0eU9iamVjdFJlbW92ZVJ1bGVGYWN0b3J5KFtNRVRBREFUQSwgQU5OT1RBVElPTlNdKSxcbiAgICAgIGVtcHR5T2JqZWN0UmVtb3ZlUnVsZUZhY3RvcnkoW01FVEFEQVRBLCBMQUJFTFNdKSxcbiAgICApO1xuICAgIHJldHVybiB5YW1sRmlsdGVyRmllbGQociwgWy4uLmNvbW1vbkZpbHRlcnMsIC4uLnNwZWNpZmljRmlsdGVyc10pO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7VH0gcmVzb3VyY2VcbiAgICogQHBhcmFtIHtib29sZWFufSBbY29uY2lzZT1mYWxzZV0g57K+566AIFlhbWxcbiAgICogQHBhcmFtIHtib29sZWFufSBbcmVkdWNlPWZhbHNlXSDpmpDol48gbWFuYWdlZEZpZWxkc1xuICAgKiBAcmV0dXJuc1xuICAgKiBAbWVtYmVyb2YgWWFtbFV0aWxTZXJ2aWNlXG4gICAqL1xuICBnZW5lcmF0ZUZpbHRlcmVkWWFtbFJlc291cmNlPFQgZXh0ZW5kcyBLdWJlcm5ldGVzUmVzb3VyY2U+KFxuICAgIHJlc291cmNlOiBBcnJheWFibGU8VD4sXG4gICAgY29uY2lzZSA9IGZhbHNlLFxuICAgIHJlZHVjZSA9IGZhbHNlLFxuICApIHtcbiAgICByZXR1cm4gc29ydEJ5KEFycmF5LmlzQXJyYXkocmVzb3VyY2UpID8gcmVzb3VyY2UgOiBbcmVzb3VyY2VdLCAna2luZCcpXG4gICAgICAubWFwKChyZXNvdXJjZTogVCkgPT5cbiAgICAgICAgY29uY2lzZVxuICAgICAgICAgID8gdGhpcy5nZXRDb25jaXNlUmVzb3VyY2UocmVzb3VyY2UpXG4gICAgICAgICAgOiByZWR1Y2VcbiAgICAgICAgICA/IHlhbWxGaWx0ZXJGaWVsZChyZXNvdXJjZSwgWydtZXRhZGF0YS5tYW5hZ2VkRmllbGRzJ10pXG4gICAgICAgICAgOiByZXNvdXJjZSxcbiAgICAgIClcbiAgICAgIC5tYXAocmVzID0+XG4gICAgICAgIHN0cmluZ2lmeShyZXMsIHtcbiAgICAgICAgICBzdHJpY3Q6IGZhbHNlLFxuICAgICAgICAgIHNvcnRNYXBFbnRyaWVzOiB0cnVlLFxuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC5qb2luKCdcXG4tLS1cXHJcXG5cXG4nKTtcbiAgfVxufVxuIl19