fix: promotes keycloak and realm import to v2beta1 (#45840)

closes: #45795

Signed-off-by: Steve Hawkins <shawkins@redhat.com>
This commit is contained in:
Steven Hawkins
2026-04-04 10:46:28 -04:00
committed by GitHub
parent b92e062a39
commit 51b6f9b291
117 changed files with 5324 additions and 382 deletions
+4 -2
View File
@@ -178,8 +178,10 @@ jobs:
- name: Deploy an example Keycloak and wait for it to be ready
working-directory: operator/scripts
run: |
./check-crd-installed.sh keycloaks
./check-crd-installed.sh keycloakrealmimports
./check-crd-installed.sh keycloaks.v2alpha1.k8s.keycloak.org
./check-crd-installed.sh keycloakrealmimports.v2alpha1.k8s.keycloak.org
./check-crd-installed.sh keycloaks.v2beta1.k8s.keycloak.org
./check-crd-installed.sh keycloakrealmimports.v2beta1.k8s.keycloak.org
./deploy-examples.sh
- name: Single namespace cleanup
@@ -318,6 +318,13 @@ Running {project_name} on a database that is not using UTF-8 as a charset is now
In the current version {project_name} will log a warning if the database is not configured to use UTF-8 encoding. Future versions might refuse to work with database that is not configured to use UTF-8 encoding.
=== `Keycloak` and `KeycloakRealmImport` CRDs v2beta1 version
To better capture the maturity of Operator CRDs for the `Keycloak` and `KeycloakRealmImport`, the resources now include a `v2beta1` version.
The previous `v2alpha1` version for these resources is deprecated but still served. You can keep using it but we recommend upgrading to `v2beta1` at your earliest convenience.
There are currently no differences in the schema between the two versions,
so you will just need to update the relevant `apiVersion` references.
// ------------------------ Removed features ------------------------ //
== Removed features
@@ -65,7 +65,7 @@ metadata:
namespace: keycloak-cluster
spec:
scaleTargetRef:
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
name: keycloak
minReplicas: 2
@@ -45,7 +45,7 @@ data:
---
# Source: ispn-helm/templates/infinispan.yaml
# tag::infinispan-cache-actionTokens[]
apiVersion: infinispan.org/v2alpha1
apiVersion: infinispan.org/v2beta1
kind: Cache
metadata:
name: actiontokens
@@ -73,7 +73,7 @@ spec:
---
# Source: ispn-helm/templates/infinispan.yaml
# tag::infinispan-cache-authenticationSessions[]
apiVersion: infinispan.org/v2alpha1
apiVersion: infinispan.org/v2beta1
kind: Cache
metadata:
name: authenticationsessions
@@ -106,7 +106,7 @@ spec:
---
# Source: ispn-helm/templates/infinispan.yaml
# tag::infinispan-cache-clientSessions[]
apiVersion: infinispan.org/v2alpha1
apiVersion: infinispan.org/v2beta1
kind: Cache
metadata:
name: clientsessions
@@ -139,7 +139,7 @@ spec:
---
# Source: ispn-helm/templates/infinispan.yaml
# tag::infinispan-cache-loginFailures[]
apiVersion: infinispan.org/v2alpha1
apiVersion: infinispan.org/v2beta1
kind: Cache
metadata:
name: loginfailures
@@ -172,7 +172,7 @@ spec:
---
# Source: ispn-helm/templates/infinispan.yaml
# tag::infinispan-cache-offlineClientSessions[]
apiVersion: infinispan.org/v2alpha1
apiVersion: infinispan.org/v2beta1
kind: Cache
metadata:
name: offlineclientsessions
@@ -205,7 +205,7 @@ spec:
---
# Source: ispn-helm/templates/infinispan.yaml
# tag::infinispan-cache-offlineSessions[]
apiVersion: infinispan.org/v2alpha1
apiVersion: infinispan.org/v2beta1
kind: Cache
metadata:
name: offlinesessions
@@ -238,7 +238,7 @@ spec:
---
# Source: ispn-helm/templates/infinispan.yaml
# tag::infinispan-cache-sessions[]
apiVersion: infinispan.org/v2alpha1
apiVersion: infinispan.org/v2beta1
kind: Cache
metadata:
name: sessions
@@ -271,7 +271,7 @@ spec:
---
# Source: ispn-helm/templates/infinispan.yaml
# tag::infinispan-cache-work[]
apiVersion: infinispan.org/v2alpha1
apiVersion: infinispan.org/v2beta1
kind: Cache
metadata:
name: work
@@ -179,7 +179,7 @@ spec:
---
# Source: ispn-helm/templates/infinispan.yaml
# tag::infinispan-cache-actionTokens[]
apiVersion: infinispan.org/v2alpha1
apiVersion: infinispan.org/v2beta1
kind: Cache
metadata:
name: actiontokens
@@ -214,7 +214,7 @@ spec:
---
# Source: ispn-helm/templates/infinispan.yaml
# tag::infinispan-cache-authenticationSessions[]
apiVersion: infinispan.org/v2alpha1
apiVersion: infinispan.org/v2beta1
kind: Cache
metadata:
name: authenticationsessions
@@ -254,7 +254,7 @@ spec:
---
# Source: ispn-helm/templates/infinispan.yaml
# tag::infinispan-cache-loginFailures[]
apiVersion: infinispan.org/v2alpha1
apiVersion: infinispan.org/v2beta1
kind: Cache
metadata:
name: loginfailures
@@ -294,7 +294,7 @@ spec:
---
# Source: ispn-helm/templates/infinispan.yaml
# tag::infinispan-cache-work[]
apiVersion: infinispan.org/v2alpha1
apiVersion: infinispan.org/v2beta1
kind: Cache
metadata:
name: work
@@ -179,7 +179,7 @@ spec:
---
# Source: ispn-helm/templates/infinispan.yaml
# tag::infinispan-cache-actionTokens[]
apiVersion: infinispan.org/v2alpha1
apiVersion: infinispan.org/v2beta1
kind: Cache
metadata:
name: actiontokens
@@ -214,7 +214,7 @@ spec:
---
# Source: ispn-helm/templates/infinispan.yaml
# tag::infinispan-cache-authenticationSessions[]
apiVersion: infinispan.org/v2alpha1
apiVersion: infinispan.org/v2beta1
kind: Cache
metadata:
name: authenticationsessions
@@ -254,7 +254,7 @@ spec:
---
# Source: ispn-helm/templates/infinispan.yaml
# tag::infinispan-cache-loginFailures[]
apiVersion: infinispan.org/v2alpha1
apiVersion: infinispan.org/v2beta1
kind: Cache
metadata:
name: loginfailures
@@ -294,7 +294,7 @@ spec:
---
# Source: ispn-helm/templates/infinispan.yaml
# tag::infinispan-cache-work[]
apiVersion: infinispan.org/v2alpha1
apiVersion: infinispan.org/v2beta1
kind: Cache
metadata:
name: work
@@ -191,7 +191,7 @@ spec:
---
# Source: ispn-helm/templates/infinispan.yaml
# tag::infinispan-cache-actionTokens[]
apiVersion: infinispan.org/v2alpha1
apiVersion: infinispan.org/v2beta1
kind: Cache
metadata:
name: actiontokens
@@ -226,7 +226,7 @@ spec:
---
# Source: ispn-helm/templates/infinispan.yaml
# tag::infinispan-cache-authenticationSessions[]
apiVersion: infinispan.org/v2alpha1
apiVersion: infinispan.org/v2beta1
kind: Cache
metadata:
name: authenticationsessions
@@ -266,7 +266,7 @@ spec:
---
# Source: ispn-helm/templates/infinispan.yaml
# tag::infinispan-cache-clientSessions[]
apiVersion: infinispan.org/v2alpha1
apiVersion: infinispan.org/v2beta1
kind: Cache
metadata:
name: clientsessions
@@ -306,7 +306,7 @@ spec:
---
# Source: ispn-helm/templates/infinispan.yaml
# tag::infinispan-cache-loginFailures[]
apiVersion: infinispan.org/v2alpha1
apiVersion: infinispan.org/v2beta1
kind: Cache
metadata:
name: loginfailures
@@ -346,7 +346,7 @@ spec:
---
# Source: ispn-helm/templates/infinispan.yaml
# tag::infinispan-cache-offlineClientSessions[]
apiVersion: infinispan.org/v2alpha1
apiVersion: infinispan.org/v2beta1
kind: Cache
metadata:
name: offlineclientsessions
@@ -386,7 +386,7 @@ spec:
---
# Source: ispn-helm/templates/infinispan.yaml
# tag::infinispan-cache-offlineSessions[]
apiVersion: infinispan.org/v2alpha1
apiVersion: infinispan.org/v2beta1
kind: Cache
metadata:
name: offlinesessions
@@ -426,7 +426,7 @@ spec:
---
# Source: ispn-helm/templates/infinispan.yaml
# tag::infinispan-cache-sessions[]
apiVersion: infinispan.org/v2alpha1
apiVersion: infinispan.org/v2beta1
kind: Cache
metadata:
name: sessions
@@ -466,7 +466,7 @@ spec:
---
# Source: ispn-helm/templates/infinispan.yaml
# tag::infinispan-cache-work[]
apiVersion: infinispan.org/v2alpha1
apiVersion: infinispan.org/v2beta1
kind: Cache
metadata:
name: work
@@ -89,7 +89,7 @@ spec:
# There are several callouts in this YAML marked with `# <1>' etc. See 'running/keycloak-deployment.adoc` for the details.
# tag::keycloak[]
# tag::keycloak-ispn[]
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
labels:
@@ -76,7 +76,7 @@ spec:
# There are several callouts in this YAML marked with `# <1>' etc. See 'running/keycloak-deployment.adoc` for the details.
# tag::keycloak[]
# tag::keycloak-ispn[]
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
labels:
@@ -23,7 +23,7 @@ The following `Batch` CR takes a site offline as described in the operational pr
[source,yaml,subs="+attributes"]
----
apiVersion: infinispan.org/v2alpha1
apiVersion: infinispan.org/v2beta1
kind: Batch
metadata:
name: take-offline
@@ -274,7 +274,7 @@ Perform the following on each of the {project_name} clusters:
[source,yaml]
----
<#noparse>
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
name: keycloak
@@ -58,7 +58,7 @@ kubectl --namespace keycloak create secret generic keycloak-db-secret \
+
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
labels:
+1 -1
View File
@@ -68,7 +68,7 @@ The Keycloak CR has first-class citizen configuration options for telemetry. The
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
name: example-kc
@@ -18,7 +18,7 @@ similar pattern in the CR and use the `httpsPort` field. The following example i
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
name: example-kc
@@ -86,7 +86,7 @@ The values can be expressed as plain text strings or Secret object references as
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
name: example-kc
@@ -117,7 +117,7 @@ Here's an example setting JAVA_OPTS_APPEND:
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
name: example-kc
@@ -156,7 +156,7 @@ The following example illustrates injecting labels, annotations, volumes, and vo
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
name: example-kc
@@ -184,7 +184,7 @@ The Keycloak CR exposes options to set periodSeconds and failureThreshold on eac
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
name: example-kc
@@ -209,7 +209,7 @@ Specifically, you can disable the hostname and TLS as shown in the following exa
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
name: example-kc
@@ -235,7 +235,7 @@ You can specify your custom values based on your requirements as follows:
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
name: example-kc
@@ -263,7 +263,7 @@ An example utilizing all scheduling fields:
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
name: example-kc
@@ -306,7 +306,7 @@ For example the following will remove the use of any server Pod scheduling for t
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
name: example-kc
@@ -325,7 +325,7 @@ You can specify the `port` and the `additionalOptions` as follows:
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
name: example-kc
@@ -351,7 +351,7 @@ Use the truststores stanza of the Keycloak spec to specify Secrets or ConfigMaps
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
name: example-kc
@@ -414,7 +414,7 @@ You can change tracing configuration via Keycloak CR fields as follows:
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
name: example-kc
@@ -457,7 +457,7 @@ To disable the NetworkPolicy, set `spec.networkPolicy.enabled` in your Keycloak
.Keycloak CR with Network Policies enabled
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
name: example-kc
@@ -473,7 +473,7 @@ These rules specify from where (the source) the traffic is allowed, and it is po
.Extended Network Policy configuration
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
name: example-kc
@@ -508,7 +508,7 @@ Based on those requirements, the Keycloak CR would be like this (most parts are
.Keycloak CR
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
name: example-kc
@@ -542,7 +542,7 @@ If you need to set custom labels or annotations to keycloak service you can do t
.Custom service labels and annotations
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
name: example-kc
@@ -604,7 +604,7 @@ A ServiceMonitor is only created if the `metrics-enabled` option is set.
.Enable Keycloak metrics
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
name: example-kc
@@ -657,7 +657,7 @@ You can configure the `interval` and `scrapeTimeout` fields and also `annotation
.Modified ServiceMonitor
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
name: example-kc
@@ -681,7 +681,7 @@ You can prevent the Operator from creating a ServiceMonitor by configuring the K
.Disabled ServiceMonitor
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
name: example-kc
+5 -5
View File
@@ -143,7 +143,7 @@ You can customize several fields using the Keycloak CRD. For a basic deployment,
Create YAML file `example-kc.yaml`:
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
name: example-kc
@@ -206,7 +206,7 @@ Edit YAML file `example-kc.yaml`:
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
name: example-kc
@@ -233,7 +233,7 @@ Example TLS Termination YAML:
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
name: example-kc
@@ -266,7 +266,7 @@ Edit YAML file `example-kc.yaml`:
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
name: example-kc
@@ -305,7 +305,7 @@ If you Ingress implementation sets and overwrites either `Forwarded` or `X-Forwa
in the Keycloak CR as follows:
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
name: example-kc
@@ -32,7 +32,7 @@ To provide a custom image, you define the `image` field in the Keycloak CR as sh
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
name: example-kc
@@ -56,7 +56,7 @@ While it is considered a best practice to use a pre-augmented image, if you want
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
name: example-kc
+3 -3
View File
@@ -26,7 +26,7 @@ The following is an example of a Realm Import Custom Resource (CR):
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: KeycloakRealmImport
metadata:
name: my-realm-kc
@@ -53,7 +53,7 @@ Create YAML file `example-realm-import.yaml`:
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: KeycloakRealmImport
metadata:
name: my-realm-kc
@@ -102,7 +102,7 @@ The `KeycloakRealmImport` CR allows you to leverage this functionality via the `
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: KeycloakRealmImport
metadata:
name: my-realm-kc
+1 -1
View File
@@ -32,7 +32,7 @@ Specify the update strategy within the `spec` section of the Keycloak CR YAML de
[source,yaml]
----
apiVersion: k8s.keycloak.org/v2alpha1
apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
name: example-kc
+4
View File
@@ -46,6 +46,10 @@
</dependency>
<!-- Fabric8 -->
<dependency>
<groupId>io.fabric8</groupId>
<artifactId>crd-generator-api-v2</artifactId>
</dependency>
<dependency>
<groupId>io.fabric8</groupId>
<artifactId>generator-annotations</artifactId>
+5
View File
@@ -69,6 +69,11 @@ yq ea -i '.spec.install.spec.deployments[0].spec.template.metadata.labels.name =
yq ea -i '.spec.install.spec.deployments[0].spec.template.spec.containers[0].env += [{"name": "POD_NAME", "valueFrom": {"fieldRef": {"fieldPath": "metadata.name"}}}]' "$CSV_PATH"
yq ea -i '.spec.install.spec.deployments[0].spec.template.spec.containers[0].env += [{"name": "OPERATOR_NAME", "value": "keycloak-operator"}]' "$CSV_PATH"
# Create entries for both alpha1 and beta1 - the indexing is dependent on whether the client crs are present
yq ea -i '.spec.customresourcedefinitions.owned += [.spec.customresourcedefinitions.owned[] | select(.version == "v2beta1")]' "$CSV_PATH"
yq ea -i '.spec.customresourcedefinitions.owned[2].version = "v2alpha1"' "$CSV_PATH"
yq ea -i '.spec.customresourcedefinitions.owned[3].version = "v2alpha1"' "$CSV_PATH"
{ set +x; } 2>/dev/null
echo ""
echo "Created OLM bundle ok!"
@@ -24,11 +24,12 @@ import java.util.TreeMap;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.keycloak.operator.crds.v2alpha1.deployment.ValueOrSecret;
import org.keycloak.operator.crds.v2beta1.deployment.ValueOrSecret;
public final class Constants {
public static final String CRDS_GROUP = "k8s.keycloak.org";
public static final String CRDS_VERSION = "v2alpha1";
public static final String CRDS_VERSION = "v2beta1";
public static final String CRDS_VERSION_ALPHA = "v2alpha1";
public static final String SHORT_NAME = "kc";
public static final String NAME = "keycloak";
public static final String PLURAL_NAME = "keycloaks";
@@ -21,8 +21,8 @@ import java.util.Optional;
import org.keycloak.operator.controllers.KeycloakDistConfigurator;
import org.keycloak.operator.controllers.WatchedResources;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.realmimport.KeycloakRealmImport;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.realmimport.KeycloakRealmImport;
import org.keycloak.operator.update.UpdateType;
import io.fabric8.kubernetes.api.model.apps.StatefulSet;
@@ -0,0 +1,22 @@
package org.keycloak.operator;
import io.fabric8.crdv2.generator.CRDPostProcessor;
import io.fabric8.kubernetes.api.model.HasMetadata;
import io.fabric8.kubernetes.api.model.apiextensions.v1.CustomResourceDefinition;
public class MultiVersionCRDPostProcessor implements CRDPostProcessor {
@Override
public HasMetadata process(HasMetadata crd, String crdSpecVersion) {
CustomResourceDefinition v1crd = (CustomResourceDefinition) crd;
var mainVersion = v1crd.getSpec().getVersions().get(0);
if (!Constants.CRDS_VERSION_ALPHA.equals(mainVersion.getName())) {
v1crd.getSpec().getVersions()
.add(mainVersion.edit().withDeprecated()
.withDeprecationWarning("Please migrate to " + Constants.CRDS_VERSION)
.withName(Constants.CRDS_VERSION_ALPHA).withStorage(false).build());
}
return v1crd;
}
}
@@ -5,8 +5,8 @@ import java.util.UUID;
import org.keycloak.operator.Constants;
import org.keycloak.operator.Utils;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.BootstrapAdminSpec;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.spec.BootstrapAdminSpec;
import io.fabric8.kubernetes.api.model.Secret;
import io.fabric8.kubernetes.api.model.SecretBuilder;
@@ -64,11 +64,11 @@ import org.keycloak.operator.crds.v2alpha1.client.KeycloakClientSpec;
import org.keycloak.operator.crds.v2alpha1.client.KeycloakClientStatus;
import org.keycloak.operator.crds.v2alpha1.client.KeycloakClientStatusBuilder;
import org.keycloak.operator.crds.v2alpha1.client.KeycloakClientStatusCondition;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.KeycloakStatusAggregator;
import org.keycloak.operator.crds.v2alpha1.deployment.KeycloakStatusCondition;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.FeatureSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.HttpSpec;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.KeycloakStatusAggregator;
import org.keycloak.operator.crds.v2beta1.deployment.KeycloakStatusCondition;
import org.keycloak.operator.crds.v2beta1.deployment.spec.FeatureSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.HttpSpec;
import org.keycloak.representations.admin.v2.BaseClientRepresentation;
import io.fabric8.kubernetes.api.model.Secret;
@@ -85,7 +85,7 @@ import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
import io.quarkus.logging.Log;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import static org.keycloak.operator.crds.v2alpha1.CRDUtils.isTlsConfigured;
import static org.keycloak.operator.crds.v2beta1.CRDUtils.isTlsConfigured;
/**
* Base class for Client controllers.
@@ -214,7 +214,7 @@ public abstract class KeycloakClientBaseController<R extends CustomResource<? ex
return updateControl;
}
private boolean isServerReady(Context<R> context, R resource) {
StatefulSet existingDeployment = context.getClient().resources(StatefulSet.class)
.inNamespace(resource.getMetadata().getNamespace()).withName(resource.getSpec().getKeycloakCRName())
@@ -28,12 +28,12 @@ import org.keycloak.operator.Config;
import org.keycloak.operator.Constants;
import org.keycloak.operator.ContextUtils;
import org.keycloak.operator.Utils;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.KeycloakBuilder;
import org.keycloak.operator.crds.v2alpha1.deployment.KeycloakStatus;
import org.keycloak.operator.crds.v2alpha1.deployment.KeycloakStatusAggregator;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.HostnameSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.HostnameSpecBuilder;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.KeycloakBuilder;
import org.keycloak.operator.crds.v2beta1.deployment.KeycloakStatus;
import org.keycloak.operator.crds.v2beta1.deployment.KeycloakStatusAggregator;
import org.keycloak.operator.crds.v2beta1.deployment.spec.HostnameSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.HostnameSpecBuilder;
import org.keycloak.operator.update.UpdateLogicFactory;
import io.fabric8.kubernetes.api.model.ConfigMap;
@@ -37,19 +37,19 @@ import org.keycloak.operator.Config;
import org.keycloak.operator.Constants;
import org.keycloak.operator.ContextUtils;
import org.keycloak.operator.Utils;
import org.keycloak.operator.crds.v2alpha1.CRDUtils;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.KeycloakSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.ValueOrSecret;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.CacheSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.HttpManagementSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.HttpSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.ProbeSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.SchedulingSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.Truststore;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.TruststoreSource;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.UnsupportedSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.UpdateSpec;
import org.keycloak.operator.crds.v2beta1.CRDUtils;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.KeycloakSpec;
import org.keycloak.operator.crds.v2beta1.deployment.ValueOrSecret;
import org.keycloak.operator.crds.v2beta1.deployment.spec.CacheSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.HttpManagementSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.HttpSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.ProbeSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.SchedulingSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.Truststore;
import org.keycloak.operator.crds.v2beta1.deployment.spec.TruststoreSource;
import org.keycloak.operator.crds.v2beta1.deployment.spec.UnsupportedSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.UpdateSpec;
import org.keycloak.operator.update.impl.RecreateOnImageChangeUpdateLogic;
import io.fabric8.kubernetes.api.model.ConfigMap;
@@ -77,9 +77,9 @@ import io.quarkus.logging.Log;
import static org.keycloak.operator.Utils.addResources;
import static org.keycloak.operator.controllers.KeycloakDistConfigurator.getKeycloakOptionEnvVarName;
import static org.keycloak.operator.crds.v2alpha1.CRDUtils.LEGACY_MANAGEMENT_ENABLED;
import static org.keycloak.operator.crds.v2alpha1.CRDUtils.isTlsConfigured;
import static org.keycloak.operator.crds.v2alpha1.deployment.spec.TelemetrySpec.convertResourceAttributesToString;
import static org.keycloak.operator.crds.v2beta1.CRDUtils.LEGACY_MANAGEMENT_ENABLED;
import static org.keycloak.operator.crds.v2beta1.CRDUtils.isTlsConfigured;
import static org.keycloak.operator.crds.v2beta1.deployment.spec.TelemetrySpec.convertResourceAttributesToString;
@KubernetesDependent(
informer = @Informer(labelSelector = Constants.DEFAULT_LABELS_AS_STRING)
@@ -18,7 +18,7 @@ package org.keycloak.operator.controllers;
import org.keycloak.operator.Constants;
import org.keycloak.operator.Utils;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import io.fabric8.kubernetes.api.model.Service;
import io.fabric8.kubernetes.api.model.ServiceBuilder;
@@ -36,19 +36,19 @@ import jakarta.enterprise.context.ApplicationScoped;
import org.keycloak.common.util.CollectionUtil;
import org.keycloak.operator.Constants;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.KeycloakStatusAggregator;
import org.keycloak.operator.crds.v2alpha1.deployment.ValueOrSecret;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.BootstrapAdminSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.DatabaseSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.FeatureSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.HostnameSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.HttpManagementSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.HttpSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.ProxySpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.TelemetrySpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.TracingSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.TransactionsSpec;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.KeycloakStatusAggregator;
import org.keycloak.operator.crds.v2beta1.deployment.ValueOrSecret;
import org.keycloak.operator.crds.v2beta1.deployment.spec.BootstrapAdminSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.DatabaseSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.FeatureSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.HostnameSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.HttpManagementSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.HttpSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.ProxySpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.TelemetrySpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.TracingSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.TransactionsSpec;
import io.fabric8.kubernetes.api.model.EnvVar;
import io.fabric8.kubernetes.api.model.EnvVarBuilder;
@@ -23,8 +23,8 @@ import java.util.Optional;
import org.keycloak.operator.Constants;
import org.keycloak.operator.Utils;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.IngressSpec;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.spec.IngressSpec;
import io.fabric8.kubernetes.api.model.networking.v1.Ingress;
import io.fabric8.kubernetes.api.model.networking.v1.IngressBuilder;
@@ -39,7 +39,7 @@ import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition;
import io.quarkus.logging.Log;
import org.jboss.logging.Logger;
import static org.keycloak.operator.crds.v2alpha1.CRDUtils.isTlsConfigured;
import static org.keycloak.operator.crds.v2beta1.CRDUtils.isTlsConfigured;
@KubernetesDependent(
informer = @Informer(labelSelector = Constants.DEFAULT_LABELS_AS_STRING)
@@ -23,12 +23,12 @@ import java.util.function.Predicate;
import org.keycloak.operator.Constants;
import org.keycloak.operator.Utils;
import org.keycloak.operator.crds.v2alpha1.CRDUtils;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.KeycloakSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.HttpManagementSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.HttpSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.NetworkPolicySpec;
import org.keycloak.operator.crds.v2beta1.CRDUtils;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.KeycloakSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.HttpManagementSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.HttpSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.NetworkPolicySpec;
import io.fabric8.kubernetes.api.model.IntOrString;
import io.fabric8.kubernetes.api.model.networking.v1.NetworkPolicy;
@@ -23,10 +23,10 @@ import jakarta.inject.Inject;
import org.keycloak.operator.Config;
import org.keycloak.operator.Constants;
import org.keycloak.operator.ContextUtils;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.realmimport.KeycloakRealmImport;
import org.keycloak.operator.crds.v2alpha1.realmimport.KeycloakRealmImportStatus;
import org.keycloak.operator.crds.v2alpha1.realmimport.KeycloakRealmImportStatusBuilder;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.realmimport.KeycloakRealmImport;
import org.keycloak.operator.crds.v2beta1.realmimport.KeycloakRealmImportStatus;
import org.keycloak.operator.crds.v2beta1.realmimport.KeycloakRealmImportStatusBuilder;
import io.fabric8.kubernetes.api.model.apps.StatefulSet;
import io.fabric8.kubernetes.api.model.apps.StatefulSetStatus;
@@ -25,12 +25,12 @@ import java.util.Set;
import org.keycloak.operator.Config;
import org.keycloak.operator.ContextUtils;
import org.keycloak.operator.Utils;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.ImportSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.SchedulingSpec;
import org.keycloak.operator.crds.v2alpha1.realmimport.KeycloakRealmImport;
import org.keycloak.operator.crds.v2alpha1.realmimport.KeycloakRealmImportSpec;
import org.keycloak.operator.crds.v2alpha1.realmimport.Placeholder;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.spec.ImportSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.SchedulingSpec;
import org.keycloak.operator.crds.v2beta1.realmimport.KeycloakRealmImport;
import org.keycloak.operator.crds.v2beta1.realmimport.KeycloakRealmImportSpec;
import org.keycloak.operator.crds.v2beta1.realmimport.Placeholder;
import io.fabric8.kubernetes.api.model.Container;
import io.fabric8.kubernetes.api.model.EnvVarBuilder;
@@ -2,7 +2,7 @@ package org.keycloak.operator.controllers;
import org.keycloak.operator.Constants;
import org.keycloak.operator.Utils;
import org.keycloak.operator.crds.v2alpha1.realmimport.KeycloakRealmImport;
import org.keycloak.operator.crds.v2beta1.realmimport.KeycloakRealmImport;
import io.fabric8.kubernetes.api.model.Secret;
import io.fabric8.kubernetes.api.model.SecretBuilder;
@@ -22,9 +22,9 @@ import java.util.Optional;
import org.keycloak.operator.Constants;
import org.keycloak.operator.Utils;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.HttpManagementSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.HttpSpec;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.spec.HttpManagementSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.HttpSpec;
import io.fabric8.kubernetes.api.model.IntOrString;
import io.fabric8.kubernetes.api.model.Service;
@@ -36,7 +36,7 @@ import io.javaoperatorsdk.operator.api.reconciler.Context;
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource;
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent;
import static org.keycloak.operator.crds.v2alpha1.CRDUtils.isTlsConfigured;
import static org.keycloak.operator.crds.v2beta1.CRDUtils.isTlsConfigured;
@KubernetesDependent(
informer = @Informer(labelSelector = Constants.DEFAULT_LABELS_AS_STRING)
@@ -7,8 +7,8 @@ import java.util.Optional;
import org.keycloak.operator.Constants;
import org.keycloak.operator.Utils;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.ServiceMonitorSpec;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.spec.ServiceMonitorSpec;
import io.fabric8.kubernetes.client.KubernetesClientException;
import io.fabric8.kubernetes.client.Watcher;
@@ -25,8 +25,8 @@ import io.quarkiverse.operatorsdk.annotations.CSVMetadata;
import io.quarkus.logging.Log;
import static org.keycloak.operator.controllers.KeycloakDeploymentDependentResource.managementEndpoint;
import static org.keycloak.operator.crds.v2alpha1.CRDUtils.METRICS_ENABLED;
import static org.keycloak.operator.crds.v2alpha1.CRDUtils.configuredOptions;
import static org.keycloak.operator.crds.v2beta1.CRDUtils.METRICS_ENABLED;
import static org.keycloak.operator.crds.v2beta1.CRDUtils.configuredOptions;
@KubernetesDependent(
informer = @Informer(labelSelector = Constants.DEFAULT_LABELS_AS_STRING)
@@ -82,7 +82,7 @@ import io.quarkiverse.operatorsdk.annotations.SharedCSVMetadata;
"""
[
{
"apiVersion": "k8s.keycloak.org/v2alpha1",
"apiVersion": "k8s.keycloak.org/v2beta1",
"kind": "Keycloak",
"metadata": {
"name": "example-keycloak",
@@ -101,7 +101,7 @@ import io.quarkiverse.operatorsdk.annotations.SharedCSVMetadata;
}
},
{
"apiVersion": "k8s.keycloak.org/v2alpha1",
"apiVersion": "k8s.keycloak.org/v2beta1",
"kind": "KeycloakRealmImport",
"metadata": {
"name": "example-keycloak-realm-import",
@@ -31,10 +31,10 @@ import jakarta.enterprise.context.ApplicationScoped;
import org.keycloak.operator.Constants;
import org.keycloak.operator.ContextUtils;
import org.keycloak.operator.Utils;
import org.keycloak.operator.crds.v2alpha1.CRDUtils;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.KeycloakSpecBuilder;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.UpdateSpec;
import org.keycloak.operator.crds.v2beta1.CRDUtils;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.KeycloakSpecBuilder;
import org.keycloak.operator.crds.v2beta1.deployment.spec.UpdateSpec;
import io.fabric8.kubernetes.api.model.ContainerFluent;
import io.fabric8.kubernetes.api.model.HasMetadata;
@@ -28,7 +28,7 @@ import java.util.stream.Stream;
import jakarta.enterprise.context.ApplicationScoped;
import org.keycloak.operator.Utils;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import io.fabric8.kubernetes.api.model.HasMetadata;
import io.fabric8.kubernetes.api.model.apps.StatefulSet;
@@ -17,7 +17,7 @@
package org.keycloak.operator.crds.v2alpha1.client;
import org.keycloak.operator.crds.v2alpha1.StatusCondition;
import org.keycloak.operator.crds.v2beta1.StatusCondition;
// TODO: we may want to simply eliminate this until a specialization is needed
public class KeycloakClientStatusCondition extends StatusCondition {
@@ -33,7 +33,7 @@ import io.sundr.builder.annotations.BuildableReference;
displayName="KeycloakOIDCClient"
)
@Group(Constants.CRDS_GROUP)
@Version(Constants.CRDS_VERSION)
@Version(Constants.CRDS_VERSION_ALPHA)
@Buildable(editableEnabled = false, builderPackage = "io.fabric8.kubernetes.api.builder",
lazyCollectionInitEnabled = false, refs = {
@BuildableReference(io.fabric8.kubernetes.api.model.ObjectMeta.class),
@@ -33,7 +33,7 @@ import io.sundr.builder.annotations.BuildableReference;
displayName="KeycloakSAMLClient"
)
@Group(Constants.CRDS_GROUP)
@Version(Constants.CRDS_VERSION)
@Version(Constants.CRDS_VERSION_ALPHA)
@Buildable(editableEnabled = false, builderPackage = "io.fabric8.kubernetes.api.builder",
lazyCollectionInitEnabled = false, refs = {
@BuildableReference(io.fabric8.kubernetes.api.model.ObjectMeta.class),
@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.keycloak.operator.crds.v2alpha1;
package org.keycloak.operator.crds.v2beta1;
import java.util.Collection;
import java.util.HashMap;
@@ -25,10 +25,10 @@ import java.util.Optional;
import java.util.function.Predicate;
import org.keycloak.operator.Constants;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.KeycloakSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.FeatureSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.HttpSpec;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.KeycloakSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.FeatureSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.HttpSpec;
import com.fasterxml.jackson.databind.JsonNode;
import io.fabric8.kubernetes.api.model.Container;
@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.keycloak.operator.crds.v2alpha1;
package org.keycloak.operator.crds.v2beta1;
import java.util.Objects;
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.operator.crds.v2alpha1.deployment;
package org.keycloak.operator.crds.v2beta1.deployment;
import org.keycloak.operator.Constants;
@@ -28,20 +28,15 @@ import io.quarkiverse.operatorsdk.annotations.CSVMetadata;
import io.sundr.builder.annotations.Buildable;
import io.sundr.builder.annotations.BuildableReference;
@CSVMetadata(
description="Represents a Keycloak Instance",
displayName="Keycloak"
)
@CSVMetadata(description = "Represents a Keycloak Instance", displayName = "Keycloak")
@Group(Constants.CRDS_GROUP)
@Version(Constants.CRDS_VERSION)
@Version(value = Constants.CRDS_VERSION, storage = true)
@ShortNames(Constants.SHORT_NAME)
@Plural(Constants.PLURAL_NAME)
@Buildable(editableEnabled = false, builderPackage = "io.fabric8.kubernetes.api.builder",
lazyCollectionInitEnabled = false, refs = {
@Buildable(editableEnabled = false, builderPackage = "io.fabric8.kubernetes.api.builder", lazyCollectionInitEnabled = false, refs = {
@BuildableReference(io.fabric8.kubernetes.api.model.ObjectMeta.class),
@BuildableReference(io.fabric8.kubernetes.client.CustomResource.class),
@BuildableReference(KeycloakSpec.class)
})
@BuildableReference(KeycloakSpec.class) })
public class Keycloak extends CustomResource<KeycloakSpec, KeycloakStatus> implements Namespaced {
}
@@ -14,34 +14,34 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.operator.crds.v2alpha1.deployment;
package org.keycloak.operator.crds.v2beta1.deployment;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.AdminSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.BootstrapAdminSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.CacheSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.DatabaseSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.FeatureSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.HostnameSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.HttpManagementSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.HttpSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.ImportSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.IngressSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.NetworkPolicySpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.ProbeSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.ProxySpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.SchedulingSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.ServiceMonitorSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.TelemetrySpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.TracingSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.TransactionsSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.Truststore;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.UnsupportedSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.UpdateSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.AdminSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.BootstrapAdminSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.CacheSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.DatabaseSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.FeatureSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.HostnameSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.HttpManagementSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.HttpSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.ImportSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.IngressSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.NetworkPolicySpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.ProbeSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.ProxySpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.SchedulingSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.ServiceMonitorSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.TelemetrySpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.TracingSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.TransactionsSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.Truststore;
import org.keycloak.operator.crds.v2beta1.deployment.spec.UnsupportedSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.UpdateSpec;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.operator.crds.v2alpha1.deployment;
package org.keycloak.operator.crds.v2beta1.deployment;
import java.util.List;
import java.util.Objects;
@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.keycloak.operator.crds.v2alpha1.deployment;
package org.keycloak.operator.crds.v2beta1.deployment;
import java.util.ArrayList;
import java.util.List;
@@ -27,7 +27,7 @@ import java.util.function.Function;
import java.util.stream.Collectors;
import org.keycloak.operator.Utils;
import org.keycloak.operator.crds.v2alpha1.StatusCondition;
import org.keycloak.operator.crds.v2beta1.StatusCondition;
/**
* @author Vaclav Muzikar <vmuzikar@redhat.com>
@@ -15,9 +15,9 @@
* limitations under the License.
*/
package org.keycloak.operator.crds.v2alpha1.deployment;
package org.keycloak.operator.crds.v2beta1.deployment;
import org.keycloak.operator.crds.v2alpha1.StatusCondition;
import org.keycloak.operator.crds.v2beta1.StatusCondition;
/**
* @author Vaclav Muzikar <vmuzikar@redhat.com>
@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.keycloak.operator.crds.v2alpha1.deployment;
package org.keycloak.operator.crds.v2beta1.deployment;
import java.util.Objects;
@@ -1,4 +1,4 @@
package org.keycloak.operator.crds.v2alpha1.deployment.spec;
package org.keycloak.operator.crds.v2beta1.deployment.spec;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonPropertyDescription;
@@ -1,4 +1,4 @@
package org.keycloak.operator.crds.v2alpha1.deployment.spec;
package org.keycloak.operator.crds.v2beta1.deployment.spec;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonPropertyDescription;
@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.keycloak.operator.crds.v2alpha1.deployment.spec;
package org.keycloak.operator.crds.v2beta1.deployment.spec;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.fabric8.kubernetes.api.model.ConfigMapKeySelector;
@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.keycloak.operator.crds.v2alpha1.deployment.spec;
package org.keycloak.operator.crds.v2beta1.deployment.spec;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonPropertyDescription;
@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.keycloak.operator.crds.v2alpha1.deployment.spec;
package org.keycloak.operator.crds.v2beta1.deployment.spec;
import java.io.Serializable;
import java.util.List;
@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.keycloak.operator.crds.v2alpha1.deployment.spec;
package org.keycloak.operator.crds.v2beta1.deployment.spec;
import java.io.Serializable;
@@ -14,12 +14,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.operator.crds.v2alpha1.deployment.spec;
package org.keycloak.operator.crds.v2beta1.deployment.spec;
import org.keycloak.operator.Constants;
import org.keycloak.operator.crds.v2alpha1.CRDUtils;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.KeycloakSpec;
import org.keycloak.operator.crds.v2beta1.CRDUtils;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.KeycloakSpec;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonPropertyDescription;
@@ -15,15 +15,15 @@
* limitations under the License.
*/
package org.keycloak.operator.crds.v2alpha1.deployment.spec;
package org.keycloak.operator.crds.v2beta1.deployment.spec;
import java.util.Map;
import java.util.Optional;
import org.keycloak.operator.Constants;
import org.keycloak.operator.crds.v2alpha1.CRDUtils;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.KeycloakSpec;
import org.keycloak.operator.crds.v2beta1.CRDUtils;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.KeycloakSpec;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonPropertyDescription;
@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.keycloak.operator.crds.v2alpha1.deployment.spec;
package org.keycloak.operator.crds.v2beta1.deployment.spec;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.keycloak.operator.crds.v2alpha1.deployment.spec;
package org.keycloak.operator.crds.v2beta1.deployment.spec;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -15,15 +15,15 @@
* limitations under the License.
*/
package org.keycloak.operator.crds.v2alpha1.deployment.spec;
package org.keycloak.operator.crds.v2beta1.deployment.spec;
import java.util.List;
import java.util.Optional;
import org.keycloak.operator.Constants;
import org.keycloak.operator.crds.v2alpha1.CRDUtils;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.KeycloakSpec;
import org.keycloak.operator.crds.v2beta1.CRDUtils;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.KeycloakSpec;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
@@ -1,4 +1,4 @@
package org.keycloak.operator.crds.v2alpha1.deployment.spec;
package org.keycloak.operator.crds.v2beta1.deployment.spec;
import com.fasterxml.jackson.annotation.JsonInclude;
@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.keycloak.operator.crds.v2alpha1.deployment.spec;
package org.keycloak.operator.crds.v2beta1.deployment.spec;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonPropertyDescription;
@@ -1,4 +1,4 @@
package org.keycloak.operator.crds.v2alpha1.deployment.spec;
package org.keycloak.operator.crds.v2beta1.deployment.spec;
import java.util.ArrayList;
import java.util.List;
@@ -1,10 +1,10 @@
package org.keycloak.operator.crds.v2alpha1.deployment.spec;
package org.keycloak.operator.crds.v2beta1.deployment.spec;
import java.util.Map;
import org.keycloak.operator.crds.v2alpha1.CRDUtils;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.KeycloakSpec;
import org.keycloak.operator.crds.v2beta1.CRDUtils;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.KeycloakSpec;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonPropertyDescription;
@@ -1,4 +1,4 @@
package org.keycloak.operator.crds.v2alpha1.deployment.spec;
package org.keycloak.operator.crds.v2beta1.deployment.spec;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.keycloak.operator.crds.v2alpha1.deployment.spec;
package org.keycloak.operator.crds.v2beta1.deployment.spec;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -25,7 +25,7 @@ import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonPropertyDescription;
import io.sundr.builder.annotations.Buildable;
import static org.keycloak.operator.crds.v2alpha1.deployment.spec.TelemetrySpec.convertResourceAttributesToString;
import static org.keycloak.operator.crds.v2beta1.deployment.spec.TelemetrySpec.convertResourceAttributesToString;
@JsonInclude(JsonInclude.Include.NON_NULL)
@Buildable(editableEnabled = false, builderPackage = "io.fabric8.kubernetes.api.builder")
@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.keycloak.operator.crds.v2alpha1.deployment.spec;
package org.keycloak.operator.crds.v2beta1.deployment.spec;
import java.io.Serializable;
@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.keycloak.operator.crds.v2alpha1.deployment.spec;
package org.keycloak.operator.crds.v2beta1.deployment.spec;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonPropertyDescription;
@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.keycloak.operator.crds.v2alpha1.deployment.spec;
package org.keycloak.operator.crds.v2beta1.deployment.spec;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.fabric8.generator.annotation.Required;
@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.keycloak.operator.crds.v2alpha1.deployment.spec;
package org.keycloak.operator.crds.v2beta1.deployment.spec;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonPropertyDescription;
@@ -15,15 +15,15 @@
* limitations under the License.
*/
package org.keycloak.operator.crds.v2alpha1.deployment.spec;
package org.keycloak.operator.crds.v2beta1.deployment.spec;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Optional;
import org.keycloak.operator.crds.v2alpha1.CRDUtils;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.KeycloakSpec;
import org.keycloak.operator.crds.v2beta1.CRDUtils;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.KeycloakSpec;
import org.keycloak.operator.update.UpdateStrategy;
import com.fasterxml.jackson.annotation.JsonInclude;
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.operator.crds.v2alpha1.realmimport;
package org.keycloak.operator.crds.v2beta1.realmimport;
import org.keycloak.operator.Constants;
import org.keycloak.representations.idm.ComponentExportRepresentation;
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.operator.crds.v2alpha1.realmimport;
package org.keycloak.operator.crds.v2beta1.realmimport;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -14,14 +14,14 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.operator.crds.v2alpha1.realmimport;
package org.keycloak.operator.crds.v2beta1.realmimport;
import java.util.List;
import java.util.Objects;
import com.fasterxml.jackson.annotation.JsonIgnore;
import static org.keycloak.operator.crds.v2alpha1.realmimport.KeycloakRealmImportStatusCondition.DONE;
import static org.keycloak.operator.crds.v2beta1.realmimport.KeycloakRealmImportStatusCondition.DONE;
public class KeycloakRealmImportStatus {
private List<KeycloakRealmImportStatusCondition> conditions;
@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.keycloak.operator.crds.v2alpha1.realmimport;
package org.keycloak.operator.crds.v2beta1.realmimport;
import java.util.ArrayList;
import java.util.List;
@@ -15,9 +15,9 @@
* limitations under the License.
*/
package org.keycloak.operator.crds.v2alpha1.realmimport;
package org.keycloak.operator.crds.v2beta1.realmimport;
import org.keycloak.operator.crds.v2alpha1.StatusCondition;
import org.keycloak.operator.crds.v2beta1.StatusCondition;
public class KeycloakRealmImportStatusCondition extends StatusCondition {
public static final String DONE = "Done";
@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.keycloak.operator.crds.v2alpha1.realmimport;
package org.keycloak.operator.crds.v2beta1.realmimport;
import java.util.Objects;
@@ -19,8 +19,8 @@ package org.keycloak.operator.update;
import java.util.Optional;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.KeycloakStatusAggregator;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.KeycloakStatusAggregator;
import io.fabric8.kubernetes.api.model.apps.StatefulSet;
import io.javaoperatorsdk.operator.api.reconciler.Context;
@@ -21,8 +21,8 @@ import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import org.keycloak.operator.controllers.KeycloakUpdateJobDependentResource;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.UpdateSpec;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.spec.UpdateSpec;
import org.keycloak.operator.update.impl.AutoUpdateLogic;
import org.keycloak.operator.update.impl.ExplicitUpdateLogic;
import org.keycloak.operator.update.impl.RecreateOnImageChangeUpdateLogic;
@@ -23,8 +23,8 @@ import java.util.Optional;
import java.util.stream.Stream;
import org.keycloak.operator.controllers.KeycloakUpdateJobDependentResource;
import org.keycloak.operator.crds.v2alpha1.CRDUtils;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.CRDUtils;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import io.fabric8.kubernetes.api.model.ContainerState;
import io.fabric8.kubernetes.api.model.ContainerStateTerminated;
@@ -26,9 +26,9 @@ import java.util.stream.Collectors;
import org.keycloak.operator.ContextUtils;
import org.keycloak.operator.controllers.KeycloakDeploymentDependentResource;
import org.keycloak.operator.crds.v2alpha1.CRDUtils;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.KeycloakStatusAggregator;
import org.keycloak.operator.crds.v2beta1.CRDUtils;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.KeycloakStatusAggregator;
import org.keycloak.operator.update.UpdateLogic;
import org.keycloak.operator.update.UpdateType;
@@ -4,9 +4,9 @@ import java.util.Objects;
import java.util.Optional;
import org.keycloak.operator.ContextUtils;
import org.keycloak.operator.crds.v2alpha1.CRDUtils;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.UpdateSpec;
import org.keycloak.operator.crds.v2beta1.CRDUtils;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.spec.UpdateSpec;
import io.javaoperatorsdk.operator.api.reconciler.Context;
import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
@@ -21,8 +21,8 @@ import java.util.Objects;
import java.util.Optional;
import org.keycloak.operator.ContextUtils;
import org.keycloak.operator.crds.v2alpha1.CRDUtils;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.CRDUtils;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.update.UpdateType;
import io.fabric8.kubernetes.api.model.Container;
@@ -32,3 +32,5 @@ quarkus.operator-sdk.namespaces=JOSDK_WATCH_CURRENT
quarkus.operator-sdk.generate-with-watched-namespaces=JOSDK_WATCH_CURRENT
quarkus.docker.additional-args=--ulimit,nofile=1024000
quarkus.operator-sdk.crd.post-processor=org.keycloak.operator.MultiVersionCRDPostProcessor
@@ -17,8 +17,8 @@
package org.keycloak.operator.controllers;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.KeycloakBuilder;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.KeycloakBuilder;
import org.junit.jupiter.api.Test;
@@ -21,11 +21,11 @@ import java.io.FileNotFoundException;
import org.keycloak.operator.crds.v2alpha1.client.KeycloakOIDCClient;
import org.keycloak.operator.crds.v2alpha1.client.KeycloakOIDCClientBuilder;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.KeycloakBuilder;
import org.keycloak.operator.crds.v2alpha1.deployment.KeycloakStatusAggregator;
import org.keycloak.operator.crds.v2alpha1.realmimport.KeycloakRealmImport;
import org.keycloak.operator.crds.v2alpha1.realmimport.KeycloakRealmImportBuilder;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.KeycloakBuilder;
import org.keycloak.operator.crds.v2beta1.deployment.KeycloakStatusAggregator;
import org.keycloak.operator.crds.v2beta1.realmimport.KeycloakRealmImport;
import org.keycloak.operator.crds.v2beta1.realmimport.KeycloakRealmImportBuilder;
import org.keycloak.operator.testsuite.integration.BaseOperatorTest;
import org.keycloak.operator.testsuite.utils.K8sUtils;
import org.keycloak.operator.update.UpdateStrategy;
@@ -0,0 +1,64 @@
/*
* Copyright 2022 Red Hat, Inc. and/or its affiliates
* and other contributors as indicated by the @author tags.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.operator.testsuite.apiserver;
import java.io.FileNotFoundException;
import java.util.concurrent.TimeUnit;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.testsuite.integration.BaseOperatorTest;
import org.keycloak.operator.testsuite.utils.K8sUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.fabric8.kubeapitest.junit.EnableKubeAPIServer;
import io.fabric8.kubernetes.client.KubernetesClient;
import org.awaitility.Awaitility;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
@EnableKubeAPIServer
public class CRDUpgradeTest {
static KubernetesClient client;
static final ObjectMapper mapper = new ObjectMapper();
@Test
public void testKeycloak() throws FileNotFoundException {
//start with the v2alpha1 crd
K8sUtils.set(client, this.getClass().getResourceAsStream("/v2alpha1-keycloak-crd.yaml"));
Awaitility.await().pollInterval(100, TimeUnit.MILLISECONDS).ignoreExceptions().until(() -> {
return !client.getApiResources("k8s.keycloak.org/v2alpha1").getResources().isEmpty();
});
var resource = client.resource(getClass().getResourceAsStream("/example-keycloak.yaml"));
var result = resource.create();
assertEquals("k8s.keycloak.org/v2alpha1", result.getApiVersion());
// update the CRD
BaseOperatorTest.createCRDs(client);
// ensure that v2beta1 works
var kc = client.resources(Keycloak.class).withName("example-kc").get();
assertEquals("k8s.keycloak.org/v2beta1", kc.getApiVersion());
assertEquals("xforwarded", kc.getSpec().getProxySpec().getHeaders());
}
}
@@ -51,12 +51,12 @@ import org.keycloak.operator.controllers.KeycloakSAMLClientController;
import org.keycloak.operator.controllers.KeycloakUpdateJobDependentResource;
import org.keycloak.operator.crds.v2alpha1.client.KeycloakOIDCClient;
import org.keycloak.operator.crds.v2alpha1.client.KeycloakSAMLClient;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.KeycloakBuilder;
import org.keycloak.operator.crds.v2alpha1.deployment.KeycloakSpecBuilder;
import org.keycloak.operator.crds.v2alpha1.deployment.KeycloakStatus;
import org.keycloak.operator.crds.v2alpha1.realmimport.KeycloakRealmImport;
import org.keycloak.operator.crds.v2alpha1.realmimport.KeycloakRealmImportStatus;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.KeycloakBuilder;
import org.keycloak.operator.crds.v2beta1.deployment.KeycloakSpecBuilder;
import org.keycloak.operator.crds.v2beta1.deployment.KeycloakStatus;
import org.keycloak.operator.crds.v2beta1.realmimport.KeycloakRealmImport;
import org.keycloak.operator.crds.v2beta1.realmimport.KeycloakRealmImportStatus;
import org.keycloak.operator.testsuite.apiserver.ApiServerHelper;
import org.keycloak.operator.testsuite.apiserver.DisabledIfApiServerTest;
import org.keycloak.operator.testsuite.utils.K8sUtils;
@@ -21,9 +21,9 @@ import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeUnit;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.KeycloakStatusCondition;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.CacheSpecBuilder;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.KeycloakStatusCondition;
import org.keycloak.operator.crds.v2beta1.deployment.spec.CacheSpecBuilder;
import org.keycloak.operator.testsuite.apiserver.DisabledIfApiServerTest;
import org.keycloak.operator.testsuite.utils.CRAssert;
import org.keycloak.operator.testsuite.utils.K8sUtils;
@@ -23,10 +23,10 @@ import java.util.function.Function;
import org.keycloak.operator.Constants;
import org.keycloak.operator.controllers.KeycloakServiceDependentResource;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.KeycloakStatusCondition;
import org.keycloak.operator.crds.v2alpha1.realmimport.KeycloakRealmImport;
import org.keycloak.operator.crds.v2alpha1.realmimport.KeycloakRealmImportStatusCondition;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.KeycloakStatusCondition;
import org.keycloak.operator.crds.v2beta1.realmimport.KeycloakRealmImport;
import org.keycloak.operator.crds.v2beta1.realmimport.KeycloakRealmImportStatusCondition;
import org.keycloak.operator.testsuite.apiserver.DisabledIfApiServerTest;
import org.keycloak.operator.testsuite.utils.CRAssert;
import org.keycloak.operator.testsuite.utils.K8sUtils;
@@ -37,12 +37,12 @@ import org.keycloak.operator.crds.v2alpha1.client.KeycloakOIDCClientBuilder;
import org.keycloak.operator.crds.v2alpha1.client.KeycloakOIDCClientRepresentation.AuthWithSecretRef;
import org.keycloak.operator.crds.v2alpha1.client.KeycloakSAMLClient;
import org.keycloak.operator.crds.v2alpha1.client.KeycloakSAMLClientBuilder;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.ValueOrSecret;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.AdminSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.BootstrapAdminSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.FeatureSpecBuilder;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.TruststoreBuilder;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.ValueOrSecret;
import org.keycloak.operator.crds.v2beta1.deployment.spec.AdminSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.BootstrapAdminSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.FeatureSpecBuilder;
import org.keycloak.operator.crds.v2beta1.deployment.spec.TruststoreBuilder;
import org.keycloak.operator.testsuite.apiserver.DisabledIfApiServerTest;
import org.keycloak.operator.testsuite.utils.K8sUtils;
@@ -35,12 +35,12 @@ import org.keycloak.operator.Constants;
import org.keycloak.operator.controllers.KeycloakAdminSecretDependentResource;
import org.keycloak.operator.controllers.KeycloakDistConfigurator;
import org.keycloak.operator.controllers.KeycloakServiceDependentResource;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.KeycloakStatusCondition;
import org.keycloak.operator.crds.v2alpha1.deployment.ValueOrSecret;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.BootstrapAdminSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.FeatureSpecBuilder;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.HostnameSpecBuilder;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.KeycloakStatusCondition;
import org.keycloak.operator.crds.v2beta1.deployment.ValueOrSecret;
import org.keycloak.operator.crds.v2beta1.deployment.spec.BootstrapAdminSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.FeatureSpecBuilder;
import org.keycloak.operator.crds.v2beta1.deployment.spec.HostnameSpecBuilder;
import org.keycloak.operator.testsuite.apiserver.DisabledIfApiServerTest;
import org.keycloak.operator.testsuite.unit.WatchedResourcesTest;
import org.keycloak.operator.testsuite.utils.CRAssert;
@@ -22,10 +22,10 @@ import java.util.Map;
import org.keycloak.operator.Constants;
import org.keycloak.operator.controllers.KeycloakController;
import org.keycloak.operator.controllers.KeycloakIngressDependentResource;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.HostnameSpecBuilder;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.IngressSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.IngressSpecBuilder;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.spec.HostnameSpecBuilder;
import org.keycloak.operator.crds.v2beta1.deployment.spec.IngressSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.IngressSpecBuilder;
import org.keycloak.operator.testsuite.apiserver.DisabledIfApiServerTest;
import org.keycloak.operator.testsuite.utils.K8sUtils;
@@ -22,9 +22,9 @@ import java.util.List;
import java.util.Map;
import org.keycloak.operator.controllers.KeycloakServiceDependentResource;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.FeatureSpec;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.UnsupportedSpec;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.spec.FeatureSpec;
import org.keycloak.operator.crds.v2beta1.deployment.spec.UnsupportedSpec;
import org.keycloak.operator.testsuite.apiserver.DisabledIfApiServerTest;
import org.keycloak.operator.testsuite.utils.TrustAllSSLContext;
import org.keycloak.representations.idm.ClientRepresentation;
@@ -23,10 +23,10 @@ import java.util.Map;
import org.keycloak.operator.Constants;
import org.keycloak.operator.Utils;
import org.keycloak.operator.controllers.KeycloakController;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.HostnameSpecBuilder;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.IngressSpecBuilder;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.NetworkPolicySpec;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.spec.HostnameSpecBuilder;
import org.keycloak.operator.crds.v2beta1.deployment.spec.IngressSpecBuilder;
import org.keycloak.operator.crds.v2beta1.deployment.spec.NetworkPolicySpec;
import org.keycloak.operator.testsuite.apiserver.DisabledIfApiServerTest;
import org.keycloak.operator.testsuite.utils.CRAssert;
import org.keycloak.operator.testsuite.utils.K8sUtils;
@@ -1,7 +1,7 @@
package org.keycloak.operator.testsuite.integration;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.deployment.ValueOrSecret;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.ValueOrSecret;
import org.keycloak.utils.StringUtil;
import io.quarkus.test.junit.QuarkusTest;
@@ -17,7 +17,7 @@
package org.keycloak.operator.testsuite.integration;
import org.keycloak.operator.crds.v2alpha1.deployment.spec.TruststoreBuilder;
import org.keycloak.operator.crds.v2beta1.deployment.spec.TruststoreBuilder;
import org.keycloak.operator.testsuite.apiserver.DisabledIfApiServerTest;
import org.keycloak.operator.testsuite.unit.WatchedResourcesTest;
import org.keycloak.operator.testsuite.utils.K8sUtils;
@@ -21,7 +21,7 @@ import java.util.Collections;
import java.util.concurrent.TimeUnit;
import org.keycloak.operator.Utils;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.testsuite.apiserver.DisabledIfApiServerTest;
import org.keycloak.operator.testsuite.utils.CRAssert;
import org.keycloak.operator.testsuite.utils.K8sUtils;
@@ -42,7 +42,7 @@ import org.junit.jupiter.api.Test;
import static java.util.concurrent.TimeUnit.MINUTES;
import static org.keycloak.operator.crds.v2alpha1.deployment.KeycloakStatusCondition.HAS_ERRORS;
import static org.keycloak.operator.crds.v2beta1.deployment.KeycloakStatusCondition.HAS_ERRORS;
import static org.keycloak.operator.testsuite.utils.K8sUtils.deployKeycloak;
import static org.keycloak.operator.testsuite.utils.K8sUtils.getResourceFromFile;
@@ -25,9 +25,9 @@ import jakarta.inject.Inject;
import org.keycloak.operator.Config;
import org.keycloak.operator.controllers.KeycloakServiceDependentResource;
import org.keycloak.operator.crds.v2alpha1.deployment.Keycloak;
import org.keycloak.operator.crds.v2alpha1.realmimport.KeycloakRealmImport;
import org.keycloak.operator.crds.v2alpha1.realmimport.Placeholder;
import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.realmimport.KeycloakRealmImport;
import org.keycloak.operator.crds.v2beta1.realmimport.Placeholder;
import org.keycloak.operator.testsuite.apiserver.DisabledIfApiServerTest;
import org.keycloak.operator.testsuite.utils.CRAssert;
import org.keycloak.operator.testsuite.utils.K8sUtils;
@@ -53,9 +53,9 @@ import static java.util.concurrent.TimeUnit.SECONDS;
import static org.keycloak.operator.Constants.KEYCLOAK_HTTPS_PORT;
import static org.keycloak.operator.controllers.KeycloakDistConfigurator.getKeycloakOptionEnvVarName;
import static org.keycloak.operator.crds.v2alpha1.realmimport.KeycloakRealmImportStatusCondition.DONE;
import static org.keycloak.operator.crds.v2alpha1.realmimport.KeycloakRealmImportStatusCondition.HAS_ERRORS;
import static org.keycloak.operator.crds.v2alpha1.realmimport.KeycloakRealmImportStatusCondition.STARTED;
import static org.keycloak.operator.crds.v2beta1.realmimport.KeycloakRealmImportStatusCondition.DONE;
import static org.keycloak.operator.crds.v2beta1.realmimport.KeycloakRealmImportStatusCondition.HAS_ERRORS;
import static org.keycloak.operator.crds.v2beta1.realmimport.KeycloakRealmImportStatusCondition.STARTED;
import static org.keycloak.operator.testsuite.utils.K8sUtils.deployKeycloak;
import static org.keycloak.operator.testsuite.utils.K8sUtils.getResourceFromFile;
import static org.keycloak.operator.testsuite.utils.K8sUtils.inClusterCurl;
@@ -134,14 +134,11 @@ public class RealmImportTest extends BaseOperatorTest {
deployKeycloak(k8sclient, kc, false);
// Act
k8sclient.getKubernetesSerialization().registerKubernetesResource(KeycloakRealmImport.class);
K8sUtils.set(k8sclient, getClass().getResourceAsStream("/example-realm.yaml"), obj -> {
KeycloakRealmImport realmImport = (KeycloakRealmImport) obj;
realmImport.getSpec().getRealm().setSmtpServer(Map.of("port", "${MY_SMTP_PORT}", "host", "${MY_SMTP_SERVER}", "from", "admin@keycloak.org"));
realmImport.getSpec().setPlaceholders(Map.of("MY_SMTP_PORT", new Placeholder(new SecretKeySelectorBuilder().withName("keycloak-smtp-secret").withKey("SMTP_PORT").build()),
"MY_SMTP_SERVER", new Placeholder(new SecretKeySelectorBuilder().withName("keycloak-smtp-secret").withKey("SMTP_SERVER").build())));
return realmImport;
});
KeycloakRealmImport realmImport = k8sclient.getKubernetesSerialization().unmarshal(getClass().getResourceAsStream("/example-realm.yaml"), KeycloakRealmImport.class);
realmImport.getSpec().getRealm().setSmtpServer(Map.of("port", "${MY_SMTP_PORT}", "host", "${MY_SMTP_SERVER}", "from", "admin@keycloak.org"));
realmImport.getSpec().setPlaceholders(Map.of("MY_SMTP_PORT", new Placeholder(new SecretKeySelectorBuilder().withName("keycloak-smtp-secret").withKey("SMTP_PORT").build()),
"MY_SMTP_SERVER", new Placeholder(new SecretKeySelectorBuilder().withName("keycloak-smtp-secret").withKey("SMTP_SERVER").build())));
K8sUtils.set(k8sclient, realmImport);
// Assert
var envvars = assertWorkingRealmImport(kc);

Some files were not shown because too many files have changed in this diff Show More