[ARVADOS] created: 8e56df8796bf822e6c5181d80715a3a217320696

Git user git at public.curoverse.com
Fri Nov 4 17:25:00 EDT 2016


        at  8e56df8796bf822e6c5181d80715a3a217320696 (commit)


commit 8e56df8796bf822e6c5181d80715a3a217320696
Author: Tom Clegg <tom at curoverse.com>
Date:   Fri Nov 4 17:24:36 2016 -0400

    10459: Remove old IP from DNS when a node changes its IP or hostname.

diff --git a/services/api/app/models/node.rb b/services/api/app/models/node.rb
index abb46fd..97ffcba 100644
--- a/services/api/app/models/node.rb
+++ b/services/api/app/models/node.rb
@@ -13,6 +13,8 @@ class Node < ArvadosModel
   belongs_to(:job, foreign_key: :job_uuid, primary_key: :uuid)
   attr_accessor :job_readable
 
+  UNUSED_NODE_IP = '127.40.4.0'
+
   api_accessible :user, :extend => :common do |t|
     t.add :hostname
     t.add :domain
@@ -133,6 +135,9 @@ class Node < ArvadosModel
   end
 
   def dns_server_update
+    if hostname_changed? && hostname_was
+      self.class.dns_server_update(hostname_was, UNUSED_NODE_IP)
+    end
     if self.hostname_changed? or self.ip_address_changed?
       if not self.ip_address.nil?
         stale_conflicting_nodes = Node.where('id != ? and ip_address = ? and last_ping_at < ?',self.id,self.ip_address,10.minutes.ago)
@@ -145,8 +150,8 @@ class Node < ArvadosModel
           end
         end
       end
-      if self.hostname and self.ip_address
-        self.class.dns_server_update(self.hostname, self.ip_address)
+      if hostname
+        self.class.dns_server_update(hostname, ip_address || UNUSED_NODE_IP)
       end
     end
   end
@@ -225,7 +230,7 @@ class Node < ArvadosModel
       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')
+          dns_server_update(hostname, UNUSED_NODE_IP)
         else
           dns_server_update(hostname, n.ip_address)
         end
diff --git a/services/api/test/fixtures/nodes.yml b/services/api/test/fixtures/nodes.yml
index 489bb1d..c5516cc 100644
--- a/services/api/test/fixtures/nodes.yml
+++ b/services/api/test/fixtures/nodes.yml
@@ -47,7 +47,7 @@ was_idle_now_down:
   hostname: compute3
   slot_number: ~
   domain: ""
-  ip_address: 172.17.2.173
+  ip_address: 172.17.2.174
   last_ping_at: <%= 1.hour.ago.to_s(:db) %>
   first_ping_at: <%= 23.hour.ago.to_s(:db) %>
   job_uuid: ~
@@ -62,7 +62,7 @@ new_with_no_hostname:
   owner_uuid: zzzzz-tpzed-000000000000000
   hostname: ~
   slot_number: ~
-  ip_address: 172.17.2.173
+  ip_address: 172.17.2.175
   last_ping_at: ~
   first_ping_at: ~
   job_uuid: ~
@@ -74,7 +74,7 @@ new_with_custom_hostname:
   owner_uuid: zzzzz-tpzed-000000000000000
   hostname: custom1
   slot_number: 23
-  ip_address: 172.17.2.173
+  ip_address: 172.17.2.176
   last_ping_at: ~
   first_ping_at: ~
   job_uuid: ~
diff --git a/services/api/test/unit/node_test.rb b/services/api/test/unit/node_test.rb
index e5b8835..6eb1df5 100644
--- a/services/api/test/unit/node_test.rb
+++ b/services/api/test/unit/node_test.rb
@@ -125,4 +125,31 @@ class NodeTest < ActiveSupport::TestCase
     refute_nil node2.slot_number
     assert_equal "custom1", node2.hostname
   end
+
+  test "update dns when nodemanager clears hostname and ip_address" do
+    act_as_system_user do
+      node = ping_node(:new_with_custom_hostname, {})
+      Node.expects(:dns_server_update).with(node.hostname, Node::UNUSED_NODE_IP)
+      node.update_attributes(hostname: nil, ip_address: nil)
+    end
+  end
+
+  test "update dns when hostname changes" do
+    act_as_system_user do
+      node = ping_node(:new_with_custom_hostname, {})
+
+      Node.expects(:dns_server_update).with(node.hostname, Node::UNUSED_NODE_IP)
+      Node.expects(:dns_server_update).with('foo0', node.ip_address)
+      node.update_attributes!(hostname: 'foo0')
+
+      Node.expects(:dns_server_update).with('foo0', Node::UNUSED_NODE_IP)
+      node.update_attributes!(hostname: nil, ip_address: nil)
+
+      Node.expects(:dns_server_update).with('foo0', '10.11.12.13')
+      node.update_attributes!(hostname: 'foo0', ip_address: '10.11.12.13')
+
+      Node.expects(:dns_server_update).with('foo0', '10.11.12.14')
+      node.update_attributes!(hostname: 'foo0', ip_address: '10.11.12.14')
+    end
+  end
 end

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


hooks/post-receive
-- 




More information about the arvados-commits mailing list