From b0c749c90ba4d53cdbcbb17f4aa068e3ef92650a Mon Sep 17 00:00:00 2001 From: gazarenkov Date: Sun, 11 Aug 2024 09:55:39 +0300 Subject: [PATCH] bundle Signed-off-by: gazarenkov --- Makefile | 6 +- api/v1alpha1/zz_generated.deepcopy.go | 1 - api/v1alpha2/zz_generated.deepcopy.go | 1 - ...backstage-default-config_v1_configmap.yaml | 164 +----- ...kstage-operator.clusterserviceversion.yaml | 34 +- ...er-manager-metrics-service_v1_service.yaml | 23 + .../rhdh-default-config_v1_configmap.yaml | 330 +++++++++++ ...c.authorization.k8s.io_v1_clusterrole.yaml | 17 + .../manifests/rhdh.redhat.com_backstages.yaml | 538 ++++++++--------- .../crd/bases/rhdh.redhat.com_backstages.yaml | 539 +++++++++--------- ...kstage-operator.clusterserviceversion.yaml | 61 -- config/manifests/backstage.io/bases/csv.yaml | 44 ++ .../manifests/backstage.io/kustomization.yaml | 4 +- ...kstage-operator.clusterserviceversion.yaml | 19 - ...kstage-operator.clusterserviceversion.yaml | 61 -- config/manifests/rhdh/bases/csv.yaml | 91 +++ config/manifests/rhdh/kustomization.yaml | 4 +- .../default-config/secret-envs.yaml.1 | 8 - .../default-config/secret-files.yaml.sample | 9 - .../profile/backstage.io/kustomization.yaml | 50 +- config/profile/backstage.io/manager.yaml | 111 ++++ config/profile/rhdh/kustomization.yaml | 56 +- config/profile/rhdh/manager.yaml | 122 ++++ .../rhdh/manager_auth_proxy_patch.yaml | 3 +- config/rbac/role.yaml | 1 - config/samples/_v1alpha1_backstage.yaml | 12 + config/samples/_v1alpha2_backstage.yaml | 10 +- config/samples/kustomization.yaml | 1 + config/scorecard/kustomization.yaml | 9 +- docs/configuration.md | 13 +- 30 files changed, 1430 insertions(+), 912 deletions(-) create mode 100644 bundle/manifests/rhdh-controller-manager-metrics-service_v1_service.yaml create mode 100644 bundle/manifests/rhdh-default-config_v1_configmap.yaml create mode 100644 bundle/manifests/rhdh-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml delete mode 100644 config/manifests/backstage.io/backstage-operator.clusterserviceversion.yaml create mode 100644 config/manifests/backstage.io/bases/csv.yaml delete mode 100644 config/manifests/bases/backstage-operator.clusterserviceversion.yaml delete mode 100644 config/manifests/rhdh/backstage-operator.clusterserviceversion.yaml create mode 100644 config/manifests/rhdh/bases/csv.yaml delete mode 100644 config/profile/backstage.io/default-config/secret-envs.yaml.1 delete mode 100644 config/profile/backstage.io/default-config/secret-files.yaml.sample create mode 100644 config/profile/backstage.io/manager.yaml create mode 100644 config/profile/rhdh/manager.yaml create mode 100644 config/samples/_v1alpha1_backstage.yaml diff --git a/Makefile b/Makefile index 7152c896..6a55b4c5 100644 --- a/Makefile +++ b/Makefile @@ -210,7 +210,7 @@ deployment-manifest: manifests kustomize ## Generate manifest to deploy operator .PHONY: undeploy undeploy: ## Undeploy controller from the K8s cluster specified in ~/.kube/config. Call with ignore-not-found=true to ignore resource not found errors during deletion. - $(KUSTOMIZE) build config/default | kubectl delete --ignore-not-found=$(ignore-not-found) -f - + $(KUSTOMIZE) build config/profile/$(PROFILE) | kubectl delete --ignore-not-found=$(ignore-not-found) -f - ##@ Build Dependencies @@ -314,9 +314,9 @@ endif # Build a bundle image using the 'operator-sdk' tool .PHONY: bundle bundle: operator-sdk manifests kustomize ## Generate bundle manifests and metadata, then validate generated files. - $(OPSDK) generate kustomize manifests -q + #$(OPSDK) generate kustomize manifests -q cd config/manager && $(KUSTOMIZE) edit set image controller=$(IMG) - $(KUSTOMIZE) build config/manifests/$(PROFILE) | $(OPSDK) generate bundle $(BUNDLE_GEN_FLAGS) + $(KUSTOMIZE) build config/manifests/$(PROFILE) | $(OPSDK) generate bundle --kustomize-dir config/manifests/$(PROFILE) $(BUNDLE_GEN_FLAGS) $(OPSDK) bundle validate ./bundle mv -f bundle.Dockerfile docker/bundle.Dockerfile $(MAKE) fmt_license diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go index da31d8b8..c129d12e 100644 --- a/api/v1alpha1/zz_generated.deepcopy.go +++ b/api/v1alpha1/zz_generated.deepcopy.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated /* Copyright 2023 Red Hat Inc.. diff --git a/api/v1alpha2/zz_generated.deepcopy.go b/api/v1alpha2/zz_generated.deepcopy.go index 280d13d4..4a5c4e8d 100644 --- a/api/v1alpha2/zz_generated.deepcopy.go +++ b/api/v1alpha2/zz_generated.deepcopy.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated /* Copyright 2023 Red Hat Inc.. diff --git a/bundle/manifests/backstage-default-config_v1_configmap.yaml b/bundle/manifests/backstage-default-config_v1_configmap.yaml index 9c6a1ba8..9908e754 100644 --- a/bundle/manifests/backstage-default-config_v1_configmap.yaml +++ b/bundle/manifests/backstage-default-config_v1_configmap.yaml @@ -150,168 +150,42 @@ data: resources: requests: storage: 1Gi - deployment.yaml: | + deployment.yaml: |- + # kubernetes/backstage.yaml apiVersion: apps/v1 kind: Deployment metadata: - name: backstage # placeholder for 'backstage-' + name: backstage spec: - replicas: 1 selector: matchLabels: - rhdh.redhat.com/app: # placeholder for 'backstage-' + app: backstage template: metadata: labels: - rhdh.redhat.com/app: # placeholder for 'backstage-' + app: backstage spec: - automountServiceAccountToken: false - # if securityContext not present in AKS/EKS, the error is like this: - #Error: EACCES: permission denied, open '/dynamic-plugins-root/backstage-plugin-scaffolder-backend-module-github-dynamic-0.2.2.tgz' - # fsGroup doesn not work for Openshift - #securityContext: - # fsGroup: 1001 - volumes: - - ephemeral: - volumeClaimTemplate: - spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 2Gi - name: dynamic-plugins-root - - name: dynamic-plugins-npmrc - secret: - defaultMode: 420 - optional: true - secretName: dynamic-plugins-npmrc - - emptyDir: {} - name: npmcacache - initContainers: - - name: install-dynamic-plugins - command: - - ./install-dynamic-plugins.sh - - /dynamic-plugins-root - # image will be replaced by the value of the `RELATED_IMAGE_backstage` env var, if set - image: quay.io/rhdh/rhdh-hub-rhel9:next - imagePullPolicy: IfNotPresent - securityContext: - runAsNonRoot: true - allowPrivilegeEscalation: false - seccompProfile: - type: RuntimeDefault - capabilities: - drop: - - ALL - env: - - name: NPM_CONFIG_USERCONFIG - value: /opt/app-root/src/.npmrc.dynamic-plugins - volumeMounts: - - mountPath: /dynamic-plugins-root - name: dynamic-plugins-root - - mountPath: /opt/app-root/src/.npmrc.dynamic-plugins - name: dynamic-plugins-npmrc - readOnly: true - subPath: .npmrc - - mountPath: /opt/app-root/src/.npm/_cacache - name: npmcacache - workingDir: /opt/app-root/src - resources: - requests: - cpu: 250m - memory: 256Mi - limits: - cpu: 1000m - memory: 2.5Gi - ephemeral-storage: 5Gi containers: - name: backstage-backend - # image will be replaced by the value of the `RELATED_IMAGE_backstage` env var, if set - image: quay.io/rhdh/rhdh-hub-rhel9:next + image: ghcr.io/backstage/backstage:1.28.4 imagePullPolicy: IfNotPresent + command: + - "node" + - "packages/backend" + - "--no-node-snapshot" args: - "--config" - - "dynamic-plugins-root/app-config.dynamic-plugins.yaml" - securityContext: - capabilities: - drop: - - ALL - seccompProfile: - type: RuntimeDefault - runAsNonRoot: true - allowPrivilegeEscalation: false - readinessProbe: - failureThreshold: 3 - httpGet: - path: /healthcheck - port: 7007 - scheme: HTTP - initialDelaySeconds: 30 - periodSeconds: 10 - successThreshold: 2 - timeoutSeconds: 2 - livenessProbe: - failureThreshold: 3 - httpGet: - path: /healthcheck - port: 7007 - scheme: HTTP - initialDelaySeconds: 60 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 2 + - "app-config.yaml" + - "--config" + - "app-config.production.yaml" ports: - - name: backend + - name: http containerPort: 7007 - env: - - name: APP_CONFIG_backend_listen_port - value: "7007" - volumeMounts: - - mountPath: /opt/app-root/src/dynamic-plugins-root - name: dynamic-plugins-root - resources: - requests: - cpu: 250m - memory: 256Mi - limits: - cpu: 1000m - memory: 2.5Gi - ephemeral-storage: 5Gi - dynamic-plugins.yaml: |- - apiVersion: v1 - kind: ConfigMap - metadata: - name: default-dynamic-plugins # must be the same as (deployment.yaml).spec.template.spec.volumes.name.dynamic-plugins-conf.configMap.name - data: - "dynamic-plugins.yaml": | - includes: - - dynamic-plugins.default.yaml - plugins: [] - route.yaml: |- - apiVersion: route.openshift.io/v1 - kind: Route - metadata: - name: route # placeholder for 'backstage-' - spec: - port: - targetPort: http-backend - path: / - tls: - insecureEdgeTerminationPolicy: Redirect - termination: edge - to: - kind: Service - name: # placeholder for 'backstage-' - secret-envs.yaml: | - apiVersion: v1 - kind: Secret - metadata: - name: backend-auth-secret - stringData: - # generated with the command below (from https://janus-idp.io/docs/auth/service-to-service-auth/#setup): - # node -p 'require("crypto").randomBytes(24).toString("base64")' - BACKEND_SECRET: "R2FxRVNrcmwzYzhhN3l0V1VRcnQ3L1pLT09WaVhDNUEK" # notsecret + # envFrom: + # - secretRef: + # name: postgres-secrets + # - secretRef: + # name: backstage-secrets service.yaml: |- apiVersion: v1 kind: Service diff --git a/bundle/manifests/backstage-operator.clusterserviceversion.yaml b/bundle/manifests/backstage-operator.clusterserviceversion.yaml index 8cbefef4..07402e7b 100644 --- a/bundle/manifests/backstage-operator.clusterserviceversion.yaml +++ b/bundle/manifests/backstage-operator.clusterserviceversion.yaml @@ -4,46 +4,46 @@ metadata: annotations: alm-examples: |- [ + { + "apiVersion": "rhdh.redhat.com/v1alpha1", + "kind": "Backstage", + "metadata": { + "labels": { + "app.kubernetes.io/name": "backstage" + }, + "name": "backstage-sample" + } + }, { "apiVersion": "rhdh.redhat.com/v1alpha2", "kind": "Backstage", "metadata": { "labels": { - "app.kubernetes.io/created-by": "backstage-operator", - "app.kubernetes.io/instance": "backstage-sample", - "app.kubernetes.io/managed-by": "kustomize", - "app.kubernetes.io/name": "backstage", - "app.kubernetes.io/part-of": "backstage-operator" + "app.kubernetes.io/name": "backstage" }, "name": "backstage-sample" - }, - "spec": null + } } ] capabilities: Seamless Upgrades - createdAt: "2024-08-06T20:46:15Z" + createdAt: "2024-08-10T15:19:13Z" operatorframework.io/suggested-namespace: backstage-system operators.operatorframework.io/builder: operator-sdk-v1.33.0 operators.operatorframework.io/project_layout: go.kubebuilder.io/v3 skipRange: '>=0.0.1 <0.3.0' name: backstage-operator.v0.3.0 - namespace: placeholder spec: apiservicedefinitions: {} customresourcedefinitions: owned: - - description: Backstage is the Schema for the backstages API - displayName: Backstage - kind: Backstage + - kind: Backstage name: backstages.rhdh.redhat.com version: v1alpha1 - - description: Backstage is the Schema for the backstages API - displayName: Backstage - kind: Backstage + - kind: Backstage name: backstages.rhdh.redhat.com version: v1alpha2 - description: Operator to deploy Backstage on Kubernetes - displayName: Red Hat Developer Hub Operator + description: Backstage Operator + displayName: Backstage Operator icon: - base64data: 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 mediatype: image/png diff --git a/bundle/manifests/rhdh-controller-manager-metrics-service_v1_service.yaml b/bundle/manifests/rhdh-controller-manager-metrics-service_v1_service.yaml new file mode 100644 index 00000000..53766e5f --- /dev/null +++ b/bundle/manifests/rhdh-controller-manager-metrics-service_v1_service.yaml @@ -0,0 +1,23 @@ +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: kube-rbac-proxy + app.kubernetes.io/created-by: backstage-operator + app.kubernetes.io/instance: controller-manager-metrics-service + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: service + app.kubernetes.io/part-of: backstage-operator + control-plane: controller-manager + name: rhdh-controller-manager-metrics-service +spec: + ports: + - name: https + port: 8443 + protocol: TCP + targetPort: https + selector: + control-plane: controller-manager +status: + loadBalancer: {} diff --git a/bundle/manifests/rhdh-default-config_v1_configmap.yaml b/bundle/manifests/rhdh-default-config_v1_configmap.yaml new file mode 100644 index 00000000..ee62299c --- /dev/null +++ b/bundle/manifests/rhdh-default-config_v1_configmap.yaml @@ -0,0 +1,330 @@ +apiVersion: v1 +data: + app-config.yaml: | + apiVersion: v1 + kind: ConfigMap + metadata: + name: my-backstage-config-cm1 # placeholder for -default-appconfig + data: + default.app-config.yaml: | + backend: + auth: + externalAccess: + - type: legacy + options: + subject: legacy-default-config + # This is a default value, which you should change by providing your own app-config + secret: "pl4s3Ch4ng3M3" + db-secret.yaml: |- + apiVersion: v1 + kind: Secret + metadata: + name: postgres-secrets # will be replaced + type: Opaque + #stringData: + # POSTGRES_PASSWORD: + # POSTGRES_PORT: "5432" + # POSTGRES_USER: postgres + # POSTGRESQL_ADMIN_PASSWORD: admin123 + # POSTGRES_HOST: bs1-db-service #placeholder -db-service + db-service.yaml: | + apiVersion: v1 + kind: Service + metadata: + name: backstage-psql # placeholder for 'backstage-psql-' .NOTE: For the time it is static and linked to Secret-> postgres-secrets -> OSTGRES_HOST + spec: + selector: + rhdh.redhat.com/app: backstage-psql-cr1 # placeholder for 'backstage-psql-' + clusterIP: None + ports: + - port: 5432 + db-statefulset.yaml: |- + apiVersion: apps/v1 + kind: StatefulSet + metadata: + name: backstage-psql-cr1 # placeholder for 'backstage-psql-' + spec: + podManagementPolicy: OrderedReady + replicas: 1 + selector: + matchLabels: + rhdh.redhat.com/app: backstage-psql-cr1 # placeholder for 'backstage-psql-' + serviceName: backstage-psql-cr1-hl # placeholder for 'backstage-psql--hl' + template: + metadata: + labels: + rhdh.redhat.com/app: backstage-psql-cr1 # placeholder for 'backstage-psql-' + spec: + # fsGroup does not work for Openshift + # AKS/EKS does not work w/o it + #securityContext: + # fsGroup: 26 + automountServiceAccountToken: false + ## https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/ + ## The optional .spec.persistentVolumeClaimRetentionPolicy field controls if and how PVCs are deleted during the lifecycle of a StatefulSet. + ## You must enable the StatefulSetAutoDeletePVC feature gate on the API server and the controller manager to use this field. + # persistentVolumeClaimRetentionPolicy: + # whenDeleted: Retain + # whenScaled: Retain + containers: + - env: + - name: POSTGRESQL_PORT_NUMBER + value: "5432" + - name: POSTGRESQL_VOLUME_DIR + value: /var/lib/pgsql/data + - name: PGDATA + value: /var/lib/pgsql/data/userdata + image: quay.io/fedora/postgresql-15:latest # will be replaced with the actual image + imagePullPolicy: IfNotPresent + securityContext: + # runAsUser:26 does not work for Openshift but looks work for AKS/EKS + # runAsUser: 26 + runAsGroup: 0 + runAsNonRoot: true + allowPrivilegeEscalation: false + seccompProfile: + type: RuntimeDefault + capabilities: + drop: + - ALL + livenessProbe: + exec: + command: + - /bin/sh + - -c + - exec pg_isready -U ${POSTGRES_USER} -h 127.0.0.1 -p 5432 + failureThreshold: 6 + initialDelaySeconds: 30 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + name: postgresql + ports: + - containerPort: 5432 + name: tcp-postgresql + protocol: TCP + readinessProbe: + exec: + command: + - /bin/sh + - -c + - -e + - | + exec pg_isready -U ${POSTGRES_USER} -h 127.0.0.1 -p 5432 + failureThreshold: 6 + initialDelaySeconds: 5 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + resources: + requests: + cpu: 250m + memory: 256Mi + limits: + cpu: 250m + memory: 1024Mi + ephemeral-storage: 20Mi + volumeMounts: + - mountPath: /dev/shm + name: dshm + - mountPath: /var/lib/pgsql/data + name: data + restartPolicy: Always + serviceAccountName: default + volumes: + - emptyDir: + medium: Memory + name: dshm + updateStrategy: + rollingUpdate: + partition: 0 + type: RollingUpdate + volumeClaimTemplates: + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: data + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + deployment.yaml: | + apiVersion: apps/v1 + kind: Deployment + metadata: + name: backstage # placeholder for 'backstage-' + spec: + replicas: 1 + selector: + matchLabels: + rhdh.redhat.com/app: # placeholder for 'backstage-' + template: + metadata: + labels: + rhdh.redhat.com/app: # placeholder for 'backstage-' + spec: + automountServiceAccountToken: false + # if securityContext not present in AKS/EKS, the error is like this: + #Error: EACCES: permission denied, open '/dynamic-plugins-root/backstage-plugin-scaffolder-backend-module-github-dynamic-0.2.2.tgz' + # fsGroup doesn not work for Openshift + #securityContext: + # fsGroup: 1001 + volumes: + - ephemeral: + volumeClaimTemplate: + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 2Gi + name: dynamic-plugins-root + - name: dynamic-plugins-npmrc + secret: + defaultMode: 420 + optional: true + secretName: dynamic-plugins-npmrc + - emptyDir: {} + name: npmcacache + initContainers: + - name: install-dynamic-plugins + command: + - ./install-dynamic-plugins.sh + - /dynamic-plugins-root + # image will be replaced by the value of the `RELATED_IMAGE_backstage` env var, if set + image: quay.io/rhdh/rhdh-hub-rhel9:next + imagePullPolicy: IfNotPresent + securityContext: + runAsNonRoot: true + allowPrivilegeEscalation: false + seccompProfile: + type: RuntimeDefault + capabilities: + drop: + - ALL + env: + - name: NPM_CONFIG_USERCONFIG + value: /opt/app-root/src/.npmrc.dynamic-plugins + volumeMounts: + - mountPath: /dynamic-plugins-root + name: dynamic-plugins-root + - mountPath: /opt/app-root/src/.npmrc.dynamic-plugins + name: dynamic-plugins-npmrc + readOnly: true + subPath: .npmrc + - mountPath: /opt/app-root/src/.npm/_cacache + name: npmcacache + workingDir: /opt/app-root/src + resources: + requests: + cpu: 250m + memory: 256Mi + limits: + cpu: 1000m + memory: 2.5Gi + ephemeral-storage: 5Gi + containers: + - name: backstage-backend + # image will be replaced by the value of the `RELATED_IMAGE_backstage` env var, if set + image: quay.io/rhdh/rhdh-hub-rhel9:next + imagePullPolicy: IfNotPresent + args: + - "--config" + - "dynamic-plugins-root/app-config.dynamic-plugins.yaml" + securityContext: + capabilities: + drop: + - ALL + seccompProfile: + type: RuntimeDefault + runAsNonRoot: true + allowPrivilegeEscalation: false + readinessProbe: + failureThreshold: 3 + httpGet: + path: /healthcheck + port: 7007 + scheme: HTTP + initialDelaySeconds: 30 + periodSeconds: 10 + successThreshold: 2 + timeoutSeconds: 2 + livenessProbe: + failureThreshold: 3 + httpGet: + path: /healthcheck + port: 7007 + scheme: HTTP + initialDelaySeconds: 60 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 2 + ports: + - name: backend + containerPort: 7007 + env: + - name: APP_CONFIG_backend_listen_port + value: "7007" + volumeMounts: + - mountPath: /opt/app-root/src/dynamic-plugins-root + name: dynamic-plugins-root + resources: + requests: + cpu: 250m + memory: 256Mi + limits: + cpu: 1000m + memory: 2.5Gi + ephemeral-storage: 5Gi + dynamic-plugins.yaml: |- + apiVersion: v1 + kind: ConfigMap + metadata: + name: default-dynamic-plugins # must be the same as (deployment.yaml).spec.template.spec.volumes.name.dynamic-plugins-conf.configMap.name + data: + "dynamic-plugins.yaml": | + includes: + - dynamic-plugins.default.yaml + plugins: [] + route.yaml: |- + apiVersion: route.openshift.io/v1 + kind: Route + metadata: + name: route # placeholder for 'backstage-' + spec: + port: + targetPort: http-backend + path: / + tls: + insecureEdgeTerminationPolicy: Redirect + termination: edge + to: + kind: Service + name: # placeholder for 'backstage-' + secret-envs.yaml: | + apiVersion: v1 + kind: Secret + metadata: + name: backend-auth-secret + stringData: + # generated with the command below (from https://janus-idp.io/docs/auth/service-to-service-auth/#setup): + # node -p 'require("crypto").randomBytes(24).toString("base64")' + BACKEND_SECRET: "R2FxRVNrcmwzYzhhN3l0V1VRcnQ3L1pLT09WaVhDNUEK" # notsecret + service.yaml: |- + apiVersion: v1 + kind: Service + metadata: + name: backstage # placeholder for 'backstage-' + spec: + type: ClusterIP + selector: + rhdh.redhat.com/app: # placeholder for 'backstage-' + ports: + - name: http-backend + port: 80 + targetPort: backend +kind: ConfigMap +metadata: + name: rhdh-default-config diff --git a/bundle/manifests/rhdh-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml b/bundle/manifests/rhdh-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml new file mode 100644 index 00000000..630bdd6e --- /dev/null +++ b/bundle/manifests/rhdh-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml @@ -0,0 +1,17 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: kube-rbac-proxy + app.kubernetes.io/created-by: backstage-operator + app.kubernetes.io/instance: metrics-reader + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: clusterrole + app.kubernetes.io/part-of: backstage-operator + name: rhdh-metrics-reader +rules: +- nonResourceURLs: + - /metrics + verbs: + - get diff --git a/bundle/manifests/rhdh.redhat.com_backstages.yaml b/bundle/manifests/rhdh.redhat.com_backstages.yaml index 2ae9d8ee..e8a89a8a 100644 --- a/bundle/manifests/rhdh.redhat.com_backstages.yaml +++ b/bundle/manifests/rhdh.redhat.com_backstages.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.11.3 + controller-gen.kubebuilder.io/version: v0.14.0 creationTimestamp: null name: backstages.rhdh.redhat.com spec: @@ -24,14 +24,19 @@ spec: description: Backstage is the Schema for the backstages API properties: apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources type: string kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds type: string metadata: type: object @@ -42,29 +47,23 @@ spec: description: Configuration for Backstage. Optional. properties: appConfig: - description: References to existing app-configs ConfigMap objects, - that will be mounted as files in the specified mount path. Each - element can be a reference to any ConfigMap or Secret, and will - be mounted inside the main application container under a specified - mount directory. Additionally, each file will be passed as a - `--config /mount/path/to/configmap/key` to the main container - args in the order of the entries defined in the AppConfigs list. - But bear in mind that for a single ConfigMap element containing - several filenames, the order in which those files will be appended - to the main container args cannot be guaranteed. So if you want - to pass multiple app-config files, it is recommended to pass - one ConfigMap per app-config file. + description: |- + References to existing app-configs ConfigMap objects, that will be mounted as files in the specified mount path. + Each element can be a reference to any ConfigMap or Secret, + and will be mounted inside the main application container under a specified mount directory. + Additionally, each file will be passed as a `--config /mount/path/to/configmap/key` to the + main container args in the order of the entries defined in the AppConfigs list. + But bear in mind that for a single ConfigMap element containing several filenames, + the order in which those files will be appended to the main container args cannot be guaranteed. + So if you want to pass multiple app-config files, it is recommended to pass one ConfigMap per app-config file. properties: configMaps: - description: List of ConfigMaps storing the app-config files. - Will be mounted as files under the MountPath specified. - For each item in this array, if a key is not specified, - it means that all keys in the ConfigMap will be mounted - as files. Otherwise, only the specified key will be mounted - as a file. Bear in mind not to put sensitive data in those - ConfigMaps. Instead, your app-config content can reference - environment variables (which you can set with the ExtraEnvs - field) and/or include extra files (see the ExtraFiles field). + description: |- + List of ConfigMaps storing the app-config files. Will be mounted as files under the MountPath specified. + For each item in this array, if a key is not specified, it means that all keys in the ConfigMap will be mounted as files. + Otherwise, only the specified key will be mounted as a file. + Bear in mind not to put sensitive data in those ConfigMaps. Instead, your app-config content can reference + environment variables (which you can set with the ExtraEnvs field) and/or include extra files (see the ExtraFiles field). More details on https://backstage.io/docs/conf/writing/. items: properties: @@ -72,8 +71,9 @@ spec: description: Key in the object type: string name: - description: Name of the object We support only ConfigMaps - and Secrets. + description: |- + Name of the object + We support only ConfigMaps and Secrets. type: string required: - name @@ -86,28 +86,28 @@ spec: type: string type: object dynamicPluginsConfigMapName: - description: 'Reference to an existing ConfigMap for Dynamic Plugins. + description: |- + Reference to an existing ConfigMap for Dynamic Plugins. A new one will be generated with the default config if not set. - The ConfigMap object must have an existing key named: ''dynamic-plugins.yaml''.' + The ConfigMap object must have an existing key named: 'dynamic-plugins.yaml'. type: string extraEnvs: description: Extra environment variables properties: configMaps: - description: List of references to ConfigMaps objects to inject - as additional environment variables. For each item in this - array, if a key is not specified, it means that all keys - in the ConfigMap will be injected as additional environment - variables. Otherwise, only the specified key will be injected - as an additional environment variable. + description: |- + List of references to ConfigMaps objects to inject as additional environment variables. + For each item in this array, if a key is not specified, it means that all keys in the ConfigMap will be injected as additional environment variables. + Otherwise, only the specified key will be injected as an additional environment variable. items: properties: key: description: Key in the object type: string name: - description: Name of the object We support only ConfigMaps - and Secrets. + description: |- + Name of the object + We support only ConfigMaps and Secrets. type: string required: - name @@ -130,20 +130,19 @@ spec: type: object type: array secrets: - description: List of references to Secrets objects to inject - as additional environment variables. For each item in this - array, if a key is not specified, it means that all keys - in the Secret will be injected as additional environment - variables. Otherwise, only the specified key will be injected - as environment variable. + description: |- + List of references to Secrets objects to inject as additional environment variables. + For each item in this array, if a key is not specified, it means that all keys in the Secret will be injected as additional environment variables. + Otherwise, only the specified key will be injected as environment variable. items: properties: key: description: Key in the object type: string name: - description: Name of the object We support only ConfigMaps - and Secrets. + description: |- + Name of the object + We support only ConfigMaps and Secrets. type: string required: - name @@ -151,25 +150,25 @@ spec: type: array type: object extraFiles: - description: References to existing Config objects to use as extra - config files. They will be mounted as files in the specified - mount path. Each element can be a reference to any ConfigMap - or Secret. + description: |- + References to existing Config objects to use as extra config files. + They will be mounted as files in the specified mount path. + Each element can be a reference to any ConfigMap or Secret. properties: configMaps: - description: List of references to ConfigMaps objects mounted - as extra files under the MountPath specified. For each item - in this array, if a key is not specified, it means that - all keys in the ConfigMap will be mounted as files. Otherwise, - only the specified key will be mounted as a file. + description: |- + List of references to ConfigMaps objects mounted as extra files under the MountPath specified. + For each item in this array, if a key is not specified, it means that all keys in the ConfigMap will be mounted as files. + Otherwise, only the specified key will be mounted as a file. items: properties: key: description: Key in the object type: string name: - description: Name of the object We support only ConfigMaps - and Secrets. + description: |- + Name of the object + We support only ConfigMaps and Secrets. type: string required: - name @@ -181,18 +180,18 @@ spec: listed in the Items field type: string secrets: - description: List of references to Secrets objects mounted - as extra files under the MountPath specified. For each item - in this array, a key must be specified that will be mounted - as a file. + description: |- + List of references to Secrets objects mounted as extra files under the MountPath specified. + For each item in this array, a key must be specified that will be mounted as a file. items: properties: key: description: Key in the object type: string name: - description: Name of the object We support only ConfigMaps - and Secrets. + description: |- + Name of the object + We support only ConfigMaps and Secrets. type: string required: - name @@ -200,10 +199,9 @@ spec: type: array type: object image: - description: Custom image to use in all containers (including - Init Containers). It is your responsibility to make sure the - image is from trusted sources and has been validated for security - compliance + description: |- + Custom image to use in all containers (including Init Containers). + It is your responsibility to make sure the image is from trusted sources and has been validated for security compliance type: string imagePullSecrets: description: Image Pull Secrets to use in all containers (including @@ -213,8 +211,9 @@ spec: type: array replicas: default: 1 - description: Number of desired replicas to set in the Backstage - Deployment. Defaults to 1. + description: |- + Number of desired replicas to set in the Backstage Deployment. + Defaults to 1. format: int32 type: integer route: @@ -225,46 +224,47 @@ spec: description: Control the creation of a Route on OpenShift. type: boolean host: - description: Host is an alias/DNS that points to the service. - Optional. Ignored if Enabled is false. If not specified - a route name will typically be automatically chosen. Must - follow DNS952 subdomain conventions. + description: |- + Host is an alias/DNS that points to the service. Optional. + Ignored if Enabled is false. + If not specified a route name will typically be automatically + chosen. Must follow DNS952 subdomain conventions. maxLength: 253 pattern: ^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$ type: string subdomain: - description: 'Subdomain is a DNS subdomain that is requested - within the ingress controller''s domain (as a subdomain). - Ignored if Enabled is false. Example: subdomain `frontend` - automatically receives the router subdomain `apps.mycluster.com` - to have a full hostname `frontend.apps.mycluster.com`.' + description: |- + Subdomain is a DNS subdomain that is requested within the ingress controller's + domain (as a subdomain). + Ignored if Enabled is false. + Example: subdomain `frontend` automatically receives the router subdomain + `apps.mycluster.com` to have a full hostname `frontend.apps.mycluster.com`. maxLength: 253 pattern: ^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$ type: string tls: - description: The tls field provides the ability to configure - certificates for the route. Ignored if Enabled is false. + description: |- + The tls field provides the ability to configure certificates for the route. + Ignored if Enabled is false. properties: caCertificate: description: caCertificate provides the cert authority certificate contents type: string certificate: - description: certificate provides certificate contents. - This should be a single serving certificate, not a certificate + description: |- + certificate provides certificate contents. This should be a single serving certificate, not a certificate chain. Do not include a CA certificate. type: string externalCertificateSecretName: - description: ExternalCertificateSecretName provides certificate - contents as a secret reference. This should be a single - serving certificate, not a certificate chain. Do not - include a CA certificate. The secret referenced should + description: |- + ExternalCertificateSecretName provides certificate contents as a secret reference. + This should be a single serving certificate, not a certificate + chain. Do not include a CA certificate. The secret referenced should be present in the same namespace as that of the Route. - Forbidden when `certificate` is set. Note that securing - Routes with external certificates in TLS secrets is - a Technology Preview feature in OpenShift, and requires - enabling the `RouteExternalCertificate` OpenShift Feature - Gate and might not be functionally complete. + Forbidden when `certificate` is set. + Note that securing Routes with external certificates in TLS secrets is a Technology Preview feature in OpenShift, + and requires enabling the `RouteExternalCertificate` OpenShift Feature Gate and might not be functionally complete. type: string key: description: key provides key file contents @@ -276,14 +276,16 @@ spec: description: Configuration for database access. Optional. properties: authSecretName: - description: 'Name of the secret for database authentication. - Optional. For a local database deployment (EnableLocalDb=true), - a secret will be auto generated if it does not exist. The secret - shall include information used for the database access. An example - for PostgreSQL DB access: "POSTGRES_PASSWORD": "rl4s3Fh4ng3M4" - "POSTGRES_PORT": "5432" "POSTGRES_USER": "postgres" "POSTGRESQL_ADMIN_PASSWORD": - "rl4s3Fh4ng3M4" "POSTGRES_HOST": "backstage-psql-bs1" # For - local database, set to "backstage-psql-".' + description: |- + Name of the secret for database authentication. Optional. + For a local database deployment (EnableLocalDb=true), a secret will be auto generated if it does not exist. + The secret shall include information used for the database access. + An example for PostgreSQL DB access: + "POSTGRES_PASSWORD": "rl4s3Fh4ng3M4" + "POSTGRES_PORT": "5432" + "POSTGRES_USER": "postgres" + "POSTGRESQL_ADMIN_PASSWORD": "rl4s3Fh4ng3M4" + "POSTGRES_HOST": "backstage-psql-bs1" # For local database, set to "backstage-psql-". type: string enableLocalDb: default: true @@ -313,42 +315,42 @@ spec: of the runtime items: description: "Condition contains details for one aspect of the current - state of this API Resource. --- This struct is intended for direct - use as an array at the field path .status.conditions. For example, - \n type FooStatus struct{ // Represents the observations of a - foo's current state. // Known .status.conditions.type are: \"Available\", - \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge - // +listType=map // +listMapKey=type Conditions []metav1.Condition - `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" - protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }" + state of this API Resource.\n---\nThis struct is intended for + direct use as an array at the field path .status.conditions. For + example,\n\n\n\ttype FooStatus struct{\n\t // Represents the + observations of a foo's current state.\n\t // Known .status.conditions.type + are: \"Available\", \"Progressing\", and \"Degraded\"\n\t // + +patchMergeKey=type\n\t // +patchStrategy=merge\n\t // +listType=map\n\t + \ // +listMapKey=type\n\t Conditions []metav1.Condition `json:\"conditions,omitempty\" + patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"`\n\n\n\t + \ // other fields\n\t}" properties: lastTransitionTime: - description: lastTransitionTime is the last time the condition - transitioned from one status to another. This should be when - the underlying condition changed. If that is not known, then - using the time when the API field changed is acceptable. + description: |- + lastTransitionTime is the last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. format: date-time type: string message: - description: message is a human readable message indicating - details about the transition. This may be an empty string. + description: |- + message is a human readable message indicating details about the transition. + This may be an empty string. maxLength: 32768 type: string observedGeneration: - description: observedGeneration represents the .metadata.generation - that the condition was set based upon. For instance, if .metadata.generation - is currently 12, but the .status.conditions[x].observedGeneration - is 9, the condition is out of date with respect to the current - state of the instance. + description: |- + observedGeneration represents the .metadata.generation that the condition was set based upon. + For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date + with respect to the current state of the instance. format: int64 minimum: 0 type: integer reason: - description: reason contains a programmatic identifier indicating - the reason for the condition's last transition. Producers - of specific condition types may define expected values and - meanings for this field, and whether the values are considered - a guaranteed API. The value should be a CamelCase string. + description: |- + reason contains a programmatic identifier indicating the reason for the condition's last transition. + Producers of specific condition types may define expected values and meanings for this field, + and whether the values are considered a guaranteed API. + The value should be a CamelCase string. This field may not be empty. maxLength: 1024 minLength: 1 @@ -362,11 +364,12 @@ spec: - Unknown type: string type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - --- Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) + description: |- + type of condition in CamelCase or in foo.example.com/CamelCase. + --- + Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be + useful (see .node.status.conditions), the ability to deconflict is important. + The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) maxLength: 316 pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ type: string @@ -390,14 +393,19 @@ spec: description: Backstage is the Schema for the backstages API properties: apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources type: string kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds type: string metadata: type: object @@ -408,29 +416,23 @@ spec: description: Configuration for Backstage. Optional. properties: appConfig: - description: References to existing app-configs ConfigMap objects, - that will be mounted as files in the specified mount path. Each - element can be a reference to any ConfigMap or Secret, and will - be mounted inside the main application container under a specified - mount directory. Additionally, each file will be passed as a - `--config /mount/path/to/configmap/key` to the main container - args in the order of the entries defined in the AppConfigs list. - But bear in mind that for a single ConfigMap element containing - several filenames, the order in which those files will be appended - to the main container args cannot be guaranteed. So if you want - to pass multiple app-config files, it is recommended to pass - one ConfigMap per app-config file. + description: |- + References to existing app-configs ConfigMap objects, that will be mounted as files in the specified mount path. + Each element can be a reference to any ConfigMap or Secret, + and will be mounted inside the main application container under a specified mount directory. + Additionally, each file will be passed as a `--config /mount/path/to/configmap/key` to the + main container args in the order of the entries defined in the AppConfigs list. + But bear in mind that for a single ConfigMap element containing several filenames, + the order in which those files will be appended to the main container args cannot be guaranteed. + So if you want to pass multiple app-config files, it is recommended to pass one ConfigMap per app-config file. properties: configMaps: - description: List of ConfigMaps storing the app-config files. - Will be mounted as files under the MountPath specified. - For each item in this array, if a key is not specified, - it means that all keys in the ConfigMap will be mounted - as files. Otherwise, only the specified key will be mounted - as a file. Bear in mind not to put sensitive data in those - ConfigMaps. Instead, your app-config content can reference - environment variables (which you can set with the ExtraEnvs - field) and/or include extra files (see the ExtraFiles field). + description: |- + List of ConfigMaps storing the app-config files. Will be mounted as files under the MountPath specified. + For each item in this array, if a key is not specified, it means that all keys in the ConfigMap will be mounted as files. + Otherwise, only the specified key will be mounted as a file. + Bear in mind not to put sensitive data in those ConfigMaps. Instead, your app-config content can reference + environment variables (which you can set with the ExtraEnvs field) and/or include extra files (see the ExtraFiles field). More details on https://backstage.io/docs/conf/writing/. items: properties: @@ -438,8 +440,9 @@ spec: description: Key in the object type: string name: - description: Name of the object We support only ConfigMaps - and Secrets. + description: |- + Name of the object + We support only ConfigMaps and Secrets. type: string required: - name @@ -452,28 +455,28 @@ spec: type: string type: object dynamicPluginsConfigMapName: - description: 'Reference to an existing ConfigMap for Dynamic Plugins. + description: |- + Reference to an existing ConfigMap for Dynamic Plugins. A new one will be generated with the default config if not set. - The ConfigMap object must have an existing key named: ''dynamic-plugins.yaml''.' + The ConfigMap object must have an existing key named: 'dynamic-plugins.yaml'. type: string extraEnvs: description: Extra environment variables properties: configMaps: - description: List of references to ConfigMaps objects to inject - as additional environment variables. For each item in this - array, if a key is not specified, it means that all keys - in the ConfigMap will be injected as additional environment - variables. Otherwise, only the specified key will be injected - as an additional environment variable. + description: |- + List of references to ConfigMaps objects to inject as additional environment variables. + For each item in this array, if a key is not specified, it means that all keys in the ConfigMap will be injected as additional environment variables. + Otherwise, only the specified key will be injected as an additional environment variable. items: properties: key: description: Key in the object type: string name: - description: Name of the object We support only ConfigMaps - and Secrets. + description: |- + Name of the object + We support only ConfigMaps and Secrets. type: string required: - name @@ -496,20 +499,19 @@ spec: type: object type: array secrets: - description: List of references to Secrets objects to inject - as additional environment variables. For each item in this - array, if a key is not specified, it means that all keys - in the Secret will be injected as additional environment - variables. Otherwise, only the specified key will be injected - as environment variable. + description: |- + List of references to Secrets objects to inject as additional environment variables. + For each item in this array, if a key is not specified, it means that all keys in the Secret will be injected as additional environment variables. + Otherwise, only the specified key will be injected as environment variable. items: properties: key: description: Key in the object type: string name: - description: Name of the object We support only ConfigMaps - and Secrets. + description: |- + Name of the object + We support only ConfigMaps and Secrets. type: string required: - name @@ -517,25 +519,25 @@ spec: type: array type: object extraFiles: - description: References to existing Config objects to use as extra - config files. They will be mounted as files in the specified - mount path. Each element can be a reference to any ConfigMap - or Secret. + description: |- + References to existing Config objects to use as extra config files. + They will be mounted as files in the specified mount path. + Each element can be a reference to any ConfigMap or Secret. properties: configMaps: - description: List of references to ConfigMaps objects mounted - as extra files under the MountPath specified. For each item - in this array, if a key is not specified, it means that - all keys in the ConfigMap will be mounted as files. Otherwise, - only the specified key will be mounted as a file. + description: |- + List of references to ConfigMaps objects mounted as extra files under the MountPath specified. + For each item in this array, if a key is not specified, it means that all keys in the ConfigMap will be mounted as files. + Otherwise, only the specified key will be mounted as a file. items: properties: key: description: Key in the object type: string name: - description: Name of the object We support only ConfigMaps - and Secrets. + description: |- + Name of the object + We support only ConfigMaps and Secrets. type: string required: - name @@ -547,18 +549,18 @@ spec: listed in the Items field type: string secrets: - description: List of references to Secrets objects mounted - as extra files under the MountPath specified. For each item - in this array, a key must be specified that will be mounted - as a file. + description: |- + List of references to Secrets objects mounted as extra files under the MountPath specified. + For each item in this array, a key must be specified that will be mounted as a file. items: properties: key: description: Key in the object type: string name: - description: Name of the object We support only ConfigMaps - and Secrets. + description: |- + Name of the object + We support only ConfigMaps and Secrets. type: string required: - name @@ -566,10 +568,9 @@ spec: type: array type: object image: - description: Custom image to use in all containers (including - Init Containers). It is your responsibility to make sure the - image is from trusted sources and has been validated for security - compliance + description: |- + Custom image to use in all containers (including Init Containers). + It is your responsibility to make sure the image is from trusted sources and has been validated for security compliance type: string imagePullSecrets: description: Image Pull Secrets to use in all containers (including @@ -579,8 +580,9 @@ spec: type: array replicas: default: 1 - description: Number of desired replicas to set in the Backstage - Deployment. Defaults to 1. + description: |- + Number of desired replicas to set in the Backstage Deployment. + Defaults to 1. format: int32 type: integer route: @@ -591,46 +593,47 @@ spec: description: Control the creation of a Route on OpenShift. type: boolean host: - description: Host is an alias/DNS that points to the service. - Optional. Ignored if Enabled is false. If not specified - a route name will typically be automatically chosen. Must - follow DNS952 subdomain conventions. + description: |- + Host is an alias/DNS that points to the service. Optional. + Ignored if Enabled is false. + If not specified a route name will typically be automatically + chosen. Must follow DNS952 subdomain conventions. maxLength: 253 pattern: ^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$ type: string subdomain: - description: 'Subdomain is a DNS subdomain that is requested - within the ingress controller''s domain (as a subdomain). - Ignored if Enabled is false. Example: subdomain `frontend` - automatically receives the router subdomain `apps.mycluster.com` - to have a full hostname `frontend.apps.mycluster.com`.' + description: |- + Subdomain is a DNS subdomain that is requested within the ingress controller's + domain (as a subdomain). + Ignored if Enabled is false. + Example: subdomain `frontend` automatically receives the router subdomain + `apps.mycluster.com` to have a full hostname `frontend.apps.mycluster.com`. maxLength: 253 pattern: ^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$ type: string tls: - description: The tls field provides the ability to configure - certificates for the route. Ignored if Enabled is false. + description: |- + The tls field provides the ability to configure certificates for the route. + Ignored if Enabled is false. properties: caCertificate: description: caCertificate provides the cert authority certificate contents type: string certificate: - description: certificate provides certificate contents. - This should be a single serving certificate, not a certificate + description: |- + certificate provides certificate contents. This should be a single serving certificate, not a certificate chain. Do not include a CA certificate. type: string externalCertificateSecretName: - description: ExternalCertificateSecretName provides certificate - contents as a secret reference. This should be a single - serving certificate, not a certificate chain. Do not - include a CA certificate. The secret referenced should + description: |- + ExternalCertificateSecretName provides certificate contents as a secret reference. + This should be a single serving certificate, not a certificate + chain. Do not include a CA certificate. The secret referenced should be present in the same namespace as that of the Route. - Forbidden when `certificate` is set. Note that securing - Routes with external certificates in TLS secrets is - a Technology Preview feature in OpenShift, and requires - enabling the `RouteExternalCertificate` OpenShift Feature - Gate and might not be functionally complete. + Forbidden when `certificate` is set. + Note that securing Routes with external certificates in TLS secrets is a Technology Preview feature in OpenShift, + and requires enabling the `RouteExternalCertificate` OpenShift Feature Gate and might not be functionally complete. type: string key: description: key provides key file contents @@ -642,14 +645,16 @@ spec: description: Configuration for database access. Optional. properties: authSecretName: - description: 'Name of the secret for database authentication. - Optional. For a local database deployment (EnableLocalDb=true), - a secret will be auto generated if it does not exist. The secret - shall include information used for the database access. An example - for PostgreSQL DB access: "POSTGRES_PASSWORD": "rl4s3Fh4ng3M4" - "POSTGRES_PORT": "5432" "POSTGRES_USER": "postgres" "POSTGRESQL_ADMIN_PASSWORD": - "rl4s3Fh4ng3M4" "POSTGRES_HOST": "backstage-psql-bs1" # For - local database, set to "backstage-psql-".' + description: |- + Name of the secret for database authentication. Optional. + For a local database deployment (EnableLocalDb=true), a secret will be auto generated if it does not exist. + The secret shall include information used for the database access. + An example for PostgreSQL DB access: + "POSTGRES_PASSWORD": "rl4s3Fh4ng3M4" + "POSTGRES_PORT": "5432" + "POSTGRES_USER": "postgres" + "POSTGRESQL_ADMIN_PASSWORD": "rl4s3Fh4ng3M4" + "POSTGRES_HOST": "backstage-psql-bs1" # For local database, set to "backstage-psql-". type: string enableLocalDb: default: true @@ -658,14 +663,16 @@ spec: type: boolean type: object deployment: - description: Valid fragment of Deployment to be merged with default/raw - configuration. Set the Deployment's metadata and|or spec fields - you want to override or add. Optional. + description: |- + Valid fragment of Deployment to be merged with default/raw configuration. + Set the Deployment's metadata and|or spec fields you want to override or add. + Optional. properties: patch: - description: Valid fragment of Deployment to be merged with default/raw - configuration. Set the Deployment's metadata and|or spec fields - you want to override or add. Optional. + description: |- + Valid fragment of Deployment to be merged with default/raw configuration. + Set the Deployment's metadata and|or spec fields you want to override or add. + Optional. x-kubernetes-preserve-unknown-fields: true type: object x-kubernetes-preserve-unknown-fields: true @@ -691,42 +698,42 @@ spec: of the runtime items: description: "Condition contains details for one aspect of the current - state of this API Resource. --- This struct is intended for direct - use as an array at the field path .status.conditions. For example, - \n type FooStatus struct{ // Represents the observations of a - foo's current state. // Known .status.conditions.type are: \"Available\", - \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge - // +listType=map // +listMapKey=type Conditions []metav1.Condition - `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" - protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }" + state of this API Resource.\n---\nThis struct is intended for + direct use as an array at the field path .status.conditions. For + example,\n\n\n\ttype FooStatus struct{\n\t // Represents the + observations of a foo's current state.\n\t // Known .status.conditions.type + are: \"Available\", \"Progressing\", and \"Degraded\"\n\t // + +patchMergeKey=type\n\t // +patchStrategy=merge\n\t // +listType=map\n\t + \ // +listMapKey=type\n\t Conditions []metav1.Condition `json:\"conditions,omitempty\" + patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"`\n\n\n\t + \ // other fields\n\t}" properties: lastTransitionTime: - description: lastTransitionTime is the last time the condition - transitioned from one status to another. This should be when - the underlying condition changed. If that is not known, then - using the time when the API field changed is acceptable. + description: |- + lastTransitionTime is the last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. format: date-time type: string message: - description: message is a human readable message indicating - details about the transition. This may be an empty string. + description: |- + message is a human readable message indicating details about the transition. + This may be an empty string. maxLength: 32768 type: string observedGeneration: - description: observedGeneration represents the .metadata.generation - that the condition was set based upon. For instance, if .metadata.generation - is currently 12, but the .status.conditions[x].observedGeneration - is 9, the condition is out of date with respect to the current - state of the instance. + description: |- + observedGeneration represents the .metadata.generation that the condition was set based upon. + For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date + with respect to the current state of the instance. format: int64 minimum: 0 type: integer reason: - description: reason contains a programmatic identifier indicating - the reason for the condition's last transition. Producers - of specific condition types may define expected values and - meanings for this field, and whether the values are considered - a guaranteed API. The value should be a CamelCase string. + description: |- + reason contains a programmatic identifier indicating the reason for the condition's last transition. + Producers of specific condition types may define expected values and meanings for this field, + and whether the values are considered a guaranteed API. + The value should be a CamelCase string. This field may not be empty. maxLength: 1024 minLength: 1 @@ -740,11 +747,12 @@ spec: - Unknown type: string type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - --- Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) + description: |- + type of condition in CamelCase or in foo.example.com/CamelCase. + --- + Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be + useful (see .node.status.conditions), the ability to deconflict is important. + The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) maxLength: 316 pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ type: string diff --git a/config/crd/bases/rhdh.redhat.com_backstages.yaml b/config/crd/bases/rhdh.redhat.com_backstages.yaml index 5930c075..ed8d3272 100644 --- a/config/crd/bases/rhdh.redhat.com_backstages.yaml +++ b/config/crd/bases/rhdh.redhat.com_backstages.yaml @@ -3,8 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.11.3 - creationTimestamp: null + controller-gen.kubebuilder.io/version: v0.14.0 name: backstages.rhdh.redhat.com spec: group: rhdh.redhat.com @@ -25,14 +24,19 @@ spec: description: Backstage is the Schema for the backstages API properties: apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources type: string kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds type: string metadata: type: object @@ -43,29 +47,23 @@ spec: description: Configuration for Backstage. Optional. properties: appConfig: - description: References to existing app-configs ConfigMap objects, - that will be mounted as files in the specified mount path. Each - element can be a reference to any ConfigMap or Secret, and will - be mounted inside the main application container under a specified - mount directory. Additionally, each file will be passed as a - `--config /mount/path/to/configmap/key` to the main container - args in the order of the entries defined in the AppConfigs list. - But bear in mind that for a single ConfigMap element containing - several filenames, the order in which those files will be appended - to the main container args cannot be guaranteed. So if you want - to pass multiple app-config files, it is recommended to pass - one ConfigMap per app-config file. + description: |- + References to existing app-configs ConfigMap objects, that will be mounted as files in the specified mount path. + Each element can be a reference to any ConfigMap or Secret, + and will be mounted inside the main application container under a specified mount directory. + Additionally, each file will be passed as a `--config /mount/path/to/configmap/key` to the + main container args in the order of the entries defined in the AppConfigs list. + But bear in mind that for a single ConfigMap element containing several filenames, + the order in which those files will be appended to the main container args cannot be guaranteed. + So if you want to pass multiple app-config files, it is recommended to pass one ConfigMap per app-config file. properties: configMaps: - description: List of ConfigMaps storing the app-config files. - Will be mounted as files under the MountPath specified. - For each item in this array, if a key is not specified, - it means that all keys in the ConfigMap will be mounted - as files. Otherwise, only the specified key will be mounted - as a file. Bear in mind not to put sensitive data in those - ConfigMaps. Instead, your app-config content can reference - environment variables (which you can set with the ExtraEnvs - field) and/or include extra files (see the ExtraFiles field). + description: |- + List of ConfigMaps storing the app-config files. Will be mounted as files under the MountPath specified. + For each item in this array, if a key is not specified, it means that all keys in the ConfigMap will be mounted as files. + Otherwise, only the specified key will be mounted as a file. + Bear in mind not to put sensitive data in those ConfigMaps. Instead, your app-config content can reference + environment variables (which you can set with the ExtraEnvs field) and/or include extra files (see the ExtraFiles field). More details on https://backstage.io/docs/conf/writing/. items: properties: @@ -73,8 +71,9 @@ spec: description: Key in the object type: string name: - description: Name of the object We support only ConfigMaps - and Secrets. + description: |- + Name of the object + We support only ConfigMaps and Secrets. type: string required: - name @@ -87,28 +86,28 @@ spec: type: string type: object dynamicPluginsConfigMapName: - description: 'Reference to an existing ConfigMap for Dynamic Plugins. + description: |- + Reference to an existing ConfigMap for Dynamic Plugins. A new one will be generated with the default config if not set. - The ConfigMap object must have an existing key named: ''dynamic-plugins.yaml''.' + The ConfigMap object must have an existing key named: 'dynamic-plugins.yaml'. type: string extraEnvs: description: Extra environment variables properties: configMaps: - description: List of references to ConfigMaps objects to inject - as additional environment variables. For each item in this - array, if a key is not specified, it means that all keys - in the ConfigMap will be injected as additional environment - variables. Otherwise, only the specified key will be injected - as an additional environment variable. + description: |- + List of references to ConfigMaps objects to inject as additional environment variables. + For each item in this array, if a key is not specified, it means that all keys in the ConfigMap will be injected as additional environment variables. + Otherwise, only the specified key will be injected as an additional environment variable. items: properties: key: description: Key in the object type: string name: - description: Name of the object We support only ConfigMaps - and Secrets. + description: |- + Name of the object + We support only ConfigMaps and Secrets. type: string required: - name @@ -131,20 +130,19 @@ spec: type: object type: array secrets: - description: List of references to Secrets objects to inject - as additional environment variables. For each item in this - array, if a key is not specified, it means that all keys - in the Secret will be injected as additional environment - variables. Otherwise, only the specified key will be injected - as environment variable. + description: |- + List of references to Secrets objects to inject as additional environment variables. + For each item in this array, if a key is not specified, it means that all keys in the Secret will be injected as additional environment variables. + Otherwise, only the specified key will be injected as environment variable. items: properties: key: description: Key in the object type: string name: - description: Name of the object We support only ConfigMaps - and Secrets. + description: |- + Name of the object + We support only ConfigMaps and Secrets. type: string required: - name @@ -152,25 +150,25 @@ spec: type: array type: object extraFiles: - description: References to existing Config objects to use as extra - config files. They will be mounted as files in the specified - mount path. Each element can be a reference to any ConfigMap - or Secret. + description: |- + References to existing Config objects to use as extra config files. + They will be mounted as files in the specified mount path. + Each element can be a reference to any ConfigMap or Secret. properties: configMaps: - description: List of references to ConfigMaps objects mounted - as extra files under the MountPath specified. For each item - in this array, if a key is not specified, it means that - all keys in the ConfigMap will be mounted as files. Otherwise, - only the specified key will be mounted as a file. + description: |- + List of references to ConfigMaps objects mounted as extra files under the MountPath specified. + For each item in this array, if a key is not specified, it means that all keys in the ConfigMap will be mounted as files. + Otherwise, only the specified key will be mounted as a file. items: properties: key: description: Key in the object type: string name: - description: Name of the object We support only ConfigMaps - and Secrets. + description: |- + Name of the object + We support only ConfigMaps and Secrets. type: string required: - name @@ -182,18 +180,18 @@ spec: listed in the Items field type: string secrets: - description: List of references to Secrets objects mounted - as extra files under the MountPath specified. For each item - in this array, a key must be specified that will be mounted - as a file. + description: |- + List of references to Secrets objects mounted as extra files under the MountPath specified. + For each item in this array, a key must be specified that will be mounted as a file. items: properties: key: description: Key in the object type: string name: - description: Name of the object We support only ConfigMaps - and Secrets. + description: |- + Name of the object + We support only ConfigMaps and Secrets. type: string required: - name @@ -201,10 +199,9 @@ spec: type: array type: object image: - description: Custom image to use in all containers (including - Init Containers). It is your responsibility to make sure the - image is from trusted sources and has been validated for security - compliance + description: |- + Custom image to use in all containers (including Init Containers). + It is your responsibility to make sure the image is from trusted sources and has been validated for security compliance type: string imagePullSecrets: description: Image Pull Secrets to use in all containers (including @@ -214,8 +211,9 @@ spec: type: array replicas: default: 1 - description: Number of desired replicas to set in the Backstage - Deployment. Defaults to 1. + description: |- + Number of desired replicas to set in the Backstage Deployment. + Defaults to 1. format: int32 type: integer route: @@ -226,46 +224,47 @@ spec: description: Control the creation of a Route on OpenShift. type: boolean host: - description: Host is an alias/DNS that points to the service. - Optional. Ignored if Enabled is false. If not specified - a route name will typically be automatically chosen. Must - follow DNS952 subdomain conventions. + description: |- + Host is an alias/DNS that points to the service. Optional. + Ignored if Enabled is false. + If not specified a route name will typically be automatically + chosen. Must follow DNS952 subdomain conventions. maxLength: 253 pattern: ^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$ type: string subdomain: - description: 'Subdomain is a DNS subdomain that is requested - within the ingress controller''s domain (as a subdomain). - Ignored if Enabled is false. Example: subdomain `frontend` - automatically receives the router subdomain `apps.mycluster.com` - to have a full hostname `frontend.apps.mycluster.com`.' + description: |- + Subdomain is a DNS subdomain that is requested within the ingress controller's + domain (as a subdomain). + Ignored if Enabled is false. + Example: subdomain `frontend` automatically receives the router subdomain + `apps.mycluster.com` to have a full hostname `frontend.apps.mycluster.com`. maxLength: 253 pattern: ^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$ type: string tls: - description: The tls field provides the ability to configure - certificates for the route. Ignored if Enabled is false. + description: |- + The tls field provides the ability to configure certificates for the route. + Ignored if Enabled is false. properties: caCertificate: description: caCertificate provides the cert authority certificate contents type: string certificate: - description: certificate provides certificate contents. - This should be a single serving certificate, not a certificate + description: |- + certificate provides certificate contents. This should be a single serving certificate, not a certificate chain. Do not include a CA certificate. type: string externalCertificateSecretName: - description: ExternalCertificateSecretName provides certificate - contents as a secret reference. This should be a single - serving certificate, not a certificate chain. Do not - include a CA certificate. The secret referenced should + description: |- + ExternalCertificateSecretName provides certificate contents as a secret reference. + This should be a single serving certificate, not a certificate + chain. Do not include a CA certificate. The secret referenced should be present in the same namespace as that of the Route. - Forbidden when `certificate` is set. Note that securing - Routes with external certificates in TLS secrets is - a Technology Preview feature in OpenShift, and requires - enabling the `RouteExternalCertificate` OpenShift Feature - Gate and might not be functionally complete. + Forbidden when `certificate` is set. + Note that securing Routes with external certificates in TLS secrets is a Technology Preview feature in OpenShift, + and requires enabling the `RouteExternalCertificate` OpenShift Feature Gate and might not be functionally complete. type: string key: description: key provides key file contents @@ -277,14 +276,16 @@ spec: description: Configuration for database access. Optional. properties: authSecretName: - description: 'Name of the secret for database authentication. - Optional. For a local database deployment (EnableLocalDb=true), - a secret will be auto generated if it does not exist. The secret - shall include information used for the database access. An example - for PostgreSQL DB access: "POSTGRES_PASSWORD": "rl4s3Fh4ng3M4" - "POSTGRES_PORT": "5432" "POSTGRES_USER": "postgres" "POSTGRESQL_ADMIN_PASSWORD": - "rl4s3Fh4ng3M4" "POSTGRES_HOST": "backstage-psql-bs1" # For - local database, set to "backstage-psql-".' + description: |- + Name of the secret for database authentication. Optional. + For a local database deployment (EnableLocalDb=true), a secret will be auto generated if it does not exist. + The secret shall include information used for the database access. + An example for PostgreSQL DB access: + "POSTGRES_PASSWORD": "rl4s3Fh4ng3M4" + "POSTGRES_PORT": "5432" + "POSTGRES_USER": "postgres" + "POSTGRESQL_ADMIN_PASSWORD": "rl4s3Fh4ng3M4" + "POSTGRES_HOST": "backstage-psql-bs1" # For local database, set to "backstage-psql-". type: string enableLocalDb: default: true @@ -314,42 +315,42 @@ spec: of the runtime items: description: "Condition contains details for one aspect of the current - state of this API Resource. --- This struct is intended for direct - use as an array at the field path .status.conditions. For example, - \n type FooStatus struct{ // Represents the observations of a - foo's current state. // Known .status.conditions.type are: \"Available\", - \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge - // +listType=map // +listMapKey=type Conditions []metav1.Condition - `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" - protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }" + state of this API Resource.\n---\nThis struct is intended for + direct use as an array at the field path .status.conditions. For + example,\n\n\n\ttype FooStatus struct{\n\t // Represents the + observations of a foo's current state.\n\t // Known .status.conditions.type + are: \"Available\", \"Progressing\", and \"Degraded\"\n\t // + +patchMergeKey=type\n\t // +patchStrategy=merge\n\t // +listType=map\n\t + \ // +listMapKey=type\n\t Conditions []metav1.Condition `json:\"conditions,omitempty\" + patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"`\n\n\n\t + \ // other fields\n\t}" properties: lastTransitionTime: - description: lastTransitionTime is the last time the condition - transitioned from one status to another. This should be when - the underlying condition changed. If that is not known, then - using the time when the API field changed is acceptable. + description: |- + lastTransitionTime is the last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. format: date-time type: string message: - description: message is a human readable message indicating - details about the transition. This may be an empty string. + description: |- + message is a human readable message indicating details about the transition. + This may be an empty string. maxLength: 32768 type: string observedGeneration: - description: observedGeneration represents the .metadata.generation - that the condition was set based upon. For instance, if .metadata.generation - is currently 12, but the .status.conditions[x].observedGeneration - is 9, the condition is out of date with respect to the current - state of the instance. + description: |- + observedGeneration represents the .metadata.generation that the condition was set based upon. + For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date + with respect to the current state of the instance. format: int64 minimum: 0 type: integer reason: - description: reason contains a programmatic identifier indicating - the reason for the condition's last transition. Producers - of specific condition types may define expected values and - meanings for this field, and whether the values are considered - a guaranteed API. The value should be a CamelCase string. + description: |- + reason contains a programmatic identifier indicating the reason for the condition's last transition. + Producers of specific condition types may define expected values and meanings for this field, + and whether the values are considered a guaranteed API. + The value should be a CamelCase string. This field may not be empty. maxLength: 1024 minLength: 1 @@ -363,11 +364,12 @@ spec: - Unknown type: string type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - --- Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) + description: |- + type of condition in CamelCase or in foo.example.com/CamelCase. + --- + Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be + useful (see .node.status.conditions), the ability to deconflict is important. + The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) maxLength: 316 pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ type: string @@ -391,14 +393,19 @@ spec: description: Backstage is the Schema for the backstages API properties: apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources type: string kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds type: string metadata: type: object @@ -409,29 +416,23 @@ spec: description: Configuration for Backstage. Optional. properties: appConfig: - description: References to existing app-configs ConfigMap objects, - that will be mounted as files in the specified mount path. Each - element can be a reference to any ConfigMap or Secret, and will - be mounted inside the main application container under a specified - mount directory. Additionally, each file will be passed as a - `--config /mount/path/to/configmap/key` to the main container - args in the order of the entries defined in the AppConfigs list. - But bear in mind that for a single ConfigMap element containing - several filenames, the order in which those files will be appended - to the main container args cannot be guaranteed. So if you want - to pass multiple app-config files, it is recommended to pass - one ConfigMap per app-config file. + description: |- + References to existing app-configs ConfigMap objects, that will be mounted as files in the specified mount path. + Each element can be a reference to any ConfigMap or Secret, + and will be mounted inside the main application container under a specified mount directory. + Additionally, each file will be passed as a `--config /mount/path/to/configmap/key` to the + main container args in the order of the entries defined in the AppConfigs list. + But bear in mind that for a single ConfigMap element containing several filenames, + the order in which those files will be appended to the main container args cannot be guaranteed. + So if you want to pass multiple app-config files, it is recommended to pass one ConfigMap per app-config file. properties: configMaps: - description: List of ConfigMaps storing the app-config files. - Will be mounted as files under the MountPath specified. - For each item in this array, if a key is not specified, - it means that all keys in the ConfigMap will be mounted - as files. Otherwise, only the specified key will be mounted - as a file. Bear in mind not to put sensitive data in those - ConfigMaps. Instead, your app-config content can reference - environment variables (which you can set with the ExtraEnvs - field) and/or include extra files (see the ExtraFiles field). + description: |- + List of ConfigMaps storing the app-config files. Will be mounted as files under the MountPath specified. + For each item in this array, if a key is not specified, it means that all keys in the ConfigMap will be mounted as files. + Otherwise, only the specified key will be mounted as a file. + Bear in mind not to put sensitive data in those ConfigMaps. Instead, your app-config content can reference + environment variables (which you can set with the ExtraEnvs field) and/or include extra files (see the ExtraFiles field). More details on https://backstage.io/docs/conf/writing/. items: properties: @@ -439,8 +440,9 @@ spec: description: Key in the object type: string name: - description: Name of the object We support only ConfigMaps - and Secrets. + description: |- + Name of the object + We support only ConfigMaps and Secrets. type: string required: - name @@ -453,28 +455,28 @@ spec: type: string type: object dynamicPluginsConfigMapName: - description: 'Reference to an existing ConfigMap for Dynamic Plugins. + description: |- + Reference to an existing ConfigMap for Dynamic Plugins. A new one will be generated with the default config if not set. - The ConfigMap object must have an existing key named: ''dynamic-plugins.yaml''.' + The ConfigMap object must have an existing key named: 'dynamic-plugins.yaml'. type: string extraEnvs: description: Extra environment variables properties: configMaps: - description: List of references to ConfigMaps objects to inject - as additional environment variables. For each item in this - array, if a key is not specified, it means that all keys - in the ConfigMap will be injected as additional environment - variables. Otherwise, only the specified key will be injected - as an additional environment variable. + description: |- + List of references to ConfigMaps objects to inject as additional environment variables. + For each item in this array, if a key is not specified, it means that all keys in the ConfigMap will be injected as additional environment variables. + Otherwise, only the specified key will be injected as an additional environment variable. items: properties: key: description: Key in the object type: string name: - description: Name of the object We support only ConfigMaps - and Secrets. + description: |- + Name of the object + We support only ConfigMaps and Secrets. type: string required: - name @@ -497,20 +499,19 @@ spec: type: object type: array secrets: - description: List of references to Secrets objects to inject - as additional environment variables. For each item in this - array, if a key is not specified, it means that all keys - in the Secret will be injected as additional environment - variables. Otherwise, only the specified key will be injected - as environment variable. + description: |- + List of references to Secrets objects to inject as additional environment variables. + For each item in this array, if a key is not specified, it means that all keys in the Secret will be injected as additional environment variables. + Otherwise, only the specified key will be injected as environment variable. items: properties: key: description: Key in the object type: string name: - description: Name of the object We support only ConfigMaps - and Secrets. + description: |- + Name of the object + We support only ConfigMaps and Secrets. type: string required: - name @@ -518,25 +519,25 @@ spec: type: array type: object extraFiles: - description: References to existing Config objects to use as extra - config files. They will be mounted as files in the specified - mount path. Each element can be a reference to any ConfigMap - or Secret. + description: |- + References to existing Config objects to use as extra config files. + They will be mounted as files in the specified mount path. + Each element can be a reference to any ConfigMap or Secret. properties: configMaps: - description: List of references to ConfigMaps objects mounted - as extra files under the MountPath specified. For each item - in this array, if a key is not specified, it means that - all keys in the ConfigMap will be mounted as files. Otherwise, - only the specified key will be mounted as a file. + description: |- + List of references to ConfigMaps objects mounted as extra files under the MountPath specified. + For each item in this array, if a key is not specified, it means that all keys in the ConfigMap will be mounted as files. + Otherwise, only the specified key will be mounted as a file. items: properties: key: description: Key in the object type: string name: - description: Name of the object We support only ConfigMaps - and Secrets. + description: |- + Name of the object + We support only ConfigMaps and Secrets. type: string required: - name @@ -548,18 +549,18 @@ spec: listed in the Items field type: string secrets: - description: List of references to Secrets objects mounted - as extra files under the MountPath specified. For each item - in this array, a key must be specified that will be mounted - as a file. + description: |- + List of references to Secrets objects mounted as extra files under the MountPath specified. + For each item in this array, a key must be specified that will be mounted as a file. items: properties: key: description: Key in the object type: string name: - description: Name of the object We support only ConfigMaps - and Secrets. + description: |- + Name of the object + We support only ConfigMaps and Secrets. type: string required: - name @@ -567,10 +568,9 @@ spec: type: array type: object image: - description: Custom image to use in all containers (including - Init Containers). It is your responsibility to make sure the - image is from trusted sources and has been validated for security - compliance + description: |- + Custom image to use in all containers (including Init Containers). + It is your responsibility to make sure the image is from trusted sources and has been validated for security compliance type: string imagePullSecrets: description: Image Pull Secrets to use in all containers (including @@ -580,8 +580,9 @@ spec: type: array replicas: default: 1 - description: Number of desired replicas to set in the Backstage - Deployment. Defaults to 1. + description: |- + Number of desired replicas to set in the Backstage Deployment. + Defaults to 1. format: int32 type: integer route: @@ -592,46 +593,47 @@ spec: description: Control the creation of a Route on OpenShift. type: boolean host: - description: Host is an alias/DNS that points to the service. - Optional. Ignored if Enabled is false. If not specified - a route name will typically be automatically chosen. Must - follow DNS952 subdomain conventions. + description: |- + Host is an alias/DNS that points to the service. Optional. + Ignored if Enabled is false. + If not specified a route name will typically be automatically + chosen. Must follow DNS952 subdomain conventions. maxLength: 253 pattern: ^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$ type: string subdomain: - description: 'Subdomain is a DNS subdomain that is requested - within the ingress controller''s domain (as a subdomain). - Ignored if Enabled is false. Example: subdomain `frontend` - automatically receives the router subdomain `apps.mycluster.com` - to have a full hostname `frontend.apps.mycluster.com`.' + description: |- + Subdomain is a DNS subdomain that is requested within the ingress controller's + domain (as a subdomain). + Ignored if Enabled is false. + Example: subdomain `frontend` automatically receives the router subdomain + `apps.mycluster.com` to have a full hostname `frontend.apps.mycluster.com`. maxLength: 253 pattern: ^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$ type: string tls: - description: The tls field provides the ability to configure - certificates for the route. Ignored if Enabled is false. + description: |- + The tls field provides the ability to configure certificates for the route. + Ignored if Enabled is false. properties: caCertificate: description: caCertificate provides the cert authority certificate contents type: string certificate: - description: certificate provides certificate contents. - This should be a single serving certificate, not a certificate + description: |- + certificate provides certificate contents. This should be a single serving certificate, not a certificate chain. Do not include a CA certificate. type: string externalCertificateSecretName: - description: ExternalCertificateSecretName provides certificate - contents as a secret reference. This should be a single - serving certificate, not a certificate chain. Do not - include a CA certificate. The secret referenced should + description: |- + ExternalCertificateSecretName provides certificate contents as a secret reference. + This should be a single serving certificate, not a certificate + chain. Do not include a CA certificate. The secret referenced should be present in the same namespace as that of the Route. - Forbidden when `certificate` is set. Note that securing - Routes with external certificates in TLS secrets is - a Technology Preview feature in OpenShift, and requires - enabling the `RouteExternalCertificate` OpenShift Feature - Gate and might not be functionally complete. + Forbidden when `certificate` is set. + Note that securing Routes with external certificates in TLS secrets is a Technology Preview feature in OpenShift, + and requires enabling the `RouteExternalCertificate` OpenShift Feature Gate and might not be functionally complete. type: string key: description: key provides key file contents @@ -643,14 +645,16 @@ spec: description: Configuration for database access. Optional. properties: authSecretName: - description: 'Name of the secret for database authentication. - Optional. For a local database deployment (EnableLocalDb=true), - a secret will be auto generated if it does not exist. The secret - shall include information used for the database access. An example - for PostgreSQL DB access: "POSTGRES_PASSWORD": "rl4s3Fh4ng3M4" - "POSTGRES_PORT": "5432" "POSTGRES_USER": "postgres" "POSTGRESQL_ADMIN_PASSWORD": - "rl4s3Fh4ng3M4" "POSTGRES_HOST": "backstage-psql-bs1" # For - local database, set to "backstage-psql-".' + description: |- + Name of the secret for database authentication. Optional. + For a local database deployment (EnableLocalDb=true), a secret will be auto generated if it does not exist. + The secret shall include information used for the database access. + An example for PostgreSQL DB access: + "POSTGRES_PASSWORD": "rl4s3Fh4ng3M4" + "POSTGRES_PORT": "5432" + "POSTGRES_USER": "postgres" + "POSTGRESQL_ADMIN_PASSWORD": "rl4s3Fh4ng3M4" + "POSTGRES_HOST": "backstage-psql-bs1" # For local database, set to "backstage-psql-". type: string enableLocalDb: default: true @@ -659,14 +663,16 @@ spec: type: boolean type: object deployment: - description: Valid fragment of Deployment to be merged with default/raw - configuration. Set the Deployment's metadata and|or spec fields - you want to override or add. Optional. + description: |- + Valid fragment of Deployment to be merged with default/raw configuration. + Set the Deployment's metadata and|or spec fields you want to override or add. + Optional. properties: patch: - description: Valid fragment of Deployment to be merged with default/raw - configuration. Set the Deployment's metadata and|or spec fields - you want to override or add. Optional. + description: |- + Valid fragment of Deployment to be merged with default/raw configuration. + Set the Deployment's metadata and|or spec fields you want to override or add. + Optional. x-kubernetes-preserve-unknown-fields: true type: object x-kubernetes-preserve-unknown-fields: true @@ -692,42 +698,42 @@ spec: of the runtime items: description: "Condition contains details for one aspect of the current - state of this API Resource. --- This struct is intended for direct - use as an array at the field path .status.conditions. For example, - \n type FooStatus struct{ // Represents the observations of a - foo's current state. // Known .status.conditions.type are: \"Available\", - \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge - // +listType=map // +listMapKey=type Conditions []metav1.Condition - `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" - protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }" + state of this API Resource.\n---\nThis struct is intended for + direct use as an array at the field path .status.conditions. For + example,\n\n\n\ttype FooStatus struct{\n\t // Represents the + observations of a foo's current state.\n\t // Known .status.conditions.type + are: \"Available\", \"Progressing\", and \"Degraded\"\n\t // + +patchMergeKey=type\n\t // +patchStrategy=merge\n\t // +listType=map\n\t + \ // +listMapKey=type\n\t Conditions []metav1.Condition `json:\"conditions,omitempty\" + patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"`\n\n\n\t + \ // other fields\n\t}" properties: lastTransitionTime: - description: lastTransitionTime is the last time the condition - transitioned from one status to another. This should be when - the underlying condition changed. If that is not known, then - using the time when the API field changed is acceptable. + description: |- + lastTransitionTime is the last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. format: date-time type: string message: - description: message is a human readable message indicating - details about the transition. This may be an empty string. + description: |- + message is a human readable message indicating details about the transition. + This may be an empty string. maxLength: 32768 type: string observedGeneration: - description: observedGeneration represents the .metadata.generation - that the condition was set based upon. For instance, if .metadata.generation - is currently 12, but the .status.conditions[x].observedGeneration - is 9, the condition is out of date with respect to the current - state of the instance. + description: |- + observedGeneration represents the .metadata.generation that the condition was set based upon. + For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date + with respect to the current state of the instance. format: int64 minimum: 0 type: integer reason: - description: reason contains a programmatic identifier indicating - the reason for the condition's last transition. Producers - of specific condition types may define expected values and - meanings for this field, and whether the values are considered - a guaranteed API. The value should be a CamelCase string. + description: |- + reason contains a programmatic identifier indicating the reason for the condition's last transition. + Producers of specific condition types may define expected values and meanings for this field, + and whether the values are considered a guaranteed API. + The value should be a CamelCase string. This field may not be empty. maxLength: 1024 minLength: 1 @@ -741,11 +747,12 @@ spec: - Unknown type: string type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - --- Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) + description: |- + type of condition in CamelCase or in foo.example.com/CamelCase. + --- + Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be + useful (see .node.status.conditions), the ability to deconflict is important. + The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) maxLength: 316 pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ type: string diff --git a/config/manifests/backstage.io/backstage-operator.clusterserviceversion.yaml b/config/manifests/backstage.io/backstage-operator.clusterserviceversion.yaml deleted file mode 100644 index 6d131d49..00000000 --- a/config/manifests/backstage.io/backstage-operator.clusterserviceversion.yaml +++ /dev/null @@ -1,61 +0,0 @@ -apiVersion: operators.coreos.com/v1alpha1 -kind: ClusterServiceVersion -metadata: - annotations: - alm-examples: '[]' - capabilities: Seamless Upgrades - operatorframework.io/suggested-namespace: backstage-system - skipRange: '>=0.0.1 <0.3.0' - name: backstage-operator.v0.3.0 - namespace: placeholder -spec: - apiservicedefinitions: {} - customresourcedefinitions: - owned: - - description: Backstage is the Schema for the backstages API - displayName: Backstage - kind: Backstage - name: backstages.rhdh.redhat.com - version: v1alpha1 - - description: Backstage is the Schema for the backstages API - displayName: Backstage - kind: Backstage - name: backstages.rhdh.redhat.com - version: v1alpha2 - description: Operator to deploy Backstage on Kubernetes - displayName: Red Hat Developer Hub Operator - icon: - - base64data: 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 - mediatype: image/png - install: - spec: - deployments: null - strategy: "" - installModes: - - supported: false - type: OwnNamespace - - supported: false - type: SingleNamespace - - supported: false - type: MultiNamespace - - supported: true - type: AllNamespaces - keywords: - - Backstage - - RHDH - links: - - name: Backstage Operator - url: https://github.com/redhat-developer/rhdh-operator - maintainers: - - email: asoro@redhat.com - name: Armel Soro - - email: cdaley@redhat.com - name: Corey Daley - - email: gazarenk@redhat.com - name: Gennady Azarenkov - maturity: alpha - minKubeVersion: 1.25.0 - provider: - name: Red Hat Inc. - url: https://www.redhat.com/ - version: 0.3.0 diff --git a/config/manifests/backstage.io/bases/csv.yaml b/config/manifests/backstage.io/bases/csv.yaml new file mode 100644 index 00000000..64aff32e --- /dev/null +++ b/config/manifests/backstage.io/bases/csv.yaml @@ -0,0 +1,44 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + labels: + operatorframework.io/arch.amd64: supported + # name should fit the project name and version (i e backstage-operator.vX.Y.Z) , otherwise this CSV base will not be used + name: backstage-operator.v0.3.0 +spec: + description: | + Backstage Operator + + displayName: Backstage Operator +# icon: +# - base64data: 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 +# mediatype: image/png + installModes: + - supported: false + type: OwnNamespace + - supported: false + type: SingleNamespace + - supported: false + type: MultiNamespace + - supported: true + type: AllNamespaces + keywords: + - Backstage + - RHDH + links: + - name: Backstage Operator + url: https://github.com/redhat-developer/rhdh-operator + maintainers: + - email: asoro@redhat.com + name: Armel Soro + - email: cdaley@redhat.com + name: Corey Daley + - email: gazarenk@redhat.com + name: Gennady Azarenkov + - email: nboldt@redhat.com + name: Nick Boldt + maturity: alpha + minKubeVersion: 1.25.0 + provider: + name: Red Hat Inc. + url: https://www.redhat.com/ diff --git a/config/manifests/backstage.io/kustomization.yaml b/config/manifests/backstage.io/kustomization.yaml index a14706e9..2ec8adbf 100644 --- a/config/manifests/backstage.io/kustomization.yaml +++ b/config/manifests/backstage.io/kustomization.yaml @@ -1,7 +1,9 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization # These resources constitute the fully configured set of manifests # used to generate the 'manifests/' directory in a bundle. resources: -- backstage-operator.clusterserviceversion.yaml +- bases/backstage-operator.clusterserviceversion.yaml - ../../profile/backstage.io - ../../samples - ../../scorecard diff --git a/config/manifests/bases/backstage-operator.clusterserviceversion.yaml b/config/manifests/bases/backstage-operator.clusterserviceversion.yaml deleted file mode 100644 index 40af5f65..00000000 --- a/config/manifests/bases/backstage-operator.clusterserviceversion.yaml +++ /dev/null @@ -1,19 +0,0 @@ -apiVersion: operators.coreos.com/v1alpha1 -kind: ClusterServiceVersion -metadata: {} -spec: - apiservicedefinitions: {} - customresourcedefinitions: - owned: - - description: Backstage is the Schema for the backstages API - displayName: Backstage - kind: Backstage - name: backstages.rhdh.redhat.com - version: v1alpha2 - displayName: "" - install: - spec: - deployments: null - strategy: "" - provider: {} - version: 0.0.0 diff --git a/config/manifests/rhdh/backstage-operator.clusterserviceversion.yaml b/config/manifests/rhdh/backstage-operator.clusterserviceversion.yaml deleted file mode 100644 index 6d131d49..00000000 --- a/config/manifests/rhdh/backstage-operator.clusterserviceversion.yaml +++ /dev/null @@ -1,61 +0,0 @@ -apiVersion: operators.coreos.com/v1alpha1 -kind: ClusterServiceVersion -metadata: - annotations: - alm-examples: '[]' - capabilities: Seamless Upgrades - operatorframework.io/suggested-namespace: backstage-system - skipRange: '>=0.0.1 <0.3.0' - name: backstage-operator.v0.3.0 - namespace: placeholder -spec: - apiservicedefinitions: {} - customresourcedefinitions: - owned: - - description: Backstage is the Schema for the backstages API - displayName: Backstage - kind: Backstage - name: backstages.rhdh.redhat.com - version: v1alpha1 - - description: Backstage is the Schema for the backstages API - displayName: Backstage - kind: Backstage - name: backstages.rhdh.redhat.com - version: v1alpha2 - description: Operator to deploy Backstage on Kubernetes - displayName: Red Hat Developer Hub Operator - icon: - - base64data: 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 - mediatype: image/png - install: - spec: - deployments: null - strategy: "" - installModes: - - supported: false - type: OwnNamespace - - supported: false - type: SingleNamespace - - supported: false - type: MultiNamespace - - supported: true - type: AllNamespaces - keywords: - - Backstage - - RHDH - links: - - name: Backstage Operator - url: https://github.com/redhat-developer/rhdh-operator - maintainers: - - email: asoro@redhat.com - name: Armel Soro - - email: cdaley@redhat.com - name: Corey Daley - - email: gazarenk@redhat.com - name: Gennady Azarenkov - maturity: alpha - minKubeVersion: 1.25.0 - provider: - name: Red Hat Inc. - url: https://www.redhat.com/ - version: 0.3.0 diff --git a/config/manifests/rhdh/bases/csv.yaml b/config/manifests/rhdh/bases/csv.yaml new file mode 100644 index 00000000..c94d29f2 --- /dev/null +++ b/config/manifests/rhdh/bases/csv.yaml @@ -0,0 +1,91 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + labels: + operatorframework.io/arch.amd64: supported + annotations: + capabilities: Seamless Upgrades + categories: Developer Tools + certified: 'true' + containerImage: registry-proxy.engineering.redhat.com/rh-osbs/rhdh-rhdh-rhel9-operator:1.3 + description: Red Hat Developer Hub is a Red Hat supported version of Backstage. + It comes with pre-built plug-ins and configuration settings, supports use of an external database, and can + help streamline the process of setting up a self-managed internal + developer portal for adopters who are just starting out. + operatorframework.io/suggested-namespace: rhdh-operator + operators.openshift.io/valid-subscription: '["Red Hat Developer Hub"]' + # Infrastructure Feature Test annotations - must be strings, not booleans - see https://issues.redhat.com/browse/RHIDP-294 + features.operators.openshift.io/disconnected: "true" + features.operators.openshift.io/fips-compliant: "false" + features.operators.openshift.io/proxy-aware: "false" + features.operators.openshift.io/cnf: "false" + features.operators.openshift.io/cni: "false" + features.operators.openshift.io/csi: "false" + features.operators.openshift.io/tls-profiles: "false" + features.operators.openshift.io/token-auth-aws: "false" + features.operators.openshift.io/token-auth-azure: "false" + features.operators.openshift.io/token-auth-gcp: "false" + repository: https://gitlab.cee.redhat.com/rhidp/rhdh/ + support: Red Hat + skipRange: '>=1.0.0 <1.3.0' + # name should fit the project name and version (i e backstage-operator.vX.Y.Z) , otherwise this CSV base will not be used + name: backstage-operator.v0.3.0 +spec: + description: | + Red Hat Developer Hub is an enterprise-grade platform for building developer portals, containing a supported and opinionated framework. It comes with pre-built plug-ins and configuration settings, supports use of an external database, and can help streamline the process of setting up a self-managed internal developer portal for adopters who are just starting out. By implementing a unified and open platform designed to maximize developer skills, ease onboarding, and increase development productivity, focus can be centered on what really matters: writing great code. Red Hat Developer Hub also offers Software Templates to simplify the development process, which can reduce friction and frustration for development teams, boosting their productivity and increasing an organization's competitive advantage. + + System Architects can benefit by implementing a tailored platform with a complementary suite of verified and curated tools and components needed for operations teams to support developers—within a centralized, consistent location. Development teams can experience increased productivity, fewer development team obstacles, and simplified governance of technology choices with self-service and guardrails. + + ## Telemetry data collection + + The telemetry data collection feature is enabled by default. Red Hat Developer Hub sends telemetry data to Red Hat by using the `backstage-plugin-analytics-provider-segment` plugin. To disable this and to learn what data is being collected, see [Red Hat Developer Hub documentation on telemetry data collection](https://access.redhat.com/documentation/en-us/red_hat_developer_hub/1.3/html-single/administration_guide_for_red_hat_developer_hub/index#assembly-rhdh-telemetry_admin-rhdh). + + ## More Information + + * [Red Hat Developer Hub Product Page](https://www.redhat.com/en/technologies/cloud-computing/developer-hub) + * [Product Documentation](https://access.redhat.com/documentation/en-us/red_hat_developer_hub) + * [Life Cycle](https://access.redhat.com/node/7025299) + * [Support Policies](https://access.redhat.com/policy/developerhub-support-policy) + * [Configuring external PostgreSQL databases](https://docs.redhat.com/en/documentation/red_hat_developer_hub/1.3/html/administration_guide_for_red_hat_developer_hub/assembly-configuring-external-postgresql-databases#assembly-configuring-external-postgresql-databases) + + displayName: Red Hat Developer Hub Operator + icon: + - base64data: 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 + mediatype: image/png + installModes: + - supported: false + type: OwnNamespace + - supported: false + type: SingleNamespace + - supported: false + type: MultiNamespace + - supported: true + type: AllNamespaces + keywords: + - Backstage + - RHDH + links: + - name: Product Page + url: https://developers.redhat.com/products/developer-hub/overview/ + - name: Documentation + url: https://access.redhat.com/documentation/en-us/red_hat_developer_hub + - name: Backstage Operator (Upstream) + url: https://github.com/redhat-developer/rhdh-operator + - name: RHDH Operator (Downstream) + url: https://gitlab.cee.redhat.com/rhidp/rhdh/ + maintainers: + - email: asoro@redhat.com + name: Armel Soro + - email: cdaley@redhat.com + name: Corey Daley + - email: gazarenk@redhat.com + name: Gennady Azarenkov + - email: nboldt@redhat.com + name: Nick Boldt + maturity: alpha + minKubeVersion: 1.25.0 + provider: + name: Red Hat Inc. + url: https://www.redhat.com/ + version: 1.3.0 + replaces: rhdh-operator.v1.1.1 diff --git a/config/manifests/rhdh/kustomization.yaml b/config/manifests/rhdh/kustomization.yaml index bb4a1c41..7c387a1b 100644 --- a/config/manifests/rhdh/kustomization.yaml +++ b/config/manifests/rhdh/kustomization.yaml @@ -1,7 +1,9 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization # These resources constitute the fully configured set of manifests # used to generate the 'manifests/' directory in a bundle. resources: -- backstage-operator.clusterserviceversion.yaml +- bases/csv.yaml - ../../profile/rhdh - ../../samples - ../../scorecard diff --git a/config/profile/backstage.io/default-config/secret-envs.yaml.1 b/config/profile/backstage.io/default-config/secret-envs.yaml.1 deleted file mode 100644 index d196e301..00000000 --- a/config/profile/backstage.io/default-config/secret-envs.yaml.1 +++ /dev/null @@ -1,8 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - name: backend-auth-secret -stringData: - # generated with the command below (from https://janus-idp.io/docs/auth/service-to-service-auth/#setup): - # node -p 'require("crypto").randomBytes(24).toString("base64")' - BACKEND_SECRET: "R2FxRVNrcmwzYzhhN3l0V1VRcnQ3L1pLT09WaVhDNUEK" # notsecret diff --git a/config/profile/backstage.io/default-config/secret-files.yaml.sample b/config/profile/backstage.io/default-config/secret-files.yaml.sample deleted file mode 100644 index 2397428b..00000000 --- a/config/profile/backstage.io/default-config/secret-files.yaml.sample +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - name: my-backstage-extra-files-secret1 -stringData: - secret_file1.txt: | - # From Secret - Lorem Ipsum - Dolor Sit Amet \ No newline at end of file diff --git a/config/profile/backstage.io/kustomization.yaml b/config/profile/backstage.io/kustomization.yaml index a042e855..aa74cd77 100644 --- a/config/profile/backstage.io/kustomization.yaml +++ b/config/profile/backstage.io/kustomization.yaml @@ -1,3 +1,6 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + # Adds namespace to all resources. namespace: backstage-system @@ -8,29 +11,36 @@ namespace: backstage-system # field above. namePrefix: backstage- -bases: -- ../../crd -- ../../rbac -- ../../manager +resources: + - ../../crd + - ../../rbac + - manager.yaml + +patches: + - path: manager_auth_proxy_patch.yaml + target: + group: apps + version: v1 + kind: Deployment + name: controller-manager +# name: controller-manager +# namespace: system -patchesStrategicMerge: -# Protect the /metrics endpoint by putting it behind auth. -# If you want your controller-manager to expose the /metrics -# endpoint w/o any authn/z, please comment the following line. -- manager_auth_proxy_patch.yaml +images: + - name: controller + newName: quay.io/rhdh-community/operator + newTag: 0.3.0 generatorOptions: disableNameSuffixHash: true + configMapGenerator: - - files: - - default-config/app-config.yaml - - default-config/db-secret.yaml - - default-config/db-service.yaml - - default-config/db-statefulset.yaml - - default-config/deployment.yaml -# - default-config/dynamic-plugins.yaml -# - default-config/route.yaml -# - default-config/secret-envs.yaml - - default-config/service.yaml - name: default-config +- files: + - default-config/app-config.yaml + - default-config/db-secret.yaml + - default-config/db-service.yaml + - default-config/db-statefulset.yaml + - default-config/deployment.yaml + - default-config/service.yaml + name: default-config diff --git a/config/profile/backstage.io/manager.yaml b/config/profile/backstage.io/manager.yaml new file mode 100644 index 00000000..586ea633 --- /dev/null +++ b/config/profile/backstage.io/manager.yaml @@ -0,0 +1,111 @@ +apiVersion: v1 +kind: Namespace +metadata: + labels: + control-plane: controller-manager + app.kubernetes.io/name: namespace + app.kubernetes.io/instance: system + app.kubernetes.io/component: manager + app.kubernetes.io/created-by: backstage-operator + app.kubernetes.io/part-of: backstage-operator + app.kubernetes.io/managed-by: kustomize + name: system +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: controller-manager + namespace: system + labels: + control-plane: controller-manager + app.kubernetes.io/name: deployment + app.kubernetes.io/instance: controller-manager + app.kubernetes.io/component: manager + app.kubernetes.io/created-by: backstage-operator + app.kubernetes.io/part-of: backstage-operator + app.kubernetes.io/managed-by: kustomize +spec: + selector: + matchLabels: + control-plane: controller-manager + replicas: 1 + template: + metadata: + annotations: + kubectl.kubernetes.io/default-container: manager + labels: + control-plane: controller-manager + spec: + # Required because the operator does not work without a Service Account Token + automountServiceAccountToken: true # NOSONAR + # (user): Uncomment the following code to configure the nodeAffinity expression + # according to the platforms which are supported by your solution. + # It is considered best practice to support multiple architectures. You can + # build your manager image using the makefile target docker-buildx. + # affinity: + # nodeAffinity: + # requiredDuringSchedulingIgnoredDuringExecution: + # nodeSelectorTerms: + # - matchExpressions: + # - key: kubernetes.io/arch + # operator: In + # values: + # - amd64 + # - arm64 + # - ppc64le + # - s390x + # - key: kubernetes.io/os + # operator: In + # values: + # - linux + securityContext: + runAsNonRoot: true + # (user): For common cases that do not require escalating privileges + # it is recommended to ensure that all your Pods/Containers are restrictive. + # More info: https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted + # Please uncomment the following code if your project does NOT have to work on old Kubernetes + # versions < 1.19 or on vendors versions which do NOT support this field by default (i.e. Openshift < 4.11 ). + # seccompProfile: + # type: RuntimeDefault + containers: + - command: + - /manager + args: + - --leader-elect + image: controller:latest + name: manager + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - "ALL" + livenessProbe: + httpGet: + path: /healthz + port: 8081 + initialDelaySeconds: 15 + periodSeconds: 20 + readinessProbe: + httpGet: + path: /readyz + port: 8081 + initialDelaySeconds: 5 + periodSeconds: 10 + resources: + limits: + cpu: 500m + memory: 1Gi + ephemeral-storage: 20Mi + requests: + cpu: 10m + memory: 128Mi + volumeMounts: + - mountPath: /default-config + name: default-config + serviceAccountName: controller-manager + terminationGracePeriodSeconds: 10 + volumes: + - name: default-config + configMap: + name: default-config + diff --git a/config/profile/rhdh/kustomization.yaml b/config/profile/rhdh/kustomization.yaml index 014e3e32..9ecc3cd7 100644 --- a/config/profile/rhdh/kustomization.yaml +++ b/config/profile/rhdh/kustomization.yaml @@ -1,36 +1,48 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + # Adds namespace to all resources. -namespace: backstage-system +namespace: rhdh-operator # Value of this field is prepended to the # names of all resources, e.g. a deployment named # "wordpress" becomes "alices-wordpress". # Note that it should also match with the prefix (text before '-') of the namespace # field above. -namePrefix: backstage- +namePrefix: rhdh- + +resources: + - ../../crd + - ../../rbac + - manager.yaml +# - ../../manager + +patches: + - path: manager_auth_proxy_patch.yaml + target: + group: apps + version: v1 + kind: Deployment + name: controller-manager -bases: -- ../../crd -- ../../rbac -- ../../manager -patchesStrategicMerge: -# Protect the /metrics endpoint by putting it behind auth. -# If you want your controller-manager to expose the /metrics -# endpoint w/o any authn/z, please comment the following line. -- manager_auth_proxy_patch.yaml +images: + - name: controller + newName: quay.io/rhdh-community/operator + newTag: 0.3.0 generatorOptions: disableNameSuffixHash: true configMapGenerator: - - files: - - default-config/app-config.yaml - - default-config/db-secret.yaml - - default-config/db-service.yaml - - default-config/db-statefulset.yaml - - default-config/deployment.yaml - - default-config/dynamic-plugins.yaml - - default-config/route.yaml - - default-config/secret-envs.yaml - - default-config/service.yaml - name: default-config +- files: + - default-config/app-config.yaml + - default-config/db-secret.yaml + - default-config/db-service.yaml + - default-config/db-statefulset.yaml + - default-config/deployment.yaml + - default-config/dynamic-plugins.yaml + - default-config/route.yaml + - default-config/secret-envs.yaml + - default-config/service.yaml + name: default-config diff --git a/config/profile/rhdh/manager.yaml b/config/profile/rhdh/manager.yaml new file mode 100644 index 00000000..c9dd71e8 --- /dev/null +++ b/config/profile/rhdh/manager.yaml @@ -0,0 +1,122 @@ +apiVersion: v1 +kind: Namespace +metadata: + labels: + control-plane: controller-manager + app.kubernetes.io/name: namespace + app.kubernetes.io/instance: system + app.kubernetes.io/component: manager + app.kubernetes.io/created-by: backstage-operator + app.kubernetes.io/part-of: backstage-operator + app.kubernetes.io/managed-by: kustomize + name: operator +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: controller-manager + namespace: operator + labels: + control-plane: controller-manager + app.kubernetes.io/name: deployment + app.kubernetes.io/instance: controller-manager + app.kubernetes.io/component: manager + app.kubernetes.io/created-by: backstage-operator + app.kubernetes.io/part-of: backstage-operator + app.kubernetes.io/managed-by: kustomize +spec: + selector: + matchLabels: + control-plane: controller-manager + replicas: 1 + template: + metadata: + annotations: + kubectl.kubernetes.io/default-container: manager + labels: + control-plane: controller-manager + spec: + # Required because the operator does not work without a Service Account Token + automountServiceAccountToken: true # NOSONAR + # (user): Uncomment the following code to configure the nodeAffinity expression + # according to the platforms which are supported by your solution. + # It is considered best practice to support multiple architectures. You can + # build your manager image using the makefile target docker-buildx. + # affinity: + # nodeAffinity: + # requiredDuringSchedulingIgnoredDuringExecution: + # nodeSelectorTerms: + # - matchExpressions: + # - key: kubernetes.io/arch + # operator: In + # values: + # - amd64 + # - arm64 + # - ppc64le + # - s390x + # - key: kubernetes.io/os + # operator: In + # values: + # - linux + securityContext: + runAsNonRoot: true + # (user): For common cases that do not require escalating privileges + # it is recommended to ensure that all your Pods/Containers are restrictive. + # More info: https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted + # Please uncomment the following code if your project does NOT have to work on old Kubernetes + # versions < 1.19 or on vendors versions which do NOT support this field by default (i.e. Openshift < 4.11 ). + # seccompProfile: + # type: RuntimeDefault + containers: + - command: + - /manager + args: + - --leader-elect +# env: +# - name: OPERATOR_NAME +# value: rhdh-operator +# - name: POD_NAME +# valueFrom: +# fieldRef: +# fieldPath: metadata.name +# - name: RELATED_IMAGE_backstage +# value: registry-proxy.engineering.redhat.com/rh-osbs/rhdh-rhdh-hub-rhel9:1.3 +# - name: RELATED_IMAGE_postgresql +# value: registry.redhat.io/rhel9/postgresql-15:latest + image: controller:latest + name: manager + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - "ALL" + livenessProbe: + httpGet: + path: /healthz + port: 8081 + initialDelaySeconds: 15 + periodSeconds: 20 + readinessProbe: + httpGet: + path: /readyz + port: 8081 + initialDelaySeconds: 5 + periodSeconds: 10 + resources: + limits: + cpu: 500m + memory: 1Gi + ephemeral-storage: 20Mi + requests: + cpu: 10m + memory: 128Mi + volumeMounts: + - mountPath: /default-config + name: default-config + serviceAccountName: controller-manager + terminationGracePeriodSeconds: 10 + volumes: + - name: default-config + configMap: + name: default-config + diff --git a/config/profile/rhdh/manager_auth_proxy_patch.yaml b/config/profile/rhdh/manager_auth_proxy_patch.yaml index 687c4a7a..68b5a10f 100644 --- a/config/profile/rhdh/manager_auth_proxy_patch.yaml +++ b/config/profile/rhdh/manager_auth_proxy_patch.yaml @@ -4,7 +4,7 @@ apiVersion: apps/v1 kind: Deployment metadata: name: controller-manager - namespace: system + namespace: operator spec: template: spec: @@ -31,6 +31,7 @@ spec: capabilities: drop: - "ALL" + #image: registry.redhat.io/openshift4/ose-kube-rbac-proxy:v4.12 image: gcr.io/kubebuilder/kube-rbac-proxy:v0.13.0 args: - "--secure-listen-address=0.0.0.0:8443" diff --git a/config/rbac/role.yaml b/config/rbac/role.yaml index 48610f5b..c7c98a2d 100644 --- a/config/rbac/role.yaml +++ b/config/rbac/role.yaml @@ -2,7 +2,6 @@ apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: - creationTimestamp: null name: manager-role rules: - apiGroups: diff --git a/config/samples/_v1alpha1_backstage.yaml b/config/samples/_v1alpha1_backstage.yaml new file mode 100644 index 00000000..cfe58a26 --- /dev/null +++ b/config/samples/_v1alpha1_backstage.yaml @@ -0,0 +1,12 @@ +apiVersion: rhdh.redhat.com/v1alpha1 +kind: Backstage +metadata: + labels: + app.kubernetes.io/name: backstage +# app.kubernetes.io/instance: backstage-sample +# app.kubernetes.io/part-of: backstage-operator +# app.kubernetes.io/managed-by: kustomize +# app.kubernetes.io/created-by: backstage-operator + name: backstage-sample +#spec: + # TODO(user): Add fields here diff --git a/config/samples/_v1alpha2_backstage.yaml b/config/samples/_v1alpha2_backstage.yaml index 17e804b5..8c9aae00 100644 --- a/config/samples/_v1alpha2_backstage.yaml +++ b/config/samples/_v1alpha2_backstage.yaml @@ -3,10 +3,10 @@ kind: Backstage metadata: labels: app.kubernetes.io/name: backstage - app.kubernetes.io/instance: backstage-sample - app.kubernetes.io/part-of: backstage-operator - app.kubernetes.io/managed-by: kustomize - app.kubernetes.io/created-by: backstage-operator +# app.kubernetes.io/instance: backstage-sample +# app.kubernetes.io/part-of: backstage-operator +# app.kubernetes.io/managed-by: kustomize +# app.kubernetes.io/created-by: backstage-operator name: backstage-sample -spec: +#spec: # TODO(user): Add fields here diff --git a/config/samples/kustomization.yaml b/config/samples/kustomization.yaml index 7dc86ec2..8eb890d3 100644 --- a/config/samples/kustomization.yaml +++ b/config/samples/kustomization.yaml @@ -1,4 +1,5 @@ ## Append samples you want in your CSV to this file as resources ## resources: - _v1alpha2_backstage.yaml +- _v1alpha1_backstage.yaml #+kubebuilder:scaffold:manifestskustomizesamples diff --git a/config/scorecard/kustomization.yaml b/config/scorecard/kustomization.yaml index 50cd2d08..c6b1b11e 100644 --- a/config/scorecard/kustomization.yaml +++ b/config/scorecard/kustomization.yaml @@ -1,16 +1,17 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization resources: - bases/config.yaml -patchesJson6902: +patches: - path: patches/basic.config.yaml target: group: scorecard.operatorframework.io - version: v1alpha3 kind: Configuration name: config + version: v1alpha3 - path: patches/olm.config.yaml target: group: scorecard.operatorframework.io - version: v1alpha3 kind: Configuration name: config -#+kubebuilder:scaffold:patchesJson6902 + version: v1alpha3 diff --git a/docs/configuration.md b/docs/configuration.md index 6d3f6659..3f78dab2 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -1 +1,12 @@ -WIP \ No newline at end of file + +As described in [Design](design.md) document Backstage has 3 layers of configuration. +First layer is related to default configuration for all the instances inside Cluster and provided on Operator level. More details you can see in [Admin Guide](admin.md). +Other 2 are per instance (Custom Resource) configuration and described in this document. + +** Raw Configuration + + + +#### Custom Backstage Image + +You can use the Backstage Operator to deploy a backstage application with your custom backstage image by setting the field `spec.application.image` in your Backstage CR. This is at your own risk and it is your responsibility to ensure that the image is from trusted sources, and has been tested and validated for security compliance. \ No newline at end of file