Skip to content

Commit cf3240c

Browse files
ataleksandrovFelisiaM
authored andcommitted
Add correlation id middleware
1 parent 7f17218 commit cf3240c

16 files changed

+188
-22
lines changed

Gopkg.lock

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ func New(serviceBroker ServiceBroker, logger lager.Logger, brokerCredentials Bro
3838
authMiddleware := auth.NewWrapper(brokerCredentials.Username, brokerCredentials.Password).Wrap
3939
apiVersionMiddleware := middlewares.APIVersionMiddleware{LoggerFactory: logger}
4040

41+
router.Use(middlewares.AddCorrelationIDToContext)
4142
router.Use(authMiddleware)
4243
router.Use(middlewares.AddOriginatingIdentityToContext)
4344
router.Use(apiVersionMiddleware.ValidateAPIVersionHdr)

api_test.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import (
2626
"net/url"
2727
"strings"
2828

29+
"github.com/pivotal-cf/brokerapi/middlewares"
30+
2931
"code.cloudfoundry.org/lager"
3032
"code.cloudfoundry.org/lager/lagertest"
3133
"github.com/drewolson/testflight"
@@ -109,6 +111,13 @@ var _ = Describe("Service Broker API", func() {
109111
return recorder
110112
}
111113

114+
It("has a X-Correlation-ID header", func() {
115+
response := makeRequest()
116+
117+
header := response.Header().Get("X-Correlation-ID")
118+
Expect(header).Should(Not(BeNil()))
119+
})
120+
112121
It("has a Content-Type header", func() {
113122
response := makeRequest()
114123

@@ -2326,4 +2335,54 @@ var _ = Describe("Service Broker API", func() {
23262335
})
23272336
})
23282337
})
2338+
2339+
Describe("CorrelationIDHeader", func() {
2340+
2341+
var (
2342+
fakeServiceBroker *fakes.AutoFakeServiceBroker
2343+
req *http.Request
2344+
testServer *httptest.Server
2345+
)
2346+
2347+
BeforeEach(func() {
2348+
fakeServiceBroker = new(fakes.AutoFakeServiceBroker)
2349+
brokerAPI = brokerapi.New(fakeServiceBroker, brokerLogger, credentials)
2350+
2351+
testServer = httptest.NewServer(brokerAPI)
2352+
var err error
2353+
req, err = http.NewRequest("GET", testServer.URL+"/v2/catalog", nil)
2354+
Expect(err).NotTo(HaveOccurred())
2355+
req.Header.Add("X-Broker-API-Version", "2.14")
2356+
req.SetBasicAuth(credentials.Username, credentials.Password)
2357+
})
2358+
2359+
AfterEach(func() {
2360+
testServer.Close()
2361+
})
2362+
2363+
When("X-Correlation-ID is passed", func() {
2364+
It("Adds correlation id to the context", func() {
2365+
const correlationID = "fake-correlation-id"
2366+
req.Header.Add("X-Correlation-ID", correlationID)
2367+
2368+
_, err := http.DefaultClient.Do(req)
2369+
Expect(err).NotTo(HaveOccurred())
2370+
2371+
Expect(fakeServiceBroker.ServicesCallCount()).To(Equal(1), "Services was not called")
2372+
ctx := fakeServiceBroker.ServicesArgsForCall(0)
2373+
Expect(ctx.Value(middlewares.CorrelationIDKey)).To(Equal(correlationID))
2374+
2375+
})
2376+
})
2377+
When("X-Correlation-ID is not passed", func() {
2378+
It("Generates correlation id and adds it to the context", func() {
2379+
_, err := http.DefaultClient.Do(req)
2380+
Expect(err).NotTo(HaveOccurred())
2381+
2382+
Expect(fakeServiceBroker.ServicesCallCount()).To(Equal(1), "Services was not called")
2383+
ctx := fakeServiceBroker.ServicesArgsForCall(0)
2384+
Expect(ctx.Value(middlewares.CorrelationIDKey)).To(Not(BeNil()))
2385+
})
2386+
})
2387+
})
23292388
})

