Skip to content

Commit 9f2ae06

Browse files
committed
Add lifecycle flag to update-buildpack and delete-buildpack
- Would like to refactor some of the actor method names because adding AndLifecycle to the end is making them very long - There is probably room to refactor some of the message generation - Not sure how I feel about 'with stack some-stack with lifecycle my-lifecycle' as a message Signed-off-by: Tom Kennedy <tom.kennedy@broadcom.com>
1 parent b583e2d commit 9f2ae06

18 files changed

+659
-396
lines changed

actor/actionerror/buildpack_not_found_error.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ import "fmt"
66
type BuildpackNotFoundError struct {
77
BuildpackName string
88
StackName string
9+
Lifecycle string
910
}
1011

1112
func (e BuildpackNotFoundError) Error() string {
12-
return fmt.Sprintf("Buildpack not found - Name: '%s'; Stack: '%s'", e.BuildpackName, e.StackName)
13+
return fmt.Sprintf("Buildpack not found - Name: '%s'; Stack: '%s', Lifecyle: '%s'", e.BuildpackName, e.StackName, e.Lifecycle)
1314
}

actor/v7action/buildpack.go

+28-24
Original file line numberDiff line numberDiff line change
@@ -36,41 +36,45 @@ func (actor Actor) GetBuildpacks(labelSelector string, lifecycle string) ([]reso
3636
return buildpacks, Warnings(warnings), err
3737
}
3838

