From 85e22b8a2431108a96c4bcd765b52fa913747700 Mon Sep 17 00:00:00 2001 From: mjiao Date: Mon, 16 Oct 2023 13:00:41 +0200 Subject: [PATCH] operator sap-data-intelligence-observer-operator (1.0.4) Signed-off-by: Manjun Jiao Signed-off-by: mjiao --- ...er-manager-metrics-service_v1_service.yaml | 23 + ...c.authorization.k8s.io_v1_clusterrole.yaml | 17 + ...server-operator.clusterserviceversion.yaml | 417 +++++++++++++++ .../sdi.sap-redhat.io_sdiobservers.yaml | 479 ++++++++++++++++++ .../1.0.4/metadata/annotations.yaml | 14 + 5 files changed, 950 insertions(+) create mode 100644 operators/sap-data-intelligence-observer-operator/1.0.4/manifests/observer-operator-controller-manager-metrics-service_v1_service.yaml create mode 100644 operators/sap-data-intelligence-observer-operator/1.0.4/manifests/observer-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml create mode 100644 operators/sap-data-intelligence-observer-operator/1.0.4/manifests/observer-operator.clusterserviceversion.yaml create mode 100644 operators/sap-data-intelligence-observer-operator/1.0.4/manifests/sdi.sap-redhat.io_sdiobservers.yaml create mode 100644 operators/sap-data-intelligence-observer-operator/1.0.4/metadata/annotations.yaml diff --git a/operators/sap-data-intelligence-observer-operator/1.0.4/manifests/observer-operator-controller-manager-metrics-service_v1_service.yaml b/operators/sap-data-intelligence-observer-operator/1.0.4/manifests/observer-operator-controller-manager-metrics-service_v1_service.yaml new file mode 100644 index 00000000000..f5e90e1ecc8 --- /dev/null +++ b/operators/sap-data-intelligence-observer-operator/1.0.4/manifests/observer-operator-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: observer-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: observer-operator + control-plane: controller-manager + name: observer-operator-controller-manager-metrics-service +spec: + ports: + - name: https + port: 8443 + protocol: TCP + targetPort: https + selector: + control-plane: controller-manager +status: + loadBalancer: {} diff --git a/operators/sap-data-intelligence-observer-operator/1.0.4/manifests/observer-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml b/operators/sap-data-intelligence-observer-operator/1.0.4/manifests/observer-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml new file mode 100644 index 00000000000..98f91470a50 --- /dev/null +++ b/operators/sap-data-intelligence-observer-operator/1.0.4/manifests/observer-operator-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: observer-operator + app.kubernetes.io/instance: metrics-reader + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: clusterrole + app.kubernetes.io/part-of: observer-operator + name: observer-operator-metrics-reader +rules: +- nonResourceURLs: + - /metrics + verbs: + - get diff --git a/operators/sap-data-intelligence-observer-operator/1.0.4/manifests/observer-operator.clusterserviceversion.yaml b/operators/sap-data-intelligence-observer-operator/1.0.4/manifests/observer-operator.clusterserviceversion.yaml new file mode 100644 index 00000000000..bc5b5e55e69 --- /dev/null +++ b/operators/sap-data-intelligence-observer-operator/1.0.4/manifests/observer-operator.clusterserviceversion.yaml @@ -0,0 +1,417 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + annotations: + alm-examples: |- + [ + { + "apiVersion": "sdi.sap-redhat.io/v1alpha1", + "kind": "SDIObserver", + "metadata": { + "labels": { + "app.kubernetes.io/part-of": "observer-operator" + }, + "name": "sdiobserver-sample", + "namespace": "sdi-observer" + }, + "spec": { + "manageSDINodeConfig": true, + "sdiNamespace": "sdi", + "sdiVSystemRoute": { + "managementState": "Managed" + }, + "slcbNamespace": "sap-slcbridge", + "slcbRoute": { + "managementState": "Managed" + } + } + } + ] + capabilities: Basic Install + categories: AI/Machine Learning + containerImage: quay.io/redhat-sap-cop/sdi-observer-operator:0.1.25 + description: Configure and enable SAP Data Intelligence 3 to run on OpenShift 4 + operators.operatorframework.io/builder: operator-sdk-v1.19.0+git + operators.operatorframework.io/project_layout: go.kubebuilder.io/v3 + name: observer-operator.v1.0.4 + namespace: placeholder +spec: + apiservicedefinitions: {} + replaces: observer-operator.v1.0.3 + customresourcedefinitions: + owned: + - description: SDIObserver is the Schema for the sdiobservers API + displayName: SDIObserver + kind: SDIObserver + name: sdiobservers.sdi.sap-redhat.io + version: v1alpha1 + description: Operator for monitoring SAP Data Intelligence (SDI) namespace and modifying + objects in there that enable running of SDI on top of OpenShift. It must be deployed before the SDI installation + is started. This is the prerequisite for the successful installation of the SDI + on OpenShift. Please refer to https://access.redhat.com/articles/7017022 for detailed + information. + displayName: SAP Data Intelligence 3 - Observer Operator + icon: + - base64data: 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 + mediatype: image/png + install: + spec: + clusterPermissions: + - rules: + - apiGroups: + - security.openshift.io + resources: + - securitycontextconstraints + resourceNames: + - privileged + - anyuid + verbs: + - use + - apiGroups: + - "" + resources: + - pods + verbs: + - delete + - get + - list + - watch + - apiGroups: + - apps + resources: + - daemonsets + - statefulsets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - config.openshift.io + resources: + - clusteroperators + verbs: + - get + - list + - watch + - apiGroups: + - "" + resources: + - namespaces + - serviceaccounts + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - "" + resources: + - secrets + verbs: + - get + - list + - watch + - apiGroups: + - "" + resources: + - services + verbs: + - get + - list + - watch + - apiGroups: + - image.openshift.io + resources: + - imagestreams + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - installers.datahub.sap.com + resources: + - datahubs + - voraclusters + verbs: + - get + - list + - patch + - update + - watch + - apiGroups: + - machineconfiguration.openshift.io + resources: + - containerruntimeconfigs + - kubeletconfigs + - machineconfigpools + - machineconfigs + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - rbac.authorization.k8s.io + resources: + - rolebindings + - roles + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - route.openshift.io + resources: + - routes + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - route.openshift.io + resources: + - routes/custom-host + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - route.openshift.io + resources: + - routes/status + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - sdi.sap-redhat.io + resources: + - sdiobservers + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - sdi.sap-redhat.io + resources: + - sdiobservers/finalizers + verbs: + - update + - apiGroups: + - sdi.sap-redhat.io + resources: + - sdiobservers/status + verbs: + - get + - patch + - update + - apiGroups: + - authentication.k8s.io + resources: + - tokenreviews + verbs: + - create + - apiGroups: + - authorization.k8s.io + resources: + - subjectaccessreviews + verbs: + - create + serviceAccountName: observer-operator-controller-manager + deployments: + - label: + app.kubernetes.io/component: manager + app.kubernetes.io/created-by: observer-operator + app.kubernetes.io/instance: controller-manager + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: deployment + app.kubernetes.io/part-of: observer-operator + control-plane: controller-manager + name: observer-operator-controller-manager + spec: + replicas: 1 + selector: + matchLabels: + control-plane: controller-manager + strategy: {} + template: + metadata: + annotations: + kubectl.kubernetes.io/default-container: manager + labels: + control-plane: controller-manager + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: kubernetes.io/arch + operator: In + values: + - amd64 + - arm64 + - ppc64le + - s390x + - key: kubernetes.io/os + operator: In + values: + - linux + containers: + - args: + - --secure-listen-address=0.0.0.0:8443 + - --upstream=http://127.0.0.1:8080/ + - --logtostderr=true + - --v=0 + image: gcr.io/kubebuilder/kube-rbac-proxy:v0.13.0 + name: kube-rbac-proxy + ports: + - containerPort: 8443 + name: https + protocol: TCP + resources: + limits: + cpu: 500m + memory: 128Mi + requests: + cpu: 5m + memory: 64Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + - args: + - --health-probe-bind-address=:8081 + - --metrics-bind-address=127.0.0.1:8080 + - --leader-elect + command: + - /manager + env: + - name: OPERATOR_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + image: quay.io/redhat-sap-cop/sdi-observer-operator:0.1.25 + livenessProbe: + httpGet: + path: /healthz + port: 8081 + initialDelaySeconds: 15 + periodSeconds: 20 + name: manager + readinessProbe: + httpGet: + path: /readyz + port: 8081 + initialDelaySeconds: 5 + periodSeconds: 10 + resources: + limits: + cpu: 500m + memory: 256Mi + requests: + cpu: 10m + memory: 64Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + securityContext: + runAsNonRoot: true + serviceAccountName: observer-operator-controller-manager + terminationGracePeriodSeconds: 10 + permissions: + - rules: + - apiGroups: + - "" + resources: + - configmaps + verbs: + - get + - list + - watch + - create + - update + - patch + - delete + - apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - get + - list + - watch + - create + - update + - patch + - delete + - apiGroups: + - "" + resources: + - events + verbs: + - create + - patch + serviceAccountName: observer-operator-controller-manager + strategy: deployment + installModes: + - supported: false + type: OwnNamespace + - supported: false + type: SingleNamespace + - supported: false + type: MultiNamespace + - supported: true + type: AllNamespaces + keywords: + - sdi + - sap data intelligence + links: + - name: SAP Data Intelligence 3 - Observer Operator + url: https://github.com/redhat-sap/sap-data-intelligence/tree/master/observer-operator + maintainers: + - email: mjiao@redhat.com + name: Manjun Jiao + maturity: stable + minKubeVersion: 1.25.0 + provider: + name: SAP LinuxLab - Red Hat + url: https://github.com/sap-linuxlab + version: 1.0.4 diff --git a/operators/sap-data-intelligence-observer-operator/1.0.4/manifests/sdi.sap-redhat.io_sdiobservers.yaml b/operators/sap-data-intelligence-observer-operator/1.0.4/manifests/sdi.sap-redhat.io_sdiobservers.yaml new file mode 100644 index 00000000000..9ff8147c31b --- /dev/null +++ b/operators/sap-data-intelligence-observer-operator/1.0.4/manifests/sdi.sap-redhat.io_sdiobservers.yaml @@ -0,0 +1,479 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.10.0 + creationTimestamp: null + name: sdiobservers.sdi.sap-redhat.io +spec: + group: sdi.sap-redhat.io + names: + kind: SDIObserver + listKind: SDIObserverList + plural: sdiobservers + singular: sdiobserver + scope: Namespaced + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + description: SDIObserver is the Schema for the sdiobservers 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' + 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' + type: string + metadata: + type: object + spec: + description: SDIObserverSpec defines the desired state of SDIObserver. + properties: + SDINodeLabel: + default: node-role.kubernetes.io/sdi= + description: SDINodeLabel should be set to the corresponding SAP DI + node label. It will be used for annotating the namespaces of SAP + DI service so that the Pods will be running on the labeled SAP DI + node. + type: string + manageSDINodeConfig: + default: true + description: manageSDINodeConfig defines whether SAP DI node configuration + (load kernel modules, change container PID limits) will be managed. + by Operator + type: boolean + sdiNamespace: + description: sdiNamespace is the namespace in which the SAP Data + Intelligence is running. + maxLength: 63 + minLength: 2 + pattern: '[[:alnum:]]+(-[[:alnum:]]+)*' + type: string + sdiVSystemRoute: + description: sdiVSystemRoute managementState allows to control route management for + an SDI service. + properties: + managementState: + default: Managed + enum: + - Managed + - Unmanaged + - Removed + type: string + type: object + slcbNamespace: + description: slcbNamespace is the namespace in which the SAP SLC Bridge. + is running + maxLength: 63 + minLength: 2 + pattern: '[[:alnum:]]+(-[[:alnum:]]+)*' + type: string + slcbRoute: + description: slcbRoute managementState allows to control OpenShift route + management for an SLC Bridge service. + properties: + managementState: + default: Managed + enum: + - Managed + - Unmanaged + - Removed + type: string + type: object + required: + - manageSDINodeConfig + - sdiNamespace + - sdiVSystemRoute + - slcbNamespace + - slcbRoute + type: object + status: + description: SDIObserverStatus defines the observed state of SDIObserver. + properties: + conditions: + 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 }" + 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. + format: date-time + type: string + message: + 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. + 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. + This field may not be empty. + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + type: string + status: + description: status of the condition, one of True, False, Unknown. + enum: + - "True" + - "False" + - 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) + 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 + required: + - lastTransitionTime + - message + - reason + - status + - type + type: object + type: array + sdiConfigStatus: + description: Status of the SDI config. + properties: + conditions: + 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 }" + 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. + format: date-time + type: string + message: + 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. + 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. This field may not be empty. + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + type: string + status: + description: status of the condition, one of True, False, + Unknown. + enum: + - "True" + - "False" + - 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) + 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 + required: + - lastTransitionTime + - message + - reason + - status + - type + type: object + type: array + required: + - conditions + type: object + sdiNodeConfigStatus: + description: Status of the SDI node config. + properties: + conditions: + 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 }" + 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. + format: date-time + type: string + message: + 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. + 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. This field may not be empty. + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + type: string + status: + description: status of the condition, one of True, False, + Unknown. + enum: + - "True" + - "False" + - 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) + 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 + required: + - lastTransitionTime + - message + - reason + - status + - type + type: object + type: array + required: + - conditions + type: object + slcbRouteStatus: + description: Status of the slcb route. + properties: + conditions: + 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 }" + 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. + format: date-time + type: string + message: + 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. + 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. This field may not be empty. + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + type: string + status: + description: status of the condition, one of True, False, + Unknown. + enum: + - "True" + - "False" + - 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) + 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 + required: + - lastTransitionTime + - message + - reason + - status + - type + type: object + type: array + required: + - conditions + type: object + vsystemRouteStatus: + description: Status of the vsystem route. + properties: + conditions: + 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 }" + 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. + format: date-time + type: string + message: + 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. + 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. This field may not be empty. + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + type: string + status: + description: status of the condition, one of True, False, + Unknown. + enum: + - "True" + - "False" + - 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) + 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 + required: + - lastTransitionTime + - message + - reason + - status + - type + type: object + type: array + required: + - conditions + type: object + type: object + type: object + served: true + storage: true + subresources: + status: {} diff --git a/operators/sap-data-intelligence-observer-operator/1.0.4/metadata/annotations.yaml b/operators/sap-data-intelligence-observer-operator/1.0.4/metadata/annotations.yaml new file mode 100644 index 00000000000..70a8603cc09 --- /dev/null +++ b/operators/sap-data-intelligence-observer-operator/1.0.4/metadata/annotations.yaml @@ -0,0 +1,14 @@ +annotations: + # Core bundle annotations. + operators.operatorframework.io.bundle.mediatype.v1: registry+v1 + operators.operatorframework.io.bundle.manifests.v1: manifests/ + operators.operatorframework.io.bundle.metadata.v1: metadata/ + operators.operatorframework.io.bundle.package.v1: sap-data-intelligence-observer-operator + operators.operatorframework.io.bundle.channels.v1: stable + operators.operatorframework.io.bundle.channel.default.v1: stable + operators.operatorframework.io.metrics.builder: operator-sdk-v1.19.0+git + operators.operatorframework.io.metrics.mediatype.v1: metrics+v1 + operators.operatorframework.io.metrics.project_layout: go.kubebuilder.io/v3 + + # Annotations to specify OCP versions compatibility. + com.redhat.openshift.versions: v4.12 \ No newline at end of file