handlers/api_handler.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ const (
1616
serviceIdMissingKey = "service-id-missing"
1717
planIdMissingKey = "plan-id-missing"
1818
unknownErrorKey = "unknown-error"
19-
apiVersionInvalidKey = "broker-api-version-invalid"
2019

2120
bindingIDLogKey = "binding-id"
2221
)

handlers/bind.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"encoding/json"
55
"net/http"
66

7+
"github.com/pivotal-cf/brokerapi/middlewares"
8+
79
"code.cloudfoundry.org/lager"
810
"github.com/gorilla/mux"
911
"github.com/pivotal-cf/brokerapi/domain"
@@ -20,9 +22,12 @@ func (h APIHandler) Bind(w http.ResponseWriter, req *http.Request) {
2022
instanceID := vars["instance_id"]
2123
bindingID := vars["binding_id"]
2224

25+
correlationID := req.Context().Value(middlewares.CorrelationIDKey).(string)
26+
2327
logger := h.logger.Session(bindLogKey, lager.Data{
24-
instanceIDLogKey: instanceID,
25-
bindingIDLogKey: bindingID,
28+
instanceIDLogKey: instanceID,
29+
bindingIDLogKey: bindingID,
30+
middlewares.CorrelationIDKey: correlationID,
2631
})
2732

2833
version := getAPIVersion(req)

handlers/deprovision.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package handlers
33
import (
44
"net/http"
55

6+
"github.com/pivotal-cf/brokerapi/middlewares"
7+
68
"code.cloudfoundry.org/lager"
79
"github.com/gorilla/mux"
810
"github.com/pivotal-cf/brokerapi/domain"
@@ -14,8 +16,12 @@ const deprovisionLogKey = "deprovision"
1416
func (h APIHandler) Deprovision(w http.ResponseWriter, req *http.Request) {
1517
vars := mux.Vars(req)
1618
instanceID := vars["instance_id"]
19+
20+
correlationID := req.Context().Value(middlewares.CorrelationIDKey).(string)
21+
1722
logger := h.logger.Session(deprovisionLogKey, lager.Data{
18-
instanceIDLogKey: instanceID,
23+
instanceIDLogKey: instanceID,
24+
middlewares.CorrelationIDKey: correlationID,
1925
})
2026

2127
details := domain.DeprovisionDetails{

handlers/get_binding.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"errors"
55
"net/http"
66

7+
"github.com/pivotal-cf/brokerapi/middlewares"
8+
79
"code.cloudfoundry.org/lager"
810
"github.com/gorilla/mux"
911
"github.com/pivotal-cf/brokerapi/domain/apiresponses"
@@ -16,9 +18,12 @@ func (h APIHandler) GetBinding(w http.ResponseWriter, req *http.Request) {
1618
instanceID := vars["instance_id"]
1719
bindingID := vars["binding_id"]
1820

21+
correlationID := req.Context().Value(middlewares.CorrelationIDKey).(string)
22+
1923
logger := h.logger.Session(getBindLogKey, lager.Data{
20-
instanceIDLogKey: instanceID,
21-
bindingIDLogKey: bindingID,
24+
instanceIDLogKey: instanceID,
25+
bindingIDLogKey: bindingID,
26+
middlewares.CorrelationIDKey: correlationID,
2227
})
2328

2429
version := getAPIVersion(req)
@@ -27,7 +32,7 @@ func (h APIHandler) GetBinding(w http.ResponseWriter, req *http.Request) {
2732
h.respond(w, http.StatusPreconditionFailed, apiresponses.ErrorResponse{
2833
Description: err.Error(),
2934
})
30-
logger.Error(apiVersionInvalidKey, err)
35+
logger.Error(middlewares.ApiVersionInvalidKey, err)
3136
return
3237
}
3338

handlers/get_instance.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"errors"
55
"net/http"
66

7+
"github.com/pivotal-cf/brokerapi/middlewares"
8+
79
"code.cloudfoundry.org/lager"
810
"github.com/gorilla/mux"
911
"github.com/pivotal-cf/brokerapi/domain/apiresponses"
@@ -15,8 +17,11 @@ func (h APIHandler) GetInstance(w http.ResponseWriter, req *http.Request) {
1517
vars := mux.Vars(req)
1618
instanceID := vars["instance_id"]
1719

20+
correlationID := req.Context().Value(middlewares.CorrelationIDKey).(string)
21+
1822
logger := h.logger.Session(getInstanceLogKey, lager.Data{
19-
instanceIDLogKey: instanceID,
23+
instanceIDLogKey: instanceID,
24+
middlewares.CorrelationIDKey: correlationID,
2025
})
2126

2227
version := getAPIVersion(req)
@@ -25,7 +30,7 @@ func (h APIHandler) GetInstance(w http.ResponseWriter, req *http.Request) {
2530
h.respond(w, http.StatusPreconditionFailed, apiresponses.ErrorResponse{
2631
Description: err.Error(),
2732
})
28-
logger.Error(apiVersionInvalidKey, err)
33+
logger.Error(middlewares.ApiVersionInvalidKey, err)
2934
return
3035
}
3136

handlers/last_binding_operation.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"errors"
55
"net/http"
66

7+
"github.com/pivotal-cf/brokerapi/middlewares"
8+
79
"code.cloudfoundry.org/lager"
810
"github.com/gorilla/mux"
911
"github.com/pivotal-cf/brokerapi/domain"
@@ -22,8 +24,11 @@ func (h APIHandler) LastBindingOperation(w http.ResponseWriter, req *http.Reques
2224
OperationData: req.FormValue("operation"),
2325
}
2426

27+
correlationID := req.Context().Value(middlewares.CorrelationIDKey).(string)
28+
2529
logger := h.logger.Session(lastBindingOperationLogKey, lager.Data{
26-
instanceIDLogKey: instanceID,
30+
instanceIDLogKey: instanceID,
31+
middlewares.CorrelationIDKey: correlationID,
2732
})
2833

2934
version := getAPIVersion(req)
@@ -32,7 +37,7 @@ func (h APIHandler) LastBindingOperation(w http.ResponseWriter, req *http.Reques
3237
h.respond(w, http.StatusPreconditionFailed, apiresponses.ErrorResponse{
3338
Description: err.Error(),
3439
})
35-
logger.Error(apiVersionInvalidKey, err)
40+
logger.Error(middlewares.ApiVersionInvalidKey, err)
3641
return
3742
}
3843

handlers/last_binding_operation_test.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
package handlers_test
22

33
import (
4-
"code.cloudfoundry.org/lager"
4+
"context"
55
"encoding/json"
66
"fmt"
7+
"net/http"
8+
"net/url"
9+
10+
"github.com/pivotal-cf/brokerapi/middlewares"
11+
12+
"code.cloudfoundry.org/lager"
713
"github.com/gorilla/mux"
814
. "github.com/onsi/ginkgo"
915
. "github.com/onsi/gomega"
@@ -13,8 +19,6 @@ import (
1319
"github.com/pivotal-cf/brokerapi/handlers"
1420
"github.com/pivotal-cf/brokerapi/handlers/fakes"
1521
"github.com/pkg/errors"
16-
"net/http"
17-
"net/url"
1822
)
1923

2024
var _ = Describe("LastBindingOperation", func() {
@@ -135,5 +139,7 @@ func newRequest(instanceID, bindingID, planID, serviceID, operation string) *htt
135139
request.Form.Add("service_id", serviceID)
136140
request.Form.Add("operation", operation)
137141

142+
newCtx := context.WithValue(request.Context(), middlewares.CorrelationIDKey, "fake-correlation-id")
143+
request = request.WithContext(newCtx)
138144
return request
139145
}

0 commit comments

Comments
 (0)