[ARVADOS] updated: 451a6d3590ed7c049ad6ce24f8f6c01685d7d3d3

git at public.curoverse.com git at public.curoverse.com
Tue Jun 16 11:33:49 EDT 2015


Summary of changes:
 services/api/app/models/node.rb             | 39 +++++++++++++-----
 services/api/config/application.default.yml | 18 +++++++++
 services/api/test/fixtures/nodes.yml        | 24 +++++++++++
 services/api/test/unit/node_test.rb         | 62 +++++++++++++++++++++++++++++
 4 files changed, 133 insertions(+), 10 deletions(-)

       via  451a6d3590ed7c049ad6ce24f8f6c01685d7d3d3 (commit)
      from  912d5c4e0b616d9e18332b33a05395e3f6eb77b9 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.


commit 451a6d3590ed7c049ad6ce24f8f6c01685d7d3d3
Author: radhika <radhika at curoverse.com>
Date:   Tue Jun 16 11:32:55 2015 -0400

    6156: support config format for setting a node's hostname

diff --git a/services/api/app/models/node.rb b/services/api/app/models/node.rb
index 1cd6387..0ec9136 100644
--- a/services/api/app/models/node.rb
+++ b/services/api/app/models/node.rb
@@ -94,7 +94,7 @@ class Node < ArvadosModel
       end
     end
 
-    # Assign hostname
+    # Assign slot_number
     if self.slot_number.nil?
       try_slot = 0
       begin
@@ -107,6 +107,10 @@ class Node < ArvadosModel
         end
         raise "No available node slots" if try_slot == Rails.configuration.max_compute_nodes
       end while true
+    end
+
+    # Assign hostname
+    if self.hostname.nil? and Rails.configuration.assign_node_hostname
       self.hostname = self.class.hostname_for_slot(self.slot_number)
     end
 
@@ -205,21 +209,36 @@ class Node < ArvadosModel
   end
 
   def self.hostname_for_slot(slot_number)
-    "compute#{slot_number}"
+    config = Rails.configuration.assign_node_hostname
+
+    return nil if !config
+
+    begin
+      if config.include?('%')
+        sprintf(config, {:slot_number => slot_number})
+      else
+        eval('"' + config + '"')
+      end
+    rescue => e
+      logger.error "Eror generating hostname: #{e.message}"
+      return nil
+    end
   end
 
   # At startup, make sure all DNS entries exist.  Otherwise, slurmctld
   # will refuse to start.
   if Rails.configuration.dns_server_conf_dir and Rails.configuration.dns_server_conf_template
     (0..Rails.configuration.max_compute_nodes-1).each do |slot_number|
-      hostname = hostname_for_slot(slot_number)
-      hostfile = File.join Rails.configuration.dns_server_conf_dir, "#{hostname}.conf"
-      if !File.exists? hostfile
-        n = Node.where(:slot_number => slot_number).first
-        if n.nil? or n.ip_address.nil?
-          dns_server_update(hostname, '127.40.4.0')
-        else
-          dns_server_update(hostname, n.ip_address)
+      if Rails.configuration.assign_node_hostname
+        hostname = hostname_for_slot(slot_number)
+        hostfile = File.join Rails.configuration.dns_server_conf_dir, "#{hostname}.conf"
+        if !File.exists? hostfile
+          n = Node.where(:slot_number => slot_number).first
+          if n.nil? or n.ip_address.nil?
+            dns_server_update(hostname, '127.40.4.0')
+          else
+            dns_server_update(hostname, n.ip_address)
+          end
         end
       end
     end
diff --git a/services/api/config/application.default.yml b/services/api/config/application.default.yml
index 5488003..8f3207a 100644
--- a/services/api/config/application.default.yml
+++ b/services/api/config/application.default.yml
@@ -329,3 +329,21 @@ common:
 
   # Docker image to be used when none found in runtime_constraints of a job
   default_docker_image_for_jobs: false
+
+  # Hostname to assign to a compute node when it sends a "ping" and the
+  # hostname in its Node record is nil.
+  # During bootstrapping, the "ping" script is expected to notice the
+  # hostname given in the ping response, and update its unix hostname
+  # accordingly.
+  # If false, leave the hostname alone (this is appropriate if your compute
+  # nodes' hostnames are already assigned by some other mechanism).
+  #
+  # One way or another, the hostnames of your node records should agree
+  # with your DNS records and your /etc/slurm-llnl/slurm.conf files.
+  #
+  # Example for compute0000, compute0001, ....:
+  # assign_node_hostname: compute#{slot_number.to_s.rjust(4, "0")}
+  # or
+  # assign_node_hostname: compute%<slot_number>04d
+  # (See http://ruby-doc.org/core-2.2.2/Kernel.html#method-i-format for more.)
+  assign_node_hostname: compute#{slot_number}
diff --git a/services/api/test/fixtures/nodes.yml b/services/api/test/fixtures/nodes.yml
index 1511501..6ca22e1 100644
--- a/services/api/test/fixtures/nodes.yml
+++ b/services/api/test/fixtures/nodes.yml
@@ -54,3 +54,27 @@ was_idle_now_down:
     ping_secret: "1bd1yi0x4lb5q4gzqqtrnq30oyj08r8dtdimmanbqw49z1anz2"
     slurm_state: "idle"
     total_cpu_cores: 16
