github.com/verrazzano/verrazzano@v1.7.1/application-operator/controllers/metricsbinding/metricsbinding_delete_test.go (about) 1 // Copyright (c) 2022, Oracle and/or its affiliates. 2 // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. 3 4 package metricsbinding 5 6 import ( 7 "context" 8 "strings" 9 "testing" 10 11 promoperapi "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" 12 asserts "github.com/stretchr/testify/assert" 13 vzapi "github.com/verrazzano/verrazzano/application-operator/apis/app/v1alpha1" 14 vzconst "github.com/verrazzano/verrazzano/pkg/constants" 15 "github.com/verrazzano/verrazzano/pkg/log/vzlog" 16 "github.com/verrazzano/verrazzano/pkg/metricsutils" 17 "github.com/verrazzano/verrazzano/platform-operator/constants" 18 appsv1 "k8s.io/api/apps/v1" 19 corev1 "k8s.io/api/core/v1" 20 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 21 "k8s.io/apimachinery/pkg/runtime" 22 "k8s.io/apimachinery/pkg/types" 23 "sigs.k8s.io/controller-runtime/pkg/client/fake" 24 ) 25 26 // TestReconcileBindingDelete tests the reconciliation for a deletion 27 // GIVEN an object and a request 28 // WHEN the reconciler processes the request 29 // THEN verify the process returns no error 30 func TestReconcileBindingDelete(t *testing.T) { 31 assert := asserts.New(t) 32 33 scheme := runtime.NewScheme() 34 _ = vzapi.AddToScheme(scheme) 35 _ = corev1.AddToScheme(scheme) 36 _ = appsv1.AddToScheme(scheme) 37 _ = promoperapi.AddToScheme(scheme) 38 39 testFileCMEmpty, err := getConfigMapFromTestFile(true) 40 assert.NoError(err) 41 testFileCMFilled, err := getConfigMapFromTestFile(false) 42 assert.NoError(err) 43 testFileCMOtherScrapeConfigs, err := readConfigMapData("testdata/cmDataHasOtherScrapeConfigs.yaml") 44 assert.NoError(err) 45 testFileSec, err := getSecretFromTestFile(false) 46 assert.NoError(err) 47 48 tests := []struct { 49 name string 50 workload *appsv1.Deployment 51 namespace *corev1.Namespace 52 configMap *corev1.ConfigMap 53 secret *corev1.Secret 54 expectScrapeConfigRemove bool 55 }{ 56 { 57 name: "test configmap empty", 58 workload: plainWorkload, 59 namespace: plainNs, 60 configMap: testFileCMEmpty, 61 expectScrapeConfigRemove: false, 62 }, 63 { 64 name: "test configmap with other scrape configs", 65 workload: plainWorkload, 66 namespace: plainNs, 67 configMap: testFileCMOtherScrapeConfigs, 68 expectScrapeConfigRemove: false, 69 }, 70 { 71 name: "test configmap filled", 72 workload: plainWorkload, 73 namespace: plainNs, 74 configMap: testFileCMFilled, 75 expectScrapeConfigRemove: true, 76 }, 77 { 78 name: "test secret", 79 workload: plainWorkload, 80 namespace: plainNs, 81 secret: testFileSec, 82 expectScrapeConfigRemove: false, 83 }, 84 } 85 for _, tt := range tests { 86 t.Run(tt.name, func(t *testing.T) { 87 localMetricsBinding := metricsBinding.DeepCopy() 88 localMetricsBinding.OwnerReferences = []metav1.OwnerReference{ 89 { 90 Name: tt.workload.Name, 91 }, 92 } 93 94 c := fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects([]runtime.Object{ 95 metricsTemplate, 96 tt.workload, 97 tt.namespace, 98 }...) 99 configMapNumScrapeConfigs := 0 100 if tt.configMap != nil { 101 c = c.WithRuntimeObjects(tt.configMap) 102 parsedConfigMap, err := getConfigData(tt.configMap) 103 assert.NoError(err, "Could not parse test config map") 104 configMapNumScrapeConfigs = len(parsedConfigMap.Search(prometheusScrapeConfigsLabel).Children()) 105 } 106 if tt.secret != nil { 107 c = c.WithRuntimeObjects(tt.secret) 108 localMetricsBinding.Spec.PrometheusConfigMap = vzapi.NamespaceName{} 109 localMetricsBinding.Spec.PrometheusConfigSecret = vzapi.SecretKey{ 110 Namespace: vzconst.PrometheusOperatorNamespace, 111 Name: vzconst.PromAdditionalScrapeConfigsSecretName, 112 Key: prometheusConfigKey, 113 } 114 } 115 client := c.Build() 116 117 log := vzlog.DefaultLogger() 118 r := newReconciler(client) 119 _, err = r.reconcileBindingDelete(context.TODO(), localMetricsBinding, log) 120 assert.NoError(err) 121 122 // Get the configMap for analysis 123 if tt.configMap != nil { 124 var newCM corev1.ConfigMap 125 err = client.Get(context.TODO(), types.NamespacedName{Namespace: constants.VerrazzanoSystemNamespace, Name: testConfigMapName}, &newCM) 126 assert.NoError(err) 127 jobName := createJobName(localMetricsBinding) 128 assert.False(strings.Contains(newCM.Data[prometheusConfigKey], jobName)) 129 parsedPrometheusConfig, err := getConfigData(&newCM) 130 assert.NoError(err) 131 newScrapeConfigs := parsedPrometheusConfig.Search(prometheusScrapeConfigsLabel) 132 jobIndex := metricsutils.FindScrapeJob(newScrapeConfigs, jobName) 133 assert.Equal(-1, jobIndex) 134 expectedNumScrapeConfigs := configMapNumScrapeConfigs 135 if tt.expectScrapeConfigRemove { 136 expectedNumScrapeConfigs = configMapNumScrapeConfigs - 1 137 } 138 assert.Equal(expectedNumScrapeConfigs, len(newScrapeConfigs.Children())) 139 } 140 if tt.secret != nil { 141 var newSecret corev1.Secret 142 err = client.Get(context.TODO(), types.NamespacedName{Namespace: vzconst.PrometheusOperatorNamespace, Name: vzconst.PromAdditionalScrapeConfigsSecretName}, &newSecret) 143 assert.NoError(err) 144 assert.False(strings.Contains(string(newSecret.Data[prometheusConfigKey]), createJobName(localMetricsBinding))) 145 } 146 }) 147 } 148 }