Merge branch '4088-collection-show-files-filter'
[arvados.git] / services / api / app / models / node.rb
index 119a0edeff2d2aae972f6f8a1ee712b65e631277..db39ab658d9b1ad7c3c9a2263349ea3e0cfa6869 100644 (file)
@@ -7,6 +7,12 @@ class Node < ArvadosModel
   before_validation :ensure_ping_secret
   after_update :dnsmasq_update
 
+  # Only a controller can figure out whether or not the current API tokens
+  # have access to the associated Job.  They're expected to set
+  # job_readable=true if the Job UUID can be included in the API response.
+  belongs_to(:job, foreign_key: :job_uuid, primary_key: :uuid)
+  attr_accessor :job_readable
+
   MAX_SLOTS = 64
 
   @@confdir = Rails.configuration.dnsmasq_conf_dir
@@ -20,6 +26,7 @@ class Node < ArvadosModel
     t.add :last_ping_at
     t.add :slot_number
     t.add :status
+    t.add :api_job_uuid, as: :job_uuid
     t.add :crunch_worker_state
     t.add :properties
   end
@@ -33,6 +40,10 @@ class Node < ArvadosModel
     super || @@domain
   end
 
+  def api_job_uuid
+    job_readable ? job_uuid : nil
+  end
+
   def crunch_worker_state
     return 'down' if slot_number.nil?
     case self.info.andand['slurm_state']
@@ -81,11 +92,6 @@ class Node < ArvadosModel
     if o[:ec2_instance_id]
       if !self.info['ec2_instance_id']
         self.info['ec2_instance_id'] = o[:ec2_instance_id]
-        if (Rails.configuration.compute_node_ec2_tag_enable rescue true)
-          tag_cmd = ("ec2-create-tags #{o[:ec2_instance_id]} " +
-                     "--tag 'Name=#{self.uuid}'")
-          `#{tag_cmd}`
-        end
       elsif self.info['ec2_instance_id'] != o[:ec2_instance_id]
         logger.debug "Multiple nodes have credentials for #{self.uuid}"
         raise "#{self.uuid} is already running at #{self.info['ec2_instance_id']} so rejecting ping from #{o[:ec2_instance_id]}"
@@ -106,11 +112,6 @@ class Node < ArvadosModel
         raise "No available node slots" if try_slot == MAX_SLOTS
       end while true
       self.hostname = self.class.hostname_for_slot(self.slot_number)
-      if info['ec2_instance_id']
-        if (Rails.configuration.compute_node_ec2_tag_enable rescue true)
-          `ec2-create-tags #{self.info['ec2_instance_id']} --tag 'hostname=#{self.hostname}'`
-        end
-      end
     end
 
     # Record other basic stats
@@ -125,50 +126,6 @@ class Node < ArvadosModel
     save!
   end
 
-  def start!(ping_url_method)
-    ensure_permission_to_save
-    ping_url = ping_url_method.call({ id: self.uuid, ping_secret: self.info['ping_secret'] })
-    if (Rails.configuration.compute_node_ec2run_args and
-        Rails.configuration.compute_node_ami)
-      ec2_args = ["--user-data '#{ping_url}'",
-                  "-t c1.xlarge -n 1",
-                  Rails.configuration.compute_node_ec2run_args,
-                  Rails.configuration.compute_node_ami
-                 ]
-      ec2run_cmd = ["ec2-run-instances",
-                    "--client-token", self.uuid,
-                    ec2_args].flatten.join(' ')
-      ec2spot_cmd = ["ec2-request-spot-instances",
-                     "-p #{Rails.configuration.compute_node_spot_bid} --type one-time",
-                     ec2_args].flatten.join(' ')
-    else
-      ec2run_cmd = ''
-      ec2spot_cmd = ''
-    end
-    self.info['ec2_run_command'] = ec2run_cmd
-    self.info['ec2_spot_command'] = ec2spot_cmd
-    self.info['ec2_start_command'] = ec2spot_cmd
-    logger.info "#{self.uuid} ec2_start_command= #{ec2spot_cmd.inspect}"
-    result = `#{ec2spot_cmd} 2>&1`
-    self.info['ec2_start_result'] = result
-    logger.info "#{self.uuid} ec2_start_result= #{result.inspect}"
-    result.match(/INSTANCE\s*(i-[0-9a-f]+)/) do |m|
-      instance_id = m[1]
-      self.info['ec2_instance_id'] = instance_id
-      if (Rails.configuration.compute_node_ec2_tag_enable rescue true)
-        `ec2-create-tags #{instance_id} --tag 'Name=#{self.uuid}'`
-      end
-    end
-    result.match(/SPOTINSTANCEREQUEST\s*(sir-[0-9a-f]+)/) do |m|
-      sir_id = m[1]
-      self.info['ec2_sir_id'] = sir_id
-      if (Rails.configuration.compute_node_ec2_tag_enable rescue true)
-        `ec2-create-tags #{sir_id} --tag 'Name=#{self.uuid}'`
-      end
-    end
-    self.save!
-  end
-
   protected
 
   def ensure_ping_secret