Skip to content

Commit 48a0e9e

Browse files
authored
Backport changes in PR 3028 for OWLS-98864 fix to release/3.4 (#3034)
* Backport changes in PR 3028 for OWLS-98864 fix to release/3.4
1 parent 082a602 commit 48a0e9e

File tree

7 files changed

+121
-3
lines changed

7 files changed

+121
-3
lines changed

documentation/3.4/content/faq/resource-settings.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,9 @@ by configuring Kubernetes resource requests and limits,
5353
and you can tune a WebLogic JVM heap usage
5454
using the `USER_MEM_ARGS` environment variable in your Domain YAML file.
5555
The introspector job pod uses the same CPU and memory settings as the
56-
domain's WebLogic Administration Server pod.
56+
domain's WebLogic Administration Server pod. Similarly, the operator created init containers in the
57+
introspector job pod for the [Auxiliary Images]({{< relref "/userguide/managing-domains/model-in-image/auxiliary-images" >}})
58+
based domains use the same CPU and memory settings as the domain's WebLogic Administration Server pod.
5759
A resource request sets the minimum amount of a resource that a container requires.
5860
A resource limit is the maximum amount of a resource a container is given
5961
and prevents a container from using more than its share of a resource.

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import io.kubernetes.client.openapi.models.V1HostAlias;
2323
import io.kubernetes.client.openapi.models.V1Pod;
2424
import io.kubernetes.client.openapi.models.V1PodSpec;
25+
import io.kubernetes.client.openapi.models.V1ResourceRequirements;
2526
import io.kubernetes.client.openapi.models.V1Toleration;
2627
import io.kubernetes.client.openapi.models.V1Volume;
2728
import io.kubernetes.client.openapi.models.V1VolumeMount;
@@ -121,6 +122,7 @@ protected V1Container createInitContainerForAuxiliaryImage(AuxiliaryImage auxili
121122
.imagePullPolicy(auxiliaryImage.getImagePullPolicy())
122123
.command(Collections.singletonList(AUXILIARY_IMAGE_INIT_CONTAINER_WRAPPER_SCRIPT))
123124
.env(createEnv(auxiliaryImage, info.getDomain().getAuxiliaryImageVolumes(), getName(index)))
125+
.resources(createResources())
124126
.volumeMounts(Arrays.asList(
125127
new V1VolumeMount().name(getDNS1123auxiliaryImageVolumeName(auxiliaryImage.getVolume()))
126128
.mountPath(AUXILIARY_IMAGE_TARGET_PATH),
@@ -158,6 +160,22 @@ private boolean podHasMatchingVolumeName(V1Volume volume, AuxiliaryImageVolume a
158160
return volume.getName().equals(auxiliaryImageVolume.getName());
159161
}
160162

163+
protected V1ResourceRequirements createResources() {
164+
V1ResourceRequirements resources = getServerSpec().getResources();
165+
V1ResourceRequirements resourceRequirements = null;
166+
if (!resources.getLimits().isEmpty()) {
167+
resourceRequirements = new V1ResourceRequirements()
168+
.limits(resources.getLimits());
169+
}
170+
171+
if (!resources.getRequests().isEmpty()) {
172+
resourceRequirements = resourceRequirements == null
173+
? new V1ResourceRequirements().requests(resources.getRequests())
174+
: resourceRequirements.requests(resources.getRequests());
175+
}
176+
return resourceRequirements;
177+
}
178+
161179
protected V1PodSpec createPodSpec(TuningParameters tuningParameters) {
162180
return new V1PodSpec()
163181
.containers(getContainers())

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,8 @@ private V1PodSpec addInitContainers(V1PodSpec podSpec, TuningParameters tuningPa
321321
Optional.ofNullable(getAuxiliaryImages()).ifPresent(auxImages -> addInitContainers(initContainers, auxImages));
322322
initContainers.addAll(getAdditionalInitContainers().stream()
323323
.filter(container -> container.getName().startsWith(COMPATIBILITY_MODE))
324-
.map(c -> c.env(createEnv(c, tuningParameters))).collect(Collectors.toList()));
324+
.map(c -> c.env(createEnv(c, tuningParameters)).resources(createResources()))
325+
.collect(Collectors.toList()));
325326
podSpec.initContainers(initContainers);
326327
return podSpec;
327328
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -859,7 +859,8 @@ private List<V1Container> getInitContainers(TuningParameters tuningParameters) {
859859
Optional.ofNullable(getServerSpec().getAuxiliaryImages()).ifPresent(auxiliaryImages ->
860860
getAuxiliaryImageInitContainers(auxiliaryImages, initContainers));
861861
initContainers.addAll(getServerSpec().getInitContainers().stream()
862-
.map(c -> c.env(createEnv(c, tuningParameters))).collect(Collectors.toList()));
862+
.map(c -> c.env(createEnv(c, tuningParameters)).resources(createResources()))
863+
.collect(Collectors.toList()));
863864
return initContainers;
864865
}
865866

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

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import io.kubernetes.client.openapi.models.V1JobStatus;
2525
import io.kubernetes.client.openapi.models.V1ObjectMeta;
2626
import io.kubernetes.client.openapi.models.V1PodSpec;
27+
import io.kubernetes.client.openapi.models.V1ResourceRequirements;
2728
import io.kubernetes.client.openapi.models.V1SecretReference;
2829
import io.kubernetes.client.openapi.models.V1Volume;
2930
import io.kubernetes.client.openapi.models.V1VolumeMount;
@@ -490,6 +491,57 @@ void whenJobCreatedWithMultipleAuxiliaryImages_createdJobPodsHasMultipleInitCont
490491
.mountPath(DEFAULT_AUXILIARY_IMAGE_PATH)));
491492
}
492493

494+
@Test
495+
void whenJobCreatedWithAuxiliaryImageWithResourceRequirements_createInitContainerHasResourceRequirements() {
496+
getConfigurator()
497+
.withLimitRequirement("cpu", "250m")
498+
.withRequestRequirement("memory", "1Gi")
499+
.withAuxiliaryImageVolumes(getAuxiliaryImageVolume(DEFAULT_AUXILIARY_IMAGE_PATH))
500+
.withAuxiliaryImages(Collections.singletonList(getAuxiliaryImage("wdt-image:v1")
501+
.imagePullPolicy("ALWAYS")));
502+
503+
V1Job job = runStepsAndGetJobs().get(0);
504+
assertThat(getPodTemplateInitContainers(job),
505+
Matchers.hasAuxiliaryImageInitContainer(AUXILIARY_IMAGE_INIT_CONTAINER_NAME_PREFIX + 1,
506+
"wdt-image:v1", "ALWAYS", AUXILIARY_IMAGE_DEFAULT_INIT_CONTAINER_COMMAND,
507+
new V1ResourceRequirements()
508+
.limits(Collections.singletonMap("cpu", new Quantity("250m")))
509+
.requests(Collections.singletonMap("memory", new Quantity("1Gi")))));
510+
}
511+
512+
@Test
513+
void whenJobCreatedWithAuxiliaryImageWithResourceLimits_createInitContainerHasResourceLimits() {
514+
getConfigurator()
515+
.withLimitRequirement("memory", "1Gi")
516+
.withAuxiliaryImageVolumes(getAuxiliaryImageVolume(DEFAULT_AUXILIARY_IMAGE_PATH))
517+
.withAuxiliaryImages(Collections.singletonList(getAuxiliaryImage("wdt-image:v1")
518+
.imagePullPolicy("ALWAYS")));
519+
520+
521+
V1Job job = runStepsAndGetJobs().get(0);
522+
assertThat(getPodTemplateInitContainers(job),
523+
Matchers.hasAuxiliaryImageInitContainer(AUXILIARY_IMAGE_INIT_CONTAINER_NAME_PREFIX + 1,
524+
"wdt-image:v1", "ALWAYS", AUXILIARY_IMAGE_DEFAULT_INIT_CONTAINER_COMMAND,
525+
new V1ResourceRequirements()
526+
.limits(Collections.singletonMap("memory", new Quantity("1Gi")))));
527+
}
528+
529+
@Test
530+
void whenJobCreatedWithAuxiliaryImageWithResourceRequests_createInitContainerHasResourceRequests() {
531+
getConfigurator()
532+
.withRequestRequirement("memory", "1Gi")
533+
.withAuxiliaryImageVolumes(getAuxiliaryImageVolume(DEFAULT_AUXILIARY_IMAGE_PATH))
534+
.withAuxiliaryImages(Collections.singletonList(getAuxiliaryImage("wdt-image:v1")
535+
.imagePullPolicy("ALWAYS")));
536+
537+
V1Job job = runStepsAndGetJobs().get(0);
538+
assertThat(getPodTemplateInitContainers(job),
539+
Matchers.hasAuxiliaryImageInitContainer(AUXILIARY_IMAGE_INIT_CONTAINER_NAME_PREFIX + 1,
540+
"wdt-image:v1", "ALWAYS", AUXILIARY_IMAGE_DEFAULT_INIT_CONTAINER_COMMAND,
541+
new V1ResourceRequirements()
542+
.requests(Collections.singletonMap("memory", new Quantity("1Gi")))));
543+
}
544+
493545
@Test
494546
void whenPodCreationFailsDueToUnprocessableEntityFailure_reportInDomainStatus() {
495547
testSupport.failOnResource(JOB, getJobName(), NS, new UnrecoverableErrorBuilderImpl()

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import io.kubernetes.client.openapi.models.V1HostPathVolumeSource;
2020
import io.kubernetes.client.openapi.models.V1PersistentVolumeClaimVolumeSource;
2121
import io.kubernetes.client.openapi.models.V1Probe;
22+
import io.kubernetes.client.openapi.models.V1ResourceRequirements;
2223
import io.kubernetes.client.openapi.models.V1SecretVolumeSource;
2324
import io.kubernetes.client.openapi.models.V1Volume;
2425
import io.kubernetes.client.openapi.models.V1VolumeMount;
@@ -54,11 +55,22 @@ public static Matcher<Iterable<? super V1Container>> hasAuxiliaryImageInitContai
5455
return hasAuxiliaryImageInitContainer(name, image, imagePullPolicy, command, TEST_VOLUME_NAME);
5556
}
5657

58+
public static Matcher<Iterable<? super V1Container>> hasAuxiliaryImageInitContainer(
59+
String name, String image, String imagePullPolicy, String command, V1ResourceRequirements resources) {
60+
return hasAuxiliaryImageInitContainer(name, image, imagePullPolicy, command, TEST_VOLUME_NAME, resources);
61+
}
62+
5763
public static Matcher<Iterable<? super V1Container>> hasAuxiliaryImageInitContainer(
5864
String name, String image, String imagePullPolicy, String command, String volumeName) {
5965
return hasItem(createAuxiliaryImageInitContainer(name, image, imagePullPolicy, command, volumeName));
6066
}
6167

68+
public static Matcher<Iterable<? super V1Container>> hasAuxiliaryImageInitContainer(
69+
String name, String image, String imagePullPolicy, String command, String volumeName,
70+
V1ResourceRequirements resources) {
71+
return hasItem(createAuxiliaryImageInitContainer(name, image, imagePullPolicy, command, volumeName, resources));
72+
}
73+
6274
public static Matcher<Iterable<? super V1Container>> hasInitContainerWithEnvVar(
6375
String name, String image, String serverName, V1EnvVar envVar, String... command) {
6476
return hasItem(createInitContainerWithEnvVar(name, image, serverName, envVar, command));
@@ -123,6 +135,19 @@ private static V1Container createAuxiliaryImageInitContainer(String name, String
123135
.env(PodHelperTestBase.getAuxiliaryImageEnvVariables(image, command, name));
124136
}
125137

138+
private static V1Container createAuxiliaryImageInitContainer(String name, String image, String imagePullPolicy,
139+
String command, String volumeName,
140+
V1ResourceRequirements resources) {
141+
return new V1Container().name(name).image(image).imagePullPolicy(imagePullPolicy)
142+
.command(Arrays.asList(AUXILIARY_IMAGE_INIT_CONTAINER_WRAPPER_SCRIPT)).args(null)
143+
.volumeMounts(Arrays.asList(
144+
new V1VolumeMount().name(AUXILIARY_IMAGE_VOLUME_NAME_PREFIX + volumeName)
145+
.mountPath(AUXILIARY_IMAGE_TARGET_PATH),
146+
new V1VolumeMount().name(SCRIPTS_VOLUME).mountPath(SCRIPTS_MOUNTS_PATH)))
147+
.resources(resources)
148+
.env(PodHelperTestBase.getAuxiliaryImageEnvVariables(image, command, name));
149+
}
150+
126151
private static V1Container createInitContainer(String name, String image, String serverName, String... command) {
127152
return new V1Container().name(name).image(image).command(Arrays.asList(command))
128153
.env(PodHelperTestBase.getPredefinedEnvVariables(serverName));

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import io.kubernetes.client.openapi.models.V1PodSecurityContext;
5050
import io.kubernetes.client.openapi.models.V1PodSpec;
5151
import io.kubernetes.client.openapi.models.V1Probe;
52+
import io.kubernetes.client.openapi.models.V1ResourceRequirements;
5253
import io.kubernetes.client.openapi.models.V1SecretKeySelector;
5354
import io.kubernetes.client.openapi.models.V1SecretReference;
5455
import io.kubernetes.client.openapi.models.V1SecurityContext;
@@ -895,6 +896,24 @@ void whenDomainHasAuxImagesWithCustomCommand_createPodsWithAuxImageInitContainer
895896
"wdt-image:v1", "IfNotPresent", CUSTOM_COMMAND_SCRIPT)));
896897
}
897898

