// NewSampleRepoTest creates a function for a new ginkgo test case that will instantiate a template // from a url, kick off the buildconfig defined in that template, wait for the build/deploy, // and then confirm the application is serving an expected string value. func NewSampleRepoTest(c SampleRepoConfig) func() { return func() { defer g.GinkgoRecover() var oc = exutil.NewCLI(c.repoName+"-repo-test", exutil.KubeConfigPath()) g.JustBeforeEach(func() { g.By("Waiting for builder service account") err := exutil.WaitForBuilderAccount(oc.KubeREST().ServiceAccounts(oc.Namespace())) o.Expect(err).NotTo(o.HaveOccurred()) }) g.Describe("Building "+c.repoName+" app from new-app", func() { g.It(fmt.Sprintf("should build a "+c.repoName+" image and run it in a pod"), func() { oc.SetOutputDir(exutil.TestContext.OutputDir) g.By(fmt.Sprintf("calling oc new-app with the " + c.repoName + " example template")) err := oc.Run("new-app").Args("-f", c.templateURL).Execute() o.Expect(err).NotTo(o.HaveOccurred()) g.By("starting a build") buildName, err := oc.Run("start-build").Args(c.buildConfigName).Output() o.Expect(err).NotTo(o.HaveOccurred()) g.By("expecting the build is in the Complete phase") err = exutil.WaitForABuild(oc.REST().Builds(oc.Namespace()), buildName, exutil.CheckBuildSuccessFunc, exutil.CheckBuildFailedFunc) if err != nil { logs, _ := oc.Run("build-logs").Args(buildName).Output() e2e.Failf("build failed: %s", logs) } o.Expect(err).NotTo(o.HaveOccurred()) g.By("expecting the deployment to be complete") err = exutil.WaitForADeployment(oc.KubeREST().ReplicationControllers(oc.Namespace()), c.deploymentConfigName, exutil.CheckDeploymentCompletedFunc, exutil.CheckDeploymentFailedFunc) o.Expect(err).NotTo(o.HaveOccurred()) g.By("expecting the service is available") serviceIP, err := oc.Run("get").Args("service", c.serviceName).Template("{{ .spec.clusterIP }}").Output() o.Expect(err).NotTo(o.HaveOccurred()) o.Expect(serviceIP).ShouldNot(o.Equal("")) g.By("expecting an endpoint is available") err = oc.KubeFramework().WaitForAnEndpoint(c.serviceName) o.Expect(err).NotTo(o.HaveOccurred()) response, err := exutil.FetchURL("http://"+serviceIP+":8080"+c.appPath, time.Duration(10*time.Second)) o.Expect(err).NotTo(o.HaveOccurred()) o.Expect(response).Should(o.ContainSubstring(c.expectedString)) }) }) } }
g.By("obtaining the configured API server host from config") adminClientConfig, err := testutil.GetClusterAdminClientConfig(exutil.KubeConfigPath()) o.Expect(err).NotTo(o.HaveOccurred()) hostURL, err := url.Parse(adminClientConfig.Host) o.Expect(err).NotTo(o.HaveOccurred()) host, err := hostname(hostURL.Host) o.Expect(err).NotTo(o.HaveOccurred()) routeSuffix := fmt.Sprintf("%s.%s", host, hostNameSuffix) g.By(fmt.Sprintf("calling oc new-app -f %q -p ROUTE_SUFFIX=%s", gitServerYaml, routeSuffix)) err = oc.Run("new-app").Args("-f", gitServerYaml, "-p", fmt.Sprintf("ROUTE_SUFFIX=%s", routeSuffix)).Execute() o.Expect(err).NotTo(o.HaveOccurred()) g.By("expecting the deployment of the gitserver to be in the Complete phase") err = exutil.WaitForADeployment(oc.KubeREST().ReplicationControllers(oc.Namespace()), gitServerDeploymentConfigName, exutil.CheckDeploymentCompletedFn, exutil.CheckDeploymentFailedFn) o.Expect(err).NotTo(o.HaveOccurred()) sourceSecretName := secretFunc() sourceURL := fmt.Sprintf(urlTemplate, routeSuffix) g.By(fmt.Sprintf("creating a new BuildConfig by calling oc new-app -f %q -p SOURCE_SECRET=%s,SOURCE_URL=%s", testBuildFixture, sourceSecretName, sourceURL)) err = oc.Run("new-app").Args("-f", testBuildFixture, "-p", fmt.Sprintf("SOURCE_SECRET=%s,SOURCE_URL=%s", sourceSecretName, sourceURL)).Execute() o.Expect(err).NotTo(o.HaveOccurred()) g.By("starting a test build") buildName, err := oc.Run("start-build").Args(buildConfigName).Output() o.Expect(err).NotTo(o.HaveOccurred())
g.By("grant service account in jenkins container access to API") err = oc.Run("policy").Args("add-role-to-user", "edit", "system:serviceaccount:"+oc.Namespace()+":default", "-n", oc.Namespace()).Execute() o.Expect(err).NotTo(o.HaveOccurred()) g.By("build the Jenkins master") err = oc.Run("new-app").Args("--template", "jenkins-master").Execute() o.Expect(err).NotTo(o.HaveOccurred()) g.By("wait for the master to be built") err = wait.Poll(1*time.Second, 5*time.Minute, func() (bool, error) { return waitForBuildComplete("jenkins-master-1") }) o.Expect(err).NotTo(o.HaveOccurred()) g.By("wait for jenkins deployment") err = exutil.WaitForADeployment(oc.KubeREST().ReplicationControllers(oc.Namespace()), "jenkins", exutil.CheckDeploymentCompletedFn, exutil.CheckDeploymentFailedFn) o.Expect(err).NotTo(o.HaveOccurred()) g.By("get ip and port for jenkins service") serviceIP, err := oc.Run("get").Args("svc", "jenkins", "--config", exutil.KubeConfigPath()).Template("{{.spec.clusterIP}}").Output() o.Expect(err).NotTo(o.HaveOccurred()) o.Expect(serviceIP).NotTo(o.BeEmpty()) port, err := oc.Run("get").Args("svc", "jenkins", "--config", exutil.KubeConfigPath()).Template("{{ $x := index .spec.ports 0}}{{$x.port}}").Output() o.Expect(err).NotTo(o.HaveOccurred()) o.Expect(port).NotTo(o.BeEmpty()) jenkinsUri := fmt.Sprintf("http://%s:%s", serviceIP, port) g.By(fmt.Sprintf("wait for jenkins to come up at %q", jenkinsUri)) err = waitForJenkinsActivity(jenkinsUri, "", 200)