From 33e63ce9959199bdfdf8167d2f64a85776d30141 Mon Sep 17 00:00:00 2001 From: Andrew Beekhof Date: Fri, 22 Apr 2016 12:27:10 +1000 Subject: [PATCH] fence_compute: improved handling of compute nodes with/without FQDNs --- fence/agents/compute/fence_compute.py | 94 +++++++++++++++++++++++++++++++---- 1 file changed, 84 insertions(+), 10 deletions(-) diff --git a/fence/agents/compute/fence_compute.py b/fence/agents/compute/fence_compute.py index b93580b..be7fc22 100644 --- a/fence/agents/compute/fence_compute.py +++ b/fence/agents/compute/fence_compute.py @@ -202,6 +202,86 @@ def set_power_status(_, options): return + +def fix_domain(options): + domains = {} + last_domain = None + + if nova: + # Find it in nova + + hypervisors = nova.hypervisors.list() + for hypervisor in hypervisors: + shorthost = hypervisor.hypervisor_hostname.split('.')[0] + + if shorthost == hypervisor.hypervisor_hostname: + # Nova is not using FQDN + calculated = "" + else: + # Compute nodes are named as FQDN, strip off the hostname + calculated = hypervisor.hypervisor_hostname.replace(shorthost+".", "") + + domains[calculated] = shorthost + + if calculated == last_domain: + # Avoid complaining for each compute node with the same name + # One hopes they don't appear interleaved as A.com B.com A.com B.com + logging.debug("Calculated the same domain from: %s" % hypervisor.hypervisor_hostname) + + elif options.has_key("--domain") and options["--domain"] == calculated: + # Supplied domain name is valid + return + + elif options.has_key("--domain"): + # Warn in case nova isn't available at some point + logging.warning("Supplied domain '%s' does not match the one calculated from: %s" + % (options["--domain"], hypervisor.hypervisor_hostname)) + + last_domain = calculated + + if len(domains) == 0 and not options.has_key("--domain"): + logging.error("Could not calculate the domain names used by compute nodes in nova") + + elif len(domains) == 1 and not options.has_key("--domain"): + options["--domain"] = last_domain + + elif len(domains) == 1: + logging.error("Overriding supplied domain '%s' does not match the one calculated from: %s" + % (options["--domain"], hypervisor.hypervisor_hostname)) + options["--domain"] = last_domain + + elif len(domains) > 1: + logging.error("The supplied domain '%s' did not match any used inside nova: %s" + % (options["--domain"], repr(domains))) + sys.exit(1) + +def fix_plug_name(options): + if options["--action"] == "list": + return + + if not options.has_key("--plug"): + return + + fix_domain(options) + short_plug = options["--plug"].split('.')[0] + logging.debug("Checking target '%s' against calculated domain '%s'"% (options["--plug"], calculated)) + + if not options.has_key("--domain"): + # Nothing supplied and nova not available... what to do... nothing + return + + elif options["--domain"] == "": + # Ensure any domain is stripped off since nova isn't using FQDN + options["--plug"] = short_plug + + elif options["--plug"].find(options["--domain"]): + # Plug already contains the domain, don't re-add + return + + else: + # Add the domain to the plug + options["--plug"] = short_plug + "." + options["--domain"] + def get_plugs_list(_, options): result = {} @@ -209,12 +289,9 @@ def get_plugs_list(_, options): hypervisors = nova.hypervisors.list() for hypervisor in hypervisors: longhost = hypervisor.hypervisor_hostname - if options["--domain"] != "": - shorthost = longhost.replace("." + options["--domain"], "") - result[longhost] = ("", None) - result[shorthost] = ("", None) - else: - result[longhost] = ("", None) + shorthost = longhost.split('.')[0] + result[longhost] = ("", None) + result[shorthost] = ("", None) return result @@ -270,7 +347,6 @@ def define_new_opts(): "help" : "-d, --domain=[string] DNS domain in which hosts live, useful when the cluster uses short names and nova uses FQDN", "required" : "0", "shortdesc" : "DNS domain in which hosts live", - "default" : "", "order": 5, } all_opt["record-only"] = { @@ -328,9 +404,7 @@ def main(): except ImportError: fail_usage("nova not found or not accessible") - # Potentially we should make this a pacemaker feature - if options["--action"] != "list" and options["--domain"] != "" and options.has_key("--plug"): - options["--plug"] = options["--plug"] + "." + options["--domain"] + fix_plug_name(options) if options["--record-only"] in [ "2", "Disabled", "disabled" ]: sys.exit(0)