X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/ef7a1b6d614a2a6825acea9418d1d701f0681d47..de298e4e20a7ed07e16ed3cac87a18a66c0ceb83:/services/api/app/controllers/arvados/v1/keep_disks_controller.rb diff --git a/services/api/app/controllers/arvados/v1/keep_disks_controller.rb b/services/api/app/controllers/arvados/v1/keep_disks_controller.rb index f577c2b7b2..3d9191641e 100644 --- a/services/api/app/controllers/arvados/v1/keep_disks_controller.rb +++ b/services/api/app/controllers/arvados/v1/keep_disks_controller.rb @@ -1,13 +1,50 @@ 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, + node_uuid: false, + filesystem_uuid: false, + service_host: 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] }) - show + params[:service_host] ||= request.env['REMOTE_ADDR'] + act_as_system_user do + if not @object.ping params + return render_not_found "object not found" + end + # Render the :superuser view (i.e., include the ping_secret) even + # if !current_user.is_admin. This is safe because @object.ping's + # success implies the ping_secret was already known by the client. + render json: @object.as_api_response(:superuser) + end + end + + def find_objects_for_index + # all users can list all keep disks + @objects = model_class.where('1=1') + super + end + + def find_object_by_uuid + @object = KeepDisk.where(uuid: (params[:id] || params[:uuid])).first + if !@object && current_user.andand.is_admin + # Create a new KeepDisk and ping it. + @object = KeepDisk.new(filesystem_uuid: params[:filesystem_uuid]) + @object.save! + + # In the first ping from this new filesystem_uuid, we can't + # expect the keep node to know the ping_secret so we made sure + # we got an admin token. Here we add ping_secret to params so + # KeepNode.ping() understands this update is properly + # authenticated. + params[:ping_secret] = @object.ping_secret + end end end