Merge ~troyanov/maas:fix-1978072 into maas:master

Proposed by Anton Troyanov
Status: Merged
Approved by: Anton Troyanov
Approved revision: 62936012cc482228f6df828bd047cc639707d59d
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~troyanov/maas:fix-1978072
Merge into: maas:master
Diff against target: 129 lines (+31/-19)
2 files modified
src/metadataserver/builtin_scripts/commissioning_scripts/bmc_config.py (+17/-19)
src/metadataserver/builtin_scripts/commissioning_scripts/tests/test_bmc_config.py (+14/-0)
Reviewer Review Type Date Requested Status
MAAS Lander Approve
Björn Tillenius Approve
Review via email: mp+424253@code.launchpad.net

Commit message

To post a comment you must log in.
Revision history for this message
Björn Tillenius (bjornt) wrote :

+1. But could you also please change it so that we print out a traceback on unexpected errors? It will make it a lot easier to debug in the future.

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b fix-1978072 lp:~troyanov/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 86f26969634881ec8da69949df65417d7cd866a6

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/metadataserver/builtin_scripts/commissioning_scripts/bmc_config.py b/src/metadataserver/builtin_scripts/commissioning_scripts/bmc_config.py
2index 0f1859b..e0e2496 100755
3--- a/src/metadataserver/builtin_scripts/commissioning_scripts/bmc_config.py
4+++ b/src/metadataserver/builtin_scripts/commissioning_scripts/bmc_config.py
5@@ -885,6 +885,10 @@ class Wedge(BMCConfig):
6 return None
7
8
9+class ConfigurationError(Exception):
10+ """Thrown when there is a known configuration error"""
11+
12+
13 class Redfish(IPMIBase):
14 """Handle detection and configuration of Redfish device."""
15
16@@ -906,10 +910,6 @@ class Redfish(IPMIBase):
17 _redfish_ip = None
18 _redfish_port = None
19
20- class ConfigurationError(Exception):
21- def __init__(self, msg):
22- super().__init__(msg)
23-
24 def __str__(self):
25 return "Redfish"
26
27@@ -975,15 +975,13 @@ class Redfish(IPMIBase):
28 netplan_config = None
29 assignment_type = get_smbios_value(data, "Host IP Assignment Type")
30 if assignment_type in ("Unknown", "AutoConfigure", "HostSelected"):
31- raise self.ConfigurationError(
32- "Unsupported Host IP Assignment Type"
33- )
34+ raise ConfigurationError("Unsupported Host IP Assignment Type")
35
36 if assignment_type == "Static":
37 ipv4_addr = get_smbios_value(data, "IPv4 Address")
38 ipv4_mask = get_smbios_value(data, "IPv4 Mask")
39 if not all((ipv4_addr, ipv4_mask)):
40- raise self.ConfigurationError("Missing Host IPv4 information")
41+ raise ConfigurationError("Missing Host IPv4 information")
42
43 prefix_length = ipaddress.IPv4Network((0, ipv4_mask)).prefixlen
44 ipv4 = f"{ipv4_addr}/{prefix_length}"
45@@ -1001,22 +999,24 @@ class Redfish(IPMIBase):
46 def _detect(self):
47 data = self._get_smbios_data()
48 if data is None:
49- raise self.ConfigurationError("Missing SMBIOS data")
50+ raise ConfigurationError("Missing SMBIOS data")
51
52 vendor_id = get_smbios_value(data, "idVendor")[2:]
53 product_id = get_smbios_value(data, "idProduct")[2:]
54
55 if not all((vendor_id, product_id)):
56- raise self.ConfigurationError(
57+ raise ConfigurationError(
58 "Missing idVendor and idProduct information"
59 )
60
61 iface = None
62 with open(os.environ["MAAS_RESOURCES_FILE"]) as fd:
63- data = json.load(fd)
64- iface = get_network_interface(data, vendor_id, product_id)
65+ machine_resources_data = json.load(fd)
66+ iface = get_network_interface(
67+ machine_resources_data, vendor_id, product_id
68+ )
69 if iface is None:
70- raise self.ConfigurationError("Missing Redfish Host Interface")
71+ raise ConfigurationError("Missing Redfish Host Interface")
72
73 self._configure_network(iface, data)
74
75@@ -1028,17 +1028,15 @@ class Redfish(IPMIBase):
76 self._redfish_port = get_smbios_value(data, "Redfish Service Port")
77
78 if not all((self._redfish_ip, self._redfish_port)):
79- raise self.ConfigurationError(
80- "Missing Redfish Service information."
81- )
82+ raise ConfigurationError("Missing Redfish Service information.")
83
84 def detected(self):
85 try:
86 self._detect()
87 return self.get_bmc_ip() is not None
88 # XXX: we should know which exceptions to expect, so we can handle them
89- except self.ConfigurationError as err:
90- print(f"ERROR: {err}\n{traceback.format_exc()}")
91+ except ConfigurationError as err:
92+ print(f"ERROR: Redfish configuration failed. {err}")
93 return False
94
95 def _get_bmc_ip(self):
96@@ -1116,7 +1114,7 @@ def detect_and_configure(args, bmc_config_path):
97 )
98 return
99 except Exception as e:
100- print(f"ERROR: {bmc_class.__name__} {e}")
101+ print(f"ERROR: {bmc_class.__name__} {e}\n{traceback.format_exc()}")
102 print("INFO: No BMC automatically detected!")
103
104
105diff --git a/src/metadataserver/builtin_scripts/commissioning_scripts/tests/test_bmc_config.py b/src/metadataserver/builtin_scripts/commissioning_scripts/tests/test_bmc_config.py
106index 63c72b0..d7f1b31 100644
107--- a/src/metadataserver/builtin_scripts/commissioning_scripts/tests/test_bmc_config.py
108+++ b/src/metadataserver/builtin_scripts/commissioning_scripts/tests/test_bmc_config.py
109@@ -1505,6 +1505,20 @@ class TestRedfish(MAASTestCase):
110 "Yes",
111 )
112
113+ def test_detected_unknown_exception(self):
114+ self.patch(
115+ self.redfish, "_detect"
116+ ).side_effect = factory.make_exception_type((ValueError,))
117+ self.assertRaises(ValueError, self.redfish.detected)
118+
119+ def test_detected_known_exception(self):
120+ self.patch(
121+ self.redfish, "_detect"
122+ ).side_effect = factory.make_exception_type(
123+ (bmc_config.ConfigurationError,)
124+ )
125+ self.assertEqual(False, self.redfish.detected())
126+
127
128 class TestGetIPMILocateOutput(MAASTestCase):
129 def test_get_ipmi_locate_output(self):

Subscribers

People subscribed via source and target branches