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

Commit 82d0788

Browse files
selzocsweinstein22
andcommitted
Packages, packages for app, org quotas, and roles can be filtered by created_ats and updated_ats
[#173719526] Co-authored-by: Chris Selzo <cselzo@pivotal.io> Co-authored-by: Sarah Weinstein <sweinstein@pivotal.io>
1 parent ff7d5a6 commit 82d0788

8 files changed

Lines changed: 116 additions & 66 deletions

File tree

app/controllers/v3/packages_controller.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,13 @@ def index
2121
invalid_param!(message.errors.full_messages) unless message.valid?
2222

2323
if app_nested?
24-
app, dataset = PackageListFetcher.new.fetch_for_app(message: message)
24+
app, dataset = PackageListFetcher.fetch_for_app(message: message)
2525
app_not_found! unless app && permission_queryer.can_read_from_space?(app.space.guid, app.organization.guid)
2626
else
2727
dataset = if permission_queryer.can_read_globally?
28-
PackageListFetcher.new.fetch_all(message: message)
28+
PackageListFetcher.fetch_all(message: message)
2929
else
30-
PackageListFetcher.new.fetch_for_spaces(message: message, space_guids: permission_queryer.readable_space_guids)
30+
PackageListFetcher.fetch_for_spaces(message: message, space_guids: permission_queryer.readable_space_guids)
3131
end
3232
end
3333

app/fetchers/organization_quota_list_fetcher.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
require 'cloud_controller/paging/sequel_paginator'
22
require 'cloud_controller/paging/paginated_result'
3+
require 'fetchers/base_list_fetcher'
34

45
module VCAP::CloudController
5-
class OrganizationQuotaListFetcher
6+
class OrganizationQuotaListFetcher < BaseListFetcher
67
class << self
78
def fetch(message:, readable_org_guids:)
89
dataset = QuotaDefinition.dataset
@@ -27,7 +28,7 @@ def filter(message, dataset, readable_org_guids)
2728
qualify(:quota_definitions)
2829
end
2930

30-
dataset
31+
super(message, dataset, QuotaDefinition)
3132
end
3233
end
3334
end
Lines changed: 61 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,80 @@
1-
module VCAP::CloudController
2-
class PackageListFetcher
3-
def fetch_all(message:)
4-
filter(message, joined_dataset)
5-
end
1+
require 'fetchers/base_list_fetcher'
62

7-
def fetch_for_spaces(message:, space_guids:)
8-
dataset = joined_dataset.where(table_column_name(AppModel, :space_guid) => space_guids)
9-
filter(message, dataset)
10-
end
3+
module VCAP::CloudController
4+
class PackageListFetcher < BaseListFetcher
5+
class << self
6+
def fetch_all(message:)
7+
filter(message, joined_dataset)
8+
end
119

12-
def fetch_for_app(message:)
13-
app_dataset = AppModel.where(guid: message.app_guid).eager(:space, :organization)
14-
app = app_dataset.first
15-
return [nil, nil] unless app
10+
def fetch_for_spaces(message:, space_guids:)
11+
dataset = joined_dataset.where(table_column_name(AppModel, :space_guid) => space_guids)
12+
filter(message, dataset)
13+
end
1614

17-
dataset = PackageModel.dataset.select_all(PackageModel.table_name).
18-
join(AppModel.table_name, guid: :app_guid).
19-
where(table_column_name(AppModel, :guid) => message.app_guid)
15+
def fetch_for_app(message:)
16+
app_dataset = AppModel.where(guid: message.app_guid).eager(:space, :organization)
17+
app = app_dataset.first
18+
return [nil, nil] unless app
2019

21-
[app, filter(message, dataset)]
22-
end
20+
dataset = PackageModel.dataset.select_all(PackageModel.table_name).
21+
join(AppModel.table_name, guid: :app_guid).
22+
where(table_column_name(AppModel, :guid) => message.app_guid)
2323

24-
private
24+
[app, filter(message, dataset)]
25+
end
2526

26-
def table_column_name(table_class, name)
27-
"#{table_class.table_name}__#{name}".to_sym
28-
end
27+
private
2928

30-
def joined_dataset
31-
PackageModel.dataset.select_all(PackageModel.table_name).
32-
join(AppModel.table_name, guid: :app_guid)
33-
end
34-
35-
def filter(message, dataset)
36-
if message.requested? :states
37-
dataset = dataset.where(table_column_name(PackageModel, :state) => message.states)
29+
def table_column_name(table_class, name)
30+
"#{table_class.table_name}__#{name}".to_sym
3831
end
3932

40-
if message.requested? :types
41-
dataset = dataset.where(table_column_name(PackageModel, :type) => message.types)
33+
def joined_dataset
34+
PackageModel.dataset.select_all(PackageModel.table_name).
35+
join(AppModel.table_name, guid: :app_guid)
4236
end
4337

44-
if message.requested? :guids
45-
dataset = dataset.where(table_column_name(PackageModel, :guid) => message.guids)
46-
end
38+
def filter(message, dataset)
39+
if message.requested? :states
40+
dataset = dataset.where(table_column_name(PackageModel, :state) => message.states)
41+
end
4742

48-
if message.requested? :app_guids
49-
dataset = dataset.where(table_column_name(AppModel, :guid) => message.app_guids)
50-
end
43+
if message.requested? :types
44+
dataset = dataset.where(table_column_name(PackageModel, :type) => message.types)
45+
end
5146

52-
if message.requested? :space_guids
53-
dataset = dataset.where(table_column_name(AppModel, :space_guid) => message.space_guids)
54-
end
47+
if message.requested? :guids
48+
dataset = dataset.where(table_column_name(PackageModel, :guid) => message.guids)
49+
end
5550

56-
if message.requested? :organization_guids
57-
dataset = dataset.
58-
join(:spaces, guid: :space_guid).
59-
join(:organizations, id: :organization_id).
60-
where(Sequel[:organizations][:guid] => message.organization_guids).
61-
qualify(:packages)
62-
end
51+
if message.requested? :app_guids
52+
dataset = dataset.where(table_column_name(AppModel, :guid) => message.app_guids)
53+
end
6354

64-
if message.requested?(:label_selector)
65-
dataset = LabelSelectorQueryGenerator.add_selector_queries(
66-
label_klass: PackageLabelModel,
67-
resource_dataset: dataset,
68-
requirements: message.requirements,
69-
resource_klass: PackageModel,
70-
)
71-
end
55+
if message.requested? :space_guids
56+
dataset = dataset.where(table_column_name(AppModel, :space_guid) => message.space_guids)
57+
end
58+
59+
if message.requested? :organization_guids
60+
dataset = dataset.
61+
join(:spaces, guid: :space_guid).
62+
join(:organizations, id: :organization_id).
63+
where(Sequel[:organizations][:guid] => message.organization_guids).
64+
qualify(:packages)
65+
end
7266

73-
dataset
67+
if message.requested?(:label_selector)
68+
dataset = LabelSelectorQueryGenerator.add_selector_queries(
69+
label_klass: PackageLabelModel,
70+
resource_dataset: dataset,
71+
requirements: message.requirements,
72+
resource_klass: PackageModel,
73+
)
74+
end
75+
76+
super(message, dataset, PackageModel)
77+
end
7478
end
7579
end
7680
end

app/fetchers/role_list_fetcher.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
require 'cloud_controller/paging/sequel_paginator'
22
require 'cloud_controller/paging/paginated_result'
3+
require 'fetchers/base_list_fetcher'
34

45
module VCAP::CloudController
5-
class RoleListFetcher
6+
class RoleListFetcher < BaseListFetcher
67
class << self
78
def fetch(message, readable_users_dataset, eager_loaded_associations: [])
89
filter(message, readable_users_dataset).eager(eager_loaded_associations)
@@ -29,7 +30,8 @@ def filter(message, dataset)
2930
space_ids = Space.dataset.where(guid: message.space_guids).select(:id)
3031
dataset = dataset.where(space_id: space_ids)
3132
end
32-
dataset
33+
34+
super(message, dataset, Role)
3335
end
3436
end
3537
end

spec/request/organization_quotas_spec.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,14 @@ module VCAP::CloudController
212212

213213
it_behaves_like 'permissions for list endpoint', ALL_PERMISSIONS
214214

215+
it_behaves_like 'list_endpoint_with_common_filters' do
216+
let(:resource_klass) { VCAP::CloudController::QuotaDefinition }
217+
let(:api_call) do
218+
lambda { |headers, filters| get "/v3/organization_quotas?#{filters}", nil, headers }
219+
end
220+
let(:headers) { admin_headers }
221+
end
222+
215223
context 'with filters' do
216224
let!(:organization_quota_2) { VCAP::CloudController::QuotaDefinition.make(guid: 'second-guid', name: 'second-name') }
217225
let!(:organization_quota_3) { VCAP::CloudController::QuotaDefinition.make(guid: 'third-guid', name: 'third-name') }

spec/request/packages_spec.rb

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@
161161

162162
describe 'GET /v3/apps/:guid/packages' do
163163
let(:space) { VCAP::CloudController::Space.make }
164-
let!(:package) { VCAP::CloudController::PackageModel.make(app_guid: app_model.guid, created_at: Time.at(1)) }
164+
let!(:package) { VCAP::CloudController::PackageModel.make(app_guid: app_model.guid) }
165165
let(:app_model) { VCAP::CloudController::AppModel.make(space_guid: space.guid) }
166166
let(:guid) { app_model.guid }
167167
let(:page) { 1 }
@@ -174,7 +174,7 @@
174174
end
175175

176176
it 'lists paginated result of all packages for an app' do
177-
package2 = VCAP::CloudController::PackageModel.make(app_guid: app_model.guid, created_at: Time.at(2))
177+
package2 = VCAP::CloudController::PackageModel.make(app_guid: app_model.guid, created_at: package.created_at + 1.hour)
178178

179179
expected_response = {
180180
'pagination' => {
@@ -235,6 +235,15 @@
235235
expect(parsed_response).to be_a_response_like(expected_response)
236236
end
237237

238+
it_behaves_like 'list_endpoint_with_common_filters' do
239+
let(:resource_klass) { VCAP::CloudController::PackageModel }
240+
let(:api_call) do
241+
lambda { |headers, filters| get "/v3/apps/#{guid}/packages?#{filters}", nil, headers }
242+
end
243+
let(:additional_resource_params) { { app: app_model } }
244+
let(:headers) { admin_headers }
245+
end
246+
238247
context 'faceted search' do
239248
it 'filters by types' do
240249
VCAP::CloudController::PackageModel.make(app_guid: app_model.guid, type: VCAP::CloudController::PackageModel::BITS_TYPE)
@@ -349,6 +358,14 @@
349358
end
350359
end
351360

361+
it_behaves_like 'list_endpoint_with_common_filters' do
362+
let(:resource_klass) { VCAP::CloudController::PackageModel }
363+
let(:api_call) do
364+
lambda { |headers, filters| get "/v3/packages?#{filters}", nil, headers }
365+
end
366+
let(:headers) { admin_headers }
367+
end
368+
352369
it 'gets all the packages' do
353370
bits_package = VCAP::CloudController::PackageModel.make(type: bits_type, app_guid: app_model.guid)
354371
docker_package = VCAP::CloudController::PackageModel.make(

spec/request/processes_spec.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -910,6 +910,15 @@
910910
let!(:revision2) { VCAP::CloudController::RevisionModel.make }
911911
let!(:deployment_revision) { VCAP::CloudController::RevisionModel.make }
912912

913+
it_behaves_like 'list_endpoint_with_common_filters' do
914+
let(:resource_klass) { VCAP::CloudController::ProcessModel }
915+
let(:additional_resource_params) { { app: app_model } }
916+
let(:api_call) do
917+
lambda { |headers, filters| get "/v3/apps/#{app_model.guid}/processes?#{filters}", nil, headers }
918+
end
919+
let(:headers) { admin_headers }
920+
end
921+
913922
it 'returns a paginated list of processes for an app' do
914923
get "/v3/apps/#{app_model.guid}/processes?per_page=2", nil, developer_headers
915924

spec/request/roles_spec.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -924,6 +924,15 @@ def make_space_role_for_current_user(type)
924924
}
925925
end
926926

927+
it_behaves_like 'list_endpoint_with_common_filters' do
928+
let(:resource_klass) { VCAP::CloudController::SpaceAuditor }
929+
let(:additional_resource_params) { { user: user } }
930+
let(:api_call) do
931+
lambda { |headers, filters| get "/v3/roles?#{filters}", nil, headers }
932+
end
933+
let(:headers) { admin_headers }
934+
end
935+
927936
describe 'list query parameters' do
928937
before do
929938
allow(uaa_client).to receive(:users_for_ids).and_return([])

0 commit comments

Comments
 (0)