<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Java Operator SDK Documentation on Java Operator SDK</title><link>https://javaoperatorsdk.io/v5.1/</link><description>Recent content in Java Operator SDK Documentation on Java Operator SDK</description><generator>Hugo</generator><language>en</language><lastBuildDate>Thu, 22 May 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://javaoperatorsdk.io/v5.1/index.xml" rel="self" type="application/rss+xml"/><item><title>Introduction to Kubernetes operators</title><link>https://javaoperatorsdk.io/v5.1/docs/getting-started/intro-to-operators/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://javaoperatorsdk.io/v5.1/docs/getting-started/intro-to-operators/</guid><description>&lt;h2 id="what-are-kubernetes-operators"&gt;What are Kubernetes Operators?&lt;/h2&gt;
&lt;p&gt;Kubernetes operators are software extensions that manage both cluster and non-cluster resources on behalf of Kubernetes. The Java Operator SDK (JOSDK) makes it easy to implement Kubernetes operators in Java, with APIs designed to feel natural to Java developers and framework handling of common problems so you can focus on your business logic.&lt;/p&gt;
&lt;h2 id="why-use-java-operator-sdk"&gt;Why Use Java Operator SDK?&lt;/h2&gt;
&lt;p&gt;JOSDK provides several key advantages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Java-native APIs&lt;/strong&gt; that feel familiar to Java developers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automatic handling&lt;/strong&gt; of common operator challenges (caching, event handling, retries)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Production-ready features&lt;/strong&gt; like observability, metrics, and error handling&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simplified development&lt;/strong&gt; so you can focus on business logic instead of Kubernetes complexities&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="learning-resources"&gt;Learning Resources&lt;/h2&gt;
&lt;h3 id="getting-started"&gt;Getting Started&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.container-solutions.com/kubernetes-operators-explained"&gt;Introduction to Kubernetes operators&lt;/a&gt; - Core concepts explained&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=CvftaV-xrB4"&gt;Implementing Kubernetes Operators in Java&lt;/a&gt; - Introduction talk&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/concepts/extend-kubernetes/operator/"&gt;Kubernetes operator pattern documentation&lt;/a&gt; - Official Kubernetes docs&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="deep-dives"&gt;Deep Dives&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.container-solutions.com/a-deep-dive-into-the-java-operator-sdk"&gt;Problems JOSDK solves&lt;/a&gt; - Technical deep dive&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.container-solutions.com/cloud-native-java-infrastructure-automation-with-kubernetes-operators"&gt;Why Java operators make sense&lt;/a&gt; - Java in cloud-native infrastructure&lt;/li&gt;
&lt;li&gt;&lt;a href="https://csviri.medium.com/deep-dive-building-a-kubernetes-operator-sdk-for-java-developers-5008218822cb"&gt;Building a Kubernetes operator SDK for Java&lt;/a&gt; - Framework design principles&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="tutorials"&gt;Tutorials&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.redhat.com/articles/2022/02/15/write-kubernetes-java-java-operator-sdk"&gt;Writing Kubernetes operators using JOSDK&lt;/a&gt; - Step-by-step blog series&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Bootstrapping and samples</title><link>https://javaoperatorsdk.io/v5.1/docs/getting-started/bootstrap-and-samples/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://javaoperatorsdk.io/v5.1/docs/getting-started/bootstrap-and-samples/</guid><description>&lt;h2 id="creating-a-new-operator-project"&gt;Creating a New Operator Project&lt;/h2&gt;
&lt;h3 id="using-the-maven-plugin"&gt;Using the Maven Plugin&lt;/h3&gt;
&lt;p&gt;The simplest way to start a new operator project is using the provided Maven plugin, which generates a complete project skeleton:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mvn io.javaoperatorsdk:bootstrapper:&lt;span style="color:#ce5c00;font-weight:bold"&gt;[&lt;/span&gt;version&lt;span style="color:#ce5c00;font-weight:bold"&gt;]&lt;/span&gt;:create &lt;span style="color:#4e9a06"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -DprojectGroupId&lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt;org.acme &lt;span style="color:#4e9a06"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -DprojectArtifactId&lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt;getting-started
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This command creates a new Maven project with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A basic operator implementation&lt;/li&gt;
&lt;li&gt;Maven configuration with required dependencies&lt;/li&gt;
&lt;li&gt;Generated &lt;a href="https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/#customresourcedefinitions"&gt;CustomResourceDefinition&lt;/a&gt; (CRD)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="building-your-project"&gt;Building Your Project&lt;/h3&gt;
&lt;p&gt;Build the generated project with Maven:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mvn clean install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The build process automatically generates the CustomResourceDefinition YAML file that you&amp;rsquo;ll need to apply to your Kubernetes cluster.&lt;/p&gt;</description></item><item><title>Patterns and best practices</title><link>https://javaoperatorsdk.io/v5.1/docs/getting-started/patterns-best-practices/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://javaoperatorsdk.io/v5.1/docs/getting-started/patterns-best-practices/</guid><description>&lt;p&gt;This document describes patterns and best practices for building and running operators, and how to implement them using the Java Operator SDK (JOSDK).&lt;/p&gt;
&lt;p&gt;See also best practices in the &lt;a href="https://sdk.operatorframework.io/docs/best-practices/best-practices/"&gt;Operator SDK&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="implementing-a-reconciler"&gt;Implementing a Reconciler&lt;/h2&gt;
&lt;h3 id="always-reconcile-all-resources"&gt;Always Reconcile All Resources&lt;/h3&gt;
&lt;p&gt;Reconciliation can be triggered by events from multiple sources. It might be tempting to check the events and only reconcile the related resource or subset of resources that the controller manages. However, this is &lt;strong&gt;considered an anti-pattern&lt;/strong&gt; for operators.&lt;/p&gt;</description></item><item><title>Implementing a reconciler</title><link>https://javaoperatorsdk.io/v5.1/docs/documentation/reconciler/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://javaoperatorsdk.io/v5.1/docs/documentation/reconciler/</guid><description>&lt;h2 id="how-reconciliation-works"&gt;How Reconciliation Works&lt;/h2&gt;
&lt;p&gt;The reconciliation process is event-driven and follows this flow:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Event Reception&lt;/strong&gt;: Events trigger reconciliation from:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Primary resources&lt;/strong&gt; (usually custom resources) when created, updated, or deleted&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secondary resources&lt;/strong&gt; through registered event sources&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Reconciliation Execution&lt;/strong&gt;: Each reconciler handles a specific resource type and listens for events from the Kubernetes API server. When an event arrives, it triggers reconciliation unless one is already running for that resource. The framework ensures no concurrent reconciliation occurs for the same resource.&lt;/p&gt;</description></item><item><title>Error handling and retries</title><link>https://javaoperatorsdk.io/v5.1/docs/documentation/error-handling-retries/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://javaoperatorsdk.io/v5.1/docs/documentation/error-handling-retries/</guid><description>&lt;h2 id="how-automatic-retries-work"&gt;How Automatic Retries Work&lt;/h2&gt;
&lt;p&gt;JOSDK automatically schedules retries whenever your &lt;code&gt;Reconciler&lt;/code&gt; throws an exception. This robust retry mechanism helps handle transient issues like network problems or temporary resource unavailability.&lt;/p&gt;
&lt;h3 id="default-retry-behavior"&gt;Default Retry Behavior&lt;/h3&gt;
&lt;p&gt;The default retry implementation covers most typical use cases with exponential backoff:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000"&gt;GenericRetry&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#c4a000"&gt;defaultLimitedExponentialRetry&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;()&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#c4a000"&gt;setInitialInterval&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;5000&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;)&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#8f5902;font-style:italic"&gt;// Start with 5-second delay&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#c4a000"&gt;setIntervalMultiplier&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;1&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#c4a000"&gt;5D&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;)&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#8f5902;font-style:italic"&gt;// Increase delay by 1.5x each retry&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#c4a000"&gt;setMaxAttempts&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;5&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;);&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#8f5902;font-style:italic"&gt;// Maximum 5 attempts&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="configuration-options"&gt;Configuration Options&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Using the &lt;code&gt;@GradualRetry&lt;/code&gt; annotation:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Event sources and related topics</title><link>https://javaoperatorsdk.io/v5.1/docs/documentation/eventing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://javaoperatorsdk.io/v5.1/docs/documentation/eventing/</guid><description>&lt;h2 id="handling-related-events-with-event-sources"&gt;Handling Related Events with Event Sources&lt;/h2&gt;
&lt;p&gt;See also
this &lt;a href="https://csviri.medium.com/java-operator-sdk-introduction-to-event-sources-a1aab5af4b7b"&gt;blog post&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Event sources are a relatively simple yet powerful and extensible concept to trigger controller
executions, usually based on changes to dependent resources. You typically need an event source
when you want your &lt;code&gt;Reconciler&lt;/code&gt; to be triggered when something occurs to secondary resources
that might affect the state of your primary resource. This is needed because a given
&lt;code&gt;Reconciler&lt;/code&gt; will only listen by default to events affecting the primary resource type it is
configured for. Event sources act as listen to events affecting these secondary resources so
that a reconciliation of the associated primary resource can be triggered when needed. Note that
these secondary resources need not be Kubernetes resources. Typically, when dealing with
non-Kubernetes objects or services, we can extend our operator to handle webhooks or websockets
or to react to any event coming from a service we interact with. This allows for very efficient
controller implementations because reconciliations are then only triggered when something occurs
on resources affecting our primary resources thus doing away with the need to periodically
reschedule reconciliations.&lt;/p&gt;</description></item><item><title>Working with EventSource caches</title><link>https://javaoperatorsdk.io/v5.1/docs/documentation/working-with-es-caches/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://javaoperatorsdk.io/v5.1/docs/documentation/working-with-es-caches/</guid><description>&lt;p&gt;As described in &lt;a href="https://javaoperatorsdk.io/v5.1/docs/documentation/eventing/"&gt;Event sources and related topics&lt;/a&gt;, event sources serve as the backbone
for caching resources and triggering reconciliation for primary resources that are related
to these secondary resources.&lt;/p&gt;
&lt;p&gt;In the Kubernetes ecosystem, the component responsible for this is called an Informer. Without delving into
the details (there are plenty of excellent resources online about informers), informers
watch resources, cache them, and emit events when resources change.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;EventSource&lt;/code&gt; is a generalized concept that extends the Informer pattern to non-Kubernetes resources,
allowing you to cache external resources and trigger reconciliation when those resources change.&lt;/p&gt;</description></item><item><title>Configurations</title><link>https://javaoperatorsdk.io/v5.1/docs/documentation/configuration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://javaoperatorsdk.io/v5.1/docs/documentation/configuration/</guid><description>&lt;p&gt;The Java Operator SDK (JOSDK) provides abstractions that work great out of the box. However, we recognize that default behavior isn&amp;rsquo;t always suitable for every use case. Numerous configuration options help you tailor the framework to your specific needs.&lt;/p&gt;
&lt;p&gt;Configuration options operate at several levels:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Operator-level&lt;/strong&gt; using &lt;code&gt;ConfigurationService&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reconciler-level&lt;/strong&gt; using &lt;code&gt;ControllerConfiguration&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DependentResource-level&lt;/strong&gt; using the &lt;code&gt;DependentResourceConfigurator&lt;/code&gt; interface&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EventSource-level&lt;/strong&gt; where some event sources (like &lt;code&gt;InformerEventSource&lt;/code&gt;) need fine-tuning to identify which events trigger the associated reconciler&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="operator-level-configuration"&gt;Operator-Level Configuration&lt;/h2&gt;
&lt;p&gt;Configuration that impacts the entire operator is performed via the &lt;code&gt;ConfigurationService&lt;/code&gt; class. &lt;code&gt;ConfigurationService&lt;/code&gt; is an abstract class with different implementations based on which framework flavor you use (e.g., Quarkus Operator SDK replaces the default implementation). Configurations initialize with sensible defaults but can be changed during initialization.&lt;/p&gt;</description></item><item><title>Observability</title><link>https://javaoperatorsdk.io/v5.1/docs/documentation/observability/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://javaoperatorsdk.io/v5.1/docs/documentation/observability/</guid><description>&lt;h2 id="runtime-info"&gt;Runtime Info&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/java-operator-sdk/java-operator-sdk/blob/main/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/RuntimeInfo.java#L16-L16"&gt;RuntimeInfo&lt;/a&gt;
is used mainly to check the actual health of event sources. Based on this information it is easy to implement custom
liveness probes.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/java-operator-sdk/java-operator-sdk/blob/main/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationService.java#L168-L168"&gt;stopOnInformerErrorDuringStartup&lt;/a&gt;
setting, where this flag usually needs to be set to false, in order to control the exact liveness properties.&lt;/p&gt;
&lt;p&gt;See also an example implementation in the
&lt;a href="https://github.com/java-operator-sdk/java-operator-sdk/blob/3e2e7c4c834ef1c409d636156b988125744ca911/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageOperator.java#L38-L43"&gt;WebPage sample&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contextual-info-for-logging-with-mdc"&gt;Contextual Info for Logging with MDC&lt;/h2&gt;
&lt;p&gt;Logging is enhanced with additional contextual information using
&lt;a href="http://www.slf4j.org/manual.html#mdc"&gt;MDC&lt;/a&gt;. The following attributes are available in most
parts of reconciliation logic and during the execution of the controller:&lt;/p&gt;</description></item><item><title>Other Features</title><link>https://javaoperatorsdk.io/v5.1/docs/documentation/features/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://javaoperatorsdk.io/v5.1/docs/documentation/features/</guid><description>&lt;p&gt;The Java Operator SDK (JOSDK) is a high-level framework and tooling suite for implementing Kubernetes operators. By default, features follow best practices in an opinionated way. However, configuration options and feature flags are available to fine-tune or disable these features.&lt;/p&gt;
&lt;h2 id="support-for-well-known-kubernetes-resources"&gt;Support for Well-Known Kubernetes Resources&lt;/h2&gt;
&lt;p&gt;Controllers can be registered for standard Kubernetes resources (not just custom resources), such as &lt;code&gt;Ingress&lt;/code&gt;, &lt;code&gt;Deployment&lt;/code&gt;, and others.&lt;/p&gt;
&lt;p&gt;See the &lt;a href="https://github.com/operator-framework/java-operator-sdk/blob/main/operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/deployment"&gt;integration test&lt;/a&gt; for an example of reconciling deployments.&lt;/p&gt;</description></item><item><title>Dependent resources</title><link>https://javaoperatorsdk.io/v5.1/docs/documentation/dependent-resource-and-workflows/dependent-resources/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://javaoperatorsdk.io/v5.1/docs/documentation/dependent-resource-and-workflows/dependent-resources/</guid><description>&lt;h2 id="motivations-and-goals"&gt;Motivations and Goals&lt;/h2&gt;
&lt;p&gt;Most operators need to deal with secondary resources when trying to realize the desired state
described by the primary resource they are in charge of. For example, the Kubernetes-native
&lt;code&gt;Deployment&lt;/code&gt; controller needs to manage &lt;code&gt;ReplicaSet&lt;/code&gt; instances as part of a &lt;code&gt;Deployment&lt;/code&gt;&amp;rsquo;s
reconciliation process. In this instance, &lt;code&gt;ReplicatSet&lt;/code&gt; is considered a secondary resource for
the &lt;code&gt;Deployment&lt;/code&gt; controller.&lt;/p&gt;
&lt;p&gt;Controllers that deal with secondary resources typically need to perform the following steps, for
each secondary resource:&lt;/p&gt;</description></item><item><title>Workflows</title><link>https://javaoperatorsdk.io/v5.1/docs/documentation/dependent-resource-and-workflows/workflows/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://javaoperatorsdk.io/v5.1/docs/documentation/dependent-resource-and-workflows/workflows/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Kubernetes (k8s) does not have the notion of a resource &amp;ldquo;depending on&amp;rdquo; on another k8s resource,
at least not in terms of the order in which these resources should be reconciled. Kubernetes
operators typically need to reconcile resources in order because these resources&amp;rsquo; state often
depends on the state of other resources or cannot be processed until these other resources reach
a given state or some condition holds true for them. Dealing with such scenarios are therefore
rather common for operators and the purpose of the workflow feature of the Java Operator SDK
(JOSDK) is to simplify supporting such cases in a declarative way. Workflows build on top of the
&lt;a href="https://javaoperatorsdk.io/docs/documentation/dependent-resource-and-workflows/dependent-resources/"&gt;dependent resources&lt;/a&gt; feature.
While dependent resources focus on how a given secondary resource should be reconciled,
workflows focus on orchestrating how these dependent resources should be reconciled.&lt;/p&gt;</description></item><item><title>Architecture and Internals</title><link>https://javaoperatorsdk.io/v5.1/docs/documentation/architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://javaoperatorsdk.io/v5.1/docs/documentation/architecture/</guid><description>&lt;p&gt;This document provides an overview of the Java Operator SDK&amp;rsquo;s internal structure and components to help developers understand and contribute to the project. While not a comprehensive reference, it introduces core concepts that should make other components easier to understand.&lt;/p&gt;
&lt;h2 id="the-big-picture-and-core-components"&gt;The Big Picture and Core Components&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://javaoperatorsdk.io/v5.1/images/architecture.svg" alt="JOSDK architecture"&gt;&lt;/p&gt;
&lt;p&gt;An &lt;a href="https://github.com/java-operator-sdk/java-operator-sdk/blob/main/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/Operator.java"&gt;Operator&lt;/a&gt; is a set of independent &lt;a href="https://github.com/java-operator-sdk/java-operator-sdk/blob/main/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/Controller.java"&gt;controllers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;Controller&lt;/code&gt; class is an internal class managed by the framework and typically shouldn&amp;rsquo;t be interacted with directly. It manages all processing units involved with reconciling a single type of Kubernetes resource.&lt;/p&gt;</description></item><item><title>How to guarantee allocated values for next reconciliation</title><link>https://javaoperatorsdk.io/v5.1/blog/2025/05/22/how-to-guarantee-allocated-values-for-next-reconciliation/</link><pubDate>Thu, 22 May 2025 00:00:00 +0000</pubDate><guid>https://javaoperatorsdk.io/v5.1/blog/2025/05/22/how-to-guarantee-allocated-values-for-next-reconciliation/</guid><description>&lt;p&gt;We recently released v5.1 of Java Operator SDK (JOSDK). One of the highlights of this release is related to a topic of
so-called
&lt;a href="https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#representing-allocated-values"&gt;allocated values&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To describe the problem, let&amp;rsquo;s say that our controller needs to create a resource that has a generated identifier, i.e.
a resource which identifier cannot be directly derived from the custom resource&amp;rsquo;s desired state as specified in its
&lt;code&gt;spec&lt;/code&gt; field. To record the fact that the resource was successfully created, and to avoid attempting to
recreate the resource again in subsequent reconciliations, it is typical for this type of controller to store the
generated identifier in the custom resource&amp;rsquo;s &lt;code&gt;status&lt;/code&gt; field.&lt;/p&gt;</description></item><item><title>From legacy approach to server-side apply</title><link>https://javaoperatorsdk.io/v5.1/blog/2025/02/25/from-legacy-approach-to-server-side-apply/</link><pubDate>Tue, 25 Feb 2025 00:00:00 +0000</pubDate><guid>https://javaoperatorsdk.io/v5.1/blog/2025/02/25/from-legacy-approach-to-server-side-apply/</guid><description>&lt;p&gt;From version 5 of Java Operator SDK &lt;a href="https://kubernetes.io/docs/reference/using-api/server-side-apply/"&gt;server side apply&lt;/a&gt;
is a first-class feature and is used by default to update resources.
As we will see, unfortunately (or fortunately), using it requires changes for your reconciler implementation.&lt;/p&gt;
&lt;p&gt;For this reason, we prepared a feature flag, which you can flip if you are not prepared to migrate yet:
&lt;a href="https://github.com/operator-framework/java-operator-sdk/blob/main/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationService.java#L493"&gt;&lt;code&gt;ConfigurationService.useSSAToPatchPrimaryResource&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Setting this flag to false will make the operations done by &lt;code&gt;UpdateControl&lt;/code&gt; using the former approach (not SSA).
Similarly, the finalizer handling won&amp;rsquo;t utilize SSA handling.
The plan is to keep this flag and allow the use of the former approach (non-SSA) also in future releases.&lt;/p&gt;</description></item><item><title>Using k8s' ETCD as your application DB</title><link>https://javaoperatorsdk.io/v5.1/blog/2025/01/16/using-k8s-etcd-as-your-application-db/</link><pubDate>Thu, 16 Jan 2025 00:00:00 +0000</pubDate><guid>https://javaoperatorsdk.io/v5.1/blog/2025/01/16/using-k8s-etcd-as-your-application-db/</guid><description>&lt;h1 id="faq-is-kubernetes-etcd-the-right-database-for-my-application"&gt;FAQ: Is Kubernetes’ ETCD the Right Database for My Application?&lt;/h1&gt;
&lt;h2 id="answer"&gt;Answer&lt;/h2&gt;
&lt;p&gt;While the idea of moving your application data to Custom Resources (CRs) aligns with the &amp;ldquo;Cloud Native&amp;rdquo; philosophy, it often introduces more challenges than benefits. Let’s break it down:&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="top-reasons-why-storing-data-in-etcd-through-crs-looks-appealing"&gt;Top Reasons Why Storing Data in ETCD Through CRs Looks Appealing&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Storing application data as CRs enables treating your application’s data like infrastructure:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitOps compatibility:&lt;/strong&gt; Declarative content can be stored in Git repositories, ensuring reproducibility.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Infrastructure alignment:&lt;/strong&gt; Application data can follow the same workflow as other infrastructure components.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id="challenges-of-using-kubernetes-etcd-as-your-applications-database"&gt;Challenges of Using Kubernetes’ ETCD as Your Application’s Database&lt;/h3&gt;
&lt;h4 id="technical-limitations"&gt;Technical Limitations:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Data Size Limitations 🔴:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Version 5 Released!</title><link>https://javaoperatorsdk.io/v5.1/blog/2025/01/06/version-5-released/</link><pubDate>Mon, 06 Jan 2025 00:00:00 +0000</pubDate><guid>https://javaoperatorsdk.io/v5.1/blog/2025/01/06/version-5-released/</guid><description>&lt;p&gt;We are excited to announce that Java Operator SDK v5 has been released. This significant effort contains
various features and enhancements accumulated since the last major release and required changes in our APIs.
Within this post, we will go through all the main changes and help you upgrade to this new version, and provide
a rationale behind the changes if necessary.&lt;/p&gt;
&lt;p&gt;We will omit descriptions of changes that should only require simple code updates; please do contact
us if you encounter issues anyway.&lt;/p&gt;</description></item><item><title>Version 5 Released! (beta1)</title><link>https://javaoperatorsdk.io/v5.1/blog/2024/12/06/version-5-released-beta1/</link><pubDate>Fri, 06 Dec 2024 00:00:00 +0000</pubDate><guid>https://javaoperatorsdk.io/v5.1/blog/2024/12/06/version-5-released-beta1/</guid><description>&lt;p&gt;See release notes &lt;a href="https://javaoperatorsdk.io/v5.1/blog/2025/01/06/version-5-released/"&gt;here&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Migrating from v1 to v2</title><link>https://javaoperatorsdk.io/v5.1/docs/migration/v2-migration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://javaoperatorsdk.io/v5.1/docs/migration/v2-migration/</guid><description>&lt;p&gt;Version 2 of the framework introduces improvements, features and breaking changes for the APIs both
internal and user facing ones. The migration should be however trivial in most of the cases. For
detailed overview of all major issues until the release of
v&lt;code&gt;2.0.0&lt;/code&gt; &lt;a href="https://github.com/java-operator-sdk/java-operator-sdk/milestone/1"&gt;see milestone on GitHub&lt;/a&gt;
. For a summary and reasoning behind some naming changes
see &lt;a href="https://github.com/java-operator-sdk/java-operator-sdk/issues/655"&gt;this issue&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="user-facing-api-changes"&gt;User Facing API Changes&lt;/h2&gt;
&lt;p&gt;The following items are renamed and slightly changed:&lt;/p&gt;</description></item><item><title>Migrating from v2 to v3</title><link>https://javaoperatorsdk.io/v5.1/docs/migration/v3-migration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://javaoperatorsdk.io/v5.1/docs/migration/v3-migration/</guid><description>&lt;p&gt;Version 3 introduces some breaking changes to APIs, however the migration to these changes should be trivial.&lt;/p&gt;
&lt;h2 id="reconciler"&gt;Reconciler&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/java-operator-sdk/java-operator-sdk/blob/67d8e25c26eb92392c6d2a9eb39ea6dddbbfafcc/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/Reconciler.java#L16-L16"&gt;&lt;code&gt;Reconciler&lt;/code&gt;&lt;/a&gt;
can throw checked exception (not just runtime exception), and that also can be handled by &lt;code&gt;ErrorStatusHandler&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cleanup&lt;/code&gt; method is extracted from the &lt;code&gt;Reconciler&lt;/code&gt; interface to a
separate &lt;a href="https://github.com/java-operator-sdk/java-operator-sdk/blob/main/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/Cleaner.java"&gt;&lt;code&gt;Cleaner&lt;/code&gt;&lt;/a&gt;
interface. Finalizers only makes sense that the &lt;code&gt;Cleanup&lt;/code&gt; is implemented, from
now finalizer is only added if the &lt;code&gt;Reconciler&lt;/code&gt; implements this interface (or has managed dependent resources
implementing &lt;code&gt;Deleter&lt;/code&gt; interface, see dependent resource docs).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/java-operator-sdk/java-operator-sdk/blob/main/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/Context.java#L9-L9"&gt;&lt;code&gt;Context&lt;/code&gt;&lt;/a&gt;
object of &lt;code&gt;Reconciler&lt;/code&gt; now takes the Primary resource as parametrized type: &lt;code&gt;Context&amp;lt;MyCustomResource&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/java-operator-sdk/java-operator-sdk/blob/67d8e25c26eb92392c6d2a9eb39ea6dddbbfafcc/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ErrorStatusHandler.java"&gt;&lt;code&gt;ErrorStatusHandler&lt;/code&gt;&lt;/a&gt;
result changed, it functionally has been extended to now prevent Exception to be retried and handles checked
exceptions as mentioned above.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="event-sources"&gt;Event Sources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Event Sources are now registered with a name. But &lt;a href="https://github.com/java-operator-sdk/java-operator-sdk/blob/92bfafd8831e5fb9928663133f037f1bf4783e3e/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/EventSourceInitializer.java#L33-L33"&gt;utility method&lt;/a&gt;
is available to make it easy to &lt;a href="https://github.com/java-operator-sdk/java-operator-sdk/blob/92bfafd8831e5fb9928663133f037f1bf4783e3e/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageStandaloneDependentsReconciler.java#L51-L52"&gt;migrate&lt;/a&gt;
to a default name.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/java-operator-sdk/java-operator-sdk/blob/92bfafd8831e5fb9928663133f037f1bf4783e3e/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerEventSource.java#L75-L75"&gt;InformerEventSource&lt;/a&gt;
constructor changed to reflect additional functionality in a non backwards compatible way. All the configuration
options from the constructor where moved to &lt;a href="https://github.com/java-operator-sdk/java-operator-sdk/blob/f6c6d568ea0a098e11beeeded20fe70f9c5bf692/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/informer/InformerConfiguration.java"&gt;&lt;code&gt;InformerConfiguration&lt;/code&gt;&lt;/a&gt;
. See sample usage in &lt;a href="https://github.com/java-operator-sdk/java-operator-sdk/blob/f6c6d568ea0a098e11beeeded20fe70f9c5bf692/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageReconciler.java#L56-L59"&gt;&lt;code&gt;WebPageReconciler&lt;/code&gt;&lt;/a&gt;
.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PrimaryResourcesRetriever&lt;/code&gt; was renamed to &lt;code&gt;SecondaryToPrimaryMapper&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AssociatedSecondaryResourceIdentifier&lt;/code&gt; was renamed to &lt;code&gt;PrimaryToSecondaryMapper&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;getAssociatedResource&lt;/code&gt; is now renamed to get &lt;code&gt;getSecondaryResource&lt;/code&gt; in multiple places&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Migrating from v3 to v3.1</title><link>https://javaoperatorsdk.io/v5.1/docs/migration/v3-1-migration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://javaoperatorsdk.io/v5.1/docs/migration/v3-1-migration/</guid><description>&lt;h2 id="reconciliationmaxinterval-annotation-has-been-renamed-to-maxreconciliationinterval"&gt;ReconciliationMaxInterval Annotation has been renamed to MaxReconciliationInterval&lt;/h2&gt;
&lt;p&gt;Associated methods on both the &lt;code&gt;ControllerConfiguration&lt;/code&gt; class and annotation have also been
renamed accordingly.&lt;/p&gt;
&lt;h2 id="workflows-impact-on-managed-dependent-resources-behavior"&gt;Workflows Impact on Managed Dependent Resources Behavior&lt;/h2&gt;
&lt;p&gt;Version 3.1 comes with a workflow engine that replaces the previous behavior of managed dependent
resources.
See &lt;a href="https://javaoperatorsdk.io/docs/documentation/dependent-resource-and-workflows/workflows/"&gt;Workflows documentation&lt;/a&gt; for further details.
The primary impact after upgrade is a change of the order in which managed dependent resources
are reconciled. They are now reconciled in parallel with optional ordering defined using the
&lt;a href="https://github.com/java-operator-sdk/java-operator-sdk/blob/df44917ef81725c10bbcb772ab7b434d511b13b9/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/Dependent.java#L23-L23"&gt;&amp;lsquo;depends_on&amp;rsquo;&lt;/a&gt;
relation to define order between resources if needed. In v3, managed dependent resources were
implicitly reconciled in the order they were defined in.&lt;/p&gt;</description></item><item><title>Migrating from v4.2 to v4.3</title><link>https://javaoperatorsdk.io/v5.1/docs/migration/v4-3-migration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://javaoperatorsdk.io/v5.1/docs/migration/v4-3-migration/</guid><description>&lt;h2 id="condition-api-change"&gt;Condition API Change&lt;/h2&gt;
&lt;p&gt;In Workflows the target of the condition was the managed resource itself, not the target dependent resource.
This changed, now the API contains the dependent resource.&lt;/p&gt;
&lt;p&gt;New API:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;public&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;interface&lt;/span&gt; &lt;span style="color:#000"&gt;Condition&lt;/span&gt;&lt;span style="color:#ce5c00;font-weight:bold"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000"&gt;R&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;,&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;P&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;extends&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;HasMetadata&lt;/span&gt;&lt;span style="color:#ce5c00;font-weight:bold"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;{&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;boolean&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;isMet&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;DependentResource&lt;/span&gt;&lt;span style="color:#ce5c00;font-weight:bold"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000"&gt;R&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;,&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;P&lt;/span&gt;&lt;span style="color:#ce5c00;font-weight:bold"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;dependentResource&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;,&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;P&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;primary&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;,&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;Context&lt;/span&gt;&lt;span style="color:#ce5c00;font-weight:bold"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000"&gt;P&lt;/span&gt;&lt;span style="color:#ce5c00;font-weight:bold"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;context&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;);&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Former API:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;public&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;interface&lt;/span&gt; &lt;span style="color:#000"&gt;Condition&lt;/span&gt;&lt;span style="color:#ce5c00;font-weight:bold"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000"&gt;R&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;,&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;P&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;extends&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;HasMetadata&lt;/span&gt;&lt;span style="color:#ce5c00;font-weight:bold"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;{&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;boolean&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;isMet&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;P&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;primary&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;,&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;R&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;secondary&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;,&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;Context&lt;/span&gt;&lt;span style="color:#ce5c00;font-weight:bold"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000"&gt;P&lt;/span&gt;&lt;span style="color:#ce5c00;font-weight:bold"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;context&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;);&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Migration is trivial. Since the secondary resource can be accessed from the dependent resource. So to access the
secondary
resource just use &lt;code&gt;dependentResource.getSecondaryResource(primary,context)&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Migrating from v4.3 to v4.4</title><link>https://javaoperatorsdk.io/v5.1/docs/migration/v4-4-migration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://javaoperatorsdk.io/v5.1/docs/migration/v4-4-migration/</guid><description>&lt;h2 id="api-changes"&gt;API changes&lt;/h2&gt;
&lt;h3 id="configurationservice"&gt;ConfigurationService&lt;/h3&gt;
&lt;p&gt;We have simplified how to deal with the Kubernetes client. Previous versions provided direct
access to underlying aspects of the client&amp;rsquo;s configuration or serialization mechanism. However,
the link between these aspects wasn&amp;rsquo;t as explicit as it should have been. Moreover, the Fabric8
client framework has also revised their serialization architecture in the 6.7 version (see &lt;a href="https://github.com/fabric8io/kubernetes-client/pull/4662"&gt;this
fabric8 pull request&lt;/a&gt; for a discussion of
that change), moving from statically configured serialization to a per-client configuration
(though it&amp;rsquo;s still possible to share serialization mechanism between client instances). As a
consequence, we made the following changes to the &lt;code&gt;ConfigurationService&lt;/code&gt; API:&lt;/p&gt;</description></item><item><title>Migrating from v4.4 to v4.5</title><link>https://javaoperatorsdk.io/v5.1/docs/migration/v4-5-migration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://javaoperatorsdk.io/v5.1/docs/migration/v4-5-migration/</guid><description>&lt;p&gt;Version 4.5 introduces improvements related to event handling for Dependent Resources, more precisely the
&lt;a href="https://javaoperatorsdk.io/docs/documentation/dependent-resource-and-workflows/dependent-resources/#caching-and-event-handling-in-kubernetesdependentresource"&gt;caching and event handling&lt;/a&gt;
features. As a result the Kubernetes resources managed using
&lt;a href="https://github.com/java-operator-sdk/java-operator-sdk/blob/73b1d8db926a24502c3a70da34f6bcac4f66b4eb/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerEventSource.java#L72-L72"&gt;KubernetesDependentResource&lt;/a&gt;
or its subclasses, will add an annotation recording the resource&amp;rsquo;s version whenever JOSDK updates or creates such
resources. This can be turned off using a
&lt;a href="https://github.com/java-operator-sdk/java-operator-sdk/blob/73b1d8db926a24502c3a70da34f6bcac4f66b4eb/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationService.java#L375-L375"&gt;feature flag&lt;/a&gt;
if causes some issues in your use case.&lt;/p&gt;
&lt;p&gt;Using this feature, JOSDK now tracks versions of cached resources. It also uses, by default, that information to prevent
unneeded reconciliations that could occur when, depending on the timing of operations, an outdated resource would happen
to be in the cache. This relies on the fact that versions (as recorded by the &lt;code&gt;metadata.resourceVersion&lt;/code&gt; field) are
currently implemented as monotonically increasing integers (though they should be considered as opaque and their
interpretation discouraged). Note that, while this helps preventing unneeded reconciliations, things would eventually
reach consistency even in the absence of this feature. Also, if this interpreting of the resource versions causes
issues, you can turn the feature off using the
&lt;a href="https://github.com/java-operator-sdk/java-operator-sdk/blob/73b1d8db926a24502c3a70da34f6bcac4f66b4eb/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationService.java#L390-L390"&gt;following feature flag&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Migrating from v4.7 to v5.0</title><link>https://javaoperatorsdk.io/v5.1/docs/migration/v5-0-migration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://javaoperatorsdk.io/v5.1/docs/migration/v5-0-migration/</guid><description>&lt;p&gt;For migration to v5 see &lt;a href="https://javaoperatorsdk.io/v5.1/blog/2025/01/06/version-5-released/"&gt;this blogpost&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Search Results</title><link>https://javaoperatorsdk.io/v5.1/search/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://javaoperatorsdk.io/v5.1/search/</guid><description/></item></channel></rss>