github.com/redhat-appstudio/e2e-tests@v0.0.0-20230619105049-9a422b2094d7/tests/release/e2e-test-default-with-deployment.go (about)

     1  package release
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"strings"
     7  
     8  	. "github.com/onsi/ginkgo/v2"
     9  	. "github.com/onsi/gomega"
    10  	appservice "github.com/redhat-appstudio/application-api/api/v1alpha1"
    11  	"github.com/redhat-appstudio/e2e-tests/pkg/constants"
    12  	"github.com/redhat-appstudio/e2e-tests/pkg/framework"
    13  	"github.com/redhat-appstudio/e2e-tests/pkg/utils"
    14  	"github.com/redhat-appstudio/e2e-tests/pkg/utils/release"
    15  	"github.com/redhat-appstudio/e2e-tests/pkg/utils/tekton"
    16  	releaseApi "github.com/redhat-appstudio/release-service/api/v1alpha1"
    17  	"gopkg.in/yaml.v2"
    18  	"knative.dev/pkg/apis"
    19  
    20  	ecp "github.com/enterprise-contract/enterprise-contract-controller/api/v1alpha1"
    21  	corev1 "k8s.io/api/core/v1"
    22  )
    23  
    24  var _ = framework.ReleaseSuiteDescribe("[HACBS-1199]test-release-e2e-with-deployment", Label("release", "withDeployment", "HACBS"), func() {
    25  	defer GinkgoRecover()
    26  	// Initialize the tests controllers
    27  	var fw *framework.Framework
    28  	var err error
    29  	var compName string
    30  	var devNamespace = utils.GetGeneratedNamespace("release-dev")
    31  	var managedNamespace = utils.GetGeneratedNamespace("release-managed")
    32  	var component *appservice.Component
    33  
    34  	BeforeAll(func() {
    35  		fw, err = framework.NewFramework("release-e2e-bundle")
    36  		Expect(err).NotTo(HaveOccurred())
    37  
    38  		kubeController := tekton.KubeController{
    39  			Commonctrl: *fw.AsKubeAdmin.CommonController,
    40  			Tektonctrl: *fw.AsKubeAdmin.TektonController,
    41  		}
    42  
    43  		_, err := fw.AsKubeAdmin.CommonController.CreateTestNamespace(devNamespace)
    44  		Expect(err).NotTo(HaveOccurred(), "Error when creating devNamespace: %v", err)
    45  		GinkgoWriter.Println("Dev Namespace created: %s ", devNamespace)
    46  
    47  		_, err = fw.AsKubeAdmin.CommonController.CreateTestNamespace(managedNamespace)
    48  		Expect(err).NotTo(HaveOccurred(), "Error when creating managedNamespace: %v", err)
    49  		GinkgoWriter.Println("Managed Namespace created: %s ", managedNamespace)
    50  
    51  		sourceAuthJson := utils.GetEnv("QUAY_TOKEN", "")
    52  		Expect(sourceAuthJson).ToNot(BeEmpty())
    53  
    54  		_, err = fw.AsKubeAdmin.CommonController.CreateRegistryAuthSecret(hacbsReleaseTestsTokenSecret, devNamespace, sourceAuthJson)
    55  		Expect(err).ToNot(HaveOccurred())
    56  
    57  		_, err = fw.AsKubeAdmin.CommonController.CreateRegistryAuthSecret(redhatAppstudioUserSecret, managedNamespace, sourceAuthJson)
    58  		Expect(err).ToNot(HaveOccurred())
    59  
    60  		err = fw.AsKubeAdmin.CommonController.LinkSecretToServiceAccount(devNamespace, hacbsReleaseTestsTokenSecret, serviceAccount, true)
    61  		Expect(err).ToNot(HaveOccurred())
    62  
    63  		publicKey, err := kubeController.GetTektonChainsPublicKey()
    64  		Expect(err).ToNot(HaveOccurred())
    65  
    66  		Expect(kubeController.CreateOrUpdateSigningSecret(
    67  			publicKey, publicSecretNameAuth, managedNamespace)).To(Succeed())
    68  
    69  		defaultEcPolicy, err := kubeController.GetEnterpriseContractPolicy("default", "enterprise-contract-service")
    70  		Expect(err).NotTo(HaveOccurred())
    71  
    72  		defaultEcPolicySpec := ecp.EnterpriseContractPolicySpec{
    73  			Description: "Red Hat's enterprise requirements",
    74  			PublicKey:   string(publicKey),
    75  			Sources:     defaultEcPolicy.Spec.Sources,
    76  			Configuration: &ecp.EnterpriseContractPolicyConfiguration{
    77  				Collections: []string{"minimal"},
    78  				Exclude:     []string{"cve"},
    79  			},
    80  		}
    81  
    82  		// using cdq since git ref is not known
    83  		compName = componentName
    84  		var componentDetected appservice.ComponentDetectionDescription
    85  		cdq, err := fw.AsKubeAdmin.HasController.CreateComponentDetectionQuery(compName, devNamespace, gitSourceComponentUrl, "", "", "", false)
    86  		Expect(err).NotTo(HaveOccurred())
    87  		Expect(len(cdq.Status.ComponentDetected)).To(Equal(1), "Expected length of the detected Components was not 1")
    88  
    89  		for _, compDetected := range cdq.Status.ComponentDetected {
    90  			compName = compDetected.ComponentStub.ComponentName
    91  			componentDetected = compDetected
    92  		}
    93  
    94  		_, err = fw.AsKubeAdmin.ReleaseController.CreateReleasePlan(sourceReleasePlanName, devNamespace, applicationNameDefault, managedNamespace, "")
    95  		Expect(err).NotTo(HaveOccurred())
    96  
    97  		components := []release.Component{{Name: compName, Repository: releasedImagePushRepo}}
    98  		sc := fw.AsKubeAdmin.ReleaseController.GenerateReleaseStrategyConfig(components)
    99  		scYaml, err := yaml.Marshal(sc)
   100  		Expect(err).ShouldNot(HaveOccurred())
   101  
   102  		scPath := "release-default-with-deployment.yaml"
   103  		Expect(fw.AsKubeAdmin.CommonController.Github.CreateRef("strategy-configs", "main", compName)).To(Succeed())
   104  		_, err = fw.AsKubeAdmin.CommonController.Github.CreateFile("strategy-configs", scPath, string(scYaml), compName)
   105  		Expect(err).ShouldNot(HaveOccurred())
   106  
   107  		_, err = fw.AsKubeAdmin.ReleaseController.CreateReleaseStrategy("mvp-deploy-strategy", managedNamespace, "deploy-release", "quay.io/hacbs-release/pipeline-deploy-release:0.3", releaseStrategyPolicyDefault, releaseStrategyServiceAccountDefault, []releaseApi.Params{
   108  			{Name: "extraConfigGitUrl", Value: fmt.Sprintf("https://github.com/%s/strategy-configs.git", utils.GetEnv(constants.GITHUB_E2E_ORGANIZATION_ENV, "redhat-appstudio-qe"))},
   109  			{Name: "extraConfigPath", Value: scPath},
   110  			{Name: "extraConfigGitRevision", Value: compName},
   111  		})
   112  		Expect(err).NotTo(HaveOccurred())
   113  
   114  		_, err = fw.AsKubeAdmin.GitOpsController.CreateEnvironment(releaseEnvironment, managedNamespace)
   115  		Expect(err).NotTo(HaveOccurred())
   116  
   117  		_, err = fw.AsKubeAdmin.ReleaseController.CreateReleasePlanAdmission(targetReleasePlanAdmissionName, devNamespace, applicationNameDefault, managedNamespace, releaseEnvironment, "", "mvp-deploy-strategy")
   118  		Expect(err).NotTo(HaveOccurred())
   119  
   120  		_, err = fw.AsKubeAdmin.TektonController.CreateEnterpriseContractPolicy(releaseStrategyPolicyDefault, managedNamespace, defaultEcPolicySpec)
   121  		Expect(err).NotTo(HaveOccurred())
   122  
   123  		_, err = fw.AsKubeAdmin.TektonController.CreatePVCInAccessMode(releasePvcName, managedNamespace, corev1.ReadWriteOnce)
   124  		Expect(err).NotTo(HaveOccurred())
   125  
   126  		_, err = fw.AsKubeAdmin.CommonController.CreateServiceAccount(releaseStrategyServiceAccountDefault, managedNamespace, managednamespaceSecret)
   127  		Expect(err).NotTo(HaveOccurred())
   128  
   129  		_, err = fw.AsKubeAdmin.CommonController.CreateRole("role-release-service-account", managedNamespace, map[string][]string{
   130  			"apiGroupsList": {""},
   131  			"roleResources": {"secrets"},
   132  			"roleVerbs":     {"get", "list", "watch"},
   133  		})
   134  		Expect(err).NotTo(HaveOccurred())
   135  
   136  		_, err = fw.AsKubeAdmin.CommonController.CreateRoleBinding("role-release-service-account-binding", managedNamespace, "ServiceAccount", releaseStrategyServiceAccountDefault, "Role", "role-release-service-account", "rbac.authorization.k8s.io")
   137  		Expect(err).NotTo(HaveOccurred())
   138  
   139  		_, err = fw.AsKubeAdmin.HasController.CreateHasApplication(applicationNameDefault, devNamespace)
   140  		Expect(err).NotTo(HaveOccurred())
   141  
   142  		component, err = fw.AsKubeAdmin.HasController.CreateComponentFromStub(componentDetected, devNamespace, "", "", applicationNameDefault)
   143  		Expect(err).NotTo(HaveOccurred())
   144  
   145  		workingDir, err := os.Getwd()
   146  		if err != nil {
   147  			GinkgoWriter.Printf(err.Error())
   148  		}
   149  
   150  		// Download copy-applications.sh script from release-utils repo
   151  		args := []string{"https://raw.githubusercontent.com/hacbs-release/release-utils/main/copy-application.sh", "-o", "copy-application.sh"}
   152  		err = utils.ExecuteCommandInASpecificDirectory("curl", args, workingDir)
   153  		Expect(err).NotTo(HaveOccurred())
   154  
   155  		args = []string{"775", "copy-application.sh"}
   156  		err = utils.ExecuteCommandInASpecificDirectory("chmod", args, workingDir)
   157  		Expect(err).NotTo(HaveOccurred())
   158  
   159  		// Copying application in dev namespace to managed namespace
   160  		args = []string{managedNamespace, "-a", devNamespace + "/" + applicationNameDefault}
   161  		err = utils.ExecuteCommandInASpecificDirectory("./copy-application.sh", args, workingDir)
   162  		Expect(err).NotTo(HaveOccurred())
   163  
   164  	})
   165  
   166  	AfterAll(func() {
   167  		err = fw.AsKubeAdmin.CommonController.Github.DeleteRef("strategy-configs", compName)
   168  		if err != nil {
   169  			Expect(err.Error()).To(ContainSubstring("Reference does not exist"))
   170  		}
   171  		// TODO: Uncomment this lines once: https://issues.redhat.com/browse/RHTAPBUGS-409 is solved
   172  		/*if !CurrentSpecReport().Failed() {
   173  			Expect(fw.AsKubeAdmin.CommonController.DeleteNamespace(devNamespace)).NotTo(HaveOccurred())
   174  			Expect(fw.AsKubeAdmin.CommonController.DeleteNamespace(managedNamespace)).NotTo(HaveOccurred())
   175  		}*/
   176  	})
   177  
   178  	var _ = Describe("Post-release verification", func() {
   179  
   180  		It("verifies that a build PipelineRun is created in dev namespace and succeeds", func() {
   181  			Expect(fw.AsKubeAdmin.HasController.WaitForComponentPipelineToBeFinished(component, "", 2)).To(Succeed())
   182  		})
   183  
   184  		It("verifies that in managed namespace will be created a PipelineRun.", func() {
   185  			Eventually(func() bool {
   186  				prList, err := fw.AsKubeAdmin.TektonController.ListAllPipelineRuns(managedNamespace)
   187  				if err != nil || prList == nil || len(prList.Items) < 1 {
   188  					return false
   189  				}
   190  
   191  				return strings.Contains(prList.Items[0].Name, "release")
   192  			}, releasePipelineRunCreationTimeout, defaultInterval).Should(BeTrue())
   193  		})
   194  
   195  		It("verifies a PipelineRun started in managed namespace succeeded.", func() {
   196  			Eventually(func() bool {
   197  				prList, err := fw.AsKubeAdmin.TektonController.ListAllPipelineRuns(managedNamespace)
   198  				if prList == nil || err != nil || len(prList.Items) < 1 {
   199  					return false
   200  				}
   201  
   202  				return prList.Items[0].HasStarted() && prList.Items[0].IsDone() && prList.Items[0].Status.GetCondition(apis.ConditionSucceeded).IsTrue()
   203  			}, releasePipelineRunCompletionTimeout, defaultInterval).Should(BeTrue())
   204  		})
   205  
   206  		It("tests a Release should have been created in the dev namespace and succeeded.", func() {
   207  			Eventually(func() bool {
   208  				releaseCreated, err := fw.AsKubeAdmin.ReleaseController.GetFirstReleaseInNamespace(devNamespace)
   209  				if releaseCreated == nil || err != nil {
   210  					return false
   211  				}
   212  
   213  				return releaseCreated.IsReleased()
   214  			}, releaseCreationTimeout, defaultInterval).Should(BeTrue())
   215  		})
   216  	})
   217  
   218  	It("tests a Release should report the deployment was successful.", func() {
   219  		Eventually(func() bool {
   220  			releaseCreated, err := fw.AsKubeAdmin.ReleaseController.GetFirstReleaseInNamespace(devNamespace)
   221  			if releaseCreated == nil || err != nil || len(releaseCreated.Status.Conditions) < 2 {
   222  				return false
   223  			}
   224  
   225  			return releaseCreated.IsDeployed()
   226  		}, releaseCreationTimeout, defaultInterval).Should(BeTrue())
   227  	})
   228  })