diff --git a/api.go b/api.go index c0417e1b..195db202 100644 --- a/api.go +++ b/api.go @@ -98,7 +98,7 @@ func AttachRoutes(router *mux.Router, serviceBroker ServiceBroker, logger lager. router.HandleFunc("/v2/service_instances/{instance_id}/service_bindings/{binding_id}", apiHandler.Bind).Methods("PUT") router.HandleFunc("/v2/service_instances/{instance_id}/service_bindings/{binding_id}", apiHandler.Unbind).Methods("DELETE") - router.HandleFunc("/v2/service_instances/{instance_id}/service_bindings/{binding_id}/last_operation", handler.lastBindingOperation).Methods("GET") + router.HandleFunc("/v2/service_instances/{instance_id}/service_bindings/{binding_id}/last_operation", apiHandler.LastBindingOperation).Methods("GET") } type serviceBrokerHandler struct { @@ -106,57 +106,6 @@ type serviceBrokerHandler struct { logger lager.Logger } -func (h serviceBrokerHandler) lastBindingOperation(w http.ResponseWriter, req *http.Request) { - vars := mux.Vars(req) - instanceID := vars["instance_id"] - bindingID := vars["binding_id"] - pollDetails := domain.PollDetails{ - PlanID: req.FormValue("plan_id"), - ServiceID: req.FormValue("service_id"), - OperationData: req.FormValue("operation"), - } - - logger := h.logger.Session(lastBindingOperationLogKey, lager.Data{ - instanceIDLogKey: instanceID, - }) - - version := getAPIVersion(req) - if version.Minor < 14 { - err := errors.New("get binding endpoint only supported starting with OSB version 2.14") - h.respond(w, http.StatusPreconditionFailed, apiresponses.ErrorResponse{ - Description: err.Error(), - }) - logger.Error(apiVersionInvalidKey, err) - return - } - - logger.Info("starting-check-for-binding-operation") - - lastOperation, err := h.serviceBroker.LastBindingOperation(req.Context(), instanceID, bindingID, pollDetails) - - if err != nil { - switch err := err.(type) { - case *apiresponses.FailureResponse: - logger.Error(err.LoggerAction(), err) - h.respond(w, err.ValidatedStatusCode(logger), err.ErrorResponse()) - default: - logger.Error(unknownErrorKey, err) - h.respond(w, http.StatusInternalServerError, apiresponses.ErrorResponse{ - Description: err.Error(), - }) - } - return - } - - logger.WithData(lager.Data{"state": lastOperation.State}).Info("done-check-for-binding-operation") - - lastOperationResponse := apiresponses.LastOperationResponse{ - State: lastOperation.State, - Description: lastOperation.Description, - } - h.respond(w, http.StatusOK, lastOperationResponse) -} - func (h serviceBrokerHandler) lastOperation(w http.ResponseWriter, req *http.Request) { vars := mux.Vars(req) instanceID := vars["instance_id"] diff --git a/handlers/api_handler.go b/handlers/api_handler.go index 24cd50a2..cbf23983 100644 --- a/handlers/api_handler.go +++ b/handlers/api_handler.go @@ -20,8 +20,7 @@ const ( bindingIDLogKey = "binding-id" - lastOperationLogKey = "lastOperation" - lastBindingOperationLogKey = "lastBindingOperation" + lastOperationLogKey = "lastOperation" ) var ( diff --git a/handlers/last_binding_operation.go b/handlers/last_binding_operation.go new file mode 100644 index 00000000..34d6d7b2 --- /dev/null +++ b/handlers/last_binding_operation.go @@ -0,0 +1,64 @@ +package handlers + +import ( + "errors" + "net/http" + + "code.cloudfoundry.org/lager" + "github.com/gorilla/mux" + "github.com/pivotal-cf/brokerapi/domain" + "github.com/pivotal-cf/brokerapi/domain/apiresponses" +) + +const lastBindingOperationLogKey = "lastBindingOperation" + +func (h APIHandler) LastBindingOperation(w http.ResponseWriter, req *http.Request) { + vars := mux.Vars(req) + instanceID := vars["instance_id"] + bindingID := vars["binding_id"] + pollDetails := domain.PollDetails{ + PlanID: req.FormValue("plan_id"), + ServiceID: req.FormValue("service_id"), + OperationData: req.FormValue("operation"), + } + + logger := h.Logger.Session(lastBindingOperationLogKey, lager.Data{ + instanceIDLogKey: instanceID, + }) + + version := getAPIVersion(req) + if version.Minor < 14 { + err := errors.New("get binding endpoint only supported starting with OSB version 2.14") + h.respond(w, http.StatusPreconditionFailed, apiresponses.ErrorResponse{ + Description: err.Error(), + }) + logger.Error(apiVersionInvalidKey, err) + return + } + + logger.Info("starting-check-for-binding-operation") + + lastOperation, err := h.ServiceBroker.LastBindingOperation(req.Context(), instanceID, bindingID, pollDetails) + + if err != nil { + switch err := err.(type) { + case *apiresponses.FailureResponse: + logger.Error(err.LoggerAction(), err) + h.respond(w, err.ValidatedStatusCode(logger), err.ErrorResponse()) + default: + logger.Error(unknownErrorKey, err) + h.respond(w, http.StatusInternalServerError, apiresponses.ErrorResponse{ + Description: err.Error(), + }) + } + return + } + + logger.WithData(lager.Data{"state": lastOperation.State}).Info("done-check-for-binding-operation") + + lastOperationResponse := apiresponses.LastOperationResponse{ + State: lastOperation.State, + Description: lastOperation.Description, + } + h.respond(w, http.StatusOK, lastOperationResponse) +}