From eb4697010300cef24914430b110b88689362c0ac Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Thu, 25 Feb 2021 12:08:57 +0100 Subject: [PATCH 1/6] feat: update to sdk 1.7.2 and quarkus 1.12.0 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 35b5156..fb3cef3 100644 --- a/pom.xml +++ b/pom.xml @@ -15,8 +15,8 @@ 11 11 - 1.11.0.Final - 1.6.4-SNAPSHOT + 1.12.0.Final + 1.7.2 3.8.1 true From abad2cb1154e822a379ab7bcb3ae1ccd8d6a2197 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Thu, 25 Feb 2021 12:09:19 +0100 Subject: [PATCH 2/6] feat: use start method --- .../sample/memcached/MemcachedOperator.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/io/javaoperatorsdk/sample/memcached/MemcachedOperator.java b/src/main/java/io/javaoperatorsdk/sample/memcached/MemcachedOperator.java index f92cd04..6fccb3d 100644 --- a/src/main/java/io/javaoperatorsdk/sample/memcached/MemcachedOperator.java +++ b/src/main/java/io/javaoperatorsdk/sample/memcached/MemcachedOperator.java @@ -1,7 +1,6 @@ package io.javaoperatorsdk.sample.memcached; import io.javaoperatorsdk.operator.Operator; -import io.javaoperatorsdk.operator.api.config.ConfigurationService; import io.quarkus.runtime.Quarkus; import io.quarkus.runtime.QuarkusApplication; import io.quarkus.runtime.annotations.QuarkusMain; @@ -10,10 +9,6 @@ @QuarkusMain public class MemcachedOperator implements QuarkusApplication { - @Inject ConfigurationService configuration; - - @Inject MemcachedController controller; - @Inject Operator operator; public static void main(String... args) { @@ -22,7 +17,8 @@ public static void main(String... args) { @Override public int run(String... args) throws Exception { - configuration.getConfigurationFor(controller); + operator.start(); + Quarkus.waitForExit(); return 0; } From 0f7ff37de67288826ae335acbf09cf7abd602d91 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Thu, 25 Feb 2021 12:09:58 +0100 Subject: [PATCH 3/6] feat: use CRD generator (and workaround to make it work) --- pom.xml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/pom.xml b/pom.xml index fb3cef3..f6bb85a 100644 --- a/pom.xml +++ b/pom.xml @@ -23,6 +23,13 @@ + + io.fabric8 + kubernetes-client-bom + 5.1.1 + pom + import + io.quarkus quarkus-bom @@ -44,6 +51,16 @@ commons-collections 3.2.2 + + io.fabric8 + crd-generator + 5.1.1 + compile + + + io.fabric8 + kubernetes-model-common + From 2accfe0a54466d2ce5e501d582a04a2e7a1c61f2 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Tue, 20 Apr 2021 18:34:34 +0200 Subject: [PATCH 4/6] chore: update to use quarkus extension and latest Quarkus/fabric8 client --- pom.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index f6bb85a..2aeb6d4 100644 --- a/pom.xml +++ b/pom.xml @@ -15,8 +15,8 @@ 11 11 - 1.12.0.Final - 1.7.2 + 1.13.2.Final + 5.3.0 3.8.1 true @@ -26,7 +26,7 @@ io.fabric8 kubernetes-client-bom - 5.1.1 + ${fabric8-client.version} pom import @@ -42,9 +42,9 @@ - io.javaoperatorsdk - operator-framework-quarkus-extension - ${josdk.version} + io.quarkiverse.operatorsdk + quarkus-operator-sdk + 1.8.2 commons-collections @@ -53,8 +53,8 @@ io.fabric8 - crd-generator - 5.1.1 + crd-generator-apt + ${fabric8-client.version} compile From ed6a2fca78c0e4d65694ad6c555993855f8aa55a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20CROCQUESEL?= <88554524+scrocquesel@users.noreply.github.com> Date: Sun, 6 Feb 2022 22:57:07 +0100 Subject: [PATCH 5/6] chore: update to latest Quarkus/JOSDK --- .gitignore | 1 + pom.xml | 19 ++--- .../sample/memcached/DeploymentEvent.java | 53 ------------- .../memcached/DeploymentEventSource.java | 78 ------------------- .../sample/memcached/MemcachedController.java | 65 +++++++++------- .../sample/memcached/MemcachedOperator.java | 25 ------ src/main/resources/application.properties | 1 + 7 files changed, 46 insertions(+), 196 deletions(-) delete mode 100644 src/main/java/io/javaoperatorsdk/sample/memcached/DeploymentEvent.java delete mode 100644 src/main/java/io/javaoperatorsdk/sample/memcached/DeploymentEventSource.java delete mode 100644 src/main/java/io/javaoperatorsdk/sample/memcached/MemcachedOperator.java create mode 100644 src/main/resources/application.properties diff --git a/.gitignore b/.gitignore index 36ed54b..5aa4c50 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ target/ # VSCode .factorypath +.vscode diff --git a/pom.xml b/pom.xml index 2aeb6d4..b09818a 100644 --- a/pom.xml +++ b/pom.xml @@ -15,8 +15,8 @@ 11 11 - 1.13.2.Final - 5.3.0 + 3.0.2 + 2.6.3.Final 3.8.1 true @@ -24,16 +24,9 @@ - io.fabric8 - kubernetes-client-bom - ${fabric8-client.version} - pom - import - - - io.quarkus - quarkus-bom - ${quarkus.version} + io.quarkiverse.operatorsdk + quarkus-operator-sdk-bom + ${quarkus-operator-sdk.version} pom import @@ -44,7 +37,6 @@ io.quarkiverse.operatorsdk quarkus-operator-sdk - 1.8.2 commons-collections @@ -54,7 +46,6 @@ io.fabric8 crd-generator-apt - ${fabric8-client.version} compile diff --git a/src/main/java/io/javaoperatorsdk/sample/memcached/DeploymentEvent.java b/src/main/java/io/javaoperatorsdk/sample/memcached/DeploymentEvent.java deleted file mode 100644 index d3b4ad9..0000000 --- a/src/main/java/io/javaoperatorsdk/sample/memcached/DeploymentEvent.java +++ /dev/null @@ -1,53 +0,0 @@ -package io.javaoperatorsdk.sample.memcached; - -import io.fabric8.kubernetes.api.model.apps.Deployment; -import io.fabric8.kubernetes.client.Watcher; -import io.javaoperatorsdk.operator.processing.event.AbstractEvent; - -public class DeploymentEvent extends AbstractEvent { - - private final Watcher.Action action; - private final Deployment deployment; - - public DeploymentEvent( - Watcher.Action action, - Deployment resource, - String ownerUid, - DeploymentEventSource deploymentEventSource) { - super(ownerUid, deploymentEventSource); - this.action = action; - this.deployment = resource; - } - - public Watcher.Action getAction() { - return action; - } - - public String resourceUid() { - return getDeployment().getMetadata().getUid(); - } - - @Override - public String toString() { - return "CustomResourceEvent{" - + "action=" - + action - + ", resource=[ name=" - + getDeployment().getMetadata().getName() - + ", kind=" - + getDeployment().getKind() - + ", apiVersion=" - + getDeployment().getApiVersion() - + " ,resourceVersion=" - + getDeployment().getMetadata().getResourceVersion() - + ", markedForDeletion: " - + (getDeployment().getMetadata().getDeletionTimestamp() != null - && !getDeployment().getMetadata().getDeletionTimestamp().isEmpty()) - + " ]" - + '}'; - } - - public Deployment getDeployment() { - return deployment; - } -} diff --git a/src/main/java/io/javaoperatorsdk/sample/memcached/DeploymentEventSource.java b/src/main/java/io/javaoperatorsdk/sample/memcached/DeploymentEventSource.java deleted file mode 100644 index baaeaf9..0000000 --- a/src/main/java/io/javaoperatorsdk/sample/memcached/DeploymentEventSource.java +++ /dev/null @@ -1,78 +0,0 @@ -package io.javaoperatorsdk.sample.memcached; - -import static io.javaoperatorsdk.operator.processing.KubernetesResourceUtils.getUID; -import static io.javaoperatorsdk.operator.processing.KubernetesResourceUtils.getVersion; - -import io.fabric8.kubernetes.api.model.apps.Deployment; -import io.fabric8.kubernetes.client.KubernetesClient; -import io.fabric8.kubernetes.client.Watcher; -import io.fabric8.kubernetes.client.WatcherException; -import io.javaoperatorsdk.operator.processing.event.AbstractEventSource; -import java.util.Map; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DeploymentEventSource extends AbstractEventSource implements Watcher { - private static final Logger log = LoggerFactory.getLogger(DeploymentEventSource.class); - - private final KubernetesClient client; - - private final Map labels; - - public static DeploymentEventSource createAndRegisterWatch( - KubernetesClient client, Map labels) { - DeploymentEventSource deploymentEventSource = new DeploymentEventSource(client, labels); - deploymentEventSource.registerWatch(); - return deploymentEventSource; - } - - private DeploymentEventSource(KubernetesClient client, Map labels) { - this.client = client; - this.labels = labels; - } - - private void registerWatch() { - client.apps().deployments().inAnyNamespace().withLabels(labels).watch(this); - } - - @Override - public void eventReceived(Action action, Deployment deployment) { - log.info( - "Event received for action: {}, Deployment: {} (rr={})", - action.name(), - deployment.getMetadata().getName(), - deployment.getStatus().getReadyReplicas()); - - if (action == Action.ERROR) { - log.warn( - "Skipping {} event for custom resource uid: {}, version: {}", - action, - getUID(deployment), - getVersion(deployment)); - return; - } - - eventHandler.handleEvent( - new DeploymentEvent( - action, - deployment, - deployment.getMetadata().getOwnerReferences().get(0).getUid(), - this)); - } - - @Override - public void onClose(WatcherException e) { - if (e == null) { - return; - } - if (e.isHttpGone()) { - log.warn("Received error for watch, will try to reconnect.", e); - registerWatch(); - } else { - // Note that this should not happen normally, since fabric8 client handles reconnect. - // In case it tries to reconnect this method is not called. - log.error("Unexpected error happened with watch. Will exit.", e); - System.exit(1); - } - } -} diff --git a/src/main/java/io/javaoperatorsdk/sample/memcached/MemcachedController.java b/src/main/java/io/javaoperatorsdk/sample/memcached/MemcachedController.java index 7b1197d..c794b7e 100644 --- a/src/main/java/io/javaoperatorsdk/sample/memcached/MemcachedController.java +++ b/src/main/java/io/javaoperatorsdk/sample/memcached/MemcachedController.java @@ -1,13 +1,29 @@ package io.javaoperatorsdk.sample.memcached; -import io.fabric8.kubernetes.api.model.*; +import static io.javaoperatorsdk.operator.api.reconciler.Constants.NO_FINALIZER; + +import io.fabric8.kubernetes.api.model.ContainerBuilder; +import io.fabric8.kubernetes.api.model.ContainerPortBuilder; +import io.fabric8.kubernetes.api.model.LabelSelectorBuilder; +import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; +import io.fabric8.kubernetes.api.model.OwnerReferenceBuilder; +import io.fabric8.kubernetes.api.model.Pod; +import io.fabric8.kubernetes.api.model.PodSpecBuilder; +import io.fabric8.kubernetes.api.model.PodTemplateSpecBuilder; import io.fabric8.kubernetes.api.model.apps.Deployment; import io.fabric8.kubernetes.api.model.apps.DeploymentBuilder; import io.fabric8.kubernetes.api.model.apps.DeploymentSpecBuilder; import io.fabric8.kubernetes.client.KubernetesClient; -import io.javaoperatorsdk.operator.api.*; -import io.javaoperatorsdk.operator.api.Context; -import io.javaoperatorsdk.operator.processing.event.EventSourceManager; +import io.fabric8.kubernetes.client.informers.SharedIndexInformer; +import io.javaoperatorsdk.operator.api.reconciler.Context; +import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration; +import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext; +import io.javaoperatorsdk.operator.api.reconciler.EventSourceInitializer; +import io.javaoperatorsdk.operator.api.reconciler.Reconciler; +import io.javaoperatorsdk.operator.api.reconciler.UpdateControl; +import io.javaoperatorsdk.operator.processing.event.source.EventSource; +import io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource; +import io.javaoperatorsdk.operator.processing.event.source.informer.Mappers; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -16,8 +32,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@Controller -public class MemcachedController implements ResourceController { +@ControllerConfiguration(finalizerName = NO_FINALIZER) +public class MemcachedController + implements Reconciler, EventSourceInitializer { private static Logger log = LoggerFactory.getLogger(MemcachedController.class); @@ -28,17 +45,21 @@ public MemcachedController(KubernetesClient client) { } @Override - public void init(EventSourceManager eventSourceManager) { - Map deploymentLabel = new HashMap<>(); - deploymentLabel.put("app", "memcached"); - eventSourceManager.registerEventSource( - "memcached-deployment", - DeploymentEventSource.createAndRegisterWatch(client, deploymentLabel)); + public List prepareEventSources(EventSourceContext context) { + SharedIndexInformer deploymentInformer = + client + .apps() + .deployments() + .inAnyNamespace() + .withLabel("app.kubernetes.io/managed-by", "memcached-operator") + .runnableInformer(0); + + return List.of(new InformerEventSource<>(deploymentInformer, Mappers.fromOwnerReference())); } @Override - public UpdateControl createOrUpdateResource( - Memcached memcached, Context context) { + public UpdateControl reconcile(Memcached memcached, Context context) { + Deployment deployment = client .apps() @@ -76,7 +97,7 @@ public UpdateControl createOrUpdateResource( || !CollectionUtils.isEqualCollection(podNames, memcached.getStatus().getNodes())) { if (memcached.getStatus() == null) memcached.setStatus(new MemcachedStatus()); memcached.getStatus().setNodes(podNames); - return UpdateControl.updateStatusSubResource(memcached); + return UpdateControl.updateStatus(memcached); } return UpdateControl.noUpdate(); @@ -88,10 +109,11 @@ private Deployment createMemcachedDeployment(Memcached m) { new ObjectMetaBuilder() .withName(m.getMetadata().getName()) .withNamespace(m.getMetadata().getNamespace()) + .withLabels(Map.of("app.kubernetes.io/managed-by", "memcached-operator")) .withOwnerReferences( new OwnerReferenceBuilder() - .withApiVersion("v1alpha1") - .withKind("Memcached") + .withApiVersion(m.getApiVersion()) + .withKind(m.getKind()) .withName(m.getMetadata().getName()) .withUid(m.getMetadata().getUid()) .build()) @@ -130,13 +152,4 @@ private Map labelsForMemcached(Memcached m) { labels.put("memcached_cr", m.getMetadata().getName()); return labels; } - - @Override - public DeleteControl deleteResource(Memcached memcached, Context context) { - log.info("Deleting memcached object {}", memcached.getMetadata().getName()); - // nothing to do here... - // framework takes care of deleting the memcached object - // k8s takes care of deleting deployment and pods because of ownerreference set - return DeleteControl.DEFAULT_DELETE; - } } diff --git a/src/main/java/io/javaoperatorsdk/sample/memcached/MemcachedOperator.java b/src/main/java/io/javaoperatorsdk/sample/memcached/MemcachedOperator.java deleted file mode 100644 index 6fccb3d..0000000 --- a/src/main/java/io/javaoperatorsdk/sample/memcached/MemcachedOperator.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.javaoperatorsdk.sample.memcached; - -import io.javaoperatorsdk.operator.Operator; -import io.quarkus.runtime.Quarkus; -import io.quarkus.runtime.QuarkusApplication; -import io.quarkus.runtime.annotations.QuarkusMain; -import javax.inject.Inject; - -@QuarkusMain -public class MemcachedOperator implements QuarkusApplication { - - @Inject Operator operator; - - public static void main(String... args) { - Quarkus.run(MemcachedOperator.class, args); - } - - @Override - public int run(String... args) throws Exception { - operator.start(); - - Quarkus.waitForExit(); - return 0; - } -} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..440be28 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1 @@ +quarkus.operator-sdk.crd.apply=true From e831b2aae7799a7be315fe6bd2a289161f2b9b4a Mon Sep 17 00:00:00 2001 From: Dmitry Volodin Date: Sat, 4 Mar 2023 15:33:20 +0300 Subject: [PATCH 6/6] chore: Update Quarkus operator SDK to 5.1.1 --- pom.xml | 6 +++--- .../sample/memcached/MemcachedController.java | 21 +++++++------------ 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/pom.xml b/pom.xml index b09818a..ac31978 100644 --- a/pom.xml +++ b/pom.xml @@ -15,8 +15,8 @@ 11 11 - 3.0.2 - 2.6.3.Final + 5.1.1 + 2.16.4.Final 3.8.1 true @@ -103,4 +103,4 @@ - \ No newline at end of file + diff --git a/src/main/java/io/javaoperatorsdk/sample/memcached/MemcachedController.java b/src/main/java/io/javaoperatorsdk/sample/memcached/MemcachedController.java index c794b7e..877aa1a 100644 --- a/src/main/java/io/javaoperatorsdk/sample/memcached/MemcachedController.java +++ b/src/main/java/io/javaoperatorsdk/sample/memcached/MemcachedController.java @@ -1,7 +1,5 @@ package io.javaoperatorsdk.sample.memcached; -import static io.javaoperatorsdk.operator.api.reconciler.Constants.NO_FINALIZER; - import io.fabric8.kubernetes.api.model.ContainerBuilder; import io.fabric8.kubernetes.api.model.ContainerPortBuilder; import io.fabric8.kubernetes.api.model.LabelSelectorBuilder; @@ -14,7 +12,7 @@ import io.fabric8.kubernetes.api.model.apps.DeploymentBuilder; import io.fabric8.kubernetes.api.model.apps.DeploymentSpecBuilder; import io.fabric8.kubernetes.client.KubernetesClient; -import io.fabric8.kubernetes.client.informers.SharedIndexInformer; +import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration; import io.javaoperatorsdk.operator.api.reconciler.Context; import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration; import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext; @@ -32,7 +30,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@ControllerConfiguration(finalizerName = NO_FINALIZER) +@ControllerConfiguration() public class MemcachedController implements Reconciler, EventSourceInitializer { @@ -45,16 +43,13 @@ public MemcachedController(KubernetesClient client) { } @Override - public List prepareEventSources(EventSourceContext context) { - SharedIndexInformer deploymentInformer = - client - .apps() - .deployments() - .inAnyNamespace() - .withLabel("app.kubernetes.io/managed-by", "memcached-operator") - .runnableInformer(0); + public Map prepareEventSources(EventSourceContext context) { + InformerConfiguration deploymentInformerConfiguration = InformerConfiguration.from(Deployment.class, context) + .withLabelSelector("app.kubernetes.io/managed-by=memcached-operator") + .withSecondaryToPrimaryMapper(Mappers.fromOwnerReference()) + .build(); - return List.of(new InformerEventSource<>(deploymentInformer, Mappers.fromOwnerReference())); + return EventSourceInitializer.nameEventSources(new InformerEventSource<>(deploymentInformerConfiguration, context)); } @Override