UNPKG

tencentcloud-edgeone-migration-nodejs-v2

Version:

tencentcloud cdn config copy to edgeone

277 lines (254 loc) 10.8 kB
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