From 3246a154426b4d4df4b2eecb533e63ddd501f07e Mon Sep 17 00:00:00 2001 From: Alex Szczuczko Date: Tue, 30 May 2023 15:01:12 -0600 Subject: [PATCH] Use quarkus-operator-sdk-bundle-generator for OLM YAMLs Closes #10911 --- operator/olm-assembly.xml | 26 ++++ operator/olm-base/bundle.Dockerfile | 14 -- .../manifests/clusterserviceversion.yaml | 143 ------------------ operator/olm-base/metadata/annotations.yaml | 9 -- operator/pom.xml | 20 ++- operator/scripts/create-olm-bundle.sh | 78 +++++++--- .../KeycloakSharedCsvMetadata.java | 139 +++++++++++++++++ .../crds/v2alpha1/deployment/Keycloak.java | 5 + .../realmimport/KeycloakRealmImport.java | 6 +- .../kubernetes/KeycloakController.icon.png | Bin 0 -> 22844 bytes .../src/main/resources/application.properties | 4 + 11 files changed, 255 insertions(+), 189 deletions(-) create mode 100644 operator/olm-assembly.xml delete mode 100644 operator/olm-base/bundle.Dockerfile delete mode 100644 operator/olm-base/manifests/clusterserviceversion.yaml delete mode 100644 operator/olm-base/metadata/annotations.yaml create mode 100644 operator/src/main/java/org/keycloak/operator/controllers/KeycloakSharedCsvMetadata.java create mode 100644 operator/src/main/kubernetes/KeycloakController.icon.png diff --git a/operator/olm-assembly.xml b/operator/olm-assembly.xml new file mode 100644 index 0000000000..74011d10e8 --- /dev/null +++ b/operator/olm-assembly.xml @@ -0,0 +1,26 @@ + + + olm + + + zip + + + false + + + + ${project.build.directory}/bundle/keycloak-operator + + + **/** + + + + + + + + + + diff --git a/operator/olm-base/bundle.Dockerfile b/operator/olm-base/bundle.Dockerfile deleted file mode 100644 index 703e51278a..0000000000 --- a/operator/olm-base/bundle.Dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM scratch - -# Core bundle labels. -LABEL operators.operatorframework.io.bundle.mediatype.v1=registry+v1 -LABEL operators.operatorframework.io.bundle.manifests.v1=manifests/ -LABEL operators.operatorframework.io.bundle.metadata.v1=metadata/ -LABEL operators.operatorframework.io.bundle.package.v1=keycloak-operator -LABEL operators.operatorframework.io.bundle.channels.v1=fast -LABEL operators.operatorframework.io.bundle.channel.default.v1=fast -LABEL com.redhat.openshift.versions=v4.6 - -# Copy files to locations specified by labels. -COPY manifests /manifests/ -COPY metadata /metadata/ diff --git a/operator/olm-base/manifests/clusterserviceversion.yaml b/operator/olm-base/manifests/clusterserviceversion.yaml deleted file mode 100644 index af284bfe19..0000000000 --- a/operator/olm-base/manifests/clusterserviceversion.yaml +++ /dev/null @@ -1,143 +0,0 @@ -apiVersion: operators.coreos.com/v1alpha1 -kind: ClusterServiceVersion -metadata: - annotations: - capabilities: Deep Insights - categories: Security - certified: 'False' - containerImage: 'quay.io/keycloak/keycloak-operator:REPLACE_ME_VERSION' - createdAt: REPLACE_ME_CREATED_AT - description: 'An Operator for installing and managing Keycloak' - repository: 'https://github.com/keycloak/keycloak' - support: Red Hat - alm-examples: |- - [ - { - "apiVersion": "k8s.keycloak.org/v2alpha1", - "kind": "Keycloak", - "metadata": { - "name": "example-keycloak", - "labels": { - "app": "sso" - } - }, - "spec": { - "instances": 1, - "hostname": "example.org", - "tlsSecret": "my-tls-secret" - } - }, - { - "apiVersion": "k8s.keycloak.org/v2alpha1", - "kind": "KeycloakRealmImport", - "metadata": { - "name": "example-keycloak-realm-import", - "labels": { - "app": "sso" - } - }, - "spec": { - "keycloakCRName": "example-keycloak", - "realm": {} - } - } - ] - name: keycloak-operator.vREPLACE_ME_VERSION - namespace: placeholder -spec: - apiservicedefinitions: {} - customresourcedefinitions: - owned: - - description: "Represents a Keycloak Instance" - displayName: "Keycloak" - kind: Keycloak - name: keycloaks.k8s.keycloak.org - version: v2alpha1 - - description: "Represents a Keycloak Realm Import" - displayName: "KeycloakRealmImport" - kind: KeycloakRealmImport - name: keycloakrealmimports.k8s.keycloak.org - version: v2alpha1 - description: | - A Kubernetes Operator based on the Operator SDK for installing and managing Keycloak. - - Keycloak lets you add authentication to applications and secure services with minimum fuss. No need to deal with storing users or authenticating users. It's all available out of the box. - - The operator can deploy and manage Keycloak instances on Kubernetes and OpenShift. - The following features are supported: - - * Install Keycloak to a namespace - * Import Keycloak Realms - displayName: Keycloak Operator - icon: - - base64data: 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 - mediatype: image/png - install: - spec: - deployments: - - name: keycloak-operator - spec: - replicas: 1 - selector: - matchLabels: - name: keycloak-operator - strategy: {} - template: - metadata: - labels: - name: keycloak-operator - spec: - containers: - - command: - - java - - -Djava.util.logging.manager=org.jboss.logmanager.LogManager - - -jar - - quarkus-run.jar - env: - - name: QUARKUS_OPERATOR_SDK_NAMESPACES - valueFrom: - fieldRef: - fieldPath: metadata.annotations['olm.targetNamespaces'] - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: OPERATOR_NAME - value: keycloak-operator - image: quay.io/keycloak/keycloak-operator:REPLACE_ME_VERSION - imagePullPolicy: Always - name: keycloak-operator - resources: {} - serviceAccountName: keycloak-operator - permissions: - - rules: [] # automatically generated - serviceAccountName: keycloak-operator - strategy: deployment - installModes: - - supported: true - type: OwnNamespace - - supported: true - type: SingleNamespace - - supported: false - type: MultiNamespace - - supported: false - type: AllNamespaces - keywords: - - Keycloak - - Identity - - Access - links: - - name: Documentation - url: https://www.keycloak.org/docs/latest/server_installation/index.html#_operator - - name: Keycloak - url: https://www.keycloak.org/ - - name: Keycloak Discourse - url: https://keycloak.discourse.group/ - maintainers: - - email: keycloak-dev@lists.jboss.org - name: Keycloak DEV mailing list - maturity: stable - provider: - name: Red Hat - version: REPLACE_ME_VERSION - replaces: keycloak-operator.vREPLACE_ME_LAST_VERSION diff --git a/operator/olm-base/metadata/annotations.yaml b/operator/olm-base/metadata/annotations.yaml deleted file mode 100644 index 5905847dad..0000000000 --- a/operator/olm-base/metadata/annotations.yaml +++ /dev/null @@ -1,9 +0,0 @@ -annotations: - # Core bundle annotations. - operators.operatorframework.io.bundle.mediatype.v1: registry+v1 - operators.operatorframework.io.bundle.manifests.v1: manifests/ - operators.operatorframework.io.bundle.metadata.v1: metadata/ - operators.operatorframework.io.bundle.package.v1: keycloak-operator - operators.operatorframework.io.bundle.channels.v1: fast - operators.operatorframework.io.bundle.channel.default.v1: fast - com.redhat.openshift.versions: "v4.6" diff --git a/operator/pom.xml b/operator/pom.xml index 77826f2b65..cafce3822c 100644 --- a/operator/pom.xml +++ b/operator/pom.xml @@ -67,6 +67,10 @@ io.quarkiverse.operatorsdk quarkus-operator-sdk + + io.quarkiverse.operatorsdk + quarkus-operator-sdk-bundle-generator + io.quarkus quarkus-resteasy-jackson @@ -277,7 +281,7 @@ maven-assembly-plugin - assemble + assemble-quarkus package single @@ -290,6 +294,20 @@ ${project.build.directory}/assembly/work + + assemble-bundle + package + + single + + + + olm-assembly.xml + + true + ${project.build.directory}/bundle-assembly/work + + diff --git a/operator/scripts/create-olm-bundle.sh b/operator/scripts/create-olm-bundle.sh index ffbe42a418..f94879402c 100755 --- a/operator/scripts/create-olm-bundle.sh +++ b/operator/scripts/create-olm-bundle.sh @@ -1,40 +1,76 @@ -#! /bin/bash +#!/bin/bash set -euxo pipefail +# Ex: 21.0.0 VERSION=$1 +# Ex: 20.0.0 +# Ex: NONE [if no replaces] REPLACES_VERSION=$2 +# Ex: keycloak/keycloak-operator:999.0.0-SNAPSHOT OPERATOR_DOCKER_IMAGE=$3 -CREATED_AT=$(date "+%D %T") - SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +{ set +x; } 2>/dev/null +echo "" echo "Creating OLM bundle for version $VERSION replacing version $REPLACES_VERSION" +echo "" +set -x -rm -rf $SCRIPT_DIR/../olm/$VERSION -mkdir -p $SCRIPT_DIR/../olm/$VERSION +cd "$SCRIPT_DIR" -cp -r $SCRIPT_DIR/../olm-base/* $SCRIPT_DIR/../olm/$VERSION +rm -rf ../olm/$VERSION +mkdir -p ../olm/$VERSION -# Inject RBAC rules -yq ea '.rules as $item ireduce ({}; .rules += $item)' $SCRIPT_DIR/../target/kubernetes/kubernetes.yml | \ - yq ea -i 'select(fileIndex==0).spec.install.spec.permissions[0] = select(fileIndex==1) | select(fileIndex==0)' $SCRIPT_DIR/../olm/$VERSION/manifests/clusterserviceversion.yaml - && \ -yq ea -i '.spec.install.spec.permissions[0].serviceAccountName = "keycloak-operator"' $SCRIPT_DIR/../olm/$VERSION/manifests/clusterserviceversion.yaml && \ -yq ea -i ".metadata.annotations.containerImage = \"$OPERATOR_DOCKER_IMAGE:$VERSION\"" $SCRIPT_DIR/../olm/$VERSION/manifests/clusterserviceversion.yaml && \ -yq ea -i ".metadata.annotations.createdAt = \"$CREATED_AT\"" $SCRIPT_DIR/../olm/$VERSION/manifests/clusterserviceversion.yaml && \ -yq ea -i ".metadata.name = \"keycloak-operator.v$VERSION\"" $SCRIPT_DIR/../olm/$VERSION/manifests/clusterserviceversion.yaml && \ -yq ea -i ".spec.install.spec.deployments[0].spec.template.spec.containers[0].image = \"$OPERATOR_DOCKER_IMAGE:$VERSION\"" $SCRIPT_DIR/../olm/$VERSION/manifests/clusterserviceversion.yaml && \ -yq ea 'select(.spec.template.spec.containers[0].env) | .spec.template.spec.containers[0].env[-1]' $SCRIPT_DIR/../target/kubernetes/kubernetes.yml | \ - yq ea -i 'select(fileIndex==0).spec.install.spec.deployments[0].spec.template.spec.containers[0].env += select(fileIndex==1) | select(fileIndex==0)' $SCRIPT_DIR/../olm/$VERSION/manifests/clusterserviceversion.yaml - && \ -yq ea -i ".spec.version = \"$VERSION\"" $SCRIPT_DIR/../olm/$VERSION/manifests/clusterserviceversion.yaml +# Extract the files generated by Quarkus during the maven build +unzip -q -d ../olm/$VERSION ../target/keycloak-operator-*-olm.zip + +# Find the CSV YAML +CSV_PATH="$(find "../olm/$VERSION" -type f -name '*.clusterserviceversion.yaml')" + +# Insert operator image coordinate +yq ea -i ".metadata.annotations.containerImage = \"$OPERATOR_DOCKER_IMAGE:$VERSION\"" "$CSV_PATH" +yq ea -i ".spec.install.spec.deployments[0].spec.template.spec.containers[0].image = \"$OPERATOR_DOCKER_IMAGE:$VERSION\"" "$CSV_PATH" + +# Edit the CSV version, replaces, etc. + +yq ea -i ".metadata.annotations.createdAt = \"$(date "+%D %T")\"" "$CSV_PATH" +yq ea -i ".spec.version = \"$VERSION\"" "$CSV_PATH" +yq ea -i ".metadata.name = \"keycloak-operator.v$VERSION\"" "$CSV_PATH" +yq ea -i '.metadata.namespace = "placeholder"' "$CSV_PATH" if [[ $REPLACES_VERSION = "NONE" ]] then - yq ea -i "del(.spec.replaces)" $SCRIPT_DIR/../olm/$VERSION/manifests/clusterserviceversion.yaml + yq ea -i "del(.spec.replaces)" "$CSV_PATH" else - yq ea -i ".spec.replaces = \"keycloak-operator.v$REPLACES_VERSION\"" $SCRIPT_DIR/../olm/$VERSION/manifests/clusterserviceversion.yaml + yq ea -i ".spec.replaces = \"keycloak-operator.v$REPLACES_VERSION\"" "$CSV_PATH" fi -mv $SCRIPT_DIR/../olm/$VERSION/manifests/clusterserviceversion.yaml "$SCRIPT_DIR/../olm/$VERSION/manifests/keycloak-operator.v$VERSION.clusterserviceversion.yaml" +# Mangle the YAML to make it look more like it did before. The bundle extension +# isn't configurable enough to do this itself. No one seems to have the +# expertise to say if the changes it makes are ok or not. +yq ea -i "del(.spec.install.spec.deployments[0].spec.selector.matchLabels)" "$CSV_PATH" +yq ea -i "del(.spec.install.spec.deployments[0].spec.template.metadata.labels)" "$CSV_PATH" +yq ea -i "del(.spec.install.spec.deployments[0].spec.template.metadata.annotations)" "$CSV_PATH" +yq ea -i "del(.spec.install.spec.deployments[0].spec.template.metadata.namespace)" "$CSV_PATH" +yq ea -i "del(.spec.install.spec.deployments[0].spec.template.namespace)" "$CSV_PATH" +yq ea -i "del(.spec.install.spec.deployments[0].spec.template.spec.containers[0].ports)" "$CSV_PATH" +yq ea -i "del(.spec.install.spec.deployments[0].spec.template.spec.containers[0].livenessProbe)" "$CSV_PATH" +yq ea -i "del(.spec.install.spec.deployments[0].spec.template.spec.containers[0].readinessProbe)" "$CSV_PATH" +yq ea -i "del(.spec.install.spec.deployments[0].spec.template.spec.containers[0].startupProbe)" "$CSV_PATH" +yq ea -i 'del(.spec.install.spec.deployments[0].spec.template.spec.containers[0].env[] | select(.name == "KUBERNETES_NAMESPACE"))' "$CSV_PATH" -cp target/kubernetes/*.keycloak.org-v1.yml olm/$VERSION/manifests +yq ea -i '.spec.install.spec.deployments[0].spec.template.spec.containers[0].resources = {}' "$CSV_PATH" +yq ea -i '.spec.install.spec.deployments[0].spec.strategy = {}' "$CSV_PATH" +yq ea -i '.spec.apiservicedefinitions = {}' "$CSV_PATH" + +yq ea -i '.spec.install.spec.deployments[0].spec.selector.matchLabels.name = "keycloak-operator"' "$CSV_PATH" +yq ea -i '.spec.install.spec.deployments[0].spec.template.metadata.labels.name = "keycloak-operator"' "$CSV_PATH" + +yq ea -i '.spec.install.spec.deployments[0].spec.template.spec.containers[0].env += [{"name": "QUARKUS_OPERATOR_SDK_NAMESPACES", "valueFrom": {"fieldRef": {"fieldPath": "metadata.annotations['"'"'olm.targetNamespaces'"'"']"}}}]' "$CSV_PATH" +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" + +{ set +x; } 2>/dev/null +echo "" +echo "Created OLM bundle ok!" diff --git a/operator/src/main/java/org/keycloak/operator/controllers/KeycloakSharedCsvMetadata.java b/operator/src/main/java/org/keycloak/operator/controllers/KeycloakSharedCsvMetadata.java new file mode 100644 index 0000000000..1267c5691b --- /dev/null +++ b/operator/src/main/java/org/keycloak/operator/controllers/KeycloakSharedCsvMetadata.java @@ -0,0 +1,139 @@ +/* + * Copyright 2021 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.controllers; + +import io.quarkiverse.operatorsdk.bundle.runtime.CSVMetadata; +import io.quarkiverse.operatorsdk.bundle.runtime.SharedCSVMetadata; + +@CSVMetadata( + version = "KCOP_NEXT", + name = "keycloak-operator", + replaces = "keycloak-operator.KCOP_PREVIOUS", + displayName = "Keycloak Operator", + provider = @CSVMetadata.Provider( + name = "Red Hat" + ), + maturity = "stable", + keywords = { + "Keycloak", + "Identity", + "Access" + }, + maintainers = { + @CSVMetadata.Maintainer( + email = "keycloak-dev@googlegroups.com", + name = "Keycloak DEV mailing list" + ) + }, + links = { + @CSVMetadata.Link( + url = "https://www.keycloak.org/docs/latest/server_installation/index.html#_operator", + name = "Documentation" + ), + @CSVMetadata.Link( + url = "https://www.keycloak.org/", + name = "Keycloak" + ), + @CSVMetadata.Link( + url = "https://keycloak.discourse.group/", + name = "Keycloak Discourse" + ) + }, + installModes = { + @CSVMetadata.InstallMode( + type = "OwnNamespace", + supported = true + ), + @CSVMetadata.InstallMode( + type = "SingleNamespace", + supported = true + ), + @CSVMetadata.InstallMode( + type = "MultiNamespace", + supported = false + ), + @CSVMetadata.InstallMode( + type = "AllNamespaces", + supported = false + ) + }, + annotations = @CSVMetadata.Annotations( + containerImage = "KCOP_IMAGE_PULL_URL:KCOP_NEXT", + repository = "https://github.com/keycloak/keycloak", + capabilities = "Deep Insights", + categories = "Security", + certified = false, + almExamples = + "[\n" + + " {\n" + + " \"apiVersion\": \"k8s.keycloak.org/v2alpha1\",\n" + + " \"kind\": \"Keycloak\",\n" + + " \"metadata\": {\n" + + " \"name\": \"example-keycloak\",\n" + + " \"labels\": {\n" + + " \"app\": \"sso\"\n" + + " }\n" + + " },\n" + + " \"spec\": {\n" + + " \"instances\": 1,\n" + + " \"hostname\": \"example.org\",\n" + + " \"tlsSecret\": \"my-tls-secret\"\n" + + " }\n" + + " },\n" + + " {\n" + + " \"apiVersion\": \"k8s.keycloak.org/v2alpha1\",\n" + + " \"kind\": \"KeycloakRealmImport\",\n" + + " \"metadata\": {\n" + + " \"name\": \"example-keycloak-realm-import\",\n" + + " \"labels\": {\n" + + " \"app\": \"sso\"\n" + + " }\n" + + " },\n" + + " \"spec\": {\n" + + " \"keycloakCRName\": \"example-keycloak\",\n" + + " \"realm\": {}\n" + + " }\n" + + " }\n" + + "]", + others = { + @CSVMetadata.Annotations.Annotation( + name = "support", + value = "Red Hat" + ), + @CSVMetadata.Annotations.Annotation( + name = "description", + value = "An Operator for installing and managing Keycloak" + ) + } + ), + description = + "A Kubernetes Operator based on the Operator SDK for installing and managing Keycloak.\n" + + "\n" + + "Keycloak lets you add authentication to applications and secure services with minimum fuss. No need to deal with storing users or authenticating users. It's all available out of the box.\n" + + "\n" + + "The operator can deploy and manage Keycloak instances on Kubernetes and OpenShift.\n" + + "The following features are supported:\n" + + "\n" + + "* Install Keycloak to a namespace\n" + + "* Import Keycloak Realms\n", + icon = @CSVMetadata.Icon( + fileName = "KeycloakController.icon.png", + mediatype = "image/png" + ) +) +public class KeycloakSharedCsvMetadata implements SharedCSVMetadata { +} diff --git a/operator/src/main/java/org/keycloak/operator/crds/v2alpha1/deployment/Keycloak.java b/operator/src/main/java/org/keycloak/operator/crds/v2alpha1/deployment/Keycloak.java index aeb55c7f2c..69e97a1e04 100644 --- a/operator/src/main/java/org/keycloak/operator/crds/v2alpha1/deployment/Keycloak.java +++ b/operator/src/main/java/org/keycloak/operator/crds/v2alpha1/deployment/Keycloak.java @@ -22,10 +22,15 @@ import io.fabric8.kubernetes.model.annotation.Group; import io.fabric8.kubernetes.model.annotation.Plural; import io.fabric8.kubernetes.model.annotation.ShortNames; import io.fabric8.kubernetes.model.annotation.Version; +import io.quarkiverse.operatorsdk.bundle.runtime.CSVMetadata; import io.sundr.builder.annotations.Buildable; import io.sundr.builder.annotations.BuildableReference; import org.keycloak.operator.Constants; +@CSVMetadata( + description="Represents a Keycloak Instance", + displayName="Keycloak" +) @Group(Constants.CRDS_GROUP) @Version(Constants.CRDS_VERSION) @ShortNames(Constants.SHORT_NAME) diff --git a/operator/src/main/java/org/keycloak/operator/crds/v2alpha1/realmimport/KeycloakRealmImport.java b/operator/src/main/java/org/keycloak/operator/crds/v2alpha1/realmimport/KeycloakRealmImport.java index d951ac7ea1..1cecf28357 100644 --- a/operator/src/main/java/org/keycloak/operator/crds/v2alpha1/realmimport/KeycloakRealmImport.java +++ b/operator/src/main/java/org/keycloak/operator/crds/v2alpha1/realmimport/KeycloakRealmImport.java @@ -23,7 +23,7 @@ import io.fabric8.kubernetes.model.annotation.Group; import io.fabric8.kubernetes.model.annotation.Version; import io.sundr.builder.annotations.Buildable; import io.sundr.builder.annotations.BuildableReference; - +import io.quarkiverse.operatorsdk.bundle.runtime.CSVMetadata; import org.keycloak.operator.Constants; import org.keycloak.representations.idm.ComponentExportRepresentation; import org.keycloak.representations.idm.CredentialRepresentation; @@ -31,6 +31,10 @@ import org.keycloak.representations.idm.GroupRepresentation; import org.keycloak.representations.idm.RealmRepresentation; import org.keycloak.representations.idm.authorization.ScopeRepresentation; +@CSVMetadata( + description="Represents a Keycloak Realm Import", + displayName="KeycloakRealmImport" +) @Group(Constants.CRDS_GROUP) @Version(Constants.CRDS_VERSION) @Buildable(editableEnabled = false, builderPackage = "io.fabric8.kubernetes.api.builder", diff --git a/operator/src/main/kubernetes/KeycloakController.icon.png b/operator/src/main/kubernetes/KeycloakController.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4cdf7fa2e5af04cff2918ed947788350dcb8945d GIT binary patch literal 22844 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 Nj+