Terraform Cloud Secret Sync Integration

This commit is contained in:
carlosmonastyrski
2025-04-04 09:54:53 -03:00
parent f00a54ed54
commit 4d41513abf
17 changed files with 212 additions and 113 deletions
@@ -38,6 +38,12 @@ import {
THumanitecConnectionInput,
TValidateHumanitecConnectionCredentials
} from "./humanitec";
import {
TTerraformCloudConnection,
TTerraformCloudConnectionConfig,
TTerraformCloudConnectionInput,
TValidateTerraformCloudConnectionCredentials
} from "./terraform-cloud";
export type TAppConnection = { id: string } & (
| TAwsConnection
@@ -47,6 +53,7 @@ export type TAppConnection = { id: string } & (
| TAzureAppConfigurationConnection
| TDatabricksConnection
| THumanitecConnection
| TTerraformCloudConnection
);
export type TAppConnectionInput = { id: string } & (
@@ -57,6 +64,7 @@ export type TAppConnectionInput = { id: string } & (
| TAzureAppConfigurationConnectionInput
| TDatabricksConnectionInput
| THumanitecConnectionInput
| TTerraformCloudConnectionInput
);
export type TCreateAppConnectionDTO = Pick<
@@ -75,7 +83,8 @@ export type TAppConnectionConfig =
| TAzureKeyVaultConnectionConfig
| TAzureAppConfigurationConnectionConfig
| TDatabricksConnectionConfig
| THumanitecConnectionConfig;
| THumanitecConnectionConfig
| TTerraformCloudConnectionConfig;
export type TValidateAppConnectionCredentials =
| TValidateAwsConnectionCredentials
@@ -84,7 +93,8 @@ export type TValidateAppConnectionCredentials =
| TValidateAzureKeyVaultConnectionCredentials
| TValidateAzureAppConfigurationConnectionCredentials
| TValidateDatabricksConnectionCredentials
| TValidateHumanitecConnectionCredentials;
| TValidateHumanitecConnectionCredentials
| TValidateTerraformCloudConnectionCredentials;
export type TListAwsConnectionKmsKeys = {
connectionId: string;
@@ -10,7 +10,7 @@ import {
TTerraformCloudConnection,
TTerraformCloudConnectionConfig,
TTerraformCloudOrganization,
TTerraformCloudProject,
TTerraformCloudVariableSet,
TTerraformCloudWorkspace
} from "./terraform-cloud-connection-types";
@@ -81,12 +81,12 @@ export const listOrganizations = async (
}
const orgEntities = orgsResponse.data.data;
const orgsWithProjectsAndWorkspaces: TTerraformCloudOrganization[] = [];
const orgsWithVariableSetsAndWorkspaces: TTerraformCloudOrganization[] = [];
const projectPromises = orgEntities.map((org) =>
const variableSetPromises = orgEntities.map((org) =>
request
.get<{ data: { id: string; attributes: { name: string } }[] }>(
`${IntegrationUrls.TERRAFORM_CLOUD_API_URL}/api/v2/organizations/${org.id}/projects`,
.get<{ data: { id: string; attributes: { name: string; description?: string; global?: boolean } }[] }>(
`${IntegrationUrls.TERRAFORM_CLOUD_API_URL}/api/v2/organizations/${org.id}/varsets`,
{
headers: {
Authorization: `Bearer ${apiToken}`,
@@ -111,19 +111,21 @@ export const listOrganizations = async (
.catch(() => ({ data: { data: [] } }))
);
const [projectResponses, workspaceResponses] = await Promise.all([
Promise.all(projectPromises),
const [variableSetResponses, workspaceResponses] = await Promise.all([
Promise.all(variableSetPromises),
Promise.all(workspacePromises)
]);
for (let i = 0; i < orgEntities.length; i += 1) {
const org = orgEntities[i];
const projectsData = projectResponses[i].data?.data || [];
const variableSetsData = variableSetResponses[i].data?.data || [];
const workspacesData = workspaceResponses[i].data?.data || [];
const projects: TTerraformCloudProject[] = projectsData.map((project) => ({
id: project.id,
name: project.attributes.name
const variableSets: TTerraformCloudVariableSet[] = variableSetsData.map((varSet) => ({
id: varSet.id,
name: varSet.attributes.name,
description: varSet.attributes.description,
global: varSet.attributes.global
}));
const workspaces: TTerraformCloudWorkspace[] = workspacesData.map((workspace) => ({
@@ -131,13 +133,13 @@ export const listOrganizations = async (
name: workspace.attributes.name
}));
orgsWithProjectsAndWorkspaces.push({
orgsWithVariableSetsAndWorkspaces.push({
id: org.id,
name: org.attributes.name,
projects,
variableSets,
workspaces
});
}
return orgsWithProjectsAndWorkspaces;
return orgsWithVariableSetsAndWorkspaces;
};
@@ -39,9 +39,11 @@ export type TerraformCloudOrgWithApps = TerraformCloudOrg & {
apps: TerraformCloudApp[];
};
export type TTerraformCloudProject = {
export type TTerraformCloudVariableSet = {
id: string;
name: string;
description?: string;
global?: boolean;
};
export type TTerraformCloudWorkspace = {
@@ -52,15 +54,15 @@ export type TTerraformCloudWorkspace = {
export type TTerraformCloudOrganization = {
id: string;
name: string;
projects: TTerraformCloudProject[];
variableSets: TTerraformCloudVariableSet[];
workspaces: TTerraformCloudWorkspace[];
};
export type TTerraformCloudConnectionOrganization = TTerraformCloudOrganization;
export type TTerraformCloudConnectionProject = TTerraformCloudProject;
export type TTerraformCloudConnectionVariableSet = TTerraformCloudVariableSet;
export type TTerraformCloudConnectionWorkspace = TTerraformCloudWorkspace;
export enum TerraformCloudSyncScope {
Project = "project",
VariableSet = "variableSet",
Workspace = "workspace"
}