Skip to content

Commit 724bdb1

Browse files
author
Craig Furman
committed
Refactor ServiceBroker interface
* asyncAllowed parameter to Provision used instead of 2 methods * Provision must return whether or not it chose to provision async * This reflects the service broker API more closely, as a broker does not have to return 202 if async is allowed, only if it chooses to provision asynchronously.
1 parent a44d3f9 commit 724bdb1

File tree

4 files changed

+52
-51
lines changed

4 files changed

+52
-51
lines changed

api.go

+1-7
Original file line numberDiff line numberDiff line change
@@ -88,13 +88,7 @@ func provision(serviceBroker ServiceBroker, router httpRouter, logger lager.Logg
8888
instanceDetailsLogKey: details,
8989
})
9090

91-
async := IsAsync(false)
92-
var err error
93-
if acceptsIncompleteFlag == true {
94-
async, err = serviceBroker.ProvisionAsync(instanceID, details)
95-
} else {
96-
err = serviceBroker.ProvisionSync(instanceID, details)
97-
}
91+
async, err := serviceBroker.Provision(instanceID, details, acceptsIncompleteFlag)
9892

9993
if err != nil {
10094
switch err {

api_test.go

+30-14
Original file line numberDiff line numberDiff line change
@@ -357,17 +357,17 @@ var _ = Describe("Service Broker API", func() {
357357
makeInstanceProvisioningRequestWithAcceptsIncomplete(instanceID, details, acceptsIncomplete)
358358
Expect(fakeServiceBroker.ProvisionDetails).To(Equal(details))
359359

360-
Expect(fakeServiceBroker.AysncProvisionInstanceIds).To(ContainElement(instanceID))
360+
Expect(fakeServiceBroker.ProvisionedInstanceIDs).To(ContainElement(instanceID))
361361
})
362362

363363
Context("when the broker chooses to provision asyncronously", func() {
364364
BeforeEach(func() {
365365
fakeServiceBroker = &fakes.FakeServiceBroker{
366-
SupportsAsync: true,
367366
InstanceLimit: 3,
368367
}
369368
fakeAsyncServiceBroker := &fakes.FakeAsyncServiceBroker{
370-
*fakeServiceBroker,
369+
FakeServiceBroker: *fakeServiceBroker,
370+
ShouldProvisionAsync: true,
371371
}
372372
brokerAPI = brokerapi.New(fakeAsyncServiceBroker, brokerLogger, credentials)
373373
})
@@ -381,11 +381,11 @@ var _ = Describe("Service Broker API", func() {
381381
Context("when the broker chooses to provision syncronously", func() {
382382
BeforeEach(func() {
383383
fakeServiceBroker = &fakes.FakeServiceBroker{
384-
SupportsAsync: false,
385384
InstanceLimit: 3,
386385
}
387386
fakeAsyncServiceBroker := &fakes.FakeAsyncServiceBroker{
388-
*fakeServiceBroker,
387+
FakeServiceBroker: *fakeServiceBroker,
388+
ShouldProvisionAsync: false,
389389
}
390390
brokerAPI = brokerapi.New(fakeAsyncServiceBroker, brokerLogger, credentials)
391391
})
@@ -398,11 +398,9 @@ var _ = Describe("Service Broker API", func() {
398398
})
399399

400400
Context("when the accepts_incomplete flag is false", func() {
401-
It("calls Provision on the service broker with acceptsIncomplete", func() {
402-
acceptsIncomplete := false
403-
makeInstanceProvisioningRequestWithAcceptsIncomplete(instanceID, details, acceptsIncomplete)
404-
Expect(fakeServiceBroker.ProvisionDetails).To(Equal(details))
405-
Expect(fakeServiceBroker.AcceptsIncomplete).To(Equal(acceptsIncomplete))
401+
It("returns a 201", func() {
402+
response := makeInstanceProvisioningRequestWithAcceptsIncomplete(instanceID, details, false)
403+
Expect(response.StatusCode).To(Equal(http.StatusCreated))
406404
})
407405

408406
Context("when broker can only respond asynchronously", func() {
@@ -426,10 +424,28 @@ var _ = Describe("Service Broker API", func() {
426424
})
427425

428426
Context("when the accepts_incomplete flag is missing", func() {
429-
It("calls Provision on the service broker with acceptsIncomplete", func() {
430-
makeInstanceProvisioningRequest(instanceID, details, "")
431-
Expect(fakeServiceBroker.ProvisionDetails).To(Equal(details))
432-
Expect(fakeServiceBroker.AcceptsIncomplete).To(Equal(false))
427+
It("returns a 201", func() {
428+
response := makeInstanceProvisioningRequest(instanceID, details, "")
429+
Expect(response.StatusCode).To(Equal(http.StatusCreated))
430+
})
431+
432+
Context("when broker can only respond asynchronously", func() {
433+
BeforeEach(func() {
434+
fakeServiceBroker = &fakes.FakeServiceBroker{
435+
InstanceLimit: 3,
436+
}
437+
fakeAsyncServiceBroker := &fakes.FakeAsyncOnlyServiceBroker{
438+
*fakeServiceBroker,
439+
}
440+
brokerAPI = brokerapi.New(fakeAsyncServiceBroker, brokerLogger, credentials)
441+
})
442+
443+
It("returns a 422", func() {
444+
acceptsIncomplete := false
445+
response := makeInstanceProvisioningRequestWithAcceptsIncomplete(instanceID, details, acceptsIncomplete)
446+
Expect(response.StatusCode).To(Equal(422))
447+
Expect(response.Body).To(MatchJSON(fixture("async_required.json")))
448+
})
433449
})
434450
})
435451
})

fakes/fake_service_broker.go

+20-28
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,16 @@ package fakes
33
import "github.com/pivotal-cf/brokerapi"
44

55
type FakeServiceBroker struct {
6-
ProvisionDetails brokerapi.ProvisionDetails
7-
AcceptsIncomplete bool
6+
ProvisionDetails brokerapi.ProvisionDetails
87

9-
ProvisionedInstanceIDs []string
10-
DeprovisionedInstanceIDs []string
11-
AysncProvisionInstanceIds []string
8+
ProvisionedInstanceIDs []string
9+
DeprovisionedInstanceIDs []string
1210

1311
BoundInstanceIDs []string
1412
BoundBindingIDs []string
1513
BoundBindingDetails brokerapi.BindDetails
1614

1715
InstanceLimit int
18-
SupportsAsync brokerapi.IsAsync
1916

2017
ProvisionError error
2118
BindError error
@@ -29,6 +26,7 @@ type FakeServiceBroker struct {
2926

3027
type FakeAsyncServiceBroker struct {
3128
FakeServiceBroker
29+
ShouldProvisionAsync bool
3230
}
3331

3432
type FakeAsyncOnlyServiceBroker struct {
@@ -76,57 +74,47 @@ func (fakeBroker *FakeServiceBroker) Services() []brokerapi.Service {
7674
}
7775
}
7876

79-
func (fakeBroker *FakeServiceBroker) ProvisionAsync(instanceID string, details brokerapi.ProvisionDetails) (brokerapi.IsAsync, error) {
80-
fakeBroker.ProvisionDetails = details
81-
fakeBroker.AysncProvisionInstanceIds = append(fakeBroker.AysncProvisionInstanceIds, instanceID)
82-
return fakeBroker.SupportsAsync, nil
83-
}
84-
85-
func (fakeBroker *FakeServiceBroker) ProvisionSync(instanceID string, details brokerapi.ProvisionDetails) error {
77+
func (fakeBroker *FakeServiceBroker) Provision(instanceID string, details brokerapi.ProvisionDetails, asyncAllowed bool) (brokerapi.IsAsync, error) {
8678
fakeBroker.BrokerCalled = true
8779

8880
if fakeBroker.ProvisionError != nil {
89-
return fakeBroker.ProvisionError
81+
return false, fakeBroker.ProvisionError
9082
}
9183

9284
if len(fakeBroker.ProvisionedInstanceIDs) >= fakeBroker.InstanceLimit {
93-
return brokerapi.ErrInstanceLimitMet
85+
return false, brokerapi.ErrInstanceLimitMet
9486
}
9587

9688
if sliceContains(instanceID, fakeBroker.ProvisionedInstanceIDs) {
97-
return brokerapi.ErrInstanceAlreadyExists
89+
return false, brokerapi.ErrInstanceAlreadyExists
9890
}
9991

10092
fakeBroker.ProvisionDetails = details
10193
fakeBroker.ProvisionedInstanceIDs = append(fakeBroker.ProvisionedInstanceIDs, instanceID)
102-
return nil
94+
return false, nil
10395
}
10496

105-
func (fakeBroker *FakeAsyncServiceBroker) ProvisionSync(instanceID string, details brokerapi.ProvisionDetails) error {
97+
func (fakeBroker *FakeAsyncServiceBroker) Provision(instanceID string, details brokerapi.ProvisionDetails, asyncAllowed bool) (brokerapi.IsAsync, error) {
10698
fakeBroker.BrokerCalled = true
10799

108100
if fakeBroker.ProvisionError != nil {
109-
return fakeBroker.ProvisionError
101+
return false, fakeBroker.ProvisionError
110102
}
111103

112104
if len(fakeBroker.ProvisionedInstanceIDs) >= fakeBroker.InstanceLimit {
113-
return brokerapi.ErrInstanceLimitMet
105+
return false, brokerapi.ErrInstanceLimitMet
114106
}
115107

116108
if sliceContains(instanceID, fakeBroker.ProvisionedInstanceIDs) {
117-
return brokerapi.ErrInstanceAlreadyExists
109+
return false, brokerapi.ErrInstanceAlreadyExists
118110
}
119111

120112
fakeBroker.ProvisionDetails = details
121113
fakeBroker.ProvisionedInstanceIDs = append(fakeBroker.ProvisionedInstanceIDs, instanceID)
122-
return nil
123-
}
124-
125-
func (fakeBroker *FakeAsyncOnlyServiceBroker) ProvisionSync(instanceID string, details brokerapi.ProvisionDetails) error {
126-
return brokerapi.ErrAsyncRequired
114+
return brokerapi.IsAsync(fakeBroker.ShouldProvisionAsync), nil
127115
}
128116

129-
func (fakeBroker *FakeAsyncOnlyServiceBroker) ProvisionAsync(instanceID string, details brokerapi.ProvisionDetails) (brokerapi.IsAsync, error) {
117+
func (fakeBroker *FakeAsyncOnlyServiceBroker) Provision(instanceID string, details brokerapi.ProvisionDetails, asyncAllowed bool) (brokerapi.IsAsync, error) {
130118
fakeBroker.BrokerCalled = true
131119

132120
if fakeBroker.ProvisionError != nil {
@@ -141,9 +129,13 @@ func (fakeBroker *FakeAsyncOnlyServiceBroker) ProvisionAsync(instanceID string,
141129
return false, brokerapi.ErrInstanceAlreadyExists
142130
}
143131

132+
if !asyncAllowed {
133+
return true, brokerapi.ErrAsyncRequired
134+
}
135+
144136
fakeBroker.ProvisionDetails = details
145137
fakeBroker.ProvisionedInstanceIDs = append(fakeBroker.ProvisionedInstanceIDs, instanceID)
146-
return fakeBroker.SupportsAsync, nil
138+
return true, nil
147139
}
148140

149141
func (fakeBroker *FakeServiceBroker) Deprovision(instanceID string) error {

service_broker.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ import "errors"
55
type ServiceBroker interface {
66
Services() []Service
77

8-
ProvisionSync(instanceID string, details ProvisionDetails) error
9-
ProvisionAsync(instanceID string, details ProvisionDetails) (IsAsync, error)
8+
Provision(instanceID string, details ProvisionDetails, asyncAllowed bool) (IsAsync, error)
109

1110
Deprovision(instanceID string) error
1211

0 commit comments

Comments
 (0)