diff --git a/Documentation/api.md b/Documentation/api.md index 805d47b1ad..3462e73b1c 100644 --- a/Documentation/api.md +++ b/Documentation/api.md @@ -25,7 +25,7 @@ Configuring Cluster Monitoring is optional. If the config does not exist or is e * [DedicatedServiceMonitors](#dedicatedservicemonitors) * [K8sPrometheusAdapter](#k8sprometheusadapter) * [KubeStateMetricsConfig](#kubestatemetricsconfig) -* [MetricsServer](#metricsserver) +* [MetricsServerConfig](#metricsserverconfig) * [MonitoringPluginConfig](#monitoringpluginconfig) * [NodeExporterCollectorBuddyInfoConfig](#nodeexportercollectorbuddyinfoconfig) * [NodeExporterCollectorConfig](#nodeexportercollectorconfig) @@ -125,8 +125,7 @@ The `ClusterMonitoringConfiguration` resource defines settings that customize th | -------- | ---- | ----------- | | alertmanagerMain | *[AlertmanagerMainConfig](#alertmanagermainconfig) | `AlertmanagerMainConfig` defines settings for the Alertmanager component in the `openshift-monitoring` namespace. | | enableUserWorkload | *bool | `UserWorkloadEnabled` is a Boolean flag that enables monitoring for user-defined projects. | -| enableMetricsServer | *bool | `MetricsServerEnabled` is a Boolean flag that enables metrics-server. | -| metricsServer | *[MetricsServer](#metricsserver) | `MetricsServer` defines settings for the MetricsServer component. | +| metricsServer | *[MetricsServerConfig](#metricsserverconfig) | `MetricsServer` defines settings for the MetricsServer component. | | k8sPrometheusAdapter | *[K8sPrometheusAdapter](#k8sprometheusadapter) | `K8sPrometheusAdapter` defines settings for the Prometheus Adapter component. | | kubeStateMetrics | *[KubeStateMetricsConfig](#kubestatemetricsconfig) | `KubeStateMetricsConfig` defines settings for the `kube-state-metrics` agent. | | prometheusK8s | *[PrometheusK8sConfig](#prometheusk8sconfig) | `PrometheusK8sConfig` defines settings for the Prometheus component. | @@ -188,20 +187,21 @@ The `KubeStateMetricsConfig` resource defines settings for the `kube-state-metri [Back to TOC](#table-of-contents) -## MetricsServer +## MetricsServerConfig #### Description -The `MetricsServer` resource defines settings for the MetricsServer component. +The `MetricsServerConfig` resource defines settings for the MetricsServer component. appears in: [ClusterMonitoringConfiguration](#clustermonitoringconfiguration) | Property | Type | Description | | -------- | ---- | ----------- | +| enabled | *bool | `Enabled` is a Boolean flag that enables or disables metrics-server. | | nodeSelector | map[string]string | Defines the nodes on which the pods are scheduled. | | tolerations | [][v1.Toleration](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#toleration-v1-core) | Defines tolerations for the pods. | -| resources | *[v1.ResourceRequirements](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#resourcerequirements-v1-core) | Defines resource requests and limits for the Prometheus container. | +| resources | *[v1.ResourceRequirements](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#resourcerequirements-v1-core) | Defines resource requests and limits for the Metrics Server container. | [Back to TOC](#table-of-contents) diff --git a/Documentation/openshiftdocs/index.adoc b/Documentation/openshiftdocs/index.adoc index 559f04996f..c65fda3df2 100644 --- a/Documentation/openshiftdocs/index.adoc +++ b/Documentation/openshiftdocs/index.adoc @@ -45,7 +45,7 @@ The configuration file itself is always defined under the `config.yaml` key in t * link:modules/dedicatedservicemonitors.adoc[DedicatedServiceMonitors] * link:modules/k8sprometheusadapter.adoc[K8sPrometheusAdapter] * link:modules/kubestatemetricsconfig.adoc[KubeStateMetricsConfig] -* link:modules/metricsserver.adoc[MetricsServer] +* link:modules/metricsserverconfig.adoc[MetricsServerConfig] * link:modules/monitoringpluginconfig.adoc[MonitoringPluginConfig] * link:modules/nodeexportercollectorbuddyinfoconfig.adoc[NodeExporterCollectorBuddyInfoConfig] * link:modules/nodeexportercollectorconfig.adoc[NodeExporterCollectorConfig] diff --git a/Documentation/openshiftdocs/modules/clustermonitoringconfiguration.adoc b/Documentation/openshiftdocs/modules/clustermonitoringconfiguration.adoc index f38c9fa763..d874124a1b 100644 --- a/Documentation/openshiftdocs/modules/clustermonitoringconfiguration.adoc +++ b/Documentation/openshiftdocs/modules/clustermonitoringconfiguration.adoc @@ -19,9 +19,7 @@ The `ClusterMonitoringConfiguration` resource defines settings that customize th |enableUserWorkload|*bool|`UserWorkloadEnabled` is a Boolean flag that enables monitoring for user-defined projects. -|enableMetricsServer|*bool|`MetricsServerEnabled` is a Boolean flag that enables metrics-server. - -|metricsServer|*link:metricsserver.adoc[MetricsServer]|`MetricsServer` defines settings for the MetricsServer component. +|metricsServer|*link:metricsserverconfig.adoc[MetricsServerConfig]|`MetricsServer` defines settings for the MetricsServer component. |k8sPrometheusAdapter|*link:k8sprometheusadapter.adoc[K8sPrometheusAdapter]|`K8sPrometheusAdapter` defines settings for the Prometheus Adapter component. diff --git a/Documentation/openshiftdocs/modules/metricsserver.adoc b/Documentation/openshiftdocs/modules/metricsserver.adoc index d3bac5a3f2..7175bf4815 100644 --- a/Documentation/openshiftdocs/modules/metricsserver.adoc +++ b/Documentation/openshiftdocs/modules/metricsserver.adoc @@ -18,11 +18,13 @@ Appears in: link:clustermonitoringconfiguration.adoc[ClusterMonitoringConfigurat [options="header"] |=== | Property | Type | Description +|enableMetricsServer|*bool|`EnableMetricsServer` is a Boolean flag that enables metrics-server. + |nodeSelector|map[string]string|Defines the nodes on which the pods are scheduled. |tolerations|[]v1.Toleration|Defines tolerations for the pods. -|resources|*v1.ResourceRequirements|Defines resource requests and limits for the Prometheus container. +|resources|*v1.ResourceRequirements|Defines resource requests and limits for the Metrics Server container. |=== diff --git a/Documentation/openshiftdocs/modules/metricsserverconfig.adoc b/Documentation/openshiftdocs/modules/metricsserverconfig.adoc new file mode 100644 index 0000000000..76797cd1b8 --- /dev/null +++ b/Documentation/openshiftdocs/modules/metricsserverconfig.adoc @@ -0,0 +1,31 @@ +// DO NOT EDIT THE CONTENT IN THIS FILE. It is automatically generated from the + // source code for the Cluster Monitoring Operator. Any changes made to this + // file will be overwritten when the content is re-generated. If you wish to + // make edits, read the docgen utility instructions in the source code for the + // CMO. + :_content-type: ASSEMBLY + +== MetricsServerConfig + +=== Description + +The `MetricsServerConfig` resource defines settings for the MetricsServer component. + + + +Appears in: link:clustermonitoringconfiguration.adoc[ClusterMonitoringConfiguration] + +[options="header"] +|=== +| Property | Type | Description +|enabled|*bool|`Enabled` is a Boolean flag that enables or disables metrics-server. + +|nodeSelector|map[string]string|Defines the nodes on which the pods are scheduled. + +|tolerations|[]v1.Toleration|Defines tolerations for the pods. + +|resources|*v1.ResourceRequirements|Defines resource requests and limits for the Metrics Server container. + +|=== + +link:../index.adoc[Back to TOC] diff --git a/manifests/image-references b/manifests/image-references index edfbe97356..eb56f04a2d 100644 --- a/manifests/image-references +++ b/manifests/image-references @@ -70,3 +70,7 @@ spec: from: kind: DockerImage name: quay.io/openshift/origin-monitoring-plugin:latest + - name: metrics-server + from: + kind: DockerImage + name: registry.k8s.io/metrics-server/metrics-server:v0.6.3 diff --git a/pkg/client/client.go b/pkg/client/client.go index 2b3fcc8b2a..6e6c1fedfc 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -915,6 +915,15 @@ func (c *Client) DeleteSecret(ctx context.Context, s *v1.Secret) error { return err } +func (c *Client) DeleteAPIService(ctx context.Context, apiService *apiregistrationv1.APIService) error { + err := c.aggclient.ApiregistrationV1().APIServices().Delete(ctx, apiService.GetName(), metav1.DeleteOptions{}) + if apierrors.IsNotFound(err) { + return nil + } + + return err +} + func (c *Client) WaitForPrometheus(ctx context.Context, p *monv1.Prometheus) error { var lastErr error if err := wait.Poll(time.Second*10, time.Minute*5, func() (bool, error) { diff --git a/pkg/manifests/config.go b/pkg/manifests/config.go index 64366dce9d..728b0048b1 100644 --- a/pkg/manifests/config.go +++ b/pkg/manifests/config.go @@ -125,6 +125,7 @@ func (c Config) GetThanosRulerAlertmanagerConfigs() []AdditionalAlertmanagerConf } type Images struct { + MetricsServer string K8sPrometheusAdapter string PromLabelProxy string PrometheusOperatorAdmissionWebhook string @@ -223,8 +224,8 @@ func NewConfig(content io.Reader, tp bool) (*Config, error) { return nil, errors.Wrap(ErrConfigValidation, fmt.Sprintf(`%q is not supported, supported collection profiles are: %q`, c.ClusterMonitoringConfiguration.PrometheusK8sConfig.CollectionProfile, SupportedCollectionProfiles.String())) } - if c.ClusterMonitoringConfiguration.MetricsServerEnabled != nil && !tp { - return nil, errors.Wrap(ErrConfigValidation, "enableMetricsServer is a TechPreview feature, to be able to deploy it please enable TechPreview") + if c.ClusterMonitoringConfiguration.MetricsServerConfig != nil && !tp { + return nil, errors.Wrap(ErrConfigValidation, "Metrics Server is a TechPreview feature, to be able to deploy it please enable TechPreview") } return res, nil @@ -325,6 +326,9 @@ func (c *Config) SetImages(images map[string]string) { c.Images.OpenShiftStateMetrics = images["openshift-state-metrics"] c.Images.Thanos = images["thanos"] c.Images.MonitoringPlugin = images["monitoring-plugin"] + // Till image is updated in CVO + // c.Images.MetricsServer = images["metrics-server"] + c.Images.MetricsServer = "registry.k8s.io/metrics-server/metrics-server:v0.6.3" } func (c *Config) SetTelemetryMatches(matches []string) { diff --git a/pkg/manifests/manifests.go b/pkg/manifests/manifests.go index f524b5b1e4..ae121a3a2a 100644 --- a/pkg/manifests/manifests.go +++ b/pkg/manifests/manifests.go @@ -1801,6 +1801,76 @@ func (f *Factory) PrometheusUserWorkloadPrometheusServiceMonitor() (*monv1.Servi return f.NewServiceMonitor(f.assets.MustNewAssetReader(PrometheusUserWorkloadPrometheusServiceMonitor)) } +func (f *Factory) MetricsServerServiceAccount() (*v1.ServiceAccount, error) { + return f.NewServiceAccount(f.assets.MustNewAssetReader(MetricsServerServiceAccount)) +} + +func (f *Factory) MetricsServerClusterRole() (*rbacv1.ClusterRole, error) { + return f.NewClusterRole(f.assets.MustNewAssetReader(MetricsServerClusterRole)) +} + +func (f *Factory) MetricsServerClusterRoleBinding() (*rbacv1.ClusterRoleBinding, error) { + return f.NewClusterRoleBinding(f.assets.MustNewAssetReader(MetricsServerClusterRoleBinding)) +} + +func (f *Factory) MetricsServerClusterRoleAggregatedMetricsReader() (*rbacv1.ClusterRole, error) { + return f.NewClusterRole(f.assets.MustNewAssetReader(MetricsServerClusterRoleAggregatedMetricsReader)) +} + +func (f *Factory) MetricsServerClusterRoleBindingAuthDelegator() (*rbacv1.ClusterRoleBinding, error) { + return f.NewClusterRoleBinding(f.assets.MustNewAssetReader(MetricsServerClusterRoleBindingAuthDelegator)) +} + +func (f *Factory) MetricsServerRoleBindingAuthReader() (*rbacv1.RoleBinding, error) { + return f.NewRoleBinding(f.assets.MustNewAssetReader(MetricsServerRoleBindingAuthReader)) +} + +func (f *Factory) MetricsServerDeployment() (*appsv1.Deployment, error) { + d, err := f.NewDeployment(f.assets.MustNewAssetReader(MetricsServerDeployment)) + if err != nil { + return nil, err + } + for i, container := range d.Spec.Template.Spec.Containers { + switch container.Name { + case "metrics-server": + d.Spec.Template.Spec.Containers[i].Image = f.config.Images.MetricsServer + + if f.config.ClusterMonitoringConfiguration.MetricsServerConfig != nil { + if f.config.ClusterMonitoringConfiguration.MetricsServerConfig.Resources != nil { + d.Spec.Template.Spec.Containers[i].Resources = *f.config.ClusterMonitoringConfiguration.MetricsServerConfig.Resources + } + + if f.config.ClusterMonitoringConfiguration.MetricsServerConfig.NodeSelector != nil { + d.Spec.Template.Spec.NodeSelector = f.config.ClusterMonitoringConfiguration.MetricsServerConfig.NodeSelector + } + + if f.config.ClusterMonitoringConfiguration.MetricsServerConfig.Tolerations != nil { + d.Spec.Template.Spec.Tolerations = f.config.ClusterMonitoringConfiguration.MetricsServerConfig.Tolerations + } + } + + } + } + + return d, nil +} + +func (f *Factory) MetricsServerPodDisruptionBudget() (*policyv1.PodDisruptionBudget, error) { + return f.NewPodDisruptionBudget(f.assets.MustNewAssetReader(MetricsServerPodDisruptionBudget)) +} + +func (f *Factory) MetricsServerService() (*v1.Service, error) { + return f.NewService(f.assets.MustNewAssetReader(MetricsServerService)) +} + +func (f *Factory) MetricsServerServiceMonitor() (*monv1.ServiceMonitor, error) { + return f.NewServiceMonitor(f.assets.MustNewAssetReader(MetricsServerServiceMonitor)) +} + +func (f *Factory) MetricsServerAPIService() (*apiregistrationv1.APIService, error) { + return f.NewAPIService(f.assets.MustNewAssetReader(MetricsServerAPIService)) +} + func (f *Factory) PrometheusAdapterClusterRole() (*rbacv1.ClusterRole, error) { return f.NewClusterRole(f.assets.MustNewAssetReader(PrometheusAdapterClusterRole)) } diff --git a/pkg/manifests/types.go b/pkg/manifests/types.go index c514c8dc91..ad93318ba6 100644 --- a/pkg/manifests/types.go +++ b/pkg/manifests/types.go @@ -43,10 +43,8 @@ type ClusterMonitoringConfiguration struct { UserWorkloadEnabled *bool `json:"enableUserWorkload,omitempty"` // OmitFromDoc HTTPConfig *HTTPConfig `json:"http,omitempty"` - // `MetricsServerEnabled` is a Boolean flag that enables metrics-server. - MetricsServerEnabled *bool `json:"enableMetricsServer,omitempty"` // `MetricsServer` defines settings for the MetricsServer component. - MetricsServer *MetricsServer `json:"metricsServer,omitempty"` + MetricsServerConfig *MetricsServerConfig `json:"metricsServer,omitempty"` // `K8sPrometheusAdapter` defines settings for the Prometheus Adapter component. K8sPrometheusAdapter *K8sPrometheusAdapter `json:"k8sPrometheusAdapter,omitempty"` // `KubeStateMetricsConfig` defines settings for the `kube-state-metrics` agent. @@ -105,13 +103,15 @@ type AlertmanagerMainConfig struct { VolumeClaimTemplate *monv1.EmbeddedPersistentVolumeClaim `json:"volumeClaimTemplate,omitempty"` } -// The `MetricsServer` resource defines settings for the MetricsServer component. -type MetricsServer struct { +// The `MetricsServerConfig` resource defines settings for the MetricsServer component. +type MetricsServerConfig struct { + // `Enabled` is a Boolean flag that enables or disables metrics-server. + Enabled *bool `json:"enabled,omitempty"` // Defines the nodes on which the pods are scheduled. NodeSelector map[string]string `json:"nodeSelector,omitempty"` // Defines tolerations for the pods. Tolerations []v1.Toleration `json:"tolerations,omitempty"` - // Defines resource requests and limits for the Prometheus container. + // Defines resource requests and limits for the Metrics Server container. Resources *v1.ResourceRequirements `json:"resources,omitempty"` } diff --git a/pkg/operator/operator.go b/pkg/operator/operator.go index 783b2c901a..8548c55785 100644 --- a/pkg/operator/operator.go +++ b/pkg/operator/operator.go @@ -742,6 +742,7 @@ func (o *Operator) sync(ctx context.Context, key string) error { tasks.NewTaskSpec("Updating kube-state-metrics", tasks.NewKubeStateMetricsTask(o.client, factory)), tasks.NewTaskSpec("Updating openshift-state-metrics", tasks.NewOpenShiftStateMetricsTask(o.client, factory)), tasks.NewTaskSpec("Updating prometheus-adapter", tasks.NewPrometheusAdapterTask(ctx, o.namespace, o.client, factory, config)), + tasks.NewTaskSpec("Updating metrics-server", tasks.NewMetricsServerTask(ctx, o.namespace, o.client, factory, config)), tasks.NewTaskSpec("Updating Telemeter client", tasks.NewTelemeterClientTask(o.client, factory, config)), tasks.NewTaskSpec("Updating Thanos Querier", tasks.NewThanosQuerierTask(o.client, factory, config)), tasks.NewTaskSpec("Updating User Workload Thanos Ruler", tasks.NewThanosRulerUserWorkloadTask(o.client, factory, config)), diff --git a/pkg/tasks/metricsserver.go b/pkg/tasks/metricsserver.go new file mode 100644 index 0000000000..7b11229a6c --- /dev/null +++ b/pkg/tasks/metricsserver.go @@ -0,0 +1,301 @@ +package tasks + +import ( + "context" + + "github.com/openshift/cluster-monitoring-operator/pkg/client" + "github.com/openshift/cluster-monitoring-operator/pkg/manifests" + "github.com/pkg/errors" + appsv1 "k8s.io/api/apps/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +type MetricsServerTask struct { + client *client.Client + ctx context.Context + factory *manifests.Factory + config *manifests.Config + namespace string +} + +func NewMetricsServerTask(ctx context.Context, namespace string, client *client.Client, factory *manifests.Factory, config *manifests.Config) *MetricsServerTask { + return &MetricsServerTask{ + client: client, + factory: factory, + config: config, + namespace: namespace, + ctx: ctx, + } +} + +func (t *MetricsServerTask) Run(ctx context.Context) error { + if t.config.ClusterMonitoringConfiguration.MetricsServerConfig != nil && *t.config.ClusterMonitoringConfiguration.MetricsServerConfig.Enabled { + return t.create(ctx) + } + // TODO Call adapter resources to recreate and then delete metrics server + return t.destroy(ctx) +} + +func (t *MetricsServerTask) create(ctx context.Context) error { + { + sa, err := t.factory.MetricsServerServiceAccount() + if err != nil { + return errors.Wrap(err, "initializing MetricsServer ServiceAccount failed") + } + + err = t.client.CreateOrUpdateServiceAccount(ctx, sa) + if err != nil { + return errors.Wrap(err, "reconciling MetricsServer ServiceAccount failed") + } + } + { + cr, err := t.factory.MetricsServerClusterRole() + if err != nil { + return errors.Wrap(err, "initializing metrics-server ClusterRolefailed") + } + + err = t.client.CreateOrUpdateClusterRole(ctx, cr) + if err != nil { + return errors.Wrap(err, "reconciling metrics-server ClusterRole failed") + } + } + { + crb, err := t.factory.MetricsServerClusterRoleBinding() + if err != nil { + return errors.Wrap(err, "initializing MetricsServer ClusterRoleBinding failed") + } + + err = t.client.CreateOrUpdateClusterRoleBinding(ctx, crb) + if err != nil { + return errors.Wrap(err, "reconciling MetricsServer ClusterRoleBinding failed") + } + } + { + cr, err := t.factory.MetricsServerClusterRoleAggregatedMetricsReader() + if err != nil { + return errors.Wrap(err, "initializing system:aggregated-metrics-reader ClusterRolefailed") + } + + err = t.client.CreateOrUpdateClusterRole(ctx, cr) + if err != nil { + return errors.Wrap(err, "reconciling system:aggregated-metrics-reader ClusterRole failed") + } + } + { + crb, err := t.factory.MetricsServerClusterRoleBindingAuthDelegator() + if err != nil { + return errors.Wrap(err, "initializing metrics-server:system:auth-delegator ClusterRoleBinding failed") + } + + err = t.client.CreateOrUpdateClusterRoleBinding(ctx, crb) + if err != nil { + return errors.Wrap(err, "reconciling metrics-server:system:auth-delegator ClusterRoleBinding failed") + } + } + { + rb, err := t.factory.MetricsServerRoleBindingAuthReader() + if err != nil { + return errors.Wrap(err, "initializing metrics-server-auth-reader RoleBinding failed") + } + + err = t.client.CreateOrUpdateRoleBinding(ctx, rb) + if err != nil { + return errors.Wrap(err, "reconciling metrics-server-auth-reader RoleBinding failed") + } + } + { + s, err := t.factory.MetricsServerService() + if err != nil { + return errors.Wrap(err, "initializing MetricsServer Service failed") + } + + err = t.client.CreateOrUpdateService(ctx, s) + if err != nil { + return errors.Wrap(err, "reconciling MetricsServer Service failed") + } + } + { + dep, err := t.factory.MetricsServerDeployment() + if err != nil { + return errors.Wrap(err, "initializing MetricsServer Deployment failed") + } + + err = t.client.CreateOrUpdateDeployment(ctx, dep) + if err != nil { + return errors.Wrap(err, "reconciling MetricsServer Deployment failed") + } + } + { + sm, err := t.factory.MetricsServerServiceMonitor() + if err != nil { + return errors.Wrap(err, "initializing MetricsServer ServiceMonitors failed") + } + + err = t.client.CreateOrUpdateServiceMonitor(ctx, sm) + if err != nil { + return errors.Wrapf(err, "reconciling %s/%s ServiceMonitor failed", sm.Namespace, sm.Name) + } + } + { + pdb, err := t.factory.MetricsServerPodDisruptionBudget() + if err != nil { + return errors.Wrap(err, "initializing MetricsServer PodDisruptionBudget failed") + } + + if pdb != nil { + err = t.client.CreateOrUpdatePodDisruptionBudget(ctx, pdb) + if err != nil { + return errors.Wrap(err, "reconciling MetricsServer PodDisruptionBudget failed") + } + } + } + // Add check before updating APIService + { + api, err := t.factory.MetricsServerAPIService() + if err != nil { + return errors.Wrap(err, "initializing MetricsServer APIService failed") + } + + err = t.client.CreateOrUpdateAPIService(ctx, api) + if err != nil { + return errors.Wrap(err, "reconciling MetricsServer APIService failed") + } + } + + return t.removePrometheusAdapterResources() +} + +func (t *MetricsServerTask) destroy(ctx context.Context) error { + { + pdb, err := t.factory.MetricsServerPodDisruptionBudget() + if err != nil { + return errors.Wrap(err, "initializing MetricsServer PodDisruptionBudget failed") + } + + if pdb != nil { + err = t.client.DeletePodDisruptionBudget(ctx, pdb) + if err != nil { + return errors.Wrap(err, "deleting MetricsServer PodDisruptionBudget failed") + } + } + } + { + dep, err := t.factory.MetricsServerDeployment() + if err != nil { + return errors.Wrap(err, "initializing MetricsServer Deployment failed") + } + + err = t.client.DeleteDeployment(ctx, dep) + if err != nil { + return errors.Wrap(err, "deleting MetricsServer Deployment failed") + } + } + { + cr, err := t.factory.MetricsServerClusterRole() + if err != nil { + return errors.Wrap(err, "initializing metrics-server ClusterRolefailed") + } + + err = t.client.DeleteClusterRole(ctx, cr) + if err != nil { + return errors.Wrap(err, "deleting metrics-server ClusterRole failed") + } + } + { + crb, err := t.factory.MetricsServerClusterRoleBinding() + if err != nil { + return errors.Wrap(err, "initializing MetricsServer ClusterRoleBinding failed") + } + + err = t.client.DeleteClusterRoleBinding(ctx, crb) + if err != nil { + return errors.Wrap(err, "deleting MetricsServer ClusterRoleBinding failed") + } + } + { + cr, err := t.factory.MetricsServerClusterRoleAggregatedMetricsReader() + if err != nil { + return errors.Wrap(err, "initializing system:aggregated-metrics-reader ClusterRolefailed") + } + + err = t.client.DeleteClusterRole(ctx, cr) + if err != nil { + return errors.Wrap(err, "deleting system:aggregated-metrics-reader ClusterRole failed") + } + } + { + crb, err := t.factory.MetricsServerClusterRoleBindingAuthDelegator() + if err != nil { + return errors.Wrap(err, "initializing metrics-server:system:auth-delegator ClusterRoleBinding failed") + } + + err = t.client.DeleteClusterRoleBinding(ctx, crb) + if err != nil { + return errors.Wrap(err, "deleting metrics-server:system:auth-delegator ClusterRoleBinding failed") + } + } + { + rb, err := t.factory.MetricsServerRoleBindingAuthReader() + if err != nil { + return errors.Wrap(err, "initializing metrics-server-auth-reader RoleBinding failed") + } + + err = t.client.DeleteRoleBinding(ctx, rb) + if err != nil { + return errors.Wrap(err, "deleting metrics-server-auth-reader RoleBinding failed") + } + } + // TODO: check if anything needed before delete, pa up? + // May be this should be deleted different than other resources, add check in pa run + { + apiService, err := t.factory.MetricsServerAPIService() + if err != nil { + return errors.Wrap(err, "initializing MetricsServer APIService failed") + } + + err = t.client.DeleteAPIService(t.ctx, apiService) + if err != nil { + return errors.Wrap(err, "deleting MetricsServer APIService failed") + } + } + { + sm, err := t.factory.MetricsServerServiceMonitor() + if err != nil { + return errors.Wrap(err, "initializing MetricsServer ServiceMonitors failed") + } + + err = t.client.DeleteServiceMonitor(ctx, sm) + if err != nil { + return errors.Wrapf(err, "deleting %s/%s ServiceMonitor failed", sm.Namespace, sm.Name) + } + } + { + s, err := t.factory.MetricsServerService() + if err != nil { + return errors.Wrap(err, "initializing MetricsServer Service failed") + } + + err = t.client.DeleteService(ctx, s) + if err != nil { + return errors.Wrap(err, "deleting MetricsServer Service failed") + } + } + return nil +} + +func (t *MetricsServerTask) removePrometheusAdapterResources() error { + d := &appsv1.Deployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: "prometheus-adapter", + Namespace: "openshift-monitoring", + }, + } + err := t.client.DeleteDeployment(t.ctx, d) + if err != nil { + return errors.Wrap(err, "deleting PrometheusAdapter Deployment failed") + } + + // TODO Add steps to remove other resources + + return nil +} diff --git a/pkg/tasks/prometheusadapter.go b/pkg/tasks/prometheusadapter.go index 7f10a76f2c..0c43fb2df1 100644 --- a/pkg/tasks/prometheusadapter.go +++ b/pkg/tasks/prometheusadapter.go @@ -30,6 +30,16 @@ func NewPrometheusAdapterTask(ctx context.Context, namespace string, client *cli } func (t *PrometheusAdapterTask) Run(ctx context.Context) error { + if t.config.ClusterMonitoringConfiguration.MetricsServerConfig != nil { + if !*t.config.ClusterMonitoringConfiguration.MetricsServerConfig.Enabled { + t.create(ctx) + } + } + + return nil +} + +func (t *PrometheusAdapterTask) create(ctx context.Context) error { { cr, err := t.factory.PrometheusAdapterClusterRole() if err != nil { @@ -257,7 +267,6 @@ func (t *PrometheusAdapterTask) Run(ctx context.Context) error { return errors.Wrap(err, "reconciling PrometheusAdapter APIService failed") } } - return nil }