Skip to content
This repository was archived by the owner on Jun 2, 2021. It is now read-only.

Commit 6d81c00

Browse files
v3(services): add common filters to service route bindings resource
[#175686797](https://www.pivotaltracker.com/story/show/175686797)
1 parent c8f4237 commit 6d81c00

5 files changed

Lines changed: 60 additions & 46 deletions

File tree

app/controllers/v3/service_route_bindings_controller.rb

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,11 +155,10 @@ def enqueue_unbind_job(binding_guid)
155155
end
156156

157157
def fetch_route_bindings(message)
158-
fetcher = RouteBindingListFetcher.new
159158
if permission_queryer.can_read_globally?
160-
fetcher.fetch_all(message)
159+
RouteBindingListFetcher.fetch_all(message)
161160
else
162-
fetcher.fetch_some(message, space_guids: space_guids)
161+
RouteBindingListFetcher.fetch_some(message, space_guids: space_guids)
163162
end
164163
end
165164

Lines changed: 46 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,58 @@
11
module VCAP
22
module CloudController
3-
class RouteBindingListFetcher
4-
def fetch_all(message)
5-
filter(message, all_bindings).
6-
select_all(:route_bindings)
7-
end
3+
class RouteBindingListFetcher < BaseListFetcher
4+
class << self
5+
def fetch_all(message)
6+
filter(message, all_bindings).
7+
select_all(:route_bindings)
8+
end
89

9-
def fetch_some(message, space_guids:)
10-
bindings = all_bindings.
11-
join(:spaces, id: Sequel[:service_instances][:space_id]).
12-
where { Sequel[:spaces][:guid] =~ space_guids }
10+
def fetch_some(message, space_guids:)
11+
bindings = all_bindings.
12+
join(:spaces, id: Sequel[:service_instances][:space_id]).
13+
where { Sequel[:spaces][:guid] =~ space_guids }
1314

14-
filter(message, bindings).
15-
select_all(:route_bindings)
16-
end
15+
filter(message, bindings).
16+
select_all(:route_bindings)
17+
end
1718

18-
private
19+
private
1920

20-
def all_bindings
21-
RouteBinding.dataset.
22-
join(:service_instances, id: Sequel[:route_bindings][:service_instance_id]).
23-
join(:routes, id: Sequel[:route_bindings][:route_id])
24-
end
21+
def filter(message, bindings)
22+
filters = {
23+
service_instance_guids: ->(dataset, requested) do
24+
dataset.where { Sequel[:service_instances][:guid] =~ requested.service_instance_guids }
25+
end,
26+
service_instance_names: ->(dataset, requested) do
27+
dataset.where { Sequel[:service_instances][:name] =~ requested.service_instance_names }
28+
end,
29+
route_guids: ->(dataset, requested) do
30+
dataset.where { Sequel[:routes][:guid] =~ requested.route_guids }
31+
end,
32+
label_selector: ->(dataset, requested) do
33+
LabelSelectorQueryGenerator.add_selector_queries(
34+
label_klass: RouteBindingLabelModel,
35+
resource_dataset: dataset,
36+
requirements: requested.requirements,
37+
resource_klass: RouteBinding
38+
)
39+
end
40+
}
2541

26-
def filter(message, bindings)
27-
FILTERS.
28-
select { |filter_name| message.requested?(filter_name) }.
29-
values.
30-
reduce(bindings) { |dataset, filter| filter.call(dataset, message) }
31-
end
42+
bindings = filters.
43+
select { |filter_name| message.requested?(filter_name) }.
44+
values.
45+
reduce(bindings) { |dataset, filter| filter.call(dataset, message) }
46+
47+
super(message, bindings, RouteBinding)
48+
end
3249

33-
FILTERS = {
34-
service_instance_guids: ->(dataset, message) do
35-
dataset.where { Sequel[:service_instances][:guid] =~ message.service_instance_guids }
36-
end,
37-
service_instance_names: ->(dataset, message) do
38-
dataset.where { Sequel[:service_instances][:name] =~ message.service_instance_names }
39-
end,
40-
route_guids: ->(dataset, message) do
41-
dataset.where { Sequel[:routes][:guid] =~ message.route_guids }
42-
end,
43-
label_selector: ->(dataset, message) do
44-
LabelSelectorQueryGenerator.add_selector_queries(
45-
label_klass: RouteBindingLabelModel,
46-
resource_dataset: dataset,
47-
requirements: message.requirements,
48-
resource_klass: RouteBinding
49-
)
50+
def all_bindings
51+
RouteBinding.dataset.
52+
join(:service_instances, id: Sequel[:route_bindings][:service_instance_id]).
53+
join(:routes, id: Sequel[:route_bindings][:route_id])
5054
end
51-
}.freeze
55+
end
5256
end
5357
end
5458
end

docs/v3/source/includes/experimental_resources/service_route_bindings/_list.md.erb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ Name | Type | Description
3535
**service_instance_guids** | _list of strings_ | Comma-delimited list of service instance guids to filter by
3636
**service_instance_names** | _list of strings_ | Comma-delimited list of service instance names to filter by
3737
**label_selector** | _string_ | A query string containing a list of [label selector](#labels-and-selectors) requirements
38+
**guids** | _list of strings_ | Comma-delimited list of service route binding guids to filter by
39+
**created_ats** (*experimental*)| _[timestamp](#timestamps)_ | Timestamp to filter by. When filtering on equality, several comma-delimited timestamps may be passed. Also supports filtering with [relational operators](#relational-operators-experimental)
40+
**updated_ats** (*experimental*)| _[timestamp](#timestamps)_ | Timestamp to filter by. When filtering on equality, several comma-delimited timestamps may be passed. Also supports filtering with [relational operators](#relational-operators-experimental)
3841
**include** | _list of strings_ | Optionally include a list of unique related resources in the response. Valid values are: `route`, `service_instance`
3942
**page** | _integer_ | Page to display; valid values are integers >= 1
4043
**per_page** | _integer_ | Number of results per page; <br>valid values are 1 through 5000

spec/request/service_route_bindings_spec.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,14 @@
189189

190190
expect_route_bindings(filtered_route_bindings)
191191
end
192+
193+
it_behaves_like 'list_endpoint_with_common_filters' do
194+
let(:resource_klass) { VCAP::CloudController::RouteBinding }
195+
let(:api_call) do
196+
lambda { |headers, filters| get "/v3/service_route_bindings?#{filters}", nil, headers }
197+
end
198+
let(:headers) { admin_headers }
199+
end
192200
end
193201

194202
describe 'include' do

spec/unit/fetchers/route_binding_list_fetcher_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
module VCAP
55
module CloudController
66
RSpec.describe RouteBindingListFetcher do
7-
let(:fetcher) { RouteBindingListFetcher.new }
7+
let(:fetcher) { described_class }
88

99
describe 'fetch_all' do
1010
let!(:route_bindings) { Array.new(3) { RouteBinding.make } }

0 commit comments

Comments
 (0)