diff --git a/pkg/client/client.go b/pkg/client/client.go index 586443e8a5..39cdcad3ba 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -772,15 +772,6 @@ func (c *Client) DeletePodDisruptionBudget(ctx context.Context, pdb *policyv1.Po 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) DeletePrometheus(ctx context.Context, p *monv1.Prometheus) error { pclient := c.mclient.MonitoringV1().Prometheuses(p.GetNamespace()) diff --git a/pkg/tasks/metricsserver.go b/pkg/tasks/metricsserver.go index 7b11229a6c..9dbfd6a1aa 100644 --- a/pkg/tasks/metricsserver.go +++ b/pkg/tasks/metricsserver.go @@ -6,8 +6,6 @@ import ( "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 { @@ -32,7 +30,6 @@ 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) } @@ -162,7 +159,13 @@ func (t *MetricsServerTask) create(ctx context.Context) error { } } - return t.removePrometheusAdapterResources() + { + pa := NewPrometheusAdapterTask(ctx, t.namespace, t.client, t.factory, t.config) + if err := pa.destroy(ctx); err != nil { + return errors.Wrap(err, "deleting Prometheus Adapter resources failed") + } + } + return t.destroy(ctx) } func (t *MetricsServerTask) destroy(ctx context.Context) error { @@ -179,17 +182,6 @@ func (t *MetricsServerTask) destroy(ctx context.Context) error { } } } - { - 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 { @@ -245,19 +237,6 @@ func (t *MetricsServerTask) destroy(ctx context.Context) error { 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 { @@ -280,22 +259,16 @@ func (t *MetricsServerTask) destroy(ctx context.Context) error { return errors.Wrap(err, "deleting MetricsServer Service failed") } } - return nil -} + { + dep, err := t.factory.MetricsServerDeployment() + if err != nil { + return errors.Wrap(err, "initializing MetricsServer Deployment failed") + } -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") + err = t.client.DeleteDeployment(ctx, dep) + if err != nil { + return errors.Wrap(err, "deleting MetricsServer Deployment failed") + } } - - // TODO Add steps to remove other resources - return nil } diff --git a/pkg/tasks/prometheusadapter.go b/pkg/tasks/prometheusadapter.go index 0c43fb2df1..0b2ccf279d 100644 --- a/pkg/tasks/prometheusadapter.go +++ b/pkg/tasks/prometheusadapter.go @@ -30,10 +30,8 @@ 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) - } + if !t.config.TechPreview { + t.create(ctx) } return nil @@ -288,3 +286,208 @@ func (t *PrometheusAdapterTask) deleteOldPrometheusAdapterSecrets(newHash string return nil } + +func (t *PrometheusAdapterTask) destroy(ctx context.Context) error { + { + pdb, err := t.factory.PrometheusAdapterPodDisruptionBudget() + if err != nil { + return errors.Wrap(err, "initializing PrometheusAdapter PodDisruptionBudget failed") + } + + if pdb != nil { + err = t.client.DeletePodDisruptionBudget(ctx, pdb) + if err != nil { + return errors.Wrap(err, "deleting PrometheusAdapter PodDisruptionBudget failed") + } + } + } + { + sms, err := t.factory.PrometheusAdapterServiceMonitors() + if err != nil { + return errors.Wrap(err, "initializing PrometheusAdapter ServiceMonitors failed") + } + + for _, sm := range sms { + err = t.client.DeleteServiceMonitor(ctx, sm) + if err != nil { + return errors.Wrapf(err, "deleting %s/%s ServiceMonitor failed", sm.Namespace, sm.Name) + } + } + } + { + cr, err := t.factory.PrometheusAdapterClusterRole() + if err != nil { + return errors.Wrap(err, "initializing PrometheusAdapter ClusterRole failed") + } + + err = t.client.DeleteClusterRole(ctx, cr) + if err != nil { + return errors.Wrap(err, "deleting PrometheusAdapter ClusterRole failed") + } + } + { + cr, err := t.factory.PrometheusAdapterClusterRoleServerResources() + if err != nil { + return errors.Wrap(err, "initializing PrometheusAdapter ClusterRole for server resources failed") + } + + err = t.client.DeleteClusterRole(ctx, cr) + if err != nil { + return errors.Wrap(err, "deleting PrometheusAdapter ClusterRole for server resources failed") + } + } + { + cr, err := t.factory.PrometheusAdapterClusterRoleAggregatedMetricsReader() + if err != nil { + return errors.Wrap(err, "initializing PrometheusAdapter ClusterRole aggregating resource metrics read permissions failed") + } + + err = t.client.DeleteClusterRole(ctx, cr) + if err != nil { + return errors.Wrap(err, "deleting PrometheusAdapter ClusterRole aggregating resource metrics read permissions failed") + } + } + { + crb, err := t.factory.PrometheusAdapterClusterRoleBinding() + if err != nil { + return errors.Wrap(err, "initializing PrometheusAdapter ClusterRoleBinding failed") + } + + err = t.client.DeleteClusterRoleBinding(ctx, crb) + if err != nil { + return errors.Wrap(err, "deleting PrometheusAdapter ClusterRoleBinding failed") + } + } + { + crb, err := t.factory.PrometheusAdapterClusterRoleBindingDelegator() + if err != nil { + return errors.Wrap(err, "initializing PrometheusAdapter ClusterRoleBinding for delegator failed") + } + + err = t.client.DeleteClusterRoleBinding(ctx, crb) + if err != nil { + return errors.Wrap(err, "deleting PrometheusAdapter ClusterRoleBinding for delegator failed") + } + } + { + crb, err := t.factory.PrometheusAdapterClusterRoleBindingView() + if err != nil { + return errors.Wrap(err, "initializing PrometheusAdapter ClusterRoleBinding for view failed") + } + + err = t.client.DeleteClusterRoleBinding(ctx, crb) + if err != nil { + return errors.Wrap(err, "deleting PrometheusAdapter ClusterRoleBinding for view failed") + } + } + { + rb, err := t.factory.PrometheusAdapterRoleBindingAuthReader() + if err != nil { + return errors.Wrap(err, "initializing PrometheusAdapter RoleBinding for auth-reader failed") + } + + err = t.client.DeleteRoleBinding(ctx, rb) + if err != nil { + return errors.Wrap(err, "deleting PrometheusAdapter RoleBinding for auth-reader failed") + } + } + { + sa, err := t.factory.PrometheusAdapterServiceAccount() + if err != nil { + return errors.Wrap(err, "initializing PrometheusAdapter ServiceAccount failed") + } + + err = t.client.DeleteServiceAccount(ctx, sa) + if err != nil { + return errors.Wrap(err, "deleting PrometheusAdapter ServiceAccount failed") + } + } + { + cm, err := t.factory.PrometheusAdapterConfigMapAuditPolicy() + if err != nil { + return errors.Wrap(err, "initializing PrometheusAdapter AuditPolicy ConfigMap failed") + } + + err = t.client.DeleteConfigMap(ctx, cm) + if err != nil { + return errors.Wrap(err, "deleting PrometheusAdapter AuditPolicy ConfigMap failed") + } + } + { + cm, err := t.factory.PrometheusAdapterConfigMapPrometheus() + if err != nil { + return errors.Wrap(err, "initializing PrometheusAdapter ConfigMap for Prometheus failed") + } + + err = t.client.DeleteConfigMap(ctx, cm) + if err != nil { + return errors.Wrap(err, "deleting PrometheusAdapter ConfigMap for Prometheus failed") + } + } + { + s, err := t.factory.PrometheusAdapterService() + if err != nil { + return errors.Wrap(err, "initializing PrometheusAdapter Service failed") + } + + err = t.client.DeleteService(ctx, s) + if err != nil { + return errors.Wrap(err, "deleting PrometheusAdapter Service failed") + } + } + // Intermediate variable to hold on to the config map name that the + // prometheus-adapter deployment should target. + var cmName string + { + cmD, err := t.factory.PrometheusAdapterConfigMapDedicated() + if err != nil { + return errors.Wrap(err, "initializing PrometheusAdapter ConfigMap for dedicated ServiceMonitors failed") + } + cm, err := t.factory.PrometheusAdapterConfigMap() + if err != nil { + return errors.Wrap(err, "initializing PrometheusAdapter ConfigMap failed") + } + if t.config.ClusterMonitoringConfiguration.K8sPrometheusAdapter.DedicatedServiceMonitors.Enabled { + err = t.client.DeleteConfigMap(ctx, cmD) + if err != nil { + return errors.Wrap(err, "deleting PrometheusAdapter ConfigMap for dedicated ServiceMonitors failed") + } + err = t.client.DeleteConfigMap(ctx, cm) + if err != nil { + return errors.Wrap(err, "deleting PrometheusAdapter ConfigMap failed") + } + cmName = cmD.Name + } + + tlsSecret, err := t.client.WaitForSecretByNsName(ctx, types.NamespacedName{Namespace: t.namespace, Name: "prometheus-adapter-tls"}) + if err != nil { + return errors.Wrap(err, "failed to wait for prometheus-adapter-tls secret") + } + + apiAuthConfigmap, err := t.client.WaitForConfigMapByNsName(ctx, types.NamespacedName{Namespace: "kube-system", Name: "extension-apiserver-authentication"}) + if err != nil { + return errors.Wrap(err, "failed to wait for kube-system/extension-apiserver-authentication configmap") + } + + secret, err := t.factory.PrometheusAdapterSecret(tlsSecret, apiAuthConfigmap) + if err != nil { + return errors.Wrap(err, "failed to get prometheus adapter secret") + } + + err = t.client.DeleteSecret(ctx, secret) + if err != nil { + return errors.Wrap(err, "deleting PrometheusAdapter Secret failed") + } + + dep, err := t.factory.PrometheusAdapterDeployment(secret.Name, apiAuthConfigmap.Data, cmName) + if err != nil { + return errors.Wrap(err, "initializing PrometheusAdapter Deployment failed") + } + + err = t.client.DeleteDeployment(ctx, dep) + if err != nil { + return errors.Wrap(err, "deleting PrometheusAdapter Deployment failed") + } + } + return nil +}