Skip to content

Commit

Permalink
allow filtering buildpack list by lifecycle
Browse files Browse the repository at this point in the history
Co-authored-by: Ralf Pannemans <[email protected]>
  • Loading branch information
pbusko and c0d1ngm0nk3y committed Jul 25, 2024
1 parent e5d4c41 commit 08caa11
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 2 deletions.
2 changes: 2 additions & 0 deletions app/fetchers/buildpack_list_fetcher.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
require 'cloud_controller/paging/sequel_paginator'
require 'cloud_controller/paging/paginated_result'
require 'cloud_controller/diego/lifecycles/lifecycles'
require 'fetchers/null_filter_query_generator'
require 'fetchers/base_list_fetcher'

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

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

if message.requested?(:label_selector)
dataset = LabelSelectorQueryGenerator.add_selector_queries(
Expand Down
5 changes: 5 additions & 0 deletions app/messages/buildpacks_list_message.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,17 @@ class BuildpacksListMessage < MetadataListMessage
register_allowed_keys %i[
stacks
names
lifecycle
page
per_page
]

validates :names, array: true, allow_nil: true
validates :stacks, array: true, allow_nil: true
validates :lifecycle,
string: true,
allow_nil: true,
inclusion: { in: [VCAP::CloudController::Lifecycles::BUILDPACK, VCAP::CloudController::Lifecycles::CNB], message: 'must be either "buildpack" or "cnb"' }

validates_with NoAdditionalParamsValidator

Expand Down
7 changes: 7 additions & 0 deletions spec/unit/controllers/v3/buildpacks_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@

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

before do
set_current_user(user)
Expand All @@ -66,6 +67,12 @@
expect(parsed_body['resources'].second['guid']).to eq(buildpack2.guid)
end

it 'renders a lifecycle filtered list of buildpacks' do
get :index, params: { lifecycle: 'cnb' }

expect(parsed_body['resources'].first['guid']).to eq(buildpack3.guid)
end

it 'renders a name filtered list of buildpacks' do
get :index, params: { names: buildpack2.name }

Expand Down
23 changes: 23 additions & 0 deletions spec/unit/fetchers/buildpack_list_fetcher_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ module VCAP::CloudController
let!(:buildpack2) { Buildpack.make(stack: stack2.name) }
let!(:buildpack3) { Buildpack.make(stack: stack3.name) }
let!(:buildpack4) { Buildpack.make(stack: stack1.name) }
let!(:buildpack5) { Buildpack.make(stack: stack1.name, lifecycle: 'cnb') }
let!(:buildpack6) { Buildpack.make(stack: stack2.name, lifecycle: 'cnb') }
let!(:buildpack7) { Buildpack.make(stack: nil, lifecycle: 'cnb') }
let!(:buildpack_without_stack) { Buildpack.make(stack: nil) }

let(:message) { BuildpacksListMessage.from_params(filters) }
Expand Down Expand Up @@ -73,6 +76,26 @@ module VCAP::CloudController
expect(subject).to contain_exactly(buildpack2, buildpack_without_stack)
end
end

context 'when filtering by lifecycle' do
let(:filters) do
{ 'lifecycle' => 'cnb' }
end

it 'returns all buildpacks with the cnb lifecycle' do
expect(subject).to contain_exactly(buildpack5, buildpack6, buildpack7)
end
end

context 'when filtering by lifecycle and stack' do
let(:filters) do
{ 'lifecycle' => 'cnb', 'stacks' => stack1.name }
end

it 'returns all buildpacks with the cnb lifecycle' do
expect(subject).to contain_exactly(buildpack5)
end
end
end
end
end
15 changes: 13 additions & 2 deletions spec/unit/messages/buildpacks_list_message_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ module VCAP::CloudController
{
'names' => 'name1,name2',
'stacks' => 'stack1,stack2',
'lifecycle' => 'buildpack',
'label_selector' => 'foo=bar',
'page' => 1,
'per_page' => 5
Expand All @@ -21,6 +22,7 @@ module VCAP::CloudController

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

expect(message).to be_requested(:stacks)
expect(message).to be_requested(:names)
expect(message).to be_requested(:lifecycle)
expect(message).to be_requested(:label_selector)
expect(message).to be_requested(:page)
expect(message).to be_requested(:per_page)
Expand All @@ -43,14 +46,15 @@ module VCAP::CloudController
{
names: %w[name1 name2],
stacks: %w[stack1 stack2],
lifecycle: 'buildpack',
label_selector: 'foo=bar',
page: 1,
per_page: 5
}
end

it 'excludes the pagination keys' do
expected_params = %i[names stacks label_selector]
expected_params = %i[names stacks label_selector lifecycle]
expect(BuildpacksListMessage.from_params(opts).to_param_hash.keys).to match_array(expected_params)
end
end
Expand All @@ -61,7 +65,8 @@ module VCAP::CloudController
BuildpacksListMessage.from_params({
names: [],
stacks: [],
label_selector: ''
label_selector: '',
lifecycle: 'buildpack'
})
end.not_to raise_error
end
Expand Down Expand Up @@ -101,6 +106,12 @@ module VCAP::CloudController
and_call_original
message.valid?
end

it 'validates lifecycle' do
message = BuildpacksListMessage.from_params lifecycle: 'foo'
expect(message).not_to be_valid
expect(message.errors[:lifecycle].length).to eq 1
end
end
end
end

0 comments on commit 08caa11

Please sign in to comment.