From 2f6038942b25ace91652d0fb4fadd99506f23e08 Mon Sep 17 00:00:00 2001 From: Felisia Martini Date: Wed, 31 Mar 2021 12:43:18 +0100 Subject: [PATCH] Introduce FetchDetails for Fetch Instance/Binding APIs(#147) Co-authored-by: NickyMateev --- api_test.go | 130 +++++++++++++++++++++++++++++- domain/service_broker.go | 14 +++- fakes/auto_fake_service_broker.go | 102 +++++++++++++---------- fakes/fake_service_broker.go | 18 +++-- handlers/get_binding.go | 8 +- handlers/get_instance.go | 9 ++- v7/domain/service_broker.go | 14 +++- v7/handlers/get_binding.go | 8 +- v7/handlers/get_instance.go | 8 +- 9 files changed, 251 insertions(+), 60 deletions(-) diff --git a/api_test.go b/api_test.go index 4326aa68..77352f65 100644 --- a/api_test.go +++ b/api_test.go @@ -537,7 +537,7 @@ var _ = Describe("Service Broker API", func() { }) Describe("instance lifecycle endpoint", func() { - makeGetInstanceRequest := func(instanceID string) *testflight.Response { + makeGetInstanceWithQueryParamsRequest := func(instanceID string, params map[string]string) *testflight.Response { response := &testflight.Response{} testflight.WithServer(brokerAPI, func(r *testflight.Requester) { path := fmt.Sprintf("/v2/service_instances/%s", instanceID) @@ -546,11 +546,20 @@ var _ = Describe("Service Broker API", func() { request.Header.Add("X-Broker-API-Version", apiVersion) request.Header.Add("X-Broker-API-Request-Identity", requestIdentity) request.SetBasicAuth("username", "password") + q := request.URL.Query() + for query, value := range params { + q.Add(query, value) + } + request.URL.RawQuery = q.Encode() response = r.Do(request) }) return response } + makeGetInstanceRequest := func(instanceID string) *testflight.Response { + return makeGetInstanceWithQueryParamsRequest(instanceID, map[string]string{}) + } + makeInstanceDeprovisioningRequestFull := func(instanceID, serviceID, planID, queryString string) *testflight.Response { response := &testflight.Response{} testflight.WithServer(brokerAPI, func(r *testflight.Requester) { @@ -1642,6 +1651,53 @@ var _ = Describe("Service Broker API", func() { Expect(response.StatusCode).To(Equal(404)) }) }) + + Context("fetch details", func() { + It("returns 200 when service_id and plan_id are not provided", func() { + response := makeGetInstanceWithQueryParamsRequest("instance-id", map[string]string{}) + + Expect(response.StatusCode).To(Equal(http.StatusOK)) + Expect(fakeServiceBroker.InstanceFetchDetails.ServiceID).To(Equal("")) + Expect(fakeServiceBroker.InstanceFetchDetails.PlanID).To(Equal("")) + }) + + It("returns 200 when service_id and plan_id are provided", func() { + params := map[string]string{ + "service_id": "e1307a5f-c54d-4f5d-924e-e5618c52ac0a", + "plan_id": "c6b2db23-60bf-4613-a91c-687372da42a5", + } + + response := makeGetInstanceWithQueryParamsRequest("instance-id", params) + + Expect(response.StatusCode).To(Equal(http.StatusOK)) + Expect(fakeServiceBroker.InstanceFetchDetails.ServiceID).To(Equal(params["service_id"])) + Expect(fakeServiceBroker.InstanceFetchDetails.PlanID).To(Equal(params["plan_id"])) + }) + + It("returns 200 when only service_id is provided", func() { + params := map[string]string{ + "service_id": "e1307a5f-c54d-4f5d-924e-e5618c52ac0a", + } + + response := makeGetInstanceWithQueryParamsRequest("instance-id", params) + + Expect(response.StatusCode).To(Equal(http.StatusOK)) + Expect(fakeServiceBroker.InstanceFetchDetails.ServiceID).To(Equal(params["service_id"])) + Expect(fakeServiceBroker.InstanceFetchDetails.PlanID).To(Equal("")) + }) + + It("returns 200 when only plan_id is provided", func() { + params := map[string]string{ + "plan_id": "c6b2db23-60bf-4613-a91c-687372da42a5", + } + + response := makeGetInstanceWithQueryParamsRequest("instance-id", params) + + Expect(response.StatusCode).To(Equal(http.StatusOK)) + Expect(fakeServiceBroker.InstanceFetchDetails.ServiceID).To(Equal("")) + Expect(fakeServiceBroker.InstanceFetchDetails.PlanID).To(Equal(params["plan_id"])) + }) + }) }) }) @@ -1669,6 +1725,31 @@ var _ = Describe("Service Broker API", func() { return response } + makeGetBindingWithQueryParamsRequest := func(instanceID, bindingID string, params map[string]string) *testflight.Response { + response := &testflight.Response{} + testflight.WithServer(brokerAPI, func(r *testflight.Requester) { + path := fmt.Sprintf("/v2/service_instances/%s/service_bindings/%s", instanceID, bindingID) + + buffer := &bytes.Buffer{} + + request, err := http.NewRequest("GET", path, buffer) + + Expect(err).NotTo(HaveOccurred()) + + request.Header.Add("X-Broker-Api-Version", "2.14") + request.Header.Add("Content-Type", "application/json") + request.SetBasicAuth("username", "password") + + q := request.URL.Query() + for query, value := range params { + q.Add(query, value) + } + request.URL.RawQuery = q.Encode() + response = r.Do(request) + }) + return response + } + makeGetBindingRequestWithSpecificAPIVersion := func(instanceID, bindingID string, apiVersion string) *testflight.Response { response := &testflight.Response{} testflight.WithServer(brokerAPI, func(r *testflight.Requester) { @@ -2504,5 +2585,52 @@ var _ = Describe("Service Broker API", func() { Expect(lastLogLine().Data["error"]).To(ContainSubstring("some error")) }) }) + + Context("fetch details", func() { + It("returns 200 when service_id and plan_id are not provided", func() { + response := makeGetBindingWithQueryParamsRequest("instance-id", "binding-id", map[string]string{}) + + Expect(response.StatusCode).To(Equal(http.StatusOK)) + Expect(fakeServiceBroker.BindingFetchDetails.ServiceID).To(Equal("")) + Expect(fakeServiceBroker.BindingFetchDetails.PlanID).To(Equal("")) + }) + + It("returns 200 when service_id and plan_id are provided", func() { + params := map[string]string{ + "service_id": "e1307a5f-c54d-4f5d-924e-e5618c52ac0a", + "plan_id": "c6b2db23-60bf-4613-a91c-687372da42a5", + } + + response := makeGetBindingWithQueryParamsRequest("instance-id", "binding-id", params) + + Expect(response.StatusCode).To(Equal(http.StatusOK)) + Expect(fakeServiceBroker.BindingFetchDetails.ServiceID).To(Equal(params["service_id"])) + Expect(fakeServiceBroker.BindingFetchDetails.PlanID).To(Equal(params["plan_id"])) + }) + + It("returns 200 when only service_id is provided", func() { + params := map[string]string{ + "service_id": "e1307a5f-c54d-4f5d-924e-e5618c52ac0a", + } + + response := makeGetBindingWithQueryParamsRequest("instance-id", "binding-id", params) + + Expect(response.StatusCode).To(Equal(http.StatusOK)) + Expect(fakeServiceBroker.BindingFetchDetails.ServiceID).To(Equal(params["service_id"])) + Expect(fakeServiceBroker.BindingFetchDetails.PlanID).To(Equal("")) + }) + + It("returns 200 when only plan_id is provided", func() { + params := map[string]string{ + "plan_id": "c6b2db23-60bf-4613-a91c-687372da42a5", + } + + response := makeGetBindingWithQueryParamsRequest("instance-id", "binding-id", params) + + Expect(response.StatusCode).To(Equal(http.StatusOK)) + Expect(fakeServiceBroker.BindingFetchDetails.ServiceID).To(Equal("")) + Expect(fakeServiceBroker.BindingFetchDetails.PlanID).To(Equal(params["plan_id"])) + }) + }) }) }) diff --git a/domain/service_broker.go b/domain/service_broker.go index ad186ad3..6fcee6e5 100644 --- a/domain/service_broker.go +++ b/domain/service_broker.go @@ -26,7 +26,7 @@ type ServiceBroker interface { // GetInstance fetches information about a service instance // GET /v2/service_instances/{instance_id} - GetInstance(ctx context.Context, instanceID string) (GetInstanceDetailsSpec, error) + GetInstance(ctx context.Context, instanceID string, details FetchInstanceDetails) (GetInstanceDetailsSpec, error) // Update modifies an existing service instance // PATCH /v2/service_instances/{instance_id} @@ -46,7 +46,7 @@ type ServiceBroker interface { // GetBinding fetches an existing service binding // GET /v2/service_instances/{instance_id}/service_bindings/{binding_id} - GetBinding(ctx context.Context, instanceID, bindingID string) (GetBindingSpec, error) + GetBinding(ctx context.Context, instanceID, bindingID string, details FetchBindingDetails) (GetBindingSpec, error) // LastBindingOperation fetches last operation state for a service binding // GET /v2/service_instances/{instance_id}/service_bindings/{binding_id}/last_operation @@ -143,6 +143,16 @@ type UpdateServiceSpec struct { OperationData string } +type FetchInstanceDetails struct { + ServiceID string `json:"service_id"` + PlanID string `json:"plan_id"` +} + +type FetchBindingDetails struct { + ServiceID string `json:"service_id"` + PlanID string `json:"plan_id"` +} + type PollDetails struct { ServiceID string `json:"service_id"` PlanID string `json:"plan_id"` diff --git a/fakes/auto_fake_service_broker.go b/fakes/auto_fake_service_broker.go index 80957a5d..1e8f8c01 100644 --- a/fakes/auto_fake_service_broker.go +++ b/fakes/auto_fake_service_broker.go @@ -42,12 +42,13 @@ type AutoFakeServiceBroker struct { result1 domain.DeprovisionServiceSpec result2 error } - GetBindingStub func(context.Context, string, string) (domain.GetBindingSpec, error) + GetBindingStub func(context.Context, string, string, domain.FetchBindingDetails) (domain.GetBindingSpec, error) getBindingMutex sync.RWMutex getBindingArgsForCall []struct { arg1 context.Context arg2 string arg3 string + arg4 domain.FetchBindingDetails } getBindingReturns struct { result1 domain.GetBindingSpec @@ -57,11 +58,12 @@ type AutoFakeServiceBroker struct { result1 domain.GetBindingSpec result2 error } - GetInstanceStub func(context.Context, string) (domain.GetInstanceDetailsSpec, error) + GetInstanceStub func(context.Context, string, domain.FetchInstanceDetails) (domain.GetInstanceDetailsSpec, error) getInstanceMutex sync.RWMutex getInstanceArgsForCall []struct { arg1 context.Context arg2 string + arg3 domain.FetchInstanceDetails } getInstanceReturns struct { result1 domain.GetInstanceDetailsSpec @@ -178,15 +180,16 @@ func (fake *AutoFakeServiceBroker) Bind(arg1 context.Context, arg2 string, arg3 arg4 domain.BindDetails arg5 bool }{arg1, arg2, arg3, arg4, arg5}) + stub := fake.BindStub + fakeReturns := fake.bindReturns fake.recordInvocation("Bind", []interface{}{arg1, arg2, arg3, arg4, arg5}) fake.bindMutex.Unlock() - if fake.BindStub != nil { - return fake.BindStub(arg1, arg2, arg3, arg4, arg5) + if stub != nil { + return stub(arg1, arg2, arg3, arg4, arg5) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.bindReturns return fakeReturns.result1, fakeReturns.result2 } @@ -244,15 +247,16 @@ func (fake *AutoFakeServiceBroker) Deprovision(arg1 context.Context, arg2 string arg3 domain.DeprovisionDetails arg4 bool }{arg1, arg2, arg3, arg4}) + stub := fake.DeprovisionStub + fakeReturns := fake.deprovisionReturns fake.recordInvocation("Deprovision", []interface{}{arg1, arg2, arg3, arg4}) fake.deprovisionMutex.Unlock() - if fake.DeprovisionStub != nil { - return fake.DeprovisionStub(arg1, arg2, arg3, arg4) + if stub != nil { + return stub(arg1, arg2, arg3, arg4) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.deprovisionReturns return fakeReturns.result1, fakeReturns.result2 } @@ -301,23 +305,25 @@ func (fake *AutoFakeServiceBroker) DeprovisionReturnsOnCall(i int, result1 domai }{result1, result2} } -func (fake *AutoFakeServiceBroker) GetBinding(arg1 context.Context, arg2 string, arg3 string) (domain.GetBindingSpec, error) { +func (fake *AutoFakeServiceBroker) GetBinding(arg1 context.Context, arg2 string, arg3 string, arg4 domain.FetchBindingDetails) (domain.GetBindingSpec, error) { fake.getBindingMutex.Lock() ret, specificReturn := fake.getBindingReturnsOnCall[len(fake.getBindingArgsForCall)] fake.getBindingArgsForCall = append(fake.getBindingArgsForCall, struct { arg1 context.Context arg2 string arg3 string - }{arg1, arg2, arg3}) - fake.recordInvocation("GetBinding", []interface{}{arg1, arg2, arg3}) + arg4 domain.FetchBindingDetails + }{arg1, arg2, arg3, arg4}) + stub := fake.GetBindingStub + fakeReturns := fake.getBindingReturns + fake.recordInvocation("GetBinding", []interface{}{arg1, arg2, arg3, arg4}) fake.getBindingMutex.Unlock() - if fake.GetBindingStub != nil { - return fake.GetBindingStub(arg1, arg2, arg3) + if stub != nil { + return stub(arg1, arg2, arg3, arg4) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.getBindingReturns return fakeReturns.result1, fakeReturns.result2 } @@ -327,17 +333,17 @@ func (fake *AutoFakeServiceBroker) GetBindingCallCount() int { return len(fake.getBindingArgsForCall) } -func (fake *AutoFakeServiceBroker) GetBindingCalls(stub func(context.Context, string, string) (domain.GetBindingSpec, error)) { +func (fake *AutoFakeServiceBroker) GetBindingCalls(stub func(context.Context, string, string, domain.FetchBindingDetails) (domain.GetBindingSpec, error)) { fake.getBindingMutex.Lock() defer fake.getBindingMutex.Unlock() fake.GetBindingStub = stub } -func (fake *AutoFakeServiceBroker) GetBindingArgsForCall(i int) (context.Context, string, string) { +func (fake *AutoFakeServiceBroker) GetBindingArgsForCall(i int) (context.Context, string, string, domain.FetchBindingDetails) { fake.getBindingMutex.RLock() defer fake.getBindingMutex.RUnlock() argsForCall := fake.getBindingArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 + return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 } func (fake *AutoFakeServiceBroker) GetBindingReturns(result1 domain.GetBindingSpec, result2 error) { @@ -366,22 +372,24 @@ func (fake *AutoFakeServiceBroker) GetBindingReturnsOnCall(i int, result1 domain }{result1, result2} } -func (fake *AutoFakeServiceBroker) GetInstance(arg1 context.Context, arg2 string) (domain.GetInstanceDetailsSpec, error) { +func (fake *AutoFakeServiceBroker) GetInstance(arg1 context.Context, arg2 string, arg3 domain.FetchInstanceDetails) (domain.GetInstanceDetailsSpec, error) { fake.getInstanceMutex.Lock() ret, specificReturn := fake.getInstanceReturnsOnCall[len(fake.getInstanceArgsForCall)] fake.getInstanceArgsForCall = append(fake.getInstanceArgsForCall, struct { arg1 context.Context arg2 string - }{arg1, arg2}) - fake.recordInvocation("GetInstance", []interface{}{arg1, arg2}) + arg3 domain.FetchInstanceDetails + }{arg1, arg2, arg3}) + stub := fake.GetInstanceStub + fakeReturns := fake.getInstanceReturns + fake.recordInvocation("GetInstance", []interface{}{arg1, arg2, arg3}) fake.getInstanceMutex.Unlock() - if fake.GetInstanceStub != nil { - return fake.GetInstanceStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2, arg3) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.getInstanceReturns return fakeReturns.result1, fakeReturns.result2 } @@ -391,17 +399,17 @@ func (fake *AutoFakeServiceBroker) GetInstanceCallCount() int { return len(fake.getInstanceArgsForCall) } -func (fake *AutoFakeServiceBroker) GetInstanceCalls(stub func(context.Context, string) (domain.GetInstanceDetailsSpec, error)) { +func (fake *AutoFakeServiceBroker) GetInstanceCalls(stub func(context.Context, string, domain.FetchInstanceDetails) (domain.GetInstanceDetailsSpec, error)) { fake.getInstanceMutex.Lock() defer fake.getInstanceMutex.Unlock() fake.GetInstanceStub = stub } -func (fake *AutoFakeServiceBroker) GetInstanceArgsForCall(i int) (context.Context, string) { +func (fake *AutoFakeServiceBroker) GetInstanceArgsForCall(i int) (context.Context, string, domain.FetchInstanceDetails) { fake.getInstanceMutex.RLock() defer fake.getInstanceMutex.RUnlock() argsForCall := fake.getInstanceArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 + return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 } func (fake *AutoFakeServiceBroker) GetInstanceReturns(result1 domain.GetInstanceDetailsSpec, result2 error) { @@ -439,15 +447,16 @@ func (fake *AutoFakeServiceBroker) LastBindingOperation(arg1 context.Context, ar arg3 string arg4 domain.PollDetails }{arg1, arg2, arg3, arg4}) + stub := fake.LastBindingOperationStub + fakeReturns := fake.lastBindingOperationReturns fake.recordInvocation("LastBindingOperation", []interface{}{arg1, arg2, arg3, arg4}) fake.lastBindingOperationMutex.Unlock() - if fake.LastBindingOperationStub != nil { - return fake.LastBindingOperationStub(arg1, arg2, arg3, arg4) + if stub != nil { + return stub(arg1, arg2, arg3, arg4) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.lastBindingOperationReturns return fakeReturns.result1, fakeReturns.result2 } @@ -504,15 +513,16 @@ func (fake *AutoFakeServiceBroker) LastOperation(arg1 context.Context, arg2 stri arg2 string arg3 domain.PollDetails }{arg1, arg2, arg3}) + stub := fake.LastOperationStub + fakeReturns := fake.lastOperationReturns fake.recordInvocation("LastOperation", []interface{}{arg1, arg2, arg3}) fake.lastOperationMutex.Unlock() - if fake.LastOperationStub != nil { - return fake.LastOperationStub(arg1, arg2, arg3) + if stub != nil { + return stub(arg1, arg2, arg3) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.lastOperationReturns return fakeReturns.result1, fakeReturns.result2 } @@ -570,15 +580,16 @@ func (fake *AutoFakeServiceBroker) Provision(arg1 context.Context, arg2 string, arg3 domain.ProvisionDetails arg4 bool }{arg1, arg2, arg3, arg4}) + stub := fake.ProvisionStub + fakeReturns := fake.provisionReturns fake.recordInvocation("Provision", []interface{}{arg1, arg2, arg3, arg4}) fake.provisionMutex.Unlock() - if fake.ProvisionStub != nil { - return fake.ProvisionStub(arg1, arg2, arg3, arg4) + if stub != nil { + return stub(arg1, arg2, arg3, arg4) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.provisionReturns return fakeReturns.result1, fakeReturns.result2 } @@ -633,15 +644,16 @@ func (fake *AutoFakeServiceBroker) Services(arg1 context.Context) ([]domain.Serv fake.servicesArgsForCall = append(fake.servicesArgsForCall, struct { arg1 context.Context }{arg1}) + stub := fake.ServicesStub + fakeReturns := fake.servicesReturns fake.recordInvocation("Services", []interface{}{arg1}) fake.servicesMutex.Unlock() - if fake.ServicesStub != nil { - return fake.ServicesStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.servicesReturns return fakeReturns.result1, fakeReturns.result2 } @@ -700,15 +712,16 @@ func (fake *AutoFakeServiceBroker) Unbind(arg1 context.Context, arg2 string, arg arg4 domain.UnbindDetails arg5 bool }{arg1, arg2, arg3, arg4, arg5}) + stub := fake.UnbindStub + fakeReturns := fake.unbindReturns fake.recordInvocation("Unbind", []interface{}{arg1, arg2, arg3, arg4, arg5}) fake.unbindMutex.Unlock() - if fake.UnbindStub != nil { - return fake.UnbindStub(arg1, arg2, arg3, arg4, arg5) + if stub != nil { + return stub(arg1, arg2, arg3, arg4, arg5) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.unbindReturns return fakeReturns.result1, fakeReturns.result2 } @@ -766,15 +779,16 @@ func (fake *AutoFakeServiceBroker) Update(arg1 context.Context, arg2 string, arg arg3 domain.UpdateDetails arg4 bool }{arg1, arg2, arg3, arg4}) + stub := fake.UpdateStub + fakeReturns := fake.updateReturns fake.recordInvocation("Update", []interface{}{arg1, arg2, arg3, arg4}) fake.updateMutex.Unlock() - if fake.UpdateStub != nil { - return fake.UpdateStub(arg1, arg2, arg3, arg4) + if stub != nil { + return stub(arg1, arg2, arg3, arg4) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.updateReturns return fakeReturns.result1, fakeReturns.result2 } diff --git a/fakes/fake_service_broker.go b/fakes/fake_service_broker.go index 2f69c8c5..2cff5263 100644 --- a/fakes/fake_service_broker.go +++ b/fakes/fake_service_broker.go @@ -5,16 +5,17 @@ import ( "errors" "reflect" - "github.com/pivotal-cf/brokerapi/v7/domain/apiresponses" - "github.com/pivotal-cf/brokerapi/v7" + "github.com/pivotal-cf/brokerapi/v7/domain" + "github.com/pivotal-cf/brokerapi/v7/domain/apiresponses" ) type FakeServiceBroker struct { ProvisionedInstances map[string]brokerapi.ProvisionDetails - UpdateDetails brokerapi.UpdateDetails - DeprovisionDetails brokerapi.DeprovisionDetails + InstanceFetchDetails domain.FetchInstanceDetails + UpdateDetails brokerapi.UpdateDetails + DeprovisionDetails brokerapi.DeprovisionDetails DeprovisionedInstanceIDs []string UpdatedInstanceIDs []string @@ -27,7 +28,8 @@ type FakeServiceBroker struct { BackupAgentURL string VolumeMounts []brokerapi.VolumeMount - UnbindingDetails brokerapi.UnbindDetails + BindingFetchDetails domain.FetchBindingDetails + UnbindingDetails brokerapi.UnbindDetails InstanceLimit int @@ -253,13 +255,14 @@ func (fakeBroker *FakeServiceBroker) Update(context context.Context, instanceID return brokerapi.UpdateServiceSpec{IsAsync: fakeBroker.ShouldReturnAsync, OperationData: fakeBroker.OperationDataToReturn, DashboardURL: fakeBroker.DashboardURL}, nil } -func (fakeBroker *FakeServiceBroker) GetInstance(context context.Context, instanceID string) (brokerapi.GetInstanceDetailsSpec, error) { +func (fakeBroker *FakeServiceBroker) GetInstance(context context.Context, instanceID string, details domain.FetchInstanceDetails) (brokerapi.GetInstanceDetailsSpec, error) { fakeBroker.BrokerCalled = true if val, ok := context.Value("test_context").(bool); ok { fakeBroker.ReceivedContext = val } + fakeBroker.InstanceFetchDetails = details fakeBroker.GetInstanceIDs = append(fakeBroker.GetInstanceIDs, instanceID) return brokerapi.GetInstanceDetailsSpec{ ServiceID: fakeBroker.ServiceID, @@ -329,13 +332,14 @@ func (fakeBroker *FakeAsyncServiceBroker) Deprovision(context context.Context, i return brokerapi.DeprovisionServiceSpec{OperationData: fakeBroker.OperationDataToReturn, IsAsync: asyncAllowed}, brokerapi.ErrInstanceDoesNotExist } -func (fakeBroker *FakeServiceBroker) GetBinding(context context.Context, instanceID, bindingID string) (brokerapi.GetBindingSpec, error) { +func (fakeBroker *FakeServiceBroker) GetBinding(context context.Context, instanceID, bindingID string, details domain.FetchBindingDetails) (brokerapi.GetBindingSpec, error) { fakeBroker.BrokerCalled = true if val, ok := context.Value("test_context").(bool); ok { fakeBroker.ReceivedContext = val } + fakeBroker.BindingFetchDetails = details return brokerapi.GetBindingSpec{ Credentials: FakeCredentials{ Host: "127.0.0.1", diff --git a/handlers/get_binding.go b/handlers/get_binding.go index 598b5816..90048c6a 100644 --- a/handlers/get_binding.go +++ b/handlers/get_binding.go @@ -7,6 +7,7 @@ import ( "code.cloudfoundry.org/lager" "github.com/gorilla/mux" + "github.com/pivotal-cf/brokerapi/v7/domain" "github.com/pivotal-cf/brokerapi/v7/domain/apiresponses" "github.com/pivotal-cf/brokerapi/v7/middlewares" "github.com/pivotal-cf/brokerapi/v7/utils" @@ -36,7 +37,12 @@ func (h APIHandler) GetBinding(w http.ResponseWriter, req *http.Request) { return } - binding, err := h.serviceBroker.GetBinding(req.Context(), instanceID, bindingID) + details := domain.FetchBindingDetails{ + ServiceID: req.URL.Query().Get("service_id"), + PlanID: req.URL.Query().Get("plan_id"), + } + + binding, err := h.serviceBroker.GetBinding(req.Context(), instanceID, bindingID, details) if err != nil { switch err := err.(type) { case *apiresponses.FailureResponse: diff --git a/handlers/get_instance.go b/handlers/get_instance.go index 6a479b7b..2466cadc 100644 --- a/handlers/get_instance.go +++ b/handlers/get_instance.go @@ -5,6 +5,8 @@ import ( "fmt" "net/http" + "github.com/pivotal-cf/brokerapi/v7/domain" + "code.cloudfoundry.org/lager" "github.com/gorilla/mux" "github.com/pivotal-cf/brokerapi/v7/domain/apiresponses" @@ -34,7 +36,12 @@ func (h APIHandler) GetInstance(w http.ResponseWriter, req *http.Request) { return } - instanceDetails, err := h.serviceBroker.GetInstance(req.Context(), instanceID) + details := domain.FetchInstanceDetails{ + ServiceID: req.URL.Query().Get("service_id"), + PlanID: req.URL.Query().Get("plan_id"), + } + + instanceDetails, err := h.serviceBroker.GetInstance(req.Context(), instanceID, details) if err != nil { switch err := err.(type) { case *apiresponses.FailureResponse: diff --git a/v7/domain/service_broker.go b/v7/domain/service_broker.go index ad186ad3..6fcee6e5 100644 --- a/v7/domain/service_broker.go +++ b/v7/domain/service_broker.go @@ -26,7 +26,7 @@ type ServiceBroker interface { // GetInstance fetches information about a service instance // GET /v2/service_instances/{instance_id} - GetInstance(ctx context.Context, instanceID string) (GetInstanceDetailsSpec, error) + GetInstance(ctx context.Context, instanceID string, details FetchInstanceDetails) (GetInstanceDetailsSpec, error) // Update modifies an existing service instance // PATCH /v2/service_instances/{instance_id} @@ -46,7 +46,7 @@ type ServiceBroker interface { // GetBinding fetches an existing service binding // GET /v2/service_instances/{instance_id}/service_bindings/{binding_id} - GetBinding(ctx context.Context, instanceID, bindingID string) (GetBindingSpec, error) + GetBinding(ctx context.Context, instanceID, bindingID string, details FetchBindingDetails) (GetBindingSpec, error) // LastBindingOperation fetches last operation state for a service binding // GET /v2/service_instances/{instance_id}/service_bindings/{binding_id}/last_operation @@ -143,6 +143,16 @@ type UpdateServiceSpec struct { OperationData string } +type FetchInstanceDetails struct { + ServiceID string `json:"service_id"` + PlanID string `json:"plan_id"` +} + +type FetchBindingDetails struct { + ServiceID string `json:"service_id"` + PlanID string `json:"plan_id"` +} + type PollDetails struct { ServiceID string `json:"service_id"` PlanID string `json:"plan_id"` diff --git a/v7/handlers/get_binding.go b/v7/handlers/get_binding.go index 598b5816..90048c6a 100644 --- a/v7/handlers/get_binding.go +++ b/v7/handlers/get_binding.go @@ -7,6 +7,7 @@ import ( "code.cloudfoundry.org/lager" "github.com/gorilla/mux" + "github.com/pivotal-cf/brokerapi/v7/domain" "github.com/pivotal-cf/brokerapi/v7/domain/apiresponses" "github.com/pivotal-cf/brokerapi/v7/middlewares" "github.com/pivotal-cf/brokerapi/v7/utils" @@ -36,7 +37,12 @@ func (h APIHandler) GetBinding(w http.ResponseWriter, req *http.Request) { return } - binding, err := h.serviceBroker.GetBinding(req.Context(), instanceID, bindingID) + details := domain.FetchBindingDetails{ + ServiceID: req.URL.Query().Get("service_id"), + PlanID: req.URL.Query().Get("plan_id"), + } + + binding, err := h.serviceBroker.GetBinding(req.Context(), instanceID, bindingID, details) if err != nil { switch err := err.(type) { case *apiresponses.FailureResponse: diff --git a/v7/handlers/get_instance.go b/v7/handlers/get_instance.go index 6a479b7b..67185047 100644 --- a/v7/handlers/get_instance.go +++ b/v7/handlers/get_instance.go @@ -3,6 +3,7 @@ package handlers import ( "errors" "fmt" + "github.com/pivotal-cf/brokerapi/v7/domain" "net/http" "code.cloudfoundry.org/lager" @@ -34,7 +35,12 @@ func (h APIHandler) GetInstance(w http.ResponseWriter, req *http.Request) { return } - instanceDetails, err := h.serviceBroker.GetInstance(req.Context(), instanceID) + details := domain.FetchInstanceDetails{ + ServiceID: req.URL.Query().Get("service_id"), + PlanID: req.URL.Query().Get("plan_id"), + } + + instanceDetails, err := h.serviceBroker.GetInstance(req.Context(), instanceID, details) if err != nil { switch err := err.(type) { case *apiresponses.FailureResponse: