Skip to content

Commit 453db8f

Browse files
committed
Revert "[v8] Command "unbind-service" can handle multiple bindings (cloudfoundry#3665)"
This reverts commit c4716c2.
1 parent 20df57d commit 453db8f

7 files changed

Lines changed: 91 additions & 390 deletions

File tree

actor/v7action/service_app_binding.go

Lines changed: 15 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,12 @@ type CreateServiceAppBindingParams struct {
1818
Strategy resources.BindingStrategyType
1919
}
2020

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

27-
type DeleteServiceAppBindingParams struct {
28-
ServiceBindingGUID string
29-
}
30-
3127
func (actor Actor) CreateServiceAppBinding(params CreateServiceAppBindingParams) (chan PollJobEvent, Warnings, error) {
3228
var (
3329
serviceInstance resources.ServiceInstance
@@ -65,11 +61,13 @@ func (actor Actor) CreateServiceAppBinding(params CreateServiceAppBindingParams)
6561
}
6662
}
6763

68-
func (actor Actor) ListServiceAppBindings(params ListServiceAppBindingParams) ([]resources.ServiceCredentialBinding, Warnings, error) {
64+
func (actor Actor) DeleteServiceAppBinding(params DeleteServiceAppBindingParams) (chan PollJobEvent, Warnings, error) {
6965
var (
7066
serviceInstance resources.ServiceInstance
7167
app resources.Application
72-
bindings []resources.ServiceCredentialBinding
68+
binding resources.ServiceCredentialBinding
69+
jobURL ccv3.JobURL
70+
stream chan PollJobEvent
7371
)
7472

7573
warnings, err := railway.Sequentially(
@@ -82,30 +80,11 @@ func (actor Actor) ListServiceAppBindings(params ListServiceAppBindingParams) ([
8280
return
8381
},
8482
func() (warnings ccv3.Warnings, err error) {
85-
bindings, warnings, err = actor.getServiceAppBindings(serviceInstance.GUID, app.GUID)
83+
binding, warnings, err = actor.getServiceAppBinding(serviceInstance.GUID, app.GUID)
8684
return
8785
},
88-
)
89-
90-
switch err.(type) {
91-
case nil:
92-
return bindings, Warnings(warnings), nil
93-
case ccerror.ApplicationNotFoundError:
94-
return nil, Warnings(warnings), actionerror.ApplicationNotFoundError{Name: params.AppName}
95-
default:
96-
return nil, Warnings(warnings), err
97-
}
98-
}
99-
100-
func (actor Actor) DeleteServiceAppBinding(params DeleteServiceAppBindingParams) (chan PollJobEvent, Warnings, error) {
101-
var (
102-
jobURL ccv3.JobURL
103-
stream chan PollJobEvent
104-
)
105-
106-
warnings, err := railway.Sequentially(
10786
func() (warnings ccv3.Warnings, err error) {
108-
jobURL, warnings, err = actor.CloudControllerClient.DeleteServiceCredentialBinding(params.ServiceBindingGUID)
87+
jobURL, warnings, err = actor.CloudControllerClient.DeleteServiceCredentialBinding(binding.GUID)
10988
return
11089
},
11190
func() (warnings ccv3.Warnings, err error) {
@@ -116,10 +95,10 @@ func (actor Actor) DeleteServiceAppBinding(params DeleteServiceAppBindingParams)
11695

11796
switch err.(type) {
11897
case nil:
119-
12098
return stream, Warnings(warnings), nil
99+
case ccerror.ApplicationNotFoundError:
100+
return nil, Warnings(warnings), actionerror.ApplicationNotFoundError{Name: params.AppName}
121101
default:
122-
123102
return nil, Warnings(warnings), err
124103
}
125104
}
@@ -143,22 +122,24 @@ func (actor Actor) createServiceAppBinding(serviceInstanceGUID, appGUID, binding
143122
}
144123
}
145124

146-
func (actor Actor) getServiceAppBindings(serviceInstanceGUID, appGUID string) ([]resources.ServiceCredentialBinding, ccv3.Warnings, error) {
125+
func (actor Actor) getServiceAppBinding(serviceInstanceGUID, appGUID string) (resources.ServiceCredentialBinding, ccv3.Warnings, error) {
147126
bindings, warnings, err := actor.CloudControllerClient.GetServiceCredentialBindings(
148127
ccv3.Query{Key: ccv3.TypeFilter, Values: []string{"app"}},
149128
ccv3.Query{Key: ccv3.ServiceInstanceGUIDFilter, Values: []string{serviceInstanceGUID}},
150129
ccv3.Query{Key: ccv3.AppGUIDFilter, Values: []string{appGUID}},
130+
ccv3.Query{Key: ccv3.PerPage, Values: []string{"1"}},
131+
ccv3.Query{Key: ccv3.Page, Values: []string{"1"}},
151132
)
152133

153134
switch {
154135
case err != nil:
155-
return []resources.ServiceCredentialBinding{}, warnings, err
136+
return resources.ServiceCredentialBinding{}, warnings, err
156137
case len(bindings) == 0:
157-
return []resources.ServiceCredentialBinding{}, warnings, actionerror.ServiceBindingNotFoundError{
138+
return resources.ServiceCredentialBinding{}, warnings, actionerror.ServiceBindingNotFoundError{
158139
AppGUID: appGUID,
159140
ServiceInstanceGUID: serviceInstanceGUID,
160141
}
161142
default:
162-
return bindings, warnings, nil
143+
return bindings[0], warnings, nil
163144
}
164145
}

actor/v7action/service_app_binding_test.go

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

254-
Describe("ListServiceAppBindings", func() {
254+
Describe("DeleteServiceAppBinding", func() {
255255
const (
256256
serviceInstanceName = "fake-service-instance-name"
257257
serviceInstanceGUID = "fake-service-instance-guid"
258258
appName = "fake-app-name"
259259
appGUID = "fake-app-guid"
260260
spaceGUID = "fake-space-guid"
261261
bindingGUID = "fake-binding-guid"
262+
fakeJobURL = ccv3.JobURL("fake-job-url")
262263
)
263264

264265
var (
265-
params ListServiceAppBindingParams
266-
warnings Warnings
267-
executionError error
268-
serviceCredentialBindings []resources.ServiceCredentialBinding
266+
params DeleteServiceAppBindingParams
267+
warnings Warnings
268+
executionError error
269+
stream chan PollJobEvent
269270
)
270271

271272
BeforeEach(func() {
@@ -296,27 +297,47 @@ var _ = Describe("Service App Binding Action", func() {
296297
nil,
297298
)
298299

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

306322
JustBeforeEach(func() {
307-
serviceCredentialBindings, warnings, executionError = actor.ListServiceAppBindings(params)
323+
stream, warnings, executionError = actor.DeleteServiceAppBinding(params)
308324
})
309325

310-
It("returns an event stream, warning, and no errors", func() {
326+
It("returns an event stream, warnings, and no errors", func() {
311327
Expect(executionError).NotTo(HaveOccurred())
312328

313329
Expect(warnings).To(ConsistOf(Warnings{
314330
"get instance warning",
315331
"get app warning",
316332
"get bindings warning",
333+
"delete binding warning",
317334
}))
318335

319-
Expect(serviceCredentialBindings).To(Equal([]resources.ServiceCredentialBinding{{GUID: bindingGUID}}))
336+
Eventually(stream).Should(Receive(Equal(PollJobEvent{
337+
State: JobPolling,
338+
Warnings: Warnings{"poll warning"},
339+
Err: nil,
340+
})))
320341
})
321342

322343
Describe("service instance lookup", func() {
@@ -407,6 +428,8 @@ var _ = Describe("Service App Binding Action", func() {
407428
ccv3.Query{Key: ccv3.TypeFilter, Values: []string{"app"}},
408429
ccv3.Query{Key: ccv3.AppGUIDFilter, Values: []string{appGUID}},
409430
ccv3.Query{Key: ccv3.ServiceInstanceGUIDFilter, Values: []string{serviceInstanceGUID}},
431+
ccv3.Query{Key: ccv3.PerPage, Values: []string{"1"}},
432+
ccv3.Query{Key: ccv3.Page, Values: []string{"1"}},
410433
))
411434
})
412435

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

508470
Describe("initiating the delete", func() {
509471
It("makes the correct call", func() {

command/v7/actor.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,6 @@ type Actor interface {
185185
GetUAAAPIVersion() (string, error)
186186
GetUnstagedNewestPackageGUID(appGuid string) (string, v7action.Warnings, error)
187187
GetUser(username, origin string) (resources.User, error)
188-
ListServiceAppBindings(params v7action.ListServiceAppBindingParams) ([]resources.ServiceCredentialBinding, v7action.Warnings, error)
189188
MakeCurlRequest(httpMethod string, path string, customHeaders []string, httpData string, failOnHTTPError bool) ([]byte, *http.Response, error)
190189
MapRoute(routeGUID string, appGUID string, destinationProtocol string, destinationPort int) (v7action.Warnings, error)
191190
Marketplace(filter v7action.MarketplaceFilter) ([]v7action.ServiceOfferingWithPlans, v7action.Warnings, error)

command/v7/unbind_service_command.go

Lines changed: 13 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,13 @@ import (
55
"code.cloudfoundry.org/cli/v8/actor/v7action"
66
"code.cloudfoundry.org/cli/v8/command/flag"
77
"code.cloudfoundry.org/cli/v8/command/v7/shared"
8-
"code.cloudfoundry.org/cli/v8/resources"
98
)
109

1110
type UnbindServiceCommand struct {
1211
BaseCommand
1312

1413
RequiredArgs flag.BindServiceArgs `positional-args:"yes"`
1514
Wait bool `short:"w" long:"wait" description:"Wait for the operation to complete"`
16-
Guid string `long:"guid" description:"Only delete the service binding with the specified GUID"`
1715
relatedCommands interface{} `related_commands:"apps, delete-service, services"`
1816
}
1917

@@ -26,7 +24,7 @@ func (cmd UnbindServiceCommand) Execute(args []string) error {
2624
return err
2725
}
2826

29-
bindings, warnings, err := cmd.Actor.ListServiceAppBindings(v7action.ListServiceAppBindingParams{
27+
stream, warnings, err := cmd.Actor.DeleteServiceAppBinding(v7action.DeleteServiceAppBindingParams{
3028
SpaceGUID: cmd.Config.TargetedSpace().GUID,
3129
ServiceInstanceName: cmd.RequiredArgs.ServiceInstanceName,
3230
AppName: cmd.RequiredArgs.AppName,
@@ -35,54 +33,25 @@ func (cmd UnbindServiceCommand) Execute(args []string) error {
3533
switch err.(type) {
3634
case nil:
3735
case actionerror.ServiceBindingNotFoundError:
38-
cmd.UI.DisplayText("Binding between {{.ServiceInstanceName}} and {{.AppName}} does not exist", cmd.names())
36+
cmd.UI.DisplayText("Binding between {{.ServiceInstanceName}} and {{.AppName}} did not exist", cmd.names())
3937
cmd.UI.DisplayOK()
4038
return nil
4139
default:
4240
return err
4341
}
4442

45-
// If a GUID is provided, narrow down to the binding matching that GUID.
46-
if cmd.Guid != "" {
47-
var filtered []resources.ServiceCredentialBinding
48-
for _, b := range bindings {
49-
if b.GUID == cmd.Guid {
50-
filtered = append(filtered, b)
51-
break
52-
}
53-
}
54-
if len(filtered) == 0 {
55-
cmd.UI.DisplayText("Service binding with GUID {{.BindingGUID}} does not exist", map[string]interface{}{"BindingGUID": cmd.Guid})
56-
cmd.UI.DisplayOK()
57-
return nil
58-
}
59-
bindings = filtered
60-
}
61-
62-
for _, binding := range bindings {
63-
cmd.UI.DisplayText("Deleting service binding {{.BindingGUID}}...", map[string]interface{}{"BindingGUID": binding.GUID})
64-
stream, warnings, err := cmd.Actor.DeleteServiceAppBinding(v7action.DeleteServiceAppBindingParams{
65-
ServiceBindingGUID: binding.GUID,
66-
})
67-
cmd.UI.DisplayWarnings(warnings)
68-
switch err.(type) {
69-
case nil:
70-
default:
71-
return err
72-
}
73-
74-
completed, err := shared.WaitForResult(stream, cmd.UI, cmd.Wait)
75-
switch {
76-
case err != nil:
77-
return err
78-
case completed:
79-
cmd.UI.DisplayOK()
80-
default:
81-
cmd.UI.DisplayOK()
82-
cmd.UI.DisplayText("Unbinding in progress. Use 'cf service {{.ServiceInstanceName}}' to check operation status.", cmd.names())
83-
}
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
8454
}
85-
return nil
8655
}
8756

8857
func (cmd UnbindServiceCommand) Usage() string {

0 commit comments

Comments
 (0)