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 6bda06912..785296221 100644 --- a/controllers/helper.go +++ b/controllers/helper.go @@ -400,7 +400,7 @@ func updateDaemonsetNodeSelector(obj *uns.Unstructured, nodeSelector map[string] return nil } -func isPrometheusOperatorInstalled(ctx context.Context, client k8sclient.Client) (bool, error) { +func isPrometheusOperatorInstalled(ctx context.Context, client k8sclient.Reader) bool { u := &unstructured.UnstructuredList{} u.SetGroupVersionKind(schema.GroupVersionKind{ Group: "monitoring.coreos.com", @@ -409,7 +409,11 @@ func isPrometheusOperatorInstalled(ctx context.Context, client k8sclient.Client) }) err := client.List(ctx, u) if err != nil { - return false, err + if errors.IsNotFound(err) { + return false + } + log.Log.WithName("isPrometheusOperatorInstalled").Error(err, "Error while looking for prometheus operator") + return false } - return false, nil + return true } diff --git a/controllers/helper_test.go b/controllers/helper_test.go index 1323d891c..716fa9189 100644 --- a/controllers/helper_test.go +++ b/controllers/helper_test.go @@ -18,6 +18,7 @@ package controllers import ( "context" + "fmt" "sync" "testing" @@ -25,6 +26,7 @@ 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" @@ -32,11 +34,11 @@ import ( "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" - monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/client/versioned/typed/monitoring/v1" ) func TestNodeSelectorMerge(t *testing.T) { @@ -342,11 +344,11 @@ var _ = Describe("Helper Validation", Ordered, func() { Expect(isPrometheusOperatorInstalled(context.Background(), client)).To(BeTrue()) }) - It("should return false if no monitoring.coreos.com resource is available in the cluster", func() { - scheme := runtime.NewScheme() - client := fake.NewClientBuilder(). - WithScheme(scheme). - Build() + 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()) }) @@ -354,14 +356,13 @@ var _ = Describe("Helper Validation", Ordered, func() { }) -func TestIsPrometheusOperatorSupported(t *testing.T) { - scheme := runtime.NewScheme() - fake.NewClientBuilder(). - WithScheme(scheme).WithObjects(&nodeState). - Build() - - assert +type errorReturningClient struct { +} - utilruntime.Must(sriovnetworkv1.AddToScheme(scheme)) +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