From 5c559b2d8a02da15f491f47acc59374858fad602 Mon Sep 17 00:00:00 2001 From: Carl Kyrillos Date: Wed, 18 Aug 2021 14:11:44 -0400 Subject: [PATCH 1/3] Initial implementation to create a ServiceAccount for Blackbox Exporter and add a bearer token to the Blackbox Exporter ConfigMap. --- .../blackbox-exporter-clusterrole.yaml | 11 +++++++ ...blackbox-exporter-clusterrole_binding.yaml | 14 +++++++++ .../applicationmonitoring_controller.go | 31 +++++++++++++++++++ .../blackboxtarget_controller.go | 17 ++++++++++ .../blackbox/blackbox-exporter-config.yaml | 1 + 5 files changed, 74 insertions(+) create mode 100644 deploy/cluster-roles/blackbox-exporter-clusterrole.yaml create mode 100644 deploy/cluster-roles/blackbox-exporter-clusterrole_binding.yaml diff --git a/deploy/cluster-roles/blackbox-exporter-clusterrole.yaml b/deploy/cluster-roles/blackbox-exporter-clusterrole.yaml new file mode 100644 index 00000000..c88a4477 --- /dev/null +++ b/deploy/cluster-roles/blackbox-exporter-clusterrole.yaml @@ -0,0 +1,11 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: blackbox-exporter +rules: +- apiGroups: + - "" + resources: + - namespaces + verbs: + - get diff --git a/deploy/cluster-roles/blackbox-exporter-clusterrole_binding.yaml b/deploy/cluster-roles/blackbox-exporter-clusterrole_binding.yaml new file mode 100644 index 00000000..96a4710d --- /dev/null +++ b/deploy/cluster-roles/blackbox-exporter-clusterrole_binding.yaml @@ -0,0 +1,14 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: blackbox-exporter +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: blackbox-exporter +subjects: + - kind: ServiceAccount + name: blackbox-exporter-service-account + namespace: redhat-rhoam-middleware-monitoring-operator +userNames: + - system:serviceaccount:application-monitoring:blackbox-exporter-service-account diff --git a/pkg/controller/applicationmonitoring/applicationmonitoring_controller.go b/pkg/controller/applicationmonitoring/applicationmonitoring_controller.go index 2388c86b..7595241a 100644 --- a/pkg/controller/applicationmonitoring/applicationmonitoring_controller.go +++ b/pkg/controller/applicationmonitoring/applicationmonitoring_controller.go @@ -4,6 +4,7 @@ import ( "context" "crypto/md5" "fmt" + "regexp" "strconv" "strings" "time" @@ -362,6 +363,36 @@ func (r *ReconcileApplicationMonitoring) reconcileBlackboxExporterConfig(cr *app if r.extraParams == nil { r.extraParams = map[string]string{} } + + // Add bearer_token to ConfigMap to allow Blackbox exporter requests to get through proxy in front of Grafana service + blackboxServiceAccount := &corev1.ServiceAccount{ + ObjectMeta: metav1.ObjectMeta{ + Name: "blackbox-exporter-service-account", + Namespace: "redhat-rhoam-middleware-monitoring-operator", + }, + } + if err := r.client.Get(ctx, client.ObjectKey{Name: blackboxServiceAccount.Name, Namespace: blackboxServiceAccount.Namespace}, blackboxServiceAccount); err != nil { + log.Error(err, "client.Get") + return fmt.Errorf("error getting blackbox exporter service account: %s", err.Error()) + } + var secretName string + for _, secret := range blackboxServiceAccount.Secrets { + if res, _ := regexp.MatchString("blackbox-exporter-service-account-token", secret.Name); res { + secretName = secret.Name + } + } + blackboxServiceAccountSecret := &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: secretName, + Namespace: "redhat-rhoam-middleware-monitoring-operator", + }, + } + if err := r.client.Get(ctx, client.ObjectKey{Name: blackboxServiceAccountSecret.Name, Namespace: blackboxServiceAccountSecret.Namespace}, blackboxServiceAccountSecret); err != nil { + log.Error(err, "client.Get") + return fmt.Errorf("error getting blackbox exporter secret: %s", err.Error()) + } + blackboxServiceAccountToken := blackboxServiceAccountSecret.Data["token"] + r.extraParams["bearerToken"] = string(blackboxServiceAccountToken) r.extraParams["selfSignedCerts"] = strconv.FormatBool(cr.Spec.SelfSignedCerts) templateHelper := newTemplateHelper(cr, r.extraParams) blackboxExporterConfig, err := templateHelper.loadTemplate("blackbox/blackbox-exporter-config") diff --git a/pkg/controller/blackboxtarget/blackboxtarget_controller.go b/pkg/controller/blackboxtarget/blackboxtarget_controller.go index 722e8655..16a609a6 100644 --- a/pkg/controller/blackboxtarget/blackboxtarget_controller.go +++ b/pkg/controller/blackboxtarget/blackboxtarget_controller.go @@ -3,6 +3,8 @@ package blackboxtarget import ( "context" "fmt" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" applicationmonitoringv1alpha1 "github.com/integr8ly/application-monitoring-operator/pkg/apis/applicationmonitoring/v1alpha1" "github.com/integr8ly/application-monitoring-operator/pkg/controller/common" @@ -10,6 +12,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "sigs.k8s.io/controller-runtime/pkg/handler" logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/manager" @@ -116,6 +119,20 @@ func (r *ReconcileBlackboxTarget) Reconcile(request reconcile.Request) (reconcil func (r *ReconcileBlackboxTarget) reconcileConfig(cr *applicationmonitoringv1alpha1.BlackboxTarget) (reconcile.Result, error) { log.Info(fmt.Sprintf("BlackboxTarget reconcileConfig CR:%s Phase: %v", cr.ObjectMeta.Name, cr.Status.Phase)) + // Create blackbox-exporter-service-account + blackBoxExporterServiceAccount := &v1.ServiceAccount{ + ObjectMeta: metav1.ObjectMeta{ + Name: "blackbox-exporter-service-account", + Namespace: cr.GetNamespace(), + }, + } + _, err := controllerutil.CreateOrUpdate(context.TODO(), r.client, blackBoxExporterServiceAccount, func() error { + return nil + }) + if err != nil { + log.Error(err, "Unable to create: blackbox-exporter-service-account") + } + bbtList := common.GetBTConfig() crName := cr.ObjectMeta.Name // Remove the finalizer so the CR can be deleted diff --git a/templates/blackbox/blackbox-exporter-config.yaml b/templates/blackbox/blackbox-exporter-config.yaml index e11ae984..97c9bd32 100644 --- a/templates/blackbox/blackbox-exporter-config.yaml +++ b/templates/blackbox/blackbox-exporter-config.yaml @@ -11,6 +11,7 @@ modules: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt cert_file: /etc/tls/private/tls.crt key_file: /etc/tls/private/tls.key{{end}} + bearer_token: {{ index .ExtraParams "bearerToken" }} http_post_2xx: prober: http http: From f19bf9c83862b476d49d468cfe7bac49a32e71e2 Mon Sep 17 00:00:00 2001 From: Carl Kyrillos Date: Thu, 19 Aug 2021 15:47:52 -0400 Subject: [PATCH 2/3] Removed hardcoded namespaces, fixed namespace for blackbox exporter CRB, and prepared 1.7.0 release." --- Makefile | 4 +- ...blackbox-exporter-clusterrole_binding.yaml | 2 +- ...operator.v1.7.0.clusterserviceversion.yaml | 344 ++++++++++ ...reatly.org_applicationmonitorings_crd.yaml | 645 ++++++++++++++++++ ...g.integreatly.org_blackboxtargets_crd.yaml | 71 ++ .../1.7.0/grafana_crd.yaml | 152 +++++ .../1.7.0/grafana_dashboard_crd.yaml | 43 ++ .../1.7.0/grafana_datasource_crd.yaml | 35 + ...plication-monitoring-operator.package.yaml | 2 +- deploy/operator.yaml | 2 +- .../applicationmonitoring_controller.go | 4 +- version/version.go | 2 +- 12 files changed, 1298 insertions(+), 8 deletions(-) create mode 100644 deploy/olm-catalog/application-monitoring-operator/1.7.0/application-monitoring-operator.v1.7.0.clusterserviceversion.yaml create mode 100644 deploy/olm-catalog/application-monitoring-operator/1.7.0/applicationmonitoring.integreatly.org_applicationmonitorings_crd.yaml create mode 100644 deploy/olm-catalog/application-monitoring-operator/1.7.0/applicationmonitoring.integreatly.org_blackboxtargets_crd.yaml create mode 100644 deploy/olm-catalog/application-monitoring-operator/1.7.0/grafana_crd.yaml create mode 100644 deploy/olm-catalog/application-monitoring-operator/1.7.0/grafana_dashboard_crd.yaml create mode 100644 deploy/olm-catalog/application-monitoring-operator/1.7.0/grafana_datasource_crd.yaml diff --git a/Makefile b/Makefile index 72ab4af1..4e9eb1ab 100644 --- a/Makefile +++ b/Makefile @@ -14,8 +14,8 @@ COMPILE_TARGET=./tmp/_output/bin/$(PROJECT) PROMETHEUS_OPERATOR_VERSION=v0.40.0 LOCAL=local GRAFANA_OPERATOR_VERSION=v3.10.2 -AMO_VERSION=1.6.3 -PREV_AMO_VERSION=1.6.2 +AMO_VERSION=1.7.0 +PREV_AMO_VERSION=1.6.3 AUTH_TOKEN=$(shell curl -sH "Content-Type: application/json" -XPOST https://quay.io/cnr/api/v1/users/login -d '{"user": {"username": "$(QUAY_USERNAME)", "password": "${QUAY_PASSWORD}"}}' | jq -r '.token') diff --git a/deploy/cluster-roles/blackbox-exporter-clusterrole_binding.yaml b/deploy/cluster-roles/blackbox-exporter-clusterrole_binding.yaml index 96a4710d..4adb3bcd 100644 --- a/deploy/cluster-roles/blackbox-exporter-clusterrole_binding.yaml +++ b/deploy/cluster-roles/blackbox-exporter-clusterrole_binding.yaml @@ -9,6 +9,6 @@ roleRef: subjects: - kind: ServiceAccount name: blackbox-exporter-service-account - namespace: redhat-rhoam-middleware-monitoring-operator + namespace: application-monitoring userNames: - system:serviceaccount:application-monitoring:blackbox-exporter-service-account diff --git a/deploy/olm-catalog/application-monitoring-operator/1.7.0/application-monitoring-operator.v1.7.0.clusterserviceversion.yaml b/deploy/olm-catalog/application-monitoring-operator/1.7.0/application-monitoring-operator.v1.7.0.clusterserviceversion.yaml new file mode 100644 index 00000000..97bd48b5 --- /dev/null +++ b/deploy/olm-catalog/application-monitoring-operator/1.7.0/application-monitoring-operator.v1.7.0.clusterserviceversion.yaml @@ -0,0 +1,344 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + annotations: + alm-examples: '[]' + capabilities: Basic Install + categories: Monitoring stack + certified: "false" + containerImage: quay.io/integreatly/application-monitoring-operator:v1.7.0 + createdAt: "2019-09-26 10:51:00" + description: Operator managed and installs Prometheus, Alertmanager, Grafana + support: Red Hat, Inc. + name: application-monitoring-operator.v1.7.0 + namespace: placeholder +spec: + apiservicedefinitions: {} + customresourcedefinitions: + owned: + - description: ApplicationMonitoring is the Schema for the applicationmonitorings + API + kind: ApplicationMonitoring + name: applicationmonitorings.applicationmonitoring.integreatly.org + version: v1alpha1 + - description: BlackboxTarget is the Schema for the blackboxtargets API + kind: BlackboxTarget + name: blackboxtargets.applicationmonitoring.integreatly.org + version: v1alpha1 + description: Placeholder description + displayName: Application Monitoring Operator + icon: + - base64data: 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 + mediatype: image/png + install: + spec: + clusterPermissions: + - rules: + - apiGroups: + - authentication.k8s.io + resources: + - tokenreviews + verbs: + - create + - apiGroups: + - authorization.k8s.io + resources: + - subjectaccessreviews + verbs: + - create + serviceAccountName: alertmanager-service-account + - rules: + - apiGroups: + - "" + resources: + - namespaces + verbs: + - get + serviceAccountName: blackbox-exporter-service-account + - rules: + - apiGroups: + - integreatly.org + resources: + - grafanadashboards + verbs: + - get + - list + - update + - watch + - apiGroups: + - authentication.k8s.io + resources: + - tokenreviews + verbs: + - create + - apiGroups: + - authorization.k8s.io + resources: + - subjectaccessreviews + verbs: + - create + serviceAccountName: grafana-operator + - rules: + - apiGroups: + - authentication.k8s.io + resources: + - tokenreviews + verbs: + - create + - apiGroups: + - authorization.k8s.io + resources: + - subjectaccessreviews + verbs: + - create + serviceAccountName: grafana-serviceaccount + - rules: + - apiGroups: + - authentication.k8s.io + resources: + - tokenreviews + verbs: + - create + - apiGroups: + - authorization.k8s.io + resources: + - subjectaccessreviews + verbs: + - create + - apiGroups: + - "" + resources: + - nodes + - services + - endpoints + - pods + verbs: + - get + - list + - watch + - apiGroups: + - "" + resources: + - configmaps + - namespaces + verbs: + - get + - nonResourceURLs: + - /metrics + verbs: + - get + serviceAccountName: prometheus-service-account + - rules: + - apiGroups: + - apiextensions.k8s.io + resources: + - customresourcedefinitions + verbs: + - '*' + - apiGroups: + - monitoring.coreos.com + resources: + - alertmanagers + - prometheuses + - prometheuses/finalizers + - alertmanagers/finalizers + - servicemonitors + - prometheusrules + - podmonitors + verbs: + - '*' + - apiGroups: + - apps + resources: + - statefulsets + verbs: + - '*' + - apiGroups: + - "" + resources: + - configmaps + - secrets + verbs: + - '*' + - apiGroups: + - "" + resources: + - pods + verbs: + - list + - delete + - apiGroups: + - "" + resources: + - services + - endpoints + - services/finalizers + verbs: + - '*' + - apiGroups: + - "" + resources: + - nodes + verbs: + - list + - watch + - apiGroups: + - "" + resources: + - namespaces + verbs: + - get + - list + - watch + serviceAccountName: prometheus-operator + deployments: + - name: application-monitoring-operator + spec: + replicas: 1 + selector: + matchLabels: + name: application-monitoring-operator + strategy: {} + template: + metadata: + labels: + name: application-monitoring-operator + spec: + containers: + - command: + - application-monitoring-operator + env: + - name: TEMPLATE_PATH + value: /usr/local/bin/templates + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.annotations['olm.targetNamespaces'] + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: OPERATOR_NAME + value: application-monitoring-operator + image: quay.io/integreatly/application-monitoring-operator:v1.7.0 + imagePullPolicy: Always + name: application-monitoring-operator + ports: + - containerPort: 8383 + name: metrics + resources: {} + serviceAccountName: application-monitoring-operator + permissions: + - rules: + - apiGroups: + - "" + resources: + - pods + - services + - services/finalizers + - endpoints + - persistentvolumeclaims + - events + - configmaps + - secrets + - serviceaccounts + verbs: + - '*' + - apiGroups: + - apps + resources: + - deployments + - deployments/finalizers + - daemonsets + - replicasets + - statefulsets + verbs: + - '*' + - apiGroups: + - monitoring.coreos.com + resources: + - alertmanagers + - prometheuses + - prometheusrules + - servicemonitors + verbs: + - '*' + - apiGroups: + - applicationmonitoring.integreatly.org + resources: + - applicationmonitorings + - applicationmonitorings/finalizers + - blackboxtargets + - blackboxtargets/finalizers + verbs: + - '*' + - apiGroups: + - integreatly.org + resources: + - grafanadatasources + - grafanadatasources/status + - grafanadashboards + - grafanadashboards/status + - grafanas + - grafanas/status + - grafanas/finalizers + - grafanadatasources/finalizers + - grafanadashboards/finalizers + verbs: + - '*' + - apiGroups: + - route.openshift.io + resources: + - routes + - routes/custom-host + verbs: + - '*' + - apiGroups: + - rbac.authorization.k8s.io + resources: + - rolebindings + - roles + verbs: + - '*' + - apiGroups: + - extensions + resources: + - ingresses + verbs: + - '*' + - apiGroups: + - authentication.k8s.io + resources: + - tokenreviews + verbs: + - create + - apiGroups: + - authorization.k8s.io + resources: + - subjectaccessreviews + verbs: + - create + serviceAccountName: application-monitoring-operator + strategy: deployment + installModes: + - supported: true + type: OwnNamespace + - supported: true + type: SingleNamespace + - supported: false + type: MultiNamespace + - supported: true + type: AllNamespaces + keywords: + - Prometheus + - Grafana + - Monitoring + - AlertManager + maintainers: + - email: placeholder@email.com + name: Integreatly + maturity: alpha + provider: + name: Red Hat + replaces: application-monitoring-operator.v1.6.3 + version: 1.7.0 diff --git a/deploy/olm-catalog/application-monitoring-operator/1.7.0/applicationmonitoring.integreatly.org_applicationmonitorings_crd.yaml b/deploy/olm-catalog/application-monitoring-operator/1.7.0/applicationmonitoring.integreatly.org_applicationmonitorings_crd.yaml new file mode 100644 index 00000000..d8b9f568 --- /dev/null +++ b/deploy/olm-catalog/application-monitoring-operator/1.7.0/applicationmonitoring.integreatly.org_applicationmonitorings_crd.yaml @@ -0,0 +1,645 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: applicationmonitorings.applicationmonitoring.integreatly.org +spec: + group: applicationmonitoring.integreatly.org + names: + kind: ApplicationMonitoring + listKind: ApplicationMonitoringList + plural: applicationmonitorings + singular: applicationmonitoring + scope: Namespaced + validation: + openAPIV3Schema: + description: ApplicationMonitoring is the Schema for the applicationmonitorings + 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: ApplicationMonitoringSpec defines the desired state of ApplicationMonitoring + properties: + additionalScrapeConfigSecretKey: + type: string + additionalScrapeConfigSecretName: + type: string + affinity: + description: Affinity is a group of affinity scheduling rules. + properties: + nodeAffinity: + description: Describes node affinity scheduling rules for the pod. + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods to nodes + that satisfy the affinity expressions specified by this field, + but it may choose a node that violates one or more of the + expressions. The node that is most preferred is the one with + the greatest sum of weights, i.e. for each node that meets + all of the scheduling requirements (resource request, requiredDuringScheduling + affinity expressions, etc.), compute a sum by iterating through + the elements of this field and adding "weight" to the sum + if the node matches the corresponding matchExpressions; the + node(s) with the highest sum are the most preferred. + items: + description: An empty preferred scheduling term matches all + objects with implicit weight 0 (i.e. it's a no-op). A null + preferred scheduling term matches no objects (i.e. is also + a no-op). + properties: + preference: + description: A node selector term, associated with the + corresponding weight. + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + items: + description: A node selector requirement is a selector + that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators are In, + NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: An array of string values. If the + operator is In or NotIn, the values array + must be non-empty. If the operator is Exists + or DoesNotExist, the values array must be + empty. If the operator is Gt or Lt, the values + array must have a single element, which will + be interpreted as an integer. This array is + replaced during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + description: A list of node selector requirements + by node's fields. + items: + description: A node selector requirement is a selector + that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators are In, + NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: An array of string values. If the + operator is In or NotIn, the values array + must be non-empty. If the operator is Exists + or DoesNotExist, the values array must be + empty. If the operator is Gt or Lt, the values + array must have a single element, which will + be interpreted as an integer. This array is + replaced during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + weight: + description: Weight associated with matching the corresponding + nodeSelectorTerm, in the range 1-100. + format: int32 + type: integer + required: + - preference + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified by this + field are not met at scheduling time, the pod will not be + scheduled onto the node. If the affinity requirements specified + by this field cease to be met at some point during pod execution + (e.g. due to an update), the system may or may not try to + eventually evict the pod from its node. + properties: + nodeSelectorTerms: + description: Required. A list of node selector terms. The + terms are ORed. + items: + description: A null or empty node selector term matches + no objects. The requirements of them are ANDed. The + TopologySelectorTerm type implements a subset of the + NodeSelectorTerm. + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + items: + description: A node selector requirement is a selector + that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators are In, + NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: An array of string values. If the + operator is In or NotIn, the values array + must be non-empty. If the operator is Exists + or DoesNotExist, the values array must be + empty. If the operator is Gt or Lt, the values + array must have a single element, which will + be interpreted as an integer. This array is + replaced during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + description: A list of node selector requirements + by node's fields. + items: + description: A node selector requirement is a selector + that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators are In, + NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: An array of string values. If the + operator is In or NotIn, the values array + must be non-empty. If the operator is Exists + or DoesNotExist, the values array must be + empty. If the operator is Gt or Lt, the values + array must have a single element, which will + be interpreted as an integer. This array is + replaced during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + type: array + required: + - nodeSelectorTerms + type: object + type: object + podAffinity: + description: Describes pod affinity scheduling rules (e.g. co-locate + this pod in the same node, zone, etc. as some other pod(s)). + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods to nodes + that satisfy the affinity expressions specified by this field, + but it may choose a node that violates one or more of the + expressions. The node that is most preferred is the one with + the greatest sum of weights, i.e. for each node that meets + all of the scheduling requirements (resource request, requiredDuringScheduling + affinity expressions, etc.), compute a sum by iterating through + the elements of this field and adding "weight" to the sum + if the node has pods which matches the corresponding podAffinityTerm; + the node(s) with the highest sum are the most preferred. + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred node(s) + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated + with the corresponding weight. + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: A label selector requirement is + a selector that contains values, a key, and + an operator that relates the key and values. + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. If + the operator is Exists or DoesNotExist, + the values array must be empty. This array + is replaced during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator is "In", + and the values array contains only "value". + The requirements are ANDed. + type: object + type: object + namespaces: + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" + items: + type: string + type: array + topologyKey: + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods + matching the labelSelector in the specified namespaces, + where co-located is defined as running on a node + whose value of the label with key topologyKey matches + that of any node on which any of the selected pods + is running. Empty topologyKey is not allowed. + type: string + required: + - topologyKey + type: object + weight: + description: weight associated with matching the corresponding + podAffinityTerm, in the range 1-100. + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified by this + field are not met at scheduling time, the pod will not be + scheduled onto the node. If the affinity requirements specified + by this field cease to be met at some point during pod execution + (e.g. due to a pod label update), the system may or may not + try to eventually evict the pod from its node. When there + are multiple elements, the lists of nodes corresponding to + each podAffinityTerm are intersected, i.e. all terms must + be satisfied. + items: + description: Defines a set of pods (namely those matching + the labelSelector relative to the given namespace(s)) that + this pod should be co-located (affinity) or not co-located + (anti-affinity) with, where co-located is defined as running + on a node whose value of the label with key + matches that of any node on which a pod of the set of pods + is running + properties: + labelSelector: + description: A label query over a set of resources, in + this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: A label selector requirement is a selector + that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: operator represents a key's relationship + to a set of values. Valid operators are In, + NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. + If the operator is In or NotIn, the values + array must be non-empty. If the operator is + Exists or DoesNotExist, the values array must + be empty. This array is replaced during a + strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} pairs. + A single {key,value} in the matchLabels map is equivalent + to an element of matchExpressions, whose key field + is "key", the operator is "In", and the values array + contains only "value". The requirements are ANDed. + type: object + type: object + namespaces: + description: namespaces specifies which namespaces the + labelSelector applies to (matches against); null or + empty list means "this pod's namespace" + items: + type: string + type: array + topologyKey: + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods matching + the labelSelector in the specified namespaces, where + co-located is defined as running on a node whose value + of the label with key topologyKey matches that of any + node on which any of the selected pods is running. Empty + topologyKey is not allowed. + type: string + required: + - topologyKey + type: object + type: array + type: object + podAntiAffinity: + description: Describes pod anti-affinity scheduling rules (e.g. + avoid putting this pod in the same node, zone, etc. as some other + pod(s)). + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods to nodes + that satisfy the anti-affinity expressions specified by this + field, but it may choose a node that violates one or more + of the expressions. The node that is most preferred is the + one with the greatest sum of weights, i.e. for each node that + meets all of the scheduling requirements (resource request, + requiredDuringScheduling anti-affinity expressions, etc.), + compute a sum by iterating through the elements of this field + and adding "weight" to the sum if the node has pods which + matches the corresponding podAffinityTerm; the node(s) with + the highest sum are the most preferred. + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred node(s) + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated + with the corresponding weight. + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: A label selector requirement is + a selector that contains values, a key, and + an operator that relates the key and values. + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. If + the operator is Exists or DoesNotExist, + the values array must be empty. This array + is replaced during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator is "In", + and the values array contains only "value". + The requirements are ANDed. + type: object + type: object + namespaces: + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" + items: + type: string + type: array + topologyKey: + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods + matching the labelSelector in the specified namespaces, + where co-located is defined as running on a node + whose value of the label with key topologyKey matches + that of any node on which any of the selected pods + is running. Empty topologyKey is not allowed. + type: string + required: + - topologyKey + type: object + weight: + description: weight associated with matching the corresponding + podAffinityTerm, in the range 1-100. + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: If the anti-affinity requirements specified by + this field are not met at scheduling time, the pod will not + be scheduled onto the node. If the anti-affinity requirements + specified by this field cease to be met at some point during + pod execution (e.g. due to a pod label update), the system + may or may not try to eventually evict the pod from its node. + When there are multiple elements, the lists of nodes corresponding + to each podAffinityTerm are intersected, i.e. all terms must + be satisfied. + items: + description: Defines a set of pods (namely those matching + the labelSelector relative to the given namespace(s)) that + this pod should be co-located (affinity) or not co-located + (anti-affinity) with, where co-located is defined as running + on a node whose value of the label with key + matches that of any node on which a pod of the set of pods + is running + properties: + labelSelector: + description: A label query over a set of resources, in + this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: A label selector requirement is a selector + that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: operator represents a key's relationship + to a set of values. Valid operators are In, + NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. + If the operator is In or NotIn, the values + array must be non-empty. If the operator is + Exists or DoesNotExist, the values array must + be empty. This array is replaced during a + strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} pairs. + A single {key,value} in the matchLabels map is equivalent + to an element of matchExpressions, whose key field + is "key", the operator is "In", and the values array + contains only "value". The requirements are ANDed. + type: object + type: object + namespaces: + description: namespaces specifies which namespaces the + labelSelector applies to (matches against); null or + empty list means "this pod's namespace" + items: + type: string + type: array + topologyKey: + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods matching + the labelSelector in the specified namespaces, where + co-located is defined as running on a node whose value + of the label with key topologyKey matches that of any + node on which any of the selected pods is running. Empty + topologyKey is not allowed. + type: string + required: + - topologyKey + type: object + type: array + type: object + type: object + alertmanagerInstanceNamespaces: + type: string + description: The key under which additional scrape configs are stored within the secret + priorityClassName: + type: string + description: Priority Class Name + labelSelector: + minLength: 1 + type: string + prometheusInstanceNamespaces: + type: string + prometheusRetention: + type: string + prometheusStorageRequest: + type: string + selfSignedCerts: + type: boolean + required: + - labelSelector + type: object + status: + description: ApplicationMonitoringStatus defines the observed state of ApplicationMonitoring + properties: + lastblackboxconfig: + type: string + phase: + type: integer + required: + - lastblackboxconfig + - phase + type: object + type: object + version: v1alpha1 + versions: + - name: v1alpha1 + served: true + storage: true diff --git a/deploy/olm-catalog/application-monitoring-operator/1.7.0/applicationmonitoring.integreatly.org_blackboxtargets_crd.yaml b/deploy/olm-catalog/application-monitoring-operator/1.7.0/applicationmonitoring.integreatly.org_blackboxtargets_crd.yaml new file mode 100644 index 00000000..0ec9eed7 --- /dev/null +++ b/deploy/olm-catalog/application-monitoring-operator/1.7.0/applicationmonitoring.integreatly.org_blackboxtargets_crd.yaml @@ -0,0 +1,71 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: blackboxtargets.applicationmonitoring.integreatly.org +spec: + group: applicationmonitoring.integreatly.org + names: + kind: BlackboxTarget + listKind: BlackboxTargetList + plural: blackboxtargets + singular: blackboxtarget + scope: Namespaced + validation: + openAPIV3Schema: + description: BlackboxTarget is the Schema for the blackboxtargets 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: BlackboxTargetSpec defines the desired state of BlackboxTarget + properties: + blackboxTargets: + description: 'INSERT ADDITIONAL SPEC FIELDS - desired state of cluster + Important: Run "operator-sdk generate k8s" to regenerate code after + modifying this file Add custom validation using kubebuilder tags: + https://book.kubebuilder.io/beyond_basics/generating_crd.html' + items: + description: 'BlackboxtargetStructure contains: A target (url, module + and service name) to be probed by the' + properties: + module: + type: string + service: + type: string + url: + type: string + required: + - module + - service + - url + type: object + type: array + type: object + status: + description: BlackboxTargetStatus defines the observed state of BlackboxTarget + properties: + phase: + description: 'INSERT ADDITIONAL STATUS FIELD - define observed state + of cluster Important: Run "operator-sdk generate k8s" to regenerate + code after modifying this file Add custom validation using kubebuilder + tags: https://book.kubebuilder.io/beyond_basics/generating_crd.html' + type: integer + required: + - phase + type: object + type: object + version: v1alpha1 + versions: + - name: v1alpha1 + served: true + storage: true diff --git a/deploy/olm-catalog/application-monitoring-operator/1.7.0/grafana_crd.yaml b/deploy/olm-catalog/application-monitoring-operator/1.7.0/grafana_crd.yaml new file mode 100644 index 00000000..ad90644c --- /dev/null +++ b/deploy/olm-catalog/application-monitoring-operator/1.7.0/grafana_crd.yaml @@ -0,0 +1,152 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: grafanas.integreatly.org +spec: + group: integreatly.org + names: + kind: Grafana + listKind: GrafanaList + plural: grafanas + singular: grafana + scope: Namespaced + subresources: + status: {} + version: v1alpha1 + validation: + openAPIV3Schema: + required: ["spec"] + properties: + spec: + properties: + containers: + type: array + items: + type: object + description: Additional container to add to the grafana pod + secrets: + type: array + items: + type: string + description: Secret to be mounted as volume into the grafana deployment + configMaps: + type: array + items: + type: string + description: Config map to be mounted as volume into the grafana deployment + logLevel: + type: string + description: Log level of the grafana instance, defaults to info + adminUser: + type: string + description: Default admin user name + adminPassword: + type: string + description: Default admin password + basicAuth: + type: boolean + description: Basic auth enabled + disableLoginForm: + type: boolean + description: Disable login form + disableSignoutMenu: + type: boolean + description: Disable signout menu + anonymous: + type: boolean + description: Anonymous auth enabled + config: + type: object + description: Grafana config + ingress: + type: object + properties: + enabled: + type: boolean + description: Create an ingress / route + path: + type: string + description: Ingress path + hostname: + type: string + description: The hostname of the ingress / route + annotations: + type: object + description: Additional annotations for the ingress / route + labels: + type: object + description: Additional labels for the ingress / route + targetPort: + type: string + description: Override port to target in the grafana service + service: + type: object + properties: + ports: + type: array + description: Override default ports + items: + type: object + description: A port to add to the grafana service + annotations: + type: object + description: Additional annotations for the service + labels: + type: object + description: Additional labels for the service + type: + type: string + description: Service type (NodePort, ClusterIP or LoadBalancer) + deployment: + type: object + properties: + annotations: + type: object + description: Additional annotations for the service + labels: + type: object + description: Additional labels for the service + nodeSelector: + type: object + description: Additional labels for the running grafana pods in a labeled node. + tolerations: + type: array + description: Additonal labels for running grafana pods in tained nodes. + affinity: + type: object + description: Additonal labels for running grafana pods with affinity properties. + envFrom: + type: array + description: Environment variables from Secret or ConfigMap. + skipCreateAdminAccount: + type: boolean + description: Disable creating a random admin user + priorityClassName: + type: string + description: Pod priority class name + serviceAccount: + type: object + properties: + skip: + type: boolean + description: Disable ServiceAccount creation for grafana + annotations: + type: object + description: Additional annotations for the serviceaccount + labels: + type: object + description: Additional labels for the serviceaccount + client: + type: object + description: Grafana client settings + compat: + type: object + description: Backwards compatibility switches + dashboardLabelSelectors: + type: array + items: + type: object + description: Label selector or match expressions + jsonnet: + type: object + description: Jsonnet library configuration \ No newline at end of file diff --git a/deploy/olm-catalog/application-monitoring-operator/1.7.0/grafana_dashboard_crd.yaml b/deploy/olm-catalog/application-monitoring-operator/1.7.0/grafana_dashboard_crd.yaml new file mode 100644 index 00000000..b631e3c7 --- /dev/null +++ b/deploy/olm-catalog/application-monitoring-operator/1.7.0/grafana_dashboard_crd.yaml @@ -0,0 +1,43 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: grafanadashboards.integreatly.org +spec: + group: integreatly.org + names: + kind: GrafanaDashboard + listKind: GrafanaDashboardList + plural: grafanadashboards + singular: grafanadashboard + scope: Namespaced + subresources: + status: {} + version: v1alpha1 + validation: + openAPIV3Schema: + properties: + spec: + properties: + name: + type: string + json: + type: string + jsonnet: + description: Jsonnet source. Has access to grafonnet. + type: string + url: + type: string + description: URL to dashboard json + datasources: + type: array + items: + description: Input datasources to resolve before importing + type: object + plugins: + type: array + items: + description: Grafana Plugin Object + type: object + customFolderName: + description: Folder name that this dashboard will be assigned to. + type: string diff --git a/deploy/olm-catalog/application-monitoring-operator/1.7.0/grafana_datasource_crd.yaml b/deploy/olm-catalog/application-monitoring-operator/1.7.0/grafana_datasource_crd.yaml new file mode 100644 index 00000000..c9be40be --- /dev/null +++ b/deploy/olm-catalog/application-monitoring-operator/1.7.0/grafana_datasource_crd.yaml @@ -0,0 +1,35 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: grafanadatasources.integreatly.org +spec: + group: integreatly.org + names: + kind: GrafanaDataSource + listKind: GrafanaDataSourceList + plural: grafanadatasources + singular: grafanadatasource + scope: Namespaced + subresources: + status: {} + version: v1alpha1 + validation: + openAPIV3Schema: + properties: + apiVersion: + type: string + kind: + type: string + metadata: + type: object + spec: + required: ["datasources", "name"] + properties: + name: + type: string + minimum: 1 + datasources: + type: array + items: + description: Grafana Datasource Object + type: object diff --git a/deploy/olm-catalog/application-monitoring-operator/application-monitoring-operator.package.yaml b/deploy/olm-catalog/application-monitoring-operator/application-monitoring-operator.package.yaml index bd0172a2..3a4d4c6f 100644 --- a/deploy/olm-catalog/application-monitoring-operator/application-monitoring-operator.package.yaml +++ b/deploy/olm-catalog/application-monitoring-operator/application-monitoring-operator.package.yaml @@ -1,5 +1,5 @@ channels: -- currentCSV: application-monitoring-operator.v1.6.3 +- currentCSV: application-monitoring-operator.v1.7.0 name: integreatly defaultChannel: integreatly packageName: application-monitoring-operator diff --git a/deploy/operator.yaml b/deploy/operator.yaml index 31a65043..fd212161 100644 --- a/deploy/operator.yaml +++ b/deploy/operator.yaml @@ -15,7 +15,7 @@ spec: serviceAccountName: application-monitoring-operator containers: - name: application-monitoring-operator - image: quay.io/integreatly/application-monitoring-operator:v1.6.3 + image: quay.io/integreatly/application-monitoring-operator:v1.7.0 ports: - containerPort: 8383 name: metrics diff --git a/pkg/controller/applicationmonitoring/applicationmonitoring_controller.go b/pkg/controller/applicationmonitoring/applicationmonitoring_controller.go index 7595241a..8a46e64a 100644 --- a/pkg/controller/applicationmonitoring/applicationmonitoring_controller.go +++ b/pkg/controller/applicationmonitoring/applicationmonitoring_controller.go @@ -368,7 +368,7 @@ func (r *ReconcileApplicationMonitoring) reconcileBlackboxExporterConfig(cr *app blackboxServiceAccount := &corev1.ServiceAccount{ ObjectMeta: metav1.ObjectMeta{ Name: "blackbox-exporter-service-account", - Namespace: "redhat-rhoam-middleware-monitoring-operator", + Namespace: cr.GetNamespace(), }, } if err := r.client.Get(ctx, client.ObjectKey{Name: blackboxServiceAccount.Name, Namespace: blackboxServiceAccount.Namespace}, blackboxServiceAccount); err != nil { @@ -384,7 +384,7 @@ func (r *ReconcileApplicationMonitoring) reconcileBlackboxExporterConfig(cr *app blackboxServiceAccountSecret := &corev1.Secret{ ObjectMeta: metav1.ObjectMeta{ Name: secretName, - Namespace: "redhat-rhoam-middleware-monitoring-operator", + Namespace: blackboxServiceAccount.Namespace, }, } if err := r.client.Get(ctx, client.ObjectKey{Name: blackboxServiceAccountSecret.Name, Namespace: blackboxServiceAccountSecret.Namespace}, blackboxServiceAccountSecret); err != nil { diff --git a/version/version.go b/version/version.go index cb5fae32..ba52f852 100644 --- a/version/version.go +++ b/version/version.go @@ -1,5 +1,5 @@ package version var ( - Version = "1.6.3" + Version = "1.7.0" ) From 85aa02a9fe77a6fdc13b70c03e0307561597aadc Mon Sep 17 00:00:00 2001 From: Carl Kyrillos Date: Thu, 19 Aug 2021 16:30:39 -0400 Subject: [PATCH 3/3] Fixed indentation --- .../applicationmonitoring/applicationmonitoring_controller.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/controller/applicationmonitoring/applicationmonitoring_controller.go b/pkg/controller/applicationmonitoring/applicationmonitoring_controller.go index 8a46e64a..76b2d385 100644 --- a/pkg/controller/applicationmonitoring/applicationmonitoring_controller.go +++ b/pkg/controller/applicationmonitoring/applicationmonitoring_controller.go @@ -367,7 +367,7 @@ func (r *ReconcileApplicationMonitoring) reconcileBlackboxExporterConfig(cr *app // Add bearer_token to ConfigMap to allow Blackbox exporter requests to get through proxy in front of Grafana service blackboxServiceAccount := &corev1.ServiceAccount{ ObjectMeta: metav1.ObjectMeta{ - Name: "blackbox-exporter-service-account", + Name: "blackbox-exporter-service-account", Namespace: cr.GetNamespace(), }, } @@ -383,7 +383,7 @@ func (r *ReconcileApplicationMonitoring) reconcileBlackboxExporterConfig(cr *app } blackboxServiceAccountSecret := &corev1.Secret{ ObjectMeta: metav1.ObjectMeta{ - Name: secretName, + Name: secretName, Namespace: blackboxServiceAccount.Namespace, }, }