From: Peter Amstutz Date: Thu, 13 Oct 2016 21:01:21 +0000 (-0400) Subject: 10172: Implement /containers/current endpoint to get current container for API token. X-Git-Tag: 1.1.0~637^2~12 X-Git-Url: https://git.arvados.org/arvados.git/commitdiff_plain/b1158db281c2107b191ddd41dd6b20f32ff04940 10172: Implement /containers/current endpoint to get current container for API token. --- diff --git a/services/api/app/controllers/arvados/v1/containers_controller.rb b/services/api/app/controllers/arvados/v1/containers_controller.rb index fb748e9350..3495459ec3 100644 --- a/services/api/app/controllers/arvados/v1/containers_controller.rb +++ b/services/api/app/controllers/arvados/v1/containers_controller.rb @@ -4,6 +4,8 @@ class Arvados::V1::ContainersController < ApplicationController accept_attribute_as_json :runtime_constraints, Hash accept_attribute_as_json :command, Array + skip_before_filter :render_404_if_no_object, only: [:current] + def auth if @object.locked_by_uuid != Thread.current[:api_client_authorization].uuid raise ArvadosModel::PermissionDeniedError.new("Not locked by your token") @@ -29,4 +31,18 @@ class Arvados::V1::ContainersController < ApplicationController @object.unlock show end + + def current + if Thread.current[:api_client_authorization].nil? + send_error("Not logged in", status: 401) + else + c = Container.where(auth_uuid: Thread.current[:api_client_authorization].uuid).first + if c.nil? + send_error("Token is not associated with a container.", status: 404) + else + @object = c + show + end + end + end end diff --git a/services/api/config/routes.rb b/services/api/config/routes.rb index 3638c726e9..f28390489d 100644 --- a/services/api/config/routes.rb +++ b/services/api/config/routes.rb @@ -33,6 +33,7 @@ Server::Application.routes.draw do get 'auth', on: :member post 'lock', on: :member post 'unlock', on: :member + get 'current', on: :collection end resources :container_requests resources :jobs do diff --git a/services/api/test/fixtures/api_client_authorizations.yml b/services/api/test/fixtures/api_client_authorizations.yml index de14838186..7af4f37ad4 100644 --- a/services/api/test/fixtures/api_client_authorizations.yml +++ b/services/api/test/fixtures/api_client_authorizations.yml @@ -284,3 +284,10 @@ dispatch1: user: system_user api_token: kwi8oowusvbutahacwk2geulqewy5oaqmpalczfna4b6bb0hfw expires_at: 2038-01-01 00:00:00 + +running_container_auth: + uuid: zzzzz-gj3su-077z32aux8dg2s2 + api_client: untrusted + user: active + api_token: 3kg6k6lzmp9kj6bpkcoxie963cmvjahbt2fod9zru30k1jqdmi + expires_at: 2038-01-01 00:00:00 diff --git a/services/api/test/fixtures/containers.yml b/services/api/test/fixtures/containers.yml index 29266d3ab8..d1f4c7bdc8 100644 --- a/services/api/test/fixtures/containers.yml +++ b/services/api/test/fixtures/containers.yml @@ -28,7 +28,7 @@ running: runtime_constraints: ram: 12000000000 vcpus: 4 - auth_uuid: zzzzz-gj3su-077z32aux8dg2s1 + auth_uuid: zzzzz-gj3su-077z32aux8dg2s2 running_older: uuid: zzzzz-dz642-runningcontain2 @@ -133,7 +133,7 @@ requester_container: runtime_constraints: ram: 12000000000 vcpus: 4 - auth_uuid: zzzzz-gj3su-077z32aux8dg2s1 + auth_uuid: zzzzz-gj3su-077z32aux8dg2s3 failed_container: uuid: zzzzz-dz642-failedcontainr1 diff --git a/services/api/test/functional/arvados/v1/containers_controller_test.rb b/services/api/test/functional/arvados/v1/containers_controller_test.rb index cf1f5765b4..d923e01301 100644 --- a/services/api/test/functional/arvados/v1/containers_controller_test.rb +++ b/services/api/test/functional/arvados/v1/containers_controller_test.rb @@ -87,4 +87,24 @@ class Arvados::V1::ContainersControllerTest < ActionController::TestCase assert_equal state, Container.where(uuid: uuid).first.state end end + + test 'get current container for token' do + authorize_with :running_container_auth + c = Container.where(auth_uuid: Thread.current[:api_client_authorization].uuid).first + get :current + assert_response :success + assert_equal containers(:running).uuid, json_response['uuid'] + end + + test 'no container associated with token' do + authorize_with :dispatch1 + get :current + assert_response 404 + end + + test 'try get current container, no token' do + get :current + assert_response 401 + end + end