39-
// GetBuildpackByNameAndStack returns a buildpack with the provided name and
40-
// stack. If `buildpackStack` is not specified, and there are multiple
39+
// GetBuildpackByNameAndStackAndLifecycle returns a buildpack with the provided name, stack,
40+
// and lifecycle. If `buildpackStack` is not specified, and there are multiple
4141
// buildpacks with the same name, it will return the one with no stack, if
42-
// present.
43-
func (actor Actor) GetBuildpackByNameAndStack(buildpackName string, buildpackStack string) (resources.Buildpack, Warnings, error) {
42+
// present. If `buildpackLifecycle` is not specified and there are multiple buildpacks with
43+
// the same name, it will return the one with the default_app_lifecycle, if present.
44+
func (actor Actor) GetBuildpackByNameAndStackAndLifecycle(buildpackName string, buildpackStack string, buildpackLifecycle string) (resources.Buildpack, Warnings, error) {
4445
var (
4546
buildpacks []resources.Buildpack
4647
warnings ccv3.Warnings
4748
err error
4849
)
4950

50-
if buildpackStack == "" {
51-
buildpacks, warnings, err = actor.CloudControllerClient.GetBuildpacks(ccv3.Query{
52-
Key: ccv3.NameFilter,
53-
Values: []string{buildpackName},
51+
queries := []ccv3.Query{{
52+
Key: ccv3.NameFilter,
53+
Values: []string{buildpackName},
54+
}}
55+
56+
if buildpackStack != "" {
57+
queries = append(queries, ccv3.Query{
58+
Key: ccv3.StackFilter,
59+
Values: []string{buildpackStack},
5460
})
55-
} else {
56-
buildpacks, warnings, err = actor.CloudControllerClient.GetBuildpacks(
57-
ccv3.Query{
58-
Key: ccv3.NameFilter,
59-
Values: []string{buildpackName},
60-
},
61-
ccv3.Query{
62-
Key: ccv3.StackFilter,
63-
Values: []string{buildpackStack},
64-
},
65-
)
6661
}
6762

63+
if buildpackLifecycle != "" {
64+
queries = append(queries, ccv3.Query{
65+
Key: ccv3.LifecycleFilter,
66+
Values: []string{buildpackLifecycle},
67+
})
68+
}
69+
70+
buildpacks, warnings, err = actor.CloudControllerClient.GetBuildpacks(queries...)
71+
6872
if err != nil {
6973
return resources.Buildpack{}, Warnings(warnings), err
7074
}
7175

7276
if len(buildpacks) == 0 {
73-
return resources.Buildpack{}, Warnings(warnings), actionerror.BuildpackNotFoundError{BuildpackName: buildpackName, StackName: buildpackStack}
77+
return resources.Buildpack{}, Warnings(warnings), actionerror.BuildpackNotFoundError{BuildpackName: buildpackName, StackName: buildpackStack, Lifecycle: buildpackLifecycle}
7478
}
7579

7680
if len(buildpacks) > 1 {
@@ -91,9 +95,9 @@ func (actor Actor) CreateBuildpack(buildpack resources.Buildpack) (resources.Bui
9195
return buildpack, Warnings(warnings), err
9296
}
9397

94-
func (actor Actor) UpdateBuildpackByNameAndStack(buildpackName string, buildpackStack string, buildpack resources.Buildpack) (resources.Buildpack, Warnings, error) {
98+
func (actor Actor) UpdateBuildpackByNameAndStackAndLifecycle(buildpackName string, buildpackStack string, buildpackLifecycle string, buildpack resources.Buildpack) (resources.Buildpack, Warnings, error) {
9599
var warnings Warnings
96-
foundBuildpack, getWarnings, err := actor.GetBuildpackByNameAndStack(buildpackName, buildpackStack)
100+
foundBuildpack, getWarnings, err := actor.GetBuildpackByNameAndStackAndLifecycle(buildpackName, buildpackStack, buildpackLifecycle)
97101
warnings = append(warnings, getWarnings...)
98102

99103
if err != nil {
@@ -254,9 +258,9 @@ func Zipit(source, target, prefix string) error {
254258
return err
255259
}
256260

257-
func (actor Actor) DeleteBuildpackByNameAndStack(buildpackName string, buildpackStack string) (Warnings, error) {
261+
func (actor Actor) DeleteBuildpackByNameAndStackAndLifecycle(buildpackName string, buildpackStack string, buildpackLifecycle string) (Warnings, error) {
258262
var allWarnings Warnings
259-
buildpack, getBuildpackWarnings, err := actor.GetBuildpackByNameAndStack(buildpackName, buildpackStack)
263+
buildpack, getBuildpackWarnings, err := actor.GetBuildpackByNameAndStackAndLifecycle(buildpackName, buildpackStack, buildpackLifecycle)
260264
allWarnings = append(allWarnings, getBuildpackWarnings...)
261265
if err != nil {
262266
return allWarnings, err

actor/v7action/buildpack_test.go

+114-25
Original file line numberDiff line numberDiff line change
@@ -28,23 +28,24 @@ var _ = Describe("Buildpack", func() {
2828
actor, fakeCloudControllerClient, _, _, _, _, _ = NewTestActor()
2929
})
3030

31-
Describe("GetBuildpackByNameAndStack", func() {
31+
Describe("GetBuildpackByNameAndStackAndLifecycle", func() {
3232
var (
33-
buildpackName = "buildpack-1"
34-
buildpackStack = "stack-name"
35-
buildpack resources.Buildpack
36-
warnings Warnings
37-
executeErr error
33+
buildpackName = "buildpack-1"
34+
buildpackStack = "stack-name"
35+
buildpackLifecycle = "buildpack"
36+
buildpack resources.Buildpack
37+
warnings Warnings
38+
executeErr error
3839
)
3940

4041
JustBeforeEach(func() {
41-
buildpack, warnings, executeErr = actor.GetBuildpackByNameAndStack(buildpackName, buildpackStack)
42+
buildpack, warnings, executeErr = actor.GetBuildpackByNameAndStackAndLifecycle(buildpackName, buildpackStack, buildpackLifecycle)
4243
})
4344

4445
When("getting buildpacks fails", func() {
4546
BeforeEach(func() {
46-
4747
buildpackStack = "real-good-stack"
48+
buildpackLifecycle = "some-lifecycle"
4849
fakeCloudControllerClient.GetBuildpacksReturns(
4950
nil,
5051
ccv3.Warnings{"some-warning-1", "some-warning-2"},
@@ -65,6 +66,10 @@ var _ = Describe("Buildpack", func() {
6566
Key: ccv3.StackFilter,
6667
Values: []string{buildpackStack},
6768
},
69+
ccv3.Query{
70+
Key: ccv3.LifecycleFilter,
71+
Values: []string{buildpackLifecycle},
72+
},
6873
))
6974
})
7075
})
@@ -120,15 +125,16 @@ var _ = Describe("Buildpack", func() {
120125
})
121126

122127
It("returns warnings and a BuildpackNotFoundError", func() {
123-
Expect(executeErr).To(MatchError(actionerror.BuildpackNotFoundError{BuildpackName: buildpackName, StackName: buildpackStack}))
128+
Expect(executeErr).To(MatchError(actionerror.BuildpackNotFoundError{BuildpackName: buildpackName, StackName: buildpackStack, Lifecycle: buildpackLifecycle}))
124129
Expect(warnings).To(ConsistOf("some-warning-1", "some-warning-2"))
125130
})
126131
})
127132

128133
When("getting buildpacks is successful", func() {
129-
When("No stack is specified", func() {
134+
When("No stack or lifecycle is specified", func() {
130135
BeforeEach(func() {
131136
buildpackStack = ""
137+
buildpackLifecycle = ""
132138
buildpackName = "my-buildpack"
133139

134140
ccBuildpack := resources.Buildpack{Name: "my-buildpack", GUID: "some-guid"}
@@ -144,7 +150,7 @@ var _ = Describe("Buildpack", func() {
144150
Expect(buildpack).To(Equal(resources.Buildpack{Name: "my-buildpack", GUID: "some-guid"}))
145151
})
146152

147-
It("Does not pass a stack query to the client", func() {
153+
It("Does not pass a stack or lifecycle query to the client", func() {
148154
Expect(fakeCloudControllerClient.GetBuildpacksCallCount()).To(Equal(1))
149155
queries := fakeCloudControllerClient.GetBuildpacksArgsForCall(0)
150156
Expect(queries).To(ConsistOf(
@@ -156,10 +162,11 @@ var _ = Describe("Buildpack", func() {
156162
})
157163
})
158164

159-
When("A stack is specified", func() {
165+
When("only a stack is specified", func() {
160166
BeforeEach(func() {
161167
buildpackStack = "good-stack"
162168
buildpackName = "my-buildpack"
169+
buildpackLifecycle = ""
163170

164171
ccBuildpack := resources.Buildpack{Name: "my-buildpack", GUID: "some-guid", Stack: "good-stack"}
165172
fakeCloudControllerClient.GetBuildpacksReturns(
@@ -174,7 +181,7 @@ var _ = Describe("Buildpack", func() {
174181
Expect(buildpack).To(Equal(resources.Buildpack{Name: "my-buildpack", GUID: "some-guid", Stack: "good-stack"}))
175182
})
176183

177-
It("Does pass a stack query to the client", func() {
184+
It("Only passes a stack query to the client", func() {
178185
Expect(fakeCloudControllerClient.GetBuildpacksCallCount()).To(Equal(1))
179186
queries := fakeCloudControllerClient.GetBuildpacksArgsForCall(0)
180187
Expect(queries).To(ConsistOf(
@@ -189,6 +196,78 @@ var _ = Describe("Buildpack", func() {
189196
))
190197
})
191198
})
199+
When("only a lifecycle is specified", func() {
200+
BeforeEach(func() {
201+
buildpackLifecycle = "good-lifecycle"
202+
buildpackStack = ""
203+
buildpackName = "my-buildpack"
204+
205+
ccBuildpack := resources.Buildpack{Name: "my-buildpack", GUID: "some-guid", Lifecycle: "good-lifecycle"}
206+
fakeCloudControllerClient.GetBuildpacksReturns(
207+
[]resources.Buildpack{ccBuildpack},
208+
ccv3.Warnings{"some-warning-1", "some-warning-2"},
209+
nil)
210+
})
211+
212+
It("Returns the proper buildpack", func() {
213+
Expect(executeErr).ToNot(HaveOccurred())
214+
Expect(warnings).To(ConsistOf("some-warning-1", "some-warning-2"))
215+
Expect(buildpack).To(Equal(resources.Buildpack{Name: "my-buildpack", GUID: "some-guid", Lifecycle: "good-lifecycle"}))
216+
})
217+
218+
It("Only passes a lifecycle query to the client", func() {
219+
Expect(fakeCloudControllerClient.GetBuildpacksCallCount()).To(Equal(1))
220+
queries := fakeCloudControllerClient.GetBuildpacksArgsForCall(0)
221+
Expect(queries).To(ConsistOf(
222+
ccv3.Query{
223+
Key: ccv3.NameFilter,
224+
Values: []string{buildpackName},
225+
},
226+
ccv3.Query{
227+
Key: ccv3.LifecycleFilter,
228+
Values: []string{buildpackLifecycle},
229+
},
230+
))
231+
})
232+
})
233+
When("When stack and lifecycle are specified", func() {
234+
BeforeEach(func() {
235+
buildpackLifecycle = "good-lifecycle"
236+
buildpackStack = "good-stack"
237+
buildpackName = "my-buildpack"
238+
239+
ccBuildpack := resources.Buildpack{Name: "my-buildpack", GUID: "some-guid", Lifecycle: "good-lifecycle", Stack: "good-stack"}
240+
fakeCloudControllerClient.GetBuildpacksReturns(
241+
[]resources.Buildpack{ccBuildpack},
242+
ccv3.Warnings{"some-warning-1", "some-warning-2"},
243+
nil)
244+
})
245+
246+
It("Returns the proper buildpack", func() {
247+
Expect(executeErr).ToNot(HaveOccurred())
248+
Expect(warnings).To(ConsistOf("some-warning-1", "some-warning-2"))
249+
Expect(buildpack).To(Equal(resources.Buildpack{Name: "my-buildpack", GUID: "some-guid", Lifecycle: "good-lifecycle", Stack: "good-stack"}))
250+
})
251+
252+
It("Only passes a lifecycle query to the client", func() {
253+
Expect(fakeCloudControllerClient.GetBuildpacksCallCount()).To(Equal(1))
254+
queries := fakeCloudControllerClient.GetBuildpacksArgsForCall(0)
255+
Expect(queries).To(ConsistOf(
256+
ccv3.Query{
257+
Key: ccv3.NameFilter,
258+
Values: []string{buildpackName},
259+
},
260+
ccv3.Query{
261+
Key: ccv3.LifecycleFilter,
262+
Values: []string{buildpackLifecycle},
263+
},
264+
ccv3.Query{
265+
Key: ccv3.StackFilter,
266+
Values: []string{buildpackStack},
267+
},
268+
))
269+
})
270+
})
192271
})
193272
})
194273

@@ -338,9 +417,10 @@ var _ = Describe("Buildpack", func() {
338417

339418
Describe("UpdateBuildpackByNameAndStack", func() {
340419
var (
341-
buildpackName = "my-buildpack"
342-
buildpackStack = "my-stack"
343-
buildpack = resources.Buildpack{
420+
buildpackName = "my-buildpack"
421+
buildpackStack = "my-stack"
422+
buildpackLifecycle = "cnb"
423+
buildpack = resources.Buildpack{
344424
Stack: "new-stack",
345425
}
346426

@@ -350,7 +430,7 @@ var _ = Describe("Buildpack", func() {
350430
)
351431

352432
JustBeforeEach(func() {
353-
retBuildpack, warnings, executeErr = actor.UpdateBuildpackByNameAndStack(buildpackName, buildpackStack, buildpack)
433+
retBuildpack, warnings, executeErr = actor.UpdateBuildpackByNameAndStackAndLifecycle(buildpackName, buildpackStack, buildpackLifecycle, buildpack)
354434
})
355435

356436
When("it is successful", func() {
@@ -377,6 +457,10 @@ var _ = Describe("Buildpack", func() {
377457
Key: ccv3.StackFilter,
378458
Values: []string{buildpackStack},
379459
},
460+
ccv3.Query{
461+
Key: ccv3.LifecycleFilter,
462+
Values: []string{buildpackLifecycle},
463+
},
380464
))
381465

382466
paramBuildpack := fakeCloudControllerClient.UpdateBuildpackArgsForCall(0)
@@ -651,18 +735,19 @@ var _ = Describe("Buildpack", func() {
651735
})
652736
})
653737

654-
Describe("DeleteBuildpackByNameAndStack", func() {
738+
Describe("DeleteBuildpackByNameAndStackAndLifecycle", func() {
655739
var (
656-
buildpackName = "buildpack-name"
657-
buildpackStack = "buildpack-stack"
658-
buildpackGUID = "buildpack-guid"
659-
jobURL = "buildpack-delete-job-url"
660-
warnings Warnings
661-
executeErr error
740+
buildpackName = "buildpack-name"
741+
buildpackStack = "buildpack-stack"
742+
buildpackLifecycle = "buildpack-stack"
743+
buildpackGUID = "buildpack-guid"
744+
jobURL = "buildpack-delete-job-url"
745+
warnings Warnings
746+
executeErr error
662747
)
663748

664749
JustBeforeEach(func() {
665-
warnings, executeErr = actor.DeleteBuildpackByNameAndStack(buildpackName, buildpackStack)
750+
warnings, executeErr = actor.DeleteBuildpackByNameAndStackAndLifecycle(buildpackName, buildpackStack, buildpackLifecycle)
666751
})
667752

668753
When("getting the buildpack fails", func() {
@@ -686,6 +771,10 @@ var _ = Describe("Buildpack", func() {
686771
Key: ccv3.StackFilter,
687772
Values: []string{buildpackStack},
688773
},
774+
ccv3.Query{
775+
Key: ccv3.LifecycleFilter,
776+
Values: []string{buildpackLifecycle},
777+
},
689778
))
690779
})
691780
})

actor/v7action/label.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ func (actor *Actor) GetStackLabels(stackName string) (map[string]types.NullStrin
5656
return actor.extractLabels(resource.Metadata, warnings, err)
5757
}
5858

59-
func (actor *Actor) GetBuildpackLabels(buildpackName string, buildpackStack string) (map[string]types.NullString, Warnings, error) {
60-
resource, warnings, err := actor.GetBuildpackByNameAndStack(buildpackName, buildpackStack)
59+
func (actor *Actor) GetBuildpackLabels(buildpackName string, buildpackStack string, buildpackLifecycle string) (map[string]types.NullString, Warnings, error) {
60+
resource, warnings, err := actor.GetBuildpackByNameAndStackAndLifecycle(buildpackName, buildpackStack, buildpackLifecycle)
6161
return actor.extractLabels(resource.Metadata, warnings, err)
6262
}
6363

@@ -81,8 +81,8 @@ func (actor *Actor) UpdateApplicationLabelsByApplicationName(appName string, spa
8181
return actor.updateResourceMetadata("app", app.GUID, resources.Metadata{Labels: labels}, warnings)
8282
}
8383

84-
func (actor *Actor) UpdateBuildpackLabelsByBuildpackNameAndStack(buildpackName string, stack string, labels map[string]types.NullString) (Warnings, error) {
85-
buildpack, warnings, err := actor.GetBuildpackByNameAndStack(buildpackName, stack)
84+
func (actor *Actor) UpdateBuildpackLabelsByBuildpackNameAndStackAndLifecycle(buildpackName string, stack string, lifecycle string, labels map[string]types.NullString) (Warnings, error) {
85+
buildpack, warnings, err := actor.GetBuildpackByNameAndStackAndLifecycle(buildpackName, stack, lifecycle)
8686
if err != nil {
8787
return warnings, err
8888
}

0 commit comments

Comments
 (0)