tencentcloud-edgeone-migration-nodejs-v2
Version:
tencentcloud cdn config copy to edgeone
277 lines (254 loc) • 10.8 kB
JavaScript
const _ = require("lodash");
const moment = require("moment")
const EO_SV = {
// Quic-请求数
SvEdgeoneCdnQuicRequestMonth: 'sv_edgeone_cdn_quic_request_month',
// 内容加速-流量-数据 (下单时,前端不用管,后端会自动带上)
SvEdgeoneCdnTrafficData: 'sv_edgeone_cdn_traffic_data',
// 新企业版
SvEdgeonePlanNewEnt: 'sv_edgeone_plan_sec_ent_flatfee_cm',
// 企业版-智能加速-流量
SvEdgeoneCdnTrafficSmtData: 'sv_edgeone_cdn_traffic_smt_data',
// EdgeOne 套餐-标准版 - 全球不包含中国大陆
SvEdgeonePlanSta: 'sv_edgeone_plan_sta',
// EdgeOne 套餐-企业版 - 全球不包含中国大陆
SvEdgeonePlanEnt: 'sv_edgeone_plan_ent',
// EdgeOne 套餐-企业版 - 全球不包含中国大陆(低保底)
SvEdgeonePlanEntFlatFee: 'sv_edgeone_plan_ent_flatfee',
// EdgeOne 套餐-标准版-中国大陆境内
SvEdgeonePlanStaCm: 'sv_edgeone_plan_sta_cm',
// EdgeOne 套餐-企业版-中国大陆境内
SvEdgeonePlanEntScdnCm: 'sv_edgeone_plan_ent_scdn_cm',
// EdgeOne 套餐-标准版-全球
SvEdgeonePlanStaG: 'sv_edgeone_plan_sta_g',
// EdgeOne 套餐-企业版-全球
SvEdgeonePlanEntScdnG: 'sv_edgeone_plan_ent_scdn_g',
// EdgeOne 套餐-个人版-中国大陆境内
SvEdgeonePlanPsnCm: 'sv_edgeone_plan_sec_personal_cm',
// EdgeOne 套餐-个人版-中国大陆境外
SvEdgeonePlanPsnOv: 'sv_edgeone_plan_sec_personal_ov',
// EdgeOne 套餐-个人版-全球
SvEdgeonePlanPsnG: 'sv_edgeone_plan_sec_personal_g',
// EdgeOne 套餐-基础版-中国大陆境内
SvEdgeonePlanBasCm: 'sv_edgeone_plan_sec_basic_cm',
// EdgeOne 套餐-基础版-中国大陆境外
SvEdgeonePlanBasOv: 'sv_edgeone_plan_sec_basic_ov',
// EdgeOne 套餐-基础版-全球
SvEdgeonePlanBasG: 'sv_edgeone_plan_sec_basic_g',
// EdgeOne 套餐-标准版(预付费)-中国大陆境内
SvEdgeonePlanPreStaCm: 'sv_edgeone_plan_sec_presta_cm',
// EdgeOne 套餐-标准版(预付费)-中国大陆境外
SvEdgeonePlanPreStaOv: 'sv_edgeone_plan_sec_presta_ov',
// EdgeOne 套餐-标准版(预付费)-全球
SvEdgeonePlanPreStaG: 'sv_edgeone_plan_sec_presta_g',
// 个人版\基础版\预付费标准版 通用的安全流量和sv
SvEdgeonePlanPreTrafficUni: 'sv_edgeone_sec_data_traffic_uni',
// 个人版\基础版\预付费标准版 通用的请求数的sv
SvEdgeonePlanPreRequestUni: 'sv_edgeone_sec_request_queries_uni',
// EdgeOne 选配-基础bot包-企业版
SvEdgeoneOptBasicBot: 'sv_edgeone_opt_basic_bot',
// EdgeOne 选配-基础bot包-标准版
SvEdgeoneOptBasicBotSta: 'sv_edgeone_opt_basic_bot_sta',
// EdgeOne 选配-基础bot包-标准版(预付费)
SvEdgeoneOptBasicBotPreSta: 'sv_edgeone_opt_sec_basic_bot_presta',
// 安全加速-数据-流量-标准版
SvEdgeoneSecTrafficDataSta: 'sv_edgeone_sec_traffic_data_sta',
// 安全加速-数据-流量-企业版
SvEdgeoneSecTrafficDataEnt: 'sv_edgeone_sec_traffic_data_ent',
// 安全加速-请求-请求数-标准版
SvEdgeoneSecRequestQueriesSta: 'sv_edgeone_sec_request_queries_sta',
// 安全加速-请求-请求数-企业版
SvEdgeoneSecRequestQueriesEnt: 'sv_edgeone_sec_request_queries_ent',
// 基础Bot管理-请求-请求数
SvEdgeoneSecBotBasicQueries: 'sv_edgeone_sec_bot_basic_queries',
// Web 防护规则包
SvEdgeoneSecWebRuleBundle: 'sv_edgeone_sec_web_rule_bundle',
// Bot 管理规则包
SvEdgeoneSecBotBasicRuleBundle: 'sv_edgeone_sec_bot_basic_rule_bundle',
// 四层代理-静态 IP实例
SvEdgeoneSecL4StaticIpProxy: 'sv_edgeone_sec_l4_static_ip_proxy',
// 四层代理-CNAME加速实例
SvEdgeoneSecL4CnameAccProxy: 'sv_edgeone_sec_l4_cname_acc_proxy',
// 站点数量
SvEdgeoneVaSite: 'sv_edgeone_va_site',
// 安全加速-保底-数据-流量-标准版
SVEdgeoneComDataSecSta: 'sv_edgeone_com_data_sec_sta',
// 安全加速-保底-数据-流量-企业版
SVEdgeoneComDataSecEnt: 'sv_edgeone_com_data_sec_ent',
// 内容加速-保底-数据-流量-企业版
SVEdgeoneComDataCdnEnt: 'sv_edgeone_com_data_cdn_ent',
// 智能加速-保底-数据-流量-企业版
SVEdgeoneComDataSmtEnt: 'sv_edgeone_com_data_smt_ent',
// 安全加速-保底-请求数-标准版
SVEdgeoneComRequestSta: 'sv_edgeone_com_request_sta',
// 安全加速-保底-请求数-企业版
SVEdgeoneComRequestEnt: 'sv_edgeone_com_request_ent',
// 中国大陆网络优化-流量-企业版
SVEdgeoneComDataCN2Ent: 'sv_edgeone_cn2_data_traffic',
// 实时日志推送
SVEdgeoneGenLogLine: 'sv_edgeone_gen_log_line',
// 新企业版四层加速流量保底包
SVEdgeoneL4AccDataTraffic: 'sv_edgeone_l4acc_data_traffic',
// 新企业版智能加速流量保底包
SVEdgeoneSmtDataTraffic: 'sv_edgeone_smt_data_traffic',
// 新企业版内容加速流量保底包
SVEdgeoneCdnTrafficOv: 'sv_edgeone_cdn_traffic_ov',
// 安全加速-请求-请求数-企业版
SvEdgeoneSecRequestQueriesNewEnt: 'sv_edgeone_sec_request_queries_month',
// 新企业版独立防护保底包
SVEdgeoneDDosDataTraffic: 'sv_edgeone_ddos_data_traffic',
// 新企业版 DDOS 防护实例 增值服务
SVEdgeoneOptDdosInstanceOv: 'sv_edgeone_opt_ddos_instance_ov',
// 增值单元,可能代表:站点数/规则数/四层代理数/QUIC请求数等
SVEdgeoneVAUnit: 'sv_edgeone_va_unit_month',
}
const EO_Plan_Type = {
/** 新版企业版套餐*/
newEnterprise: 'enterprise-v2',
standard: 'standard',
enterprise: 'enterprise', // 安全加速 模式
enterpriseCdn: 'enterprise_cdn', // 内容加速 模式
enterpriseMix: 'enterprise_mixed', // 内容+安全 模式
enterpriseSmart: 'enterprise_smart', // 智能加速 模式
enterpriseMixSmart: 'enterprise_mixed_smart', // 智能+安全 模式
// 基础版
basic: 'basic',
// 个人版
personal: 'personal',
}
const ENTERPRISE_PACKAGES = [
EO_Plan_Type.enterprise,
EO_Plan_Type.enterpriseCdn,
EO_Plan_Type.enterpriseMix,
EO_Plan_Type.enterpriseMixSmart,
EO_Plan_Type.enterpriseSmart,
EO_Plan_Type.newEnterprise,
];
const EO_PLAN_TYPE_NAME_MAP = {
[EO_Plan_Type.standard]: '标准版',
[EO_Plan_Type.newEnterprise]: '企业版',
[EO_Plan_Type.enterprise]: '企业版-安全加速',
[EO_Plan_Type.enterpriseCdn]: '企业版-内容加速',
[EO_Plan_Type.enterpriseMix]: '企业版-内容、安全加速',
[EO_Plan_Type.enterpriseSmart]: '企业版-智能加速',
[EO_Plan_Type.enterpriseMixSmart]: '企业版-智能、安全加速',
[EO_Plan_Type.basic]: '基础版',
[EO_Plan_Type.personal]: '个人版',
};
/**
* 资源类型
*/
const ResourceGroup = {
/** 后付费服务类型*/
PayAsYouGo: 'pay-as-you-go',
/** 增值服务类型 */
ValueAdded: 'value-added',
/** 套餐内服务类型 */
Plan: 'plan',
}
// 是否为企业版用户
const isEnterprisePlan = (type) =>
ENTERPRISE_PACKAGES.includes(type) ||
ENTERPRISE_PACKAGES.includes(type?.substring(type?.indexOf('plan-') !== -1 ? 'plan-'.length : 0));
function getSvsFromResources(resources) {
let svs = [];
(resources || []).forEach((resource) => {
svs = svs.concat(resource?.Sv || []);
});
return svs;
};
function getEOPlanType(packageResource, postpaidResources) {
const svs = [...(packageResource?.Sv ?? []), ...(getSvsFromResources(postpaidResources) ?? [])].map(({ Key }) => Key);
if ([EO_SV.SvEdgeonePlanBasCm, EO_SV.SvEdgeonePlanBasOv, EO_SV.SvEdgeonePlanBasG].some((sv) => svs.includes(sv))) {
// 新企业版套餐版本后,基础版统一使用 EO_SV.SvEdgeonePlanBasCm
return EO_Plan_Type.basic;
}
if ([EO_SV.SvEdgeonePlanPsnCm, EO_SV.SvEdgeonePlanPsnOv, EO_SV.SvEdgeonePlanPsnG].some((sv) => svs.includes(sv))) {
// 新企业版套餐版本后,个人版统一使用 EO_SV.SvEdgeonePlanPsnCm
return EO_Plan_Type.personal;
}
if (
[
EO_SV.SvEdgeonePlanSta,
EO_SV.SvEdgeonePlanStaCm,
EO_SV.SvEdgeonePlanStaG,
// 预付费标准版
EO_SV.SvEdgeonePlanPreStaCm, // 新企业版套餐版本后,预付费标准版统一使用 EO_SV.SvEdgeonePlanPreStaCm
EO_SV.SvEdgeonePlanPreStaOv,
EO_SV.SvEdgeonePlanPreStaG,
].some((sv) => svs.includes(sv))
) {
return EO_Plan_Type.standard;
}
if (svs.includes(EO_SV.SvEdgeonePlanNewEnt)) {
return EO_Plan_Type.newEnterprise;
}
const hasScdn = [
EO_SV.SvEdgeonePlanEnt,
EO_SV.SvEdgeonePlanEntScdnCm,
EO_SV.SvEdgeonePlanEntScdnG,
EO_SV.SvEdgeonePlanEntFlatFee,
].some((sv) => svs.includes(sv));
if (svs.includes(EO_SV.SvEdgeoneCdnTrafficData)) {
if (hasScdn) {
return EO_Plan_Type.enterpriseMix;
}
return EO_Plan_Type.enterpriseCdn;
}
if (svs.includes(EO_SV.SvEdgeoneCdnTrafficSmtData)) {
if (hasScdn) {
return EO_Plan_Type.enterpriseMixSmart;
}
return EO_Plan_Type.enterpriseSmart;
}
return EO_Plan_Type.enterprise;
}
function getPackageName(planType) {
switch (planType) {
case EO_Plan_Type.basic:
case `plan-${EO_Plan_Type.basic}`:
return EO_PLAN_TYPE_NAME_MAP[EO_Plan_Type.basic] ?? '-';
case EO_Plan_Type.personal:
case `plan-${EO_Plan_Type.personal}`:
return EO_PLAN_TYPE_NAME_MAP[EO_Plan_Type.personal] ?? '-';
case EO_Plan_Type.standard:
case `plan-${EO_Plan_Type.standard}`:
return EO_PLAN_TYPE_NAME_MAP[EO_Plan_Type.standard] ?? '-';
default:
if (isEnterprisePlan(planType)) {
return 'enterprise';
}
return '-';
}
};
function parseEOPlansFromResources(resources, ofZone) {
const data = Object.entries(_.groupBy(resources, 'PlanId')).map(([id, resources]) => {
// 根据 Group 将 套餐、后付费、增值服务 分组
const groups = _.groupBy(resources, 'Group');
// 后付费 Resource 中,创建时间最早的 Resource 就是保底相关的 Resource(gaoyichen),
// 部分模块使用了 sortedPostpaid 的第一个元素信息,如保底数据获取等
const sortedPostpaid = (groups?.[ResourceGroup.PayAsYouGo] || [])?.sort((a, b) =>
moment(a.CreateTime).isBefore(b.CreateTime) ? -1 : 1,
);
const planResource = {
package: groups?.[ResourceGroup.Plan]?.[0],
postpaid: sortedPostpaid,
patch: groups?.[ResourceGroup.ValueAdded],
};
return {
id,
// 套餐创建时间与站点创建时间一致,且套餐 ID 以 zone- 开头为存量用户
fake:
id.startsWith('zone-') &&
[planResource?.package?.CreateTime, sortedPostpaid?.[0]?.CreateTime].includes(ofZone?.CreatedOn),
type: getEOPlanType(planResource.package, planResource.postpaid),
...planResource,
};
});
return data;
}
function isStandard(resources, ofZone) {
const data = parseEOPlansFromResources(resources, ofZone)
return getPackageName(data[0].type)
}
module.exports = isStandard