|
27 | 27 | import io.kubernetes.client.openapi.models.V1PodTemplateSpec;
|
28 | 28 | import io.kubernetes.client.openapi.models.V1SecurityContext;
|
29 | 29 | import io.kubernetes.client.openapi.models.V1Toleration;
|
| 30 | +import io.kubernetes.client.openapi.models.V1Volume; |
30 | 31 | import io.kubernetes.client.openapi.models.V1VolumeMount;
|
| 32 | +import oracle.kubernetes.operator.DomainSourceType; |
31 | 33 | import oracle.kubernetes.operator.JobAwaiterStepFactory;
|
32 | 34 | import oracle.kubernetes.operator.LabelConstants;
|
33 | 35 | import oracle.kubernetes.operator.ProcessingConstants;
|
|
57 | 59 | import static oracle.kubernetes.operator.DomainProcessorTestSetup.createTestDomain;
|
58 | 60 | import static oracle.kubernetes.operator.ProcessingConstants.DOMAIN_TOPOLOGY;
|
59 | 61 | import static oracle.kubernetes.operator.ProcessingConstants.JOBWATCHER_COMPONENT_NAME;
|
| 62 | +import static oracle.kubernetes.operator.helpers.Matchers.hasConfigMapVolume; |
60 | 63 | import static oracle.kubernetes.operator.helpers.Matchers.hasContainer;
|
61 | 64 | import static oracle.kubernetes.operator.helpers.Matchers.hasEnvVar;
|
62 | 65 | import static oracle.kubernetes.operator.helpers.Matchers.hasEnvVarRegEx;
|
| 66 | +import static oracle.kubernetes.operator.helpers.Matchers.hasSecretVolume; |
63 | 67 | import static oracle.kubernetes.operator.helpers.Matchers.hasVolumeMount;
|
64 | 68 | import static oracle.kubernetes.operator.helpers.PodHelperTestBase.createAffinity;
|
65 | 69 | import static oracle.kubernetes.operator.helpers.PodHelperTestBase.createConfigMapKeyRefEnvVar;
|
|
69 | 73 | import static oracle.kubernetes.operator.helpers.PodHelperTestBase.createSecretKeyRefEnvVar;
|
70 | 74 | import static oracle.kubernetes.operator.helpers.PodHelperTestBase.createSecurityContext;
|
71 | 75 | import static oracle.kubernetes.operator.helpers.PodHelperTestBase.createToleration;
|
| 76 | +import static oracle.kubernetes.operator.utils.ChecksumUtils.getMD5Hash; |
72 | 77 | import static org.hamcrest.CoreMatchers.equalTo;
|
73 | 78 | import static org.hamcrest.CoreMatchers.is;
|
74 | 79 | import static org.hamcrest.Matchers.allOf;
|
|
85 | 90 | public class JobHelperTest extends DomainValidationBaseTest {
|
86 | 91 | private static final String RAW_VALUE_1 = "find uid1 at $(DOMAIN_HOME)";
|
87 | 92 | private static final String END_VALUE_1 = "find uid1 at /u01/oracle/user_projects/domains";
|
| 93 | + protected static final String LONG_RESOURCE_NAME |
| 94 | + = "very-long-resource-name-very-long-resource-name-abcdefghi"; |
| 95 | + protected static final String SECOND_LONG_RESOURCE_NAME |
| 96 | + = "very-long-resource-name-very-long-resource-name-abcdefghijklmnopqrstuvwxyz"; |
88 | 97 |
|
89 | 98 | /**
|
90 | 99 | * OEVN is the name of an env var that contains a comma-separated list of oper supplied env var names.
|
91 | 100 | * It's used by the Model in Image introspector job to detect env var differences from the last
|
92 | 101 | * time the job ran.
|
93 | 102 | */
|
94 | 103 | private static final String OEVN = "OPERATOR_ENVVAR_NAMES";
|
| 104 | + public static final String SECRET_VOLUME_SUFFIX1 = "-volume-st-" + getMD5Hash(LONG_RESOURCE_NAME); |
| 105 | + public static final String SECRET_VOLUME_SUFFIX2 = "-volume-st-" + getMD5Hash(SECOND_LONG_RESOURCE_NAME); |
| 106 | + public static final String CM_VOLUME_SUFFIX1 = "-volume-cm-" + getMD5Hash(LONG_RESOURCE_NAME); |
| 107 | + public static final int MAX_ALLOWED_VOLUME_NAME_LENGTH = 63; |
| 108 | + public static final String VOLUME_NAME_FOR_LONG_SECRET_NAME = LONG_RESOURCE_NAME |
| 109 | + .substring(0, MAX_ALLOWED_VOLUME_NAME_LENGTH - SECRET_VOLUME_SUFFIX1.length()) + SECRET_VOLUME_SUFFIX1; |
| 110 | + public static final String VOLUME_NAME_FOR_SECOND_LONG_SECRET_NAME = SECOND_LONG_RESOURCE_NAME |
| 111 | + .substring(0, MAX_ALLOWED_VOLUME_NAME_LENGTH - SECRET_VOLUME_SUFFIX2.length()) + SECRET_VOLUME_SUFFIX2; |
| 112 | + public static final String VOLUME_NAME_FOR_LONG_CONFIG_MAP_NAME = LONG_RESOURCE_NAME |
| 113 | + .substring(0, MAX_ALLOWED_VOLUME_NAME_LENGTH - SECRET_VOLUME_SUFFIX1.length()) + CM_VOLUME_SUFFIX1; |
| 114 | + public static final int MODE_420 = 420; |
| 115 | + public static final int MODE_365 = 365; |
95 | 116 | private Method getDomainSpec;
|
96 | 117 | private final Domain domain = createTestDomain();
|
97 | 118 | private final DomainPresenceInfo domainPresenceInfo = createDomainPresenceInfo(domain);
|
@@ -462,6 +483,14 @@ private List<V1VolumeMount> getJobVolumeMounts() {
|
462 | 483 | .getVolumeMounts();
|
463 | 484 | }
|
464 | 485 |
|
| 486 | + private List<V1Volume> getJobVolumes() { |
| 487 | + return Optional.ofNullable(job.getSpec()) |
| 488 | + .map(V1JobSpec::getTemplate) |
| 489 | + .map(V1PodTemplateSpec::getSpec) |
| 490 | + .map(V1PodSpec::getVolumes) |
| 491 | + .orElseThrow(); |
| 492 | + } |
| 493 | + |
465 | 494 | @Test
|
466 | 495 | public void whenDomainHasAdditionalVolumesWithCustomVariables_createIntrospectorPodWithSubstitutions() {
|
467 | 496 | resourceLookup.defineResource(SECRET_NAME, KubernetesResourceType.Secret, NS);
|
@@ -500,6 +529,72 @@ public void whenDomainHasAdditionalVolumesWithCustomVariablesInvalidValue_jobNot
|
500 | 529 | assertThat(job, is(nullValue()));
|
501 | 530 | }
|
502 | 531 |
|
| 532 | + @Test |
| 533 | + public void whenDomainHasMultipleConfigOverrideSecretsWithLongNames_volumesCreatedWithShorterNames() { |
| 534 | + resourceLookup.defineResource(LONG_RESOURCE_NAME, KubernetesResourceType.Secret, NS); |
| 535 | + resourceLookup.defineResource(SECOND_LONG_RESOURCE_NAME, KubernetesResourceType.Secret, NS); |
| 536 | + |
| 537 | + configureDomain() |
| 538 | + .withConfigOverrideSecrets(LONG_RESOURCE_NAME, SECOND_LONG_RESOURCE_NAME); |
| 539 | + |
| 540 | + runCreateJob(); |
| 541 | + |
| 542 | + assertThat(getJobVolumes(), hasSecretVolume(VOLUME_NAME_FOR_LONG_SECRET_NAME, LONG_RESOURCE_NAME, MODE_420)); |
| 543 | + assertThat(getJobVolumes(), hasSecretVolume(VOLUME_NAME_FOR_SECOND_LONG_SECRET_NAME, |
| 544 | + SECOND_LONG_RESOURCE_NAME, MODE_420)); |
| 545 | + assertThat(getJobVolumeMounts(), hasVolumeMount(VOLUME_NAME_FOR_LONG_SECRET_NAME, |
| 546 | + "/weblogic-operator/config-overrides-secrets/" + LONG_RESOURCE_NAME, true)); |
| 547 | + assertThat(getJobVolumeMounts(), hasVolumeMount(VOLUME_NAME_FOR_SECOND_LONG_SECRET_NAME, |
| 548 | + "/weblogic-operator/config-overrides-secrets/" + SECOND_LONG_RESOURCE_NAME, true)); |
| 549 | + } |
| 550 | + |
| 551 | + @Test |
| 552 | + public void whenDomainHasConfigMapOverrideWithLongConfigMapName_volumeCreatedWithShorterName() { |
| 553 | + resourceLookup.defineResource(LONG_RESOURCE_NAME, KubernetesResourceType.ConfigMap, NS); |
| 554 | + |
| 555 | + configureDomain() |
| 556 | + .withConfigOverrides(LONG_RESOURCE_NAME); |
| 557 | + |
| 558 | + runCreateJob(); |
| 559 | + |
| 560 | + assertThat(getJobVolumes(), hasConfigMapVolume(VOLUME_NAME_FOR_LONG_CONFIG_MAP_NAME, LONG_RESOURCE_NAME, MODE_365)); |
| 561 | + assertThat(getJobVolumeMounts(), hasVolumeMount(VOLUME_NAME_FOR_LONG_CONFIG_MAP_NAME, |
| 562 | + "/weblogic-operator/config-overrides", true)); |
| 563 | + } |
| 564 | + |
| 565 | + @Test |
| 566 | + public void whenDomainHasModelConfigMapOverrideWithLongModelCMName_volumeCreatedWithShorterName() { |
| 567 | + resourceLookup.defineResource(LONG_RESOURCE_NAME, KubernetesResourceType.ConfigMap, NS); |
| 568 | + |
| 569 | + configureDomain() |
| 570 | + .withDomainHomeSourceType(DomainSourceType.FromModel) |
| 571 | + .withModelConfigMap(LONG_RESOURCE_NAME); |
| 572 | + |
| 573 | + runCreateJob(); |
| 574 | + |
| 575 | + assertThat(getJobVolumes(), hasConfigMapVolume(VOLUME_NAME_FOR_LONG_CONFIG_MAP_NAME, LONG_RESOURCE_NAME, MODE_365)); |
| 576 | + assertThat(getJobVolumeMounts(), hasVolumeMount(VOLUME_NAME_FOR_LONG_CONFIG_MAP_NAME, |
| 577 | + "/weblogic-operator/wdt-config-map", true)); |
| 578 | + } |
| 579 | + |
| 580 | + @Test |
| 581 | + public void whenDomainHasMultipleConfigOverrideSecretsWithLongAndShortNames_volumeCreatedWithCorrectNames() { |
| 582 | + resourceLookup.defineResource(SECRET_NAME, KubernetesResourceType.Secret, NS); |
| 583 | + resourceLookup.defineResource(LONG_RESOURCE_NAME, KubernetesResourceType.Secret, NS); |
| 584 | + |
| 585 | + configureDomain() |
| 586 | + .withConfigOverrideSecrets(SECRET_NAME, LONG_RESOURCE_NAME); |
| 587 | + |
| 588 | + runCreateJob(); |
| 589 | + |
| 590 | + assertThat(getJobVolumes(), hasSecretVolume(SECRET_NAME + "-volume", SECRET_NAME, MODE_420)); |
| 591 | + assertThat(getJobVolumes(), hasSecretVolume(VOLUME_NAME_FOR_LONG_SECRET_NAME, LONG_RESOURCE_NAME, MODE_420)); |
| 592 | + assertThat(getJobVolumeMounts(), hasVolumeMount(SECRET_NAME + "-volume", |
| 593 | + "/weblogic-operator/config-overrides-secrets/" + SECRET_NAME, true)); |
| 594 | + assertThat(getJobVolumeMounts(), hasVolumeMount(VOLUME_NAME_FOR_LONG_SECRET_NAME, |
| 595 | + "/weblogic-operator/config-overrides-secrets/" + LONG_RESOURCE_NAME, true)); |
| 596 | + } |
| 597 | + |
503 | 598 | @Test
|
504 | 599 | public void verify_introspectorPodSpec_activeDeadlineSeconds_initial_values() {
|
505 | 600 | V1JobSpec jobSpec = createJobSpec();
|
|
0 commit comments