<?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://aerben.github.io/josdk-docs-test/</link><description>Recent content in Java Operator SDK Documentation on Java Operator SDK</description><generator>Hugo</generator><language>en</language><atom:link href="https://aerben.github.io/josdk-docs-test/index.xml" rel="self" type="application/rss+xml"/><item><title>Introduction to Kubernetes operators</title><link>https://aerben.github.io/josdk-docs-test/docs/getting-started/intro-to-operators/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/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://aerben.github.io/josdk-docs-test/docs/getting-started/bootstrap-and-samples/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/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://aerben.github.io/josdk-docs-test/docs/getting-started/patterns-best-practices/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/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://aerben.github.io/josdk-docs-test/docs/documentation/reconciler/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/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://aerben.github.io/josdk-docs-test/docs/documentation/error-handling-retries/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/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>Rate limiting</title><link>https://aerben.github.io/josdk-docs-test/docs/documentation/rate-limiting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/docs/documentation/rate-limiting/</guid><description>&lt;p&gt;It is possible to rate limit reconciliation on a per-resource basis. The rate limit takes
precedence over retry/reschedule configurations: for example, even if a retry would reschedule a reconciliation
but this request would make the resource go over its rate limit, the next
reconciliation will be postponed according to the rate limiting rules. Note that the
reconciliation is never cancelled, it will just be executed as early as possible based on rate
limitations.&lt;/p&gt;</description></item><item><title>Event sources and related topics</title><link>https://aerben.github.io/josdk-docs-test/docs/documentation/eventing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/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 managed 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://aerben.github.io/josdk-docs-test/docs/documentation/working-with-es-caches/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/docs/documentation/working-with-es-caches/</guid><description>&lt;p&gt;As described in &lt;a href="https://aerben.github.io/josdk-docs-test/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>Other Features</title><link>https://aerben.github.io/josdk-docs-test/docs/documentation/features/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/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://aerben.github.io/josdk-docs-test/docs/documentation/dependent-resource-and-workflows/dependent-resources/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/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://aerben.github.io/josdk-docs-test/docs/documentation/dependent-resource-and-workflows/workflows/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/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://aerben.github.io/josdk-docs-test/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>Configurations</title><link>https://aerben.github.io/josdk-docs-test/docs/documentation/operations/configuration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/docs/documentation/operations/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>Logging</title><link>https://aerben.github.io/josdk-docs-test/docs/documentation/operations/logging/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/docs/documentation/operations/logging/</guid><description>&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;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;MDC Key&lt;/th&gt;
 &lt;th style="text-align: left"&gt;Value added from primary resource&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;resource.apiVersion&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;.apiVersion&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;resource.kind&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;.kind&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;resource.name&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;.metadata.name&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;resource.namespace&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;.metadata.namespace&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;resource.resourceVersion&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;.metadata.resourceVersion&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;resource.generation&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;.metadata.generation&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;resource.uid&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;.metadata.uid&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;For more information about MDC see this &lt;a href="https://www.baeldung.com/mdc-in-log4j-2-logback"&gt;link&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="mdc-entries-during-event-handling"&gt;MDC entries during event handling&lt;/h3&gt;
