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

Commit 7c556d6

Browse files
reidmitbelinda-liu
andcommitted
v3: Add permissions endpoint for apps
`GET /v3/apps/:guid/permissions` [Finishes #169770887] Co-authored-by: Reid Mitchell <rmitchell@pivotal.io> Co-authored-by: Belinda Liu <bliu@pivotal.io>
1 parent 8385fee commit 7c556d6

3 files changed

Lines changed: 100 additions & 5 deletions

File tree

app/controllers/v3/apps_controller.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,17 @@ def current_droplet
322322
render status: :ok, json: Presenters::V3::DropletPresenter.new(droplet)
323323
end
324324

325+
def show_permissions
326+
app, space, org = AppFetcher.new.fetch(hashed_params[:guid])
327+
328+
app_not_found! unless app && permission_queryer.can_read_from_space?(space.guid, org.guid)
329+
330+
render status: :ok, json: {
331+
read_basic_data: true,
332+
read_sensitive_data: permission_queryer.can_read_secrets_globally?,
333+
}
334+
end
335+
325336
class DeleteAppErrorTranslatorJob < VCAP::CloudController::Jobs::ErrorTranslatorJob
326337
include V3ErrorsHelper
327338

config/routes.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
post '/apps/:guid/actions/stop', to: 'apps_v3#stop'
1515
post '/apps/:guid/actions/restart', to: 'apps_v3#restart'
1616
get '/apps/:guid/env', to: 'apps_v3#show_env'
17+
get '/apps/:guid/permissions', to: 'apps_v3#show_permissions'
1718
get '/apps/:guid/builds', to: 'apps_v3#builds'
1819
patch '/apps/:guid/relationships/current_droplet', to: 'apps_v3#assign_current_droplet'
1920
get '/apps/:guid/relationships/current_droplet', to: 'apps_v3#current_droplet_relationship'

spec/request/apps_spec.rb

Lines changed: 88 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,6 @@
1212
let(:user_email) { Sham.email }
1313
let(:user_name) { 'some-username' }
1414

15-
before do
16-
space.organization.add_user(user)
17-
space.add_developer(user)
18-
end
19-
2015
describe 'POST /v3/apps' do
2116
let(:buildpack) { VCAP::CloudController::Buildpack.make(stack: stack.name) }
2217
let(:create_request) do
@@ -50,6 +45,11 @@
5045
}
5146
end
5247

48+
before do
49+
space.organization.add_user(user)
50+
space.add_developer(user)
51+
end
52+
5353
it 'creates an app' do
5454
post '/v3/apps', create_request.to_json, user_header
5555
expect(last_response.status).to eq(201)
@@ -353,6 +353,11 @@
353353
end
354354

355355
describe 'GET /v3/apps' do
356+
before do
357+
space.organization.add_user(user)
358+
space.add_developer(user)
359+
end
360+
356361
describe 'query list parameters' do
357362
it_behaves_like 'request_spec_shared_examples.rb list query endpoint' do
358363
let(:request) { 'v3/apps' }
@@ -1062,6 +1067,8 @@
10621067
}
10631068

10641069
before do
1070+
space.organization.add_user(user)
1071+
space.add_developer(user)
10651072
app_model.lifecycle_data.buildpacks = [buildpack.name]
10661073
app_model.lifecycle_data.stack = stack.name
10671074
app_model.lifecycle_data.save
@@ -1236,6 +1243,11 @@
12361243
end
12371244

12381245
describe 'GET /v3/apps/:guid/env' do
1246+
before do
1247+
space.organization.add_user(user)
1248+
space.add_developer(user)
1249+
end
1250+
12391251
it 'returns the environment of the app, including environment variables provided by the system' do
12401252
app_model = VCAP::CloudController::AppModel.make(
12411253
name: 'my_app',
@@ -1363,6 +1375,8 @@
13631375
let(:order_by) { '-created_at' }
13641376

13651377
before do
1378+
space.organization.add_user(user)
1379+
space.add_developer(user)
13661380
VCAP::CloudController::BuildpackLifecycle.new(package, staging_message).create_lifecycle_data_model(build)
13671381
VCAP::CloudController::BuildpackLifecycle.new(package, staging_message).create_lifecycle_data_model(second_build)
13681382
build.update(state: droplet.state, error_description: droplet.error_description)
@@ -1464,6 +1478,8 @@
14641478
let(:kpack_client) { instance_double(Kubernetes::KpackClient, delete_image: nil) }
14651479

14661480
before do
1481+
space.organization.add_user(user)
1482+
space.add_developer(user)
14671483
allow(CloudController::DependencyLocator.instance).to receive(:kpack_client).and_return(kpack_client)
14681484
end
14691485

@@ -1543,6 +1559,9 @@
15431559
end
15441560

15451561
before do
1562+
space.organization.add_user(user)
1563+
space.add_developer(user)
1564+
15461565
VCAP::CloudController::AppLabelModel.make(
15471566
resource_guid: app_model.guid,
15481567
key_name: 'delete-me',
@@ -1686,6 +1705,12 @@
16861705
desired_state: 'STOPPED',
16871706
)
16881707
}
1708+
1709+
before do
1710+
space.organization.add_user(user)
1711+
space.add_developer(user)
1712+
end
1713+
16891714
it 'starts the app' do
16901715
app_model.lifecycle_data.buildpacks = ['http://example.com/git']
16911716
app_model.lifecycle_data.stack = stack.name
@@ -1888,6 +1913,8 @@
18881913
end
18891914

