func (b ServiceBroker) Destroy() { workflowhelpers.AsUser(b.TestSetup.AdminUserContext(), Config.DefaultTimeoutDuration(), func() { Expect(cf.Cf("purge-service-offering", b.Service.Name, "-f").Wait(Config.DefaultTimeoutDuration())).To(Exit(0)) }) b.Delete() Expect(cf.Cf("delete", b.Name, "-f", "-r").Wait(Config.DefaultTimeoutDuration())).To(Exit(0)) }
func (b ServiceBroker) PublicizePlan(url string) { jsonMap := make(map[string]bool) jsonMap["public"] = true planJson, _ := json.Marshal(jsonMap) workflowhelpers.AsUser(b.TestSetup.AdminUserContext(), Config.DefaultTimeoutDuration(), func() { Expect(cf.Cf("curl", url, "-X", "PUT", "-d", string(planJson)).Wait(Config.DefaultTimeoutDuration())).To(Exit(0)) }) }
func (b ServiceBroker) Delete() { workflowhelpers.AsUser(b.TestSetup.AdminUserContext(), Config.DefaultTimeoutDuration(), func() { Expect(cf.Cf("delete-service-broker", b.Name, "-f").Wait(Config.DefaultTimeoutDuration())).To(Exit(0)) brokers := cf.Cf("service-brokers").Wait(Config.DefaultTimeoutDuration()) Expect(brokers).To(Exit(0)) Expect(brokers.Out.Contents()).ToNot(ContainSubstring(b.Name)) }) }
func LastPageUsageEvents(TestSetup *workflowhelpers.ReproducibleTestSuiteSetup) []AppUsageEvent { var response AppUsageEvents workflowhelpers.AsUser(TestSetup.AdminUserContext(), Config.DefaultTimeoutDuration(), func() { workflowhelpers.ApiRequest("GET", "/v2/app_usage_events?order-direction=desc&page=1", &response, Config.DefaultTimeoutDuration()) }) return response.Resources }
func createDummyBuildpack() string { buildpack := random_name.CATSRandomName("BPK") buildpackZip := assets.NewAssets().SecurityGroupBuildpack workflowhelpers.AsUser(TestSetup.AdminUserContext(), Config.DefaultTimeoutDuration(), func() { Expect(cf.Cf("create-buildpack", buildpack, buildpackZip, "999").Wait(Config.DefaultTimeoutDuration())).To(Exit(0)) }) return buildpack }
func createSecurityGroup(allowedDestinations ...Destination) string { file, _ := ioutil.TempFile(os.TempDir(), "CATS-sg-rules") defer os.Remove(file.Name()) Expect(json.NewEncoder(file).Encode(allowedDestinations)).To(Succeed()) rulesPath := file.Name() securityGroupName := random_name.CATSRandomName("SG") workflowhelpers.AsUser(TestSetup.AdminUserContext(), Config.DefaultTimeoutDuration(), func() { Expect(cf.Cf("create-security-group", securityGroupName, rulesPath).Wait(Config.DefaultTimeoutDuration())).To(Exit(0)) }) return securityGroupName }
func lastAppUsageEvent(appName string, state string) (bool, AppUsageEvent) { var response AppUsageEvents workflowhelpers.AsUser(TestSetup.AdminUserContext(), Config.DefaultTimeoutDuration(), func() { workflowhelpers.ApiRequest("GET", "/v2/app_usage_events?order-direction=desc&page=1&results-per-page=150", &response, Config.DefaultTimeoutDuration()) }) for _, event := range response.Resources { if event.Entity.AppName == appName && event.Entity.State == state { return true, event } } return false, AppUsageEvent{} }
func createServiceBroker(brokerName, brokerAppName, serviceName string) { serviceBrokerAsset := assets.NewAssets().ServiceBroker PushApp(brokerAppName, serviceBrokerAsset, Config.GetRubyBuildpackName(), Config.GetAppsDomain(), Config.CfPushTimeoutDuration(), DEFAULT_MEMORY_LIMIT) initiateBrokerConfig(serviceName, brokerAppName) brokerUrl := helpers.AppUri(brokerAppName, "", Config) workflowhelpers.AsUser(TestSetup.AdminUserContext(), TestSetup.ShortTimeout(), func() { session := cf.Cf("create-service-broker", brokerName, "user", "password", brokerUrl) Expect(session.Wait(Config.DefaultTimeoutDuration())).To(Exit(0)) session = cf.Cf("enable-service-access", serviceName) Expect(session.Wait(Config.DefaultTimeoutDuration())).To(Exit(0)) }) }
func getCfHomeConfig() *cfHomeConfig { myCfHomeConfig := &cfHomeConfig{} workflowhelpers.AsUser(TestSetup.AdminUserContext(), Config.DefaultTimeoutDuration(), func() { path := filepath.Join(os.Getenv("CF_HOME"), ".cf", "config.json") configFile, err := os.Open(path) if err != nil { panic(err) } decoder := json.NewDecoder(configFile) err = decoder.Decode(myCfHomeConfig) if err != nil { panic(err) } }) return myCfHomeConfig }
func (b ServiceBroker) PublicizePlans() { url := fmt.Sprintf("/v2/services?inline-relations-depth=1&q=label:%s", b.Service.Name) var session *Session workflowhelpers.AsUser(b.TestSetup.AdminUserContext(), Config.DefaultTimeoutDuration(), func() { session = cf.Cf("curl", url).Wait(Config.DefaultTimeoutDuration()) Expect(session).To(Exit(0)) }) structure := ServicesResponse{} json.Unmarshal(session.Out.Contents(), &structure) for _, service := range structure.Resources { if service.Entity.Label == b.Service.Name { for _, plan := range service.Entity.ServicePlans { if b.HasPlan(plan.Entity.Name) { b.PublicizePlan(plan.Metadata.Url) } } } } }
func unbindSecurityGroup(securityGroupName, orgName, spaceName string) { By("Unapplying security group") workflowhelpers.AsUser(TestSetup.AdminUserContext(), Config.DefaultTimeoutDuration(), func() { Expect(cf.Cf("unbind-security-group", securityGroupName, orgName, spaceName).Wait(Config.DefaultTimeoutDuration())).To(Exit(0)) }) }
workflowhelpers.AsUser(TestSetup.AdminUserContext(), Config.DefaultTimeoutDuration(), func() { BuildpackName = CATSRandomName("BPK") appName = CATSRandomName("APP") var err error tmpdir, err = ioutil.TempDir("", "stack") Expect(err).ToNot(HaveOccurred()) appPath, err = ioutil.TempDir(tmpdir, "matching-app") Expect(err).ToNot(HaveOccurred()) buildpackPath, err = ioutil.TempDir(tmpdir, "matching-buildpack") Expect(err).ToNot(HaveOccurred()) buildpackArchivePath = path.Join(buildpackPath, "buildpack.zip") archive_helpers.CreateZipArchive(buildpackArchivePath, []archive_helpers.ArchiveFile{ { Name: "bin/compile", Body: `#!/usr/bin/env bash sleep 5 cat /etc/lsb-release sleep 10 `, }, { Name: "bin/detect", Body: fmt.Sprintf(`#!/bin/bash if [ -f "${1}/%s" ]; then echo Simple else echo no exit 1 fi `, matchingFilename(appName)), }, { Name: "bin/release", Body: `#!/usr/bin/env bash cat <<EOF --- config_vars: PATH: bin:/usr/local/bin:/usr/bin:/bin FROM_BUILD_PACK: "yes" default_process_types: web: while true; do { echo -e 'HTTP/1.1 200 OK\r\n'; echo -e "\$(cat /etc/lsb-release)"; } | nc -l \$PORT; done EOF `, }, }) _, err = os.Create(path.Join(appPath, matchingFilename(appName))) Expect(err).ToNot(HaveOccurred()) _, err = os.Create(path.Join(appPath, "some-file")) Expect(err).ToNot(HaveOccurred()) createBuildpack := cf.Cf("create-buildpack", BuildpackName, buildpackArchivePath, "0").Wait(Config.DefaultTimeoutDuration()) Expect(createBuildpack).Should(Exit(0)) Expect(createBuildpack).Should(Say("Creating")) Expect(createBuildpack).Should(Say("OK")) Expect(createBuildpack).Should(Say("Uploading")) Expect(createBuildpack).Should(Say("OK")) })
func deleteBuildpack(buildpack string) { workflowhelpers.AsUser(TestSetup.AdminUserContext(), Config.DefaultTimeoutDuration(), func() { Expect(cf.Cf("delete-buildpack", buildpack, "-f").Wait(Config.DefaultTimeoutDuration())).To(Exit(0)) }) }
var output []byte var oldServiceName string var oldPlanName string BeforeEach(func() { broker = NewServiceBroker( random_name.CATSRandomName("BRKR"), assets.NewAssets().ServiceBroker, TestSetup, ) TestSetup.RegularUserContext().TargetSpace() broker.Push(Config) broker.Configure() workflowhelpers.AsUser(TestSetup.AdminUserContext(), TestSetup.ShortTimeout(), func() { broker.Create() }) }) Describe("Updating the catalog", func() { BeforeEach(func() { broker.PublicizePlans() }) It("updates the broker and sees catalog changes", func() { // Confirming plans show up in the marketplace for regular user plans := cf.Cf("marketplace").Wait(Config.DefaultTimeoutDuration()) Expect(plans).To(Exit(0)) Expect(plans).To(Say(broker.Service.Name)) Expect(plans).To(Say(broker.SyncPlans[0].Name))
}, { Name: "bin/release", Body: `#!/usr/bin/env bash exit 1 `, }, }) return buildpackArchivePath } var fetchEnvironmentVariables = func(groupType string) map[string]string { var session *Session workflowhelpers.AsUser(TestSetup.AdminUserContext(), Config.DefaultTimeoutDuration(), func() { session = cf.Cf("curl", fmt.Sprintf("/v2/config/environment_variable_groups/%s", groupType)).Wait(Config.DefaultTimeoutDuration()) Expect(session).To(Exit(0)) }) var envMap map[string]string err := json.Unmarshal(session.Out.Contents(), &envMap) Expect(err).NotTo(HaveOccurred()) return envMap } var marshalUpdatedEnv = func(envMap map[string]string) []byte { jsonObj, err := json.Marshal(envMap) Expect(err).NotTo(HaveOccurred()) return jsonObj }
It("allows ip traffic between containers after applying a policy and blocks it when the policy is removed", func() { if !Config.GetIncludeContainerNetworking() { Skip("Skipping this test because Config.ContainerNetworking is set to 'false'.") } containerIp, containerPort := getAppContainerIpAndPort(serverAppName) orgName := TestSetup.RegularUserContext().Org spaceName := TestSetup.RegularUserContext().Space By("Testing that app cannot connect") doraCurlResponse := testAppConnectivity(clientAppName, containerIp, containerPort) Expect(doraCurlResponse.ReturnCode).NotTo(Equal(0)) By("adding policy") workflowhelpers.AsUser(TestSetup.AdminUserContext(), Config.DefaultTimeoutDuration(), func() { Expect(cf.Cf("target", "-o", orgName, "-s", spaceName).Wait(Config.DefaultTimeoutDuration())).To(Exit(0)) Expect(cf.Cf("allow-access", clientAppName, serverAppName, "--port", fmt.Sprintf("%d", containerPort), "--protocol", "tcp").Wait(Config.CfPushTimeoutDuration())).To(Exit(0)) }) By("waiting for policy to be added on cell") time.Sleep(10 * time.Second) By("Testing that app can connect") doraCurlResponse = testAppConnectivity(clientAppName, containerIp, containerPort) Expect(doraCurlResponse.ReturnCode).To(Equal(0)) By("removing policy") workflowhelpers.AsUser(TestSetup.AdminUserContext(), Config.DefaultTimeoutDuration(), func() { Expect(cf.Cf("target", "-o", orgName, "-s", spaceName).Wait(Config.DefaultTimeoutDuration())).To(Exit(0)) Expect(cf.Cf("deny-access", clientAppName, serverAppName, "--port", fmt.Sprintf("%d", containerPort), "--protocol", "tcp").Wait(Config.CfPushTimeoutDuration())).To(Exit(0)) })
}) AfterEach(func() { FetchRecentLogs(appGuid, token, Config) DeleteApp(appGuid) Expect(cf.Cf("delete-service", upsName, "-f").Wait(Config.DefaultTimeoutDuration())).To(Exit(0)) }) Describe("staging", func() { var buildpackName string BeforeEach(func() { buildpackName = random_name.CATSRandomName("BPK") buildpackZip := createEnvBuildpack() workflowhelpers.AsUser(TestSetup.AdminUserContext(), Config.DefaultTimeoutDuration(), func() { Expect(cf.Cf("create-buildpack", buildpackName, buildpackZip, "999").Wait(Config.DefaultTimeoutDuration())).To(Exit(0)) }) }) AfterEach(func() { workflowhelpers.AsUser(TestSetup.AdminUserContext(), Config.DefaultTimeoutDuration(), func() { Expect(cf.Cf("delete-buildpack", buildpackName, "-f").Wait(Config.DefaultTimeoutDuration())).To(Exit(0)) }) }) // TODO Unpend this test once v3 service bindings can be deleted (especially recursively through org delete) PIt("exposes them during staging", func() { StageBuildpackPackage(packageGuid, buildpackName) Eventually(func() *Session { return FetchRecentLogs(appGuid, token, Config) }, 1*time.Minute, 10*time.Second).Should(Say("my-service"))
func deleteServiceBroker(brokerName string) { workflowhelpers.AsUser(TestSetup.AdminUserContext(), TestSetup.ShortTimeout(), func() { responseBuffer := cf.Cf("delete-service-broker", brokerName, "-f") Expect(responseBuffer.Wait(Config.DefaultTimeoutDuration())).To(Exit(0)) }) }
AfterEach(func() { app_helpers.AppReport(broker.Name, Config.DefaultTimeoutDuration()) broker.Destroy() }) Context("for public brokers", func() { BeforeEach(func() { broker = NewServiceBroker( random_name.CATSRandomName("BRKR"), assets.NewAssets().ServiceBroker, TestSetup, ) broker.Push(Config) broker.Configure() workflowhelpers.AsUser(TestSetup.AdminUserContext(), Config.DefaultTimeoutDuration(), func() { broker.Create() broker.PublicizePlans() }) appName = random_name.CATSRandomName("APP") instanceName = random_name.CATSRandomName("SVIN") asyncInstanceName = random_name.CATSRandomName("SVIN") }) AfterEach(func() { app_helpers.AppReport(appName, Config.DefaultTimeoutDuration()) Expect(cf.Cf("delete", appName, "-f", "-r").Wait(Config.DefaultTimeoutDuration())).To(Exit(0)) Expect(cf.Cf("delete-service", instanceName, "-f").Wait(Config.DefaultTimeoutDuration())).To(Exit(0)) }) It("removes all instances and plans of the service, then removes the service offering", func() { By("Having bound service instances") createApp := cf.Cf("push", appName, "--no-start", "-b", Config.GetRubyBuildpackName(), "-m", DEFAULT_MEMORY_LIMIT, "-p", assets.NewAssets().Dora, "-d", Config.GetAppsDomain()).Wait(Config.DefaultTimeoutDuration())
workflowhelpers.AsUser(TestSetup.AdminUserContext(), Config.DefaultTimeoutDuration(), func() { BuildpackName = CATSRandomName("BPK") appName = CATSRandomName("APP") tmpdir, err := ioutil.TempDir(os.TempDir(), "matching-app") Expect(err).ToNot(HaveOccurred()) appPath = tmpdir tmpdir, err = ioutil.TempDir(os.TempDir(), "matching-buildpack") Expect(err).ToNot(HaveOccurred()) buildpackPath = tmpdir buildpackArchivePath = path.Join(buildpackPath, "buildpack.zip") archive_helpers.CreateZipArchive(buildpackArchivePath, []archive_helpers.ArchiveFile{ { Name: "bin/compile", Body: `#!/usr/bin/env bash mkdir -p $1 $2 if [ -f "$2/cached-file" ]; then cp $2/cached-file $1/content else echo "cache not found" > $1/content fi echo "here's a cache" > $2/cached-file `, }, { Name: "bin/detect", Body: fmt.Sprintf(`#!/bin/bash if [ -f "${1}/%s" ]; then echo Buildpack that needs cache else echo no exit 1 fi `, matchingFilename(appName)), }, { Name: "bin/release", Body: `#!/usr/bin/env bash content=$(cat $1/content) cat <<EOF --- config_vars: PATH: bin:/usr/local/bin:/usr/bin:/bin FROM_BUILD_PACK: "yes" default_process_types: web: while true; do { echo -e 'HTTP/1.1 200 OK\r\n'; echo "custom buildpack contents - $content"; } | nc -l \$PORT; done EOF `, }, }) _, err = os.Create(path.Join(appPath, matchingFilename(appName))) Expect(err).ToNot(HaveOccurred()) _, err = os.Create(path.Join(appPath, "some-file")) Expect(err).ToNot(HaveOccurred()) createBuildpack := cf.Cf("create-buildpack", BuildpackName, buildpackArchivePath, "0").Wait(Config.DefaultTimeoutDuration()) Expect(createBuildpack).Should(Exit(0)) Expect(createBuildpack).Should(Say("Creating")) Expect(createBuildpack).Should(Say("OK")) Expect(createBuildpack).Should(Say("Uploading")) Expect(createBuildpack).Should(Say("OK")) })
func (b ServiceBroker) Update() { workflowhelpers.AsUser(b.TestSetup.AdminUserContext(), Config.DefaultTimeoutDuration(), func() { Expect(cf.Cf("update-service-broker", b.Name, "username", "password", helpers.AppUri(b.Name, "", Config)).Wait(Config.DefaultTimeoutDuration())).To(Exit(0)) }) }
func (b ServiceBroker) CreateSpaceScoped() { workflowhelpers.AsUser(b.TestSetup.RegularUserContext(), Config.DefaultTimeoutDuration(), func() { Expect(cf.Cf("create-service-broker", b.Name, "username", "password", helpers.AppUri(b.Name, "", Config), "--space-scoped").Wait(Config.DefaultTimeoutDuration())).To(Exit(0)) Expect(cf.Cf("service-brokers").Wait(Config.DefaultTimeoutDuration())).To(Say(b.Name)) }) }
spaceName = random_name.CATSRandomName("SPACE") appName = random_name.CATSRandomName("APP") instanceName = random_name.CATSRandomName("SVIN") workflowhelpers.AsUser(TestSetup.AdminUserContext(), Config.DefaultTimeoutDuration(), func() { createQuota := cf.Cf("create-quota", quotaName, "-m", "10G", "-r", "1000", "-s", "5").Wait(TestSetup.ShortTimeout()) Expect(createQuota).To(Exit(0)) createOrg := cf.Cf("create-org", orgName).Wait(Config.DefaultTimeoutDuration()) Expect(createOrg).To(Exit(0), "failed to create org") setQuota := cf.Cf("set-quota", orgName, quotaName).Wait(TestSetup.ShortTimeout()) Expect(setQuota).To(Exit(0)) createSpace := cf.Cf("create-space", spaceName, "-o", orgName).Wait(Config.DefaultTimeoutDuration()) Expect(createSpace).To(Exit(0), "failed to create space") target := cf.Cf("target", "-o", orgName, "-s", spaceName).Wait(Config.CfPushTimeoutDuration()) Expect(target).To(Exit(0), "failed targeting") createApp := cf.Cf("push", appName, "--no-start", "-b", Config.GetRubyBuildpackName(), "-m", DEFAULT_MEMORY_LIMIT, "-p", assets.NewAssets().Dora, "-d", Config.GetAppsDomain()).Wait(Config.DefaultTimeoutDuration()) Expect(createApp).To(Exit(0), "failed creating app") app_helpers.SetBackend(appName) Expect(cf.Cf("start", appName).Wait(Config.CfPushTimeoutDuration())).To(Exit(0)) createService := cf.Cf("create-service", broker.Service.Name, broker.SyncPlans[0].Name, instanceName).Wait(Config.DefaultTimeoutDuration()) Expect(createService).To(Exit(0), "failed creating service") }) }) AfterEach(func() { app_helpers.AppReport(broker.Name, Config.DefaultTimeoutDuration())
func deleteSecurityGroup(securityGroupName string) { workflowhelpers.AsUser(TestSetup.AdminUserContext(), Config.DefaultTimeoutDuration(), func() { Expect(cf.Cf("delete-security-group", securityGroupName, "-f").Wait(Config.DefaultTimeoutDuration())).To(Exit(0)) }) }