From a1782bf7bae7d4dead93d3b80c93c15798ac1493 Mon Sep 17 00:00:00 2001 From: Eric Wittmann Date: Tue, 28 Jan 2025 12:25:11 -0500 Subject: [PATCH 1/3] Support for JAVA_OPTS_APPEND when creating app deployment --- .../operator/EnvironmentVariables.java | 1 + .../resource/app/AppDeploymentResource.java | 12 ++ .../operator/utils/JavaOptsAppend.java | 137 ++++++++++++++++++ .../operator/unit/JavaOptsAppendTest.java | 96 ++++++++++++ 4 files changed, 246 insertions(+) create mode 100644 operator/controller/src/main/java/io/apicurio/registry/operator/utils/JavaOptsAppend.java create mode 100644 operator/controller/src/test/java/io/apicurio/registry/operator/unit/JavaOptsAppendTest.java diff --git a/operator/controller/src/main/java/io/apicurio/registry/operator/EnvironmentVariables.java b/operator/controller/src/main/java/io/apicurio/registry/operator/EnvironmentVariables.java index 2496fbfe97..c4f05ec35a 100644 --- a/operator/controller/src/main/java/io/apicurio/registry/operator/EnvironmentVariables.java +++ b/operator/controller/src/main/java/io/apicurio/registry/operator/EnvironmentVariables.java @@ -1,6 +1,7 @@ package io.apicurio.registry.operator; public class EnvironmentVariables { + public static final String JAVA_OPTS_APPEND = "JAVA_OPTS_APPEND"; public static final String QUARKUS_PROFILE = "QUARKUS_PROFILE"; public static final String QUARKUS_HTTP_ACCESS_LOG_ENABLED = "QUARKUS_HTTP_ACCESS_LOG_ENABLED"; diff --git a/operator/controller/src/main/java/io/apicurio/registry/operator/resource/app/AppDeploymentResource.java b/operator/controller/src/main/java/io/apicurio/registry/operator/resource/app/AppDeploymentResource.java index 374cc55683..56ab9c98e2 100644 --- a/operator/controller/src/main/java/io/apicurio/registry/operator/resource/app/AppDeploymentResource.java +++ b/operator/controller/src/main/java/io/apicurio/registry/operator/resource/app/AppDeploymentResource.java @@ -12,6 +12,7 @@ import io.apicurio.registry.operator.feat.KafkaSql; import io.apicurio.registry.operator.feat.PostgresSql; import io.apicurio.registry.operator.feat.security.Auth; +import io.apicurio.registry.operator.utils.JavaOptsAppend; import io.fabric8.kubernetes.api.model.Container; import io.fabric8.kubernetes.api.model.EnvVar; import io.fabric8.kubernetes.api.model.EnvVarBuilder; @@ -54,6 +55,14 @@ protected Deployment desired(ApicurioRegistry3 primary, Context env.forEach(e -> envVars.put(e.getName(), e))); + // Handling of JAVA_OPTS_APPEND env var - we will merge whatever we find in the CR + // with whatever we might set ourselves in the logic of the operator. + var javaOptsAppend = new JavaOptsAppend(); + if (envVars.containsKey(EnvironmentVariables.JAVA_OPTS_APPEND)) { + javaOptsAppend.setOptsFromEnvVar(envVars.get(EnvironmentVariables.JAVA_OPTS_APPEND).getValue()); + envVars.remove(EnvironmentVariables.JAVA_OPTS_APPEND); + } + addEnvVar(envVars, new EnvVarBuilder().withName(EnvironmentVariables.QUARKUS_PROFILE).withValue("prod").build()); addEnvVar(envVars, new EnvVarBuilder().withName(EnvironmentVariables.QUARKUS_HTTP_ACCESS_LOG_ENABLED).withValue("true").build()); @@ -104,6 +113,9 @@ protected Deployment desired(ApicurioRegistry3 primary, Context opts = new TreeSet<>(); + + /** + * Called to set the initial value of the ENV var using an existing + * value, typically configured in the "env" section of the CR. This + * will be a value set by the app deployer, with runtime options + * they want to have enabled. + */ + public void setOptsFromEnvVar(String value) { + opts.clear(); + if (value != null && !value.trim().isEmpty()) { + opts.addAll(Set.of(value.split(" "))); + } + } + + /** + * Converts this object into an {@link EnvVar} instance. + */ + public EnvVar toEnvVar() { + EnvVarBuilder builder = new EnvVarBuilder(); + return builder + .withName(EnvironmentVariables.JAVA_OPTS_APPEND) + .withValue(String.join(" ", opts)) + .build(); + } + + /** + * Add another option. If the option already exists, do nothing. Whether the + * option already exists may depend on the option. Custom logic may be needed + * to properly support certain options. + */ + public void addOpt(String optValue) { + if (!containsOpt(optValue)) { + opts.add(optValue); + } + } + + /** + * Returns 'true' if there are no options set. + */ + public boolean isEmpty() { + return opts.isEmpty(); + } + + /** + * Returns 'true' if the option already exists. The logic for whether an option + * already exists depends on the option. + */ + public boolean containsOpt(String optValue) { + if (optValue == null || optValue.trim().isEmpty()) { + return false; + } + if (optValue.startsWith("-D") || optValue.startsWith("-XX:")) { + return containsValuedParameter(optValue); + } + if (optValue.startsWith("-Xms")) { + return containsXms(); + } + if (optValue.startsWith("-Xmx")) { + return containsXmx(); + } + if (optValue.startsWith("-javaagent:")) { + return containsJavaAgent(); + } + if (optValue.startsWith("-agentlib:")) { + return containsAgentLib(); + } + return opts.contains(optValue); + } + + /** + * Returns 'true' if an option with the given prefix already exists. + */ + public boolean containsOptByPrefix(String prefix) { + return this.opts.stream().anyMatch(s -> s.startsWith(prefix)); + } + + /** + * Checks if an option of one of the following form exists already: + *
    + *
  • -Dmy.property.name=foo
  • + *
  • -XX:OptionName=bar
  • + *
+ * Looks for another option with the same name but potentially different value. + */ + private boolean containsValuedParameter(String optValue) { + if (optValue.contains("=")) { + String prefix = optValue.substring(0, optValue.indexOf("=")); + return containsOptByPrefix(prefix); + } + return opts.contains(optValue); + } + + /** + * Checks for an option of the form "-Xms512m". + */ + private boolean containsXms() { + return containsOptByPrefix("-Xms"); + } + + /** + * Checks for an option of the form "-Xmx1024m". + */ + private boolean containsXmx() { + return containsOptByPrefix("-Xmx"); + } + + /** + * Checks for an option of the form "-javaagent:/path/to/agent.jar" + */ + private boolean containsJavaAgent() { + return containsOptByPrefix("-javaagent:"); + } + + /** + * Checks for an option of the form "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005" + */ + private boolean containsAgentLib() { + return containsOptByPrefix("-agentlib:"); + } + +} diff --git a/operator/controller/src/test/java/io/apicurio/registry/operator/unit/JavaOptsAppendTest.java b/operator/controller/src/test/java/io/apicurio/registry/operator/unit/JavaOptsAppendTest.java new file mode 100644 index 0000000000..9992986a80 --- /dev/null +++ b/operator/controller/src/test/java/io/apicurio/registry/operator/unit/JavaOptsAppendTest.java @@ -0,0 +1,96 @@ +package io.apicurio.registry.operator.unit; + +import io.apicurio.registry.operator.EnvironmentVariables; +import io.apicurio.registry.operator.utils.JavaOptsAppend; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +public class JavaOptsAppendTest { + + @Test + public void testJavaOpts_Empty() throws Exception { + JavaOptsAppend optsAppend = new JavaOptsAppend(); + Assertions.assertThat(optsAppend.isEmpty()).isTrue(); + Assertions.assertThat(optsAppend.toEnvVar()).isNotNull(); + Assertions.assertThat(optsAppend.toEnvVar().getName()).isEqualTo(EnvironmentVariables.JAVA_OPTS_APPEND); + Assertions.assertThat(optsAppend.toEnvVar().getValue()).isEqualTo(""); + } + + @Test + public void testJavaOpts_EmptyEnvVar() throws Exception { + JavaOptsAppend optsAppend = new JavaOptsAppend(); + optsAppend.setOptsFromEnvVar(""); + Assertions.assertThat(optsAppend.isEmpty()).isTrue(); + Assertions.assertThat(optsAppend.toEnvVar()).isNotNull(); + Assertions.assertThat(optsAppend.toEnvVar().getName()).isEqualTo(EnvironmentVariables.JAVA_OPTS_APPEND); + Assertions.assertThat(optsAppend.toEnvVar().getValue()).isEqualTo(""); + } + + @Test + public void testJavaOpts_EnvVar() throws Exception { + JavaOptsAppend optsAppend = new JavaOptsAppend(); + optsAppend.setOptsFromEnvVar("-Xms512m -Xmx1g -XX:+UseG1GC -Dspring.profiles.active=prod"); + Assertions.assertThat(optsAppend.isEmpty()).isFalse(); + Assertions.assertThat(optsAppend.toEnvVar()).isNotNull(); + Assertions.assertThat(optsAppend.toEnvVar().getName()).isEqualTo(EnvironmentVariables.JAVA_OPTS_APPEND); + Assertions.assertThat(optsAppend.toEnvVar().getValue()).isEqualTo("-Dspring.profiles.active=prod -XX:+UseG1GC -Xms512m -Xmx1g"); + } + + @Test + public void testJavaOpts_EnvVarWithAdds() throws Exception { + JavaOptsAppend optsAppend = new JavaOptsAppend(); + optsAppend.setOptsFromEnvVar("-Xms512m -Xmx1g"); + optsAppend.addOpt("-XX:+UseG1GC"); + optsAppend.addOpt("-Dspring.profiles.active=prod"); + Assertions.assertThat(optsAppend.isEmpty()).isFalse(); + Assertions.assertThat(optsAppend.toEnvVar()).isNotNull(); + Assertions.assertThat(optsAppend.toEnvVar().getName()).isEqualTo(EnvironmentVariables.JAVA_OPTS_APPEND); + Assertions.assertThat(optsAppend.toEnvVar().getValue()).isEqualTo("-Dspring.profiles.active=prod -XX:+UseG1GC -Xms512m -Xmx1g"); + } + + @Test + public void testJavaOpts_ParamConflict() throws Exception { + JavaOptsAppend optsAppend = new JavaOptsAppend(); + optsAppend.addOpt("-Dspring.profiles.active=prod"); + optsAppend.addOpt("-Dspring.profiles.active=dev"); + Assertions.assertThat(optsAppend.toEnvVar().getValue()).isEqualTo("-Dspring.profiles.active=prod"); + + optsAppend = new JavaOptsAppend(); + optsAppend.addOpt("-XX:ReservedCodeCacheSize=128m"); + optsAppend.addOpt("-XX:ReservedCodeCacheSize=256m"); + Assertions.assertThat(optsAppend.toEnvVar().getValue()).isEqualTo("-XX:ReservedCodeCacheSize=128m"); + + optsAppend = new JavaOptsAppend(); + optsAppend.addOpt("-XX:ReservedCodeCacheSize=128m"); + optsAppend.addOpt("-XX:ReservedCodeCacheSize=256m"); + optsAppend.addOpt("-XX:+HeapDumpOnOutOfMemoryError"); + optsAppend.addOpt("-XX:+HeapDumpOnOutOfMemoryError"); + optsAppend.addOpt("-XX:HeapDumpPath=/path/to/dumps/"); + optsAppend.addOpt("-XX:HeapDumpPath=/path/to/other-dumps/"); + Assertions.assertThat(optsAppend.toEnvVar().getValue()).isEqualTo("-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dumps/ -XX:ReservedCodeCacheSize=128m"); + + optsAppend = new JavaOptsAppend(); + optsAppend.setOptsFromEnvVar("-XX:ReservedCodeCacheSize=128m -XX:+HeapDumpOnOutOfMemoryError"); + optsAppend.addOpt("-XX:ReservedCodeCacheSize=256m"); + optsAppend.addOpt("-XX:+HeapDumpOnOutOfMemoryError"); + optsAppend.addOpt("-XX:HeapDumpPath=/path/to/dumps/"); + optsAppend.addOpt("-XX:HeapDumpPath=/path/to/other-dumps/"); + Assertions.assertThat(optsAppend.toEnvVar().getValue()).isEqualTo("-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dumps/ -XX:ReservedCodeCacheSize=128m"); + } + + @Test + public void testJavaOpts_Conflicts() throws Exception { + JavaOptsAppend optsAppend = new JavaOptsAppend(); + optsAppend.setOptsFromEnvVar("-Xms512m -Xmx1g -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005"); + optsAppend.addOpt("-Xms256m"); + optsAppend.addOpt("-Xmx2g"); + optsAppend.addOpt("-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:12345"); + optsAppend.addOpt("-javaagent:/path/to/agent.jar"); + optsAppend.addOpt("-javaagent:/path/to/alt_agent.jar"); + Assertions.assertThat(optsAppend.isEmpty()).isFalse(); + Assertions.assertThat(optsAppend.toEnvVar()).isNotNull(); + Assertions.assertThat(optsAppend.toEnvVar().getName()).isEqualTo(EnvironmentVariables.JAVA_OPTS_APPEND); + Assertions.assertThat(optsAppend.toEnvVar().getValue()).isEqualTo("-Xms512m -Xmx1g -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -javaagent:/path/to/agent.jar"); + } + +} From 98b34bfac2605a007a995f955e77445462b942b2 Mon Sep 17 00:00:00 2001 From: Eric Wittmann Date: Tue, 28 Jan 2025 12:26:58 -0500 Subject: [PATCH 2/3] spotless:apply --- .../operator/utils/JavaOptsAppend.java | 28 +++++++--------- .../operator/unit/JavaOptsAppendTest.java | 33 ++++++++++++------- 2 files changed, 34 insertions(+), 27 deletions(-) diff --git a/operator/controller/src/main/java/io/apicurio/registry/operator/utils/JavaOptsAppend.java b/operator/controller/src/main/java/io/apicurio/registry/operator/utils/JavaOptsAppend.java index b6a29334fe..205071e127 100644 --- a/operator/controller/src/main/java/io/apicurio/registry/operator/utils/JavaOptsAppend.java +++ b/operator/controller/src/main/java/io/apicurio/registry/operator/utils/JavaOptsAppend.java @@ -8,18 +8,17 @@ import java.util.TreeSet; /** - * Models the value of the JAVA_OPTS_APPEND environment variable. This is - * a convenient way to merge values and handle conflicts. + * Models the value of the JAVA_OPTS_APPEND environment variable. This is a convenient way to merge values and + * handle conflicts. */ public class JavaOptsAppend { private final Set opts = new TreeSet<>(); /** - * Called to set the initial value of the ENV var using an existing - * value, typically configured in the "env" section of the CR. This - * will be a value set by the app deployer, with runtime options - * they want to have enabled. + * Called to set the initial value of the ENV var using an existing value, typically configured in the + * "env" section of the CR. This will be a value set by the app deployer, with runtime options they want + * to have enabled. */ public void setOptsFromEnvVar(String value) { opts.clear(); @@ -33,16 +32,13 @@ public void setOptsFromEnvVar(String value) { */ public EnvVar toEnvVar() { EnvVarBuilder builder = new EnvVarBuilder(); - return builder - .withName(EnvironmentVariables.JAVA_OPTS_APPEND) - .withValue(String.join(" ", opts)) + return builder.withName(EnvironmentVariables.JAVA_OPTS_APPEND).withValue(String.join(" ", opts)) .build(); } /** - * Add another option. If the option already exists, do nothing. Whether the - * option already exists may depend on the option. Custom logic may be needed - * to properly support certain options. + * Add another option. If the option already exists, do nothing. Whether the option already exists may + * depend on the option. Custom logic may be needed to properly support certain options. */ public void addOpt(String optValue) { if (!containsOpt(optValue)) { @@ -58,8 +54,8 @@ public boolean isEmpty() { } /** - * Returns 'true' if the option already exists. The logic for whether an option - * already exists depends on the option. + * Returns 'true' if the option already exists. The logic for whether an option already exists depends on + * the option. */ public boolean containsOpt(String optValue) { if (optValue == null || optValue.trim().isEmpty()) { @@ -93,8 +89,8 @@ public boolean containsOptByPrefix(String prefix) { /** * Checks if an option of one of the following form exists already: *
    - *
  • -Dmy.property.name=foo
  • - *
  • -XX:OptionName=bar
  • + *
  • -Dmy.property.name=foo
  • + *
  • -XX:OptionName=bar
  • *
* Looks for another option with the same name but potentially different value. */ diff --git a/operator/controller/src/test/java/io/apicurio/registry/operator/unit/JavaOptsAppendTest.java b/operator/controller/src/test/java/io/apicurio/registry/operator/unit/JavaOptsAppendTest.java index 9992986a80..0982279c62 100644 --- a/operator/controller/src/test/java/io/apicurio/registry/operator/unit/JavaOptsAppendTest.java +++ b/operator/controller/src/test/java/io/apicurio/registry/operator/unit/JavaOptsAppendTest.java @@ -12,7 +12,8 @@ public void testJavaOpts_Empty() throws Exception { JavaOptsAppend optsAppend = new JavaOptsAppend(); Assertions.assertThat(optsAppend.isEmpty()).isTrue(); Assertions.assertThat(optsAppend.toEnvVar()).isNotNull(); - Assertions.assertThat(optsAppend.toEnvVar().getName()).isEqualTo(EnvironmentVariables.JAVA_OPTS_APPEND); + Assertions.assertThat(optsAppend.toEnvVar().getName()) + .isEqualTo(EnvironmentVariables.JAVA_OPTS_APPEND); Assertions.assertThat(optsAppend.toEnvVar().getValue()).isEqualTo(""); } @@ -22,7 +23,8 @@ public void testJavaOpts_EmptyEnvVar() throws Exception { optsAppend.setOptsFromEnvVar(""); Assertions.assertThat(optsAppend.isEmpty()).isTrue(); Assertions.assertThat(optsAppend.toEnvVar()).isNotNull(); - Assertions.assertThat(optsAppend.toEnvVar().getName()).isEqualTo(EnvironmentVariables.JAVA_OPTS_APPEND); + Assertions.assertThat(optsAppend.toEnvVar().getName()) + .isEqualTo(EnvironmentVariables.JAVA_OPTS_APPEND); Assertions.assertThat(optsAppend.toEnvVar().getValue()).isEqualTo(""); } @@ -32,8 +34,10 @@ public void testJavaOpts_EnvVar() throws Exception { optsAppend.setOptsFromEnvVar("-Xms512m -Xmx1g -XX:+UseG1GC -Dspring.profiles.active=prod"); Assertions.assertThat(optsAppend.isEmpty()).isFalse(); Assertions.assertThat(optsAppend.toEnvVar()).isNotNull(); - Assertions.assertThat(optsAppend.toEnvVar().getName()).isEqualTo(EnvironmentVariables.JAVA_OPTS_APPEND); - Assertions.assertThat(optsAppend.toEnvVar().getValue()).isEqualTo("-Dspring.profiles.active=prod -XX:+UseG1GC -Xms512m -Xmx1g"); + Assertions.assertThat(optsAppend.toEnvVar().getName()) + .isEqualTo(EnvironmentVariables.JAVA_OPTS_APPEND); + Assertions.assertThat(optsAppend.toEnvVar().getValue()) + .isEqualTo("-Dspring.profiles.active=prod -XX:+UseG1GC -Xms512m -Xmx1g"); } @Test @@ -44,8 +48,10 @@ public void testJavaOpts_EnvVarWithAdds() throws Exception { optsAppend.addOpt("-Dspring.profiles.active=prod"); Assertions.assertThat(optsAppend.isEmpty()).isFalse(); Assertions.assertThat(optsAppend.toEnvVar()).isNotNull(); - Assertions.assertThat(optsAppend.toEnvVar().getName()).isEqualTo(EnvironmentVariables.JAVA_OPTS_APPEND); - Assertions.assertThat(optsAppend.toEnvVar().getValue()).isEqualTo("-Dspring.profiles.active=prod -XX:+UseG1GC -Xms512m -Xmx1g"); + Assertions.assertThat(optsAppend.toEnvVar().getName()) + .isEqualTo(EnvironmentVariables.JAVA_OPTS_APPEND); + Assertions.assertThat(optsAppend.toEnvVar().getValue()) + .isEqualTo("-Dspring.profiles.active=prod -XX:+UseG1GC -Xms512m -Xmx1g"); } @Test @@ -67,7 +73,8 @@ public void testJavaOpts_ParamConflict() throws Exception { optsAppend.addOpt("-XX:+HeapDumpOnOutOfMemoryError"); optsAppend.addOpt("-XX:HeapDumpPath=/path/to/dumps/"); optsAppend.addOpt("-XX:HeapDumpPath=/path/to/other-dumps/"); - Assertions.assertThat(optsAppend.toEnvVar().getValue()).isEqualTo("-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dumps/ -XX:ReservedCodeCacheSize=128m"); + Assertions.assertThat(optsAppend.toEnvVar().getValue()).isEqualTo( + "-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dumps/ -XX:ReservedCodeCacheSize=128m"); optsAppend = new JavaOptsAppend(); optsAppend.setOptsFromEnvVar("-XX:ReservedCodeCacheSize=128m -XX:+HeapDumpOnOutOfMemoryError"); @@ -75,13 +82,15 @@ public void testJavaOpts_ParamConflict() throws Exception { optsAppend.addOpt("-XX:+HeapDumpOnOutOfMemoryError"); optsAppend.addOpt("-XX:HeapDumpPath=/path/to/dumps/"); optsAppend.addOpt("-XX:HeapDumpPath=/path/to/other-dumps/"); - Assertions.assertThat(optsAppend.toEnvVar().getValue()).isEqualTo("-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dumps/ -XX:ReservedCodeCacheSize=128m"); + Assertions.assertThat(optsAppend.toEnvVar().getValue()).isEqualTo( + "-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dumps/ -XX:ReservedCodeCacheSize=128m"); } @Test public void testJavaOpts_Conflicts() throws Exception { JavaOptsAppend optsAppend = new JavaOptsAppend(); - optsAppend.setOptsFromEnvVar("-Xms512m -Xmx1g -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005"); + optsAppend.setOptsFromEnvVar( + "-Xms512m -Xmx1g -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005"); optsAppend.addOpt("-Xms256m"); optsAppend.addOpt("-Xmx2g"); optsAppend.addOpt("-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:12345"); @@ -89,8 +98,10 @@ public void testJavaOpts_Conflicts() throws Exception { optsAppend.addOpt("-javaagent:/path/to/alt_agent.jar"); Assertions.assertThat(optsAppend.isEmpty()).isFalse(); Assertions.assertThat(optsAppend.toEnvVar()).isNotNull(); - Assertions.assertThat(optsAppend.toEnvVar().getName()).isEqualTo(EnvironmentVariables.JAVA_OPTS_APPEND); - Assertions.assertThat(optsAppend.toEnvVar().getValue()).isEqualTo("-Xms512m -Xmx1g -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -javaagent:/path/to/agent.jar"); + Assertions.assertThat(optsAppend.toEnvVar().getName()) + .isEqualTo(EnvironmentVariables.JAVA_OPTS_APPEND); + Assertions.assertThat(optsAppend.toEnvVar().getValue()).isEqualTo( + "-Xms512m -Xmx1g -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -javaagent:/path/to/agent.jar"); } } From 0c7271913c82f3b02e79f669c609eba81d3607bd Mon Sep 17 00:00:00 2001 From: Eric Wittmann Date: Thu, 13 Feb 2025 11:44:36 -0500 Subject: [PATCH 3/3] Reduce wait times and only add JAVA_OPTS_APPEND to the list of env vars if it has a value --- .../resource/app/AppDeploymentResource.java | 4 +++- .../apicurio/registry/operator/it/ITBase.java | 18 +++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/operator/controller/src/main/java/io/apicurio/registry/operator/resource/app/AppDeploymentResource.java b/operator/controller/src/main/java/io/apicurio/registry/operator/resource/app/AppDeploymentResource.java index 56ab9c98e2..75027e8e51 100644 --- a/operator/controller/src/main/java/io/apicurio/registry/operator/resource/app/AppDeploymentResource.java +++ b/operator/controller/src/main/java/io/apicurio/registry/operator/resource/app/AppDeploymentResource.java @@ -114,7 +114,9 @@ protected Deployment desired(ApicurioRegistry3 primary, Context { + await().atMost(Duration.ofSeconds(30)).ignoreExceptions().untilAsserted(() -> { assertThat(client.apps().deployments() .withName(primary.getMetadata().getName() + "-" + component + "-deployment").get() .getStatus().getReadyReplicas()).isEqualTo(replicas); @@ -126,7 +126,7 @@ protected static void checkDeploymentExists(ApicurioRegistry3 primary, String co } protected static void checkDeploymentDoesNotExist(ApicurioRegistry3 primary, String component) { - await().ignoreExceptions().untilAsserted(() -> { + await().atMost(Duration.ofSeconds(30)).ignoreExceptions().untilAsserted(() -> { assertThat(client.apps().deployments() .withName(primary.getMetadata().getName() + "-" + component + "-deployment").get()) .isNull(); @@ -134,7 +134,7 @@ protected static void checkDeploymentDoesNotExist(ApicurioRegistry3 primary, Str } protected static void checkServiceExists(ApicurioRegistry3 primary, String component) { - await().ignoreExceptions().untilAsserted(() -> { + await().atMost(Duration.ofSeconds(30)).ignoreExceptions().untilAsserted(() -> { assertThat(client.services() .withName(primary.getMetadata().getName() + "-" + component + "-service").get()) .isNotNull(); @@ -142,14 +142,14 @@ protected static void checkServiceExists(ApicurioRegistry3 primary, String compo } protected static void checkServiceDoesNotExist(ApicurioRegistry3 primary, String component) { - await().ignoreExceptions().untilAsserted(() -> { + await().atMost(Duration.ofSeconds(30)).ignoreExceptions().untilAsserted(() -> { assertThat(client.services() .withName(primary.getMetadata().getName() + "-" + component + "-service").get()).isNull(); }); } protected static void checkIngressExists(ApicurioRegistry3 primary, String component) { - await().ignoreExceptions().untilAsserted(() -> { + await().atMost(Duration.ofSeconds(30)).ignoreExceptions().untilAsserted(() -> { assertThat(client.network().v1().ingresses() .withName(primary.getMetadata().getName() + "-" + component + "-ingress").get()) .isNotNull(); @@ -157,7 +157,7 @@ protected static void checkIngressExists(ApicurioRegistry3 primary, String compo } protected static void checkIngressDoesNotExist(ApicurioRegistry3 primary, String component) { - await().ignoreExceptions().untilAsserted(() -> { + await().atMost(Duration.ofSeconds(30)).ignoreExceptions().untilAsserted(() -> { assertThat(client.network().v1().ingresses() .withName(primary.getMetadata().getName() + "-" + component + "-ingress").get()).isNull(); }); @@ -167,7 +167,7 @@ protected static PodDisruptionBudget checkPodDisruptionBudgetExists(ApicurioRegi String component) { final ValueOrNull rval = new ValueOrNull<>(); - await().ignoreExceptions().untilAsserted(() -> { + await().atMost(Duration.ofSeconds(30)).ignoreExceptions().untilAsserted(() -> { PodDisruptionBudget pdb = client.policy().v1().podDisruptionBudget() .withName(primary.getMetadata().getName() + "-" + component + "-poddisruptionbudget") .get(); @@ -181,7 +181,7 @@ protected static PodDisruptionBudget checkPodDisruptionBudgetExists(ApicurioRegi protected static NetworkPolicy checkNetworkPolicyExists(ApicurioRegistry3 primary, String component) { final ValueOrNull rval = new ValueOrNull<>(); - await().ignoreExceptions().untilAsserted(() -> { + await().atMost(Duration.ofSeconds(30)).ignoreExceptions().untilAsserted(() -> { NetworkPolicy networkPolicy = client.network().v1().networkPolicies() .withName(primary.getMetadata().getName() + "-" + component + "-networkpolicy").get(); assertThat(networkPolicy).isNotNull(); @@ -220,7 +220,7 @@ private static void createTestResources() throws Exception { private static void startOperatorLogs() { List operatorPods = new ArrayList<>(); - await().ignoreExceptions().untilAsserted(() -> { + await().atMost(Duration.ofSeconds(30)).ignoreExceptions().untilAsserted(() -> { operatorPods.clear(); operatorPods.addAll(client.pods() .withLabels(Map.of(