@alauda-fe/common
Version:
Alauda frontend team common codes.
99 lines • 17 kB
JavaScript
import { assocPath, curry, path } from 'ramda';
import { getGlobalEnvironments, GLOBAL_CLUSTER } from '../constants/public-api';
import { ANNOTATIONS, LABELS, METADATA } from '../services/public-api';
export const assemble = (subdomain, domain, type) => subdomain ? `${subdomain}.${domain}/${type}` : `${domain}/${type}`;
export const k8sSubGroup = curry((subdomain, type) => assemble(subdomain, 'kubernetes.io', type));
export const k8sGroup = k8sSubGroup('');
export const subdomainGroup = curry((subdomain, type) => assemble(subdomain, getGlobalEnvironments('LABEL_BASE_DOMAIN'), type));
export const domainGroup = subdomainGroup('');
export const getSubdomainLabel = curry((subdomain, type, resource) => path([METADATA, LABELS, subdomainGroup(subdomain, type)], resource));
export const getDomainLabel = curry((type, resource) => path([METADATA, LABELS, subdomainGroup('', type)], resource));
export const getLabel = curry((key, resource) => path([METADATA, LABELS, key], resource));
export const getSubdomainAnnotation = curry((subdomain, type, resource) => path([METADATA, ANNOTATIONS, subdomainGroup(subdomain, type)], resource));
export const getDomainAnnotation = curry((type, resource) => path([METADATA, ANNOTATIONS, subdomainGroup('', type)], resource));
export const getAnnotation = curry((key, resource) => path([METADATA, ANNOTATIONS, key], resource));
const assignMetadata = (group) => (value) => (resource) => Object.entries(value).reduce((acc, [key, value]) => assocPath([METADATA, group, key], value, acc), resource);
export const assignLabels = (assignMetadata(LABELS));
export const assignAnnotations = (assignMetadata(ANNOTATIONS));
export function getGlobalNs() {
return getGlobalEnvironments('GLOBAL_NAMESPACE');
}
export function createOwnerReference(owner, { blockOwnerDeletion = true, controller = true, } = {}) {
return {
apiVersion: owner.apiVersion,
kind: owner.kind,
name: owner.metadata.name,
uid: owner.metadata.uid,
blockOwnerDeletion,
controller,
};
}
// https://kubernetes.io/docs/reference/kubernetes-api/common-definitions/quantity/
// https://en.wikipedia.org/wiki/Metric_prefix
// https://en.wikipedia.org/wiki/Binary_prefix
export const K8S_BINARY_UNITS = [
'Ki',
'Mi',
'Gi',
'Ti',
'Pi',
'Ei',
'Zi',
'Yi',
];
export const K8S_DECIMAL_UNITS = [
'm',
'',
'k',
'M',
'G',
'T',
'P',
'E',
'Z',
'Y',
];
export function parseQuantity(value) {
const reg = /^(\d+|\d+\.\d+)([A-Za-z]*)$/;
const res = reg.exec(value);
return {
value: res?.[1] === undefined ? undefined : parseFloat(res[1]),
unit: res?.[2],
};
}
export function convertQuantityUnit(targetUnit, source) {
const fn = (source) => {
if (source.value === undefined || source.unit === undefined) {
return source;
}
if (source.unit === targetUnit) {
return source;
}
return {
value: Math.round(((source.value * unitCompensate(source.unit)) /
unitCompensate(targetUnit)) *
1000) / 1000,
unit: targetUnit,
};
};
return source ? fn(source) : fn;
}
// GLOBAL 集群的项目同名 NS 名称不会具有 INNER_PROJECT_NS_PREFIX 前缀
export function getProjectNs(project, cluster) {
return `${cluster === GLOBAL_CLUSTER
? ''
: getGlobalEnvironments('INNER_PROJECT_NS_PREFIX') || ''}${project}`;
}
function unitCompensate(unit) {
if (K8S_BINARY_UNITS.includes(unit)) {
return (1024 **
(K8S_BINARY_UNITS.indexOf(unit) + 1));
}
if (K8S_DECIMAL_UNITS.includes(unit)) {
return (1000 **
(K8S_DECIMAL_UNITS.indexOf(unit) -
1));
}
throw new Error(`Unknown unit ${unit}`);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiazhzLXV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvY29yZS91dGlscy9rOHMtdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFFL0MsT0FBTyxFQUFFLHFCQUFxQixFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBR3ZFLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLFNBQWlCLEVBQUUsTUFBYyxFQUFFLElBQVksRUFBRSxFQUFFLENBQzFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLElBQUksTUFBTSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQztBQUVyRSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLENBQUMsU0FBaUIsRUFBRSxJQUFZLEVBQVUsRUFBRSxDQUMzRSxRQUFRLENBQUMsU0FBUyxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FDM0MsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFeEMsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxDQUFDLFNBQWlCLEVBQUUsSUFBWSxFQUFVLEVBQUUsQ0FDOUUsUUFBUSxDQUFDLFNBQVMsRUFBRSxxQkFBcUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUN0RSxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUE2QixjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFeEUsTUFBTSxD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eyBhc3NvY1BhdGgsIGN1cnJ5LCBwYXRoIH0gZnJvbSAncmFtZGEnO1xuXG5pbXBvcnQgeyBnZXRHbG9iYWxFbnZpcm9ubWVudHMsIEdMT0JBTF9DTFVTVEVSIH0gZnJvbSAnLi4vY29uc3RhbnRzL3B1YmxpYy1hcGknO1xuaW1wb3J0IHsgQU5OT1RBVElPTlMsIExBQkVMUywgTUVUQURBVEEgfSBmcm9tICcuLi9zZXJ2aWNlcy9wdWJsaWMtYXBpJztcbmltcG9ydCB7IEt1YmVybmV0ZXNSZXNvdXJjZSwgT3duZXJSZWZlcmVuY2UgfSBmcm9tICcuLi90eXBlcy9wdWJsaWMtYXBpJztcblxuZXhwb3J0IGNvbnN0IGFzc2VtYmxlID0gKHN1YmRvbWFpbjogc3RyaW5nLCBkb21haW46IHN0cmluZywgdHlwZTogc3RyaW5nKSA9PlxuICBzdWJkb21haW4gPyBgJHtzdWJkb21haW59LiR7ZG9tYWlufS8ke3R5cGV9YCA6IGAke2RvbWFpbn0vJHt0eXBlfWA7XG5cbmV4cG9ydCBjb25zdCBrOHNTdWJHcm91cCA9IGN1cnJ5KChzdWJkb21haW46IHN0cmluZywgdHlwZTogc3RyaW5nKTogc3RyaW5nID0+XG4gIGFzc2VtYmxlKHN1YmRvbWFpbiwgJ2t1YmVybmV0ZXMuaW8nLCB0eXBlKSxcbik7XG5cbmV4cG9ydCBjb25zdCBrOHNHcm91cCA9IGs4c1N1Ykdyb3VwKCcnKTtcblxuZXhwb3J0IGNvbnN0IHN1YmRvbWFpbkdyb3VwID0gY3VycnkoKHN1YmRvbWFpbjogc3RyaW5nLCB0eXBlOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgYXNzZW1ibGUoc3ViZG9tYWluLCBnZXRHbG9iYWxFbnZpcm9ubWVudHMoJ0xBQkVMX0JBU0VfRE9NQUlOJyksIHR5cGUpLFxuKTtcblxuZXhwb3J0IGNvbnN0IGRvbWFpbkdyb3VwOiAodHlwZTogc3RyaW5nKSA9PiBzdHJpbmcgPSBzdWJkb21haW5Hcm91cCgnJyk7XG5cbmV4cG9ydCBjb25zdCBnZXRTdWJkb21haW5MYWJlbCA9IGN1cnJ5KFxuICAoc3ViZG9tYWluOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgcmVzb3VyY2U6IEt1YmVybmV0ZXNSZXNvdXJjZSk6IHN0cmluZyA9PlxuICAgIHBhdGgoW01FVEFEQVRBLCBMQUJFTFMsIHN1YmRvbWFpbkdyb3VwKHN1YmRvbWFpbiwgdHlwZSldLCByZXNvdXJjZSksXG4pO1xuXG5leHBvcnQgY29uc3QgZ2V0RG9tYWluTGFiZWwgPSBjdXJyeShcbiAgKHR5cGU6IHN0cmluZywgcmVzb3VyY2U6IEt1YmVybmV0ZXNSZXNvdXJjZSk6IHN0cmluZyA9PlxuICAgIHBhdGgoW01FVEFEQVRBLCBMQUJFTFMsIHN1YmRvbWFpbkdyb3VwKCcnLCB0eXBlKV0sIHJlc291cmNlKSxcbik7XG5cbmV4cG9ydCBjb25zdCBnZXRMYWJlbCA9IGN1cnJ5KFxuICAoa2V5OiBzdHJpbmcsIHJlc291cmNlOiBLdWJlcm5ldGVzUmVzb3VyY2UpOiBzdHJpbmcgPT5cbiAgICBwYXRoKFtNRVRBREFUQSwgTEFCRUxTLCBrZXldLCByZXNvdXJjZSksXG4pO1xuXG5leHBvcnQgY29uc3QgZ2V0U3ViZG9tYWluQW5ub3RhdGlvbiA9IGN1cnJ5KFxuICAoc3ViZG9tYWluOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgcmVzb3VyY2U6IEt1YmVybmV0ZXNSZXNvdXJjZSk6IHN0cmluZyA9PlxuICAgIHBhdGgoW01FVEFEQVRBLCBBTk5PVEFUSU9OUywgc3ViZG9tYWluR3JvdXAoc3ViZG9tYWluLCB0eXBlKV0sIHJlc291cmNlKSxcbik7XG5cbmV4cG9ydCBjb25zdCBnZXREb21haW5Bbm5vdGF0aW9uID0gY3VycnkoXG4gICh0eXBlOiBzdHJpbmcsIHJlc291cmNlOiBLdWJlcm5ldGVzUmVzb3VyY2UpOiBzdHJpbmcgPT5cbiAgICBwYXRoKFtNRVRBREFUQSwgQU5OT1RBVElPTlMsIHN1YmRvbWFpbkdyb3VwKCcnLCB0eXBlKV0sIHJlc291cmNlKSxcbik7XG5cbmV4cG9ydCBjb25zdCBnZXRBbm5vdGF0aW9uID0gY3VycnkoXG4gIChrZXk6IHN0cmluZywgcmVzb3VyY2U6IEt1YmVybmV0ZXNSZXNvdXJjZSk6IHN0cmluZyA9PlxuICAgIHBhdGgoW01FVEFEQVRBLCBBTk5PVEFUSU9OUywga2V5XSwgcmVzb3VyY2UpLFxuKTtcblxuY29uc3QgYXNzaWduTWV0YWRhdGEgPVxuICAoZ3JvdXA6IHN0cmluZykgPT5cbiAgPFY+KHZhbHVlOiBSZWNvcmQ8c3RyaW5nLCBWPikgPT5cbiAgPFIgZXh0ZW5kcyBLdWJlcm5ldGVzUmVzb3VyY2U+KHJlc291cmNlOiBSKTogUiA9PlxuICAgIE9iamVjdC5lbnRyaWVzKHZhbHVlKS5yZWR1Y2UoXG4gICAgICAoYWNjLCBba2V5LCB2YWx1ZV0pID0+IGFzc29jUGF0aChbTUVUQURBVEEsIGdyb3VwLCBrZXldLCB2YWx1ZSwgYWNjKSxcbiAgICAgIHJlc291cmNlLFxuICAgICk7XG5cbmV4cG9ydCBjb25zdCBhc3NpZ25MYWJlbHMgPSBhc3NpZ25NZXRhZGF0YShMQUJFTFMpPHN0cmluZz47XG5cbmV4cG9ydCBjb25zdCBhc3NpZ25Bbm5vdGF0aW9ucyA9IGFzc2lnbk1ldGFkYXRhKEFOTk9UQVRJT05TKTxzdHJpbmc+O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2xvYmFsTnMoKSB7XG4gIHJldHVybiBnZXRHbG9iYWxFbnZpcm9ubWVudHMoJ0dMT0JBTF9OQU1FU1BBQ0UnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU93bmVyUmVmZXJlbmNlKFxuICBvd25lcjogS3ViZXJuZXRlc1Jlc291cmNlLFxuICB7XG4gICAgYmxvY2tPd25lckRlbGV0aW9uID0gdHJ1ZSxcbiAgICBjb250cm9sbGVyID0gdHJ1ZSxcbiAgfTogUGFydGlhbDx7XG4gICAgYmxvY2tPd25lckRlbGV0aW9uOiBib29sZWFuO1xuICAgIGNvbnRyb2xsZXI6IGJvb2xlYW47XG4gIH0+ID0ge30sXG4pOiBPd25lclJlZmVyZW5jZSB7XG4gIHJldHVybiB7XG4gICAgYXBpVmVyc2lvbjogb3duZXIuYXBpVmVyc2lvbixcbiAgICBraW5kOiBvd25lci5raW5kLFxuICAgIG5hbWU6IG93bmVyLm1ldGFkYXRhLm5hbWUsXG4gICAgdWlkOiBvd25lci5tZXRhZGF0YS51aWQsXG4gICAgYmxvY2tPd25lckRlbGV0aW9uLFxuICAgIGNvbnRyb2xsZXIsXG4gIH07XG59XG5cbi8vIGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL3JlZmVyZW5jZS9rdWJlcm5ldGVzLWFwaS9jb21tb24tZGVmaW5pdGlvbnMvcXVhbnRpdHkvXG4vLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NZXRyaWNfcHJlZml4XG4vLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaW5hcnlfcHJlZml4XG5leHBvcnQgY29uc3QgSzhTX0JJTkFSWV9VTklUUyA9IFtcbiAgJ0tpJyxcbiAgJ01pJyxcbiAgJ0dpJyxcbiAgJ1RpJyxcbiAgJ1BpJyxcbiAgJ0VpJyxcbiAgJ1ppJyxcbiAgJ1lpJyxcbl0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBLOFNfREVDSU1BTF9VTklUUyA9IFtcbiAgJ20nLFxuICAnJyxcbiAgJ2snLFxuICAnTScsXG4gICdHJyxcbiAgJ1QnLFxuICAnUCcsXG4gICdFJyxcbiAgJ1onLFxuICAnWScsXG5dIGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VRdWFudGl0eSh2YWx1ZTogc3RyaW5nKTogUXVhbnRpdHkge1xuICBjb25zdCByZWcgPSAvXihcXGQrfFxcZCtcXC5cXGQrKShbQS1aYS16XSopJC87XG4gIGNvbnN0IHJlcyA9IHJlZy5leGVjKHZhbHVlKTtcbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogcmVzPy5bMV0gPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHBhcnNlRmxvYXQocmVzWzFdKSxcbiAgICB1bml0OiByZXM/LlsyXSBhcyBRdWFudGl0eVVuaXQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0UXVhbnRpdHlVbml0KFxuICB0YXJnZXRVbml0OiBRdWFudGl0eVVuaXQsXG4pOiAoc291cmNlOiBRdWFudGl0eSkgPT4gUXVhbnRpdHk7XG5leHBvcnQgZnVuY3Rpb24gY29udmVydFF1YW50aXR5VW5pdChcbiAgdGFyZ2V0VW5pdDogUXVhbnRpdHlVbml0LFxuICBzb3VyY2U6IFF1YW50aXR5LFxuKTogUXVhbnRpdHk7XG5leHBvcnQgZnVuY3Rpb24gY29udmVydFF1YW50aXR5VW5pdChcbiAgdGFyZ2V0VW5pdDogUXVhbnRpdHlVbml0LFxuICBzb3VyY2U/OiBRdWFudGl0eSxcbik6ICgoc291cmNlOiBRdWFudGl0eSkgPT4gUXVhbnRpdHkpIHwgUXVhbnRpdHkge1xuICBjb25zdCBmbiA9IChzb3VyY2U6IFF1YW50aXR5KSA9PiB7XG4gICAgaWYgKHNvdXJjZS52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHNvdXJjZS51bml0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfVxuXG4gICAgaWYgKHNvdXJjZS51bml0ID09PSB0YXJnZXRVbml0KSB7XG4gICAgICByZXR1cm4gc291cmNlO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTpcbiAgICAgICAgTWF0aC5yb3VuZChcbiAgICAgICAgICAoKHNvdXJjZS52YWx1ZSAqIHVuaXRDb21wZW5zYXRlKHNvdXJjZS51bml0KSkgL1xuICAgICAgICAgICAgdW5pdENvbXBlbnNhdGUodGFyZ2V0VW5pdCkpICpcbiAgICAgICAgICAgIDEwMDAsXG4gICAgICAgICkgLyAxMDAwLFxuICAgICAgdW5pdDogdGFyZ2V0VW5pdCxcbiAgICB9O1xuICB9O1xuXG4gIHJldHVybiBzb3VyY2UgPyBmbihzb3VyY2UpIDogZm47XG59XG5cbi8vIEdMT0JBTCDpm4bnvqTnmoTpobnnm67lkIzlkI0gTlMg5ZCN56ew5LiN5Lya5YW35pyJIElOTkVSX1BST0pFQ1RfTlNfUFJFRklYIOWJjee8gFxuZXhwb3J0IGZ1bmN0aW9uIGdldFByb2plY3ROcyhwcm9qZWN0OiBzdHJpbmcsIGNsdXN0ZXI6IHN0cmluZykge1xuICByZXR1cm4gYCR7XG4gICAgY2x1c3RlciA9PT0gR0xPQkFMX0NMVVNURVJcbiAgICAgID8gJydcbiAgICAgIDogZ2V0R2xvYmFsRW52aXJvbm1lbnRzKCdJTk5FUl9QUk9KRUNUX05TX1BSRUZJWCcpIHx8ICcnXG4gIH0ke3Byb2plY3R9YDtcbn1cblxuZnVuY3Rpb24gdW5pdENvbXBlbnNhdGUodW5pdDogUXVhbnRpdHlVbml0KTogbnVtYmVyIHtcbiAgaWYgKEs4U19CSU5BUllfVU5JVFMuaW5jbHVkZXModW5pdCBhcyAodHlwZW9mIEs4U19CSU5BUllfVU5JVFMpW251bWJlcl0pKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDEwMjQgKipcbiAgICAgIChLOFNfQklOQVJZX1VOSVRTLmluZGV4T2YodW5pdCBhcyAodHlwZW9mIEs4U19CSU5BUllfVU5JVFMpW251bWJlcl0pICsgMSlcbiAgICApO1xuICB9XG4gIGlmIChLOFNfREVDSU1BTF9VTklUUy5pbmNsdWRlcyh1bml0IGFzICh0eXBlb2YgSzhTX0RFQ0lNQUxfVU5JVFMpW251bWJlcl0pKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDEwMDAgKipcbiAgICAgIChLOFNfREVDSU1BTF9VTklUUy5pbmRleE9mKHVuaXQgYXMgKHR5cGVvZiBLOFNfREVDSU1BTF9VTklUUylbbnVtYmVyXSkgLVxuICAgICAgICAxKVxuICAgICk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHVuaXQgJHt1bml0fWApO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1YW50aXR5IHtcbiAgdmFsdWU6IG51bWJlcjtcbiAgdW5pdDogUXVhbnRpdHlVbml0O1xufVxuXG5leHBvcnQgdHlwZSBRdWFudGl0eVVuaXQgPVxuICB8ICh0eXBlb2YgSzhTX0JJTkFSWV9VTklUUylbbnVtYmVyXVxuICB8ICh0eXBlb2YgSzhTX0RFQ0lNQUxfVU5JVFMpW251bWJlcl07XG4iXX0=