18901915
before do
1916+
space.organization.add_user(user)
1917+
space.add_developer(user)
18911918
app_model.lifecycle_data.buildpacks = ['http://example.com/git']
18921919
app_model.lifecycle_data.stack = stack.name
18931920
app_model.lifecycle_data.save
@@ -1985,6 +2012,11 @@
19852012
)
19862013
}
19872014

2015+
before do
2016+
space.organization.add_user(user)
2017+
space.add_developer(user)
2018+
end
2019+
19882020
context 'app lifecycle is buildpack' do
19892021
let!(:droplet) do
19902022
VCAP::CloudController::DropletModel.make(
@@ -2147,6 +2179,8 @@
21472179
let(:app_guid) { droplet_model.app_guid }
21482180

21492181
before do
2182+
space.organization.add_user(user)
2183+
space.add_developer(user)
21502184
droplet_model.buildpack_lifecycle_data.update(buildpacks: ['http://buildpack.git.url.com'], stack: 'stack-name')
21512185
app_model.droplet_guid = droplet_model.guid
21522186
app_model.save
@@ -2190,6 +2224,8 @@
21902224
let(:app_guid) { droplet_model.app_guid }
21912225

21922226
before do
2227+
space.organization.add_user(user)
2228+
space.add_developer(user)
21932229
droplet_model.buildpack_lifecycle_data.update(buildpacks: ['http://buildpack.git.url.com'], stack: 'stack-name')
21942230
app_model.droplet_guid = droplet_model.guid
21952231
app_model.save
@@ -2247,6 +2283,8 @@
22472283
end
22482284

22492285
before do
2286+
space.organization.add_user(user)
2287+
space.add_developer(user)
22502288
app_model.lifecycle_data.buildpacks = ['http://example.com/git']
22512289
app_model.lifecycle_data.stack = stack.name
22522290
app_model.lifecycle_data.save
@@ -2418,6 +2456,11 @@
24182456
end
24192457

24202458
describe 'PATCH /v3/apps/:guid/environment_variables' do
2459+
before do
2460+
space.organization.add_user(user)
2461+
space.add_developer(user)
2462+
end
2463+
24212464
it 'patches the environment variables for the app' do
24222465
app_model = VCAP::CloudController::AppModel.make(
24232466
name: 'name1',
@@ -2457,6 +2500,11 @@
24572500
end
24582501

24592502
describe 'GET /v3/apps/:guid/environment_variables' do
2503+
before do
2504+
space.organization.add_user(user)
2505+
space.add_developer(user)
2506+
end
2507+
24602508
it 'gets the environment variables for the app' do
24612509
app_model = VCAP::CloudController::AppModel.make(name: 'name1', space: space, desired_state: 'STOPPED', environment_variables: { meep: 'moop' })
24622510

@@ -2477,4 +2525,39 @@
24772525
)
24782526
end
24792527
end
2528+
2529+
describe 'GET /v3/apps/:guid/permissions' do
2530+
let(:org) { VCAP::CloudController::Organization.make }
2531+
let(:space) { VCAP::CloudController::Space.make(organization: org) }
2532+
let(:app_model) { VCAP::CloudController::AppModel.make(name: 'name1', space: space, desired_state: 'STOPPED') }
2533+
let(:api_call) { lambda { |user_headers| get "/v3/apps/#{app_model.guid}/permissions", nil, user_headers } }
2534+
2535+
let(:read_all_response) do
2536+
{
2537+
"read_basic_data": true,
2538+
"read_sensitive_data": true
2539+
}
2540+
end
2541+
2542+
let(:read_basic_response) do
2543+
{
2544+
"read_basic_data": true,
2545+
"read_sensitive_data": false
2546+
}
2547+
end
2548+
2549+
let(:expected_codes_and_responses) do
2550+
h = Hash.new(code: 404)
2551+
h['admin'] = { code: 200, response_object: read_all_response }
2552+
h['admin_read_only'] = { code: 200, response_object: read_all_response }
2553+
h['global_auditor'] = { code: 200, response_object: read_basic_response }
2554+
h['org_manager'] = { code: 200, response_object: read_basic_response }
2555+
h['space_manager'] = { code: 200, response_object: read_basic_response }
2556+
h['space_auditor'] = { code: 200, response_object: read_basic_response }
2557+
h['space_developer'] = { code: 200, response_object: read_basic_response }
2558+
h.freeze
2559+
end
2560+
2561+
it_behaves_like 'permissions for single object endpoint', ALL_PERMISSIONS
2562+
end
24802563
end

0 commit comments

Comments
 (0)