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

     1  package ccv2
     2  
     3  import (
     4  	"bytes"
     5  	"code.cloudfoundry.org/cli/api/cloudcontroller"
     6  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccerror"
     7  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv2/internal"
     8  	"encoding/json"
     9  )
    10  
    11  // ServiceBindingRoute represents a Cloud Controller service binding route.
    12  type ServiceBindingRoute struct {
    13  	// GUID is the unique service binding route identifier.
    14  	GUID string
    15  
    16  	// Name is the name given to the service binding route.
    17  	Name string
    18  
    19  	// The guid of the service instance to bind
    20  	ServiceInstanceGuid string
    21  
    22  	// The guid of the app to bind
    23  	AppGuid string
    24  
    25  	// Arbitrary parameters to pass along to the service broker.
    26  	Parameters map[string]interface{}
    27  }
    28  
    29  // MarshalJSON converts an service binding route into a Cloud Controller service binding route.
    30  func (o ServiceBindingRoute) MarshalJSON() ([]byte, error) {
    31  	ccObj := struct {
    32  		Name                string                 `json:"name"`
    33  		ServiceInstanceGuid string                 `json:"service_instance_guid"`
    34  		AppGuid             string                 `json:"app_guid"`
    35  		Parameters          map[string]interface{} `json:"parameters,omitempty"`
    36  	}{
    37  		Name:                o.Name,
    38  		ServiceInstanceGuid: o.ServiceInstanceGuid,
    39  		AppGuid:             o.AppGuid,
    40  		Parameters:          o.Parameters,
    41  	}
    42  
    43  	return json.Marshal(ccObj)
    44  }
    45  
    46  // UnmarshalJSON helps unmarshal a Cloud Controller service binding route response.
    47  func (o *ServiceBindingRoute) UnmarshalJSON(data []byte) error {
    48  	var ccObj struct {
    49  		Metadata internal.Metadata `json:"metadata"`
    50  		Entity   struct {
    51  			Name                string                 `json:"name"`
    52  			ServiceInstanceGuid string                 `json:"service_instance_guid"`
    53  			AppGuid             string                 `json:"app_guid"`
    54  			Parameters          map[string]interface{} `json:"parameters"`
    55  		} `json:"entity"`
    56  	}
    57  	err := cloudcontroller.DecodeJSON(data, &ccObj)
    58  	if err != nil {
    59  		return err
    60  	}
    61  
    62  	o.Name = ccObj.Entity.Name
    63  	o.GUID = ccObj.Metadata.GUID
    64  	o.ServiceInstanceGuid = ccObj.Entity.ServiceInstanceGuid
    65  	o.AppGuid = ccObj.Entity.AppGuid
    66  	o.Parameters = ccObj.Entity.Parameters
    67  
    68  	return nil
    69  }
    70  
    71  // CreateServiceBindingRoute creates a cloud controller service binding route in with the given settings.
    72  func (client *Client) CreateServiceBindingRoute(serviceID, routeID string, params interface{}) (Warnings, error) {
    73  	body, err := json.Marshal(struct {
    74  		Parameters interface{} `json:"parameters"`
    75  	}{params})
    76  	if err != nil {
    77  		return nil, err
    78  	}
    79  
    80  	request, err := client.newHTTPRequest(requestOptions{
    81  		RequestName: internal.PutServiceBindingRoutesRequest,
    82  		Body:        bytes.NewReader(body),
    83  		URIParams: Params{
    84  			"service_guid": serviceID,
    85  			"route_guid":   routeID,
    86  		},
    87  	})
    88  	if err != nil {
    89  		return nil, err
    90  	}
    91  
    92  	response := cloudcontroller.Response{
    93  	}
    94  
    95  	err = client.connection.Make(request, &response)
    96  	return response.Warnings, err
    97  }
    98  
    99  // DeleteServiceBindingRoute delete a cloud controller service binding route in with the given settings.
   100  func (client *Client) DeleteServiceBindingRoute(serviceID, routeID string) (Warnings, error) {
   101  	warn, err := client.deleteServiceBindingRouteRequest(internal.DeleteServiceBindingRouteRequest, serviceID, routeID)
   102  	if err != nil {
   103  		if _, ok := err.(ccerror.ResourceNotFoundError); ok {
   104  			return client.deleteServiceBindingRouteRequest(internal.DeleteUserProvidedServiceInstanceRoutesRequest, serviceID, routeID)
   105  		}
   106  		return warn, err
   107  	}
   108  	return warn, err
   109  }
   110  
   111  func (client *Client) deleteServiceBindingRouteRequest(requestName string, serviceID, routeID string) (Warnings, error) {
   112  	request, err := client.newHTTPRequest(requestOptions{
   113  		RequestName: requestName,
   114  		URIParams: Params{
   115  			"service_guid": serviceID,
   116  			"route_guid":   routeID,
   117  		},
   118  	})
   119  	if err != nil {
   120  		return nil, err
   121  	}
   122  
   123  	response := cloudcontroller.Response{
   124  	}
   125  
   126  	err = client.connection.Make(request, &response)
   127  	return response.Warnings, err
   128  }
   129  
   130  // GetServiceBindingRoute returns back a service binding route.
   131  func (client *Client) GetServiceBindingRoutes(serviceID string) ([]Route, Warnings, error) {
   132  	routes, warn, err := client.getServiceBindingRoutesRequest(internal.GetServiceBindingRoutesRequest, serviceID)
   133  	if err != nil {
   134  		if _, ok := err.(ccerror.ResourceNotFoundError); ok {
   135  			return client.getServiceBindingRoutesRequest(internal.GetUserProvidedServiceInstanceRoutesRequest, serviceID)
   136  		}
   137  		return routes, warn, err
   138  	}
   139  	return routes, warn, err
   140  }
   141  
   142  func (client *Client) getServiceBindingRoutesRequest(requestName string, serviceID string) ([]Route, Warnings, error) {
   143  	request, err := client.newHTTPRequest(requestOptions{
   144  		RequestName: requestName,
   145  		URIParams: Params{
   146  			"service_guid": serviceID,
   147  		},
   148  	})
   149  	if err != nil {
   150  		return []Route{}, nil, err
   151  	}
   152  
   153  	var fullRoutesList []Route
   154  	warnings, err := client.paginate(request, Route{}, func(item interface{}) error {
   155  		if i, ok := item.(Route); ok {
   156  			fullRoutesList = append(fullRoutesList, i)
   157  		} else {
   158  			return ccerror.UnknownObjectInListError{
   159  				Expected:   Route{},
   160  				Unexpected: item,
   161  			}
   162  		}
   163  		return nil
   164  	})
   165  
   166  	return fullRoutesList, warnings, err
   167  }