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  }