&lt;p&gt;Although, usually users might not require it in their day-to-day workflow, it is worth mentioning that
there are additional MDC entries managed for event handling. Typically, you might be interested in it
in your &lt;code&gt;SecondaryToPrimaryMapper&lt;/code&gt; related logs.
For &lt;code&gt;InformerEventSource&lt;/code&gt; and &lt;code&gt;ControllerEventSource&lt;/code&gt; the following information is present:&lt;/p&gt;</description></item><item><title>Metrics</title><link>https://aerben.github.io/josdk-docs-test/docs/documentation/operations/metrics/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/docs/documentation/operations/metrics/</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="metrics"&gt;Metrics&lt;/h2&gt;
&lt;p&gt;JOSDK provides built-in support for metrics reporting on what is happening with your reconcilers in the form of
the &lt;code&gt;Metrics&lt;/code&gt; interface which can be implemented to connect to your metrics provider of choice, JOSDK calling the
methods as it goes about reconciling resources. By default, a no-operation implementation is provided thus providing a
no-cost sane default. A &lt;a href="https://micrometer.io"&gt;micrometer&lt;/a&gt;-based implementation is also provided.&lt;/p&gt;</description></item><item><title>Leader Election</title><link>https://aerben.github.io/josdk-docs-test/docs/documentation/operations/leader-election/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/docs/documentation/operations/leader-election/</guid><description>&lt;p&gt;When running multiple replicas of an operator for high availability, leader election ensures that
only one instance actively reconciles resources at a time. JOSDK uses Kubernetes
&lt;a href="https://kubernetes.io/docs/concepts/architecture/leases/"&gt;Lease&lt;/a&gt; objects for leader election.&lt;/p&gt;
&lt;h2 id="enabling-leader-election"&gt;Enabling Leader Election&lt;/h2&gt;
&lt;h3 id="programmatic-configuration"&gt;Programmatic Configuration&lt;/h3&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;var&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;operator&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;new&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;Operator&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;o&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &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;o&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#c4a000"&gt;withLeaderElectionConfiguration&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:#204a87;font-weight:bold"&gt;new&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;LeaderElectionConfiguration&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#4e9a06"&gt;&amp;#34;my-operator-lease&amp;#34;&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:#4e9a06"&gt;&amp;#34;operator-namespace&amp;#34;&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;Or using the builder for full control:&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;import static&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;io.javaoperatorsdk.operator.api.config.LeaderElectionConfigurationBuilder.aLeaderElectionConfiguration&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:#204a87;font-weight:bold"&gt;var&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;config&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;aLeaderElectionConfiguration&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#4e9a06"&gt;&amp;#34;my-operator-lease&amp;#34;&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;withLeaseNamespace&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#4e9a06"&gt;&amp;#34;operator-namespace&amp;#34;&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;withIdentity&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;System&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#c4a000"&gt;getenv&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#4e9a06"&gt;&amp;#34;POD_NAME&amp;#34;&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;withLeaseDuration&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;Duration&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#c4a000"&gt;ofSeconds&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;15&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;withRenewDeadline&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;Duration&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#c4a000"&gt;ofSeconds&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;10&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;withRetryPeriod&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;Duration&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#c4a000"&gt;ofSeconds&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;2&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;build&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:#204a87;font-weight:bold"&gt;var&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;operator&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;new&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;Operator&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;o&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &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;o&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#c4a000"&gt;withLeaderElectionConfiguration&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;config&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;h3 id="external-configuration"&gt;External Configuration&lt;/h3&gt;
&lt;p&gt;Leader election can also be configured via properties (e.g. environment variables or a config file).&lt;/p&gt;</description></item><item><title>Generic Helm Chart</title><link>https://aerben.github.io/josdk-docs-test/docs/documentation/operations/helm-chart/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/docs/documentation/operations/helm-chart/</guid><description>&lt;p&gt;A generic, reusable Helm chart for deploying Java operators built with JOSDK is available at
&lt;a href="https://github.com/java-operator-sdk/java-operator-sdk/tree/main/helm/generic-helm-chart"&gt;&lt;code&gt;helm/generic-helm-chart&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It is intended as a &lt;strong&gt;template for operator developers&lt;/strong&gt; — a starting point that covers common deployment
patterns so you don&amp;rsquo;t have to write a chart from scratch. The chart is maintained on a &lt;strong&gt;best-effort basis&lt;/strong&gt;.
Contributions are more than welcome.&lt;/p&gt;
&lt;p&gt;The chart is used in the
&lt;a href="https://github.com/java-operator-sdk/java-operator-sdk/blob/main/sample-operators/metrics-processing/src/test/java/io/javaoperatorsdk/operator/sample/metrics/MetricsHandlingE2E.java"&gt;&lt;code&gt;metrics-processing&lt;/code&gt; sample operator E2E test&lt;/a&gt;
to deploy the operator to a cluster via Helm.&lt;/p&gt;</description></item><item><title>Architecture and Internals</title><link>https://aerben.github.io/josdk-docs-test/docs/documentation/architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/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://aerben.github.io/josdk-docs-test/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>Version 5.3 Released!</title><link>https://aerben.github.io/josdk-docs-test/blog/2026/03/13/version-5.3-released/</link><pubDate>Fri, 13 Mar 2026 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/blog/2026/03/13/version-5.3-released/</guid><description>&lt;p&gt;We&amp;rsquo;re pleased to announce the release of Java Operator SDK v5.3.0! This minor version brings
two headline features — read-cache-after-write consistency and a new metrics implementation —
along with a configuration adapter system, MDC improvements, and a number of smaller improvements
and cleanups.&lt;/p&gt;
&lt;h2 id="key-features"&gt;Key Features&lt;/h2&gt;
&lt;h3 id="read-cache-after-write-consistency-and-event-filtering"&gt;Read-cache-after-write Consistency and Event Filtering&lt;/h3&gt;
&lt;p&gt;This is the headline feature of 5.3. Informer caches are inherently eventually consistent: after
your reconciler updates a resource, there is a window of time before the change is visible in the
cache. This can cause subtle bugs, particularly when storing allocated values in the status
sub-resource and reading them back in the next reconciliation.&lt;/p&gt;</description></item><item><title>Welcome read-cache-after-write consistency!</title><link>https://aerben.github.io/josdk-docs-test/blog/2026/03/13/welcome-read-cache-after-write-consistency/</link><pubDate>Fri, 13 Mar 2026 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/blog/2026/03/13/welcome-read-cache-after-write-consistency/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt;
In version 5.3.0 we introduced strong consistency guarantees for updates with a new API.
You can now update resources (both your custom resource and managed resources)
and the framework will guarantee that these updates will be instantly visible
when accessing resources from caches,
and naturally also for subsequent reconciliations.&lt;/p&gt;
&lt;p&gt;I briefly &lt;a href="https://www.youtube.com/watch?v=HrwHh5Yh6AM&amp;amp;t=1387s"&gt;talked about this&lt;/a&gt; topic at KubeCon last year.&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:#000"&gt;UpdateControl&lt;/span&gt;&lt;span style="color:#ce5c00;font-weight:bold"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000"&gt;WebPage&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;reconcile&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;WebPage&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;webPage&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;WebPage&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 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:#000"&gt;ConfigMap&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;managedConfigMap&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;prepareConfigMap&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;webPage&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:#8f5902;font-style:italic"&gt;// apply the resource with new API&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"&gt;context&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#c4a000"&gt;resourceOperations&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;().&lt;/span&gt;&lt;span style="color:#c4a000"&gt;serverSideApply&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;managedConfigMap&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:#8f5902;font-style:italic"&gt;// fresh resource instantly available from our update in the caches&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;var&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;upToDateResource&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#ce5c00;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:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#c4a000"&gt;getSecondaryResource&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;ConfigMap&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#c4a000"&gt;class&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:#8f5902;font-style:italic"&gt;// from now on built-in update methods by default use this feature;&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:#8f5902;font-style:italic"&gt;// it is guaranteed that resource changes will be visible for next reconciliation&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;return&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;UpdateControl&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#c4a000"&gt;patchStatus&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;alterStatusObject&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;webPage&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:#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;In addition to that, the framework will automatically filter events for your own updates,
so they don&amp;rsquo;t trigger the reconciliation again.&lt;/p&gt;</description></item><item><title>Version 5.2 Released!</title><link>https://aerben.github.io/josdk-docs-test/blog/2025/11/25/version-5.2-released/</link><pubDate>Tue, 25 Nov 2025 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/blog/2025/11/25/version-5.2-released/</guid><description>&lt;p&gt;We&amp;rsquo;re pleased to announce the release of Java Operator SDK v5.2! This minor version brings several powerful new features
and improvements that enhance the framework&amp;rsquo;s capabilities for building Kubernetes operators. This release focuses on
flexibility, external resource management, and advanced reconciliation patterns.&lt;/p&gt;
&lt;h2 id="key-features"&gt;Key Features&lt;/h2&gt;
&lt;h3 id="resourceidmapper-for-external-resources"&gt;ResourceIDMapper for External Resources&lt;/h3&gt;
&lt;p&gt;One of the most significant improvements in 5.2 is the introduction of a unified approach to working with custom ID types
across the framework through &lt;a href="https://github.com/operator-framework/java-operator-sdk/blob/main/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/ResourceIDMapper.java"&gt;&lt;code&gt;ResourceIDMapper&lt;/code&gt;&lt;/a&gt;
and &lt;a href="https://github.com/operator-framework/java-operator-sdk/blob/main/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/ResourceIDProvider.java"&gt;&lt;code&gt;ResourceIDProvider&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>How to guarantee allocated values for next reconciliation</title><link>https://aerben.github.io/josdk-docs-test/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://aerben.github.io/josdk-docs-test/blog/2025/05/22/how-to-guarantee-allocated-values-for-next-reconciliation/</guid><description>&lt;div class="alert alert-primary" role="alert"&gt;&lt;div class="h4 alert-heading" role="heading"&gt;Deprecated&lt;/div&gt;
&lt;p&gt;Read-cache-after-write consistency feature replaces this functionality. (since version 5.3.0)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It provides this functionality also for secondary resources and optimistic locking
is not required anymore. See the &lt;a href="https://aerben.github.io/josdk-docs-test/docs/documentation/reconciler/#read-cache-after-write-consistency-and-event-filtering"&gt;docs&lt;/a&gt; and
related &lt;a href="https://aerben.github.io/josdk-docs-test/blog/2026/03/13/welcome-read-cache-after-write-consistency/"&gt;blog post&lt;/a&gt; for details.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&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://aerben.github.io/josdk-docs-test/blog/2025/02/25/from-legacy-approach-to-server-side-apply/</link><pubDate>Tue, 25 Feb 2025 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/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://aerben.github.io/josdk-docs-test/blog/2025/01/16/using-k8s-etcd-as-your-application-db/</link><pubDate>Thu, 16 Jan 2025 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/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://aerben.github.io/josdk-docs-test/blog/2025/01/06/version-5-released/</link><pubDate>Mon, 06 Jan 2025 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/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://aerben.github.io/josdk-docs-test/blog/2024/12/06/version-5-released-beta1/</link><pubDate>Fri, 06 Dec 2024 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/blog/2024/12/06/version-5-released-beta1/</guid><description>&lt;p&gt;See release notes &lt;a href="https://aerben.github.io/josdk-docs-test/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://aerben.github.io/josdk-docs-test/docs/migration/v2-migration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/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://aerben.github.io/josdk-docs-test/docs/migration/v3-migration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/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://aerben.github.io/josdk-docs-test/docs/migration/v3-1-migration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/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://aerben.github.io/josdk-docs-test/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://aerben.github.io/josdk-docs-test/docs/migration/v4-3-migration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/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://aerben.github.io/josdk-docs-test/docs/migration/v4-4-migration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/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://aerben.github.io/josdk-docs-test/docs/migration/v4-5-migration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/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://aerben.github.io/josdk-docs-test/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://aerben.github.io/josdk-docs-test/docs/migration/v5-0-migration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/docs/migration/v5-0-migration/</guid><description>&lt;p&gt;For migration to v5 see &lt;a href="https://aerben.github.io/josdk-docs-test/blog/2025/01/06/version-5-released/"&gt;this blogpost&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Migrating from v5.1 to v5.2</title><link>https://aerben.github.io/josdk-docs-test/docs/migration/v5-2-migration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/docs/migration/v5-2-migration/</guid><description>&lt;p&gt;Version 5.2 brings some breaking changes to certain components. This document provides
a migration guide for these changes. For all the new features, see the release notes.&lt;/p&gt;
&lt;h2 id="custom-id-types-across-multiple-components-using-resourceidmapper-and-resourceidprovider"&gt;Custom ID types across multiple components using ResourceIDMapper and ResourceIDProvider&lt;/h2&gt;
&lt;p&gt;Working with the id of a resource is needed across various components in the framework.
Until this version, the components provided by the framework assumed that you could easily
convert the id of a resource into a String representation. For example,
&lt;a href="https://github.com/operator-framework/java-operator-sdk/blob/main/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkDependentResource.java#L46"&gt;BulkDependentResources&lt;/a&gt;
worked with a &lt;code&gt;Map&amp;lt;String,R&amp;gt;&lt;/code&gt; of resources, where the id was always of type String.&lt;/p&gt;</description></item><item><title>Migrating from v5.2 to v5.3</title><link>https://aerben.github.io/josdk-docs-test/docs/migration/v5-3-migration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/docs/migration/v5-3-migration/</guid><description>&lt;h2 id="automated-migration-with-openrewrite"&gt;Automated Migration with OpenRewrite&lt;/h2&gt;
&lt;p&gt;You can automatically apply all the migration changes described below using &lt;a href="https://docs.openrewrite.org/"&gt;OpenRewrite&lt;/a&gt;.
Add the following to your &lt;code&gt;pom.xml&lt;/code&gt; and run &lt;code&gt;mvn rewrite:run&lt;/code&gt;:&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-xml" data-lang="xml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.openrewrite.maven&lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;rewrite-maven-plugin&lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;6.33.0&lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;activeRecipes&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;recipe&amp;gt;&lt;/span&gt;io.javaoperatorsdk.operator.migration.V5_3Migration&lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/recipe&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/activeRecipes&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;dependencies&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;io.javaoperatorsdk&lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;migration&lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;5.3.1&lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="rename-of-junit-module"&gt;Rename of JUnit module&lt;/h2&gt;
&lt;p&gt;If you use JUnit extension in your test just rename it from:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
 &amp;lt;groupId&amp;gt;io.javaoperatorsdk&amp;lt;/groupId&amp;gt;
 &amp;lt;artifactId&amp;gt;operator-framework-junit-5&amp;lt;/artifactId&amp;gt;
 &amp;lt;version&amp;gt;5.2.x&amp;lt;version&amp;gt;
 &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;to&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
 &amp;lt;groupId&amp;gt;io.javaoperatorsdk&amp;lt;/groupId&amp;gt;
 &amp;lt;artifactId&amp;gt;operator-framework-junit&amp;lt;/artifactId&amp;gt;
 &amp;lt;version&amp;gt;5.3.0&amp;lt;version&amp;gt;
 &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="metrics-interface-changes"&gt;Metrics interface changes&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://github.com/operator-framework/java-operator-sdk/blob/main/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/monitoring/Metrics.java"&gt;Metrics&lt;/a&gt;
interface changed in non backwards compatible way, in order to make the API cleaner:&lt;/p&gt;</description></item><item><title>Search Results</title><link>https://aerben.github.io/josdk-docs-test/search/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aerben.github.io/josdk-docs-test/search/</guid><description/></item></channel></rss>