Skip to content

Commit 5a9b9a3

Browse files
committed
1 parent 4520efb commit 5a9b9a3

File tree

6 files changed

+320
-89
lines changed

6 files changed

+320
-89
lines changed

actor/v7action/service_app_binding.go

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,16 @@ type CreateServiceAppBindingParams struct {
1717
Parameters types.OptionalObject
1818
}
1919

20-
type DeleteServiceAppBindingParams struct {
20+
type ListServiceAppBindingParams struct {
2121
SpaceGUID string
2222
ServiceInstanceName string
2323
AppName string
2424
}
2525

26+
type DeleteServiceAppBindingParams struct {
27+
ServiceBindingGUID string
28+
}
29+
2630
func (actor Actor) CreateServiceAppBinding(params CreateServiceAppBindingParams) (chan PollJobEvent, Warnings, error) {
2731
var (
2832
serviceInstance resources.ServiceInstance
@@ -60,13 +64,11 @@ func (actor Actor) CreateServiceAppBinding(params CreateServiceAppBindingParams)
6064
}
6165
}
6266

63-
func (actor Actor) DeleteServiceAppBinding(params DeleteServiceAppBindingParams) (chan PollJobEvent, Warnings, error) {
67+
func (actor Actor) ListServiceAppBindings(params ListServiceAppBindingParams) ([]resources.ServiceCredentialBinding, Warnings, error) {
6468
var (
6569
serviceInstance resources.ServiceInstance
6670
app resources.Application
67-
binding resources.ServiceCredentialBinding
68-
jobURL ccv3.JobURL
69-
stream chan PollJobEvent
71+
bindings []resources.ServiceCredentialBinding
7072
)
7173

7274
warnings, err := railway.Sequentially(
@@ -79,11 +81,30 @@ func (actor Actor) DeleteServiceAppBinding(params DeleteServiceAppBindingParams)
7981
return
8082
},
8183
func() (warnings ccv3.Warnings, err error) {
82-
binding, warnings, err = actor.getServiceAppBinding(serviceInstance.GUID, app.GUID)
84+
bindings, warnings, err = actor.getServiceAppBindings(serviceInstance.GUID, app.GUID)
8385
return
8486
},
87+
)
88+
89+
switch err.(type) {
90+
case nil:
91+
return bindings, Warnings(warnings), nil
92+
case ccerror.ApplicationNotFoundError:
93+
return nil, Warnings(warnings), actionerror.ApplicationNotFoundError{Name: params.AppName}
94+
default:
95+
return nil, Warnings(warnings), err
96+
}
97+
}
98+
99+
func (actor Actor) DeleteServiceAppBinding(params DeleteServiceAppBindingParams) (chan PollJobEvent, Warnings, error) {
100+
var (
101+
jobURL ccv3.JobURL
102+
stream chan PollJobEvent
103+
)
104+
105+
warnings, err := railway.Sequentially(
85106
func() (warnings ccv3.Warnings, err error) {
86-
jobURL, warnings, err = actor.CloudControllerClient.DeleteServiceCredentialBinding(binding.GUID)
107+
jobURL, warnings, err = actor.CloudControllerClient.DeleteServiceCredentialBinding(params.ServiceBindingGUID)
87108
return
88109
},
89110
func() (warnings ccv3.Warnings, err error) {
@@ -94,10 +115,10 @@ func (actor Actor) DeleteServiceAppBinding(params DeleteServiceAppBindingParams)
94115

95116
switch err.(type) {
96117
case nil:
118+
97119
return stream, Warnings(warnings), nil
98-
case ccerror.ApplicationNotFoundError:
99-
return nil, Warnings(warnings), actionerror.ApplicationNotFoundError{Name: params.AppName}
100120
default:
121+
101122
return nil, Warnings(warnings), err
102123
}
103124
}
@@ -120,24 +141,22 @@ func (actor Actor) createServiceAppBinding(serviceInstanceGUID, appGUID, binding
120141
}
121142
}
122143

123-
func (actor Actor) getServiceAppBinding(serviceInstanceGUID, appGUID string) (resources.ServiceCredentialBinding, ccv3.Warnings, error) {
144+
func (actor Actor) getServiceAppBindings(serviceInstanceGUID, appGUID string) ([]resources.ServiceCredentialBinding, ccv3.Warnings, error) {
124145
bindings, warnings, err := actor.CloudControllerClient.GetServiceCredentialBindings(
125146
ccv3.Query{Key: ccv3.TypeFilter, Values: []string{"app"}},
126147
ccv3.Query{Key: ccv3.ServiceInstanceGUIDFilter, Values: []string{serviceInstanceGUID}},
127148
ccv3.Query{Key: ccv3.AppGUIDFilter, Values: []string{appGUID}},
128-
ccv3.Query{Key: ccv3.PerPage, Values: []string{"1"}},
129-
ccv3.Query{Key: ccv3.Page, Values: []string{"1"}},
130149
)
131150

132151
switch {
133152
case err != nil:
134-
return resources.ServiceCredentialBinding{}, warnings, err
153+
return []resources.ServiceCredentialBinding{}, warnings, err
135154
case len(bindings) == 0:
136-
return resources.ServiceCredentialBinding{}, warnings, actionerror.ServiceBindingNotFoundError{
155+
return []resources.ServiceCredentialBinding{}, warnings, actionerror.ServiceBindingNotFoundError{
137156
AppGUID: appGUID,
138157
ServiceInstanceGUID: serviceInstanceGUID,
139158
}
140159
default:
141-
return bindings[0], warnings, nil
160+
return bindings, warnings, nil
142161
}
143162
}

actor/v7action/service_app_binding_test.go

Lines changed: 73 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -248,22 +248,21 @@ var _ = Describe("Service App Binding Action", func() {
248248
})
249249
})
250250

251-
Describe("DeleteServiceAppBinding", func() {
251+
Describe("ListServiceAppBindings", func() {
252252
const (
253253
serviceInstanceName = "fake-service-instance-name"
254254
serviceInstanceGUID = "fake-service-instance-guid"
255255
appName = "fake-app-name"
256256
appGUID = "fake-app-guid"
257257
spaceGUID = "fake-space-guid"
258258
bindingGUID = "fake-binding-guid"
259-
fakeJobURL = ccv3.JobURL("fake-job-url")
260259
)
261260

262261
var (
263-
params DeleteServiceAppBindingParams
264-
warnings Warnings
265-
executionError error
266-
stream chan PollJobEvent
262+
params ListServiceAppBindingParams
263+
warnings Warnings
264+
executionError error
265+
serviceCredentialBindings []resources.ServiceCredentialBinding
267266
)
268267

269268
BeforeEach(func() {
@@ -294,47 +293,27 @@ var _ = Describe("Service App Binding Action", func() {
294293
nil,
295294
)
296295

297-
fakeCloudControllerClient.DeleteServiceCredentialBindingReturns(
298-
fakeJobURL,
299-
ccv3.Warnings{"delete binding warning"},
300-
nil,
301-
)
302-
303-
fakeStream := make(chan ccv3.PollJobEvent)
304-
fakeCloudControllerClient.PollJobToEventStreamReturns(fakeStream)
305-
go func() {
306-
fakeStream <- ccv3.PollJobEvent{
307-
State: constant.JobPolling,
308-
Warnings: ccv3.Warnings{"poll warning"},
309-
}
310-
}()
311-
312-
params = DeleteServiceAppBindingParams{
313-
SpaceGUID: spaceGUID,
314-
ServiceInstanceName: serviceInstanceName,
315-
AppName: appName,
296+
params = ListServiceAppBindingParams{
297+
SpaceGUID: "fake-space-guid",
298+
ServiceInstanceName: "fake-service-instance-name",
299+
AppName: "fake-app-name",
316300
}
317301
})
318302

319303
JustBeforeEach(func() {
320-
stream, warnings, executionError = actor.DeleteServiceAppBinding(params)
304+
serviceCredentialBindings, warnings, executionError = actor.ListServiceAppBindings(params)
321305
})
322306

323-
It("returns an event stream, warnings, and no errors", func() {
307+
It("returns an event stream, warning, and no errors", func() {
324308
Expect(executionError).NotTo(HaveOccurred())
325309

326310
Expect(warnings).To(ConsistOf(Warnings{
327311
"get instance warning",
328312
"get app warning",
329313
"get bindings warning",
330-
"delete binding warning",
331314
}))
332315

333-
Eventually(stream).Should(Receive(Equal(PollJobEvent{
334-
State: JobPolling,
335-
Warnings: Warnings{"poll warning"},
336-
Err: nil,
337-
})))
316+
Expect(serviceCredentialBindings).To(Equal([]resources.ServiceCredentialBinding{{GUID: bindingGUID}}))
338317
})
339318

340319
Describe("service instance lookup", func() {
@@ -425,8 +404,6 @@ var _ = Describe("Service App Binding Action", func() {
425404
ccv3.Query{Key: ccv3.TypeFilter, Values: []string{"app"}},
426405
ccv3.Query{Key: ccv3.AppGUIDFilter, Values: []string{appGUID}},
427406
ccv3.Query{Key: ccv3.ServiceInstanceGUIDFilter, Values: []string{serviceInstanceGUID}},
428-
ccv3.Query{Key: ccv3.PerPage, Values: []string{"1"}},
429-
ccv3.Query{Key: ccv3.Page, Values: []string{"1"}},
430407
))
431408
})
432409

@@ -463,6 +440,67 @@ var _ = Describe("Service App Binding Action", func() {
463440
})
464441
})
465442
})
443+
})
444+
445+
Describe("DeleteServiceAppBinding", func() {
446+
const (
447+
bindingGUID = "fake-binding-guid"
448+
fakeJobURL = ccv3.JobURL("fake-job-url")
449+
)
450+
451+
var (
452+
params DeleteServiceAppBindingParams
453+
warnings Warnings
454+
executionError error
455+
stream chan PollJobEvent
456+
)
457+
458+
BeforeEach(func() {
459+
fakeCloudControllerClient.GetServiceCredentialBindingsReturns(
460+
[]resources.ServiceCredentialBinding{
461+
{GUID: bindingGUID},
462+
},
463+
ccv3.Warnings{"get bindings warning"},
464+
nil,
465+
)
466+
467+
fakeCloudControllerClient.DeleteServiceCredentialBindingReturns(
468+
fakeJobURL,
469+
ccv3.Warnings{"delete binding warning"},
470+
nil,
471+
)
472+
473+
fakeStream := make(chan ccv3.PollJobEvent)
474+
fakeCloudControllerClient.PollJobToEventStreamReturns(fakeStream)
475+
go func() {
476+
fakeStream <- ccv3.PollJobEvent{
477+
State: constant.JobPolling,
478+
Warnings: ccv3.Warnings{"poll warning"},
479+
}
480+
}()
481+
482+
params = DeleteServiceAppBindingParams{
483+
ServiceBindingGUID: bindingGUID,
484+
}
485+
})
486+
487+
JustBeforeEach(func() {
488+
stream, warnings, executionError = actor.DeleteServiceAppBinding(params)
489+
})
490+
491+
It("returns an event stream, warning, and no errors", func() {
492+
Expect(executionError).NotTo(HaveOccurred())
493+
494+
Expect(warnings).To(ConsistOf(Warnings{
495+
"delete binding warning",
496+
}))
497+
498+
Eventually(stream).Should(Receive(Equal(PollJobEvent{
499+
State: JobPolling,
500+
Warnings: Warnings{"poll warning"},
501+
Err: nil,
502+
})))
503+
})
466504

467505
Describe("initiating the delete", func() {
468506
It("makes the correct call", func() {

command/v7/actor.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ type Actor interface {
184184
GetUAAAPIVersion() (string, error)
185185
GetUnstagedNewestPackageGUID(appGuid string) (string, v7action.Warnings, error)
186186
GetUser(username, origin string) (resources.User, error)
187+
ListServiceAppBindings(params v7action.ListServiceAppBindingParams) ([]resources.ServiceCredentialBinding, v7action.Warnings, error)
187188
MakeCurlRequest(httpMethod string, path string, customHeaders []string, httpData string, failOnHTTPError bool) ([]byte, *http.Response, error)
188189
MapRoute(routeGUID string, appGUID string, destinationProtocol string) (v7action.Warnings, error)
189190
Marketplace(filter v7action.MarketplaceFilter) ([]v7action.ServiceOfferingWithPlans, v7action.Warnings, error)

command/v7/unbind_service_command.go

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ func (cmd UnbindServiceCommand) Execute(args []string) error {
2424
return err
2525
}
2626

27-
stream, warnings, err := cmd.Actor.DeleteServiceAppBinding(v7action.DeleteServiceAppBindingParams{
27+
bindings, warnings, err := cmd.Actor.ListServiceAppBindings(v7action.ListServiceAppBindingParams{
2828
SpaceGUID: cmd.Config.TargetedSpace().GUID,
2929
ServiceInstanceName: cmd.RequiredArgs.ServiceInstanceName,
3030
AppName: cmd.RequiredArgs.AppName,
@@ -33,25 +33,37 @@ func (cmd UnbindServiceCommand) Execute(args []string) error {
3333
switch err.(type) {
3434
case nil:
3535
case actionerror.ServiceBindingNotFoundError:
36-
cmd.UI.DisplayText("Binding between {{.ServiceInstanceName}} and {{.AppName}} did not exist", cmd.names())
36+
cmd.UI.DisplayText("Binding between {{.ServiceInstanceName}} and {{.AppName}} does not exist", cmd.names())
3737
cmd.UI.DisplayOK()
3838
return nil
3939
default:
4040
return err
4141
}
4242

43-
completed, err := shared.WaitForResult(stream, cmd.UI, cmd.Wait)
44-
switch {
45-
case err != nil:
46-
return err
47-
case completed:
48-
cmd.UI.DisplayOK()
49-
return nil
50-
default:
51-
cmd.UI.DisplayOK()
52-
cmd.UI.DisplayText("Unbinding in progress. Use 'cf service {{.ServiceInstanceName}}' to check operation status.", cmd.names())
53-
return nil
43+
for _, binding := range bindings {
44+
cmd.UI.DisplayText("Deleting service binding {{.BindingGUID}}...", map[string]interface{}{"BindingGUID": binding.GUID})
45+
stream, warnings, err := cmd.Actor.DeleteServiceAppBinding(v7action.DeleteServiceAppBindingParams{
46+
ServiceBindingGUID: binding.GUID,
47+
})
48+
cmd.UI.DisplayWarnings(warnings)
49+
switch err.(type) {
50+
case nil:
51+
default:
52+
return err
53+
}
54+
55+
completed, err := shared.WaitForResult(stream, cmd.UI, cmd.Wait)
56+
switch {
57+
case err != nil:
58+
return err
59+
case completed:
60+
cmd.UI.DisplayOK()
61+
default:
62+
cmd.UI.DisplayOK()
63+
cmd.UI.DisplayText("Unbinding in progress. Use 'cf service {{.ServiceInstanceName}}' to check operation status.", cmd.names())
64+
}
5465
}
66+
return nil
5567
}
5668

5769
func (cmd UnbindServiceCommand) Usage() string {

0 commit comments

Comments
 (0)