[ARVADOS] updated: 7395af3b19b8fc422fe2456c6bead1e7f4c60989
git at public.curoverse.com
git at public.curoverse.com
Sun Nov 16 13:55:21 EST 2014
Summary of changes:
services/api/app/models/node.rb | 55 ++++++++++++++++++++---------
services/api/config/application.default.yml | 17 +++++++--
services/api/config/unbound.template | 4 +++
services/api/script/restart-dns-server | 34 ++++++++++++++++++
services/api/script/restart-dnsmasq | 21 -----------
5 files changed, 91 insertions(+), 40 deletions(-)
create mode 100644 services/api/config/unbound.template
create mode 100755 services/api/script/restart-dns-server
delete mode 100755 services/api/script/restart-dnsmasq
via 7395af3b19b8fc422fe2456c6bead1e7f4c60989 (commit)
from a75ef0985d2a385165168cbb488cf97382308549 (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 7395af3b19b8fc422fe2456c6bead1e7f4c60989
Author: Ward Vandewege <ward at curoverse.com>
Date: Sun Nov 16 13:54:47 2014 -0500
Make our dynamic dns update system for compute nodes more generic.
refs #4461
diff --git a/services/api/app/models/node.rb b/services/api/app/models/node.rb
index db39ab6..40b78e9 100644
--- a/services/api/app/models/node.rb
+++ b/services/api/app/models/node.rb
@@ -5,7 +5,7 @@ class Node < ArvadosModel
serialize :info, Hash
serialize :properties, Hash
before_validation :ensure_ping_secret
- after_update :dnsmasq_update
+ after_update :dns_server_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
@@ -15,7 +15,10 @@ class Node < ArvadosModel
MAX_SLOTS = 64
- @@confdir = Rails.configuration.dnsmasq_conf_dir
+ @@dns_server_conf_dir = Rails.configuration.dns_server_conf_dir
+ @@dns_server_conf_template = Rails.configuration.dns_server_conf_template
+ @@dns_server_reload_command = Rails.configuration.dns_server_reload_command
+ @@uuid_prefix = Rails.configuration.uuid_prefix
@@domain = Rails.configuration.compute_node_domain rescue `hostname --domain`.strip
@@nameservers = Rails.configuration.compute_node_nameservers
@@ -132,26 +135,44 @@ class Node < ArvadosModel
self.info['ping_secret'] ||= rand(2**256).to_s(36)
end
- def dnsmasq_update
+ def dns_server_update
if self.hostname_changed? or self.ip_address_changed?
if self.hostname and self.ip_address
- self.class.dnsmasq_update(self.hostname, self.ip_address)
+ self.class.dns_server_update(self.hostname, self.ip_address)
end
end
end
- def self.dnsmasq_update(hostname, ip_address)
- return unless @@confdir
+ def self.dns_server_update(hostname, ip_address)
+ return unless @@dns_server_conf_dir and @@dns_server_conf_template
ptr_domain = ip_address.
split('.').reverse.join('.').concat('.in-addr.arpa')
- hostfile = File.join @@confdir, hostname
- File.open hostfile, 'w' do |f|
- f.puts "address=/#{hostname}/#{ip_address}"
- f.puts "address=/#{hostname}.#{@@domain}/#{ip_address}" if @@domain
- f.puts "ptr-record=#{ptr_domain},#{hostname}"
+ hostfile = File.join @@dns_server_conf_dir, "#{hostname}.conf"
+
+ begin
+ template = IO.read(@@dns_server_conf_template)
+ rescue => e
+ STDERR.puts "Unable to read dns_server_conf_template #{@@dns_server_conf_template}: #{e.message}"
+ return
+ end
+
+ populated = template % {hostname:hostname, uuid_prefix:@@uuid_prefix, ip_address:ip_address, ptr_domain:ptr_domain}
+
+ begin
+ File.open hostfile, 'w' do |f|
+ f.puts populated
+ end
+ rescue => e
+ STDERR.puts "Unable to write #{hostfile}: #{e.message}"
+ return
end
- File.open(File.join(@@confdir, 'restart.txt'), 'w') do |f|
- # this should trigger a dnsmasq restart
+ # f.puts "address=/#{hostname}/#{ip_address}"
+ # f.puts "address=/#{hostname}.#{@@domain}/#{ip_address}" if @@domain
+ # f.puts "ptr-record=#{ptr_domain},#{hostname}"
+ #end
+ File.open(File.join(@@dns_server_conf_dir, 'restart.txt'), 'w') do |f|
+ # this will trigger a dns server restart
+ f.puts @@dns_server_reload_command
end
end
@@ -161,13 +182,13 @@ class Node < ArvadosModel
# At startup, make sure all DNS entries exist. Otherwise, slurmctld
# will refuse to start.
- if @@confdir and
- !File.exists? (File.join(@@confdir, hostname_for_slot(MAX_SLOTS-1)))
+ if @@dns_server_conf_dir and @@dns_server_conf_template and
+ !File.exists? (File.join(@@dns_server_conf_dir, hostname_for_slot(MAX_SLOTS-1)))
(0..MAX_SLOTS-1).each do |slot_number|
hostname = hostname_for_slot(slot_number)
- hostfile = File.join @@confdir, hostname
+ hostfile = File.join @@dns_server_conf_dir, hostname
if !File.exists? hostfile
- dnsmasq_update(hostname, '127.40.4.0')
+ dns_server_update(hostname, '127.40.4.0')
end
end
end
diff --git a/services/api/config/application.default.yml b/services/api/config/application.default.yml
index be1f157..1da5102 100644
--- a/services/api/config/application.default.yml
+++ b/services/api/config/application.default.yml
@@ -100,8 +100,21 @@ common:
# silenced by throttling are not counted against this total.
crunch_limit_log_bytes_per_job: 67108864
- # Path to /etc/dnsmasq.d, or false = do not update dnsmasq data.
- dnsmasq_conf_dir: false
+ # Path to dns server configuration directory (e.g. /etc/unbound.d/conf.d),
+ # or false = do not update dns server data.
+ dns_server_conf_dir: false
+
+ # Template for the dns server host snippets. See unbound.template in this directory for
+ # an example. Set to false to disable.
+ dns_server_conf_template: false
+
+ # Dns server reload command, or false = do not reload dns server after data change
+ dns_server_reload_command: false
+
+ # Example for unbound
+ #dns_server_conf_dir: /etc/unbound/conf.d
+ #dns_server_conf_template: /path/to/your/api/server/config/unbound.template
+ #dns_server_reload_command: /etc/init.d/unbound reload
compute_node_domain: false
compute_node_nameservers:
diff --git a/services/api/config/unbound.template b/services/api/config/unbound.template
new file mode 100644
index 0000000..0c67700
--- /dev/null
+++ b/services/api/config/unbound.template
@@ -0,0 +1,4 @@
+ local-data: "%{hostname} IN A %{ip_address}"
+ local-data: "%{hostname}.%{uuid_prefix} IN A %{ip_address}"
+ local-data: "%{hostname}.%{uuid_prefix}.arvadosapi.com. IN A %{ip_address}"
+ local-data: "%{ptr_domain}. IN PTR %{hostname}.%{uuid_prefix}.arvadosapi.com"
diff --git a/services/api/script/restart-dns-server b/services/api/script/restart-dns-server
new file mode 100755
index 0000000..061856c
--- /dev/null
+++ b/services/api/script/restart-dns-server
@@ -0,0 +1,34 @@
+#!/usr/bin/env bash
+
+# usage:
+# "restart-dns-server <path-to-restart.txt>" (restart now if needed)
+# or
+# "restart-dns-server <path-to-restart.txt> -d" (wait for restart to be needed, restart, repeat)
+
+RESTART_TXT_PATH=$1
+
+if [[ "$RESTART_TXT_PATH" == "" ]]; then
+ echo
+ echo "Usage: "
+ echo " $0 <path-to-restart.txt> # restart now if needed"
+ echo " $0 <path-to-restart.txt> -d # wait for restart to be needed, restart, repeat"
+ echo
+ exit 1
+fi
+
+while :
+do
+ if [ -e $RESTART_TXT_PATH ]; then
+ RESTART_COMMAND=`cat $RESTART_TXT_PATH`
+ echo "restart command: $RESTART_COMMAND"
+ rm -f "$RESTART_TXT_PATH"
+ echo restarting
+ $RESTART_COMMAND
+ fi
+ if [ "-d" = "$2" ]
+ then
+ sleep 2
+ else
+ exit 0
+ fi
+done
diff --git a/services/api/script/restart-dnsmasq b/services/api/script/restart-dnsmasq
deleted file mode 100755
index d0443a5..0000000
--- a/services/api/script/restart-dnsmasq
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/usr/bin/env bash
-
-# usage:
-# "restart-dnsmasq" (restart now if needed)
-# or
-# "restart-dnsmasq -d" (wait for restart to be needed, restart, repeat)
-
-while :
-do
- if [ -e /etc/dnsmasq.d/restart.txt ] && rm /etc/dnsmasq.d/restart.txt
- then
- echo restarting
- /etc/init.d/dnsmasq restart
- fi
- if [ "-d" = "$1" ]
- then
- sleep 2
- else
- exit
- fi
-done
-----------------------------------------------------------------------
hooks/post-receive
--
More information about the arvados-commits
mailing list