Skip to content

Commit c1e3693

Browse files
feat: [IAC-613]: IACM env/tf vars are now in individual plugin vars to support secrets (#48417)
1 parent ce03f93 commit c1e3693

File tree

3 files changed

+44
-51
lines changed

3 files changed

+44
-51
lines changed

310-iacm-manager/app/src/main/java/io/harness/iacm/plan/creator/filter/IACMStageFilterJsonCreator.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import io.harness.beans.steps.IACMStepSpecTypeConstants;
1919
import io.harness.beans.yaml.extended.cache.Caching;
2020
import io.harness.beans.yaml.extended.infrastrucutre.Infrastructure;
21-
import io.harness.beans.yaml.extended.runtime.Runtime;
2221
import io.harness.ci.integrationstage.IntegrationStageUtils;
2322
import io.harness.cimanager.stages.IntegrationStageConfig;
2423
import io.harness.eventsframework.schemas.entity.EntityDetailProtoDTO;
@@ -72,13 +71,6 @@ public PipelineFilter getFilter(FilterCreationContext filterCreationContext, IAC
7271
return null;
7372
}
7473

75-
private void validateRuntime(IntegrationStageConfig integrationStageConfig) {
76-
Runtime runtime = integrationStageConfig.getRuntime();
77-
if (runtime != null && (runtime.getType() != Runtime.Type.CLOUD)) {
78-
throw new CIStageExecutionException("Runtime only supports field with type Cloud");
79-
}
80-
}
81-
8274
private void validateInfrastructure(IntegrationStageConfig integrationStageConfig) {
8375
Infrastructure infrastructure = integrationStageConfig.getInfrastructure();
8476
if (infrastructure != null) {
@@ -102,8 +94,6 @@ private void validateCache(IntegrationStageConfig integrationStageConfig) {
10294

10395
private void validateStage(IACMStageNode stageNode) {
10496
IntegrationStageConfig integrationStageConfig = (IntegrationStageConfig) stageNode.getStageInfoConfig();
105-
106-
validateRuntime(integrationStageConfig);
10797
validateInfrastructure(integrationStageConfig);
10898
validateExecution(integrationStageConfig);
10999
validateCache(integrationStageConfig);

332-ci-manager/service/src/main/java/io/harness/iacm/execution/IACMStepsUtils.java

Lines changed: 18 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
package io.harness.iacm.execution;
99

1010
import static io.harness.ci.commonconstants.CIExecutionConstants.WORKSPACE_ID;
11-
import static io.harness.data.structure.EmptyPredicate.isEmpty;
1211

1312
import io.harness.beans.entities.Workspace;
1413
import io.harness.beans.entities.WorkspaceVariables;
@@ -54,57 +53,44 @@ public void createExecution(Ambiance ambiance, String workspaceId) {
5453

5554
private Map<String, String> getWorkspaceVariables(Ambiance ambiance, String org, String projectId, String accountId,
5655
String workspaceID, String command, Workspace workspaceInfo) {
57-
String pluginEnvPrefix = "PLUGIN_";
58-
5956
WorkspaceVariables[] variables = getIACMWorkspaceVariables(org, projectId, accountId, workspaceID);
6057
HashMap<String, String> pluginEnvs = new HashMap<>();
6158

62-
HashMap<String, String> env = new HashMap<>();
63-
HashMap<String, String> tfInputEnvs = new HashMap<>();
59+
// Plugin system env variables
60+
pluginEnvs.put("PLUGIN_ROOT_DIR", workspaceInfo.getRepository_path());
61+
pluginEnvs.put("PLUGIN_TF_VERSION", workspaceInfo.getProvisioner_version());
62+
pluginEnvs.put("PLUGIN_ENDPOINT_VARIABLES", getTerraformEndpointsInfo(ambiance, workspaceID));
63+
64+
if (!Objects.equals(command, "")) {
65+
pluginEnvs.put("PLUGIN_COMMAND", command);
66+
}
6467

6568
for (WorkspaceVariables variable : variables) {
6669
switch (variable.getKind()) {
6770
case "env":
6871
if (Objects.equals(variable.getValue_type(), "secret")) {
69-
env.put(variable.getKey(), "${ngSecretManager.obtain(\"" + variable.getKey() + "\", -871314908)}");
72+
pluginEnvs.put("PLUGIN_WS_ENV_VAR_" + variable.getKey(),
73+
"${ngSecretManager.obtain(\"" + variable.getValue() + "\", " + ambiance.getExpressionFunctorToken()
74+
+ ")}");
7075
} else {
71-
env.put(variable.getKey(), variable.getValue());
76+
pluginEnvs.put("PLUGIN_WS_ENV_VAR_" + variable.getKey(), variable.getValue());
7277
}
7378
break;
7479
case "tf":
7580
if (Objects.equals(variable.getValue_type(), "secret")) {
76-
tfInputEnvs.put(variable.getKey(), "${ngSecretManager.obtain(\"" + variable.getKey() + "\", -871314908)}");
81+
pluginEnvs.put("PLUGIN_WS_TF_VAR_" + variable.getKey(),
82+
"${ngSecretManager.obtain(\"" + variable.getValue() + "\", " + ambiance.getExpressionFunctorToken()
83+
+ ")}");
7784
} else {
78-
tfInputEnvs.put(variable.getKey(), variable.getValue());
85+
pluginEnvs.put("PLUGIN_WS_TF_VAR_" + variable.getKey(), variable.getValue());
7986
}
8087
break;
8188
default:
8289
break;
8390
}
8491
}
8592

86-
// Plugin system env variables
87-
pluginEnvs.put("ROOT_DIR", workspaceInfo.getRepository_path());
88-
pluginEnvs.put("TF_VERSION", workspaceInfo.getProvisioner_version());
89-
pluginEnvs.put("ENDPOINT_VARIABLES", getTerraformEndpointsInfo(ambiance, workspaceID));
90-
pluginEnvs.put("VARS", transformMapToString(tfInputEnvs));
91-
pluginEnvs.put("ENV_VARS", transformMapToString(env));
92-
93-
if (!Objects.equals(command, "")) {
94-
pluginEnvs.put("COMMAND", command);
95-
}
96-
return prepareEnvsMaps(pluginEnvs, pluginEnvPrefix);
97-
}
98-
99-
private Map<String, String> prepareEnvsMaps(Map<String, String> envs, String prefix) {
100-
Map<String, String> envVars = new HashMap<>();
101-
if (!isEmpty(envs)) {
102-
for (Map.Entry<String, String> entry : envs.entrySet()) {
103-
String key = prefix + entry.getKey();
104-
envVars.put(key, entry.getValue());
105-
}
106-
}
107-
return envVars;
93+
return pluginEnvs;
10894
}
10995

11096
private WorkspaceVariables[] getIACMWorkspaceVariables(
@@ -128,6 +114,7 @@ public Map<String, String> getIACMEnvVariables(Ambiance ambiance, PluginStepInfo
128114
String command = extractOperation(stepInfo);
129115
return buildIACMEnvVariables(ambiance, workspaceId, command);
130116
}
117+
131118
private Map<String, String> buildIACMEnvVariables(Ambiance ambiance, String workspaceId, String command) {
132119
NGAccess ngAccess = AmbianceUtils.getNgAccess(ambiance);
133120

332-ci-manager/service/src/test/java/io/harness/ci/execution/utils/IACMStepUtilTest.java

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public void testIACMGetConnectorRef() {
105105
.thenReturn(ConnectorDetails.builder().connectorType(ConnectorType.AWS).build());
106106

107107
Map<String, String> envVariables = iacmStepsUtils.getIACMEnvVariables(ambiance, stepInfo);
108-
assertThat(envVariables).hasSize(6);
108+
assertThat(envVariables).hasSize(4);
109109
assertThat(envVariables.get("PLUGIN_ROOT_DIR")).isEqualTo("root");
110110
assertThat(envVariables.get("PLUGIN_TF_VERSION")).isEqualTo("1.2.3");
111111
ConnectorDetails connector = iacmStepsUtils.retrieveIACMConnectorDetails(ambiance, stepInfo);
@@ -152,7 +152,7 @@ public void testDifferentStepsInputs() {
152152
.settings(ParameterField.createValueField(setting))
153153
.build();
154154
Map<String, String> vmPluginStep = iacmStepsUtils.getIACMEnvVariables(ambiance, stepInfo);
155-
assertThat(vmPluginStep.size()).isEqualTo(6);
155+
assertThat(vmPluginStep.size()).isEqualTo(4);
156156
assertThat(vmPluginStep.get("PLUGIN_COMMAND")).isEqualTo(commands.get(i));
157157
}
158158
}
@@ -192,15 +192,30 @@ public void testIACMEnvVarsTransformation() {
192192
when(connectorUtils.getConnectorDetails(any(), any()))
193193
.thenReturn(ConnectorDetails.builder().connectorType(ConnectorType.AWS).build());
194194

195-
String[][] expectedResults = new String[][] {
196-
{"{\"keytest2\":\"keyValue2\",\"keytest1\":\"keyValue1\"}",
197-
"{\"keytest4\":\"keyValue4\",\"keytest3\":\"keyValue3\"}"},
198-
{"{\"keytest2\":\"keyValue2\",\"keytest1\":\"${ngSecretManager.obtain(\"keytest1\", -871314908)}\"}",
199-
"{\"keytest4\":\"keyValue4\",\"keytest3\":\"${ngSecretManager.obtain(\"keytest3\", -871314908)}\"}"},
200-
{"{}", "{}"},
195+
Map<String, String> expected1 = new HashMap<String, String>() {
196+
{
197+
put("PLUGIN_WS_ENV_VAR_keytest1", "keyValue1");
198+
put("PLUGIN_WS_ENV_VAR_keytest2", "keyValue2");
199+
put("PLUGIN_WS_TF_VAR_keytest3", "keyValue3");
200+
put("PLUGIN_WS_TF_VAR_keytest4", "keyValue4");
201+
}
202+
};
203+
204+
Map<String, String> expected2 = new HashMap<String, String>() {
205+
{
206+
put("PLUGIN_WS_ENV_VAR_keytest1", "${ngSecretManager.obtain(\"keyValue1\", 0)}");
207+
put("PLUGIN_WS_ENV_VAR_keytest2", "keyValue2");
208+
put("PLUGIN_WS_TF_VAR_keytest3", "${ngSecretManager.obtain(\"keyValue3\", 0)}");
209+
put("PLUGIN_WS_TF_VAR_keytest4", "keyValue4");
210+
}
211+
};
201212

213+
Map<String, String> expected3 = new HashMap<String, String>() {
214+
{}
202215
};
203216

217+
Map<String, String>[] expectedResults = (Map<String, String>[]) new Map[] {expected1, expected2, expected3};
218+
204219
WorkspaceVariables[][] testCases = {
205220
{WorkspaceVariables.builder()
206221
.stack("123")
@@ -274,8 +289,9 @@ public void testIACMEnvVarsTransformation() {
274289
for (int i = 0; i < testCases.length; i++) {
275290
when(iacmServiceUtils.getIacmWorkspaceEnvs(any(), any(), any(), any())).thenReturn(testCases[i]);
276291
Map<String, String> vmPluginStep = iacmStepsUtils.getIACMEnvVariables(ambiance, stepInfo);
277-
assertThat(vmPluginStep.get("PLUGIN_ENV_VARS")).isEqualTo(expectedResults[i][0]);
278-
assertThat(vmPluginStep.get("PLUGIN_VARS")).isEqualTo(expectedResults[i][1]);
292+
for (Map.Entry<String, String> entry : expectedResults[i].entrySet()) {
293+
assertThat(entry.getValue()).isEqualTo(vmPluginStep.get(entry.getKey()));
294+
}
279295
}
280296
}
281297

0 commit comments

Comments
 (0)