github.com/cloudfoundry-community/cloudfoundry-cli@v6.44.1-0.20240130060226-cda5ed8e89a5+incompatible/api/cloudcontroller/ccv2/service_broker.go (about)

     1  package ccv2
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  
     7  	"code.cloudfoundry.org/cli/api/cloudcontroller"
     8  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccerror"
     9  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv2/internal"
    10  )
    11  
    12  // ServiceBroker represents a Cloud Controller Service Broker.
    13  type ServiceBroker struct {
    14  	// AuthUsername is the HTTP Basic Auth username of the service broker.
    15  	AuthUsername string
    16  	// AuthPassword is the HTTP Basic Auth password of the service broker.
    17  	AuthPassword string
    18  	// BrokerURL is the URL of the service broker.
    19  	BrokerURL string
    20  	// GUID is the unique Service Broker identifier.
    21  	GUID string
    22  	// Name is the name of the service broker.
    23  	Name string
    24  	// SpaceGUID is the space guid of the serivce broker. Only applies to space scoped service brokers.
    25  	SpaceGUID string
    26  }
    27  
    28  // UnmarshalJSON helps unmarshal a Cloud Controller Service Broker response.
    29  func (serviceBroker *ServiceBroker) UnmarshalJSON(data []byte) error {
    30  	var ccServiceBroker struct {
    31  		Metadata internal.Metadata
    32  		Entity   struct {
    33  			Name         string `json:"name"`
    34  			BrokerURL    string `json:"broker_url"`
    35  			AuthUsername string `json:"auth_username"`
    36  			SpaceGUID    string `json:"space_guid"`
    37  		} `json:"entity"`
    38  	}
    39  	err := cloudcontroller.DecodeJSON(data, &ccServiceBroker)
    40  	if err != nil {
    41  		return err
    42  	}
    43  
    44  	serviceBroker.Name = ccServiceBroker.Entity.Name
    45  	serviceBroker.GUID = ccServiceBroker.Metadata.GUID
    46  	serviceBroker.BrokerURL = ccServiceBroker.Entity.BrokerURL
    47  	serviceBroker.AuthUsername = ccServiceBroker.Entity.AuthUsername
    48  	serviceBroker.SpaceGUID = ccServiceBroker.Entity.SpaceGUID
    49  	return nil
    50  }
    51  
    52  // MarshalJSON helps marshal a Cloud Controller Service Broker request.
    53  func (serviceBroker *ServiceBroker) MarshalJSON() ([]byte, error) {
    54  	ccObj := struct {
    55  		Name         string `json:"name,omitempty"`
    56  		BrokerURL    string `json:"broker_url,omitempty"`
    57  		AuthUsername string `json:"auth_username,omitempty"`
    58  		AuthPassword string `json:"auth_password,omitempty"`
    59  	}{
    60  		Name:         serviceBroker.Name,
    61  		BrokerURL:    serviceBroker.BrokerURL,
    62  		AuthUsername: serviceBroker.AuthUsername,
    63  		AuthPassword: serviceBroker.AuthPassword,
    64  	}
    65  
    66  	return json.Marshal(ccObj)
    67  }
    68  
    69  type createServiceBrokerRequestBody struct {
    70  	Name         string `json:"name"`
    71  	BrokerURL    string `json:"broker_url"`
    72  	AuthUsername string `json:"auth_username"`
    73  	AuthPassword string `json:"auth_password"`
    74  	SpaceGUID    string `json:"space_guid,omitempty"`
    75  }
    76  
    77  // CreateServiceBroker posts a service broker resource with the provided
    78  // attributes to the api and returns the result.
    79  func (client *Client) CreateServiceBroker(brokerName, username, password, url, spaceGUID string) (ServiceBroker, Warnings, error) {
    80  	requestBody := createServiceBrokerRequestBody{
    81  		Name:         brokerName,
    82  		BrokerURL:    url,
    83  		AuthUsername: username,
    84  		AuthPassword: password,
    85  		SpaceGUID:    spaceGUID,
    86  	}
    87  
    88  	bodyBytes, err := json.Marshal(requestBody)
    89  	if err != nil {
    90  		return ServiceBroker{}, nil, err
    91  	}
    92  
    93  	request, err := client.newHTTPRequest(requestOptions{
    94  		RequestName: internal.PostServiceBrokerRequest,
    95  		Body:        bytes.NewReader(bodyBytes),
    96  	})
    97  
    98  	if err != nil {
    99  		return ServiceBroker{}, nil, err
   100  	}
   101  
   102  	var serviceBroker ServiceBroker
   103  	response := cloudcontroller.Response{
   104  		DecodeJSONResponseInto: &serviceBroker,
   105  	}
   106  
   107  	err = client.connection.Make(request, &response)
   108  
   109  	return serviceBroker, response.Warnings, err
   110  }
   111  
   112  // GetServiceBrokers returns back a list of Service Brokers given the provided
   113  // filters.
   114  func (client *Client) GetServiceBrokers(filters ...Filter) ([]ServiceBroker, Warnings, error) {
   115  	request, err := client.newHTTPRequest(requestOptions{
   116  		RequestName: internal.GetServiceBrokersRequest,
   117  		Query:       ConvertFilterParameters(filters),
   118  	})
   119  
   120  	if err != nil {
   121  		return nil, nil, err
   122  	}
   123  
   124  	var fullBrokersList []ServiceBroker
   125  	warnings, err := client.paginate(request, ServiceBroker{}, func(item interface{}) error {
   126  		if broker, ok := item.(ServiceBroker); ok {
   127  			fullBrokersList = append(fullBrokersList, broker)
   128  		} else {
   129  			return ccerror.UnknownObjectInListError{
   130  				Expected:   ServiceBroker{},
   131  				Unexpected: item,
   132  			}
   133  		}
   134  		return nil
   135  	})
   136  
   137  	return fullBrokersList, warnings, err
   138  }
   139  
   140  // UpdateServiceBroker updates the service broker with the given GUID.
   141  func (client *Client) UpdateServiceBroker(serviceBroker ServiceBroker) (ServiceBroker, Warnings, error) {
   142  	body, err := json.Marshal(&serviceBroker)
   143  	if err != nil {
   144  		return ServiceBroker{}, nil, err
   145  	}
   146  
   147  	request, err := client.newHTTPRequest(requestOptions{
   148  		RequestName: internal.PutServiceBrokerRequest,
   149  		URIParams:   Params{"service_broker_guid": serviceBroker.GUID},
   150  		Body:        bytes.NewReader(body),
   151  	})
   152  	if err != nil {
   153  		return ServiceBroker{}, nil, err
   154  	}
   155  
   156  	var updatedObj ServiceBroker
   157  	response := cloudcontroller.Response{
   158  		DecodeJSONResponseInto: &updatedObj,
   159  	}
   160  
   161  	err = client.connection.Make(request, &response)
   162  	return updatedObj, response.Warnings, err
   163  }
   164  
   165  // DeleteServiceBroker delete a service broker
   166  func (client *Client) DeleteServiceBroker(guid string) (Warnings, error) {
   167  	request, err := client.newHTTPRequest(requestOptions{
   168  		RequestName: internal.DeleteServiceBrokerRequest,
   169  		URIParams: Params{
   170  			"service_broker_guid": guid,
   171  		},
   172  	})
   173  	if err != nil {
   174  		return nil, err
   175  	}
   176  
   177  	response := cloudcontroller.Response{}
   178  
   179  	err = client.connection.Make(request, &response)
   180  	return response.Warnings, err
   181  }
   182  
   183  // GetServiceBroker returns back a service broker.
   184  func (client *Client) GetServiceBroker(guid string) (ServiceBroker, Warnings, error) {
   185  	request, err := client.newHTTPRequest(requestOptions{
   186  		RequestName: internal.GetServiceBrokerRequest,
   187  		URIParams: Params{
   188  			"service_broker_guid": guid,
   189  		},
   190  	})
   191  	if err != nil {
   192  		return ServiceBroker{}, nil, err
   193  	}
   194  
   195  	var obj ServiceBroker
   196  	response := cloudcontroller.Response{
   197  		DecodeJSONResponseInto: &obj,
   198  	}
   199  
   200  	err = client.connection.Make(request, &response)
   201  	return obj, response.Warnings, err
   202  }