Skip to content

Commit 257126c

Browse files
authored
fix(tests): stablise sporadically failing OperatorChangeDetectionST (kroxylicious#3215)
why: the test's attempt to update the CR raced with the operator's update to the same resource's status section. This meant the optimistic lock (resourceVersion) used during the update could fail with Conflict, leading to the sporadically failing test. Refactoring the test to use replaceResourceWithRetries rather than createOrUpdateResourceWithWait with should resolve the issue. This is already the approach taken by several other tests in the same suite. Signed-off-by: Keith Wall <kwall@apache.org>
1 parent 8b763d9 commit 257126c

1 file changed

Lines changed: 21 additions & 36 deletions

File tree

kroxylicious-systemtests/src/test/java/io/kroxylicious/systemtests/OperatorChangeDetectionST.java

Lines changed: 21 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,13 @@
4242
import io.kroxylicious.kubernetes.api.common.FilterRef;
4343
import io.kroxylicious.kubernetes.api.common.FilterRefBuilder;
4444
import io.kroxylicious.kubernetes.api.common.Protocol;
45-
import io.kroxylicious.kubernetes.api.v1alpha1.KafkaProtocolFilter;
4645
import io.kroxylicious.kubernetes.api.v1alpha1.KafkaProtocolFilterBuilder;
4746
import io.kroxylicious.kubernetes.api.v1alpha1.KafkaProxy;
48-
import io.kroxylicious.kubernetes.api.v1alpha1.KafkaProxyBuilder;
4947
import io.kroxylicious.kubernetes.api.v1alpha1.KafkaProxyIngress;
5048
import io.kroxylicious.kubernetes.api.v1alpha1.KafkaProxyIngressBuilder;
5149
import io.kroxylicious.kubernetes.api.v1alpha1.VirtualKafkaCluster;
5250
import io.kroxylicious.kubernetes.api.v1alpha1.VirtualKafkaClusterBuilder;
51+
import io.kroxylicious.kubernetes.api.v1alpha1.kafkaproxyspec.InfrastructureBuilder;
5352
import io.kroxylicious.kubernetes.operator.assertj.OperatorAssertions;
5453
import io.kroxylicious.systemtests.installation.kroxylicious.CertManager;
5554
import io.kroxylicious.systemtests.installation.kroxylicious.Kroxylicious;
@@ -184,31 +183,23 @@ void shouldUpdateDeploymentWhenDownstreamTrustUpdated(String namespace) {
184183
void shouldUpdateWhenFilterConfigurationChanges(String namespace) {
185184
// Given
186185
// @formatter:off
187-
KafkaProtocolFilterBuilder arbitraryFilter = KroxyliciousFilterTemplates.baseFilterDeployment(namespace, "arbitrary-filter")
186+
var arbitraryFilterBuilder = KroxyliciousFilterTemplates.baseFilterDeployment(namespace, "arbitrary-filter")
188187
.withNewSpec()
189188
.withType("io.kroxylicious.filter.simpletransform.ProduceRequestTransformation")
190189
.withConfigTemplate(Map.of("transformation", "Replacing", "transformationConfig", Map.of("findPattern", "foo", "replacementValue", "bar")))
191190
.endSpec();
192191
// @formatter:on
193-
KubeClient kubeClient = kubeClient(namespace);
194-
resourceManager.createOrUpdateResourceWithWait(arbitraryFilter);
192+
resourceManager.createOrUpdateResourceWithWait(arbitraryFilterBuilder);
195193
kroxylicious.deployPortIdentifiesNodeWithFilters(kafkaClusterName, List.of("arbitrary-filter"));
196194

197-
String originalChecksum = getInitialChecksum(namespace);
198-
199-
// @formatter:off
200-
KafkaProtocolFilterBuilder updatedProtocolFilter = kubeClient.getClient().resources(KafkaProtocolFilter.class)
201-
.inNamespace(namespace)
202-
.withName("arbitrary-filter")
203-
.get()
204-
.edit()
205-
.editSpec()
206-
.withConfigTemplate(Map.of("transformation", "Replacing", "transformationConfig", Map.of("findPattern", "foo", "replacementValue", "updated")))
207-
.endSpec();
208-
// @formatter:on
195+
var originalChecksum = getInitialChecksum(namespace);
196+
var arbitraryFilter = arbitraryFilterBuilder.build();
197+
var replacementConfig = Map.of("transformation", "Replacing", "transformationConfig", Map.of("findPattern", "foo", "replacementValue", "updated"));
209198

210199
// When
211-
resourceManager.createOrUpdateResourceWithWait(updatedProtocolFilter);
200+
resourceManager.replaceResourceWithRetries(arbitraryFilter, current -> {
201+
current.getSpec().setConfigTemplate(replacementConfig);
202+
});
212203
LOGGER.info("Kafka proxy filter updated");
213204

214205
// Then
@@ -227,21 +218,20 @@ void shouldUpdateDeploymentWhenResourceRequirementsChange(String namespace) {
227218
var customResourceRequests = Map.of("cpu", Quantity.parse("599m"), "memory", Quantity.parse("515Mi"));
228219

229220
// @formatter:off
230-
KafkaProxyBuilder updatedKafkaProxy = kafkaProxy.edit()
231-
.editOrNewSpec()
232-
.withNewInfrastructure()
221+
var infra = new InfrastructureBuilder()
233222
.withNewProxyContainer()
234223
.withResources(new ResourceRequirementsBuilder()
235-
.withLimits(customResourceLimits)
236-
.withRequests(customResourceRequests)
237-
.build())
238-
.endProxyContainer()
239-
.endInfrastructure()
240-
.endSpec();
224+
.withLimits(customResourceLimits)
225+
.withRequests(customResourceRequests)
226+
.build())
227+
.endProxyContainer()
228+
.build();
241229
// @formatter:on
242230

243231
// When
244-
resourceManager.createOrUpdateResourceWithWait(updatedKafkaProxy);
232+
resourceManager.replaceResourceWithRetries(kafkaProxy, current -> {
233+
current.getSpec().setInfrastructure(infra);
234+
});
245235
LOGGER.info("Kafka proxy updated");
246236

247237
// Then
@@ -275,15 +265,10 @@ void shouldNotUpdateDeploymentChecksumWhenKafkaProxyScaled(String namespace) {
275265
KafkaProxy kafkaProxy = kubeClient.getClient().resources(KafkaProxy.class).inNamespace(namespace)
276266
.withName(Constants.KROXYLICIOUS_PROXY_SIMPLE_NAME).get();
277267

278-
// @formatter:off
279-
KafkaProxyBuilder updatedKafkaProxy = kafkaProxy.edit()
280-
.editOrNewSpec()
281-
.withReplicas(2)
282-
.endSpec();
283-
// @formatter:on
284-
285268
// When
286-
resourceManager.createOrUpdateResourceWithWait(updatedKafkaProxy);
269+
resourceManager.replaceResourceWithRetries(kafkaProxy, current -> {
270+
current.getSpec().setReplicas(2);
271+
});
287272
LOGGER.info("Kafka proxy updated");
288273

289274
// Then

0 commit comments

Comments
 (0)