+
+new_with_no_hostname:
+  uuid: zzzzz-7ekkf-newnohostname00
+  owner_uuid: zzzzz-tpzed-000000000000000
+  hostname: ~
+  slot_number: ~
+  ip_address: 172.17.2.173
+  last_ping_at: ~
+  first_ping_at: ~
+  job_uuid: ~
+  info:
+    ping_secret: "abcdyi0x4lb5q4gzqqtrnq30oyj08r8dtdimmanbqw49z1anz2"
+
+new_with_custom_hostname:
+  uuid: zzzzz-7ekkf-newwithhostname
+  owner_uuid: zzzzz-tpzed-000000000000000
+  hostname: custom1
+  slot_number: 23
+  ip_address: 172.17.2.173
+  last_ping_at: ~
+  first_ping_at: ~
+  job_uuid: ~
+  info:
+    ping_secret: "abcdyi0x4lb5q4gzqqtrnq30oyj08r8dtdimmanbqw49z1anz2"
diff --git a/services/api/test/unit/node_test.rb b/services/api/test/unit/node_test.rb
index 98e260b..96d31a8 100644
--- a/services/api/test/unit/node_test.rb
+++ b/services/api/test/unit/node_test.rb
@@ -75,4 +75,66 @@ class NodeTest < ActiveSupport::TestCase
     Rails.configuration.dns_server_reload_command = 'ignored!'
     assert Node.dns_server_update 'compute65535', '127.0.0.127'
   end
+
+  test "ping new node with no hostname and default config" do
+    node = ping_node(:new_with_no_hostname, {})
+    slot_number = node.slot_number
+    refute_nil slot_number
+    assert_equal("compute#{slot_number}", node.hostname)
+  end
+
+  test "ping new node with no hostname and no config" do
+    Rails.configuration.assign_node_hostname = false
+    node = ping_node(:new_with_no_hostname, {})
+    refute_nil node.slot_number
+    assert_nil node.hostname
+  end
+
+  [
+    'compute#{slot_number.to_s.rjust(4, "0")}',
+    'compute%<slot_number>04d',
+  ].each do |config|
+    test "ping new node with zero padding config #{config}" do
+      Rails.configuration.assign_node_hostname = config
+      node = ping_node(:new_with_no_hostname, {})
+      slot_number = node.slot_number
+      refute_nil slot_number
+      assert_equal("compute000#{slot_number}", node.hostname)
+    end
+  end
+
+  test "ping node with hostname and config and expect hostname unchanged" do
+    node = ping_node(:new_with_custom_hostname, {})
+    assert_equal(23, node.slot_number)
+    assert_equal("custom1", node.hostname)
+  end
+
+  test "ping node with hostname and no config and expect hostname unchanged" do
+    Rails.configuration.assign_node_hostname = false
+    node = ping_node(:new_with_custom_hostname, {})
+    assert_equal(23, node.slot_number)
+    assert_equal("custom1", node.hostname)
+  end
+
+  # Ping two nodes: one with no hostname and the other with a hostname.
+  # Verify that the first one gets a hostname and second one is unchanged.
+  test "ping two nodes one with no hostname and one with hostname and check hostnames" do
+    # ping node with no hostname and expect it set with config format
+    node = ping_node(:new_with_no_hostname, {})
+    slot_number = node.slot_number
+    refute_nil node.slot_number
+    assert_equal "compute#{slot_number}", node.hostname
+
+    # ping node with a hostname and expect it to be unchanged
+    node2 = ping_node(:new_with_custom_hostname, {})
+    refute_nil node2.slot_number
+    assert_equal "custom1", node2.hostname
+  end
+
+  test "ping node with no hostname and malformed config and expect nil for hostname" do
+    Rails.configuration.assign_node_hostname = 'compute%<slot_number>04'  # should end with "04d"
+    node = ping_node(:new_with_no_hostname, {})
+    refute_nil node.slot_number
+    assert_equal(nil, node.hostname)
+  end
 end

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list