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  }