diff --git a/package.json b/package.json index 2faee77..78179d0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tencent-component-toolkit", - "version": "2.24.2", + "version": "2.24.3", "description": "Tencent component toolkit", "main": "lib/index.js", "types": "lib/index.d.ts", diff --git a/src/modules/scf/apis.ts b/src/modules/scf/apis.ts index f0cc8e1..0d370a7 100644 --- a/src/modules/scf/apis.ts +++ b/src/modules/scf/apis.ts @@ -26,7 +26,8 @@ const ACTIONS = [ 'DeleteProvisionedConcurrencyConfig', 'GetReservedConcurrencyConfig', 'GetProvisionedConcurrencyConfig', - 'GetRequestStatus' + 'GetRequestStatus', + 'PutGpuReservedQuota', ] as const; export type ActionType = typeof ACTIONS[number]; diff --git a/src/modules/scf/entities/scf.ts b/src/modules/scf/entities/scf.ts index 2ab2052..f8b2815 100644 --- a/src/modules/scf/entities/scf.ts +++ b/src/modules/scf/entities/scf.ts @@ -14,6 +14,7 @@ import { FunctionInfo, GetLogOptions, GetRequestStatusOptions, + GpuReservedQuota, ScfCreateFunctionInputs, UpdateFunctionCodeOptions, } from '../interface'; @@ -150,8 +151,12 @@ export default class ScfEntity extends BaseEntity { console.log(`Creating function ${inputs.name}, region ${this.region}`); const inp = formatInputs(inputs); const functionInputs = { Action: 'CreateFunction' as const, ...inp }; - await this.request(functionInputs); - return true; + try { + await this.request(functionInputs); + return true; + } catch (error) { + return false; + } } // 更新函数代码 @@ -476,4 +481,21 @@ export default class ScfEntity extends BaseEntity { console.log(e); } } + + // 设置Gpu函数独占配额 + async updateGpuReservedQuota(inputs: GpuReservedQuota) { + console.log(`PutGpuReservedQuota functionName ${inputs.functionName}, region ${this.region},gpuReservedQuota ${inputs.gpuReservedQuota}`); + const quotaInputs = { + Action: 'PutGpuReservedQuota' as const, + Version: '2018-04-16', + FunctionName:inputs?.functionName, + GpuReservedQuota: inputs?.gpuReservedQuota + }; + try { + await this.request(quotaInputs); + return true; + } catch (error) { + return false; + } + } } diff --git a/src/modules/scf/index.ts b/src/modules/scf/index.ts index e8ebd76..9615af8 100644 --- a/src/modules/scf/index.ts +++ b/src/modules/scf/index.ts @@ -20,6 +20,7 @@ import { ScfDeployOutputs, OriginTriggerType, GetLogOptions, + SF_TYPE_ENUM, } from './interface'; import ScfEntity from './entities/scf'; import AliasEntity from './entities/alias'; @@ -283,7 +284,14 @@ export default class Scf { // 检查函数是否存在,不存在就创建,存在就更新 if (!funcInfo) { - await this.scf.create(inputs); + let result = await this.scf.create(inputs); + //创建函数成功后,设置Gpu函数独占配额,如果当前是sd函数、gpuReservedQuota大于0,则执行该操作。 + if(result && [SF_TYPE_ENUM.SD_API,SF_TYPE_ENUM.SD_WEB_UI].includes(inputs?.sFType as any) && !!inputs?.gpuReservedQuota){ + await this.scf.updateGpuReservedQuota({ + functionName: inputs?.name, + gpuReservedQuota: inputs?.gpuReservedQuota + }); + } } else { await this.scf.updateCode(inputs, funcInfo); diff --git a/src/modules/scf/interface.ts b/src/modules/scf/interface.ts index d7f3d6b..99b6649 100644 --- a/src/modules/scf/interface.ts +++ b/src/modules/scf/interface.ts @@ -12,6 +12,7 @@ export interface FunctionCode { RegistryId?: string; Command?: string; Args?: string; + ContainerImageAccelerate?: boolean; }; } @@ -67,6 +68,13 @@ export interface BaseFunctionConfig { ProtocolParams?: ProtocolParams; NodeType?: string; NodeSpec?: string; + SFType?: string; + GpuReservedQuota?: number; + // 请求并发 + InstanceConcurrencyConfig?: { + DynamicEnabled?: boolean; + MaxConcurrency?: number; + }; } export interface TriggerType { @@ -228,6 +236,8 @@ export interface ScfCreateFunctionInputs { command?: string; // 启动命令参数 args?: string; + // 镜像加速 + containerImageAccelerate?: boolean; }; // 异步调用重试配置 @@ -236,6 +246,16 @@ export interface ScfCreateFunctionInputs { protocolType?: string; protocolParams?: ProtocolParams; + + // sd应用类型 + sFType?: string; + // gpu并发数,默认是0 + gpuReservedQuota?: number; + // 请求并发配置 + instanceConcurrencyConfig?: { + dynamicEnabled?: boolean; + maxConcurrency?: number; + }; } export interface ScfUpdateAliasTrafficInputs { @@ -391,25 +411,37 @@ export interface GetRequestStatusOptions { /** * 函数名称 */ - functionName: string + functionName: string; /** * 需要查询状态的请求id */ - functionRequestId: string + functionRequestId: string; /** * 函数的所在的命名空间 */ - namespace?: string + namespace?: string; /** * 查询的开始时间,例如:2017-05-16 20:00:00,不填默认为当前时间 - 15min */ - startTime?: string + startTime?: string; /** * 查询的结束时间,例如:2017-05-16 20:59:59,不填默认为当前时间。EndTime 需要晚于 StartTime。 */ - endTime?: string + endTime?: string; } + +export const SF_TYPE_ENUM = { + SD_WEB_UI: 'SD WebUI', + SD_API: 'SD API', +}; + +export interface GpuReservedQuota { + functionName: string + gpuReservedQuota: number + region?: string + namespace?: string +} \ No newline at end of file diff --git a/src/modules/scf/utils.ts b/src/modules/scf/utils.ts index 0c905d1..be44a60 100644 --- a/src/modules/scf/utils.ts +++ b/src/modules/scf/utils.ts @@ -52,6 +52,11 @@ export const formatInputs = (inputs: ScfCreateFunctionInputs) => { if (imageConfig.args) { functionInputs.Code!.ImageConfig!.Args = imageConfig.args; } + + if (imageConfig?.containerImageAccelerate !== undefined) { + functionInputs.Code!.ImageConfig!.ContainerImageAccelerate = + imageConfig?.containerImageAccelerate; + } } else { // 基于 COS 代码部署 functionInputs.Code = { @@ -85,6 +90,22 @@ export const formatInputs = (inputs: ScfCreateFunctionInputs) => { } } + // sd应用类型 + if (inputs?.sFType) { + functionInputs.SFType = inputs?.sFType; + } + // sd gpu并发数 + if (inputs?.gpuReservedQuota) { + functionInputs.GpuReservedQuota = inputs?.gpuReservedQuota; + } + // 请求并发 + if (inputs?.instanceConcurrencyConfig) { + functionInputs.InstanceConcurrencyConfig = { + DynamicEnabled: inputs?.instanceConcurrencyConfig?.dynamicEnabled, + MaxConcurrency: inputs?.instanceConcurrencyConfig?.maxConcurrency, + }; + } + if (inputs.role) { functionInputs.Role = inputs.role; }