sts-sponsors team mailing list archive
-
sts-sponsors team
-
Mailing list archive
-
Message #08336
[Merge] ~seyeongkim/maas:lp1979403_to_3_2 into maas:3.2
Seyeong Kim has proposed merging ~seyeongkim/maas:lp1979403_to_3_2 into maas:3.2.
Commit message:
backport to 3.2
Requested reviews:
MAAS Maintainers (maas-maintainers)
For more details, see:
https://code.launchpad.net/~seyeongkim/maas/+git/maas/+merge/442700
--
Your team MAAS Committers is subscribed to branch maas:3.2.
diff --git a/creds.yaml b/creds.yaml
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/creds.yaml
diff --git a/src/metadataserver/builtin_scripts/commissioning_scripts/bmc_config.py b/src/metadataserver/builtin_scripts/commissioning_scripts/bmc_config.py
index 4964f08..02e900d 100755
--- a/src/metadataserver/builtin_scripts/commissioning_scripts/bmc_config.py
+++ b/src/metadataserver/builtin_scripts/commissioning_scripts/bmc_config.py
@@ -226,7 +226,7 @@ class IPMIBase(BMCConfig):
def _bmc_get_config(self, section=None):
"""Fetch and cache all BMC settings."""
print("INFO: Reading current IPMI BMC values...")
- cmd = ["bmc-config", "--checkout"]
+ cmd = ["bmc-config", "--checkout", "--verbose"]
if section:
cmd += ["-S", section]
try:
@@ -392,41 +392,53 @@ class IPMIBase(BMCConfig):
def _config_ipmi_lan_channel_settings(self):
"""Enable IPMI-over-Lan (Lan_Channel) if it is disabled"""
print("INFO: Configuring IPMI Lan_Channel...")
- lan_channel = self._bmc_config.get("Lan_Channel", {})
- for key in [
- "Volatile_Access_Mode",
- "Non_Volatile_Access_Mode",
+ for channel in [
+ "Lan_Channel",
+ "Lan_Channel_Channel_1",
+ "Lan_Channel_Channel_2",
+ "Lan_Channel_Channel_3",
]:
- if lan_channel.get(key) != "Always_Available":
- print(
- "INFO: Enabling BMC network access - Lan_Channel:%s" % key
- )
- # Some BMC's don't support setting Lan_Channel (see LP: #1287274).
- # If that happens, it would cause the script to fail preventing
- # the script from continuing. To address this, simply catch the
- # error, return and allow the script to continue.
- try:
- self._bmc_set("Lan_Channel", key, "Always_Available")
- except Exception:
+ lan_channel = self._bmc_config.get(channel, {})
+
+ if not lan_channel:
+ continue
+
+ for key in [
+ "Volatile_Access_Mode",
+ "Non_Volatile_Access_Mode",
+ ]:
+ if lan_channel.get(key) != "Always_Available":
print(
- "WARNING: Unable to set Lan_Channel:%s. "
- "BMC may be unavailable over the network!" % key
+ "INFO: Enabling BMC network access - %s:%s"
+ % (channel, key)
)
-
- self._bmc_set_keys(
- "Lan_Channel",
- [
- f"{auth_type}_{volatility}"
- for auth_type in [
- "Enable_User_Level_Auth",
- "Enable_Per_Message_Auth",
- "Enable_Pef_Alerting",
- ]
- for volatility in ["Volatile", "Non_Volatile"]
- ],
- "Yes",
- )
+ # Some BMC's don't support setting Lan_Channel (see LP: #1287274).
+ # If that happens, it would cause the script to fail preventing
+ # the script from continuing. To address this, simply catch the
+ # error, return and allow the script to continue.
+ try:
+ self._bmc_set(channel, key, "Always_Available")
+ except Exception:
+ print(
+ "WARNING: Unable to set %s:%s. "
+ "BMC may be unavailable over the network!"
+ % (channel, key)
+ )
+
+ self._bmc_set_keys(
+ channel,
+ [
+ f"{auth_type}_{volatility}"
+ for auth_type in [
+ "Enable_User_Level_Auth",
+ "Enable_Per_Message_Auth",
+ "Enable_Pef_Alerting",
+ ]
+ for volatility in ["Volatile", "Non_Volatile"]
+ ],
+ "Yes",
+ )
def _config_lan_conf_auth(self):
"""Configure Lan_Conf_Auth."""
@@ -577,6 +589,9 @@ class IPMI(IPMIBase):
mac_address = None
for section_name, key in [
("Lan_Conf", "IP_Address"),
+ ("Lan_Conf_Channel_1", "IP_Address"),
+ ("Lan_Conf_Channel_2", "IP_Address"),
+ ("Lan_Conf_Channel_3", "IP_Address"),
("Lan6_Conf", "IPv6_Static_Addresses"),
("Lan6_Conf", "IPv6_Dynamic_Addresses"),
]:
@@ -599,28 +614,28 @@ class IPMI(IPMIBase):
time.sleep(2)
continue
if section_name.startswith("Lan6_"):
- return "[%s]" % ip, mac_address
- return ip, mac_address
+ return section_name, "[%s]" % ip, mac_address
+ return section_name, ip, mac_address
# No valid IP address was found.
- return None, mac_address
+ return None, None, mac_address
def get_bmc_ip(self):
"""Configure and retreive IPMI BMC IP."""
- ip_address, mac_address = self._get_bmc_ip()
+ section_name, ip_address, mac_address = self._get_bmc_ip()
if ip_address:
return ip_address, mac_address
print("INFO: Attempting to enable preconfigured static IP on BMC...")
- self._bmc_set("Lan_Conf", "IP_Address_Source", "Static")
+ self._bmc_set(section_name, "IP_Address_Source", "Static")
for _ in range(6):
time.sleep(10)
- ip_address, mac_address = self._get_bmc_ip(True)
+ _, ip_address, mac_address = self._get_bmc_ip(True)
if ip_address:
return ip_address, mac_address
print("INFO: Attempting to enable DHCP on BMC...")
- self._bmc_set("Lan_Conf", "IP_Address_Source", "Use_DHCP")
+ self._bmc_set(section_name, "IP_Address_Source", "Use_DHCP")
for _ in range(6):
time.sleep(10)
- ip_address, mac_address = self._get_bmc_ip(True)
+ _, ip_address, mac_address = self._get_bmc_ip(True)
if ip_address:
print("WARNING: BMC is configured to use DHCP!")
return ip_address, mac_address
diff --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
index d7f1b31..77d5d10 100644
--- a/src/metadataserver/builtin_scripts/commissioning_scripts/tests/test_bmc_config.py
+++ b/src/metadataserver/builtin_scripts/commissioning_scripts/tests/test_bmc_config.py
@@ -490,20 +490,25 @@ EndSection
self.assertRaises(SystemExit, self.ipmi.add_bmc_user)
def test_set_ipmi_lan_channel_setting_verifies(self):
- self.ipmi._bmc_config = {
- "Lan_Channel": {
- "Volatile_Access_Mode": "Always_Available",
- "Non_Volatile_Access_Mode": "Always_Available",
+
+ for channel in [
+ "Lan_Channel",
+ "Lan_Channel_Channel_1",
+ "Lan_Channel_Channel_2",
+ "Lan_Channel_Channel_3",
+ ]:
+ self.ipmi._bmc_config = {
+ channel: {
+ "Volatile_Access_Mode": "Always_Available",
+ "Non_Volatile_Access_Mode": "Always_Available",
+ },
}
- }
- mock_bmc_set = self.patch(self.ipmi, "_bmc_set")
- mock_bmc_set_keys = self.patch(self.ipmi, "_bmc_set_keys")
- self.ipmi._config_ipmi_lan_channel_settings()
- self.assertThat(mock_bmc_set, MockNotCalled())
- self.assertThat(
- mock_bmc_set_keys,
- MockCalledOnceWith(
- "Lan_Channel",
+ mock_bmc_set = self.patch(self.ipmi, "_bmc_set")
+ mock_bmc_set_keys = self.patch(self.ipmi, "_bmc_set_keys")
+ self.ipmi._config_ipmi_lan_channel_settings()
+ self.assertFalse(mock_bmc_set.called)
+ mock_bmc_set_keys.assert_called_once_with(
+ channel,
[
f"{auth_type}_{volatility}"
for auth_type in [
@@ -514,36 +519,36 @@ EndSection
for volatility in ["Volatile", "Non_Volatile"]
],
"Yes",
- ),
- )
+ )
def test_set_ipmi_lan_channel_setting_enables(self):
- self.ipmi._bmc_config = {
- "Lan_Channel": {
- "Volatile_Access_Mode": "Disabled",
- "Non_Volatile_Access_Mode": "Pre_Boot_only",
+ for channel in [
+ "Lan_Channel",
+ "Lan_Channel_Channel_1",
+ "Lan_Channel_Channel_2",
+ "Lan_Channel_Channel_3",
+ ]:
+ self.ipmi._bmc_config = {
+ channel: {
+ "Volatile_Access_Mode": "Disabled",
+ "Non_Volatile_Access_Mode": "Pre_Boot_only",
+ },
}
- }
- mock_bmc_set = self.patch(self.ipmi, "_bmc_set")
- mock_bmc_set_keys = self.patch(self.ipmi, "_bmc_set_keys")
- self.ipmi._config_ipmi_lan_channel_settings()
- self.assertThat(
- mock_bmc_set,
- MockCallsMatch(
- call(
- "Lan_Channel", "Volatile_Access_Mode", "Always_Available"
- ),
- call(
- "Lan_Channel",
- "Non_Volatile_Access_Mode",
- "Always_Available",
- ),
- ),
- )
- self.assertThat(
- mock_bmc_set_keys,
- MockCalledOnceWith(
- "Lan_Channel",
+ mock_bmc_set = self.patch(self.ipmi, "_bmc_set")
+ mock_bmc_set_keys = self.patch(self.ipmi, "_bmc_set_keys")
+ self.ipmi._config_ipmi_lan_channel_settings()
+ mock_bmc_set.assert_has_calls(
+ (
+ call(channel, "Volatile_Access_Mode", "Always_Available"),
+ call(
+ channel,
+ "Non_Volatile_Access_Mode",
+ "Always_Available",
+ ),
+ )
+ )
+ mock_bmc_set_keys.assert_called_once_with(
+ channel,
[
f"{auth_type}_{volatility}"
for auth_type in [
@@ -554,8 +559,7 @@ EndSection
for volatility in ["Volatile", "Non_Volatile"]
],
"Yes",
- ),
- )
+ )
def test_config_lan_conf_auth(self):
self.ipmi._bmc_config = {"Lan_Channel_Auth": {}}
@@ -718,7 +722,9 @@ EndSection
"MAC_Address": mac_address,
}
}
- self.assertEqual((ip, mac_address), self.ipmi._get_bmc_ip())
+ self.assertEqual(
+ ("Lan_Conf", ip, mac_address), self.ipmi._get_bmc_ip()
+ )
def test_get_bmc_ipv6_static(self):
ip = factory.make_ipv6_address()
@@ -729,7 +735,9 @@ EndSection
"MAC_Address": mac_address,
}
}
- self.assertEqual((f"[{ip}]", mac_address), self.ipmi._get_bmc_ip())
+ self.assertEqual(
+ ("Lan6_Conf", f"[{ip}]", mac_address), self.ipmi._get_bmc_ip()
+ )
def test_get_bmc_ipv6_dynamic(self):
ip = factory.make_ipv6_address()
@@ -740,7 +748,9 @@ EndSection
"MAC_Address": mac_address,
}
}
- self.assertEqual((f"[{ip}]", mac_address), self.ipmi._get_bmc_ip())
+ self.assertEqual(
+ ("Lan6_Conf", f"[{ip}]", mac_address), self.ipmi._get_bmc_ip()
+ )
def test_get_bmc_ipv6_gets_mac_From_ipv4(self):
ip = factory.make_ipv6_address()
@@ -749,18 +759,20 @@ EndSection
"Lan_Conf": {"MAC_Address": mac_address},
"Lan6_Conf": {"IPv6_Dynamic_Addresses": ip},
}
- self.assertEqual((f"[{ip}]", mac_address), self.ipmi._get_bmc_ip())
+ self.assertEqual(
+ ("Lan6_Conf", f"[{ip}]", mac_address), self.ipmi._get_bmc_ip()
+ )
def test_get_bmc_ip_finds_none(self):
self.patch(self.ipmi, "_bmc_get").return_value = ""
- self.assertEqual((None, None), self.ipmi._get_bmc_ip())
+ self.assertEqual((None, None, None), self.ipmi._get_bmc_ip())
def test_get_bmc_ip(self):
ip = factory.make_ip_address()
mac_address = factory.make_mac_address()
mock_bmc_set = self.patch(self.ipmi, "_bmc_set")
mock_get_bmc_ip = self.patch(self.ipmi, "_get_bmc_ip")
- mock_get_bmc_ip.return_value = ip, mac_address
+ mock_get_bmc_ip.return_value = None, ip, mac_address
self.assertEqual((ip, mac_address), self.ipmi.get_bmc_ip())
self.assertThat(mock_bmc_set, MockNotCalled())
@@ -772,9 +784,9 @@ EndSection
mock_bmc_set = self.patch(self.ipmi, "_bmc_set")
mock_get_bmc_ip = self.patch(self.ipmi, "_get_bmc_ip")
mock_get_bmc_ip.side_effect = (
- (None, mac_address),
- (None, mac_address),
- (ip, mac_address),
+ ("Lan_Conf", None, mac_address),
+ ("Lan_Conf", None, mac_address),
+ ("Lan_Conf", ip, mac_address),
)
self.assertEqual((ip, mac_address), self.ipmi.get_bmc_ip())
@@ -792,8 +804,8 @@ EndSection
mock_bmc_set = self.patch(self.ipmi, "_bmc_set")
mock_get_bmc_ip = self.patch(self.ipmi, "_get_bmc_ip")
mock_get_bmc_ip.side_effect = (
- *[(None, mac_address) for _ in range(8)],
- (ip, mac_address),
+ *[("Lan_Conf", None, mac_address) for _ in range(8)],
+ ("Lan_Conf", ip, mac_address),
)
self.assertEqual((ip, mac_address), self.ipmi.get_bmc_ip())
@@ -804,6 +816,7 @@ EndSection
call("Lan_Conf", "IP_Address_Source", "Use_DHCP"),
),
)
+
self.assertThat(
mock_get_bmc_ip,
MockCallsMatch(call(), *[call(True) for _ in range(8)]),
@@ -812,7 +825,7 @@ EndSection
def test_get_bmc_ip_fails(self):
mock_bmc_set = self.patch(self.ipmi, "_bmc_set")
mock_get_bmc_ip = self.patch(self.ipmi, "_get_bmc_ip")
- mock_get_bmc_ip.return_value = (None, None)
+ mock_get_bmc_ip.return_value = ("Lan_Conf", None, None)
self.assertRaises(SystemExit, self.ipmi.get_bmc_ip)
self.assertThat(
Follow ups