Skip to content

Commit c7da64e

Browse files
authored
OWLS-99380: Fix the pod roll issue in auxiliary image domain upgrade scenario from 3.4 to 4.0. (#3086)
1 parent a423e82 commit c7da64e

File tree

5 files changed

+173
-157
lines changed

5 files changed

+173
-157
lines changed

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

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,17 @@
3838
import static oracle.kubernetes.weblogic.domain.model.AuxiliaryImage.AUXILIARY_IMAGE_INIT_CONTAINER_WRAPPER_SCRIPT;
3939
import static oracle.kubernetes.weblogic.domain.model.AuxiliaryImage.AUXILIARY_IMAGE_TARGET_PATH;
4040
import static oracle.kubernetes.weblogic.domain.model.AuxiliaryImage.AUXILIARY_IMAGE_VOLUME_NAME_PREFIX;
41+
import static oracle.kubernetes.weblogic.domain.model.AuxiliaryImageEnvVars.AUXILIARY_IMAGE_PATHS;
4142

4243
public abstract class BasePodStepContext extends StepContextBase {
4344

4445
public static final String KUBERNETES_PLATFORM_HELM_VARIABLE = "kubernetesPlatform";
46+
public static final String USER_MEM_ARGS = "USER_MEM_ARGS";
47+
protected final String kubernetesPlatform;
4548

4649
BasePodStepContext(DomainPresenceInfo info) {
4750
super(info);
51+
kubernetesPlatform = TuningParameters.getInstance().getKubernetesPlatform();
4852
}
4953

5054
final <T> T updateForDeepSubstitution(V1PodSpec podSpec, T target) {
@@ -205,15 +209,6 @@ private List<V1HostAlias> getHostAliases() {
205209
return hostAliases.isEmpty() ? null : hostAliases;
206210
}
207211

208-
/**
209-
* Abstract method to be implemented by subclasses to return a list of configured and additional
210-
* environment variables to be set up in the pod.
211-
*
212-
* @param tuningParameters TuningParameters that can be used when obtaining
213-
* @return A list of configured and additional environment variables
214-
*/
215-
abstract List<V1EnvVar> getConfiguredEnvVars(TuningParameters tuningParameters);
216-
217212
/**
218213
* Return a list of environment variables to be set up in the pod. This method does some
219214
* processing of the list of environment variables such as token substitution before returning the
@@ -225,21 +220,44 @@ private List<V1HostAlias> getHostAliases() {
225220
*/
226221
final List<V1EnvVar> getEnvironmentVariables(TuningParameters tuningParameters) {
227222

228-
List<V1EnvVar> vars = getConfiguredEnvVars(tuningParameters);
223+
List<V1EnvVar> vars = new ArrayList<>();
224+
addConfiguredEnvVarsExcludingAuxImagePaths(vars);
229225

230226
addDefaultEnvVarIfMissing(
231-
vars, "USER_MEM_ARGS", "-Djava.security.egd=file:/dev/./urandom");
227+
vars, USER_MEM_ARGS, "-Djava.security.egd=file:/dev/./urandom");
228+
229+
addAuxImagePathsEnvVarIfExists(vars);
232230

233231
hideAdminUserCredentials(vars);
234232
return doDeepSubstitution(varsToSubVariables(vars), vars);
235233
}
236234

235+
/**
236+
* Abstract method to be implemented by subclasses to return a list of configured and additional
237+
* environment variables to be set up in the pod.
238+
*
239+
* @return A list of configured and additional environment variables
240+
*/
241+
abstract List<V1EnvVar> getConfiguredEnvVars();
242+
243+
private void addConfiguredEnvVarsExcludingAuxImagePaths(List<V1EnvVar> vars) {
244+
getConfiguredEnvVars().stream()
245+
.filter(v -> !AUXILIARY_IMAGE_PATHS.equals(v.getName()))
246+
.forEach(envVar -> addIfMissing(vars, envVar.getName(), envVar.getValue(), envVar.getValueFrom()));
247+
}
248+
249+
private void addAuxImagePathsEnvVarIfExists(List<V1EnvVar> vars) {
250+
getConfiguredEnvVars().stream()
251+
.filter(v -> AUXILIARY_IMAGE_PATHS.equals(v.getName()))
252+
.forEach(envVar -> addIfMissing(vars, envVar.getName(), envVar.getValue(), envVar.getValueFrom()));
253+
}
254+
237255
protected void addEnvVar(List<V1EnvVar> vars, String name, String value) {
238256
vars.add(new V1EnvVar().name(name).value(value));
239257
}
240258

241259
private void addEnvVar(List<V1EnvVar> vars, String name, String value, V1EnvVarSource valueFrom) {
242-
if ((value != null) && (!value.isEmpty())) {
260+
if (((value != null) && (!value.isEmpty())) || (valueFrom == null)) {
243261
addEnvVar(vars, name, value);
244262
} else {
245263
addEnvVarWithValueFrom(vars, name, valueFrom);
@@ -356,4 +374,8 @@ private String createauxiliaryImagePathsEnv(List<AuxiliaryImage> auxiliaryImages
356374
return Arrays.stream(auxiliaryImagePaths.toString().split(Pattern.quote(","))).distinct()
357375
.filter(st -> !st.isEmpty()).collect(Collectors.joining(","));
358376
}
377+
378+
protected String getKubernetesPlatform() {
379+
return kubernetesPlatform;
380+
}
359381
}

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

Lines changed: 0 additions & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import io.kubernetes.client.openapi.models.V1ContainerStateWaiting;
1515
import io.kubernetes.client.openapi.models.V1ContainerStatus;
1616
import io.kubernetes.client.openapi.models.V1DeleteOptions;
17-
import io.kubernetes.client.openapi.models.V1EnvVar;
1817
import io.kubernetes.client.openapi.models.V1Job;
1918
import io.kubernetes.client.openapi.models.V1JobCondition;
2019
import io.kubernetes.client.openapi.models.V1JobStatus;
@@ -44,16 +43,12 @@
4443
import oracle.kubernetes.operator.work.NextAction;
4544
import oracle.kubernetes.operator.work.Packet;
4645
import oracle.kubernetes.operator.work.Step;
47-
import oracle.kubernetes.weblogic.domain.model.AuxiliaryImageEnvVars;
4846
import oracle.kubernetes.weblogic.domain.model.Cluster;
4947
import oracle.kubernetes.weblogic.domain.model.ConfigurationConstants;
5048
import oracle.kubernetes.weblogic.domain.model.Domain;
5149
import oracle.kubernetes.weblogic.domain.model.DomainSpec;
5250
import oracle.kubernetes.weblogic.domain.model.DomainStatus;
53-
import oracle.kubernetes.weblogic.domain.model.IntrospectorJobEnvVars;
54-
import oracle.kubernetes.weblogic.domain.model.Istio;
5551
import oracle.kubernetes.weblogic.domain.model.ManagedServer;
56-
import oracle.kubernetes.weblogic.domain.model.ServerEnvVars;
5752

5853
import static java.time.temporal.ChronoUnit.SECONDS;
5954
import static oracle.kubernetes.operator.DomainSourceType.FromModel;
@@ -310,134 +305,6 @@ private void addVolumeMountIfMissing(V1VolumeMount mount, List<V1VolumeMount> vo
310305
}
311306
}
312307

313-
private String getAsName() {
314-
return domainTopology.getAdminServerName();
315-
}
316-
317-
private Integer getAsPort() {
318-
return domainTopology
319-
.getServerConfig(getAsName())
320-
.getLocalAdminProtocolChannelPort();
321-
}
322-
323-
private boolean isLocalAdminProtocolChannelSecure() {
324-
return domainTopology
325-
.getServerConfig(getAsName())
326-
.isLocalAdminProtocolChannelSecure();
327-
}
328-
329-
private String getAsServiceName() {
330-
return LegalNames.toServerServiceName(getDomainUid(), getAsName());
331-
}
332-
333-
@Override
334-
List<V1EnvVar> getConfiguredEnvVars(TuningParameters tuningParameters) {
335-
// Pod for introspector job would use same environment variables as for admin server
336-
List<V1EnvVar> vars =
337-
PodHelper.createCopy(getDomain().getAdminServerSpec().getEnvironmentVariables());
338-
339-
addEnvVar(vars, ServerEnvVars.DOMAIN_UID, getDomainUid());
340-
addEnvVar(vars, ServerEnvVars.DOMAIN_HOME, getDomainHome());
341-
addEnvVar(vars, ServerEnvVars.NODEMGR_HOME, getNodeManagerHome());
342-
addEnvVar(vars, ServerEnvVars.LOG_HOME, getEffectiveLogHome());
343-
addEnvVar(vars, ServerEnvVars.SERVER_OUT_IN_POD_LOG, getIncludeServerOutInPodLog());
344-
addEnvVar(vars, ServerEnvVars.ACCESS_LOG_IN_LOG_HOME, getHttpAccessLogInLogHome());
345-
addEnvVar(vars, IntrospectorJobEnvVars.NAMESPACE, getNamespace());
346-
addEnvVar(vars, IntrospectorJobEnvVars.INTROSPECT_HOME, getIntrospectHome());
347-
addEnvVar(vars, IntrospectorJobEnvVars.CREDENTIALS_SECRET_NAME, getWebLogicCredentialsSecretName());
348-
addEnvVar(vars, IntrospectorJobEnvVars.OPSS_KEY_SECRET_NAME, getOpssWalletPasswordSecretName());
349-
addEnvVar(vars, IntrospectorJobEnvVars.OPSS_WALLETFILE_SECRET_NAME, getOpssWalletFileSecretName());
350-
addEnvVar(vars, IntrospectorJobEnvVars.RUNTIME_ENCRYPTION_SECRET_NAME, getRuntimeEncryptionSecretName());
351-
addEnvVar(vars, IntrospectorJobEnvVars.WDT_DOMAIN_TYPE, getWdtDomainType());
352-
addEnvVar(vars, IntrospectorJobEnvVars.DOMAIN_SOURCE_TYPE, getDomainHomeSourceType().toString());
353-
addEnvVar(vars, IntrospectorJobEnvVars.ISTIO_ENABLED, Boolean.toString(isIstioEnabled()));
354-
addEnvVar(vars, IntrospectorJobEnvVars.ADMIN_CHANNEL_PORT_FORWARDING_ENABLED,
355-
Boolean.toString(isAdminChannelPortForwardingEnabled(getDomain().getSpec())));
356-
Optional.ofNullable(getKubernetesPlatform(tuningParameters))
357-
.ifPresent(v -> addEnvVar(vars, ServerEnvVars.KUBERNETES_PLATFORM, v));
358-
359-
addEnvVar(vars, IntrospectorJobEnvVars.ISTIO_READINESS_PORT, Integer.toString(getIstioReadinessPort()));
360-
addEnvVar(vars, IntrospectorJobEnvVars.ISTIO_POD_NAMESPACE, getNamespace());
361-
if (isIstioEnabled()) {
362-
// Only add the following Istio configuration environment variables when explicitly configured
363-
// otherwise the introspection job will needlessly run, after operator upgrade, based on generated
364-
// hash code of the set of environment variables.
365-
if (!isLocalhostBindingsEnabled()) {
366-
addEnvVar(vars, IntrospectorJobEnvVars.ISTIO_USE_LOCALHOST_BINDINGS, "false");
367-
}
368-
369-
if (getIstioReplicationPort() != Istio.DEFAULT_REPLICATION_PORT) {
370-
addEnvVar(vars, IntrospectorJobEnvVars.ISTIO_REPLICATION_PORT, Integer.toString(getIstioReplicationPort()));
371-
}
372-
}
373-
if (isUseOnlineUpdate()) {
374-
addEnvVar(vars, IntrospectorJobEnvVars.MII_USE_ONLINE_UPDATE, "true");
375-
addEnvVar(vars, IntrospectorJobEnvVars.MII_WDT_ACTIVATE_TIMEOUT,
376-
Long.toString(getDomain().getWDTActivateTimeoutMillis()));
377-
addEnvVar(vars, IntrospectorJobEnvVars.MII_WDT_CONNECT_TIMEOUT,
378-
Long.toString(getDomain().getWDTConnectTimeoutMillis()));
379-
addEnvVar(vars, IntrospectorJobEnvVars.MII_WDT_DEPLOY_TIMEOUT,
380-
Long.toString(getDomain().getWDTDeployTimeoutMillis()));
381-
addEnvVar(vars, IntrospectorJobEnvVars.MII_WDT_REDEPLOY_TIMEOUT,
382-
Long.toString(getDomain().getWDTReDeployTimeoutMillis()));
383-
addEnvVar(vars, IntrospectorJobEnvVars.MII_WDT_UNDEPLOY_TIMEOUT,
384-
Long.toString(getDomain().getWDTUnDeployTimeoutMillis()));
385-
addEnvVar(vars, IntrospectorJobEnvVars.MII_WDT_START_APPLICATION_TIMEOUT,
386-
Long.toString(getDomain().getWDTStartApplicationTimeoutMillis()));
387-
addEnvVar(vars, IntrospectorJobEnvVars.MII_WDT_STOP_APPLICAITON_TIMEOUT,
388-
Long.toString(getDomain().getWDTStopApplicationTimeoutMillis()));
389-
addEnvVar(vars, IntrospectorJobEnvVars.MII_WDT_SET_SERVERGROUPS_TIMEOUT,
390-
Long.toString(getDomain().getWDTSetServerGroupsTimeoutMillis()));
391-
}
392-
393-
String dataHome = getDataHome();
394-
if (dataHome != null && !dataHome.isEmpty()) {
395-
addEnvVar(vars, ServerEnvVars.DATA_HOME, dataHome);
396-
}
397-
398-
// Populate env var list used by the MII introspector job's 'short circuit' MD5
399-
// check. To prevent a false trip of the circuit breaker, the list must be the
400-
// same regardless of whether domainTopology == null.
401-
StringBuilder sb = new StringBuilder(vars.size() * 32);
402-
for (V1EnvVar var : vars) {
403-
sb.append(var.getName()).append(',');
404-
}
405-
sb.deleteCharAt(sb.length() - 1);
406-
addEnvVar(vars, "OPERATOR_ENVVAR_NAMES", sb.toString());
407-
408-
if (domainTopology != null) {
409-
// The domainTopology != null when the job is rerun for the same domain. In which
410-
// case we should now know how to contact the admin server, the admin server may
411-
// already be running, and the job may want to contact the admin server.
412-
413-
addEnvVar(vars, "ADMIN_NAME", getAsName());
414-
addEnvVar(vars, "ADMIN_PORT", getAsPort().toString());
415-
if (isLocalAdminProtocolChannelSecure()) {
416-
addEnvVar(vars, "ADMIN_PORT_SECURE", "true");
417-
}
418-
addEnvVar(vars, "AS_SERVICE_NAME", getAsServiceName());
419-
}
420-
421-
String modelHome = getModelHome();
422-
if (modelHome != null && !modelHome.isEmpty()) {
423-
addEnvVar(vars, IntrospectorJobEnvVars.WDT_MODEL_HOME, modelHome);
424-
}
425-
426-
String wdtInstallHome = getWdtInstallHome();
427-
if (wdtInstallHome != null && !wdtInstallHome.isEmpty()) {
428-
addEnvVar(vars, IntrospectorJobEnvVars.WDT_INSTALL_HOME, wdtInstallHome);
429-
}
430-
431-
Optional.ofNullable(getAuxiliaryImagePaths(getServerSpec().getAuxiliaryImages(),
432-
getDomain().getAuxiliaryImageVolumes()))
433-
.ifPresent(c -> addEnvVar(vars, AuxiliaryImageEnvVars.AUXILIARY_IMAGE_PATHS, c));
434-
return vars;
435-
}
436-
437-
private String getKubernetesPlatform(TuningParameters tuningParameters) {
438-
return tuningParameters.getKubernetesPlatform();
439-
}
440-
441308
}
442309

443310
static class DomainIntrospectorJobStep extends Step {

0 commit comments

Comments
 (0)