From 28244f08512e136137dbb0dd075f7ae9adefafa7 Mon Sep 17 00:00:00 2001 From: csviri Date: Fri, 28 Oct 2022 16:06:54 +0200 Subject: [PATCH 1/2] test: complext workflow with dependent --- .../operator/ComplexDependentIT.java | 77 +++++++++++++++++++ .../ComplexDependentCustomResource.java | 14 ++++ .../ComplexDependentReconciler.java | 71 +++++++++++++++++ .../ComplexDependentSpec.java | 14 ++++ .../ComplexDependentStatus.java | 15 ++++ .../dependent/BaseDependentResource.java | 30 ++++++++ .../dependent/BaseService.java | 29 +++++++ .../dependent/BaseStatefulSet.java | 41 ++++++++++ .../dependent/FirstService.java | 20 +++++ .../dependent/FirstStatefulSet.java | 22 ++++++ .../NamePrefixResourceDiscriminator.java | 31 ++++++++ .../dependent/SecondService.java | 20 +++++ .../dependent/SecondStatefulSet.java | 20 +++++ .../dependent/StatefulSetReadyCondition.java | 18 +++++ .../complexdependent/dependent/service.yaml | 16 ++++ .../dependent/statefulset.yaml | 46 +++++++++++ 16 files changed, 484 insertions(+) create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/ComplexDependentIT.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/ComplexDependentCustomResource.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/ComplexDependentReconciler.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/ComplexDependentSpec.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/ComplexDependentStatus.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/BaseDependentResource.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/BaseService.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/BaseStatefulSet.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/FirstService.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/FirstStatefulSet.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/NamePrefixResourceDiscriminator.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/SecondService.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/SecondStatefulSet.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/StatefulSetReadyCondition.java create mode 100644 operator-framework/src/test/resources/io/javaoperatorsdk/operator/sample/complexdependent/dependent/service.yaml create mode 100644 operator-framework/src/test/resources/io/javaoperatorsdk/operator/sample/complexdependent/dependent/statefulset.yaml diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/ComplexDependentIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/ComplexDependentIT.java new file mode 100644 index 0000000000..f7f71a65de --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/ComplexDependentIT.java @@ -0,0 +1,77 @@ +package io.javaoperatorsdk.operator; + +import java.time.Duration; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; +import io.fabric8.kubernetes.api.model.Service; +import io.fabric8.kubernetes.api.model.apps.StatefulSet; +import io.fabric8.kubernetes.client.readiness.Readiness; +import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension; +import io.javaoperatorsdk.operator.sample.complexdependent.ComplexDependentCustomResource; +import io.javaoperatorsdk.operator.sample.complexdependent.ComplexDependentReconciler; +import io.javaoperatorsdk.operator.sample.complexdependent.ComplexDependentSpec; +import io.javaoperatorsdk.operator.sample.complexdependent.dependent.FirstService; +import io.javaoperatorsdk.operator.sample.complexdependent.dependent.FirstStatefulSet; +import io.javaoperatorsdk.operator.sample.complexdependent.dependent.SecondService; +import io.javaoperatorsdk.operator.sample.complexdependent.dependent.SecondStatefulSet; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; + +class ComplexDependentIT { + + public static final String TEST_RESOURCE_NAME = "test1"; + + Logger log = LoggerFactory.getLogger(ComplexDependentIT.class); + + @RegisterExtension + LocallyRunOperatorExtension operator = + LocallyRunOperatorExtension.builder() + .withReconciler(new ComplexDependentReconciler()) + .build(); + + @Test + void successfullyReconciles() { + operator.create(testResource()); + + await().atMost(Duration.ofSeconds(60)) + .untilAsserted(() -> { + var res = operator.get(ComplexDependentCustomResource.class, TEST_RESOURCE_NAME); + assertThat(res.getStatus()).isNotNull(); + assertThat(res.getStatus().getStatus()) + .isEqualTo(ComplexDependentReconciler.RECONCILE_STATUS.READY); + }); + + var firstStatefulSet = operator.get(StatefulSet.class, String.format("%s-%s", + FirstStatefulSet.DISCRIMINATOR_PREFIX, TEST_RESOURCE_NAME)); + var secondStatefulSet = operator.get(StatefulSet.class, String.format("%s-%s", + SecondStatefulSet.DISCRIMINATOR_PREFIX, TEST_RESOURCE_NAME)); + var firstService = operator.get(Service.class, String.format("%s-%s", + FirstService.DISCRIMINATOR_PREFIX, TEST_RESOURCE_NAME)); + var secondService = operator.get(Service.class, String.format("%s-%s", + SecondService.DISCRIMINATOR_PREFIX, TEST_RESOURCE_NAME)); + assertThat(firstService).isNotNull(); + assertThat(secondService).isNotNull(); + assertThat(firstStatefulSet).isNotNull(); + assertThat(secondStatefulSet).isNotNull(); + assertThat(Readiness.isStatefulSetReady(firstStatefulSet)).isTrue(); + assertThat(Readiness.isStatefulSetReady(secondStatefulSet)).isTrue(); + } + + ComplexDependentCustomResource testResource() { + var resource = new ComplexDependentCustomResource(); + resource.setMetadata(new ObjectMetaBuilder() + .withName(TEST_RESOURCE_NAME) + .build()); + resource.setSpec(new ComplexDependentSpec()); + resource.getSpec().setProjectId(TEST_RESOURCE_NAME); + + return resource; + } + +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/ComplexDependentCustomResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/ComplexDependentCustomResource.java new file mode 100644 index 0000000000..e4a5031a6f --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/ComplexDependentCustomResource.java @@ -0,0 +1,14 @@ +package io.javaoperatorsdk.operator.sample.complexdependent; + +import io.fabric8.kubernetes.api.model.Namespaced; +import io.fabric8.kubernetes.client.CustomResource; +import io.fabric8.kubernetes.model.annotation.Group; +import io.fabric8.kubernetes.model.annotation.ShortNames; +import io.fabric8.kubernetes.model.annotation.Version; + +@Group("sample.javaoperatorsdk") +@Version("v1") +@ShortNames("cdc") +public class ComplexDependentCustomResource + extends CustomResource implements Namespaced { +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/ComplexDependentReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/ComplexDependentReconciler.java new file mode 100644 index 0000000000..da0aaf1060 --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/ComplexDependentReconciler.java @@ -0,0 +1,71 @@ +package io.javaoperatorsdk.operator.sample.complexdependent; + +import java.util.Map; +import java.util.Objects; + +import io.fabric8.kubernetes.api.model.Service; +import io.fabric8.kubernetes.api.model.apps.StatefulSet; +import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration; +import io.javaoperatorsdk.operator.api.reconciler.*; +import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent; +import io.javaoperatorsdk.operator.processing.event.source.EventSource; +import io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource; +import io.javaoperatorsdk.operator.sample.complexdependent.dependent.*; + +import static io.javaoperatorsdk.operator.sample.complexdependent.ComplexDependentReconciler.SERVICE_EVENT_SOURCE_NAME; +import static io.javaoperatorsdk.operator.sample.complexdependent.ComplexDependentReconciler.STATEFUL_SET_EVENT_SOURCE_NAME; + +@ControllerConfiguration( + name = "project-operator", + dependents = { + @Dependent(name = "first-svc", type = FirstService.class, + useEventSourceWithName = SERVICE_EVENT_SOURCE_NAME), + @Dependent(name = "second-svc", type = SecondService.class, + useEventSourceWithName = SERVICE_EVENT_SOURCE_NAME), + @Dependent(name = "first", type = FirstStatefulSet.class, + useEventSourceWithName = STATEFUL_SET_EVENT_SOURCE_NAME, + dependsOn = {"first-svc"}, + readyPostcondition = StatefulSetReadyCondition.class), + @Dependent(name = "second", + type = SecondStatefulSet.class, + useEventSourceWithName = STATEFUL_SET_EVENT_SOURCE_NAME, + dependsOn = {"second-svc", "first"}, + readyPostcondition = StatefulSetReadyCondition.class), + }) +public class ComplexDependentReconciler implements Reconciler, + EventSourceInitializer { + + public static final String SERVICE_EVENT_SOURCE_NAME = "serviceEventSource"; + public static final String STATEFUL_SET_EVENT_SOURCE_NAME = "statefulSetEventSource"; + + @Override + public UpdateControl reconcile( + ComplexDependentCustomResource resource, + Context context) throws Exception { + var ready = context.managedDependentResourceContext().getWorkflowReconcileResult() + .orElseThrow().allDependentResourcesReady(); + + var status = Objects.requireNonNullElseGet(resource.getStatus(), ComplexDependentStatus::new); + status.setStatus(ready ? RECONCILE_STATUS.READY : RECONCILE_STATUS.NOT_READY); + resource.setStatus(status); + + return UpdateControl.updateStatus(resource); + } + + @Override + public Map prepareEventSources( + EventSourceContext context) { + InformerEventSource serviceEventSource = + new InformerEventSource<>(InformerConfiguration.from(Service.class, context).build(), + context); + InformerEventSource statefulSetEventSource = + new InformerEventSource<>(InformerConfiguration.from(StatefulSet.class, context).build(), + context); + return Map.of(SERVICE_EVENT_SOURCE_NAME, serviceEventSource, STATEFUL_SET_EVENT_SOURCE_NAME, + statefulSetEventSource); + } + + public enum RECONCILE_STATUS { + READY, NOT_READY + } +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/ComplexDependentSpec.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/ComplexDependentSpec.java new file mode 100644 index 0000000000..1eefabdf6c --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/ComplexDependentSpec.java @@ -0,0 +1,14 @@ +package io.javaoperatorsdk.operator.sample.complexdependent; + +public class ComplexDependentSpec { + private String projectId; + + public String getProjectId() { + return projectId; + } + + public ComplexDependentSpec setProjectId(String projectId) { + this.projectId = projectId; + return this; + } +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/ComplexDependentStatus.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/ComplexDependentStatus.java new file mode 100644 index 0000000000..f541cbae1d --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/ComplexDependentStatus.java @@ -0,0 +1,15 @@ +package io.javaoperatorsdk.operator.sample.complexdependent; + + +public class ComplexDependentStatus { + private ComplexDependentReconciler.RECONCILE_STATUS status; + + public ComplexDependentReconciler.RECONCILE_STATUS getStatus() { + return status; + } + + public ComplexDependentStatus setStatus(ComplexDependentReconciler.RECONCILE_STATUS status) { + this.status = status; + return this; + } +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/BaseDependentResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/BaseDependentResource.java new file mode 100644 index 0000000000..08e7e5fe2e --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/BaseDependentResource.java @@ -0,0 +1,30 @@ +package io.javaoperatorsdk.operator.sample.complexdependent.dependent; + +import io.fabric8.kubernetes.api.model.HasMetadata; +import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; +import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource; +import io.javaoperatorsdk.operator.sample.complexdependent.ComplexDependentCustomResource; + +public abstract class BaseDependentResource + extends CRUDKubernetesDependentResource { + + public static final String K8S_NAME = "app.kubernetes.io/name"; + protected final String component; + + public BaseDependentResource(Class resourceType, String component) { + super(resourceType); + this.component = component; + } + + protected String name(ComplexDependentCustomResource primary) { + return String.format("%s-%s", component, primary.getSpec().getProjectId()); + } + + protected ObjectMetaBuilder createMeta(ComplexDependentCustomResource primary) { + String name = name(primary); + return new ObjectMetaBuilder() + .withName(name) + .withNamespace(primary.getMetadata().getNamespace()) + .addToLabels(K8S_NAME, name); + } +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/BaseService.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/BaseService.java new file mode 100644 index 0000000000..192bc97de9 --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/BaseService.java @@ -0,0 +1,29 @@ +package io.javaoperatorsdk.operator.sample.complexdependent.dependent; + +import java.util.Map; + +import io.fabric8.kubernetes.api.model.Service; +import io.fabric8.kubernetes.api.model.ServiceBuilder; +import io.javaoperatorsdk.operator.ReconcilerUtils; +import io.javaoperatorsdk.operator.api.reconciler.Context; +import io.javaoperatorsdk.operator.sample.complexdependent.ComplexDependentCustomResource; + +public abstract class BaseService extends BaseDependentResource { + + public BaseService(String component) { + super(Service.class, component); + } + + @Override + protected Service desired(ComplexDependentCustomResource primary, + Context context) { + var template = ReconcilerUtils.loadYaml(Service.class, getClass(), "service.yaml"); + + return new ServiceBuilder(template) + .withMetadata(createMeta(primary).build()) + .editOrNewSpec() + .withSelector(Map.of(K8S_NAME, name(primary))) + .endSpec() + .build(); + } +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/BaseStatefulSet.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/BaseStatefulSet.java new file mode 100644 index 0000000000..0609e8dab7 --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/BaseStatefulSet.java @@ -0,0 +1,41 @@ +package io.javaoperatorsdk.operator.sample.complexdependent.dependent; + +import java.util.Map; + +import io.fabric8.kubernetes.api.model.apps.StatefulSet; +import io.fabric8.kubernetes.api.model.apps.StatefulSetBuilder; +import io.javaoperatorsdk.operator.ReconcilerUtils; +import io.javaoperatorsdk.operator.api.reconciler.Context; +import io.javaoperatorsdk.operator.sample.complexdependent.ComplexDependentCustomResource; + +public abstract class BaseStatefulSet extends BaseDependentResource { + public BaseStatefulSet(String component) { + super(StatefulSet.class, component); + } + + @Override + protected StatefulSet desired(ComplexDependentCustomResource primary, + Context context) { + var template = ReconcilerUtils.loadYaml(StatefulSet.class, getClass(), "statefulset.yaml"); + var name = name(primary); + var metadata = createMeta(primary).build(); + + return new StatefulSetBuilder(template) + .withMetadata(metadata) + .editSpec() + .withServiceName(name) + .editOrNewSelector() + .withMatchLabels(Map.of(K8S_NAME, name)) + .endSelector() + .editTemplate() + .withMetadata(metadata) + .endTemplate() + .editFirstVolumeClaimTemplate() + .editMetadata() + .withLabels(Map.of(K8S_NAME, name)) + .endMetadata() + .endVolumeClaimTemplate() + .endSpec() + .build(); + } +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/FirstService.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/FirstService.java new file mode 100644 index 0000000000..b6b0513254 --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/FirstService.java @@ -0,0 +1,20 @@ +package io.javaoperatorsdk.operator.sample.complexdependent.dependent; + +import io.fabric8.kubernetes.api.model.Service; +import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent; + +@KubernetesDependent(resourceDiscriminator = FirstService.Discriminator.class) +public class FirstService extends BaseService { + public static final String DISCRIMINATOR_PREFIX = "first"; + + public FirstService() { + super(DISCRIMINATOR_PREFIX); + } + + public static class Discriminator extends NamePrefixResourceDiscriminator { + protected Discriminator() { + super(DISCRIMINATOR_PREFIX); + } + } + +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/FirstStatefulSet.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/FirstStatefulSet.java new file mode 100644 index 0000000000..f50b94fe5f --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/FirstStatefulSet.java @@ -0,0 +1,22 @@ +package io.javaoperatorsdk.operator.sample.complexdependent.dependent; + +import io.fabric8.kubernetes.api.model.apps.StatefulSet; +import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent; + +@KubernetesDependent(resourceDiscriminator = FirstStatefulSet.Discriminator.class) +public class FirstStatefulSet extends BaseStatefulSet { + + public static final String DISCRIMINATOR_PREFIX = "first"; + + public FirstStatefulSet() { + super(DISCRIMINATOR_PREFIX); + } + + + public static class Discriminator extends NamePrefixResourceDiscriminator { + protected Discriminator() { + super(DISCRIMINATOR_PREFIX); + } + } + +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/NamePrefixResourceDiscriminator.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/NamePrefixResourceDiscriminator.java new file mode 100644 index 0000000000..eef8566c78 --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/NamePrefixResourceDiscriminator.java @@ -0,0 +1,31 @@ +package io.javaoperatorsdk.operator.sample.complexdependent.dependent; + +import java.util.Optional; +import java.util.stream.Collectors; + +import io.fabric8.kubernetes.api.model.HasMetadata; +import io.javaoperatorsdk.operator.api.reconciler.Context; +import io.javaoperatorsdk.operator.api.reconciler.ResourceDiscriminator; +import io.javaoperatorsdk.operator.sample.complexdependent.ComplexDependentCustomResource; + +public abstract class NamePrefixResourceDiscriminator + implements ResourceDiscriminator { + + private final String prefix; + + protected NamePrefixResourceDiscriminator(String prefix) { + this.prefix = prefix; + } + + @Override + public Optional distinguish(Class resource, ComplexDependentCustomResource primary, + Context context) { + var resources = context.getSecondaryResources(resource); + var filtered = resources.stream().filter(r -> r.getMetadata().getName().startsWith(prefix)) + .collect(Collectors.toList()); + if (filtered.size() > 1) { + throw new IllegalStateException("More resources than expected for" + primary); + } + return filtered.isEmpty() ? Optional.empty() : Optional.of(filtered.get(0)); + } +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/SecondService.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/SecondService.java new file mode 100644 index 0000000000..c939d1c2e6 --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/SecondService.java @@ -0,0 +1,20 @@ +package io.javaoperatorsdk.operator.sample.complexdependent.dependent; + +import io.fabric8.kubernetes.api.model.Service; +import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent; + +@KubernetesDependent(resourceDiscriminator = SecondService.Discriminator.class) +public class SecondService extends BaseService { + + public static final String DISCRIMINATOR_PREFIX = "second"; + + public SecondService() { + super(DISCRIMINATOR_PREFIX); + } + + public static class Discriminator extends NamePrefixResourceDiscriminator { + protected Discriminator() { + super(DISCRIMINATOR_PREFIX); + } + } +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/SecondStatefulSet.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/SecondStatefulSet.java new file mode 100644 index 0000000000..7a07682c57 --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/SecondStatefulSet.java @@ -0,0 +1,20 @@ +package io.javaoperatorsdk.operator.sample.complexdependent.dependent; + +import io.fabric8.kubernetes.api.model.apps.StatefulSet; +import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent; + +@KubernetesDependent(resourceDiscriminator = SecondStatefulSet.Discriminator.class) +public class SecondStatefulSet extends BaseStatefulSet { + + public static final String DISCRIMINATOR_PREFIX = "second"; + + public SecondStatefulSet() { + super(DISCRIMINATOR_PREFIX); + } + + public static class Discriminator extends NamePrefixResourceDiscriminator { + protected Discriminator() { + super(DISCRIMINATOR_PREFIX); + } + } +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/StatefulSetReadyCondition.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/StatefulSetReadyCondition.java new file mode 100644 index 0000000000..9025a5a24b --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/StatefulSetReadyCondition.java @@ -0,0 +1,18 @@ +package io.javaoperatorsdk.operator.sample.complexdependent.dependent; + +import io.fabric8.kubernetes.api.model.apps.StatefulSet; +import io.javaoperatorsdk.operator.api.reconciler.Context; +import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition; +import io.javaoperatorsdk.operator.sample.complexdependent.ComplexDependentCustomResource; + +public class StatefulSetReadyCondition + implements Condition { + + @Override + public boolean isMet(ComplexDependentCustomResource primary, StatefulSet secondary, + Context context) { + + var readyReplicas = secondary.getStatus().getReadyReplicas(); + return readyReplicas != null && readyReplicas > 0; + } +} diff --git a/operator-framework/src/test/resources/io/javaoperatorsdk/operator/sample/complexdependent/dependent/service.yaml b/operator-framework/src/test/resources/io/javaoperatorsdk/operator/sample/complexdependent/dependent/service.yaml new file mode 100644 index 0000000000..736ef33178 --- /dev/null +++ b/operator-framework/src/test/resources/io/javaoperatorsdk/operator/sample/complexdependent/dependent/service.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Service +metadata: + name: mongo-template + labels: + app.kubernetes.io/name: mongo-template + app.kubernetes.io/component: first-or-second +spec: + type: ClusterIP + selector: + app.kubernetes.io/name: mongo-template + clusterIP: None + ports: + - name: mongodb + port: 27017 + targetPort: 27017 \ No newline at end of file diff --git a/operator-framework/src/test/resources/io/javaoperatorsdk/operator/sample/complexdependent/dependent/statefulset.yaml b/operator-framework/src/test/resources/io/javaoperatorsdk/operator/sample/complexdependent/dependent/statefulset.yaml new file mode 100644 index 0000000000..a335a4aec7 --- /dev/null +++ b/operator-framework/src/test/resources/io/javaoperatorsdk/operator/sample/complexdependent/dependent/statefulset.yaml @@ -0,0 +1,46 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: mongo-template + labels: + app.kubernetes.io/name: mongo-template + app.kubernetes.io/component: first-or-second +spec: + serviceName: mongo-template + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: mongo-template + template: + metadata: + labels: + app.kubernetes.io/name: mongo-template + app.kubernetes.io/component: first-or-second + spec: + terminationGracePeriodSeconds: 10 + containers: + - name: mongo + image: mongo:4.4 + ports: + - name: mongodb + containerPort: 27017 + volumeMounts: + - name: data + mountPath: /data/db + volumeClaimTemplates: + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: data + labels: + app.kubernetes.io/name: mongo-template + spec: + volumeMode: Filesystem + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + limits: + storage: 50Gi + From e4fe0b80b0f7ddc625aa288203821c8ead315a65 Mon Sep 17 00:00:00 2001 From: csviri Date: Fri, 28 Oct 2022 16:13:19 +0200 Subject: [PATCH 2/2] increaed duration --- .../java/io/javaoperatorsdk/operator/ComplexDependentIT.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/ComplexDependentIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/ComplexDependentIT.java index f7f71a65de..3bc7afaa6a 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/ComplexDependentIT.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/ComplexDependentIT.java @@ -39,7 +39,7 @@ class ComplexDependentIT { void successfullyReconciles() { operator.create(testResource()); - await().atMost(Duration.ofSeconds(60)) + await().atMost(Duration.ofSeconds(90)) .untilAsserted(() -> { var res = operator.get(ComplexDependentCustomResource.class, TEST_RESOURCE_NAME); assertThat(res.getStatus()).isNotNull();