use spot instances for compute nodes
authorTom Clegg <tom@clinicalfuture.com>
Wed, 13 Mar 2013 16:10:40 +0000 (09:10 -0700)
committerTom Clegg <tom@clinicalfuture.com>
Wed, 13 Mar 2013 16:10:40 +0000 (09:10 -0700)
app/models/node.rb
config/environments/development.rb.example
config/environments/production.rb
config/environments/test.rb

index c10e076ef0fbcb64fde69cf3bf13378d14ceebca..853b2712c7ac2c2d54d3fbc9e879c65ddf97015b 100644 (file)
@@ -101,15 +101,22 @@ class Node < OrvosModel
   def start!(ping_url_method)
     ensure_permission_to_update
     ping_url = ping_url_method.call({ uuid: self.uuid, ping_secret: self.info[:ping_secret] })
-    cmd = ["ec2-run-instances",
-           "--user-data '#{ping_url}'",
-           "-t c1.xlarge -n 1 -g orvos-compute",
-           "--client-token", self.uuid,
-           Rails.configuration.compute_node_ami
-          ].join(' ')
-    self.info[:ec2_start_command] = cmd
-    logger.info "#{self.uuid} ec2_start_command= #{cmd.inspect}"
-    result = `#{cmd} 2>&1`
+    ec2_args = ["--user-data '#{ping_url}'",
+                "-t c1.xlarge -n 1",
+                "-g", Rails.configuration.compute_node_security_group,
+                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(' ')
+    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|
@@ -117,6 +124,11 @@ class Node < OrvosModel
       self.info[:ec2_instance_id] = instance_id
       `ec2-create-tags #{instance_id} --tag 'Name=#{self.uuid}'`
     end
+    result.match(/SPOTINSTANCEREQUEST\s*(sir-[0-9a-f]+)/) do |m|
+      sir_id = m[1]
+      self.info[:ec2_sir_id] = sir_id
+      `ec2-create-tags #{sir_id} --tag 'Name=#{self.uuid}'`
+    end
     self.save!
   end
 
index 4b46ff92aaefd256a81594e74c7c90845d7d025a..44927a7dbbb994ea1f7b2244fd02d72f82462178 100644 (file)
@@ -33,6 +33,8 @@ Server::Application.configure do
   # config.dnsmasq_conf_dir = '/etc/dnsmasq.d'
 
   # config.compute_node_ami = 'ami-cbca41a2'
+  # config.compute_node_security_group = 'orvos-compute'
+  # config.compute_node_spot_bid = 0.11
 
   # config.compute_node_domain = `hostname --domain`.strip
 
index a1f2a1d7c27df18f79af43f222da2b86e24c7f5c..004c5ed66103d92662b0ba6ae48445ca0b580886 100644 (file)
@@ -61,6 +61,8 @@ Server::Application.configure do
   # config.dnsmasq_conf_dir = '/etc/dnsmasq.d'
 
   # config.compute_node_ami = 'ami-cbca41a2'
+  # config.compute_node_security_group = 'orvos-compute'
+  # config.compute_node_spot_bid = 0.11
 
   # config.compute_node_domain = `hostname --domain`.strip
 
index a97ff78c5406b2582bdf31d056e5a9a520ba72c0..b68f3d4247ec1c535ab3acdc1e2fd257363ea622 100644 (file)
@@ -40,6 +40,8 @@ Server::Application.configure do
   # config.dnsmasq_conf_dir = '/etc/dnsmasq.d'
 
   # config.compute_node_ami = 'ami-cbca41a2'
+  # config.compute_node_security_group = 'orvos-compute'
+  # config.compute_node_spot_bid = 0.11
 
   # config.compute_node_domain = `hostname --domain`.strip