Skip to content

Commit 10997ba

Browse files
committed
Add support for binding details
1 parent 8d9dd34 commit 10997ba

File tree

4 files changed

+67
-20
lines changed

4 files changed

+67
-20
lines changed

api.go

+11-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ const instanceDetailsLogKey = "instance-details"
1818
const bindingIDLogKey = "binding-id"
1919

2020
const invalidServiceDetailsErrorKey = "invalid-service-details"
21+
const invalidBindDetailsErrorKey = "invalid-bind-details"
2122
const instanceLimitReachedErrorKey = "instance-limit-reached"
2223
const instanceAlreadyExistsErrorKey = "instance-already-exists"
2324
const bindingAlreadyExistsErrorKey = "binding-already-exists"
@@ -142,7 +143,16 @@ func bind(serviceBroker ServiceBroker, router httpRouter, logger lager.Logger) h
142143
bindingIDLogKey: bindingID,
143144
})
144145

145-
credentials, err := serviceBroker.Bind(instanceID, bindingID)
146+
var details BindDetails
147+
if err := json.NewDecoder(req.Body).Decode(&details); err != nil {
148+
logger.Error(invalidBindDetailsErrorKey, err)
149+
respond(w, statusUnprocessableEntity, ErrorResponse{
150+
Description: err.Error(),
151+
})
152+
return
153+
}
154+
155+
credentials, err := serviceBroker.Bind(instanceID, bindingID, details)
146156
if err != nil {
147157
switch err {
148158
case ErrInstanceDoesNotExist:

api_test.go

+43-15
Original file line numberDiff line numberDiff line change
@@ -428,12 +428,22 @@ var _ = Describe("Service Broker API", func() {
428428
})
429429

430430
Describe("binding lifecycle endpoint", func() {
431-
makeBindingRequest := func(instanceID string, bindingID string) *testflight.Response {
431+
makeBindingRequest := func(instanceID, bindingID string, details *brokerapi.BindDetails) *testflight.Response {
432432
response := &testflight.Response{}
433433
testflight.WithServer(brokerAPI, func(r *testflight.Requester) {
434434
path := fmt.Sprintf("/v2/service_instances/%s/service_bindings/%s",
435435
instanceID, bindingID)
436-
request, _ := http.NewRequest("PUT", path, strings.NewReader(""))
436+
437+
buffer := &bytes.Buffer{}
438+
439+
if details != nil {
440+
json.NewEncoder(buffer).Encode(details)
441+
}
442+
443+
request, err := http.NewRequest("PUT", path, buffer)
444+
445+
Expect(err).NotTo(HaveOccurred())
446+
437447
request.Header.Add("Content-Type", "application/json")
438448
request.SetBasicAuth("username", "password")
439449

@@ -443,24 +453,42 @@ var _ = Describe("Service Broker API", func() {
443453
}
444454

445455
Describe("binding", func() {
456+
var details *brokerapi.BindDetails
457+
458+
BeforeEach(func() {
459+
details = &brokerapi.BindDetails{
460+
AppGUID: "app_guid",
461+
PlanID: "plan_id",
462+
ServiceID: "service_id",
463+
}
464+
})
465+
446466
Context("when the associated instance exists", func() {
447467
It("calls Bind on the service broker with the instance and binding ids", func() {
448468
instanceID := uniqueInstanceID()
449469
bindingID := uniqueBindingID()
450-
makeBindingRequest(instanceID, bindingID)
470+
makeBindingRequest(instanceID, bindingID, details)
451471
Expect(fakeServiceBroker.BoundInstanceIDs).To(ContainElement(instanceID))
452472
Expect(fakeServiceBroker.BoundBindingIDs).To(ContainElement(bindingID))
473+
Expect(fakeServiceBroker.BoundBindingDetails).To(Equal(*details))
453474
})
454475

455476
It("returns the credentials returned by Bind", func() {
456-
response := makeBindingRequest(uniqueInstanceID(), uniqueBindingID())
477+
response := makeBindingRequest(uniqueInstanceID(), uniqueBindingID(), details)
457478
Expect(response.Body).To(MatchJSON(fixture("binding.json")))
458479
})
459480

460481
It("returns a 201", func() {
461-
response := makeBindingRequest(uniqueInstanceID(), uniqueBindingID())
482+
response := makeBindingRequest(uniqueInstanceID(), uniqueBindingID(), details)
462483
Expect(response.StatusCode).To(Equal(201))
463484
})
485+
486+
Context("when no bind details are being passed", func() {
487+
It("returns a 422", func() {
488+
response := makeBindingRequest(uniqueInstanceID(), uniqueBindingID(), nil)
489+
Expect(response.StatusCode).To(Equal(422))
490+
})
491+
})
464492
})
465493

466494
Context("when the associated instance does not exist", func() {
@@ -471,18 +499,18 @@ var _ = Describe("Service Broker API", func() {
471499
})
472500

473501
It("returns a 404", func() {
474-
response := makeBindingRequest(uniqueInstanceID(), uniqueBindingID())
502+
response := makeBindingRequest(uniqueInstanceID(), uniqueBindingID(), details)
475503
Expect(response.StatusCode).To(Equal(404))
476504
})
477505

478506
It("returns an error JSON object", func() {
479-
response := makeBindingRequest(uniqueInstanceID(), uniqueBindingID())
507+
response := makeBindingRequest(uniqueInstanceID(), uniqueBindingID(), details)
480508
Expect(response.Body).To(MatchJSON(`{"description":"instance does not exist"}`))
481509
})
482510

483511
It("logs an appropriate error", func() {
484512
instanceID = uniqueInstanceID()
485-
makeBindingRequest(instanceID, uniqueBindingID())
513+
makeBindingRequest(instanceID, uniqueBindingID(), details)
486514
Expect(lastLogLine().Message).To(ContainSubstring("bind.instance-missing"))
487515
Expect(lastLogLine().Data["error"]).To(ContainSubstring("instance does not exist"))
488516
})
@@ -496,19 +524,19 @@ var _ = Describe("Service Broker API", func() {
496524
})
497525

498526
It("returns a 409", func() {
499-
response := makeBindingRequest(uniqueInstanceID(), uniqueBindingID())
527+
response := makeBindingRequest(uniqueInstanceID(), uniqueBindingID(), details)
500528
Expect(response.StatusCode).To(Equal(409))
501529
})
502530

503531
It("returns an error JSON object", func() {
504-
response := makeBindingRequest(uniqueInstanceID(), uniqueBindingID())
532+
response := makeBindingRequest(uniqueInstanceID(), uniqueBindingID(), details)
505533
Expect(response.Body).To(MatchJSON(`{"description":"binding already exists"}`))
506534
})
507535

508536
It("logs an appropriate error", func() {
509537
instanceID = uniqueInstanceID()
510-
makeBindingRequest(instanceID, uniqueBindingID())
511-
makeBindingRequest(instanceID, uniqueBindingID())
538+
makeBindingRequest(instanceID, uniqueBindingID(), details)
539+
makeBindingRequest(instanceID, uniqueBindingID(), details)
512540

513541
Expect(lastLogLine().Message).To(ContainSubstring("bind.binding-already-exists"))
514542
Expect(lastLogLine().Data["error"]).To(ContainSubstring("binding already exists"))
@@ -521,13 +549,13 @@ var _ = Describe("Service Broker API", func() {
521549
})
522550

523551
It("returns a generic 500 error response", func() {
524-
response := makeBindingRequest(uniqueInstanceID(), uniqueBindingID())
552+
response := makeBindingRequest(uniqueInstanceID(), uniqueBindingID(), details)
525553
Expect(response.StatusCode).To(Equal(500))
526554
Expect(response.Body).To(MatchJSON(`{"description":"random error"}`))
527555
})
528556

529557
It("logs a detailed error message", func() {
530-
makeBindingRequest(uniqueInstanceID(), uniqueBindingID())
558+
makeBindingRequest(uniqueInstanceID(), uniqueBindingID(), details)
531559

532560
Expect(lastLogLine().Message).To(ContainSubstring("bind.unknown-error"))
533561
Expect(lastLogLine().Data["error"]).To(ContainSubstring("random error"))
@@ -569,7 +597,7 @@ var _ = Describe("Service Broker API", func() {
569597

570598
BeforeEach(func() {
571599
bindingID = uniqueBindingID()
572-
makeBindingRequest(instanceID, bindingID)
600+
makeBindingRequest(instanceID, bindingID, &brokerapi.BindDetails{})
573601
})
574602

575603
It("returns a 200", func() {

fakes/fake_service_broker.go

+6-3
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ type FakeServiceBroker struct {
88
ProvisionedInstanceIDs []string
99
DeprovisionedInstanceIDs []string
1010

11-
BoundInstanceIDs []string
12-
BoundBindingIDs []string
11+
BoundInstanceIDs []string
12+
BoundBindingIDs []string
13+
BoundBindingDetails brokerapi.BindDetails
1314

1415
InstanceLimit int
1516

@@ -96,13 +97,15 @@ func (fakeBroker *FakeServiceBroker) Deprovision(instanceID string) error {
9697
return brokerapi.ErrInstanceDoesNotExist
9798
}
9899

99-
func (fakeBroker *FakeServiceBroker) Bind(instanceID, bindingID string) (interface{}, error) {
100+
func (fakeBroker *FakeServiceBroker) Bind(instanceID, bindingID string, details brokerapi.BindDetails) (interface{}, error) {
100101
fakeBroker.BrokerCalled = true
101102

102103
if fakeBroker.BindError != nil {
103104
return nil, fakeBroker.BindError
104105
}
105106

107+
fakeBroker.BoundBindingDetails = details
108+
106109
fakeBroker.BoundInstanceIDs = append(fakeBroker.BoundInstanceIDs, instanceID)
107110
fakeBroker.BoundBindingIDs = append(fakeBroker.BoundBindingIDs, bindingID)
108111

service_broker.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ type ServiceBroker interface {
88
Provision(instanceID string, serviceDetails ServiceDetails) error
99
Deprovision(instanceID string) error
1010

11-
Bind(instanceID, bindingID string) (interface{}, error)
11+
Bind(instanceID, bindingID string, details BindDetails) (interface{}, error)
1212
Unbind(instanceID, bindingID string) error
1313
}
1414

@@ -20,6 +20,12 @@ type ServiceDetails struct {
2020
Parameters map[string]interface{} `json:"parameters"`
2121
}
2222

23+
type BindDetails struct {
24+
AppGUID string `json:"app_guid"`
25+
PlanID string `json:"plan_id"`
26+
ServiceID string `json:"service_id"`
27+
}
28+
2329
var (
2430
ErrInstanceAlreadyExists = errors.New("instance already exists")
2531
ErrInstanceDoesNotExist = errors.New("instance does not exist")

0 commit comments

Comments
 (0)