Skip to content

Commit

Permalink
Delete the monitoring resources on Extension deletion (#268)
Browse files Browse the repository at this point in the history
  • Loading branch information
ialidzhikov authored Oct 22, 2024
1 parent 29b839e commit 058fb0b
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 17 deletions.
35 changes: 28 additions & 7 deletions pkg/component/registrycaches/monitoring.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
kubeapiserverconstants "github.com/gardener/gardener/pkg/component/kubernetes/apiserver/constants"
monitoringutils "github.com/gardener/gardener/pkg/component/observability/monitoring/utils"
"github.com/gardener/gardener/pkg/controllerutils"
kubernetesutils "github.com/gardener/gardener/pkg/utils/kubernetes"
monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
monitoringv1alpha1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1alpha1"
corev1 "k8s.io/api/core/v1"
Expand All @@ -27,17 +28,17 @@ var (
)

func (r *registryCaches) deployMonitoringConfig(ctx context.Context) error {
configMapDashboards := &corev1.ConfigMap{ObjectMeta: metav1.ObjectMeta{Name: "registry-cache-dashboards", Namespace: r.namespace}}
if _, err := controllerutils.GetAndCreateOrMergePatch(ctx, r.client, configMapDashboards, func() error {
metav1.SetMetaDataLabel(&configMapDashboards.ObjectMeta, "component", "registry-cache")
metav1.SetMetaDataLabel(&configMapDashboards.ObjectMeta, "dashboard.monitoring.gardener.cloud/shoot", "true")
configMapDashboards.Data = map[string]string{"registry-cache.dashboard.json": dashboard}
dashboardsConfigMap := r.emptyDashboardsConfigMap()
if _, err := controllerutils.GetAndCreateOrMergePatch(ctx, r.client, dashboardsConfigMap, func() error {
metav1.SetMetaDataLabel(&dashboardsConfigMap.ObjectMeta, "component", "registry-cache")
metav1.SetMetaDataLabel(&dashboardsConfigMap.ObjectMeta, "dashboard.monitoring.gardener.cloud/shoot", "true")
dashboardsConfigMap.Data = map[string]string{"registry-cache.dashboard.json": dashboard}
return nil
}); err != nil {
return err
}

prometheusRule := &monitoringv1.PrometheusRule{ObjectMeta: monitoringutils.ConfigObjectMeta("registry-cache", r.namespace, "shoot")}
prometheusRule := r.emptyPrometheusRule()
if _, err := controllerutils.GetAndCreateOrMergePatch(ctx, r.client, prometheusRule, func() error {
metav1.SetMetaDataLabel(&prometheusRule.ObjectMeta, "component", "registry-cache")
metav1.SetMetaDataLabel(&prometheusRule.ObjectMeta, "prometheus", "shoot")
Expand Down Expand Up @@ -104,7 +105,7 @@ predict_linear(kubelet_volume_stats_available_bytes{persistentvolumeclaim=~"^cac
return err
}

scrapeConfig := &monitoringv1alpha1.ScrapeConfig{ObjectMeta: monitoringutils.ConfigObjectMeta("registry-cache", r.namespace, "shoot")}
scrapeConfig := r.emptyScrapeConfig()
if _, err := controllerutils.GetAndCreateOrMergePatch(ctx, r.client, scrapeConfig, func() error {
metav1.SetMetaDataLabel(&scrapeConfig.ObjectMeta, "component", "registry-cache")
metav1.SetMetaDataLabel(&scrapeConfig.ObjectMeta, "prometheus", "shoot")
Expand Down Expand Up @@ -167,3 +168,23 @@ predict_linear(kubelet_volume_stats_available_bytes{persistentvolumeclaim=~"^cac

return nil
}

func (r *registryCaches) destroyMonitoringConfig(ctx context.Context) error {
return kubernetesutils.DeleteObjects(ctx, r.client,
r.emptyDashboardsConfigMap(),
r.emptyPrometheusRule(),
r.emptyScrapeConfig(),
)
}

func (r *registryCaches) emptyDashboardsConfigMap() *corev1.ConfigMap {
return &corev1.ConfigMap{ObjectMeta: metav1.ObjectMeta{Name: "registry-cache-dashboards", Namespace: r.namespace}}
}

func (r *registryCaches) emptyPrometheusRule() *monitoringv1.PrometheusRule {
return &monitoringv1.PrometheusRule{ObjectMeta: monitoringutils.ConfigObjectMeta("registry-cache", r.namespace, "shoot")}
}

func (r *registryCaches) emptyScrapeConfig() *monitoringv1alpha1.ScrapeConfig {
return &monitoringv1alpha1.ScrapeConfig{ObjectMeta: monitoringutils.ConfigObjectMeta("registry-cache", r.namespace, "shoot")}
}
12 changes: 10 additions & 2 deletions pkg/component/registrycaches/registry_caches.go
Original file line number Diff line number Diff line change
Expand Up @@ -126,11 +126,19 @@ func (r *registryCaches) Deploy(ctx context.Context) error {
func (r *registryCaches) Destroy(ctx context.Context) error {
if r.values.KeepObjectsOnDestroy {
if err := managedresources.SetKeepObjects(ctx, r.client, r.namespace, managedResourceName, true); err != nil {
return err
return fmt.Errorf("failed to set keep objects to managed resource: %w", err)
}
}

return managedresources.Delete(ctx, r.client, r.namespace, managedResourceName, false)
if err := managedresources.Delete(ctx, r.client, r.namespace, managedResourceName, false); err != nil {
return fmt.Errorf("failed to delete managed resource: %w", err)
}

if err := r.destroyMonitoringConfig(ctx); err != nil {
return fmt.Errorf("failed to destroy monitoring config: %w", err)
}

return nil
}

// TimeoutWaitForManagedResource is the timeout used while waiting for the ManagedResources to become healthy
Expand Down
40 changes: 32 additions & 8 deletions pkg/component/registrycaches/registry_caches_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -517,16 +517,16 @@ status: {}
It("should deploy a monitoring objects", func() {
Expect(registryCaches.Deploy(ctx)).To(Succeed())

configMapDashboards := &corev1.ConfigMap{
dashboardsConfigMap := &corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Name: "registry-cache-dashboards",
Namespace: namespace,
},
}
Expect(c.Get(ctx, client.ObjectKeyFromObject(configMapDashboards), configMapDashboards)).To(Succeed())
Expect(configMapDashboards.Labels).To(HaveKeyWithValue("dashboard.monitoring.gardener.cloud/shoot", "true"))
Expect(configMapDashboards.Labels).To(HaveKeyWithValue("component", "registry-cache"))
Expect(configMapDashboards.Data).To(HaveKey("registry-cache.dashboard.json"))
Expect(c.Get(ctx, client.ObjectKeyFromObject(dashboardsConfigMap), dashboardsConfigMap)).To(Succeed())
Expect(dashboardsConfigMap.Labels).To(HaveKeyWithValue("dashboard.monitoring.gardener.cloud/shoot", "true"))
Expect(dashboardsConfigMap.Labels).To(HaveKeyWithValue("component", "registry-cache"))
Expect(dashboardsConfigMap.Data).To(HaveKey("registry-cache.dashboard.json"))

prometheusRule := &monitoringv1.PrometheusRule{
ObjectMeta: metav1.ObjectMeta{
Expand Down Expand Up @@ -563,16 +563,40 @@ status: {}

Describe("#Destroy", func() {
It("should successfully destroy all resources", func() {
var (
dashboardsConfigMap = &corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Name: "registry-cache-dashboards",
Namespace: namespace,
},
}
prometheusRule = &monitoringv1.PrometheusRule{
ObjectMeta: metav1.ObjectMeta{
Name: "shoot-registry-cache",
Namespace: namespace,
},
}
scrapeConfig = &monitoringv1alpha1.ScrapeConfig{
ObjectMeta: metav1.ObjectMeta{
Name: "shoot-registry-cache",
Namespace: namespace,
},
}
)

Expect(c.Create(ctx, managedResource)).To(Succeed())
Expect(c.Create(ctx, managedResourceSecret)).To(Succeed())

Expect(c.Get(ctx, client.ObjectKeyFromObject(managedResource), managedResource)).To(Succeed())
Expect(c.Get(ctx, client.ObjectKeyFromObject(managedResourceSecret), managedResourceSecret)).To(Succeed())
Expect(c.Create(ctx, dashboardsConfigMap)).To(Succeed())
Expect(c.Create(ctx, prometheusRule)).To(Succeed())
Expect(c.Create(ctx, scrapeConfig)).To(Succeed())

Expect(registryCaches.Destroy(ctx)).To(Succeed())

Expect(c.Get(ctx, client.ObjectKeyFromObject(managedResource), managedResource)).To(MatchError(apierrors.NewNotFound(schema.GroupResource{Group: resourcesv1alpha1.SchemeGroupVersion.Group, Resource: "managedresources"}, managedResource.Name)))
Expect(c.Get(ctx, client.ObjectKeyFromObject(managedResourceSecret), managedResourceSecret)).To(MatchError(apierrors.NewNotFound(schema.GroupResource{Group: corev1.SchemeGroupVersion.Group, Resource: "secrets"}, managedResourceSecret.Name)))
Expect(c.Get(ctx, client.ObjectKeyFromObject(dashboardsConfigMap), dashboardsConfigMap)).To(MatchError(apierrors.NewNotFound(schema.GroupResource{Group: corev1.SchemeGroupVersion.Group, Resource: "configmaps"}, dashboardsConfigMap.Name)))
Expect(c.Get(ctx, client.ObjectKeyFromObject(prometheusRule), prometheusRule)).To(MatchError(apierrors.NewNotFound(schema.GroupResource{Group: monitoringv1.SchemeGroupVersion.Group, Resource: "prometheusrules"}, prometheusRule.Name)))
Expect(c.Get(ctx, client.ObjectKeyFromObject(scrapeConfig), scrapeConfig)).To(MatchError(apierrors.NewNotFound(schema.GroupResource{Group: monitoringv1.SchemeGroupVersion.Group, Resource: "scrapeconfigs"}, scrapeConfig.Name)))
})
})

Expand Down

0 comments on commit 058fb0b

Please sign in to comment.