Skip to content

Commit 2ac679d

Browse files
committed
Handle transitive variable substitution.
1 parent 5545cfe commit 2ac679d

File tree

2 files changed

+62
-21
lines changed

2 files changed

+62
-21
lines changed

operator/src/main/java/oracle/kubernetes/operator/helpers/PodStepContext.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.util.Arrays;
2929
import java.util.Collections;
3030
import java.util.List;
31+
import java.util.Objects;
3132
import java.util.Set;
3233
import java.util.concurrent.atomic.AtomicBoolean;
3334
import oracle.kubernetes.operator.KubernetesConstants;
@@ -547,8 +548,16 @@ static void addEnvVar(List<V1EnvVar> vars, String name, String value) {
547548
}
548549

549550
void doSubstitution(List<V1EnvVar> vars) {
550-
for (V1EnvVar var : vars) {
551-
var.setValue(translate(var.getValue(), vars));
551+
boolean runAgain = true;
552+
while (runAgain) {
553+
runAgain = false;
554+
for (V1EnvVar var : vars) {
555+
String newValue = translate(var.getValue(), vars);
556+
if (!Objects.equals(var.getValue(), newValue)) {
557+
runAgain = true;
558+
var.setValue(newValue);
559+
}
560+
}
552561
}
553562
}
554563

operator/src/test/java/oracle/kubernetes/operator/helpers/AdminPodHelperTest.java

Lines changed: 51 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,11 @@
2020
import io.kubernetes.client.ApiException;
2121
import io.kubernetes.client.models.V1Container;
2222
import io.kubernetes.client.models.V1ContainerPort;
23+
import io.kubernetes.client.models.V1EnvVar;
2324
import io.kubernetes.client.models.V1Pod;
2425
import io.kubernetes.client.models.V1PodSpec;
2526
import io.kubernetes.client.models.V1Status;
27+
import java.util.ArrayList;
2628
import java.util.Arrays;
2729
import java.util.Collections;
2830
import java.util.List;
@@ -39,14 +41,6 @@ public class AdminPodHelperTest extends PodHelperTestBase {
3941
private static final String INTERNAL_OPERATOR_CERT_FILE_PARAM = "internalOperatorCert";
4042
private static final String INTERNAL_OPERATOR_CERT_ENV_NAME = "INTERNAL_OPERATOR_CERT";
4143
private static final String CERTFILE = "certfile";
42-
private static final String ITEM1 = "item1";
43-
private static final String ITEM2 = "item2";
44-
private static final String VALUE1 = "value1";
45-
private static final String VALUE2 = "value2";
46-
private static final String RAW_VALUE_1 = "find $(DOMAIN_NAME) at $(DOMAIN_HOME)";
47-
private static final String END_VALUE_1 = "find domain1 at /shared/domain/domain1";
48-
private static final String RAW_VALUE_2 = "$(SERVER_NAME) is $(ADMIN_NAME):$(ADMIN_PORT)";
49-
private static final String END_VALUE_2 = "ADMIN_SERVER is ADMIN_SERVER:7001";
5044

5145
public AdminPodHelperTest() {
5246
super(ADMIN_SERVER, ADMIN_PORT);
@@ -246,12 +240,14 @@ public void whenDomainPresenceHasEnvironmentItems_createAdminPodStartupWithThem(
246240
.getDomain()
247241
.getSpec()
248242
.setServerStartup(
249-
Collections.singletonList(
250-
createServerStartup(ADMIN_SERVER, ITEM1, VALUE1, ITEM2, VALUE2)));
243+
new ServerStartupListBuilder(ADMIN_SERVER)
244+
.withVar("item1", "value1")
245+
.withVar("item2", "value2")
246+
.build());
251247

252248
assertThat(
253249
getCreatedPodSpecContainer().getEnv(),
254-
allOf(hasEnvVar(ITEM1, VALUE1), hasEnvVar(ITEM2, VALUE2)));
250+
allOf(hasEnvVar("item1", "value1"), hasEnvVar("item2", "value2")));
255251
}
256252

257253
@Test
@@ -260,19 +256,55 @@ public void whenDomainPresenceHasEnvironmentItemsWithVariables_createAdminPodSta
260256
.getDomain()
261257
.getSpec()
262258
.setServerStartup(
263-
Collections.singletonList(
264-
createServerStartup(ADMIN_SERVER, ITEM1, RAW_VALUE_1, ITEM2, RAW_VALUE_2)));
259+
new ServerStartupListBuilder(ADMIN_SERVER)
260+
.withVar("item1", "find $(DOMAIN_NAME) at $(DOMAIN_HOME)")
261+
.withVar("item2", "$(SERVER_NAME) is $(ADMIN_NAME):$(ADMIN_PORT)")
262+
.build());
265263

266264
assertThat(
267265
getCreatedPodSpecContainer().getEnv(),
268-
allOf(hasEnvVar(ITEM1, END_VALUE_1), hasEnvVar(ITEM2, END_VALUE_2)));
266+
allOf(
267+
hasEnvVar("item1", "find domain1 at /shared/domain/domain1"),
268+
hasEnvVar("item2", "ADMIN_SERVER is ADMIN_SERVER:7001")));
269269
}
270270

271-
private ServerStartup createServerStartup(
272-
String serverName, String item1, String value1, String item2, String value2) {
273-
return new ServerStartup()
274-
.withServerName(serverName)
275-
.withEnv(Arrays.asList(envItem(item1, value1), envItem(item2, value2)));
271+
@Test
272+
public void whenDomainPresenceHasIterativeVariables_createAdminPodStartupWithThem() {
273+
domainPresenceInfo
274+
.getDomain()
275+
.getSpec()
276+
.setServerStartup(
277+
new ServerStartupListBuilder(ADMIN_SERVER)
278+
.withVar("item1", "from $(item3)")
279+
.withVar("item2", "<$(DOMAIN_NAME)>")
280+
.withVar("item3", "using $(item2)")
281+
.build());
282+
283+
assertThat(
284+
getCreatedPodSpecContainer().getEnv(),
285+
allOf(
286+
hasEnvVar("item1", "from using <domain1>"),
287+
hasEnvVar("item2", "<domain1>"),
288+
hasEnvVar("item3", "using <domain1>")));
289+
}
290+
291+
static class ServerStartupListBuilder {
292+
private String serverName;
293+
private List<V1EnvVar> vars = new ArrayList<>();
294+
295+
ServerStartupListBuilder(String serverName) {
296+
this.serverName = serverName;
297+
}
298+
299+
ServerStartupListBuilder withVar(String name, String value) {
300+
vars.add(new V1EnvVar().name(name).value(value));
301+
return this;
302+
}
303+
304+
List<ServerStartup> build() {
305+
return Collections.singletonList(
306+
new ServerStartup().withServerName(serverName).withEnv(vars));
307+
}
276308
}
277309

278310
@Override

0 commit comments

Comments
 (0)