Skip to content

Commit df2b677

Browse files
committed
Add label_selector support to route policies list
- RoutePoliciesListMessage now inherits from MetadataListMessage, which auto-registers :label_selector and wires LabelSelectorRequirementValidator - build_dataset in RoutePoliciesController delegates to LabelSelectorQueryGenerator when a selector is requested
1 parent 5cc3257 commit df2b677

4 files changed

Lines changed: 47 additions & 2 deletions

File tree

app/controllers/v3/route_policies_controller.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
require 'decorators/include_route_policy_route_decorator'
88
require 'actions/route_policy_create'
99
require 'repositories/route_policy_event_repository'
10+
require 'fetchers/label_selector_query_generator'
1011

1112
class RoutePoliciesController < ApplicationController
1213
def index
@@ -169,6 +170,15 @@ def build_dataset(message)
169170

170171
dataset = dataset.where(source_guid: message.source_guids) if message.requested?(:source_guids)
171172

173+
if message.requested?(:label_selector)
174+
dataset = VCAP::CloudController::LabelSelectorQueryGenerator.add_selector_queries(
175+
label_klass: VCAP::CloudController::RoutePolicyLabelModel,
176+
resource_dataset: dataset,
177+
requirements: message.requirements,
178+
resource_klass: VCAP::CloudController::RoutePolicy
179+
)
180+
end
181+
172182
dataset
173183
end
174184
end

app/messages/route_policies_list_message.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
require 'messages/list_message'
1+
require 'messages/metadata_list_message'
22

33
module VCAP::CloudController
4-
class RoutePoliciesListMessage < ListMessage
4+
class RoutePoliciesListMessage < MetadataListMessage
55
register_allowed_keys %i[
66
guids
77
route_guids

spec/request/route_policies_spec.rb

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,28 @@ def expected_rule_json(rule)
583583
end
584584
end
585585

586+
describe 'filtering by label_selector' do
587+
let(:another_route) { VCAP::CloudController::Route.make(space: space, domain: mtls_domain) }
588+
let!(:labelled_policy) do
589+
policy = VCAP::CloudController::RoutePolicy.create(source: 'cf:any', route_id: mtls_route.id)
590+
VCAP::CloudController::RoutePolicyLabelModel.create(resource_guid: policy.guid, key_name: 'env', value: 'prod')
591+
policy
592+
end
593+
let!(:unlabelled_policy) do
594+
VCAP::CloudController::RoutePolicy.create(source: 'cf:any', route_id: another_route.id)
595+
end
596+
597+
it 'returns only policies matching the label selector' do
598+
get '/v3/route_policies?label_selector=env=prod', nil, admin_header
599+
600+
expect(last_response.status).to eq(200)
601+
parsed = Oj.load(last_response.body)
602+
guids = parsed['resources'].pluck('guid')
603+
expect(guids).to include(labelled_policy.guid)
604+
expect(guids).not_to include(unlabelled_policy.guid)
605+
end
606+
end
607+
586608
context 'with include=source' do
587609
let!(:frontend_app) { VCAP::CloudController::AppModel.make(space: space, name: 'frontend-app') }
588610
let!(:other_space) { VCAP::CloudController::Space.make(organization: org, name: 'other-space') }

spec/unit/messages/route_policies_list_message_spec.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,19 @@ module VCAP::CloudController
125125
end
126126
end
127127

128+
describe 'label_selector' do
129+
it 'accepts a label_selector param' do
130+
message = RoutePoliciesListMessage.from_params({ 'label_selector' => 'env=prod' })
131+
expect(message).to be_valid
132+
expect(message).to be_requested(:label_selector)
133+
end
134+
135+
it 'rejects an invalid label_selector' do
136+
message = RoutePoliciesListMessage.from_params({ 'label_selector' => '%%invalid' })
137+
expect(message).not_to be_valid
138+
end
139+
end
140+
128141
describe 'validations' do
129142
it 'validates space_guids is an array' do
130143
message = RoutePoliciesListMessage.from_params space_guids: 'not array'

0 commit comments

Comments
 (0)