* [Cluster-devel] [PATCH 1/3] fencing: new option --method
[not found] <1894241096.3047584.1385741994148.JavaMail.root@redhat.com>
@ 2013-11-29 16:32 ` Ondrej Mular
2013-12-19 15:28 ` Marek Grac
0 siblings, 1 reply; 2+ messages in thread
From: Ondrej Mular @ 2013-11-29 16:32 UTC (permalink / raw)
To: cluster-devel.redhat.com
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
^ permalink raw reply related [flat|nested] 2+ messages in thread