Skip to content

Commit ee960a9

Browse files
pbuskoc0d1ngm0nk3y
authored andcommitted
allow filtering buildpack list by lifecycle
Co-authored-by: Ralf Pannemans <[email protected]>
1 parent 4497cc7 commit ee960a9

File tree

5 files changed

+50
-2
lines changed

5 files changed

+50
-2
lines changed

app/fetchers/buildpack_list_fetcher.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
require 'cloud_controller/paging/sequel_paginator'
22
require 'cloud_controller/paging/paginated_result'
3+
require 'cloud_controller/diego/lifecycles/lifecycles'
34
require 'fetchers/null_filter_query_generator'
45
require 'fetchers/base_list_fetcher'
56

@@ -18,6 +19,7 @@ def filter(message, dataset)
1819
dataset = dataset.where(name: message.names) if message.requested?(:names)
1920

2021
dataset = NullFilterQueryGenerator.add_filter(dataset, :stack, message.stacks) if message.requested?(:stacks)
22+
dataset = dataset.where(lifecycle: message.requested?(:lifecycle) ? message.lifecycle : Lifecycles::BUILDPACK)
2123

2224
if message.requested?(:label_selector)
2325
dataset = LabelSelectorQueryGenerator.add_selector_queries(

app/messages/buildpacks_list_message.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,17 @@ class BuildpacksListMessage < MetadataListMessage
55
register_allowed_keys %i[
66
stacks
77
names
8+
lifecycle
89
page
910
per_page
1011
]
1112

1213
validates :names, array: true, allow_nil: true
1314
validates :stacks, array: true, allow_nil: true
15+
validates :lifecycle,
16+
string: true,
17+
allow_nil: true,
18+
inclusion: { in: [VCAP::CloudController::Lifecycles::BUILDPACK, VCAP::CloudController::Lifecycles::CNB], message: 'must be either "buildpack" or "cnb"' }
1419

1520
validates_with NoAdditionalParamsValidator
1621

spec/unit/controllers/v3/buildpacks_controller_spec.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454

5555
let!(:buildpack1) { VCAP::CloudController::Buildpack.make(stack: stack1.name) }
5656
let!(:buildpack2) { VCAP::CloudController::Buildpack.make(stack: stack2.name) }
57+
let!(:buildpack3) { VCAP::CloudController::Buildpack.make(stack: stack1.name, lifecycle: 'cnb') }
5758

5859
before do
5960
set_current_user(user)
@@ -66,6 +67,12 @@
6667
expect(parsed_body['resources'].second['guid']).to eq(buildpack2.guid)
6768
end
6869

70+
it 'renders a lifecycle filtered list of buildpacks' do
71+
get :index, params: { lifecycle: 'cnb' }
72+
73+
expect(parsed_body['resources'].first['guid']).to eq(buildpack3.guid)
74+
end
75+
6976
it 'renders a name filtered list of buildpacks' do
7077
get :index, params: { names: buildpack2.name }
7178

spec/unit/fetchers/buildpack_list_fetcher_spec.rb

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ module VCAP::CloudController
1414
let!(:buildpack2) { Buildpack.make(stack: stack2.name) }
1515
let!(:buildpack3) { Buildpack.make(stack: stack3.name) }
1616
let!(:buildpack4) { Buildpack.make(stack: stack1.name) }
17+
let!(:buildpack5) { Buildpack.make(stack: stack1.name, lifecycle: 'cnb') }
18+
let!(:buildpack6) { Buildpack.make(stack: stack2.name, lifecycle: 'cnb') }
19+
let!(:buildpack7) { Buildpack.make(stack: nil, lifecycle: 'cnb') }
1720
let!(:buildpack_without_stack) { Buildpack.make(stack: nil) }
1821

1922
let(:message) { BuildpacksListMessage.from_params(filters) }
@@ -73,6 +76,26 @@ module VCAP::CloudController
7376
expect(subject).to contain_exactly(buildpack2, buildpack_without_stack)
7477
end
7578
end
79+
80+
context 'when filtering by lifecycle' do
81+
let(:filters) do
82+
{ 'lifecycle' => 'cnb' }
83+
end
84+
85+
it 'returns all buildpacks with the cnb lifecycle' do
86+
expect(subject).to contain_exactly(buildpack5, buildpack6, buildpack7)
87+
end
88+
end
89+
90+
context 'when filtering by lifecycle and stack' do
91+
let(:filters) do
92+
{ 'lifecycle' => 'cnb', 'stacks' => stack1.name }
93+
end
94+
95+
it 'returns all buildpacks with the cnb lifecycle' do
96+
expect(subject).to contain_exactly(buildpack5)
97+
end
98+
end
7699
end
77100
end
78101
end

spec/unit/messages/buildpacks_list_message_spec.rb

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ module VCAP::CloudController
88
{
99
'names' => 'name1,name2',
1010
'stacks' => 'stack1,stack2',
11+
'lifecycle' => 'buildpack',
1112
'label_selector' => 'foo=bar',
1213
'page' => 1,
1314
'per_page' => 5
@@ -21,6 +22,7 @@ module VCAP::CloudController
2122

2223
expect(message.stacks).to eq(%w[stack1 stack2])
2324
expect(message.names).to eq(%w[name1 name2])
25+
expect(message.lifecycle).to eq('buildpack')
2426
expect(message.label_selector).to eq('foo=bar')
2527
expect(message.requirements.first.key).to eq('foo')
2628
expect(message.page).to eq(1)
@@ -32,6 +34,7 @@ module VCAP::CloudController
3234

3335
expect(message).to be_requested(:stacks)
3436
expect(message).to be_requested(:names)
37+
expect(message).to be_requested(:lifecycle)
3538
expect(message).to be_requested(:label_selector)
3639
expect(message).to be_requested(:page)
3740
expect(message).to be_requested(:per_page)
@@ -43,14 +46,15 @@ module VCAP::CloudController
4346
{
4447
names: %w[name1 name2],
4548
stacks: %w[stack1 stack2],
49+
lifecycle: 'buildpack',
4650
label_selector: 'foo=bar',
4751
page: 1,
4852
per_page: 5
4953
}
5054
end
5155

5256
it 'excludes the pagination keys' do
53-
expected_params = %i[names stacks label_selector]
57+
expected_params = %i[names stacks label_selector lifecycle]
5458
expect(BuildpacksListMessage.from_params(opts).to_param_hash.keys).to match_array(expected_params)
5559
end
5660
end
@@ -61,7 +65,8 @@ module VCAP::CloudController
6165
BuildpacksListMessage.from_params({
6266
names: [],
6367
stacks: [],
64-
label_selector: ''
68+
label_selector: '',
69+
lifecycle: 'buildpack'
6570
})
6671
end.not_to raise_error
6772
end
@@ -101,6 +106,12 @@ module VCAP::CloudController
101106
and_call_original
102107
message.valid?
103108
end
109+
110+
it 'validates lifecycle' do
111+
message = BuildpacksListMessage.from_params lifecycle: 'foo'
112+
expect(message).not_to be_valid
113+
expect(message.errors[:lifecycle].length).to eq 1
114+
end
104115
end
105116
end
106117
end

0 commit comments

Comments
 (0)