From 9b8e47063c826c2e337a2d5d524eda209e5e96f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreia=20Oc=C4=83noaia?= Date: Fri, 7 Feb 2025 13:07:19 +0200 Subject: [PATCH] Add longRunning/Persistent function flag MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Andreia Ocănoaia --- src/cloudAdapter/cloudAdapter.ts | 2 ++ src/commands/deploy/docker/deploy.ts | 1 + src/commands/deploy/genezio.ts | 2 ++ src/commands/deploy/zip/deploy.ts | 1 + src/generateSdk/generateSdkApi.ts | 1 + src/generateSdk/utils/getAstSummary.ts | 1 + src/models/astSummary.ts | 1 + src/models/genezioModels.ts | 1 + src/models/projectConfiguration.ts | 8 ++++++++ src/projectConfiguration/yaml/v2.ts | 3 +++ src/requests/deployCode.ts | 1 + src/utils/configuration.ts | 5 +++++ src/utils/decorators/baseDecoratorExtractor.ts | 3 ++- src/utils/decorators/decoratorTypes.ts | 2 +- src/utils/scripts.ts | 2 +- src/utils/strings.ts | 2 +- 16 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/cloudAdapter/cloudAdapter.ts b/src/cloudAdapter/cloudAdapter.ts index abd028984..2a9b285b6 100644 --- a/src/cloudAdapter/cloudAdapter.ts +++ b/src/cloudAdapter/cloudAdapter.ts @@ -49,6 +49,7 @@ export type GenezioCloudInput = maxConcurrentRequestsPerInstance?: number; maxConcurrentInstances?: number; cooldownTime?: number; + persistent?: boolean; } | { type: GenezioCloudInputType.FUNCTION; @@ -64,6 +65,7 @@ export type GenezioCloudInput = maxConcurrentRequestsPerInstance?: number; maxConcurrentInstances?: number; cooldownTime?: number; + persistent?: boolean; }; export type GenezioCloudResultClass = { diff --git a/src/commands/deploy/docker/deploy.ts b/src/commands/deploy/docker/deploy.ts index ffb64ed14..9115f1ba4 100644 --- a/src/commands/deploy/docker/deploy.ts +++ b/src/commands/deploy/docker/deploy.ts @@ -168,6 +168,7 @@ export async function dockerDeploy(options: GenezioDeployOptions) { config.container!.maxConcurrentRequestsPerInstance, maxConcurrentInstances: config.container!.maxConcurrentInstances, cooldownTime: config.container!.cooldownTime, + persistent: config.container!.persistent, }, ], projectConfiguration, diff --git a/src/commands/deploy/genezio.ts b/src/commands/deploy/genezio.ts index 788f72ae8..8f9016d8a 100644 --- a/src/commands/deploy/genezio.ts +++ b/src/commands/deploy/genezio.ts @@ -490,6 +490,7 @@ export async function deployClasses( maxConcurrentRequestsPerInstance: element.maxConcurrentRequestsPerInstance, maxConcurrentInstances: element.maxConcurrentInstances, cooldownTime: element.cooldownTime, + persistent: element.persistent, }; }, ); @@ -742,6 +743,7 @@ export async function functionToCloudInput( maxConcurrentRequestsPerInstance: functionElement.maxConcurrentRequestsPerInstance, maxConcurrentInstances: functionElement.maxConcurrentInstances, cooldownTime: functionElement.cooldownTime, + persistent: functionElement.persistent, metadata: metadata, }; } diff --git a/src/commands/deploy/zip/deploy.ts b/src/commands/deploy/zip/deploy.ts index 77fffdeae..5c96fd04a 100644 --- a/src/commands/deploy/zip/deploy.ts +++ b/src/commands/deploy/zip/deploy.ts @@ -61,6 +61,7 @@ export async function zipDeploy(options: GenezioDeployOptions) { maxConcurrentRequestsPerInstance: f.maxConcurrentRequestsPerInstance, maxConcurrentInstances: f.maxConcurrentInstances, cooldownTime: f.cooldownTime, + persistent: f.persistent, }; }); diff --git a/src/generateSdk/generateSdkApi.ts b/src/generateSdk/generateSdkApi.ts index 46138df03..a1ecc48c5 100644 --- a/src/generateSdk/generateSdkApi.ts +++ b/src/generateSdk/generateSdkApi.ts @@ -109,6 +109,7 @@ export function mapYamlClassToSdkClassConfiguration( maxConcurrentRequestsPerInstance: yamlClass.maxConcurrentRequestsPerInstance, maxConcurrentInstances: yamlClass.maxConcurrentInstances, cooldownTime: yamlClass.cooldownTime, + persistent: yamlClass.persistent, }; }); } diff --git a/src/generateSdk/utils/getAstSummary.ts b/src/generateSdk/utils/getAstSummary.ts index b0e1466ae..b42096924 100644 --- a/src/generateSdk/utils/getAstSummary.ts +++ b/src/generateSdk/utils/getAstSummary.ts @@ -77,6 +77,7 @@ export function getAstSummary(classesInfo: SdkGeneratorClassesInfoInput[]): AstS maxConcurrentInstances: classConfiguration.classConfiguration.maxConcurrentInstances, cooldownTime: classConfiguration.classConfiguration.cooldownTime, + persistent: classConfiguration.classConfiguration.persistent, }; return classInfo; }); diff --git a/src/models/astSummary.ts b/src/models/astSummary.ts index de223b7f9..5c52f45eb 100644 --- a/src/models/astSummary.ts +++ b/src/models/astSummary.ts @@ -30,6 +30,7 @@ export type AstSummaryClass = { maxConcurrentRequestsPerInstance?: number; maxConcurrentInstances?: number; cooldownTime?: number; + persistent?: boolean; }; export type AstSummary = { diff --git a/src/models/genezioModels.ts b/src/models/genezioModels.ts index c889d21ee..9580c69b5 100644 --- a/src/models/genezioModels.ts +++ b/src/models/genezioModels.ts @@ -380,4 +380,5 @@ export type SdkClassConfiguration = { maxConcurrentRequestsPerInstance?: number; maxConcurrentInstances?: number; cooldownTime?: number; + persistent?: boolean; }; diff --git a/src/models/projectConfiguration.ts b/src/models/projectConfiguration.ts index 98239a086..c3f3e546a 100644 --- a/src/models/projectConfiguration.ts +++ b/src/models/projectConfiguration.ts @@ -75,6 +75,7 @@ export class ClassConfiguration { maxConcurrentRequestsPerInstance?: number; maxConcurrentInstances?: number; cooldownTime?: number; + persistent?: boolean; constructor( name: string, @@ -91,6 +92,7 @@ export class ClassConfiguration { maxConcurrentRequestsPerInstance?: number, maxConcurrentInstances?: number, cooldownTime?: number, + persistent?: boolean, ) { this.name = name; this.path = path; @@ -106,6 +108,7 @@ export class ClassConfiguration { this.maxConcurrentRequestsPerInstance = maxConcurrentRequestsPerInstance; this.maxConcurrentInstances = maxConcurrentInstances; this.cooldownTime = cooldownTime; + this.persistent = persistent; } } @@ -122,6 +125,7 @@ export class FunctionConfiguration { maxConcurrentRequestsPerInstance?: number; maxConcurrentInstances?: number; cooldownTime?: number; + persistent?: boolean; constructor( name: string, @@ -136,6 +140,7 @@ export class FunctionConfiguration { maxConcurrentRequestsPerInstance?: number, maxConcurrentInstances?: number, cooldownTime?: number, + persistent?: boolean, ) { this.name = name; this.path = path; @@ -149,6 +154,7 @@ export class FunctionConfiguration { this.maxConcurrentRequestsPerInstance = maxConcurrentRequestsPerInstance; this.maxConcurrentInstances = maxConcurrentInstances; this.cooldownTime = cooldownTime; + this.persistent = persistent; } } @@ -300,6 +306,7 @@ export class ProjectConfiguration { maxConcurrentRequestsPerInstance: c.maxConcurrentRequestsPerInstance, maxConcurrentInstances: c.maxConcurrentInstances, cooldownTime: c.cooldownTime, + persistent: c.persistent, }; }); @@ -318,6 +325,7 @@ export class ProjectConfiguration { maxConcurrentRequestsPerInstance: f.maxConcurrentRequestsPerInstance, maxConcurrentInstances: f.maxConcurrentInstances, cooldownTime: f.cooldownTime, + persistent: f.persistent, }; }) || []; } diff --git a/src/projectConfiguration/yaml/v2.ts b/src/projectConfiguration/yaml/v2.ts index 8ac22524b..05493a36f 100644 --- a/src/projectConfiguration/yaml/v2.ts +++ b/src/projectConfiguration/yaml/v2.ts @@ -122,6 +122,7 @@ function parseGenezioConfig(config: unknown) { return true; }, "The maximum number of concurrent instances should be greater than 0."), cooldownTime: zod.number().optional(), + persistent: zod.boolean().optional(), }); const functionsSchema = zod @@ -162,6 +163,7 @@ function parseGenezioConfig(config: unknown) { return true; }, "The maximum number of concurrent instances should be greater than 0."), cooldownTime: zod.number().optional(), + persistent: zod.boolean().optional(), }) .refine( ({ type, handler }) => !(type === FunctionType.aws && !handler), @@ -358,6 +360,7 @@ function parseGenezioConfig(config: unknown) { return true; }, "The maximum number of concurrent instances should be greater than 0."), cooldownTime: zod.number().optional(), + persistent: zod.boolean().optional(), environment: environmentSchema.optional(), }); diff --git a/src/requests/deployCode.ts b/src/requests/deployCode.ts index 3d68846d1..1a14c8eb6 100644 --- a/src/requests/deployCode.ts +++ b/src/requests/deployCode.ts @@ -53,6 +53,7 @@ export async function deployRequest( maxConcurrentRequestsPerInstance: input?.maxConcurrentRequestsPerInstance, maxConcurrentInstances: input?.maxConcurrentInstances, cooldownTime: input?.cooldownTime, + persistent: input?.persistent, }; }) ?? [], projectName: projectConfiguration.name, diff --git a/src/utils/configuration.ts b/src/utils/configuration.ts index 3a9b060df..a5103f634 100644 --- a/src/utils/configuration.ts +++ b/src/utils/configuration.ts @@ -64,6 +64,7 @@ export async function scanClassesForDecorators( let maxConcurrentRequestsPerInstance: number | undefined; let maxConcurrentInstances: number | undefined; let cooldownTime: number | undefined; + let persistent: boolean | undefined; const methods = classInfo[0].methods .map((m) => { const genezioMethodDecorator = m.decorators.find( @@ -119,6 +120,9 @@ export async function scanClassesForDecorators( cooldownTime = deployDecoratorFound.arguments["cooldownTime"] as | number | undefined; + persistent = deployDecoratorFound.arguments["persistent"] as + | boolean + | undefined; } classes.push({ @@ -131,6 +135,7 @@ export async function scanClassesForDecorators( maxConcurrentRequestsPerInstance: maxConcurrentRequestsPerInstance, maxConcurrentInstances: maxConcurrentInstances, cooldownTime: cooldownTime, + persistent: persistent, methods: methods, }); } else if (r && deployDecoratorFound) { diff --git a/src/utils/decorators/baseDecoratorExtractor.ts b/src/utils/decorators/baseDecoratorExtractor.ts index 412dd514d..0bfb0e1b5 100644 --- a/src/utils/decorators/baseDecoratorExtractor.ts +++ b/src/utils/decorators/baseDecoratorExtractor.ts @@ -93,7 +93,8 @@ export abstract class DecoratorExtractor { key === "storageSize" || key === "maxConcurrentRequestsPerInstance" || key === "maxConcurrentInstances" || - key === "cooldownTime" + key === "cooldownTime" || + key === "persistent" ) { transformedValue = parseInt(value); if (isNaN(transformedValue)) { diff --git a/src/utils/decorators/decoratorTypes.ts b/src/utils/decorators/decoratorTypes.ts index 066bb4429..fc8182a29 100644 --- a/src/utils/decorators/decoratorTypes.ts +++ b/src/utils/decorators/decoratorTypes.ts @@ -10,7 +10,7 @@ export type MethodInfo = { export type ClassDecoratorInfo = { name: string; - arguments?: { [key: string]: string | number }; + arguments?: { [key: string]: string | number | boolean }; }; export type ClassInfo = { diff --git a/src/utils/scripts.ts b/src/utils/scripts.ts index b425c3410..55417f115 100644 --- a/src/utils/scripts.ts +++ b/src/utils/scripts.ts @@ -108,7 +108,7 @@ export async function resolveConfigurationVariable( isLocal?: boolean; port?: number; }, -): Promise { +): Promise { if (options?.isLocal && !options?.port) { options.port = PORT_LOCAL_ENVIRONMENT; } diff --git a/src/utils/strings.ts b/src/utils/strings.ts index 6c5ad2089..be8c9e3a9 100644 --- a/src/utils/strings.ts +++ b/src/utils/strings.ts @@ -48,7 +48,7 @@ export const displayHint = function (message: string) { * @param {string} value - The value to replace the placeholder with. * @returns {string} - The updated string with the placeholder replaced. */ -export function replaceExpression(expression: string, value: string|number): string { +export function replaceExpression(expression: string, value: string|number|boolean): string { // ${{}} can be any alphanumeric string with special characters const placeholderPattern = /\${{[A-Za-z0-9\s/.\-_]+}}/; return expression.replace(placeholderPattern, value.toString());