github.com/ablease/cli@v6.37.1-0.20180613014814-3adbb7d7fb19+incompatible/api/cloudcontroller/ccv2/service_binding.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  // ServiceBinding represents a Cloud Controller Service Binding.
    13  type ServiceBinding struct {
    14  	// GUID is the unique Service Binding identifier.
    15  	GUID string
    16  	// Name is the name of the service binding
    17  	Name string
    18  	// AppGUID is the associated application GUID.
    19  	AppGUID string
    20  	// ServiceInstanceGUID is the associated service GUID.
    21  	ServiceInstanceGUID string
    22  }
    23  
    24  // UnmarshalJSON helps unmarshal a Cloud Controller Service Binding response.
    25  func (serviceBinding *ServiceBinding) UnmarshalJSON(data []byte) error {
    26  	var ccServiceBinding struct {
    27  		Metadata internal.Metadata
    28  		Entity   struct {
    29  			AppGUID             string `json:"app_guid"`
    30  			ServiceInstanceGUID string `json:"service_instance_guid"`
    31  			Name                string `json:"name"`
    32  		} `json:"entity"`
    33  	}
    34  	err := cloudcontroller.DecodeJSON(data, &ccServiceBinding)
    35  	if err != nil {
    36  		return err
    37  	}
    38  
    39  	serviceBinding.AppGUID = ccServiceBinding.Entity.AppGUID
    40  	serviceBinding.GUID = ccServiceBinding.Metadata.GUID
    41  	serviceBinding.ServiceInstanceGUID = ccServiceBinding.Entity.ServiceInstanceGUID
    42  	serviceBinding.Name = ccServiceBinding.Entity.Name
    43  	return nil
    44  }
    45  
    46  // serviceBindingRequestBody represents the body of the service binding create
    47  // request.
    48  type serviceBindingRequestBody struct {
    49  	ServiceInstanceGUID string                 `json:"service_instance_guid"`
    50  	AppGUID             string                 `json:"app_guid"`
    51  	Name                string                 `json:"name,omitempty"`
    52  	Parameters          map[string]interface{} `json:"parameters"`
    53  }
    54  
    55  func (client *Client) CreateServiceBinding(appGUID string, serviceInstanceGUID string, bindingName string, parameters map[string]interface{}) (ServiceBinding, Warnings, error) {
    56  	requestBody := serviceBindingRequestBody{
    57  		ServiceInstanceGUID: serviceInstanceGUID,
    58  		AppGUID:             appGUID,
    59  		Name:                bindingName,
    60  		Parameters:          parameters,
    61  	}
    62  
    63  	bodyBytes, err := json.Marshal(requestBody)
    64  	if err != nil {
    65  		return ServiceBinding{}, nil, err
    66  	}
    67  
    68  	request, err := client.newHTTPRequest(requestOptions{
    69  		RequestName: internal.PostServiceBindingRequest,
    70  		Body:        bytes.NewReader(bodyBytes),
    71  	})
    72  	if err != nil {
    73  		return ServiceBinding{}, nil, err
    74  	}
    75  
    76  	var serviceBinding ServiceBinding
    77  	response := cloudcontroller.Response{
    78  		Result: &serviceBinding,
    79  	}
    80  
    81  	err = client.connection.Make(request, &response)
    82  	if err != nil {
    83  		return ServiceBinding{}, response.Warnings, err
    84  	}
    85  
    86  	return serviceBinding, response.Warnings, nil
    87  }
    88  
    89  // DeleteServiceBinding will destroy the requested Service Binding.
    90  func (client *Client) DeleteServiceBinding(serviceBindingGUID string) (Warnings, error) {
    91  	request, err := client.newHTTPRequest(requestOptions{
    92  		RequestName: internal.DeleteServiceBindingRequest,
    93  		URIParams:   map[string]string{"service_binding_guid": serviceBindingGUID},
    94  	})
    95  	if err != nil {
    96  		return nil, err
    97  	}
    98  
    99  	var response cloudcontroller.Response
   100  	err = client.connection.Make(request, &response)
   101  	return response.Warnings, err
   102  }
   103  
   104  // GetServiceBinding returns back a service binding with the proviced guid
   105  func (client *Client) GetServiceBinding(guid string) (ServiceBinding, Warnings, error) {
   106  	request, err := client.newHTTPRequest(requestOptions{
   107  		RequestName: internal.GetServiceBindingRequest,
   108  		URIParams:   Params{"service_binding_guid": guid},
   109  	})
   110  	if err != nil {
   111  		return ServiceBinding{}, nil, err
   112  	}
   113  
   114  	var serviceBinding ServiceBinding
   115  	response := cloudcontroller.Response{
   116  		Result: &serviceBinding,
   117  	}
   118  
   119  	err = client.connection.Make(request, &response)
   120  	return serviceBinding, response.Warnings, err
   121  }
   122  
   123  // GetServiceBindings returns back a list of Service Bindings based off of the
   124  // provided filters.
   125  func (client *Client) GetServiceBindings(filters ...Filter) ([]ServiceBinding, Warnings, error) {
   126  	request, err := client.newHTTPRequest(requestOptions{
   127  		RequestName: internal.GetServiceBindingsRequest,
   128  		Query:       ConvertFilterParameters(filters),
   129  	})
   130  	if err != nil {
   131  		return nil, nil, err
   132  	}
   133  
   134  	var fullBindingsList []ServiceBinding
   135  	warnings, err := client.paginate(request, ServiceBinding{}, func(item interface{}) error {
   136  		if binding, ok := item.(ServiceBinding); ok {
   137  			fullBindingsList = append(fullBindingsList, binding)
   138  		} else {
   139  			return ccerror.UnknownObjectInListError{
   140  				Expected:   ServiceBinding{},
   141  				Unexpected: item,
   142  			}
   143  		}
   144  		return nil
   145  	})
   146  
   147  	return fullBindingsList, warnings, err
   148  }
   149  
   150  // GetServiceInstanceServiceBindings returns back a list of Service Bindings for the provided service instance GUID.
   151  func (client *Client) GetServiceInstanceServiceBindings(serviceInstanceGUID string) ([]ServiceBinding, Warnings, error) {
   152  	request, err := client.newHTTPRequest(requestOptions{
   153  		RequestName: internal.GetServiceInstanceServiceBindingsRequest,
   154  		URIParams:   map[string]string{"service_instance_guid": serviceInstanceGUID},
   155  	})
   156  	if err != nil {
   157  		return nil, nil, err
   158  	}
   159  
   160  	var fullBindingsList []ServiceBinding
   161  	warnings, err := client.paginate(request, ServiceBinding{}, func(item interface{}) error {
   162  		if binding, ok := item.(ServiceBinding); ok {
   163  			fullBindingsList = append(fullBindingsList, binding)
   164  		} else {
   165  			return ccerror.UnknownObjectInListError{
   166  				Expected:   ServiceBinding{},
   167  				Unexpected: item,
   168  			}
   169  		}
   170  		return nil
   171  	})
   172  
   173  	return fullBindingsList, warnings, err
   174  }
   175  
   176  // GetUserProvidedServiceInstanceServiceBindings returns back a list of Service Bindings for the provided user provided service instance GUID.
   177  func (client *Client) GetUserProvidedServiceInstanceServiceBindings(userProvidedServiceInstanceGUID string) ([]ServiceBinding, Warnings, error) {
   178  	request, err := client.newHTTPRequest(requestOptions{
   179  		RequestName: internal.GetUserProvidedServiceInstanceServiceBindingsRequest,
   180  		URIParams:   map[string]string{"user_provided_service_instance_guid": userProvidedServiceInstanceGUID},
   181  	})
   182  	if err != nil {
   183  		return nil, nil, err
   184  	}
   185  
   186  	var fullBindingsList []ServiceBinding
   187  	warnings, err := client.paginate(request, ServiceBinding{}, func(item interface{}) error {
   188  		if binding, ok := item.(ServiceBinding); ok {
   189  			fullBindingsList = append(fullBindingsList, binding)
   190  		} else {
   191  			return ccerror.UnknownObjectInListError{
   192  				Expected:   ServiceBinding{},
   193  				Unexpected: item,
   194  			}
   195  		}
   196  		return nil
   197  	})
   198  
   199  	return fullBindingsList, warnings, err
   200  }