github.com/redhat-appstudio/e2e-tests@v0.0.0-20240520140907-9709f6f59323/tests/release/service/happy_path.go (about)

     1  package service
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  
     7  	tektonutils "github.com/redhat-appstudio/release-service/tekton/utils"
     8  	"k8s.io/apimachinery/pkg/runtime"
     9  
    10  	ecp "github.com/enterprise-contract/enterprise-contract-controller/api/v1alpha1"
    11  	. "github.com/onsi/ginkgo/v2"
    12  	. "github.com/onsi/gomega"
    13  	appservice "github.com/redhat-appstudio/application-api/api/v1alpha1"
    14  	"github.com/redhat-appstudio/e2e-tests/pkg/clients/has"
    15  	"github.com/redhat-appstudio/e2e-tests/pkg/constants"
    16  	"github.com/redhat-appstudio/e2e-tests/pkg/framework"
    17  	"github.com/redhat-appstudio/e2e-tests/pkg/utils"
    18  	"github.com/redhat-appstudio/e2e-tests/pkg/utils/contract"
    19  	"github.com/redhat-appstudio/e2e-tests/pkg/utils/tekton"
    20  	releasecommon "github.com/redhat-appstudio/e2e-tests/tests/release"
    21  	releaseApi "github.com/redhat-appstudio/release-service/api/v1alpha1"
    22  	corev1 "k8s.io/api/core/v1"
    23  )
    24  
    25  var _ = framework.ReleaseServiceSuiteDescribe("Release service happy path", Label("release-service", "happy-path", "HACBS"), func() {
    26  	defer GinkgoRecover()
    27  
    28  	var fw *framework.Framework
    29  	AfterEach(framework.ReportFailure(&fw))
    30  	var err error
    31  	var compName string
    32  	var devNamespace, managedNamespace string
    33  	var verifyEnterpriseContractTaskName = "verify-enterprise-contract"
    34  	var releasedImagePushRepo = "quay.io/redhat-appstudio-qe/dcmetromap"
    35  
    36  	var component *appservice.Component
    37  	var releaseCR *releaseApi.Release
    38  
    39  	BeforeAll(func() {
    40  		// Initialize the tests controllers
    41  		fw, err = framework.NewFramework(utils.GetGeneratedNamespace("happy-path"))
    42  		Expect(err).NotTo(HaveOccurred())
    43  		devNamespace = fw.UserNamespace
    44  		managedNamespace = utils.GetGeneratedNamespace("happy-path-managed")
    45  		_, err = fw.AsKubeAdmin.CommonController.CreateTestNamespace(managedNamespace)
    46  		Expect(err).NotTo(HaveOccurred(), "Error when creating managedNamespace: %v", err)
    47  
    48  		sourceAuthJson := utils.GetEnv("QUAY_TOKEN", "")
    49  		Expect(sourceAuthJson).ToNot(BeEmpty())
    50  
    51  		managedServiceAccount, err := fw.AsKubeAdmin.CommonController.CreateServiceAccount(releasecommon.ReleasePipelineServiceAccountDefault, managedNamespace, releasecommon.ManagednamespaceSecret, nil)
    52  		Expect(err).NotTo(HaveOccurred())
    53  
    54  		_, err = fw.AsKubeAdmin.ReleaseController.CreateReleasePipelineRoleBindingForServiceAccount(managedNamespace, managedServiceAccount)
    55  		Expect(err).NotTo(HaveOccurred())
    56  
    57  		_, err = fw.AsKubeAdmin.CommonController.CreateRegistryAuthSecret(releasecommon.RedhatAppstudioUserSecret, managedNamespace, sourceAuthJson)
    58  		Expect(err).ToNot(HaveOccurred())
    59  
    60  		err = fw.AsKubeAdmin.CommonController.LinkSecretToServiceAccount(devNamespace, releasecommon.HacbsReleaseTestsTokenSecret, constants.DefaultPipelineServiceAccount, true)
    61  		Expect(err).ToNot(HaveOccurred())
    62  
    63  		err = fw.AsKubeAdmin.CommonController.LinkSecretToServiceAccount(managedNamespace, releasecommon.RedhatAppstudioUserSecret, constants.DefaultPipelineServiceAccount, true)
    64  		Expect(err).ToNot(HaveOccurred())
    65  
    66  		publicKey, err := fw.AsKubeAdmin.TektonController.GetTektonChainsPublicKey()
    67  		Expect(err).ToNot(HaveOccurred())
    68  		Expect(fw.AsKubeAdmin.TektonController.CreateOrUpdateSigningSecret(
    69  			publicKey, releasecommon.PublicSecretNameAuth, managedNamespace)).To(Succeed())
    70  
    71  		defaultECP, err := fw.AsKubeAdmin.TektonController.GetEnterpriseContractPolicy("default", "enterprise-contract-service")
    72  		Expect(err).NotTo(HaveOccurred())
    73  		policy := contract.PolicySpecWithSourceConfig(defaultECP.Spec, ecp.SourceConfig{Include: []string{"@minimal"}, Exclude: []string{"cve"}})
    74  
    75  		// using cdq since git ref is not known
    76  		var componentDetected appservice.ComponentDetectionDescription
    77  		cdq, err := fw.AsKubeAdmin.HasController.CreateComponentDetectionQuery(releasecommon.ComponentName, devNamespace, releasecommon.GitSourceComponentUrl, "", "", "", false)
    78  		Expect(err).NotTo(HaveOccurred())
    79  		Expect(cdq.Status.ComponentDetected).To(HaveLen(1), "Expected length of the detected Components was not 1")
    80  
    81  		for _, compDetected := range cdq.Status.ComponentDetected {
    82  			compName = compDetected.ComponentStub.ComponentName
    83  			componentDetected = compDetected
    84  		}
    85  
    86  		_, err = fw.AsKubeAdmin.HasController.CreateApplication(releasecommon.ApplicationNameDefault, devNamespace)
    87  		Expect(err).NotTo(HaveOccurred())
    88  
    89  		component, err = fw.AsKubeAdmin.HasController.CreateComponent(componentDetected.ComponentStub, devNamespace, "", "", releasecommon.ApplicationNameDefault, false, map[string]string{})
    90  		Expect(err).NotTo(HaveOccurred())
    91  
    92  		_, err = fw.AsKubeAdmin.ReleaseController.CreateReleasePlan(releasecommon.SourceReleasePlanName, devNamespace, releasecommon.ApplicationNameDefault, managedNamespace, "", nil)
    93  		Expect(err).NotTo(HaveOccurred())
    94  
    95  		data, err := json.Marshal(map[string]interface{}{
    96  			"mapping": map[string]interface{}{
    97  				"components": []map[string]interface{}{
    98  					{
    99  						"component":  compName,
   100  						"repository": releasedImagePushRepo,
   101  					},
   102  				},
   103  			},
   104  		})
   105  		Expect(err).NotTo(HaveOccurred())
   106  
   107  		_, err = fw.AsKubeAdmin.ReleaseController.CreateReleasePlanAdmission(releasecommon.TargetReleasePlanAdmissionName, managedNamespace, "", devNamespace, releasecommon.ReleaseStrategyPolicyDefault, releasecommon.ReleasePipelineServiceAccountDefault, []string{releasecommon.ApplicationNameDefault}, true, &tektonutils.PipelineRef{
   108  			Resolver: "git",
   109  			Params: []tektonutils.Param{
   110  				{Name: "url", Value: releasecommon.RelSvcCatalogURL},
   111  				{Name: "revision", Value: releasecommon.RelSvcCatalogRevision},
   112  				{Name: "pathInRepo", Value: "pipelines/e2e/e2e.yaml"},
   113  			},
   114  		}, &runtime.RawExtension{
   115  			Raw: data,
   116  		})
   117  		Expect(err).NotTo(HaveOccurred())
   118  
   119  		_, err = fw.AsKubeAdmin.TektonController.CreateEnterpriseContractPolicy(releasecommon.ReleaseStrategyPolicyDefault, managedNamespace, policy)
   120  		Expect(err).NotTo(HaveOccurred())
   121  
   122  		_, err = fw.AsKubeAdmin.TektonController.CreatePVCInAccessMode(releasecommon.ReleasePvcName, managedNamespace, corev1.ReadWriteOnce)
   123  		Expect(err).NotTo(HaveOccurred())
   124  
   125  		_, err = fw.AsKubeAdmin.CommonController.CreateRole("role-release-service-account", managedNamespace, map[string][]string{
   126  			"apiGroupsList": {""},
   127  			"roleResources": {"secrets"},
   128  			"roleVerbs":     {"get", "list", "watch"},
   129  		})
   130  		Expect(err).NotTo(HaveOccurred())
   131  
   132  		_, err = fw.AsKubeAdmin.CommonController.CreateRoleBinding("role-release-service-account-binding", managedNamespace, "ServiceAccount", releasecommon.ReleasePipelineServiceAccountDefault, managedNamespace, "Role", "role-release-service-account", "rbac.authorization.k8s.io")
   133  		Expect(err).NotTo(HaveOccurred())
   134  	})
   135  
   136  	AfterAll(func() {
   137  		if !CurrentSpecReport().Failed() {
   138  			Expect(fw.AsKubeAdmin.CommonController.DeleteNamespace(managedNamespace)).NotTo(HaveOccurred())
   139  			Expect(fw.SandboxController.DeleteUserSignup(fw.UserName)).To(BeTrue())
   140  		}
   141  	})
   142  
   143  	var _ = Describe("Post-release verification", func() {
   144  		It("verifies that a build PipelineRun is created in dev namespace and succeeds", func() {
   145  			Expect(fw.AsKubeAdmin.HasController.WaitForComponentPipelineToBeFinished(component, "",
   146  				fw.AsKubeAdmin.TektonController, &has.RetryOptions{Retries: 2, Always: true}, nil)).To(Succeed())
   147  		})
   148  
   149  		It("verifies that a Release CR should have been created in the dev namespace", func() {
   150  			Eventually(func() error {
   151  				releaseCR, err = fw.AsKubeAdmin.ReleaseController.GetFirstReleaseInNamespace(devNamespace)
   152  				return err
   153  			}, releasecommon.ReleaseCreationTimeout, releasecommon.DefaultInterval).Should(Succeed())
   154  		})
   155  
   156  		It("verifies that Release PipelineRun is triggered", func() {
   157  			Eventually(func() error {
   158  				pr, err := fw.AsKubeAdmin.ReleaseController.GetPipelineRunInNamespace(managedNamespace, releaseCR.GetName(), releaseCR.GetNamespace())
   159  				if err != nil {
   160  					GinkgoWriter.Printf("release pipelineRun for release '%s' in namespace '%s' not created yet: %+v\n", releaseCR.GetName(), releaseCR.GetNamespace(), err)
   161  					return err
   162  				}
   163  				if !pr.HasStarted() {
   164  					return fmt.Errorf("pipelinerun %s/%s hasn't started yet", pr.GetNamespace(), pr.GetName())
   165  				}
   166  				return nil
   167  			}, releasecommon.ReleasePipelineRunCreationTimeout, releasecommon.DefaultInterval).Should(Succeed(), fmt.Sprintf("timed out waiting for a pipelinerun to start for a release %s/%s", releaseCR.GetName(), releaseCR.GetNamespace()))
   168  		})
   169  
   170  		It("verifies that Release PipelineRun should eventually succeed", func() {
   171  			Eventually(func() error {
   172  				pr, err := fw.AsKubeAdmin.ReleaseController.GetPipelineRunInNamespace(managedNamespace, releaseCR.GetName(), releaseCR.GetNamespace())
   173  				Expect(err).ShouldNot(HaveOccurred())
   174  				if !pr.IsDone() {
   175  					return fmt.Errorf("release pipelinerun %s/%s did not finish yet", pr.GetNamespace(), pr.GetName())
   176  				}
   177  				Expect(tekton.HasPipelineRunSucceeded(pr)).To(BeTrue(), fmt.Sprintf("release pipelinerun %s/%s did not succeed", pr.GetNamespace(), pr.GetName()))
   178  				return nil
   179  			}, releasecommon.ReleasePipelineRunCompletionTimeout, releasecommon.DefaultInterval).Should(Succeed())
   180  		})
   181  
   182  		It("verifies that Enterprise Contract Task has succeeded in the Release PipelineRun", func() {
   183  			Eventually(func() error {
   184  				pr, err := fw.AsKubeAdmin.ReleaseController.GetPipelineRunInNamespace(managedNamespace, releaseCR.GetName(), releaseCR.GetNamespace())
   185  				Expect(err).ShouldNot(HaveOccurred())
   186  				ecTaskRunStatus, err := fw.AsKubeAdmin.TektonController.GetTaskRunStatus(fw.AsKubeAdmin.CommonController.KubeRest(), pr, verifyEnterpriseContractTaskName)
   187  				Expect(err).ShouldNot(HaveOccurred())
   188  				GinkgoWriter.Printf("the status of the %s TaskRun on the release pipeline is: %v", verifyEnterpriseContractTaskName, ecTaskRunStatus.Status.Conditions)
   189  				Expect(tekton.DidTaskSucceed(ecTaskRunStatus)).To(BeTrue())
   190  				return nil
   191  			}, releasecommon.ReleasePipelineRunCompletionTimeout, releasecommon.DefaultInterval).Should(Succeed())
   192  		})
   193  
   194  		It("verifies that a Release is marked as succeeded.", func() {
   195  			Eventually(func() error {
   196  				releaseCR, err = fw.AsKubeAdmin.ReleaseController.GetFirstReleaseInNamespace(devNamespace)
   197  				if err != nil {
   198  					return err
   199  				}
   200  				if !releaseCR.IsReleased() {
   201  					return fmt.Errorf("release %s/%s is not marked as finished yet", releaseCR.GetNamespace(), releaseCR.GetName())
   202  				}
   203  				return nil
   204  			}, releasecommon.ReleaseCreationTimeout, releasecommon.DefaultInterval).Should(Succeed())
   205  		})
   206  	})
   207  })