github.com/mook-as/cf-cli@v7.0.0-beta.28.0.20200120190804-b91c115fae48+incompatible/integration/helpers/fakeservicebroker/deployment.go (about)

     1  package fakeservicebroker
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"io"
     7  	"io/ioutil"
     8  	"net/http"
     9  
    10  	"code.cloudfoundry.org/cli/integration/helpers"
    11  	"github.com/onsi/ginkgo"
    12  	. "github.com/onsi/gomega"
    13  	. "github.com/onsi/gomega/gbytes"
    14  	. "github.com/onsi/gomega/gexec"
    15  )
    16  
    17  const (
    18  	itsOrg             = "fakeservicebroker"
    19  	itsSpace           = "integration"
    20  	defaultMemoryLimit = "256M"
    21  	defaultBrokerPath  = "../../assets/service_broker"
    22  )
    23  
    24  func (f *FakeServiceBroker) pushAppIfNecessary() {
    25  	if !f.reusable {
    26  		f.pushApp()
    27  		return
    28  	}
    29  
    30  	if f.alreadyPushedApp() {
    31  		return
    32  	}
    33  
    34  	f.pushReusableApp()
    35  }
    36  
    37  func (f *FakeServiceBroker) pushApp() {
    38  	Eventually(helpers.CF(
    39  		"push", f.name,
    40  		"-p", defaultBrokerPath,
    41  		"-m", defaultMemoryLimit,
    42  	)).Should(Exit(0))
    43  }
    44  
    45  func (f *FakeServiceBroker) pushReusableApp() {
    46  	helpers.CreateOrgAndSpaceUnlessExists(itsOrg, itsSpace)
    47  	helpers.WithRandomHomeDir(func() {
    48  		helpers.SetAPI()
    49  		helpers.LoginCF()
    50  		helpers.TargetOrgAndSpace(itsOrg, itsSpace)
    51  
    52  		f.pushApp()
    53  	})
    54  }
    55  
    56  func (f *FakeServiceBroker) alreadyPushedApp() bool {
    57  	resp, err := http.Get(f.URL("/config"))
    58  	Expect(err).ToNot(HaveOccurred())
    59  	defer resp.Body.Close()
    60  	return resp.StatusCode == http.StatusOK
    61  }
    62  
    63  func (f *FakeServiceBroker) getCatalogServiceNames() []string {
    64  	if !f.alreadyPushedApp() {
    65  		return nil
    66  	}
    67  
    68  	resp, err := http.Get(f.URL("/v2/catalog"))
    69  	Expect(err).ToNot(HaveOccurred())
    70  
    71  	defer resp.Body.Close()
    72  	body, err := ioutil.ReadAll(resp.Body)
    73  	Expect(err).ToNot(HaveOccurred())
    74  
    75  	var data map[string]interface{}
    76  	err = json.Unmarshal(body, &data)
    77  	Expect(err).ToNot(HaveOccurred(), fmt.Sprintf("expected '%s' to be a valid json", string(body)))
    78  
    79  	var serviceNames []string
    80  	for _, value := range data["services"].([]interface{}) {
    81  		service := value.(map[string]interface{})
    82  		serviceNames = append(serviceNames, service["name"].(string))
    83  	}
    84  
    85  	return serviceNames
    86  }
    87  
    88  func generateReusableBrokerName(suffix string) string {
    89  	return fmt.Sprintf("fake-service-broker-%s%02d", suffix, ginkgo.GinkgoParallelNode())
    90  }
    91  
    92  func (f *FakeServiceBroker) register() {
    93  	if f.reusable {
    94  		f.deregister()
    95  	}
    96  
    97  	Eventually(helpers.CF("create-service-broker", f.name, f.username, f.password, f.URL())).Should(Exit(0))
    98  
    99  	f.waitForBrokerToBeRegistered()
   100  }
   101  
   102  func (f *FakeServiceBroker) registerViaV2() {
   103  	if f.reusable {
   104  		f.deregister()
   105  	}
   106  
   107  	broker := map[string]interface{}{
   108  		"name":          f.name,
   109  		"broker_url":    f.URL(),
   110  		"auth_username": f.username,
   111  		"auth_password": f.password,
   112  	}
   113  	data, err := json.Marshal(broker)
   114  	Expect(err).NotTo(HaveOccurred())
   115  
   116  	Eventually(helpers.CF("curl", "-X", "POST", "/v2/service_brokers", "-d", string(data))).Should(Exit(0))
   117  
   118  	f.waitForBrokerToBeRegistered()
   119  }
   120  
   121  func (f *FakeServiceBroker) waitForBrokerToBeRegistered() {
   122  	Eventually(helpers.CF("service-brokers")).Should(And(Exit(0), Say(f.name)))
   123  
   124  	Eventually(func() io.Reader {
   125  		session := helpers.CF("service-access", "-b", f.name)
   126  		Eventually(session).Should(Exit(0))
   127  
   128  		return session.Out
   129  	}).Should(Say(f.ServiceName()))
   130  }
   131  
   132  func (f *FakeServiceBroker) update() {
   133  	Eventually(helpers.CF("update-service-broker", f.name, "username", "password", f.URL())).Should(Exit(0))
   134  	Eventually(helpers.CF("service-brokers")).Should(And(Exit(0), Say(f.name)))
   135  }
   136  
   137  func (f *FakeServiceBroker) cleanup() {
   138  	f.deregister()
   139  	f.deleteApp()
   140  }
   141  
   142  func (f *FakeServiceBroker) deleteApp() {
   143  	if f.reusable {
   144  		return
   145  	}
   146  
   147  	Eventually(helpers.CF("delete", f.name, "-f", "-r")).Should(Exit(0))
   148  }
   149  
   150  func (f *FakeServiceBroker) deregister() {
   151  	f.purgeAllServiceOfferings(true)
   152  
   153  	Eventually(helpers.CF("delete-service-broker", f.name, "-f")).Should(Exit())
   154  }
   155  
   156  func (f *FakeServiceBroker) purgeAllServiceOfferings(ignoreFailures bool) {
   157  	for _, service := range f.getCatalogServiceNames() {
   158  		assertion := Eventually(helpers.CF("purge-service-offering", service, "-b", f.name, "-f"))
   159  
   160  		if ignoreFailures {
   161  			assertion.Should(Exit())
   162  		} else {
   163  			assertion.Should(Exit(0))
   164  		}
   165  	}
   166  }
   167  
   168  func (f *FakeServiceBroker) stopReusing() *FakeServiceBroker {
   169  	f.reusable = false
   170  	return f
   171  }