Skip to content

fix: support add alisa and publish function version #302

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "tencent-component-toolkit",
"version": "2.27.0",
"version": "2.27.1",
"description": "Tencent component toolkit",
"main": "lib/index.js",
"types": "lib/index.d.ts",
Expand Down
1 change: 1 addition & 0 deletions src/modules/scf/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ const CONFIGS = {
defaultInitTimeout: 3,
waitStatus: ['Creating', 'Updating', 'Publishing', 'Deleting'],
failStatus: ['CreateFailed ', 'UpdateFailed', 'PublishFailed', 'DeleteFailed'],
defaultDiskSize: 512,
};

export default CONFIGS;
31 changes: 18 additions & 13 deletions src/modules/scf/entities/alias.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,17 @@ export default class AliasEntity extends BaseEntity {
Name: inputs.aliasName,
Namespace: inputs.namespace || 'default',
Description: inputs.description || 'Published by Serverless Component',
RoutingConfig: {
AdditionalVersionWeights: inputs.additionalVersions
? inputs.additionalVersions?.map((v) => {
return {
Version: v.version,
Weight: v.weight,
};
})
: [],
},
};
if (inputs.lastVersion && inputs.traffic) {
publishInputs.RoutingConfig = {
AdditionalVersionWeights: [
{ Version: inputs.lastVersion, Weight: strip(1 - inputs.traffic) },
],
};
}
const Response = await this.request(publishInputs);
return Response;
}
Expand All @@ -43,12 +46,14 @@ export default class AliasEntity extends BaseEntity {
Name: inputs.aliasName || '$DEFAULT',
Namespace: inputs.namespace || 'default',
RoutingConfig: {
AdditionalVersionWeights: inputs.additionalVersions?.map((v) => {
return {
Version: v.version,
Weight: v.weight,
};
}),
AdditionalVersionWeights: inputs.additionalVersions
? inputs.additionalVersions?.map((v) => {
return {
Version: v.version,
Weight: v.weight,
};
})
: [],
},
Description: inputs.description || 'Configured by Serverless Component',
};
Expand Down
82 changes: 59 additions & 23 deletions src/modules/scf/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,21 @@ export default class Scf {
const functionName = inputs.name;
const { ignoreTriggers = false } = inputs;

if (inputs?.aliasName) {
if (!inputs?.additionalVersionWeights) {
throw new ApiTypeError(
'PARAMETER_SCF',
'additionalVersionWeights is required when aliasName is setted',
);
}
if (!inputs.publish && !inputs?.aliasFunctionVersion) {
throw new ApiTypeError(
'PARAMETER_SCF',
'aliasFunctionVersion is required when aliasName is setted',
);
}
}

// 在部署前,检查函数初始状态,如果初始为 CreateFailed,尝试先删除,再重新创建
let funcInfo = await this.scf.getInitialStatus({ namespace, functionName });

Expand Down Expand Up @@ -311,6 +326,11 @@ export default class Scf {
namespace,
description: inputs.publishDescription,
});

if (inputs.aliasName) {
inputs.aliasFunctionVersion = FunctionVersion;
}

inputs.lastVersion = FunctionVersion;
outputs.LastVersion = FunctionVersion;

Expand All @@ -321,13 +341,10 @@ export default class Scf {
});
}

