Skip to content

Commit 894035f

Browse files
authored
Merge pull request #847 from oracle/owls-71580
Owls-71580 Pass custom env vars to introspect job
2 parents 1403fea + d92a052 commit 894035f

File tree

9 files changed

+274
-63
lines changed

9 files changed

+274
-63
lines changed

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

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -92,18 +92,21 @@ protected List<V1VolumeMount> getAdditionalVolumeMounts() {
9292
}
9393

9494
@Override
95-
List<V1EnvVar> getEnvironmentVariables(TuningParameters tuningParameters) {
96-
List<V1EnvVar> envVarList = new ArrayList<V1EnvVar>();
97-
addEnvVar(envVarList, "NAMESPACE", getNamespace());
98-
addEnvVar(envVarList, "DOMAIN_UID", getDomainUID());
99-
addEnvVar(envVarList, "DOMAIN_HOME", getDomainHome());
100-
addEnvVar(envVarList, "NODEMGR_HOME", getNodeManagerHome());
101-
addEnvVar(envVarList, "LOG_HOME", getEffectiveLogHome());
102-
addEnvVar(envVarList, "INTROSPECT_HOME", getIntrospectHome());
103-
addEnvVar(envVarList, "SERVER_OUT_IN_POD_LOG", getIncludeServerOutInPodLog());
104-
addEnvVar(envVarList, "CREDENTIALS_SECRET_NAME", getWebLogicCredentialsSecretName());
105-
106-
return envVarList;
95+
List<V1EnvVar> getConfiguredEnvVars(TuningParameters tuningParameters) {
96+
// Pod for introspector job would use same environment variables as for admin server
97+
List<V1EnvVar> vars =
98+
new ArrayList<>(getDomain().getAdminServerSpec().getEnvironmentVariables());
99+
100+
addEnvVar(vars, "NAMESPACE", getNamespace());
101+
addEnvVar(vars, "DOMAIN_UID", getDomainUID());
102+
addEnvVar(vars, "DOMAIN_HOME", getDomainHome());
103+
addEnvVar(vars, "NODEMGR_HOME", getNodeManagerHome());
104+
addEnvVar(vars, "LOG_HOME", getEffectiveLogHome());
105+
addEnvVar(vars, "INTROSPECT_HOME", getIntrospectHome());
106+
addEnvVar(vars, "SERVER_OUT_IN_POD_LOG", getIncludeServerOutInPodLog());
107+
addEnvVar(vars, "CREDENTIALS_SECRET_NAME", getWebLogicCredentialsSecretName());
108+
109+
return vars;
107110
}
108111
}
109112

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

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,24 @@
11
package oracle.kubernetes.operator.helpers;
22

3-
import io.kubernetes.client.models.*;
3+
import io.kubernetes.client.models.V1ConfigMapVolumeSource;
4+
import io.kubernetes.client.models.V1Container;
5+
import io.kubernetes.client.models.V1Job;
6+
import io.kubernetes.client.models.V1JobSpec;
7+
import io.kubernetes.client.models.V1ObjectMeta;
8+
import io.kubernetes.client.models.V1PersistentVolumeClaimVolumeSource;
9+
import io.kubernetes.client.models.V1PodSpec;
10+
import io.kubernetes.client.models.V1PodTemplateSpec;
11+
import io.kubernetes.client.models.V1SecretVolumeSource;
12+
import io.kubernetes.client.models.V1Volume;
13+
import io.kubernetes.client.models.V1VolumeMount;
414
import java.io.File;
515
import java.util.Arrays;
616
import java.util.List;
7-
import oracle.kubernetes.operator.*;
17+
import oracle.kubernetes.operator.KubernetesConstants;
18+
import oracle.kubernetes.operator.LabelConstants;
19+
import oracle.kubernetes.operator.ProcessingConstants;
20+
import oracle.kubernetes.operator.TuningParameters;
21+
import oracle.kubernetes.operator.VersionConstants;
822
import oracle.kubernetes.operator.calls.CallResponse;
923
import oracle.kubernetes.operator.logging.LoggingFacade;
1024
import oracle.kubernetes.operator.logging.LoggingFactory;
@@ -13,7 +27,7 @@
1327
import oracle.kubernetes.operator.work.Step;
1428
import oracle.kubernetes.weblogic.domain.v2.Domain;
1529

