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 })