Merge branch '8784-dir-listings'
[arvados.git] / services / api / app / controllers / arvados / v1 / containers_controller.rb
1 # Copyright (C) The Arvados Authors. All rights reserved.
2 #
3 # SPDX-License-Identifier: AGPL-3.0
4
5 class Arvados::V1::ContainersController < ApplicationController
6   accept_attribute_as_json :environment, Hash
7   accept_attribute_as_json :mounts, Hash
8   accept_attribute_as_json :runtime_constraints, Hash
9   accept_attribute_as_json :command, Array
10   accept_attribute_as_json :scheduling_parameters, Hash
11
12   skip_before_filter :find_object_by_uuid, only: [:current]
13   skip_before_filter :render_404_if_no_object, only: [:current]
14
15   def auth
16     if @object.locked_by_uuid != Thread.current[:api_client_authorization].uuid
17       raise ArvadosModel::PermissionDeniedError.new("Not locked by your token")
18     end
19     @object = @object.auth
20     show
21   end
22
23   # Updates use row locking to resolve races between multiple
24   # dispatchers trying to lock the same container.
25   def update
26     @object.with_lock do
27       super
28     end
29   end
30
31   def find_objects_for_index
32     super
33     if action_name == 'lock' || action_name == 'unlock'
34       # Avoid loading more fields than we need
35       @objects = @objects.select(:id, :uuid, :state, :priority, :auth_uuid, :locked_by_uuid)
36       @select = %w(uuid state priority auth_uuid locked_by_uuid)
37     end
38   end
39
40   def lock
41     @object.lock
42     show
43   end
44
45   def unlock
46     @object.unlock
47     show
48   end
49
50   def current
51     if Thread.current[:api_client_authorization].nil?
52       send_error("Not logged in", status: 401)
53     else
54       c = Container.where(auth_uuid: Thread.current[:api_client_authorization].uuid).first
55       if c.nil?
56         send_error("Token is not associated with a container.", status: 404)
57       else
58         @object = c
59         show
60       end
61     end
62   end
63 end