diff --git a/bindata/manifests/metrics-exporter/metrics-service.yaml b/bindata/manifests/metrics-exporter/metrics-service.yaml index 4ce79f011..76b3f7703 100644 --- a/bindata/manifests/metrics-exporter/metrics-service.yaml +++ b/bindata/manifests/metrics-exporter/metrics-service.yaml @@ -18,7 +18,7 @@ spec: name: sriov-network-metrics port: {{ .MetricsExporterPort }} targetPort: {{ .MetricsExporterPort }} -{{ if .IsOpenshift }} +{{ if .IsPrometheusOperatorInstalled }} --- apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor diff --git a/controllers/helper.go b/controllers/helper.go index 9ff735473..1dfcff822 100644 --- a/controllers/helper.go +++ b/controllers/helper.go @@ -32,6 +32,7 @@ import ( "k8s.io/apimachinery/pkg/api/errors" uns "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" kscheme "k8s.io/client-go/kubernetes/scheme" k8sclient "sigs.k8s.io/controller-runtime/pkg/client" @@ -397,3 +398,21 @@ func updateDaemonsetNodeSelector(obj *uns.Unstructured, nodeSelector map[string] } return nil } + +func isPrometheusOperatorInstalled(ctx context.Context, client k8sclient.Reader) bool { + u := &uns.UnstructuredList{} + u.SetGroupVersionKind(schema.GroupVersionKind{ + Group: "monitoring.coreos.com", + Kind: "ServiceMonitorList", + Version: "v1", + }) + err := client.List(ctx, u) + if err != nil { + if errors.IsNotFound(err) { + return false + } + log.Log.WithName("isPrometheusOperatorInstalled").Error(err, "Error while looking for prometheus operator") + return false + } + return true +} diff --git a/controllers/helper_test.go b/controllers/helper_test.go index d998cf0da..716fa9189 100644 --- a/controllers/helper_test.go +++ b/controllers/helper_test.go @@ -18,6 +18,7 @@ package controllers import ( "context" + "fmt" "sync" "testing" @@ -25,11 +26,16 @@ import ( . "github.com/onsi/gomega" "github.com/google/go-cmp/cmp" + monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" controllerruntime "sigs.k8s.io/controller-runtime" + k8sclient "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/client/fake" sriovnetworkv1 "github.com/k8snetworkplumbingwg/sriov-network-operator/api/v1" "github.com/k8snetworkplumbingwg/sriov-network-operator/pkg/vars" @@ -327,4 +333,36 @@ var _ = Describe("Helper Validation", Ordered, func() { Expect(in.Spec.Template.Spec.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms[0].MatchExpressions[0].Key).To(Equal("test1")) }) }) + + Context("isPrometheusOperatorInstalled", func() { + It("should return true if ServiceMonitor resource is available in the cluster", func() { + scheme := runtime.NewScheme() + utilruntime.Must(monitoringv1.AddToScheme(scheme)) + client := fake.NewClientBuilder(). + WithScheme(scheme). + Build() + Expect(isPrometheusOperatorInstalled(context.Background(), client)).To(BeTrue()) + }) + + It("should return false if no monitoring.coreos.com resource is not available in the cluster", func() { + // There is no way to instruct a fake client to return an error while listing unknown resources + // so we use a client that returns an error on get and list + // https://github.com/k8snetworkplumbingwg/sriov-network-operator/blob/8d32f42b42b59a27864043ad22afa3741f197d9a/vendor/sigs.k8s.io/controller-runtime/pkg/client/fake/client.go#L513 + client := &errorReturningClient{} + Expect(isPrometheusOperatorInstalled(context.Background(), client)).To(BeFalse()) + }) + + }) + }) + +type errorReturningClient struct { +} + +func (e *errorReturningClient) Get(ctx context.Context, key k8sclient.ObjectKey, obj k8sclient.Object, opts ...k8sclient.GetOption) error { + return fmt.Errorf("resource get error") +} + +func (e *errorReturningClient) List(ctx context.Context, list k8sclient.ObjectList, opts ...k8sclient.ListOption) error { + return fmt.Errorf("resource list error") +} diff --git a/controllers/sriovoperatorconfig_controller.go b/controllers/sriovoperatorconfig_controller.go index f30a72a63..ed33f9e99 100644 --- a/controllers/sriovoperatorconfig_controller.go +++ b/controllers/sriovoperatorconfig_controller.go @@ -232,6 +232,7 @@ func (r *SriovOperatorConfigReconciler) syncMetricsExporter(ctx context.Context, data.Data["MetricsExporterPort"] = os.Getenv("METRICS_EXPORTER_PORT") data.Data["MetricsExporterKubeRbacProxyImage"] = os.Getenv("METRICS_EXPORTER_KUBE_RBAC_PROXY_IMAGE") data.Data["IsOpenshift"] = r.PlatformHelper.IsOpenshiftCluster() + data.Data["IsPrometheusOperatorInstalled"] = isPrometheusOperatorInstalled(ctx, r.Client) data.Data["NodeSelectorField"] = GetDefaultNodeSelector() if dc.Spec.ConfigDaemonNodeSelector != nil { data.Data["NodeSelectorField"] = dc.Spec.ConfigDaemonNodeSelector diff --git a/controllers/suite_test.go b/controllers/suite_test.go index 2708023cc..2a37a0ccc 100644 --- a/controllers/suite_test.go +++ b/controllers/suite_test.go @@ -41,6 +41,7 @@ import ( netattdefv1 "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/apis/k8s.cni.cncf.io/v1" openshiftconfigv1 "github.com/openshift/api/config/v1" mcfgv1 "github.com/openshift/machine-config-operator/pkg/apis/machineconfiguration.openshift.io/v1" + monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" //+kubebuilder:scaffold:imports sriovnetworkv1 "github.com/k8snetworkplumbingwg/sriov-network-operator/api/v1" @@ -153,6 +154,8 @@ var _ = BeforeSuite(func() { Expect(err).NotTo(HaveOccurred()) err = openshiftconfigv1.AddToScheme(scheme.Scheme) Expect(err).NotTo(HaveOccurred()) + err = monitoringv1.AddToScheme(scheme.Scheme) + Expect(err).NotTo(HaveOccurred()) vars.Config = cfg vars.Scheme = scheme.Scheme diff --git a/deploy/role.yaml b/deploy/role.yaml index a24f13729..bd5cc2774 100644 --- a/deploy/role.yaml +++ b/deploy/role.yaml @@ -32,6 +32,7 @@ rules: verbs: - get - create + - list - apiGroups: - apps resourceNames: diff --git a/deployment/sriov-network-operator/templates/role.yaml b/deployment/sriov-network-operator/templates/role.yaml index 29cf80cce..1f55d6b65 100644 --- a/deployment/sriov-network-operator/templates/role.yaml +++ b/deployment/sriov-network-operator/templates/role.yaml @@ -35,6 +35,7 @@ rules: verbs: - get - create + - list - apiGroups: - apps resourceNames: