Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import io.fabric8.kubernetes.api.model.KubernetesResourceList;
import io.fabric8.kubernetes.api.model.Namespaced;
import io.fabric8.kubernetes.api.model.ObjectMeta;
import io.fabric8.kubernetes.client.CustomResource;
import io.fabric8.kubernetes.client.KubernetesClientException;
import io.fabric8.kubernetes.client.dsl.MixedOperation;
import io.fabric8.kubernetes.client.dsl.Resource;
Expand Down Expand Up @@ -477,6 +478,7 @@ public R patchStatus(R resource, R originalResource) {
}
}

@SuppressWarnings("unchecked")
private R editStatus(R resource, R originalResource) {
String resourceVersion = resource.getMetadata().getResourceVersion();
// the cached resource should not be changed in any circumstances
Expand All @@ -486,7 +488,11 @@ private R editStatus(R resource, R originalResource) {
clonedOriginal.getMetadata().setResourceVersion(null);
resource.getMetadata().setResourceVersion(null);
var res = resource(clonedOriginal);
return res.editStatus(r -> resource);
return res.editStatus(
r -> {
((CustomResource) r).setStatus(((CustomResource) resource).getStatus());
return r;
});
} finally {
// restore initial resource version
clonedOriginal.getMetadata().setResourceVersion(resourceVersion);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package io.javaoperatorsdk.operator.baseapi.patchresourceandstatusnossa;

import java.util.Map;
import java.util.concurrent.TimeUnit;

import org.junit.jupiter.api.Test;
Expand All @@ -9,39 +10,62 @@
import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension;
import io.javaoperatorsdk.operator.support.TestUtils;

import static io.javaoperatorsdk.operator.baseapi.patchresourceandstatusnossa.PatchResourceAndStatusNoSSAReconciler.TEST_ANNOTATION;
import static io.javaoperatorsdk.operator.baseapi.patchresourceandstatusnossa.PatchResourceAndStatusNoSSAReconciler.TEST_ANNOTATION_VALUE;
import static org.assertj.core.api.Assertions.assertThat;
import static org.awaitility.Awaitility.await;

class PatchResourceAndStatusNoSSAIT {
@RegisterExtension
LocallyRunOperatorExtension operator =
LocallyRunOperatorExtension extension =
LocallyRunOperatorExtension.builder()
.withConfigurationService(o -> o.withUseSSAToPatchPrimaryResource(false))
.withReconciler(PatchResourceAndStatusNoSSAReconciler.class)
.build();

@Test
void updatesSubResourceStatus() {
extension
.getReconcilerOfType(PatchResourceAndStatusNoSSAReconciler.class)
.setRemoveAnnotation(false);
PatchResourceAndStatusNoSSACustomResource resource = createTestCustomResource("1");
operator.create(resource);
extension.create(resource);

awaitStatusUpdated(resource.getMetadata().getName());
// wait for sure, there are no more events
TestUtils.waitXms(300);

PatchResourceAndStatusNoSSACustomResource customResource =
operator.get(
extension.get(
PatchResourceAndStatusNoSSACustomResource.class, resource.getMetadata().getName());

assertThat(TestUtils.getNumberOfExecutions(operator)).isEqualTo(1);
assertThat(TestUtils.getNumberOfExecutions(extension)).isEqualTo(1);
assertThat(customResource.getStatus().getState())
.isEqualTo(PatchResourceAndStatusNoSSAStatus.State.SUCCESS);
assertThat(
customResource
.getMetadata()
.getAnnotations()
.get(PatchResourceAndStatusNoSSAReconciler.TEST_ANNOTATION))
.isNotNull();
assertThat(customResource.getMetadata().getAnnotations().get(TEST_ANNOTATION)).isNotNull();
}

@Test
void removeAnnotationCorrectlyUpdatesStatus() {
extension
.getReconcilerOfType(PatchResourceAndStatusNoSSAReconciler.class)
.setRemoveAnnotation(true);
PatchResourceAndStatusNoSSACustomResource resource = createTestCustomResource("1");
resource.getMetadata().setAnnotations(Map.of(TEST_ANNOTATION, TEST_ANNOTATION_VALUE));
extension.create(resource);

awaitStatusUpdated(resource.getMetadata().getName());
// wait for sure, there are no more events
TestUtils.waitXms(300);

PatchResourceAndStatusNoSSACustomResource customResource =
extension.get(
PatchResourceAndStatusNoSSACustomResource.class, resource.getMetadata().getName());

assertThat(TestUtils.getNumberOfExecutions(extension)).isEqualTo(1);
assertThat(customResource.getStatus().getState())
.isEqualTo(PatchResourceAndStatusNoSSAStatus.State.SUCCESS);
assertThat(customResource.getMetadata().getAnnotations().get(TEST_ANNOTATION)).isNull();
}

void awaitStatusUpdated(String name) {
Expand All @@ -50,7 +74,7 @@ void awaitStatusUpdated(String name) {
.untilAsserted(
() -> {
PatchResourceAndStatusNoSSACustomResource cr =
operator.get(PatchResourceAndStatusNoSSACustomResource.class, name);
extension.get(PatchResourceAndStatusNoSSACustomResource.class, name);
assertThat(cr).isNotNull();
assertThat(cr.getStatus()).isNotNull();
assertThat(cr.getStatus().getState())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ public class PatchResourceAndStatusNoSSAReconciler
public static final String TEST_ANNOTATION_VALUE = "TestAnnotationValue";
private final AtomicInteger numberOfExecutions = new AtomicInteger(0);

private volatile boolean removeAnnotation = false;

@Override
public UpdateControl<PatchResourceAndStatusNoSSACustomResource> reconcile(
PatchResourceAndStatusNoSSACustomResource resource,
Expand All @@ -30,8 +32,12 @@ public UpdateControl<PatchResourceAndStatusNoSSACustomResource> reconcile(

log.info("Value: " + resource.getSpec().getValue());

resource.getMetadata().setAnnotations(new HashMap<>());
resource.getMetadata().getAnnotations().put(TEST_ANNOTATION, TEST_ANNOTATION_VALUE);
if (removeAnnotation) {
resource.getMetadata().getAnnotations().remove(TEST_ANNOTATION);
} else {
resource.getMetadata().setAnnotations(new HashMap<>());
resource.getMetadata().getAnnotations().put(TEST_ANNOTATION, TEST_ANNOTATION_VALUE);
}
ensureStatusExists(resource);
resource.getStatus().setState(PatchResourceAndStatusNoSSAStatus.State.SUCCESS);

Expand All @@ -49,4 +55,8 @@ private void ensureStatusExists(PatchResourceAndStatusNoSSACustomResource resour
public int getNumberOfExecutions() {
return numberOfExecutions.get();
}

public void setRemoveAnnotation(boolean removeAnnotation) {
this.removeAnnotation = removeAnnotation;
}
}