open-cluster-management.io/governance-policy-propagator@v0.13.0/test/e2e/case8_metrics_test.go (about)

     1  // Copyright Contributors to the Open Cluster Management project
     2  
     3  package e2e
     4  
     5  import (
     6  	"context"
     7  
     8  	. "github.com/onsi/ginkgo/v2"
     9  	. "github.com/onsi/gomega"
    10  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    11  
    12  	policiesv1 "open-cluster-management.io/governance-policy-propagator/api/v1"
    13  	"open-cluster-management.io/governance-policy-propagator/controllers/common"
    14  	"open-cluster-management.io/governance-policy-propagator/test/utils"
    15  )
    16  
    17  var _ = Describe("Test metrics appear locally", func() {
    18  	const (
    19  		case8PolicyName string = "case8-test-policy"
    20  		case8PolicyYaml string = "../resources/case8_metrics/case8-test-policy.yaml"
    21  	)
    22  
    23  	It("should report 0 for compliant root policy and replicated policies", func() {
    24  		By("Creating " + case8PolicyYaml)
    25  		utils.Kubectl("apply",
    26  			"-f", case8PolicyYaml,
    27  			"-n", testNamespace,
    28  			"--kubeconfig="+kubeconfigHub)
    29  		plc := utils.GetWithTimeout(
    30  			clientHubDynamic, gvrPolicy, case8PolicyName, testNamespace, true, defaultTimeoutSeconds,
    31  		)
    32  		Expect(plc).NotTo(BeNil())
    33  		By("Patching test-policy-plr with decision of cluster managed1 and managed2")
    34  		plr := utils.GetWithTimeout(
    35  			clientHubDynamic, gvrPlacementRule, case8PolicyName+"-plr", testNamespace, true, defaultTimeoutSeconds,
    36  		)
    37  		plr.Object["status"] = utils.GeneratePlrStatus("managed1", "managed2")
    38  		_, err := clientHubDynamic.Resource(gvrPlacementRule).Namespace(testNamespace).UpdateStatus(
    39  			context.TODO(), plr, metav1.UpdateOptions{},
    40  		)
    41  		Expect(err).ToNot(HaveOccurred())
    42  		plc = utils.GetWithTimeout(
    43  			clientHubDynamic, gvrPolicy, testNamespace+"."+case8PolicyName, "managed2", true, defaultTimeoutSeconds,
    44  		)
    45  		Expect(plc).ToNot(BeNil())
    46  		opt := metav1.ListOptions{LabelSelector: common.RootPolicyLabel + "=" + testNamespace + "." + case8PolicyName}
    47  		By("Patching both replicated policy status to compliant")
    48  		replicatedPlcList := utils.ListWithTimeout(clientHubDynamic, gvrPolicy, opt, 2, true, defaultTimeoutSeconds)
    49  		for _, replicatedPlc := range replicatedPlcList.Items {
    50  			replicatedPlc.Object["status"] = &policiesv1.PolicyStatus{
    51  				ComplianceState: policiesv1.Compliant,
    52  			}
    53  			_, err = clientHubDynamic.Resource(gvrPolicy).Namespace(replicatedPlc.GetNamespace()).UpdateStatus(
    54  				context.TODO(), &replicatedPlc, metav1.UpdateOptions{},
    55  			)
    56  			Expect(err).ToNot(HaveOccurred())
    57  		}
    58  		By("Checking the status of root policy")
    59  		yamlPlc := utils.ParseYaml("../resources/case8_metrics/managed-both-status-compliant.yaml")
    60  		Eventually(func() interface{} {
    61  			rootPlc := utils.GetWithTimeout(
    62  				clientHubDynamic, gvrPolicy, case8PolicyName, testNamespace, true, defaultTimeoutSeconds,
    63  			)
    64  
    65  			return rootPlc.Object["status"]
    66  		}, defaultTimeoutSeconds, 1).Should(utils.SemanticEqual(yamlPlc.Object["status"]))
    67  		By("Checking metric endpoint for root policy status")
    68  		Eventually(func() interface{} {
    69  			return utils.GetMetrics("policy_governance_info", `policy=\"case8-test-policy\"`, `type=\"root\"`)
    70  		}, defaultTimeoutSeconds, 1).Should(Equal([]string{"0"}))
    71  		By("Checking metric endpoint for managed1 replicated policy status")
    72  		Eventually(func() interface{} {
    73  			return utils.GetMetrics(
    74  				"policy_governance_info", `policy=\"case8-test-policy\"`, `cluster_namespace=\"managed1\",`,
    75  			)
    76  		}, defaultTimeoutSeconds, 1).Should(Equal([]string{"0"}))
    77  		By("Checking metric endpoint for managed2 replicated policy status")
    78  		Eventually(func() interface{} {
    79  			return utils.GetMetrics(
    80  				"policy_governance_info", `policy=\"case8-test-policy\"`, `cluster_namespace=\"managed2\",`,
    81  			)
    82  		}, defaultTimeoutSeconds, 1).Should(Equal([]string{"0"}))
    83  	})
    84  	It("should report 1 for noncompliant root policy and replicated policies", func() {
    85  		By("Patching both replicated policy status to noncompliant")
    86  		opt := metav1.ListOptions{LabelSelector: common.RootPolicyLabel + "=" + testNamespace + "." + case8PolicyName}
    87  		replicatedPlcList := utils.ListWithTimeout(clientHubDynamic, gvrPolicy, opt, 2, true, defaultTimeoutSeconds)
    88  		for _, replicatedPlc := range replicatedPlcList.Items {
    89  			replicatedPlc.Object["status"] = &policiesv1.PolicyStatus{
    90  				ComplianceState: policiesv1.NonCompliant,
    91  			}
    92  			_, err := clientHubDynamic.Resource(gvrPolicy).Namespace(replicatedPlc.GetNamespace()).UpdateStatus(
    93  				context.TODO(), &replicatedPlc, metav1.UpdateOptions{},
    94  			)
    95  			Expect(err).ToNot(HaveOccurred())
    96  		}
    97  		By("Checking the status of root policy")
    98  		yamlPlc := utils.ParseYaml("../resources/case8_metrics/managed-both-status-noncompliant.yaml")
    99  		Eventually(func() interface{} {
   100  			rootPlc := utils.GetWithTimeout(
   101  				clientHubDynamic, gvrPolicy, case8PolicyName, testNamespace, true, defaultTimeoutSeconds,
   102  			)
   103  
   104  			return rootPlc.Object["status"]
   105  		}, defaultTimeoutSeconds, 1).Should(utils.SemanticEqual(yamlPlc.Object["status"]))
   106  		By("Checking metric endpoint for root policy status")
   107  		Eventually(func() interface{} {
   108  			return utils.GetMetrics("policy_governance_info", `policy=\"case8-test-policy\"`, `type=\"root\"`)
   109  		}, defaultTimeoutSeconds, 1).Should(Equal([]string{"1"}))
   110  		By("Checking metric endpoint for managed1 replicated policy status")
   111  		Eventually(func() interface{} {
   112  			return utils.GetMetrics(
   113  				"policy_governance_info", `policy=\"case8-test-policy\"`, `cluster_namespace=\"managed1\",`,
   114  			)
   115  		}, defaultTimeoutSeconds, 1).Should(Equal([]string{"1"}))
   116  		By("Checking metric endpoint for managed2 replicated policy status")
   117  		Eventually(func() interface{} {
   118  			return utils.GetMetrics(
   119  				"policy_governance_info", `policy=\"case8-test-policy\"`, `cluster_namespace=\"managed2\",`,
   120  			)
   121  		}, defaultTimeoutSeconds, 1).Should(Equal([]string{"1"}))
   122  	})
   123  	It("should not report metrics for policies after they are deleted", func() {
   124  		By("Deleting the policy")
   125  		utils.Kubectl("delete",
   126  			"-f", case8PolicyYaml,
   127  			"-n", testNamespace,
   128  			"--kubeconfig="+kubeconfigHub)
   129  		opt := metav1.ListOptions{}
   130  		utils.ListWithTimeout(clientHubDynamic, gvrPolicy, opt, 0, false, 10)
   131  		By("Checking metric endpoint for root policy status")
   132  		Eventually(func() interface{} {
   133  			return utils.GetMetrics("policy_governance_info", `policy=\"case8-test-policy\"`, `type=\"root\"`)
   134  		}, defaultTimeoutSeconds, 1).Should(Equal([]string{}))
   135  		By("Checking metric endpoint for managed1 replicated policy status")
   136  		Eventually(func() interface{} {
   137  			return utils.GetMetrics(
   138  				"policy_governance_info", `policy=\"case8-test-policy\"`, `cluster_namespace=\"managed1\",`,
   139  			)
   140  		}, defaultTimeoutSeconds, 1).Should(Equal([]string{}))
   141  		By("Checking metric endpoint for managed2 replicated policy status")
   142  		Eventually(func() interface{} {
   143  			return utils.GetMetrics(
   144  				"policy_governance_info", `policy=\"case8-test-policy\"`, `cluster_namespace=\"managed2\",`,
   145  			)
   146  		}, defaultTimeoutSeconds, 1).Should(Equal([]string{}))
   147  	})
   148  })