16-
public abstract class JobStepContext implements StepContextConstants {
30+
public abstract class JobStepContext extends StepContextBase {
1731
private static final LoggingFacade LOGGER = LoggingFactory.getLogger("Operator", "Operator");
1832

1933
private static final String WEBLOGIC_OPERATOR_SCRIPTS_INTROSPECT_DOMAIN_SH =
@@ -30,6 +44,11 @@ public abstract class JobStepContext implements StepContextConstants {
3044

3145
void init() {
3246
jobModel = createJobModel();
47+
createSubstitutionMap();
48+
}
49+
50+
private void createSubstitutionMap() {
51+
substitutionVariables.put("DOMAIN_HOME", getDomainHome());
3352
}
3453

3554
private V1Job getJobModel() {
@@ -277,16 +296,10 @@ protected List<String> getContainerCommand() {
277296
return Arrays.asList(WEBLOGIC_OPERATOR_SCRIPTS_INTROSPECT_DOMAIN_SH);
278297
}
279298

280-
abstract List<V1EnvVar> getEnvironmentVariables(TuningParameters tuningParameters);
281-
282299
protected String getDomainHome() {
283300
return getDomain().getDomainHome();
284301
}
285302

286-
static void addEnvVar(List<V1EnvVar> vars, String name, String value) {
287-
vars.add(new V1EnvVar().name(name).value(value));
288-
}
289-
290303
private static V1VolumeMount readOnlyVolumeMount(String volumeName, String mountPath) {
291304
return volumeMount(volumeName, mountPath).readOnly(true);
292305
}

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,10 @@ protected V1PodSpec createSpec(TuningParameters tuningParameters) {
7777
}
7878

7979
@Override
80-
List<V1EnvVar> getEnvironmentVariables(TuningParameters tuningParameters) {
80+
List<V1EnvVar> getConfiguredEnvVars(TuningParameters tuningParameters) {
8181
List<V1EnvVar> vars = new ArrayList<>(getServerSpec().getEnvironmentVariables());
8282
addEnvVar(vars, INTERNAL_OPERATOR_CERT_ENV, getInternalOperatorCertFile(tuningParameters));
8383
overrideContainerWeblogicEnvVars(vars);
84-
doSubstitution(vars);
8584
return vars;
8685
}
8786

@@ -246,15 +245,14 @@ protected List<String> getContainerCommand() {
246245

247246
@Override
248247
@SuppressWarnings("unchecked")
249-
List<V1EnvVar> getEnvironmentVariables(TuningParameters tuningParameters) {
248+
List<V1EnvVar> getConfiguredEnvVars(TuningParameters tuningParameters) {
250249
List<V1EnvVar> envVars = (List<V1EnvVar>) packet.get(ProcessingConstants.ENVVARS);
251250

252251
List<V1EnvVar> vars = new ArrayList<>();
253252
if (envVars != null) {
254253
vars.addAll(envVars);
255254
}
256255
overrideContainerWeblogicEnvVars(vars);
257-
doSubstitution(vars);
258256
return vars;
259257
}
260258
}

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

Lines changed: 1 addition & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
import org.apache.commons.lang3.builder.EqualsBuilder;
3030

3131
@SuppressWarnings("deprecation")
32-
public abstract class PodStepContext implements StepContextConstants {
32+
public abstract class PodStepContext extends StepContextBase {
3333

3434
private static final LoggingFacade LOGGER = LoggingFactory.getLogger("Operator", "Operator");
3535

@@ -44,7 +44,6 @@ public abstract class PodStepContext implements StepContextConstants {
4444
protected final WlsServerConfig scan;
4545
private final Step conflictStep;
4646
private V1Pod podModel;
47-
private Map<String, String> substitutionVariables = new HashMap<>();
4847

4948
PodStepContext(Step conflictStep, Packet packet) {
5049
this.conflictStep = conflictStep;
@@ -714,8 +713,6 @@ protected List<String> getContainerCommand() {
714713
return Collections.singletonList(START_SERVER);
715714
}
716715

717-
abstract List<V1EnvVar> getEnvironmentVariables(TuningParameters tuningParameters);
718-
719716
private List<V1VolumeMount> getVolumeMounts() {
720717
List<V1VolumeMount> mounts = PodDefaults.getStandardVolumeMounts(getDomainUID());
721718
mounts.addAll(getServerSpec().getAdditionalVolumeMounts());
@@ -739,45 +736,12 @@ void overrideContainerWeblogicEnvVars(List<V1EnvVar> vars) {
739736
if (mockWLS()) {
740737
addEnvVar(vars, "MOCK_WLS", "true");
741738
}
742-
hideAdminUserCredentials(vars);
743739
}
744740

745741
private String getDomainHome() {
746742
return getDomain().getDomainHome();
747743
}
748744

749-
// Hide the admin account's user name and password.
750-
// Note: need to use null v.s. "" since if you upload a "" to kubectl then download it,
751-
// it comes back as a null and V1EnvVar.equals returns false even though it's supposed to
752-
// be the same value.
753-
// Regardless, the pod ends up with an empty string as the value (v.s. thinking that
754-
// the environment variable hasn't been set), so it honors the value (instead of using
755-
// the default, e.g. 'weblogic' for the user name).
756-
private static void hideAdminUserCredentials(List<V1EnvVar> vars) {
757-
addEnvVar(vars, "ADMIN_USERNAME", null);
758-
addEnvVar(vars, "ADMIN_PASSWORD", null);
759-
}
760-
761-
static void addEnvVar(List<V1EnvVar> vars, String name, String value) {
762-
vars.add(new V1EnvVar().name(name).value(value));
763-
}
764-
765-
void doSubstitution(List<V1EnvVar> vars) {
766-
for (V1EnvVar var : vars) {
767-
var.setValue(translate(var.getValue()));
768-
}
769-
}
770-
771-
private String translate(String rawValue) {
772-
String result = rawValue;
773-
for (Map.Entry<String, String> entry : substitutionVariables.entrySet()) {
774-
if (result != null && entry.getValue() != null) {
775-
result = result.replace(String.format("$(%s)", entry.getKey()), entry.getValue());
776-
}
777-
}
778-
return result;
779-
}
780-
781745
private V1Lifecycle createLifecycle() {
782746
return new V1Lifecycle().preStop(handler(STOP_SERVER));
783747
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
// Copyright 2019, Oracle Corporation and/or its affiliates. All rights reserved.
2+
// Licensed under the Universal Permissive License v 1.0 as shown at
3+
// http://oss.oracle.com/licenses/upl.
4+
package oracle.kubernetes.operator.helpers;
5+
6+
import io.kubernetes.client.models.V1EnvVar;
7+
import java.util.HashMap;
8+
import java.util.List;
9+
import java.util.Map;
10+
import oracle.kubernetes.operator.TuningParameters;
11+
12+
public abstract class StepContextBase implements StepContextConstants {
13+
14+
// Map of <token, substitution string> to be used in the translate method
15+
// Subclass should populate this map prior to calling translate().
16+
protected Map<String, String> substitutionVariables = new HashMap<>();
17+
18+
/**
19+
* Abstract method to be implemented by subclasses to return a list of configured and additional
20+
* environment variables to be set up in the pod
21+
*
22+
* @param tuningParameters TuningParameters that can be used when obtaining
23+
* @return A list of configured and additional environment variables
24+
*/
25+
abstract List<V1EnvVar> getConfiguredEnvVars(TuningParameters tuningParameters);
26+
27+
/**
28+
* Return a list of environment variables to be set up in the pod. This method does some
29+
* processing of the list of environment variables such as token substitution before returning the
30+
* list.
31+
*
32+
* @param tuningParameters TuningParameters containing parameters that may be used in environment
33+
* variables
34+
* @return A List of environment variables to be set up in the pod
35+
*/
36+
final List<V1EnvVar> getEnvironmentVariables(TuningParameters tuningParameters) {
37+
38+
List<V1EnvVar> vars = getConfiguredEnvVars(tuningParameters);
39+
40+
hideAdminUserCredentials(vars);
41+
doSubstitution(vars);
42+
43+
return vars;
44+
}
45+
46+
protected void doSubstitution(List<V1EnvVar> vars) {
47+
for (V1EnvVar var : vars) {
48+
var.setValue(translate(var.getValue()));
49+
}
50+
}
51+
52+
private String translate(String rawValue) {
53+
String result = rawValue;
54+
for (Map.Entry<String, String> entry : substitutionVariables.entrySet()) {
55+
if (result != null && entry.getValue() != null) {
56+
result = result.replace(String.format("$(%s)", entry.getKey()), entry.getValue());
57+
}
58+
}
59+
return result;
60+
}
61+
62+
protected void addEnvVar(List<V1EnvVar> vars, String name, String value) {
63+
vars.add(new V1EnvVar().name(name).value(value));
64+
}
65+
66+
// Hide the admin account's user name and password.
67+
// Note: need to use null v.s. "" since if you upload a "" to kubectl then download it,
68+
// it comes back as a null and V1EnvVar.equals returns false even though it's supposed to
69+
// be the same value.
70+
// Regardless, the pod ends up with an empty string as the value (v.s. thinking that
71+
// the environment variable hasn't been set), so it honors the value (instead of using
72+
// the default, e.g. 'weblogic' for the user name).
73+
protected void hideAdminUserCredentials(List<V1EnvVar> vars) {
74+
addEnvVar(vars, "ADMIN_USERNAME", null);
75+
addEnvVar(vars, "ADMIN_PASSWORD", null);
76+
}
77+
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
// Copyright 2018, 2019, Oracle Corporation and/or its affiliates. All rights reserved.
2+
// Licensed under the Universal Permissive License v 1.0 as shown at
3+
// http://oss.oracle.com/licenses/upl.
14
package oracle.kubernetes.operator.helpers;
25

36
public interface StepContextConstants {

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,15 @@ public void whenDomainHasEnvironmentItemsWithVariables_createAdminPodStartupWith
313313
hasEnvVar("item2", "ADMIN_SERVER is ADMIN_SERVER:7001")));
314314
}
315315

316+
@Test
317+
public void createAdminPodStartupWithNullAdminUsernamePasswordEnvVarsValues() {
318+
configureAdminServer();
319+
320+
assertThat(
321+
getCreatedPodSpecContainer().getEnv(),
322+
allOf(hasEnvVar("ADMIN_USERNAME", null), hasEnvVar("ADMIN_PASSWORD", null)));
323+
}
324+
316325
@Test
317326
public void whenDomainHasAdditionalVolumes_createAdminPodWithThem() {
318327
getConfigurator()

0 commit comments

Comments
 (0)