Allow all active users to retrieve list of keep nodes.
[arvados.git] / services / api / app / controllers / arvados / v1 / keep_disks_controller.rb
index f577c2b7b261e2c5061e56ba1cdf63b51ccda64e..2b9d5b5db2b7e168ec630bba891fba3bb102fdbf 100644 (file)
@@ -1,13 +1,44 @@
 class Arvados::V1::KeepDisksController < ApplicationController
-  skip_before_filter :login_required, :only => :ping
+  skip_before_filter :require_auth_scope_all, :only => :ping
 
   def self._ping_requires_parameters
-    { ping_secret: true, uuid: false }
+    {
+      uuid: false,
+      ping_secret: true,
+      ec2_instance_id: false,
+      local_ipv4: false,
+      filesystem_uuid: false,
+      service_port: true,
+      service_ssl_flag: true
+    }
   end
   def ping
-    @object.ping({ ip: params[:local_ipv4] || request.env['REMOTE_ADDR'],
-                   ping_secret: params[:ping_secret],
-                   ec2_instance_id: params[:instance_id] })
+    if !@object and params[:filesystem_uuid] and current_user and current_user.is_admin
+      if KeepDisk.where('filesystem_uuid=?', params[:filesystem_uuid]).empty?
+        @object = KeepDisk.new filesystem_uuid: params[:filesystem_uuid]
+        @object.save!
+        params[:ping_secret] = @object.ping_secret
+      else
+        raise "ping from keep_disk with existing filesystem_uuid #{params[:filesystem_uuid]} but wrong uuid #{params[:uuid]}"
+      end
+    end
+
+    if !@object
+      return render_not_found "object not found"
+    end
+
+    params.merge!(service_host:
+                  params[:local_ipv4] || request.env['REMOTE_ADDR'])
+    @object.ping params
     show
   end
+
+  def find_objects_for_index
+    if current_user.andand.is_admin || !current_user.andand.is_active
+      super
+    else
+      # active non-admin users can list all keep disks
+      @objects = model_class.all
+    end
+  end
 end