From 4ed5d1cf4806f9e7eec9c2bda8a5bc81e05e4900 Mon Sep 17 00:00:00 2001 From: Vigneshraj Sekar Babu Date: Fri, 5 Sep 2025 14:19:44 -0700 Subject: [PATCH 1/2] keda global control flag --- src/server/db/migrations/001_seed.ts | 2 +- src/server/services/deploy.ts | 9 ++------- src/server/services/deployable.ts | 4 ++-- src/server/services/types/globalConfig.ts | 2 +- 4 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/server/db/migrations/001_seed.ts b/src/server/db/migrations/001_seed.ts index 4de01d8f..5ad87c57 100644 --- a/src/server/db/migrations/001_seed.ts +++ b/src/server/db/migrations/001_seed.ts @@ -452,7 +452,7 @@ export async function up(knex: Knex): Promise { INSERT INTO global_config (key, config, "createdAt", "updatedAt", "deletedAt", description) VALUES ('lifecycleIgnores', '{"github":{"branches":[],"events":["closed","deleted"],"organizations":[],"botUsers":[]}}', now(), now(), null, 'Data values for Lifecycle to ignore'); INSERT INTO global_config (key, config, "createdAt", "updatedAt", "deletedAt", description) VALUES ('deletePendingHelmReleaseStep', '{"delete":true,"static_delete":true}', now(), now(), null, 'If deletePendingHelmReleaseStep is set to true'); INSERT INTO global_config (key, config, "createdAt", "updatedAt", "deletedAt", description) VALUES ('redpanda', '{"version":"3.7.2","args":"--force --timeout 60m0s --wait","action":"install","chart":{"name":"redpanda","repoUrl":"https://charts.redpanda.com","version":"5.9.0","values":[],"valueFiles":[]},"tolerations":"tolerations","affinity":"affinity","nodeSelector":"nodeSelector"}', now(), now(), null, 'Redpanda helm chart configuration default values.'); - INSERT INTO global_config (key, config, "createdAt", "updatedAt", "deletedAt", description) VALUES ('kedaScaleToZero', '{"type":"http","replicas":{"min":1,"max":3},"scaledownPeriod":10800,"maxRetries":10,"scalingMetric":{"requestRate":{"granularity":"1m","targetValue":30,"window":"1m"},"concurrency":{"targetValue":100}}}', now(), now(), null, 'This is the default configuration for Keda Scale To Zero'); + INSERT INTO global_config (key, config, "createdAt", "updatedAt", "deletedAt", description) VALUES ('kedaScaleToZero', '{"enabled":false,"type":"http","replicas":{"min":1,"max":3},"scaledownPeriod":10800,"maxRetries":10,"scalingMetric":{"requestRate":{"granularity":"1m","targetValue":30,"window":"1m"},"concurrency":{"targetValue":100}}}', now(), now(), null, 'This is the default configuration for Keda Scale To Zero'); INSERT INTO global_config (key, config, "createdAt", "updatedAt", "deletedAt", description) VALUES ('mongodb', '{"version":"3.7.2","args":"--force --timeout 60m0s --wait","action":"install","chart":{"name":"mongodb","repoUrl":"https://charts.bitnami.com/bitnami","version":"16.3.0","values":["auth.rootPassword=rootpassword","replicaCount=1","timeoutSeconds=20","periodSeconds=15","timeoutSeconds=20","periodSeconds=15","useStatefulSet=true"],"valueFiles":[]},"label":"labels","tolerations":"tolerations","affinity":"affinity","nodeSelector":"nodeSelector"}', now(), now(), null, 'MongoDB bitnami helm chart configuration default values.'); INSERT INTO global_config (key, config, "createdAt", "updatedAt", "deletedAt", description) VALUES ('serviceDefaults', '{"dockerfilePath":"Dockerfile","cpuRequest":"10m","memoryRequest":"100Mi","readinessInitialDelaySeconds":0,"readinessPeriodSeconds":10,"readinessTimeoutSeconds":1,"readinessSuccessThreshold":1,"readinessFailureThreshold":30,"readinessTcpSocketPort":8090,"readinessHttpGetPort":8080,"readinessHttpGetPath":"/__lbheartbeat__","acmARN":"replace_me","scaleToZero":false,"scaleToZeroMetricsCheckInterval":1800,"grpc":false,"defaultIPWhiteList":"{ 0.0.0.0/0 }"}', now(), now(), null, 'Default configuration for services for values that are not set in the configuration file'); INSERT INTO global_config (key, config, "createdAt", "updatedAt", "deletedAt", description) VALUES ('domainDefaults', '{"http":"app.local","grpc":"app-grpc.local"}', now(), now(), null, 'Default domain hostnames for the lifecycle deployments'); diff --git a/src/server/services/deploy.ts b/src/server/services/deploy.ts index eee5b222..553cae87 100644 --- a/src/server/services/deploy.ts +++ b/src/server/services/deploy.ts @@ -145,9 +145,8 @@ export default class DeployService extends BaseService { } } - if (deployable?.kedaScaleToZero?.type == 'http') { - const globalConfig = await GlobalConfigService.getInstance().getAllConfigs(); - const defaultKedaScaleToZero = globalConfig.kedaScaleToZero; + const { kedaScaleToZero: defaultKedaScaleToZero } = await GlobalConfigService.getInstance().getAllConfigs(); + if (deployable?.kedaScaleToZero?.type == 'http' && defaultKedaScaleToZero.enabled === true) { const deployableKedaScaleToZero = deployable?.kedaScaleToZero; const kedaScaleToZero = { @@ -158,10 +157,6 @@ export default class DeployService extends BaseService { await deploy.$query().patch({ kedaScaleToZero, }); - } else { - await deploy.$query().patch({ - kedaScaleToZero: null, - }); } }) ).catch((error) => { diff --git a/src/server/services/deployable.ts b/src/server/services/deployable.ts index a28fc3ab..6c091fae 100644 --- a/src/server/services/deployable.ts +++ b/src/server/services/deployable.ts @@ -290,7 +290,7 @@ export default class DeployableService extends BaseService { } } } - const { serviceDefaults, lifecycleDefaults, domainDefaults } = + const { serviceDefaults, lifecycleDefaults, domainDefaults, kedaScaleToZero } = await GlobalConfigService.getInstance().getAllConfigs(); //TODO check and throw error here? const defaultUUID = lifecycleDefaults.defaultUUID; @@ -371,7 +371,7 @@ export default class DeployableService extends BaseService { dependsOnDeployableName, helm: await YamlService.getHelmConfigFromYaml(service), deploymentDependsOn: service.deploymentDependsOn || [], - kedaScaleToZero: YamlService.getScaleToZeroConfig(service) ?? null, + kedaScaleToZero: kedaScaleToZero?.enabled ? YamlService.getScaleToZeroConfig(service) : null, builder: YamlService.getBuilder(service) ?? {}, }; } diff --git a/src/server/services/types/globalConfig.ts b/src/server/services/types/globalConfig.ts index 6c353dc8..6fb5a318 100644 --- a/src/server/services/types/globalConfig.ts +++ b/src/server/services/types/globalConfig.ts @@ -27,7 +27,7 @@ export type GlobalConfig = { publicChart: PublicChart; lifecycleIgnores: LifecycleIgnores; deletePendingHelmReleaseStep: DeletePendingHelmReleaseStep; - kedaScaleToZero: KedaScaleToZero; + kedaScaleToZero: KedaScaleToZero & { enabled: boolean }; serviceDefaults: Record; domainDefaults: DomainDefaults; orgChart: OrgChart; From 4407709cf3dd8e011bb7042896e70a193fce7411 Mon Sep 17 00:00:00 2001 From: Vigneshraj Sekar Babu Date: Mon, 8 Sep 2025 14:35:26 -0700 Subject: [PATCH 2/2] always patch keda config --- src/server/services/deploy.ts | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/server/services/deploy.ts b/src/server/services/deploy.ts index 553cae87..cb730574 100644 --- a/src/server/services/deploy.ts +++ b/src/server/services/deploy.ts @@ -146,18 +146,16 @@ export default class DeployService extends BaseService { } const { kedaScaleToZero: defaultKedaScaleToZero } = await GlobalConfigService.getInstance().getAllConfigs(); - if (deployable?.kedaScaleToZero?.type == 'http' && defaultKedaScaleToZero.enabled === true) { - const deployableKedaScaleToZero = deployable?.kedaScaleToZero; - const kedaScaleToZero = { - ...defaultKedaScaleToZero, - ...deployableKedaScaleToZero, - }; + const kedaScaleToZero = + deployable?.kedaScaleToZero?.type === 'http' && defaultKedaScaleToZero?.enabled + ? { + ...defaultKedaScaleToZero, + ...deployable.kedaScaleToZero, + } + : null; - await deploy.$query().patch({ - kedaScaleToZero, - }); - } + await deploy.$query().patch({ kedaScaleToZero }); }) ).catch((error) => { logger.error(`[BUILD ${build?.uuid}] Failed to create deploys from deployables: ${error}`);