From ce8507cf8ebcd4925bead56ac9ad20f79009f55c Mon Sep 17 00:00:00 2001 From: Scott Trent <32449003+trent-s@users.noreply.github.com> Date: Sun, 29 Sep 2024 19:03:44 +0900 Subject: [PATCH] operator susql-operator (0.0.32) --- ...c.authorization.k8s.io_v1_clusterrole.yaml | 17 + ...er-manager-metrics-service_v1_service.yaml | 23 + .../susql-operator.clusterserviceversion.yaml | 411 ++++++++++++++++++ .../manifests/susql.ibm.com_labelgroups.yaml | 98 +++++ .../0.0.32/metadata/annotations.yaml | 17 + .../0.0.32/tests/scorecard/config.yaml | 70 +++ 6 files changed, 636 insertions(+) create mode 100644 operators/susql-operator/0.0.32/manifests/susql-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml create mode 100644 operators/susql-operator/0.0.32/manifests/susql-operator-susql-controller-manager-metrics-service_v1_service.yaml create mode 100644 operators/susql-operator/0.0.32/manifests/susql-operator.clusterserviceversion.yaml create mode 100644 operators/susql-operator/0.0.32/manifests/susql.ibm.com_labelgroups.yaml create mode 100644 operators/susql-operator/0.0.32/metadata/annotations.yaml create mode 100644 operators/susql-operator/0.0.32/tests/scorecard/config.yaml diff --git a/operators/susql-operator/0.0.32/manifests/susql-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml b/operators/susql-operator/0.0.32/manifests/susql-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml new file mode 100644 index 00000000000..3f9deff585f --- /dev/null +++ b/operators/susql-operator/0.0.32/manifests/susql-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: susql-operator + app.kubernetes.io/instance: metrics-reader + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: clusterrole + app.kubernetes.io/part-of: susql-operator + name: susql-operator-metrics-reader +rules: +- nonResourceURLs: + - /metrics + verbs: + - get diff --git a/operators/susql-operator/0.0.32/manifests/susql-operator-susql-controller-manager-metrics-service_v1_service.yaml b/operators/susql-operator/0.0.32/manifests/susql-operator-susql-controller-manager-metrics-service_v1_service.yaml new file mode 100644 index 00000000000..511522ffcde --- /dev/null +++ b/operators/susql-operator/0.0.32/manifests/susql-operator-susql-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: susql-operator + app.kubernetes.io/instance: susql-controller-manager-metrics-service + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: service + app.kubernetes.io/part-of: susql-operator + control-plane: susql-controller-manager + name: susql-operator-susql-controller-manager-metrics-service +spec: + ports: + - name: https + port: 8443 + protocol: TCP + targetPort: https + selector: + control-plane: susql-controller-manager +status: + loadBalancer: {} diff --git a/operators/susql-operator/0.0.32/manifests/susql-operator.clusterserviceversion.yaml b/operators/susql-operator/0.0.32/manifests/susql-operator.clusterserviceversion.yaml new file mode 100644 index 00000000000..c426021013c --- /dev/null +++ b/operators/susql-operator/0.0.32/manifests/susql-operator.clusterserviceversion.yaml @@ -0,0 +1,411 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + annotations: + alm-examples: |- + [ + { + "apiVersion": "susql.ibm.com/v1", + "kind": "LabelGroup", + "metadata": { + "labels": { + "app.kubernetes.io/created-by": "susql-operator", + "app.kubernetes.io/instance": "labelgroup-sample", + "app.kubernetes.io/managed-by": "kustomize", + "app.kubernetes.io/name": "labelgroup", + "app.kubernetes.io/part-of": "susql-operator" + }, + "name": "labelgroup-sample" + }, + "spec": { + "labels": [ + "labelgroup-sample-1", + "labelgroup-sample-2" + ] + } + } + ] + capabilities: Basic Install + categories: Monitoring + containerImage: quay.io/sustainable_computing_io/susql_operator:0.0.32 + createdAt: "2024-09-29T09:27:06Z" + description: 'Aggregates energy and CO2 emission data for pods tagged with SusQL + labels ' + operators.operatorframework.io/builder: operator-sdk-v1.36.1 + operators.operatorframework.io/project_layout: go.kubebuilder.io/v4 + repository: https://github.com/sustainable-computing-io/susql-operator + support: https://github.com/sustainable-computing-io/susql-operator/issues + name: susql-operator.v0.0.32 + namespace: placeholder +spec: + apiservicedefinitions: {} + customresourcedefinitions: + owned: + - description: LabelGroup is the Schema for the LabelGroups API + displayName: Label Group + kind: LabelGroup + name: labelgroups.susql.ibm.com + version: v1 + description: |- + ### About this Operator + + SusQL is a Kubernetes operator that aggregates energy and estimated + carbon dioxide emission data for pods tagged with SusQL specific + labels. The energy measurements are taken from Kepler which should + be deployed in the cluster before using SusQL. + + ### Prerequisites + + 1. Deployment of [Kepler](https://sustainable-computing.io/) on the cluster + 2. Ensure that [User Project Monitoring](https://docs.openshift.com/container-platform/latest/monitoring/enabling-monitoring-for-user-defined-projects.html) + is enabled to monitor energy consumed in user projects. + 3. Creation of a SusQL Service Monitor: + `oc apply -n -f https://raw.githubusercontent.com/sustainable-computing-io/susql-operator/main/hack/susql-servicemonitor.yaml` + + ### API Backward Compatibility + + Until Operator supports **seamless upgrades**, a new version of the operator may + introduce a change that is **NOT** backwards compatible with the previous version. + Thus, to upgrade the operator, uninstall the already installed version completely + (including CRDs) and install the new version. For example to upgrade from 0.1.0 + to 0.2.0, you must first uninstall 0.1.0. + + ### LabelGroup spec Example + + ``` + apiVersion: susql.ibm.com/v1 + kind: LabelGroup + metadata: + name: labelgroup-name + namespace: susql-operator + spec: + labels: + - my-label-1 + - my-label-2 + ``` + + ### Documentation + + Documentation can be found at [SusQL Operator](https://github.com/sustainable-computing-io/susql-operator#readme). + + ### Getting help + + If you encounter any issues while using the SusQL Operator, you can create an + [issue](https://github.com/sustainable-computing-io/susql-operator/issues) + on our GitHub repo for bugs, enhancements, or other requests. + + ### Contributing + You can contribute by raising [issues](https://github.com/sustainable-computing-io/susql-operator/issues) + related to susql-operator. + + ### License + susql-operator is licensed under the Apache 2.0 license + displayName: SusQL + icon: + - base64data: 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 + mediatype: image/png + install: + spec: + clusterPermissions: + - rules: + - apiGroups: + - susql.ibm.com + resources: + - labelgroups + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - susql.ibm.com + resources: + - labelgroups/finalizers + verbs: + - update + - apiGroups: + - susql.ibm.com + resources: + - labelgroups/status + verbs: + - get + - patch + - update + - apiGroups: + - authentication.k8s.io + resources: + - tokenreviews + verbs: + - create + - apiGroups: + - authorization.k8s.io + resources: + - subjectaccessreviews + verbs: + - create + - apiGroups: + - "" + resources: + - pods + - pods/status + - namespaces + - namespaces/status + verbs: + - get + - list + - watch + serviceAccountName: susql-operator-susql-controller-manager + deployments: + - label: + app.kubernetes.io/component: manager + app.kubernetes.io/created-by: susql-operator + app.kubernetes.io/instance: susql-controller-manager + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: deployment + app.kubernetes.io/part-of: susql-operator + name: susql-operator-susql-controller-manager + spec: + replicas: 1 + selector: + matchLabels: + control-plane: susql-controller-manager + strategy: {} + template: + metadata: + annotations: + kubectl.kubernetes.io/default-container: manager + labels: + control-plane: susql-controller-manager + spec: + containers: + - args: + - --secure-listen-address=0.0.0.0:8443 + - --upstream=http://127.0.0.1:8082/ + - --logtostderr=true + - --v=0 + image: gcr.io/kubebuilder/kube-rbac-proxy:v0.16.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 + readOnlyRootFilesystem: true + runAsGroup: 14001 + runAsNonRoot: true + runAsUser: 14001 + - command: + - /manager + env: + - name: KEPLER-PROMETHEUS-URL + valueFrom: + configMapKeyRef: + key: KEPLER-PROMETHEUS-URL + name: susql-config + optional: true + - name: KEPLER-METRIC-NAME + valueFrom: + configMapKeyRef: + key: KEPLER-METRIC-NAME + name: susql-config + optional: true + - name: SUSQL-PROMETHEUS-DATABASE-URL + valueFrom: + configMapKeyRef: + key: SUSQL-PROMETHEUS-DATABASE-URL + name: susql-config + optional: true + - name: SUSQL-PROMETHEUS-METRICS-URL + valueFrom: + configMapKeyRef: + key: SUSQL-PROMETHEUS-METRICS-URL + name: susql-config + optional: true + - name: SAMPLING-RATE + valueFrom: + configMapKeyRef: + key: SAMPLING-RATE + name: susql-config + optional: true + - name: LEADER-ELECT + valueFrom: + configMapKeyRef: + key: LEADER-ELECT + name: susql-config + optional: true + - name: HEALTH-PROBE-BIND-ADDRESS + valueFrom: + configMapKeyRef: + key: HEALTH-PROBE-BIND-ADDRESS + name: susql-config + optional: true + - name: SUSQL-LOG-LEVEL + valueFrom: + configMapKeyRef: + key: SUSQL-LOG-LEVEL + name: susql-config + optional: true + - name: CARBON-METHOD + valueFrom: + configMapKeyRef: + key: CARBON-METHOD + name: susql-config + optional: true + - name: CARBON-INTENSITY + valueFrom: + configMapKeyRef: + key: CARBON-INTENSITY + name: susql-config + optional: true + - name: CARBON-INTENSITY-URL + valueFrom: + configMapKeyRef: + key: CARBON-INTENSITY-URL + name: susql-config + optional: true + - name: CARBON-LOCATION + valueFrom: + configMapKeyRef: + key: CARBON-LOCATION + name: susql-config + optional: true + - name: CARBON-QUERY-RATE + valueFrom: + configMapKeyRef: + key: CARBON-QUERY-RATE + name: susql-config + optional: true + - name: CARBON-QUERY-FILTER + valueFrom: + configMapKeyRef: + key: CARBON-QUERY-FILTER + name: susql-config + optional: true + - name: CARBON-QUERY-CONV-2J + valueFrom: + configMapKeyRef: + key: CARBON-QUERY-CONV-2J + name: susql-config + optional: true + image: quay.io/sustainable_computing_io/susql_operator:0.0.32 + imagePullPolicy: Always + livenessProbe: + httpGet: + path: /healthz + port: 8081 + initialDelaySeconds: 15 + periodSeconds: 20 + name: manager + ports: + - containerPort: 8082 + name: metric + protocol: TCP + readinessProbe: + httpGet: + path: /readyz + port: 8081 + initialDelaySeconds: 5 + periodSeconds: 10 + resources: + limits: + cpu: 500m + memory: 512Mi + requests: + cpu: 10m + memory: 128Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + runAsGroup: 12001 + runAsUser: 12001 + securityContext: + runAsGroup: 11001 + runAsNonRoot: true + runAsUser: 11001 + serviceAccountName: susql-operator-susql-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: susql-operator-susql-controller-manager + strategy: deployment + installModes: + - supported: true + type: OwnNamespace + - supported: true + type: SingleNamespace + - supported: true + type: MultiNamespace + - supported: true + type: AllNamespaces + keywords: + - monitoring + - aggregation + - sustainability + - energy + - kepler + - susql + - carbon dioxide (CO2) emissions + - green computing + links: + - name: SusQL Operator + url: https://github.com/sustainable-computing-io/susql-operator + - name: Sustainable Computing + url: https://github.com/sustainable-computing-io + maintainers: + - email: trent@jp.ibm.com + name: Scott Trent + - email: mohammed.munir.abdi@ibm.com + name: Mohammed Abdi + maturity: alpha + minKubeVersion: 1.20.0 + provider: + name: SusQL Operator Contributors + url: https://github.com/sustainable-computing-io/susql-operator + version: 0.0.32 diff --git a/operators/susql-operator/0.0.32/manifests/susql.ibm.com_labelgroups.yaml b/operators/susql-operator/0.0.32/manifests/susql.ibm.com_labelgroups.yaml new file mode 100644 index 00000000000..3ef68ce6cbb --- /dev/null +++ b/operators/susql-operator/0.0.32/manifests/susql.ibm.com_labelgroups.yaml @@ -0,0 +1,98 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.14.0 + creationTimestamp: null + name: labelgroups.susql.ibm.com +spec: + group: susql.ibm.com + names: + kind: LabelGroup + listKind: LabelGroupList + plural: labelgroups + singular: labelgroup + scope: Namespaced + versions: + - name: v1 + schema: + openAPIV3Schema: + description: LabelGroup is the Schema for the LabelGroups 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: LabelGroupSpec defines the desired state of LabelGroup + properties: + disableUsingMostRecentValue: + description: Do not use the most recent value stored in the database + type: boolean + labels: + description: List of labels to be tracked for energy measurments (up + to 5) + items: + type: string + type: array + type: object + status: + description: LabelGroupStatus defines the observed state of LabelGroup + properties: + activeContainerIds: + additionalProperties: + type: number + description: Active containers associated with these set of labels + type: object + kubernetesLabels: + additionalProperties: + type: string + description: SusQL Kubernetes labels constructed from the spec + type: object + phase: + description: Transition phase of the LabelGroup + type: string + prometheusLabels: + additionalProperties: + type: string + description: SusQL Prometheus labels constructed from the spec + type: object + susqlPrometheusCarbonQuery: + description: Prometheus query to get the total CO2 for this LabelGroup + type: string + susqlPrometheusEnergyQuery: + description: Prometheus query to get the total energy for this LabelGroup + type: string + totalCarbon: + description: TotalCarbon keeps track of the accumulated grams of carbon + dioxide emission over time + type: string + totalEnergy: + description: TotalEnergy keeps track of the accumulated energy over + time + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: null + storedVersions: null diff --git a/operators/susql-operator/0.0.32/metadata/annotations.yaml b/operators/susql-operator/0.0.32/metadata/annotations.yaml new file mode 100644 index 00000000000..5507616ee60 --- /dev/null +++ b/operators/susql-operator/0.0.32/metadata/annotations.yaml @@ -0,0 +1,17 @@ +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: susql-operator + operators.operatorframework.io.bundle.channels.v1: alpha + operators.operatorframework.io.metrics.builder: operator-sdk-v1.36.1 + operators.operatorframework.io.metrics.mediatype.v1: metrics+v1 + operators.operatorframework.io.metrics.project_layout: go.kubebuilder.io/v4 + + # Annotations for testing. + operators.operatorframework.io.test.mediatype.v1: scorecard+v1 + operators.operatorframework.io.test.config.v1: tests/scorecard/ + + # Annotations for OpenShift version + com.redhat.openshift.versions: "v4.13-v4.16" diff --git a/operators/susql-operator/0.0.32/tests/scorecard/config.yaml b/operators/susql-operator/0.0.32/tests/scorecard/config.yaml new file mode 100644 index 00000000000..d5b4b3e4b8f --- /dev/null +++ b/operators/susql-operator/0.0.32/tests/scorecard/config.yaml @@ -0,0 +1,70 @@ +apiVersion: scorecard.operatorframework.io/v1alpha3 +kind: Configuration +metadata: + name: config +stages: +- parallel: true + tests: + - entrypoint: + - scorecard-test + - basic-check-spec + image: quay.io/operator-framework/scorecard-test:v1.33.0 + labels: + suite: basic + test: basic-check-spec-test + storage: + spec: + mountPath: {} + - entrypoint: + - scorecard-test + - olm-bundle-validation + image: quay.io/operator-framework/scorecard-test:v1.33.0 + labels: + suite: olm + test: olm-bundle-validation-test + storage: + spec: + mountPath: {} + - entrypoint: + - scorecard-test + - olm-crds-have-validation + image: quay.io/operator-framework/scorecard-test:v1.33.0 + labels: + suite: olm + test: olm-crds-have-validation-test + storage: + spec: + mountPath: {} + - entrypoint: + - scorecard-test + - olm-crds-have-resources + image: quay.io/operator-framework/scorecard-test:v1.33.0 + labels: + suite: olm + test: olm-crds-have-resources-test + storage: + spec: + mountPath: {} + - entrypoint: + - scorecard-test + - olm-spec-descriptors + image: quay.io/operator-framework/scorecard-test:v1.33.0 + labels: + suite: olm + test: olm-spec-descriptors-test + storage: + spec: + mountPath: {} + - entrypoint: + - scorecard-test + - olm-status-descriptors + image: quay.io/operator-framework/scorecard-test:v1.33.0 + labels: + suite: olm + test: olm-status-descriptors-test + storage: + spec: + mountPath: {} +storage: + spec: + mountPath: {}