From 5a708ee931b8da935b201bd23b87d3d79e1b4609 Mon Sep 17 00:00:00 2001 From: Tuan Dang Date: Wed, 26 Jul 2023 23:10:38 +0700 Subject: [PATCH] Optimize Terraform Cloud sync function --- backend/src/integrations/sync.ts | 44 +++++++++++-------- .../terraform-cloud/authorize.tsx | 2 +- .../integrations/terraform-cloud/create.tsx | 12 ++--- 3 files changed, 33 insertions(+), 25 deletions(-) diff --git a/backend/src/integrations/sync.ts b/backend/src/integrations/sync.ts index 49dbea8bb..41a71fe73 100644 --- a/backend/src/integrations/sync.ts +++ b/backend/src/integrations/sync.ts @@ -1816,7 +1816,7 @@ const syncSecretsCheckly = async ({ }; /** - * Sync/push [secrets] to Terraform Cloud projects with id [integration.appId] + * Sync/push [secrets] to Terraform Cloud project with id [integration.appId] * @param {Object} obj * @param {IIntegration} obj.integration - integration details * @param {Object} obj.secrets - secrets to push to integration (object where keys are secret keys and values are secret values) @@ -1831,7 +1831,6 @@ const syncSecretsTerraformCloud = async ({ secrets: any; accessToken: string; }) => { - // get secrets from Terraform Cloud const getSecretsRes = ( await standardRequest.get(`${INTEGRATION_TERRAFORM_CLOUD_API_URL}/api/v2/workspaces/${integration.appId}/vars`, @@ -1841,13 +1840,19 @@ const syncSecretsTerraformCloud = async ({ Accept: "application/json", }, } - )).data.data; - + )) + .data + .data + .reduce((obj: any, secret: any) => ({ + ...obj, + [secret.attributes.key]: secret + }), {}); + // create or update secrets on Terraform Cloud for await (const key of Object.keys(secrets)) { - const existingSecret = getSecretsRes.find((sec: any) => sec.attributes.key == key); - - if (!existingSecret) { + if (!(key in getSecretsRes)) { + // case: secret does not exist in Terraform Cloud + // -> add secret await standardRequest.post( `${INTEGRATION_TERRAFORM_CLOUD_API_URL}/api/v2/workspaces/${integration.appId}/vars`, { @@ -1867,19 +1872,20 @@ const syncSecretsTerraformCloud = async ({ Accept: "application/vnd.api+json", }, } - ) + ); } else { - if (secrets[key] !== existingSecret.attributes.value) { - + // case: secret exists in Terraform Cloud + if (secrets[key] !== getSecretsRes[key].attributes.value) { + // -> update secret await standardRequest.patch( - `${INTEGRATION_TERRAFORM_CLOUD_API_URL}/api/v2/workspaces/${integration.appId}/vars/${existingSecret.id}`, + `${INTEGRATION_TERRAFORM_CLOUD_API_URL}/api/v2/workspaces/${integration.appId}/vars/${getSecretsRes[key].id}`, { data: { type: "vars", - id: existingSecret.id, + id: getSecretsRes[key].id, attributes: { - ...existingSecret, - value: secrets[existingSecret.attributes.key], + ...getSecretsRes[key], + value: secrets[key] }, }, }, @@ -1890,15 +1896,15 @@ const syncSecretsTerraformCloud = async ({ Accept: "application/vnd.api+json", }, } - ) + ); } } } - // delete secrets from Terraform Cloud - for await (const sec of getSecretsRes) { - if (!(sec.attributes.key in secrets)) { - await standardRequest.delete(`${INTEGRATION_TERRAFORM_CLOUD_API_URL}/api/v2/workspaces/${integration.appId}/vars/${sec.id}`, { + for await (const key of Object.keys(getSecretsRes)) { + if (!(key in secrets)) { + // case: delete secret + await standardRequest.delete(`${INTEGRATION_TERRAFORM_CLOUD_API_URL}/api/v2/workspaces/${integration.appId}/vars/${getSecretsRes[key].id}`, { headers: { Authorization: `Bearer ${accessToken}`, "Content-Type": "application/vnd.api+json", diff --git a/frontend/src/pages/integrations/terraform-cloud/authorize.tsx b/frontend/src/pages/integrations/terraform-cloud/authorize.tsx index 91608a406..c569bdcca 100644 --- a/frontend/src/pages/integrations/terraform-cloud/authorize.tsx +++ b/frontend/src/pages/integrations/terraform-cloud/authorize.tsx @@ -58,7 +58,7 @@ export default function TerraformCloudCreateIntegrationPage() { setApiKey(e.target.value)} /> diff --git a/frontend/src/pages/integrations/terraform-cloud/create.tsx b/frontend/src/pages/integrations/terraform-cloud/create.tsx index 9e3c51804..47c33948c 100644 --- a/frontend/src/pages/integrations/terraform-cloud/create.tsx +++ b/frontend/src/pages/integrations/terraform-cloud/create.tsx @@ -18,6 +18,11 @@ import { import { useGetWorkspaceById } from "../../../hooks/api/workspace"; import createIntegration from "../../api/integrations/createIntegration"; +const variableTypes = [ + { name: "env" }, + { name: "terraform" } +]; + export default function TerraformCloudCreateIntegrationPage() { const router = useRouter(); @@ -39,6 +44,7 @@ export default function TerraformCloudCreateIntegrationPage() { useEffect(() => { if (workspace) { setSelectedSourceEnvironment(workspace.environments[0].slug); + setVariableType(variableTypes[0].name); } }, [workspace]); @@ -90,10 +96,6 @@ export default function TerraformCloudCreateIntegrationPage() { } }; - const variableTypes = [ - { name: "env" }, - { name: "terraform" } - ] return integrationAuth && workspace && @@ -126,7 +128,7 @@ export default function TerraformCloudCreateIntegrationPage() { placeholder="Provide a path, default is /" /> -