const aliasAddionalVersion = inputs.aliasAddionalVersion || inputs.lastVersion;
const needSetTraffic =
inputs.traffic != null && aliasAddionalVersion && aliasAddionalVersion !== '$LATEST';
const needSetAlias = (inputs.aliasName && inputs.aliasName !== '$DEFAULT') || needSetTraffic;
if (needSetAlias) {
// 检测配置的别名是否存在,不存在就创建,存在的话就设置流量
if (inputs.aliasName) {
let needCreateAlias = false;
if (inputs.aliasName && inputs.aliasName !== '$DEFAULT') {
if (inputs.aliasName !== '$DEFAULT') {
try {
const aliasInfo = await this.alias.get({
namespace,
Expand All @@ -347,32 +364,51 @@ export default class Scf {
}
}
}
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 {
try {
// 创建别名
if (needCreateAlias) {
await this.alias.create({
namespace,
functionName,
functionVersion: inputs.aliasFunctionVersion || funcInfo?.Qualifier,
aliasName: inputs.aliasName!,
description: inputs.aliasDescription,
additionalVersions: inputs.additionalVersionWeights,
});
} else {
// 更新别名
await this.alias.update({
namespace,
functionName,
functionVersion: inputs.aliasFunctionVersion || funcInfo?.Qualifier,
additionalVersions: inputs.additionalVersionWeights,
region: this.region,
aliasName: inputs.aliasName,
description: inputs.aliasDescription,
});
}
} catch (error) {
const errorType = needCreateAlias ? 'CREATE_ALIAS_SCF' : 'UPDATE_ALIAS_SCF';
throw new ApiTypeError(errorType, error.message);
}
} else {
// 兼容旧逻辑,即给默认版本$LATEST设置traffic比例的流量,给lastVersion版本设置(1-traffic)比例的流量。
const needSetTraffic =
inputs.traffic != null && inputs.lastVersion && inputs.lastVersion !== '$LATEST';
if (needSetTraffic) {
await this.alias.update({
namespace,
functionName,
functionVersion: inputs.aliasFunctionVersion || funcInfo?.Qualifier,
region: this.region,
additionalVersions: needSetTraffic
? [{ weight: strip(1 - inputs.traffic!), version: aliasAddionalVersion! }]
? [{ weight: strip(1 - inputs.traffic!), version: inputs.lastVersion! }]
: [],
region: this.region,
aliasName: inputs.aliasName,
description: inputs.aliasDescription,
});
outputs.Traffic = inputs.traffic;
outputs.ConfigTrafficVersion = inputs.lastVersion;
}

outputs.Traffic = inputs.traffic;
outputs.ConfigTrafficVersion = inputs.lastVersion;
}

// get default alias
Expand Down
20 changes: 16 additions & 4 deletions src/modules/scf/interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ export interface BaseFunctionConfig {
Timeout?: number;
InitTimeout?: number;
MemorySize?: number;
DiskSize?: number;
Type?: 'HTTP' | 'Event';
DeployMode?: 'code' | 'image';
PublicNetConfig?: {
Expand Down Expand Up @@ -69,6 +70,7 @@ export interface BaseFunctionConfig {
ProtocolParams?: ProtocolParams;
NodeType?: string;
NodeSpec?: string;
InstanceConcurrencyConfig?: { DynamicEnabled: 'TRUE' | 'FALSE'; MaxConcurrency?: number };
}

export interface TriggerType {
Expand Down Expand Up @@ -145,9 +147,10 @@ export interface ScfCreateAlias {
functionVersion?: string;
aliasName: string;
namespace?: string;
lastVersion: string;
traffic: number;
lastVersion?: string;
traffic?: number;
description?: string;
additionalVersions?: { version: string; weight: number }[];
}

export interface ScfCreateFunctionInputs {
Expand All @@ -167,6 +170,7 @@ export interface ScfCreateFunctionInputs {
timeout?: number;
initTimeout?: number;
memorySize?: number;
diskSize?: number;
publicAccess?: boolean;
eip?: boolean;
l5Enable?: boolean;
Expand Down Expand Up @@ -245,6 +249,13 @@ export interface ScfCreateFunctionInputs {

protocolType?: string;
protocolParams?: ProtocolParams;

// 请求多并发配置
instanceConcurrencyConfig?: {
enable: boolean; // 是否开启多并发
dynamicEnabled: boolean; // 是否开启动态配置
maxConcurrency: number; // 最大并发数
};
}

export interface ScfUpdateAliasTrafficInputs {
Expand All @@ -270,17 +281,18 @@ export interface ScfDeployInputs extends ScfCreateFunctionInputs {
enableRoleAuth?: boolean;
region?: string;

// 版本相关配置
lastVersion?: string;
publish?: boolean;
publishDescription?: string;

needSetTraffic?: boolean;
traffic?: number;

// 别名相关配置
aliasName?: string;
aliasDescription?: string;
aliasFunctionVersion?: string;
aliasAddionalVersion?: string;
additionalVersionWeights?: { version: string; weight: number }[];

tags?: Record<string, string>;

Expand Down
14 changes: 14 additions & 0 deletions src/modules/scf/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ export const formatInputs = (inputs: ScfCreateFunctionInputs) => {
},
L5Enable: inputs.l5Enable === true ? 'TRUE' : 'FALSE',
InstallDependency: inputs.installDependency === true ? 'TRUE' : 'FALSE',
DiskSize: +(inputs.diskSize || CONFIGS.defaultDiskSize),
};

if (inputs.nodeType) {
Expand Down Expand Up @@ -96,6 +97,19 @@ export const formatInputs = (inputs: ScfCreateFunctionInputs) => {
functionInputs.ProtocolParams = protocolParams;
}
}
// 仅web函数支持单实例请求多并发,instanceConcurrencyConfig.enable:true,启用多并发;instanceConcurrencyConfig.enable:false,关闭多并发
if (inputs.instanceConcurrencyConfig) {
if (inputs.instanceConcurrencyConfig.enable) {
functionInputs.InstanceConcurrencyConfig = {
DynamicEnabled: inputs.instanceConcurrencyConfig.dynamicEnabled ? 'TRUE' : 'FALSE',
MaxConcurrency: inputs.instanceConcurrencyConfig.maxConcurrency || 2,
};
} else {
functionInputs.InstanceConcurrencyConfig = {
DynamicEnabled: '' as any,
};
}
}
}

if (inputs.role) {
Expand Down
16 changes: 16 additions & 0 deletions src/utils/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,22 @@ export function isArray<T>(obj: T[] | T): obj is T[] {
return Object.prototype.toString.call(obj) == '[object Array]';
}

/**
* is positive integer(正整数)
* @param obj object
*/
export function isPositiveInteger(value: string | number) {
return +value > 0 && Number.isInteger(+value);
}

/**
* is number(数字)
* @param obj object
*/
export function isNumber(value: string | number) {
return !Number.isNaN(+value);
}

/**
* is object
* @param obj object
Expand Down
Loading