Blob Blame History Raw
From 6d0b2cb598135b697ee583e3514aa427fc0e4cf8 Mon Sep 17 00:00:00 2001
From: Reid Wahl <nrwahl@protonmail.com>
Date: Wed, 29 Jul 2020 18:33:17 -0700
Subject: [PATCH 1/2] fence_lpar: Fix list-status action

The `list-status` action prints "UNKNOWN" status for all LPARs when
`--hmc-version` is `"4"` or `"IVM"`.

This commit fixes that by mapping the statuses returned by the HMC
(e.g., "Running") to the statuses that the fencing library expects
(e.g., "on").

Resolves: RHBZ#1861926

Signed-off-by: Reid Wahl <nrwahl@protonmail.com>
---
 agents/lpar/fence_lpar.py | 27 +++++++++++++++------------
 1 file changed, 15 insertions(+), 12 deletions(-)

diff --git a/agents/lpar/fence_lpar.py b/agents/lpar/fence_lpar.py
index 9dfabc43..03068466 100644
--- a/agents/lpar/fence_lpar.py
+++ b/agents/lpar/fence_lpar.py
@@ -16,6 +16,16 @@
 from fencing import *
 from fencing import fail, fail_usage, EC_STATUS_HMC
 
+##
+## Transformation to standard ON/OFF status if possible
+def _normalize_status(status):
+	if status in ["Running", "Open Firmware", "Shutting Down", "Starting"]:
+		status = "on"
+	else:
+		status = "off"
+
+	return status
+
 def get_power_status(conn, options):
 	if options["--hmc-version"] == "3":
 		conn.send("lssyscfg -r lpar -m " + options["--managed"] + " -n " + options["--plug"] + " -F name,state\n")
@@ -42,14 +52,7 @@ def get_power_status(conn, options):
 		except AttributeError:
 			fail(EC_STATUS_HMC)
 
-	##
-	## Transformation to standard ON/OFF status if possible
-	if status in ["Running", "Open Firmware", "Shutting Down", "Starting"]:
-		status = "on"
-	else:
-		status = "off"
-
-	return status
+	return _normalize_status(status)
 
 def set_power_status(conn, options):
 	if options["--hmc-version"] == "3":
@@ -111,10 +114,10 @@ def get_lpar_list(conn, options):
 		lines = res.group(1).split("\n")
 		for outlet_line in lines:
 			try:
-				(port, status) = outlet_line.split(":")
+				(port, status) = outlet_line.rstrip().split(":")
 			except ValueError:
 				fail_usage('Output does not match expected HMC version, try different one');
-			outlets[port] = ("", status)
+			outlets[port] = ("", _normalize_status(status))
 	elif options["--hmc-version"] == "IVM":
 		conn.send("lssyscfg -r lpar -m " + options["--managed"] +
 			" -F name,state\n")
@@ -133,10 +136,10 @@ def get_lpar_list(conn, options):
 		lines = res.group(1).split("\n")
 		for outlet_line in lines:
 			try:
-				(port, status) = outlet_line.split(",")
+				(port, status) = outlet_line.rstrip().split(",")
 			except ValueError:
 				fail_usage('Output does not match expected HMC version, try different one');
-			outlets[port] = ("", status)
+			outlets[port] = ("", _normalize_status(status))
 
 	return outlets
 

From 4f7b40c0cde896f2f5b09e796ba34450e90aee6c Mon Sep 17 00:00:00 2001
From: Reid Wahl <nrwahl@protonmail.com>
Date: Wed, 29 Jul 2020 18:43:47 -0700
Subject: [PATCH 2/2] fence_lpar: Reduce code duplication in get_lpar_list

The logic for HMC version 4 and HMC version IVM are the same except for
the use of a different separator character. This commit condenses them
into one block.

Signed-off-by: Reid Wahl <nrwahl@protonmail.com>
---
 agents/lpar/fence_lpar.py | 28 ++++------------------------
 1 file changed, 4 insertions(+), 24 deletions(-)

diff --git a/agents/lpar/fence_lpar.py b/agents/lpar/fence_lpar.py
index 03068466..7560a82c 100644
--- a/agents/lpar/fence_lpar.py
+++ b/agents/lpar/fence_lpar.py
@@ -96,31 +96,11 @@ def get_lpar_list(conn, options):
 		lines = res.group(2).split("\n")
 		for outlet_line in lines:
 			outlets[outlet_line.rstrip()] = ("", "")
-	elif options["--hmc-version"] == "4":
-		conn.send("lssyscfg -r lpar -m " + options["--managed"] +
-			" -F name:state\n")
-
-		## We have to remove first line (command)
-		conn.readline()
-		conn.log_expect(options["--command-prompt"], int(options["--power-timeout"]))
-
-		## We have to remove last line (part of new prompt)
-		####
-		res = re.search("^(.*)\n.*$", conn.before, re.S)
-
-		if res == None:
-			fail_usage("Unable to parse output of list command")
+	elif options["--hmc-version"] in ["4", "IVM"]:
+		sep = ":" if options["--hmc-version"] == "4" else ","
 
-		lines = res.group(1).split("\n")
-		for outlet_line in lines:
-			try:
-				(port, status) = outlet_line.rstrip().split(":")
-			except ValueError:
-				fail_usage('Output does not match expected HMC version, try different one');
-			outlets[port] = ("", _normalize_status(status))
-	elif options["--hmc-version"] == "IVM":
 		conn.send("lssyscfg -r lpar -m " + options["--managed"] +
-			" -F name,state\n")
+			" -F name" + sep + "state\n")
 
 		## We have to remove first line (command)
 		conn.readline()
@@ -136,7 +116,7 @@ def get_lpar_list(conn, options):
 		lines = res.group(1).split("\n")
 		for outlet_line in lines:
 			try:
-				(port, status) = outlet_line.rstrip().split(",")
+				(port, status) = outlet_line.rstrip().split(sep)
 			except ValueError:
 				fail_usage('Output does not match expected HMC version, try different one');
 			outlets[port] = ("", _normalize_status(status))