← Back to team overview

sts-sponsors team mailing list archive

[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