Merge branch '6362-asset-config' refs #6362
[arvados.git] / services / api / app / controllers / arvados / v1 / virtual_machines_controller.rb
1 class Arvados::V1::VirtualMachinesController < ApplicationController
2   skip_before_filter :find_object_by_uuid, :only => :get_all_logins
3   skip_before_filter :render_404_if_no_object, :only => :get_all_logins
4   before_filter(:admin_required,
5                 :only => [:logins, :get_all_logins])
6
7   def logins
8     get_all_logins
9   end
10
11   def get_all_logins
12     @response = []
13     @vms = VirtualMachine.eager_load :login_permissions
14     if @object
15       @vms = @vms.where uuid: @object.uuid
16     else
17       @vms = @vms.all
18     end
19     @users = {}
20     User.eager_load(:authorized_keys).
21       where('users.uuid in (?)',
22             @vms.map { |vm| vm.login_permissions.map &:tail_uuid }.flatten.uniq).
23       each do |u|
24       @users[u.uuid] = u
25     end
26     @vms.each do |vm|
27       vm.login_permissions.each do |perm|
28         user_uuid = perm.tail_uuid
29         next if not @users[user_uuid]
30         next if perm.properties['username'].blank?
31         aks = @users[user_uuid].authorized_keys
32         if aks.empty?
33           # We'll emit one entry, with no public key.
34           aks = [nil]
35         end
36         aks.each do |ak|
37           @response << {
38             username: perm.properties['username'],
39             hostname: vm.hostname,
40             groups: (perm.properties['groups'].to_a rescue []),
41             public_key: ak ? ak.public_key : nil,
42             user_uuid: user_uuid,
43             virtual_machine_uuid: vm.uuid,
44             authorized_key_uuid: ak ? ak.uuid : nil,
45           }
46         end
47       end
48     end
49     send_json kind: "arvados#HashList", items: @response
50   end
51 end