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 }