diff --git a/api.go b/api.go index bc04acac..170b7e01 100644 --- a/api.go +++ b/api.go @@ -32,6 +32,7 @@ const ( deprovisionLogKey = "deprovision" bindLogKey = "bind" getBindLogKey = "getBinding" + getInstanceLogKey = "getInstance" unbindLogKey = "unbind" updateLogKey = "update" lastOperationLogKey = "lastOperation" @@ -294,7 +295,7 @@ func (h serviceBrokerHandler) update(w http.ResponseWriter, req *http.Request) { } h.respond(w, statusCode, UpdateResponse{ OperationData: updateServiceSpec.OperationData, - DashboardURL: updateServiceSpec.DashboardURL, + DashboardURL: updateServiceSpec.DashboardURL, }) } @@ -362,7 +363,7 @@ func (h serviceBrokerHandler) getInstance(w http.ResponseWriter, req *http.Reque vars := mux.Vars(req) instanceID := vars["instance_id"] - logger := h.logger.Session(getBindLogKey, lager.Data{ + logger := h.logger.Session(getInstanceLogKey, lager.Data{ instanceIDLogKey: instanceID, }) @@ -375,8 +376,9 @@ func (h serviceBrokerHandler) getInstance(w http.ResponseWriter, req *http.Reque return } if versionCompatibility.Minor < 14 { + err = errors.New("get instance endpoint only supported starting with OSB version 2.14") h.respond(w, http.StatusPreconditionFailed, ErrorResponse{ - Description: "get instance endpoint only supported starting with OSB version 2.14", + Description: err.Error(), }) logger.Error(apiVersionInvalidKey, err) return diff --git a/api_test.go b/api_test.go index 3e4dd13b..85c17731 100644 --- a/api_test.go +++ b/api_test.go @@ -1245,6 +1245,60 @@ var _ = Describe("Service Broker API", func() { }) }) }) + + Describe("getting instance", func() { + It("returns the appropriate status code when it fails with a known error", func() { + fakeServiceBroker.GetInstanceError = brokerapi.NewFailureResponse(errors.New("some error"), http.StatusUnprocessableEntity, "fire") + + response := makeGetInstanceRequest("instance-id") + + Expect(response.StatusCode).To(Equal(http.StatusUnprocessableEntity)) + Expect(lastLogLine().Message).To(ContainSubstring("broker-api.getInstance.fire")) + Expect(lastLogLine().Data["error"]).To(ContainSubstring("some error")) + }) + + It("returns 500 when it fails with an unknown error", func() { + fakeServiceBroker.GetInstanceError = errors.New("failed to get instance") + + response := makeGetInstanceRequest("instance-id") + + Expect(response.StatusCode).To(Equal(500)) + Expect(lastLogLine().Message).To(ContainSubstring("broker-api.getInstance.unknown-error")) + Expect(lastLogLine().Data["error"]).To(ContainSubstring("failed to get instance")) + }) + + Context("the request is malformed", func() { + It("missing header X-Broker-API-Version", func() { + apiVersion = "" + response := makeGetInstanceRequest("instance-id") + Expect(response.StatusCode).To(Equal(412)) + Expect(lastLogLine().Message).To(ContainSubstring(".getInstance.broker-api-version-invalid")) + Expect(lastLogLine().Data["error"]).To(ContainSubstring("X-Broker-API-Version Header not set")) + }) + + It("has wrong version of API", func() { + apiVersion = "1.1" + response := makeGetInstanceRequest("instance-id") + Expect(response.StatusCode).To(Equal(412)) + Expect(lastLogLine().Message).To(ContainSubstring(".getInstance.broker-api-version-invalid")) + Expect(lastLogLine().Data["error"]).To(ContainSubstring("X-Broker-API-Version Header must be 2.x")) + }) + + It("is using api version < 2.14", func() { + apiVersion = "2.13" + response := makeGetInstanceRequest("instance-id") + Expect(response.StatusCode).To(Equal(412)) + + Expect(lastLogLine().Message).To(ContainSubstring(".getInstance.broker-api-version-invalid")) + Expect(lastLogLine().Data["error"]).To(ContainSubstring("get instance endpoint only supported starting with OSB version 2.14")) + }) + + It("missing instance-id", func() { + response := makeGetInstanceRequest("") + Expect(response.StatusCode).To(Equal(404)) + }) + }) + }) }) Describe("binding lifecycle endpoint", func() { diff --git a/fakes/fake_service_broker.go b/fakes/fake_service_broker.go index 35088378..6859c08f 100644 --- a/fakes/fake_service_broker.go +++ b/fakes/fake_service_broker.go @@ -34,6 +34,7 @@ type FakeServiceBroker struct { DeprovisionError error LastOperationError error UpdateError error + GetInstanceError error BrokerCalled bool LastOperationState brokerapi.LastOperationState @@ -248,7 +249,7 @@ func (fakeBroker *FakeServiceBroker) GetInstance(context context.Context, instan Parameters: map[string]interface{}{ "param1": "value1", }, - }, nil + }, fakeBroker.GetInstanceError } func (fakeBroker *FakeServiceBroker) Deprovision(context context.Context, instanceID string, details brokerapi.DeprovisionDetails, asyncAllowed bool) (brokerapi.DeprovisionServiceSpec, error) {