899+
@Test
900+
void whenDomainHasAuxiliaryImagesWithResourceRequirements_createPodsWithAIInitContainerHavingResourceRequirements() {
901+
getConfigurator()
902+
.withLimitRequirement("cpu", "250m")
903+
.withRequestRequirement("memory", "1Gi")
904+
.withAuxiliaryImageVolumes(Collections.singletonList(
905+
new AuxiliaryImageVolume().mountPath(DEFAULT_AUXILIARY_IMAGE_PATH).name(TEST_VOLUME_NAME)))
906+
.withAuxiliaryImages(Collections.singletonList(getAuxiliaryImage("wdt-image:v1")
907+
.imagePullPolicy("ALWAYS")));
908+
909+
assertThat(getCreatedPodSpecInitContainers(),
910+
allOf(Matchers.hasAuxiliaryImageInitContainer(AUXILIARY_IMAGE_INIT_CONTAINER_NAME_PREFIX + 1,
911+
"wdt-image:v1", "ALWAYS", AUXILIARY_IMAGE_DEFAULT_INIT_CONTAINER_COMMAND,
912+
new V1ResourceRequirements()
913+
.limits(Collections.singletonMap("cpu", new Quantity("250m")))
914+
.requests(Collections.singletonMap("memory", new Quantity("1Gi"))))));
915+
}
916+
898917
@Test
899918
void whenDomainHasMultipleAuxiliaryImages_createPodsWithAuxiliaryImageInitContainersInCorrectOrder() {
900919
getConfigurator()

0 commit comments

Comments
 (0)