From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ondrej Mular Date: Fri, 29 Nov 2013 11:32:14 -0500 (EST) Subject: [Cluster-devel] [PATCH 1/3] fencing: new option --method In-Reply-To: <1894241096.3047584.1385741994148.JavaMail.root@redhat.com> Message-ID: <467334290.3048666.1385742734730.JavaMail.root@redhat.com> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Add new option method --method for cycle reboot --- fence/agents/lib/fencing.py.py | 80 ++++++++++++++++++++++++++++++------------ 1 file changed, 57 insertions(+), 23 deletions(-) diff --git a/fence/agents/lib/fencing.py.py b/fence/agents/lib/fencing.py.py index b4abfb2..59ab91b 100644 --- a/fence/agents/lib/fencing.py.py +++ b/fence/agents/lib/fencing.py.py @@ -25,7 +25,6 @@ EC_STATUS = 8 EC_STATUS_HMC = 9 EC_PASSWORD_MISSING = 10 EC_INVALID_PRIVILEGES = 11 -EC_TOOL_FAIL = 12 TELNET_PATH = "/usr/bin/telnet" SSH_PATH = "/usr/bin/ssh" @@ -343,7 +342,16 @@ all_opt = { "help" : "--use-sudo Use sudo (without password) when calling 3rd party software", "required" : "0", "shortdesc" : "Use sudo (without password) when calling 3rd party sotfware.", - "order" : 205} + "order" : 205}, + "method" : { + "getopt" : "m:", + "longopt" : "method", + "help" : "-m, --method=[method] Method to fence (onoff|cycle) (Default: onoff)", + "required" : "0", + "shortdesc" : "Method to fence (onoff|cycle) (Default: onoff)", + "default" : "onoff", + "choices" : [ "onoff", "cycle" ], + "order" : 1} } # options which are added automatically if 'key' is encountered ("default" is always added) @@ -413,8 +421,7 @@ def fail(error_code): EC_STATUS_HMC : "Failed: Either unable to obtain correct plug status, partition is not available or incorrect HMC version used", EC_PASSWORD_MISSING : "Failed: You have to set login password", - EC_INVALID_PRIVILEGES : "Failed: The user does not have the correct privileges to do the requested action.", - EC_TOOL_FAIL: "Failed: Required tool not found or not accessible." + EC_INVALID_PRIVILEGES : "Failed: The user does not have the correct privileges to do the requested action." }[error_code] + "\n" sys.stderr.write(message) syslog.syslog(syslog.LOG_ERR, message) @@ -782,6 +789,23 @@ def set_multi_power_fn(tn, options, set_power_fn): else: set_power_fn(tn, options) +def multi_reboot_cycle_fn(tn, options, reboot_cycle_fn): + success = False; + if options.has_key("--plugs"): + for plug in options["--plugs"]: + try: + options["--uuid"] = str(uuid.UUID(plug)) + except ValueError: + pass + except KeyError: + pass + options["--plug"] = plug + plug_status = reboot_cycle_fn(tn, options) + if plug_status: + success = plug_status + else: + success = reboot_cycle_fn(tn, options) + return success def show_docs(options, docs = None): device_opt = options["device_opt"] @@ -806,7 +830,7 @@ def show_docs(options, docs = None): print __main__.REDHAT_COPYRIGHT sys.exit(0) -def fence_action(tn, options, set_power_fn, get_power_fn, get_outlet_list = None): +def fence_action(tn, options, set_power_fn, get_power_fn, get_outlet_list = None, reboot_cycle_fn = None): result = 0 try: @@ -865,28 +889,38 @@ def fence_action(tn, options, set_power_fn, get_power_fn, get_outlet_list = None else: fail(EC_WAITING_OFF) elif options["--action"] == "reboot": - if status != "off": - options["--action"] = "off" - set_multi_power_fn(tn, options, set_power_fn) - time.sleep(int(options["--power-wait"])) - if wait_power_status(tn, options, get_power_fn) == 0: - fail(EC_WAITING_OFF) - options["--action"] = "on" - power_on = False - try: + if options.has_key("--method") and options["--method"].lower() == "cycle": for _ in range(1, 1 + int(options["--retry-on"])): - set_multi_power_fn(tn, options, set_power_fn) - time.sleep(int(options["--power-wait"])) - if wait_power_status(tn, options, get_power_fn) == 1: + if multi_reboot_cycle_fn(tn, options, reboot_cycle_fn): power_on = True break - except Exception, ex: - # an error occured during power ON phase in reboot - # fence action was completed succesfully even in that case - sys.stderr.write(str(ex)) - syslog.syslog(syslog.LOG_NOTICE, str(ex)) - pass + + if not power_on: + fail(EC_TIMED_OUT) + + else: + if status != "off": + options["--action"] = "off" + set_multi_power_fn(tn, options, set_power_fn) + time.sleep(int(options["--power-wait"])) + if wait_power_status(tn, options, get_power_fn) == 0: + fail(EC_WAITING_OFF) + options["--action"] = "on" + + try: + for _ in range(1, 1 + int(options["--retry-on"])): + set_multi_power_fn(tn, options, set_power_fn) + time.sleep(int(options["--power-wait"])) + if wait_power_status(tn, options, get_power_fn) == 1: + power_on = True + break + except Exception, ex: + # an error occured during power ON phase in reboot + # fence action was completed succesfully even in that case + sys.stderr.write(str(ex)) + syslog.syslog(syslog.LOG_NOTICE, str(ex)) + pass if power_on == False: # this should not fail as node was fenced succesfully -- 1.8.3.1