From 38aed63d75971a5b3434c303c8784f220de8ad49 Mon Sep 17 00:00:00 2001 From: darminzhou Date: Fri, 27 Sep 2024 19:29:26 +0800 Subject: [PATCH] feat: create alias --- src/modules/scf/entities/alias.ts | 14 ++++--- src/modules/scf/index.ts | 61 +++++++++++++++++++++++++------ src/modules/scf/interface.ts | 4 +- 3 files changed, 61 insertions(+), 18 deletions(-) diff --git a/src/modules/scf/entities/alias.ts b/src/modules/scf/entities/alias.ts index 867d7eb..c1f09ea 100644 --- a/src/modules/scf/entities/alias.ts +++ b/src/modules/scf/entities/alias.ts @@ -13,17 +13,21 @@ import BaseEntity from './base'; export default class AliasEntity extends BaseEntity { async create(inputs: ScfCreateAlias) { - const publishInputs = { + const publishInputs: any = { Action: 'CreateAlias' as const, FunctionName: inputs.functionName, - FunctionVersion: inputs.functionVersion, + FunctionVersion: inputs.functionVersion || '$LATEST', Name: inputs.aliasName, Namespace: inputs.namespace || 'default', - RoutingConfig: { - AdditionalVersionWeights: [{ Version: inputs.lastVersion, Weight: inputs.traffic }], - }, Description: inputs.description || 'Published by Serverless Component', }; + if (inputs.lastVersion && inputs.traffic) { + publishInputs.RoutingConfig = { + AdditionalVersionWeights: [ + { Version: inputs.lastVersion, Weight: strip(1 - inputs.traffic) }, + ], + }; + } const Response = await this.request(publishInputs); return Response; } diff --git a/src/modules/scf/index.ts b/src/modules/scf/index.ts index 660be77..49cfc99 100644 --- a/src/modules/scf/index.ts +++ b/src/modules/scf/index.ts @@ -321,19 +321,56 @@ export default class Scf { }); } + const aliasAddionalVersion = inputs.aliasAddionalVersion || inputs.lastVersion; const needSetTraffic = - inputs.traffic != null && inputs.lastVersion && inputs.lastVersion !== '$LATEST'; - if (needSetTraffic) { - await this.alias.update({ - namespace, - functionName, - region: this.region, - additionalVersions: needSetTraffic - ? [{ weight: strip(1 - inputs.traffic!), version: inputs.lastVersion! }] - : [], - aliasName: inputs.aliasName, - description: inputs.aliasDescription, - }); + inputs.traffic != null && aliasAddionalVersion && aliasAddionalVersion !== '$LATEST'; + const needSetAlias = (inputs.aliasName && inputs.aliasName !== '$DEFAULT') || needSetTraffic; + if (needSetAlias) { + let needCreateAlias = false; + if (inputs.aliasName && inputs.aliasName !== '$DEFAULT') { + try { + const aliasInfo = await this.alias.get({ + namespace, + functionName, + region: this.region, + aliasName: inputs.aliasName, + }); + if (!aliasInfo?.Name) { + needCreateAlias = true; + } + } catch (error: any) { + if ( + error.message && + (error.message.includes('未找到指定的') || error.message.include('is not found')) + ) { + needCreateAlias = true; + } + } + } + if (needCreateAlias) { + await this.alias.create({ + namespace, + functionName, + functionVersion: inputs.aliasFunctionVersion || funcInfo?.Qualifier, + aliasName: inputs.aliasName!, + lastVersion: aliasAddionalVersion!, + traffic: inputs.traffic!, + description: inputs.aliasDescription, + }); + } else { + await this.alias.update({ + namespace, + functionName, + functionVersion: inputs.aliasFunctionVersion || funcInfo?.Qualifier, + additionalVersions: needSetTraffic + ? [{ weight: strip(1 - inputs.traffic!), version: aliasAddionalVersion! }] + : [], + region: this.region, + aliasName: inputs.aliasName, + description: inputs.aliasDescription, + }); + } + outputs.Traffic = inputs.traffic; outputs.ConfigTrafficVersion = inputs.lastVersion; } diff --git a/src/modules/scf/interface.ts b/src/modules/scf/interface.ts index f714a7b..9825ae3 100644 --- a/src/modules/scf/interface.ts +++ b/src/modules/scf/interface.ts @@ -142,7 +142,7 @@ export interface ScfListAliasInputs extends ScfGetAliasInputs {} export interface ScfCreateAlias { functionName: string; - functionVersion: string; + functionVersion?: string; aliasName: string; namespace?: string; lastVersion: string; @@ -279,6 +279,8 @@ export interface ScfDeployInputs extends ScfCreateFunctionInputs { aliasName?: string; aliasDescription?: string; + aliasFunctionVersion?: string; + aliasAddionalVersion?: string; tags?: Record;