github.com/sap/cf-mta-plugin@v2.6.3+incompatible/clients/cfrestclient/rest_cloud_foundry_client_extended.go (about) 1 package cfrestclient 2 3 import ( 4 "context" 5 "fmt" 6 "net/http" 7 "net/url" 8 9 baseclient "github.com/cloudfoundry-incubator/multiapps-cli-plugin/clients/baseclient" 10 "github.com/cloudfoundry-incubator/multiapps-cli-plugin/clients/cfrestclient/operations" 11 models "github.com/cloudfoundry-incubator/multiapps-cli-plugin/clients/models" 12 strfmt "github.com/go-openapi/strfmt" 13 ) 14 15 const cfBaseUrl = "v2/" 16 const defaultSharedDomainsPathPattern = "/shared_domains" 17 18 type CloudFoundryRestClient struct { 19 baseclient.BaseClient 20 httpCloudFoundryClient *CloudFoundryClientExtended 21 } 22 23 func NewCloudFoundryRestClient(host string, rt http.RoundTripper, tokenFactory baseclient.TokenFactory) CloudFoundryOperationsExtended { 24 t := baseclient.NewHTTPTransport(host, cfBaseUrl, cfBaseUrl, rt) 25 httpCloudFoundryClient := New(t, strfmt.Default) 26 return &CloudFoundryRestClient{baseclient.BaseClient{TokenFactory: tokenFactory}, httpCloudFoundryClient} 27 } 28 29 func (c CloudFoundryRestClient) GetSharedDomains() ([]models.SharedDomain, error) { 30 result := []models.SharedDomain{} 31 var response *models.CloudFoundryResponse 32 var err error 33 var cloudFoundryUrlElememnts CloudFoundryUrlElements 34 pathPattern := defaultSharedDomainsPathPattern 35 for pathPattern != "" { 36 response, err = c.getSharedDomainsInternal(cloudFoundryUrlElememnts) 37 if err != nil { 38 return []models.SharedDomain{}, err 39 } 40 result = append(result, toSharedDomains(response)...) 41 cloudFoundryUrlElememnts, err = getPathQueryElements(response) 42 if err != nil { 43 return []models.SharedDomain{}, baseclient.NewClientError(err) 44 } 45 pathPattern = response.NextURL 46 } 47 48 return result, err 49 } 50 51 func (c CloudFoundryRestClient) getSharedDomainsInternal(cloudFoundryUrlElements CloudFoundryUrlElements) (*models.CloudFoundryResponse, error) { 52 params := &operations.GetSharedDomainsParams{ 53 Page: cloudFoundryUrlElements.Page, 54 ResultsPerPage: cloudFoundryUrlElements.ResultsPerPage, 55 OrderDirection: cloudFoundryUrlElements.OrderDirection, 56 Context: context.TODO(), 57 } 58 token, err := c.TokenFactory.NewToken() 59 if err != nil { 60 return nil, baseclient.NewClientError(err) 61 } 62 63 result, err := c.httpCloudFoundryClient.Operations.GetSharedDomains(params, token) 64 if err != nil { 65 return nil, baseclient.NewClientError(err) 66 } 67 return result.Payload, nil 68 } 69 70 func getPathQueryElements(response *models.CloudFoundryResponse) (CloudFoundryUrlElements, error) { 71 nextUrl, err := url.Parse(response.NextURL) 72 if err != nil { 73 return CloudFoundryUrlElements{}, fmt.Errorf("Could not parse next_url for getting shared domains: %s", response.NextURL) 74 } 75 nextUrlQuery := nextUrl.Query() 76 page := nextUrlQuery.Get("page") 77 resultsPerPage := nextUrlQuery.Get("results-per-page") 78 orderDirection := nextUrlQuery.Get("order-direction") 79 80 return CloudFoundryUrlElements{Page: &page, ResultsPerPage: &resultsPerPage, OrderDirection: &orderDirection}, nil 81 82 } 83 84 func toSharedDomains(response *models.CloudFoundryResponse) []models.SharedDomain { 85 var result []models.SharedDomain 86 for _, cloudResource := range response.Resources { 87 result = append(result, models.NewSharedDomain(cloudResource.Entity.Name, cloudResource.Metadata.GUID, cloudResource.Metadata.URL)) 88 } 89 return result 90 }