From c363d49adb22e81325b3c92ca7b2757638c46835 Mon Sep 17 00:00:00 2001 From: Ivar Abrahamsen Date: Mon, 27 Jan 2025 12:13:36 +0000 Subject: [PATCH] Lookup non existant service in decom (#351) Decommission flag. Default to true for most decommissions. Remove Docker image feature now stable. No need to scale if already scaled. --- src/api/decommission-service/controller.js | 14 +++++- .../helpers/delete-docker-images.js | 14 +----- .../helpers/delete-docker-images.test.js | 48 ++----------------- .../controllers/deploy-terminal.js | 2 +- src/api/deploy/controllers/deploy-service.js | 2 +- .../controllers/existing-service-info.js | 2 +- .../helpers/delete-deployment-file.js | 5 +- .../helpers/delete-deployment-file.test.js | 10 +++- .../undeploy/helpers/delete-ecs-service.js | 7 ++- .../helpers/delete-ecs-service.test.js | 36 ++++++++++++-- src/api/undeploy/helpers/scale-ecs-to-zero.js | 5 ++ .../helpers/scale-ecs-to-zero.test.js | 12 +++++ .../undeploy-service-from-environment.js | 25 +++++----- .../undeploy-service-from-environment.test.js | 26 +++++----- src/config/config.js | 42 ++++++---------- src/helpers/feature-toggle/feature-toggles.js | 10 ++-- .../portal-backend}/lookup-tenant-service.js | 35 ++++++++++---- .../helpers/bulk-update-tf-svc-infra.js | 2 +- .../helpers/bulk-update-tf-svc-infra.test.js | 4 +- 19 files changed, 164 insertions(+), 137 deletions(-) rename src/{api/deploy/helpers => helpers/portal-backend}/lookup-tenant-service.js (73%) diff --git a/src/api/decommission-service/controller.js b/src/api/decommission-service/controller.js index b78c6628..0c98b1bb 100644 --- a/src/api/decommission-service/controller.js +++ b/src/api/decommission-service/controller.js @@ -3,9 +3,10 @@ import { removeStatus } from '~/src/api/status/helpers/remove-status.js' import { portalBackEndDecommissionService } from '~/src/api/decommission-service/helpers/decommission-portal-backend.js' import { triggerRemoveWorkflows } from '~/src/api/decommission-service/helpers/trigger-remove-workflows.js' import { getRepositoryInfo } from '~/src/helpers/portal-backend/get-repository-info.js' -import { undeployServiceFromAllEnvironments } from '~/src/api/undeploy/helpers/undeploy-service-from-all-environments.js' import { deleteDockerImages } from '~/src/api/decommission-service/helpers/delete-docker-images.js' import { triggerArchiveGithubWorkflow } from '~/src/api/decommission-service/helpers/archive-github-workflow.js' +import { featureToggles } from '~/src/helpers/feature-toggle/feature-toggles.js' +import { isFeatureEnabled } from '~/src/helpers/feature-toggle/is-feature-enabled.js' const decommissionServiceController = { options: { @@ -25,9 +26,18 @@ const decommissionServiceController = { const serviceName = request.params.serviceName const logger = request.logger const user = request.auth.credentials + + if (!isFeatureEnabled(featureToggles.decommissionService)) { + logger.info('Decommission service feature is disabled') + return h + .response({ + message: 'Decommission disabled' + }) + .code(409) + } + const response = await getRepositoryInfo(serviceName) - await undeployServiceFromAllEnvironments({ serviceName, user, logger }) await deleteDockerImages(serviceName, user, logger) await triggerRemoveWorkflows(serviceName, response.repository, logger) await portalBackEndDecommissionService(serviceName) diff --git a/src/api/decommission-service/helpers/delete-docker-images.js b/src/api/decommission-service/helpers/delete-docker-images.js index b3609ac3..264afdd0 100644 --- a/src/api/decommission-service/helpers/delete-docker-images.js +++ b/src/api/decommission-service/helpers/delete-docker-images.js @@ -1,7 +1,5 @@ import { deleteDockerHubImages } from '~/src/helpers/remove/workflows/delete-dockerhub-images.js' import { deleteEcrImages } from '~/src/helpers/remove/workflows/delete-ecr-images.js' -import { isFeatureEnabled } from '~/src/helpers/feature-toggle/is-feature-enabled.js' -import { featureToggles } from '~/src/helpers/feature-toggle/feature-toggles.js' /** * Delete docker images @@ -13,15 +11,7 @@ import { featureToggles } from '~/src/helpers/feature-toggle/feature-toggles.js' export async function deleteDockerImages(serviceName, user, logger) { logger.info(`Deleting docker images for service: ${serviceName}`) - if (isFeatureEnabled(featureToggles.dockerImages.deleteEcr)) { - await deleteEcrImages(serviceName, logger) - } else { - logger.info('Deleting ECR images feature is disabled') - } + await deleteEcrImages(serviceName, logger) - if (isFeatureEnabled(featureToggles.dockerImages.deleteDockerHub)) { - await deleteDockerHubImages(serviceName, logger) - } else { - logger.info('Deleting DockerHub images feature is disabled') - } + await deleteDockerHubImages(serviceName, logger) } diff --git a/src/api/decommission-service/helpers/delete-docker-images.test.js b/src/api/decommission-service/helpers/delete-docker-images.test.js index 110525ac..c547f433 100644 --- a/src/api/decommission-service/helpers/delete-docker-images.test.js +++ b/src/api/decommission-service/helpers/delete-docker-images.test.js @@ -1,61 +1,23 @@ import { deleteDockerHubImages } from '~/src/helpers/remove/workflows/delete-dockerhub-images.js' import { deleteEcrImages } from '~/src/helpers/remove/workflows/delete-ecr-images.js' -import { isFeatureEnabled } from '~/src/helpers/feature-toggle/is-feature-enabled.js' import { deleteDockerImages } from '~/src/api/decommission-service/helpers/delete-docker-images.js' -jest.mock('~/src/helpers/feature-toggle/is-feature-enabled', () => { - return { - isFeatureEnabled: jest.fn() - } -}) - -jest.mock('~/src/helpers/remove/workflows/delete-dockerhub-images', () => { - return { - deleteDockerHubImages: jest.fn() - } -}) - -jest.mock('~/src/helpers/remove/workflows/delete-ecr-images', () => { - return { - deleteEcrImages: jest.fn() - } -}) +jest.mock('~/src/helpers/remove/workflows/delete-dockerhub-images') +jest.mock('~/src/helpers/remove/workflows/delete-ecr-images') -const logger = { - info: jest.fn() -} +const logger = { info: jest.fn() } const serviceName = 'some-service' const user = { id: 'some-user-id', displayName: 'some-name' } describe('#deleteDockerImages', () => { - test('if not enabled should not call delete ECR images', async () => { - isFeatureEnabled.mockReturnValue(false) - - await deleteDockerImages(serviceName, user, logger) - - expect(deleteEcrImages).toHaveBeenCalledTimes(0) - }) - - test('if enabled should call delete ECR images', async () => { - isFeatureEnabled.mockReturnValueOnce(true).mockReturnValue(false) - + test('should call delete ECR images', async () => { await deleteDockerImages(serviceName, user, logger) expect(deleteEcrImages).toHaveBeenCalledTimes(1) expect(deleteEcrImages).toHaveBeenCalledWith(serviceName, logger) }) - test('if not enabled should not call delete DockerHub images', async () => { - isFeatureEnabled.mockReturnValue(false) - - await deleteDockerImages(serviceName, user, logger) - - expect(deleteDockerHubImages).toHaveBeenCalledTimes(0) - }) - - test('if enabled should call delete DockerHub images', async () => { - isFeatureEnabled.mockReturnValueOnce(false).mockReturnValue(true) - + test('should call delete DockerHub images', async () => { await deleteDockerImages(serviceName, user, logger) expect(deleteDockerHubImages).toHaveBeenCalledTimes(1) diff --git a/src/api/deploy-terminal/controllers/deploy-terminal.js b/src/api/deploy-terminal/controllers/deploy-terminal.js index e8c4ec21..4066d182 100644 --- a/src/api/deploy-terminal/controllers/deploy-terminal.js +++ b/src/api/deploy-terminal/controllers/deploy-terminal.js @@ -6,7 +6,7 @@ import { sendSnsMessage } from '~/src/helpers/sns/send-sns-message.js' import { canRunTerminalInEnvironment } from '~/src/api/deploy-terminal/helpers/can-run-terminal-in-environment.js' import { generateTerminalToken } from '~/src/api/deploy-terminal/helpers/generate-terminal-token.js' import { deployTerminalPayload } from '~/src/api/deploy-terminal/helpers/deploy-terminal-payload.js' -import { lookupTenantService } from '~/src/api/deploy/helpers/lookup-tenant-service.js' +import { lookupTenantService } from '~/src/helpers/portal-backend/lookup-tenant-service.js' const deployTerminalController = { options: { diff --git a/src/api/deploy/controllers/deploy-service.js b/src/api/deploy/controllers/deploy-service.js index fa036f50..0d112e14 100644 --- a/src/api/deploy/controllers/deploy-service.js +++ b/src/api/deploy/controllers/deploy-service.js @@ -7,7 +7,7 @@ import { getRepoTeams } from '~/src/api/deploy/helpers/get-repo-teams.js' import { sendSnsDeploymentMessage } from '~/src/api/deploy/helpers/send-sns-deployment-message.js' import { generateDeployment } from '~/src/helpers/deployments/generate-deployment.js' import { commitDeploymentFile } from '~/src/helpers/deployments/commit-deployment-file.js' -import { lookupTenantService } from '~/src/api/deploy/helpers/lookup-tenant-service.js' +import { lookupTenantService } from '~/src/helpers/portal-backend/lookup-tenant-service.js' import { getLatestAppConfigCommitSha } from '~/src/helpers/portal-backend/get-latest-app-config-commit-sha.js' const deployFromFileEnvironments = config.get('deployFromFileEnvironments') diff --git a/src/api/deploy/controllers/existing-service-info.js b/src/api/deploy/controllers/existing-service-info.js index 598a9791..2548931b 100644 --- a/src/api/deploy/controllers/existing-service-info.js +++ b/src/api/deploy/controllers/existing-service-info.js @@ -1,5 +1,5 @@ import { config } from '~/src/config/index.js' -import { lookupTenantService } from '~/src/api/deploy/helpers/lookup-tenant-service.js' +import { lookupTenantService } from '~/src/helpers/portal-backend/lookup-tenant-service.js' import { getExistingDeployment } from '~/src/api/deploy/helpers/get-existing-deployment.js' const deploymentRepo = config.get('github.repos.appDeployments') diff --git a/src/api/undeploy/helpers/delete-deployment-file.js b/src/api/undeploy/helpers/delete-deployment-file.js index aa89b8d6..cd0e99af 100644 --- a/src/api/undeploy/helpers/delete-deployment-file.js +++ b/src/api/undeploy/helpers/delete-deployment-file.js @@ -12,7 +12,10 @@ export async function deleteDeploymentFiles({ }) { logger.info(`Deleting deployment files for ${serviceName}`) - if (!isFeatureEnabled(featureToggles.undeploy.deleteDeploymentFiles)) { + if ( + !isFeatureEnabled(featureToggles.decommissionService) || + !isFeatureEnabled(featureToggles.undeploy.deleteDeploymentFiles) + ) { logger.info('Deleting deployment file feature is disabled') return } diff --git a/src/api/undeploy/helpers/delete-deployment-file.test.js b/src/api/undeploy/helpers/delete-deployment-file.test.js index 4c9317eb..5d1bf770 100644 --- a/src/api/undeploy/helpers/delete-deployment-file.test.js +++ b/src/api/undeploy/helpers/delete-deployment-file.test.js @@ -21,8 +21,16 @@ describe('#deleteDeploymentFiles', () => { expect(removeDeployment).toHaveBeenCalledWith(serviceName, logger) }) + test('should not delete deployment file if decommission is disabled', async () => { + isFeatureEnabled.mockReturnValueOnce(false).mockReturnValue(true) + + await deleteDeploymentFiles({ serviceName, logger }) + + expect(removeDeployment).toHaveBeenCalledTimes(0) + }) + test('should not delete deployment file if feature disabled', async () => { - isFeatureEnabled.mockReturnValue(false) + isFeatureEnabled.mockReturnValueOnce(true).mockReturnValue(false) await deleteDeploymentFiles({ serviceName, logger }) diff --git a/src/api/undeploy/helpers/delete-ecs-service.js b/src/api/undeploy/helpers/delete-ecs-service.js index 109e8231..cdc5e221 100644 --- a/src/api/undeploy/helpers/delete-ecs-service.js +++ b/src/api/undeploy/helpers/delete-ecs-service.js @@ -1,6 +1,6 @@ import { createLogger } from '~/src/helpers/logging/logger.js' import { orderedEnvironments } from '~/src/config/environments.js' -import { lookupTenantService } from '~/src/api/deploy/helpers/lookup-tenant-service.js' +import { lookupTenantService } from '~/src/helpers/portal-backend/lookup-tenant-service.js' import { featureToggles } from '~/src/helpers/feature-toggle/feature-toggles.js' import { isFeatureEnabled } from '~/src/helpers/feature-toggle/is-feature-enabled.js' import { removeEcsService } from '~/src/helpers/remove/workflows/remove-ecs-service.js' @@ -15,7 +15,10 @@ async function deleteEcsService({ }) { logger.info(`Deleting ECS service for ${serviceName} in env ${environment}`) - if (!isFeatureEnabled(featureToggles.undeploy.deleteEcsService)) { + if ( + !isFeatureEnabled(featureToggles.decommissionService) || + !isFeatureEnabled(featureToggles.undeploy.deleteEcsService) + ) { logger.info('Deleting ECS service feature is disabled') return } diff --git a/src/api/undeploy/helpers/delete-ecs-service.test.js b/src/api/undeploy/helpers/delete-ecs-service.test.js index bc89fe07..d2f740cf 100644 --- a/src/api/undeploy/helpers/delete-ecs-service.test.js +++ b/src/api/undeploy/helpers/delete-ecs-service.test.js @@ -2,12 +2,12 @@ import { deleteEcsService, deleteAllEcsServices } from '~/src/api/undeploy/helpers/delete-ecs-service.js' -import { lookupTenantService } from '~/src/api/deploy/helpers/lookup-tenant-service.js' +import { lookupTenantService } from '~/src/helpers/portal-backend/lookup-tenant-service.js' import { isFeatureEnabled } from '~/src/helpers/feature-toggle/is-feature-enabled.js' import { removeEcsService } from '~/src/helpers/remove/workflows/remove-ecs-service.js' import { featureToggles } from '~/src/helpers/feature-toggle/feature-toggles.js' -jest.mock('~/src/api/deploy/helpers/lookup-tenant-service') +jest.mock('~/src/helpers/portal-backend/lookup-tenant-service') jest.mock('~/src/helpers/feature-toggle/is-feature-enabled') jest.mock('~/src/helpers/remove/workflows/remove-ecs-service') @@ -37,7 +37,37 @@ describe('#deleteEcsService', () => { ) }) - test('should not remove ECS service if feature disabled', async () => { + test('should not remove ECS service if decommission is enabled but feature is disabled', async () => { + isFeatureEnabled.mockReturnValueOnce(true).mockReturnValue(false) + + await deleteEcsService({ serviceName, environment, logger }) + + expect(isFeatureEnabled).toHaveBeenCalledTimes(2) + expect(isFeatureEnabled).toHaveBeenNthCalledWith( + 1, + featureToggles.decommissionService + ) + expect(isFeatureEnabled).toHaveBeenLastCalledWith( + featureToggles.undeploy.deleteEcsService + ) + expect(lookupTenantService).toHaveBeenCalledTimes(0) + expect(removeEcsService).toHaveBeenCalledTimes(0) + }) + + test('should not remove ECS service if decommission feature is disabled', async () => { + isFeatureEnabled.mockReturnValueOnce(false).mockReturnValue(true) + + await deleteEcsService({ serviceName, environment, logger }) + + expect(isFeatureEnabled).toHaveBeenCalledTimes(1) + expect(isFeatureEnabled).toHaveBeenLastCalledWith( + featureToggles.decommissionService + ) + expect(lookupTenantService).toHaveBeenCalledTimes(0) + expect(removeEcsService).toHaveBeenCalledTimes(0) + }) + + test('should not remove ECS service if both features are disabled', async () => { isFeatureEnabled.mockReturnValue(false) await deleteEcsService({ serviceName, environment, logger }) diff --git a/src/api/undeploy/helpers/scale-ecs-to-zero.js b/src/api/undeploy/helpers/scale-ecs-to-zero.js index 4f584bbd..8a78be88 100644 --- a/src/api/undeploy/helpers/scale-ecs-to-zero.js +++ b/src/api/undeploy/helpers/scale-ecs-to-zero.js @@ -27,6 +27,11 @@ export async function scaleEcsToZero({ return } + if (runningDetails.instanceCount === 0) { + logger.info('ECS Service already scaled to 0') + return + } + const deployment = transformRunningDetailsToDeployment(runningDetails, zone) const undeployment = scaleDeploymentToZeroInstances({ deployment, diff --git a/src/api/undeploy/helpers/scale-ecs-to-zero.test.js b/src/api/undeploy/helpers/scale-ecs-to-zero.test.js index ae256b97..d7686ded 100644 --- a/src/api/undeploy/helpers/scale-ecs-to-zero.test.js +++ b/src/api/undeploy/helpers/scale-ecs-to-zero.test.js @@ -51,6 +51,18 @@ describe('#scaleEcsToZero', () => { expect(commitDeploymentFile).toHaveBeenCalledTimes(0) }) + test('If existing deployment is already scaled to 0 do nothing', async () => { + findRunningDetails.mockReturnValue({ + ...runningDetails, + instanceCount: 0 + }) + + await scaleEcsToZero(scaleDetails) + + expect(findRunningDetails).toHaveBeenCalledTimes(1) + expect(commitDeploymentFile).toHaveBeenCalledTimes(0) + }) + test('With existing deployment should proceed with scale to 0', async () => { findRunningDetails.mockReturnValue(runningDetails) diff --git a/src/api/undeploy/helpers/undeploy-service-from-environment.js b/src/api/undeploy/helpers/undeploy-service-from-environment.js index 26f14bf4..8479c8f9 100644 --- a/src/api/undeploy/helpers/undeploy-service-from-environment.js +++ b/src/api/undeploy/helpers/undeploy-service-from-environment.js @@ -1,7 +1,7 @@ import { config } from '~/src/config/index.js' import { registerUndeployment } from '~/src/api/undeploy/helpers/register-undeployment.js' import { scaleEcsToZero } from '~/src/api/undeploy/helpers/scale-ecs-to-zero.js' -import { lookupTenantService } from '~/src/api/deploy/helpers/lookup-tenant-service.js' +import { lookupServiceInEnvironment } from '~/src/helpers/portal-backend/lookup-tenant-service.js' import { isFeatureEnabled } from '~/src/helpers/feature-toggle/is-feature-enabled.js' import { featureToggles } from '~/src/helpers/feature-toggle/feature-toggles.js' import { createLogger } from '~/src/helpers/logging/logger.js' @@ -30,23 +30,18 @@ export async function undeployServiceFromEnvironment({ return undeploymentId } - const service = await lookupTenantService(serviceName, environment, logger) + const zone = await lookupZone(serviceName, environment) - if (!service) { + if (!zone) { logger.warn( `Unable to find deployment zone for [${serviceName}] in environment [${environment}].` ) return } - if (isFeatureEnabled(featureToggles.undeploy.register)) { - await registerUndeployment(serviceName, environment, user, undeploymentId) - logger.info('Undeployment registered') - } else { - logger.info('Undeployment registration feature is disabled') - } + await registerUndeployment(serviceName, environment, user, undeploymentId) - if (isFeatureEnabled(featureToggles.undeploy.scaleEcsToZero)) { + if (isFeatureEnabled(featureToggles.scaleEcsToZero)) { const shouldDeployByFile = deployFromFileEnvironments.includes(environment) if (!shouldDeployByFile) { logger.warn( @@ -56,7 +51,7 @@ export async function undeployServiceFromEnvironment({ await scaleEcsToZero({ serviceName, environment, - zone: service.zone, + zone, user, undeploymentId, logger @@ -67,3 +62,11 @@ export async function undeployServiceFromEnvironment({ } return undeploymentId } + +async function lookupZone(serviceName, environment) { + const { serviceJson } = await lookupServiceInEnvironment( + serviceName, + environment + ) + return serviceJson?.zone +} diff --git a/src/api/undeploy/helpers/undeploy-service-from-environment.test.js b/src/api/undeploy/helpers/undeploy-service-from-environment.test.js index db59eb2a..8c5a34a5 100644 --- a/src/api/undeploy/helpers/undeploy-service-from-environment.test.js +++ b/src/api/undeploy/helpers/undeploy-service-from-environment.test.js @@ -1,6 +1,7 @@ import { registerUndeployment } from '~/src/api/undeploy/helpers/register-undeployment.js' import { scaleEcsToZero } from '~/src/api/undeploy/helpers/scale-ecs-to-zero.js' -import { lookupTenantService } from '~/src/api/deploy/helpers/lookup-tenant-service.js' +import { lookupServiceInEnvironment } from '~/src/helpers/portal-backend/lookup-tenant-service.js' +import { featureToggles } from '~/src/helpers/feature-toggle/feature-toggles.js' import { isFeatureEnabled } from '~/src/helpers/feature-toggle/is-feature-enabled.js' import { getRepositoryInfo } from '~/src/helpers/portal-backend/get-repository-info.js' import { undeployServiceFromEnvironment } from '~/src/api/undeploy/helpers/undeploy-service-from-environment.js' @@ -8,13 +9,15 @@ import { undeployServiceFromEnvironment } from '~/src/api/undeploy/helpers/undep jest.mock('~/src/helpers/feature-toggle/is-feature-enabled') jest.mock('~/src/api/undeploy/helpers/register-undeployment') jest.mock('~/src/api/undeploy/helpers/scale-ecs-to-zero') -jest.mock('~/src/api/deploy/helpers/lookup-tenant-service') +jest.mock('~/src/helpers/portal-backend/lookup-tenant-service') jest.mock('~/src/helpers/portal-backend/get-repository-info') const logger = { info: jest.fn(), warn: jest.fn() } registerUndeployment.mockResolvedValue() scaleEcsToZero.mockResolvedValue() -lookupTenantService.mockResolvedValue({ zone: 'some-zone' }) +lookupServiceInEnvironment.mockResolvedValue({ + serviceJson: { zone: 'some-zone' } +}) getRepositoryInfo.mockResolvedValue({ repository: { topics: [] } }) const undeploymentId = crypto.randomUUID() @@ -35,15 +38,7 @@ async function callUndeployServiceFromEnvironment() { } describe('#undeployServiceFromEnvironment', () => { - test('if not enabled should not call undeploy registration', async () => { - isFeatureEnabled.mockReturnValueOnce(false).mockReturnValue(true) - - await callUndeployServiceFromEnvironment() - - expect(registerUndeployment).toHaveBeenCalledTimes(0) - }) - - test('if enabled should call undeploy registration', async () => { + test('should register undeployment', async () => { isFeatureEnabled.mockReturnValue(true) await callUndeployServiceFromEnvironment() @@ -56,6 +51,9 @@ describe('#undeployServiceFromEnvironment', () => { await callUndeployServiceFromEnvironment() + expect(isFeatureEnabled).toHaveBeenLastCalledWith( + featureToggles.scaleEcsToZero + ) expect(scaleEcsToZero).toHaveBeenCalledTimes(0) }) @@ -64,6 +62,8 @@ describe('#undeployServiceFromEnvironment', () => { await callUndeployServiceFromEnvironment() + expect(isFeatureEnabled).toHaveBeenCalledWith(featureToggles.scaleEcsToZero) + expect(lookupServiceInEnvironment).toHaveBeenCalledTimes(1) expect(scaleEcsToZero).toHaveBeenCalledTimes(1) expect(scaleEcsToZero).toHaveBeenCalledWith({ serviceName, @@ -83,7 +83,7 @@ describe('#undeployServiceFromEnvironment', () => { await callUndeployServiceFromEnvironment() expect(getRepositoryInfo).toHaveBeenCalledTimes(1) - expect(lookupTenantService).toHaveBeenCalledTimes(0) + expect(lookupServiceInEnvironment).toHaveBeenCalledTimes(0) expect(registerUndeployment).toHaveBeenCalledTimes(0) expect(scaleEcsToZero).toHaveBeenCalledTimes(0) }) diff --git a/src/config/config.js b/src/config/config.js index feadd317..68caade4 100644 --- a/src/config/config.js +++ b/src/config/config.js @@ -479,6 +479,18 @@ const config = convict({ env: 'ENABLE_SECURE_CONTEXT' }, features: { + decommissionService: { + doc: 'Feature flag for decommission service', + format: Boolean, + default: true, + env: 'FEATURE_DECOMMISSION_SERVICE' + }, + scaleEcsToZero: { + doc: 'Feature flag for scaling ECS instances to 0', + format: Boolean, + default: true, + env: 'FEATURE_SCALE_ECS_TO_0' + }, undeploy: { deleteDeploymentFiles: { doc: 'Feature flag for deleting deployment files', @@ -491,44 +503,18 @@ const config = convict({ format: Boolean, default: false, env: 'FEATURE_DELETE_ECS_SERVICE' - }, - register: { - doc: 'Feature flag for register undeploy', - format: Boolean, - default: false, - env: 'FEATURE_UNDEPLOY_REGISTER' - }, - scaleEcsToZero: { - doc: 'Feature flag for scaling ECS instances to 0', - format: Boolean, - default: false, - env: 'FEATURE_SCALE_ECS_TO_0' - } - }, - dockerImages: { - deleteEcr: { - doc: 'Feature flag for deleting ECR images', - format: Boolean, - default: false, - env: 'FEATURE_DELETE_ECR_IMAGES' - }, - deleteDockerHub: { - doc: 'Feature flag for deleting DockerHub images', - format: Boolean, - default: false, - env: 'FEATURE_DELETE_DOCKERHUB_IMAGES' } }, removeServiceWorkflows: { doc: 'Feature flag for removing a service workflows', format: Boolean, - default: false, + default: true, env: 'FEATURE_REMOVE_SERVICE_WORKFLOWS' }, archiveGitHubWorkflow: { doc: 'Feature flag for archiving github repo on decommission', format: Boolean, - default: false, + default: true, env: 'FEATURE_ARCHIVE_GITHUB_WORKFLOW' } } diff --git a/src/helpers/feature-toggle/feature-toggles.js b/src/helpers/feature-toggle/feature-toggles.js index c0096c5f..de6e5303 100644 --- a/src/helpers/feature-toggle/feature-toggles.js +++ b/src/helpers/feature-toggle/feature-toggles.js @@ -1,14 +1,10 @@ export const featureToggles = { + decommissionService: 'decommissionService', archiveGitHubWorkflow: 'archiveGitHubWorkflow', - dockerImages: { - deleteEcr: 'dockerImages.deleteEcr', - deleteDockerHub: 'dockerImages.deleteDockerHub' - }, removeServiceWorkflows: 'removeServiceWorkflows', + scaleEcsToZero: 'scaleEcsToZero', undeploy: { deleteDeploymentFiles: 'undeploy.deleteDeploymentFiles', - deleteEcsService: 'undeploy.deleteEcsService', - register: 'undeploy.register', - scaleEcsToZero: 'undeploy.scaleEcsToZero' + deleteEcsService: 'undeploy.deleteEcsService' } } diff --git a/src/api/deploy/helpers/lookup-tenant-service.js b/src/helpers/portal-backend/lookup-tenant-service.js similarity index 73% rename from src/api/deploy/helpers/lookup-tenant-service.js rename to src/helpers/portal-backend/lookup-tenant-service.js index 39371a56..5cdb74f0 100644 --- a/src/api/deploy/helpers/lookup-tenant-service.js +++ b/src/helpers/portal-backend/lookup-tenant-service.js @@ -53,18 +53,37 @@ async function lookupTenantServiceFromGitHub( * @returns {Promise} */ async function lookupTenantService(service, environment, logger) { + const { response, serviceJson } = await lookupServiceInEnvironment( + service, + environment + ) + if (response.ok) { + return serviceJson + } + logger.error(`Service lookup failed: ${serviceJson.message}`) + throw Boom.boomify(new Error(serviceJson.message), { + statusCode: response.status + }) +} + +/** + * Get service from portal-backend + * @param {string} service + * @param {string} environment + * @returns {Promise} + */ +async function lookupServiceInEnvironment(service, environment) { const url = `${config.get('portalBackendUrl')}/tenant-services/${service}/${environment}` const response = await fetcher(url, { method: 'get', headers: { 'Content-Type': 'application/json' } }) - const json = await response.json() - - if (response.ok) { - return json - } - logger.error(`Service lookup failed: ${json.message}`) - throw Boom.boomify(new Error(json.message), { statusCode: response.status }) + const serviceJson = await response.json() + return { response, serviceJson } } -export { lookupTenantService, lookupTenantServiceFromGitHub } +export { + lookupServiceInEnvironment, + lookupTenantService, + lookupTenantServiceFromGitHub +} diff --git a/src/listeners/github/helpers/bulk-update-tf-svc-infra.js b/src/listeners/github/helpers/bulk-update-tf-svc-infra.js index e422d42c..ab8c127a 100644 --- a/src/listeners/github/helpers/bulk-update-tf-svc-infra.js +++ b/src/listeners/github/helpers/bulk-update-tf-svc-infra.js @@ -6,7 +6,7 @@ import { import { updateOverallStatus } from '~/src/helpers/create/init-creation-status.js' import { createPlaceholderArtifact } from '~/src/listeners/github/helpers/create-placeholder-artifact.js' import { createLogger } from '~/src/helpers/logging/logger.js' -import { lookupTenantServiceFromGitHub } from '~/src/api/deploy/helpers/lookup-tenant-service.js' +import { lookupTenantServiceFromGitHub } from '~/src/helpers/portal-backend/lookup-tenant-service.js' /** * given a list of services, update the tf-svc-infra status for all of them to success diff --git a/src/listeners/github/helpers/bulk-update-tf-svc-infra.test.js b/src/listeners/github/helpers/bulk-update-tf-svc-infra.test.js index d4a1afb0..7a0ae1c0 100644 --- a/src/listeners/github/helpers/bulk-update-tf-svc-infra.test.js +++ b/src/listeners/github/helpers/bulk-update-tf-svc-infra.test.js @@ -5,7 +5,7 @@ import { } from '~/src/listeners/github/status-repo.js' import { createPlaceholderArtifact } from '~/src/listeners/github/helpers/create-placeholder-artifact.js' -import { lookupTenantServiceFromGitHub } from '~/src/api/deploy/helpers/lookup-tenant-service.js' +import { lookupTenantServiceFromGitHub } from '~/src/helpers/portal-backend/lookup-tenant-service.js' import { updateOverallStatus } from '~/src/helpers/create/init-creation-status.js' import { statuses } from '~/src/constants/statuses.js' @@ -17,7 +17,7 @@ jest.mock('~/src/listeners/github/helpers/create-placeholder-artifact', () => ({ createPlaceholderArtifact: jest.fn() })) -jest.mock('~/src/api/deploy/helpers/lookup-tenant-service', () => ({ +jest.mock('~/src/helpers/portal-backend/lookup-tenant-service', () => ({ lookupTenantServiceFromGitHub: jest.fn() }))