Merge ~mfo/maas:3.1 into maas:3.1

Proposed by Mauricio Faria de Oliveira
Status: Merged
Merged at revision: 5ad7060e524668a7eff438fa21fe5bd2199e4ff1
Proposed branch: ~mfo/maas:3.1
Merge into: maas:3.1
Diff against target: 688 lines (+123/-247)
7 files modified
debian/changelog (+6/-0)
dev/null (+0/-0)
setup.cfg (+1/-1)
src/maasserver/dhcp.py (+9/-15)
src/maasserver/tests/test_dhcp.py (+12/-108)
src/metadataserver/builtin_scripts/commissioning_scripts/bmc_config.py (+41/-56)
src/metadataserver/builtin_scripts/commissioning_scripts/tests/test_bmc_config.py (+54/-67)
Reviewer Review Type Date Requested Status
MAAS Lander Approve
Mauricio Faria de Oliveira Pending
Review via email: mp+450510@code.launchpad.net

Description of the change

Please ignore and do not merge; only for tests.

To post a comment you must log in.
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b 3.1 lp:~mfo/maas/+git/maas into -b 3.1 lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 9a57e03fb199af5a1dd141440b2ed6e7bd6ea678

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

UNIT TESTS
-b 3.1 lp:~mfo/maas/+git/maas into -b 3.1 lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 209cc3eb6038b5e6f3dc673b847eb5fdb2ac3120

review: Approve
Revision history for this message
Mauricio Faria de Oliveira (mfo) wrote :

jenkins: !test

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

UNIT TESTS
-b 3.1 lp:~mfo/maas/+git/maas into -b 3.1 lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 2761b73c5d63e3dfb95de363a9ec3f50b998e0c6

review: Approve
Revision history for this message
Mauricio Faria de Oliveira (mfo) wrote :

jenkins: !test

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

UNIT TESTS
-b 3.1 lp:~mfo/maas/+git/maas into -b 3.1 lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 5ad7060e524668a7eff438fa21fe5bd2199e4ff1

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/creds.yaml b/creds.yaml
0deleted file mode 1006440deleted file mode 100644
index e69de29..0000000
--- a/creds.yaml
+++ /dev/null
diff --git a/debian/changelog b/debian/changelog
index 204172d..39b080c 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
1maas (1:3.1.2-0ubuntu1) focal; urgency=medium
2
3 * New upstream release, MAAS 3.1.2.
4
5 -- Mauricio Faria de Oliveira <mfo@canonical.com> Mon, 04 Sep 2023 14:14:22 -0300
6
1maas (1:3.1.2~rc1-0ubuntu1) focal; urgency=medium7maas (1:3.1.2~rc1-0ubuntu1) focal; urgency=medium
28
3 * New upstream release, MAAS 3.1.2 RC1.9 * New upstream release, MAAS 3.1.2 RC1.
diff --git a/setup.cfg b/setup.cfg
index ca76a6a..4a59a2d 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,6 +1,6 @@
1[metadata]1[metadata]
2name = maas2name = maas
3version = 3.1.2rc13version = 3.1.2
4description = Metal As A Service4description = Metal As A Service
5long_description = file: README.rst5long_description = file: README.rst
6url = https://maas.io/6url = https://maas.io/
diff --git a/src/maasserver/dhcp.py b/src/maasserver/dhcp.py
index f1bcd74..ac30d84 100644
--- a/src/maasserver/dhcp.py
+++ b/src/maasserver/dhcp.py
@@ -224,17 +224,15 @@ def ip_is_on_vlan(ip_address, vlan):
224 )224 )
225225
226226
227def get_ip_address_for_interface(interface, vlan, ip_version: int):227def get_ip_address_for_interface(interface, vlan):
228 """Return the IP address for `interface` on `vlan`."""228 """Return the IP address for `interface` on `vlan`."""
229 for ip_address in interface.ip_addresses.all():229 for ip_address in interface.ip_addresses.all():
230 if ip_is_version(ip_address, ip_version) and ip_is_on_vlan(230 if ip_is_on_vlan(ip_address, vlan):
231 ip_address, vlan
232 ):
233 return ip_address231 return ip_address
234 return None232 return None
235233
236234
237def get_ip_address_for_rack_controller(rack_controller, vlan, ip_version: int):235def get_ip_address_for_rack_controller(rack_controller, vlan):
238 """Return the IP address for `rack_controller` on `vlan`."""236 """Return the IP address for `rack_controller` on `vlan`."""
239 # First we build a list of all interfaces that have an IP address237 # First we build a list of all interfaces that have an IP address
240 # on that vlan. Then we pick the best interface for that vlan238 # on that vlan. Then we pick the best interface for that vlan
@@ -245,12 +243,10 @@ def get_ip_address_for_rack_controller(rack_controller, vlan, ip_version: int):
245 matching_interfaces = set()243 matching_interfaces = set()
246 for interface in interfaces:244 for interface in interfaces:
247 for ip_address in interface.ip_addresses.all():245 for ip_address in interface.ip_addresses.all():
248 if ip_is_version(ip_address, ip_version) and ip_is_on_vlan(246 if ip_is_on_vlan(ip_address, vlan):
249 ip_address, vlan
250 ):
251 matching_interfaces.add(interface)247 matching_interfaces.add(interface)
252 interface = get_best_interface(matching_interfaces)248 interface = get_best_interface(matching_interfaces)
253 return get_ip_address_for_interface(interface, vlan, ip_version)249 return get_ip_address_for_interface(interface, vlan)
254250
255251
256@typed252@typed
@@ -493,19 +489,17 @@ def make_subnet_config(
493 return subnet_config489 return subnet_config
494490
495491
496def make_failover_peer_config(vlan, rack_controller, ip_version: int):492def make_failover_peer_config(vlan, rack_controller):
497 """Return DHCP failover peer configuration dict for a rack controller."""493 """Return DHCP failover peer configuration dict for a rack controller."""
498 is_primary = vlan.primary_rack_id == rack_controller.id494 is_primary = vlan.primary_rack_id == rack_controller.id
499 interface_ip_address = get_ip_address_for_rack_controller(495 interface_ip_address = get_ip_address_for_rack_controller(
500 rack_controller, vlan, ip_version496 rack_controller, vlan
501 )497 )
502 if is_primary:498 if is_primary:
503 peer_rack = vlan.secondary_rack499 peer_rack = vlan.secondary_rack
504 else:500 else:
505 peer_rack = vlan.primary_rack501 peer_rack = vlan.primary_rack
506 peer_address = get_ip_address_for_rack_controller(502 peer_address = get_ip_address_for_rack_controller(peer_rack, vlan)
507 peer_rack, vlan, ip_version
508 )
509 name = "failover-vlan-%d" % vlan.id503 name = "failover-vlan-%d" % vlan.id
510 return (504 return (
511 name,505 name,
@@ -659,7 +653,7 @@ def get_dhcp_configure_for(
659 if has_secondary:653 if has_secondary:
660 # Generate the failover peer for this VLAN.654 # Generate the failover peer for this VLAN.
661 peer_name, peer_config, peer_rack = make_failover_peer_config(655 peer_name, peer_config, peer_rack = make_failover_peer_config(
662 vlan, rack_controller, ip_version656 vlan, rack_controller
663 )657 )
664 else:658 else:
665 peer_name, peer_config, peer_rack = None, None, None659 peer_name, peer_config, peer_rack = None, None, None
diff --git a/src/maasserver/tests/test_dhcp.py b/src/maasserver/tests/test_dhcp.py
index 6383535..dc2975a 100644
--- a/src/maasserver/tests/test_dhcp.py
+++ b/src/maasserver/tests/test_dhcp.py
@@ -815,16 +815,10 @@ class TestGetIPAddressForInterface(MAASServerTestCase):
815 interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL, vlan=vlan)815 interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL, vlan=vlan)
816 subnet = factory.make_Subnet(vlan=vlan)816 subnet = factory.make_Subnet(vlan=vlan)
817 ip_address = factory.make_StaticIPAddress(817 ip_address = factory.make_StaticIPAddress(
818 ip=factory.pick_ip_in_Subnet(subnet),818 alloc_type=IPADDRESS_TYPE.AUTO, subnet=subnet, interface=interface
819 alloc_type=IPADDRESS_TYPE.AUTO,
820 subnet=subnet,
821 interface=interface,
822 )819 )
823 self.assertEqual(820 self.assertEqual(
824 ip_address,821 ip_address, dhcp.get_ip_address_for_interface(interface, vlan)
825 dhcp.get_ip_address_for_interface(
826 interface, vlan, subnet.get_ip_version()
827 ),
828 )822 )
829823
830 def test_returns_None(self):824 def test_returns_None(self):
@@ -832,15 +826,10 @@ class TestGetIPAddressForInterface(MAASServerTestCase):
832 interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL, vlan=vlan)826 interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL, vlan=vlan)
833 subnet = factory.make_Subnet(vlan=vlan)827 subnet = factory.make_Subnet(vlan=vlan)
834 factory.make_StaticIPAddress(828 factory.make_StaticIPAddress(
835 ip=factory.pick_ip_in_Subnet(subnet),829 alloc_type=IPADDRESS_TYPE.AUTO, subnet=subnet, interface=interface
836 alloc_type=IPADDRESS_TYPE.AUTO,
837 subnet=subnet,
838 interface=interface,
839 )830 )
840 self.assertIsNone(831 self.assertIsNone(
841 dhcp.get_ip_address_for_interface(832 dhcp.get_ip_address_for_interface(interface, factory.make_VLAN())
842 interface, factory.make_VLAN(), subnet.get_ip_version()
843 )
844 )833 )
845834
846835
@@ -855,16 +844,11 @@ class TestGetIPAddressForRackController(MAASServerTestCase):
855 )844 )
856 subnet = factory.make_Subnet(vlan=vlan)845 subnet = factory.make_Subnet(vlan=vlan)
857 ip_address = factory.make_StaticIPAddress(846 ip_address = factory.make_StaticIPAddress(
858 ip=factory.pick_ip_in_Subnet(subnet),847 alloc_type=IPADDRESS_TYPE.AUTO, subnet=subnet, interface=interface
859 alloc_type=IPADDRESS_TYPE.AUTO,
860 subnet=subnet,
861 interface=interface,
862 )848 )
863 self.assertEqual(849 self.assertEqual(
864 ip_address,850 ip_address,
865 dhcp.get_ip_address_for_rack_controller(851 dhcp.get_ip_address_for_rack_controller(rack_controller, vlan),
866 rack_controller, vlan, subnet.get_ip_version()
867 ),
868 )852 )
869853
870 def test_returns_ip_address_from_best_interface_on_rack_controller(self):854 def test_returns_ip_address_from_best_interface_on_rack_controller(self):
@@ -884,10 +868,7 @@ class TestGetIPAddressForRackController(MAASServerTestCase):
884 )868 )
885 subnet = factory.make_Subnet(vlan=vlan)869 subnet = factory.make_Subnet(vlan=vlan)
886 factory.make_StaticIPAddress(870 factory.make_StaticIPAddress(
887 ip=factory.pick_ip_in_Subnet(subnet),871 alloc_type=IPADDRESS_TYPE.AUTO, subnet=subnet, interface=interface
888 alloc_type=IPADDRESS_TYPE.AUTO,
889 subnet=subnet,
890 interface=interface,
891 )872 )
892 bond_ip_address = factory.make_StaticIPAddress(873 bond_ip_address = factory.make_StaticIPAddress(
893 alloc_type=IPADDRESS_TYPE.AUTO,874 alloc_type=IPADDRESS_TYPE.AUTO,
@@ -896,9 +877,7 @@ class TestGetIPAddressForRackController(MAASServerTestCase):
896 )877 )
897 self.assertEqual(878 self.assertEqual(
898 bond_ip_address,879 bond_ip_address,
899 dhcp.get_ip_address_for_rack_controller(880 dhcp.get_ip_address_for_rack_controller(rack_controller, vlan),
900 rack_controller, vlan, subnet.get_ip_version()
901 ),
902 )881 )
903882
904883
@@ -2104,12 +2083,11 @@ class TestMakeFailoverPeerConfig(MAASServerTestCase):
2104 primary_rack=primary_rack,2083 primary_rack=primary_rack,
2105 secondary_rack=secondary_rack,2084 secondary_rack=secondary_rack,
2106 )2085 )
2107 subnet = factory.make_Subnet(vlan=vlan, version=4)2086 subnet = factory.make_Subnet(vlan=vlan)
2108 primary_interface = factory.make_Interface(2087 primary_interface = factory.make_Interface(
2109 INTERFACE_TYPE.PHYSICAL, node=primary_rack, vlan=vlan2088 INTERFACE_TYPE.PHYSICAL, node=primary_rack, vlan=vlan
2110 )2089 )
2111 primary_ip = factory.make_StaticIPAddress(2090 primary_ip = factory.make_StaticIPAddress(
2112 ip=factory.pick_ip_in_Subnet(subnet),
2113 alloc_type=IPADDRESS_TYPE.AUTO,2091 alloc_type=IPADDRESS_TYPE.AUTO,
2114 subnet=subnet,2092 subnet=subnet,
2115 interface=primary_interface,2093 interface=primary_interface,
@@ -2118,7 +2096,6 @@ class TestMakeFailoverPeerConfig(MAASServerTestCase):
2118 INTERFACE_TYPE.PHYSICAL, node=secondary_rack, vlan=vlan2096 INTERFACE_TYPE.PHYSICAL, node=secondary_rack, vlan=vlan
2119 )2097 )
2120 secondary_ip = factory.make_StaticIPAddress(2098 secondary_ip = factory.make_StaticIPAddress(
2121 ip=factory.pick_ip_in_Subnet(subnet),
2122 alloc_type=IPADDRESS_TYPE.AUTO,2099 alloc_type=IPADDRESS_TYPE.AUTO,
2123 subnet=subnet,2100 subnet=subnet,
2124 interface=secondary_interface,2101 interface=secondary_interface,
@@ -2135,7 +2112,7 @@ class TestMakeFailoverPeerConfig(MAASServerTestCase):
2135 },2112 },
2136 secondary_rack,2113 secondary_rack,
2137 ),2114 ),
2138 dhcp.make_failover_peer_config(vlan, primary_rack, 4),2115 dhcp.make_failover_peer_config(vlan, primary_rack),
2139 )2116 )
21402117
2141 def test_renders_config_for_secondary(self):2118 def test_renders_config_for_secondary(self):
@@ -2146,12 +2123,11 @@ class TestMakeFailoverPeerConfig(MAASServerTestCase):
2146 primary_rack=primary_rack,2123 primary_rack=primary_rack,
2147 secondary_rack=secondary_rack,2124 secondary_rack=secondary_rack,
2148 )2125 )
2149 subnet = factory.make_Subnet(vlan=vlan, version=4)2126 subnet = factory.make_Subnet(vlan=vlan)
2150 primary_interface = factory.make_Interface(2127 primary_interface = factory.make_Interface(
2151 INTERFACE_TYPE.PHYSICAL, node=primary_rack, vlan=vlan2128 INTERFACE_TYPE.PHYSICAL, node=primary_rack, vlan=vlan
2152 )2129 )
2153 primary_ip = factory.make_StaticIPAddress(2130 primary_ip = factory.make_StaticIPAddress(
2154 ip=factory.pick_ip_in_Subnet(subnet),
2155 alloc_type=IPADDRESS_TYPE.AUTO,2131 alloc_type=IPADDRESS_TYPE.AUTO,
2156 subnet=subnet,2132 subnet=subnet,
2157 interface=primary_interface,2133 interface=primary_interface,
@@ -2160,7 +2136,6 @@ class TestMakeFailoverPeerConfig(MAASServerTestCase):
2160 INTERFACE_TYPE.PHYSICAL, node=secondary_rack, vlan=vlan2136 INTERFACE_TYPE.PHYSICAL, node=secondary_rack, vlan=vlan
2161 )2137 )
2162 secondary_ip = factory.make_StaticIPAddress(2138 secondary_ip = factory.make_StaticIPAddress(
2163 ip=factory.pick_ip_in_Subnet(subnet),
2164 alloc_type=IPADDRESS_TYPE.AUTO,2139 alloc_type=IPADDRESS_TYPE.AUTO,
2165 subnet=subnet,2140 subnet=subnet,
2166 interface=secondary_interface,2141 interface=secondary_interface,
@@ -2177,78 +2152,7 @@ class TestMakeFailoverPeerConfig(MAASServerTestCase):
2177 },2152 },
2178 primary_rack,2153 primary_rack,
2179 ),2154 ),
2180 dhcp.make_failover_peer_config(vlan, secondary_rack, 4),2155 dhcp.make_failover_peer_config(vlan, secondary_rack),
2181 )
2182
2183 # See https://bugs.launchpad.net/maas/+bug/2027621
2184 def test_renders_config_for_secondary_should_not_mix_v4_and_v6_addresses(
2185 self,
2186 ):
2187 primary_rack = factory.make_RackController()
2188 secondary_rack = factory.make_RackController()
2189 vlan = factory.make_VLAN(
2190 dhcp_on=True,
2191 primary_rack=primary_rack,
2192 secondary_rack=secondary_rack,
2193 )
2194 subnet_v4 = factory.make_Subnet(vlan=vlan, version=4)
2195 subnet_v6 = factory.make_Subnet(vlan=vlan, version=6)
2196 primary_interface = factory.make_Interface(
2197 INTERFACE_TYPE.PHYSICAL, node=primary_rack, vlan=vlan
2198 )
2199 primary_ip_v4 = factory.make_StaticIPAddress(
2200 ip=factory.pick_ip_in_Subnet(subnet_v4),
2201 alloc_type=IPADDRESS_TYPE.AUTO,
2202 subnet=subnet_v4,
2203 interface=primary_interface,
2204 )
2205 primary_ip_v6 = factory.make_StaticIPAddress(
2206 ip=factory.pick_ip_in_Subnet(subnet_v6),
2207 alloc_type=IPADDRESS_TYPE.AUTO,
2208 subnet=subnet_v6,
2209 interface=primary_interface,
2210 )
2211 secondary_interface = factory.make_Interface(
2212 INTERFACE_TYPE.PHYSICAL, node=secondary_rack, vlan=vlan
2213 )
2214 secondary_ip_v4 = factory.make_StaticIPAddress(
2215 ip=factory.pick_ip_in_Subnet(subnet_v4),
2216 alloc_type=IPADDRESS_TYPE.AUTO,
2217 subnet=subnet_v4,
2218 interface=secondary_interface,
2219 )
2220 secondary_ip_v6 = factory.make_StaticIPAddress(
2221 ip=factory.pick_ip_in_Subnet(subnet_v6),
2222 alloc_type=IPADDRESS_TYPE.AUTO,
2223 subnet=subnet_v6,
2224 interface=secondary_interface,
2225 )
2226 failover_peer_name = "failover-vlan-%d" % vlan.id
2227 self.assertEqual(
2228 (
2229 failover_peer_name,
2230 {
2231 "name": failover_peer_name,
2232 "mode": "secondary",
2233 "address": str(secondary_ip_v4.ip),
2234 "peer_address": str(primary_ip_v4.ip),
2235 },
2236 primary_rack,
2237 ),
2238 dhcp.make_failover_peer_config(vlan, secondary_rack, 4),
2239 )
2240 self.assertEqual(
2241 (
2242 failover_peer_name,
2243 {
2244 "name": failover_peer_name,
2245 "mode": "secondary",
2246 "address": str(secondary_ip_v6.ip),
2247 "peer_address": str(primary_ip_v6.ip),
2248 },
2249 primary_rack,
2250 ),
2251 dhcp.make_failover_peer_config(vlan, secondary_rack, 6),
2252 )2156 )
22532157
22542158
diff --git a/src/metadataserver/builtin_scripts/commissioning_scripts/bmc_config.py b/src/metadataserver/builtin_scripts/commissioning_scripts/bmc_config.py
index 221289a..4da0512 100755
--- a/src/metadataserver/builtin_scripts/commissioning_scripts/bmc_config.py
+++ b/src/metadataserver/builtin_scripts/commissioning_scripts/bmc_config.py
@@ -162,7 +162,7 @@ class IPMI(BMCConfig):
162 password=None,162 password=None,
163 ipmi_k_g="",163 ipmi_k_g="",
164 ipmi_privilege_level="",164 ipmi_privilege_level="",
165 **kwargs,165 **kwargs
166 ):166 ):
167 self.username = username167 self.username = username
168 self.password = password168 self.password = password
@@ -174,7 +174,7 @@ class IPMI(BMCConfig):
174 def _bmc_get_config(self, section=None):174 def _bmc_get_config(self, section=None):
175 """Fetch and cache all BMC settings."""175 """Fetch and cache all BMC settings."""
176 print("INFO: Reading current IPMI BMC values...")176 print("INFO: Reading current IPMI BMC values...")
177 cmd = ["bmc-config", "--checkout", "--verbose"]177 cmd = ["bmc-config", "--checkout"]
178 if section:178 if section:
179 cmd += ["-S", section]179 cmd += ["-S", section]
180 try:180 try:
@@ -438,53 +438,41 @@ class IPMI(BMCConfig):
438 def _config_ipmi_lan_channel_settings(self):438 def _config_ipmi_lan_channel_settings(self):
439 """Enable IPMI-over-Lan (Lan_Channel) if it is disabled"""439 """Enable IPMI-over-Lan (Lan_Channel) if it is disabled"""
440 print("INFO: Configuring IPMI Lan_Channel...")440 print("INFO: Configuring IPMI Lan_Channel...")
441 lan_channel = self._bmc_config.get("Lan_Channel", {})
441442
442 for channel in [443 for key in [
443 "Lan_Channel",444 "Volatile_Access_Mode",
444 "Lan_Channel_Channel_1",445 "Non_Volatile_Access_Mode",
445 "Lan_Channel_Channel_2",
446 "Lan_Channel_Channel_3",
447 ]:446 ]:
448 lan_channel = self._bmc_config.get(channel, {})447 if lan_channel.get(key) != "Always_Available":
449448 print(
450 if not lan_channel:449 "INFO: Enabling BMC network access - Lan_Channel:%s" % key
451 continue450 )
452451 # Some BMC's don't support setting Lan_Channel (see LP: #1287274).
453 for key in [452 # If that happens, it would cause the script to fail preventing
454 "Volatile_Access_Mode",453 # the script from continuing. To address this, simply catch the
455 "Non_Volatile_Access_Mode",454 # error, return and allow the script to continue.
456 ]:455 try:
457 if lan_channel.get(key) != "Always_Available":456 self._bmc_set("Lan_Channel", key, "Always_Available")
457 except Exception:
458 print(458 print(
459 "INFO: Enabling BMC network access - %s:%s"459 "WARNING: Unable to set Lan_Channel:%s. "
460 % (channel, key)460 "BMC may be unavailable over the network!" % key
461 )461 )
462 # Some BMC's don't support setting Lan_Channel (see LP: #1287274).462
463 # If that happens, it would cause the script to fail preventing463 self._bmc_set_keys(
464 # the script from continuing. To address this, simply catch the464 "Lan_Channel",
465 # error, return and allow the script to continue.465 [
466 try:466 "%s_%s" % (auth_type, volatility)
467 self._bmc_set(channel, key, "Always_Available")467 for auth_type in [
468 except Exception:468 "Enable_User_Level_Auth",
469 print(469 "Enable_Per_Message_Auth",
470 "WARNING: Unable to set %s:%s. "470 "Enable_Pef_Alerting",
471 "BMC may be unavailable over the network!"471 ]
472 % (channel, key)472 for volatility in ["Volatile", "Non_Volatile"]
473 )473 ],
474474 "Yes",
475 self._bmc_set_keys(475 )
476 channel,
477 [
478 f"{auth_type}_{volatility}"
479 for auth_type in [
480 "Enable_User_Level_Auth",
481 "Enable_Per_Message_Auth",
482 "Enable_Pef_Alerting",
483 ]
484 for volatility in ["Volatile", "Non_Volatile"]
485 ],
486 "Yes",
487 )
488476
489 def _config_lan_conf_auth(self):477 def _config_lan_conf_auth(self):
490 """Configure Lan_Conf_Auth."""478 """Configure Lan_Conf_Auth."""
@@ -719,9 +707,6 @@ class IPMI(BMCConfig):
719 mac_address = None707 mac_address = None
720 for section_name, key in [708 for section_name, key in [
721 ("Lan_Conf", "IP_Address"),709 ("Lan_Conf", "IP_Address"),
722 ("Lan_Conf_Channel_1", "IP_Address"),
723 ("Lan_Conf_Channel_2", "IP_Address"),
724 ("Lan_Conf_Channel_3", "IP_Address"),
725 ("Lan6_Conf", "IPv6_Static_Addresses"),710 ("Lan6_Conf", "IPv6_Static_Addresses"),
726 ("Lan6_Conf", "IPv6_Dynamic_Addresses"),711 ("Lan6_Conf", "IPv6_Dynamic_Addresses"),
727 ]:712 ]:
@@ -744,28 +729,28 @@ class IPMI(BMCConfig):
744 time.sleep(2)729 time.sleep(2)
745 continue730 continue
746 if section_name.startswith("Lan6_"):731 if section_name.startswith("Lan6_"):
747 return section_name, "[%s]" % ip, mac_address732 return "[%s]" % ip, mac_address
748 return section_name, ip, mac_address733 return ip, mac_address
749 # No valid IP address was found.734 # No valid IP address was found.
750 return None, None, mac_address735 return None, mac_address
751736
752 def get_bmc_ip(self):737 def get_bmc_ip(self):
753 """Configure and retreive IPMI BMC IP."""738 """Configure and retreive IPMI BMC IP."""
754 section_name, ip_address, mac_address = self._get_bmc_ip()739 ip_address, mac_address = self._get_bmc_ip()
755 if ip_address:740 if ip_address:
756 return ip_address, mac_address741 return ip_address, mac_address
757 print("INFO: Attempting to enable preconfigured static IP on BMC...")742 print("INFO: Attempting to enable preconfigured static IP on BMC...")
758 self._bmc_set(section_name, "IP_Address_Source", "Static")743 self._bmc_set("Lan_Conf", "IP_Address_Source", "Static")
759 for _ in range(6):744 for _ in range(6):
760 time.sleep(10)745 time.sleep(10)
761 _, ip_address, mac_address = self._get_bmc_ip(True)746 ip_address, mac_address = self._get_bmc_ip(True)
762 if ip_address:747 if ip_address:
763 return ip_address, mac_address748 return ip_address, mac_address
764 print("INFO: Attempting to enable DHCP on BMC...")749 print("INFO: Attempting to enable DHCP on BMC...")
765 self._bmc_set(section_name, "IP_Address_Source", "Use_DHCP")750 self._bmc_set("Lan_Conf", "IP_Address_Source", "Use_DHCP")
766 for _ in range(6):751 for _ in range(6):
767 time.sleep(10)752 time.sleep(10)
768 _, ip_address, mac_address = self._get_bmc_ip(True)753 ip_address, mac_address = self._get_bmc_ip(True)
769 if ip_address:754 if ip_address:
770 print("WARNING: BMC is configured to use DHCP!")755 print("WARNING: BMC is configured to use DHCP!")
771 return ip_address, mac_address756 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 73e84b0..90f4af1 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
@@ -538,25 +538,20 @@ EndSection
538 self.assertRaises(SystemExit, self.ipmi.add_bmc_user)538 self.assertRaises(SystemExit, self.ipmi.add_bmc_user)
539539
540 def test_set_ipmi_lan_channel_setting_verifies(self):540 def test_set_ipmi_lan_channel_setting_verifies(self):
541541 self.ipmi._bmc_config = {
542 for channel in [542 "Lan_Channel": {
543 "Lan_Channel",543 "Volatile_Access_Mode": "Always_Available",
544 "Lan_Channel_Channel_1",544 "Non_Volatile_Access_Mode": "Always_Available",
545 "Lan_Channel_Channel_2",
546 "Lan_Channel_Channel_3",
547 ]:
548 self.ipmi._bmc_config = {
549 channel: {
550 "Volatile_Access_Mode": "Always_Available",
551 "Non_Volatile_Access_Mode": "Always_Available",
552 },
553 }545 }
554 mock_bmc_set = self.patch(self.ipmi, "_bmc_set")546 }
555 mock_bmc_set_keys = self.patch(self.ipmi, "_bmc_set_keys")547 mock_bmc_set = self.patch(self.ipmi, "_bmc_set")
556 self.ipmi._config_ipmi_lan_channel_settings()548 mock_bmc_set_keys = self.patch(self.ipmi, "_bmc_set_keys")
557 self.assertFalse(mock_bmc_set.called)549 self.ipmi._config_ipmi_lan_channel_settings()
558 mock_bmc_set_keys.assert_called_once_with(550 self.assertThat(mock_bmc_set, MockNotCalled())
559 channel,551 self.assertThat(
552 mock_bmc_set_keys,
553 MockCalledOnceWith(
554 "Lan_Channel",
560 [555 [
561 "%s_%s" % (auth_type, volatility)556 "%s_%s" % (auth_type, volatility)
562 for auth_type in [557 for auth_type in [
@@ -567,36 +562,36 @@ EndSection
567 for volatility in ["Volatile", "Non_Volatile"]562 for volatility in ["Volatile", "Non_Volatile"]
568 ],563 ],
569 "Yes",564 "Yes",
570 )565 ),
566 )
571567
572 def test_set_ipmi_lan_channel_setting_enables(self):568 def test_set_ipmi_lan_channel_setting_enables(self):
573 for channel in [569 self.ipmi._bmc_config = {
574 "Lan_Channel",570 "Lan_Channel": {
575 "Lan_Channel_Channel_1",571 "Volatile_Access_Mode": "Disabled",
576 "Lan_Channel_Channel_2",572 "Non_Volatile_Access_Mode": "Pre_Boot_only",
577 "Lan_Channel_Channel_3",
578 ]:
579 self.ipmi._bmc_config = {
580 channel: {
581 "Volatile_Access_Mode": "Disabled",
582 "Non_Volatile_Access_Mode": "Pre_Boot_only",
583 },
584 }573 }
585 mock_bmc_set = self.patch(self.ipmi, "_bmc_set")574 }
586 mock_bmc_set_keys = self.patch(self.ipmi, "_bmc_set_keys")575 mock_bmc_set = self.patch(self.ipmi, "_bmc_set")
587 self.ipmi._config_ipmi_lan_channel_settings()576 mock_bmc_set_keys = self.patch(self.ipmi, "_bmc_set_keys")
588 mock_bmc_set.assert_has_calls(577 self.ipmi._config_ipmi_lan_channel_settings()
589 (578 self.assertThat(
590 call(channel, "Volatile_Access_Mode", "Always_Available"),579 mock_bmc_set,
591 call(580 MockCallsMatch(
592 channel,581 call(
593 "Non_Volatile_Access_Mode",582 "Lan_Channel", "Volatile_Access_Mode", "Always_Available"
594 "Always_Available",583 ),
595 ),584 call(
596 )585 "Lan_Channel",
597 )586 "Non_Volatile_Access_Mode",
598 mock_bmc_set_keys.assert_called_once_with(587 "Always_Available",
599 channel,588 ),
589 ),
590 )
591 self.assertThat(
592 mock_bmc_set_keys,
593 MockCalledOnceWith(
594 "Lan_Channel",
600 [595 [
601 "%s_%s" % (auth_type, volatility)596 "%s_%s" % (auth_type, volatility)
602 for auth_type in [597 for auth_type in [
@@ -607,7 +602,8 @@ EndSection
607 for volatility in ["Volatile", "Non_Volatile"]602 for volatility in ["Volatile", "Non_Volatile"]
608 ],603 ],
609 "Yes",604 "Yes",
610 )605 ),
606 )
611607
612 def test_config_lan_conf_auth(self):608 def test_config_lan_conf_auth(self):
613 self.ipmi._bmc_config = {"Lan_Channel_Auth": {}}609 self.ipmi._bmc_config = {"Lan_Channel_Auth": {}}
@@ -947,9 +943,7 @@ EndSection
947 "MAC_Address": mac_address,943 "MAC_Address": mac_address,
948 }944 }
949 }945 }
950 self.assertEqual(946 self.assertEqual((ip, mac_address), self.ipmi._get_bmc_ip())
951 ("Lan_Conf", ip, mac_address), self.ipmi._get_bmc_ip()
952 )
953947
954 def test_get_bmc_ipv6_static(self):948 def test_get_bmc_ipv6_static(self):
955 ip = factory.make_ipv6_address()949 ip = factory.make_ipv6_address()
@@ -960,9 +954,7 @@ EndSection
960 "MAC_Address": mac_address,954 "MAC_Address": mac_address,
961 }955 }
962 }956 }
963 self.assertEqual(957 self.assertEqual((f"[{ip}]", mac_address), self.ipmi._get_bmc_ip())
964 ("Lan6_Conf", f"[{ip}]", mac_address), self.ipmi._get_bmc_ip()
965 )
966958
967 def test_get_bmc_ipv6_dynamic(self):959 def test_get_bmc_ipv6_dynamic(self):
968 ip = factory.make_ipv6_address()960 ip = factory.make_ipv6_address()
@@ -973,9 +965,7 @@ EndSection
973 "MAC_Address": mac_address,965 "MAC_Address": mac_address,
974 }966 }
975 }967 }
976 self.assertEqual(968 self.assertEqual((f"[{ip}]", mac_address), self.ipmi._get_bmc_ip())
977 ("Lan6_Conf", f"[{ip}]", mac_address), self.ipmi._get_bmc_ip()
978 )
979969
980 def test_get_bmc_ipv6_gets_mac_From_ipv4(self):970 def test_get_bmc_ipv6_gets_mac_From_ipv4(self):
981 ip = factory.make_ipv6_address()971 ip = factory.make_ipv6_address()
@@ -984,20 +974,18 @@ EndSection
984 "Lan_Conf": {"MAC_Address": mac_address},974 "Lan_Conf": {"MAC_Address": mac_address},
985 "Lan6_Conf": {"IPv6_Dynamic_Addresses": ip},975 "Lan6_Conf": {"IPv6_Dynamic_Addresses": ip},
986 }976 }
987 self.assertEqual(977 self.assertEqual((f"[{ip}]", mac_address), self.ipmi._get_bmc_ip())
988 ("Lan6_Conf", f"[{ip}]", mac_address), self.ipmi._get_bmc_ip()
989 )
990978
991 def test_get_bmc_ip_finds_none(self):979 def test_get_bmc_ip_finds_none(self):
992 self.patch(self.ipmi, "_bmc_get").return_value = ""980 self.patch(self.ipmi, "_bmc_get").return_value = ""
993 self.assertEqual((None, None, None), self.ipmi._get_bmc_ip())981 self.assertEqual((None, None), self.ipmi._get_bmc_ip())
994982
995 def test_get_bmc_ip(self):983 def test_get_bmc_ip(self):
996 ip = factory.make_ip_address()984 ip = factory.make_ip_address()
997 mac_address = factory.make_mac_address()985 mac_address = factory.make_mac_address()
998 mock_bmc_set = self.patch(self.ipmi, "_bmc_set")986 mock_bmc_set = self.patch(self.ipmi, "_bmc_set")
999 mock_get_bmc_ip = self.patch(self.ipmi, "_get_bmc_ip")987 mock_get_bmc_ip = self.patch(self.ipmi, "_get_bmc_ip")
1000 mock_get_bmc_ip.return_value = None, ip, mac_address988 mock_get_bmc_ip.return_value = ip, mac_address
1001989
1002 self.assertEqual((ip, mac_address), self.ipmi.get_bmc_ip())990 self.assertEqual((ip, mac_address), self.ipmi.get_bmc_ip())
1003 self.assertThat(mock_bmc_set, MockNotCalled())991 self.assertThat(mock_bmc_set, MockNotCalled())
@@ -1009,9 +997,9 @@ EndSection
1009 mock_bmc_set = self.patch(self.ipmi, "_bmc_set")997 mock_bmc_set = self.patch(self.ipmi, "_bmc_set")
1010 mock_get_bmc_ip = self.patch(self.ipmi, "_get_bmc_ip")998 mock_get_bmc_ip = self.patch(self.ipmi, "_get_bmc_ip")
1011 mock_get_bmc_ip.side_effect = (999 mock_get_bmc_ip.side_effect = (
1012 ("Lan_Conf", None, mac_address),1000 (None, mac_address),
1013 ("Lan_Conf", None, mac_address),1001 (None, mac_address),
1014 ("Lan_Conf", ip, mac_address),1002 (ip, mac_address),
1015 )1003 )
10161004
1017 self.assertEqual((ip, mac_address), self.ipmi.get_bmc_ip())1005 self.assertEqual((ip, mac_address), self.ipmi.get_bmc_ip())
@@ -1029,8 +1017,8 @@ EndSection
1029 mock_bmc_set = self.patch(self.ipmi, "_bmc_set")1017 mock_bmc_set = self.patch(self.ipmi, "_bmc_set")
1030 mock_get_bmc_ip = self.patch(self.ipmi, "_get_bmc_ip")1018 mock_get_bmc_ip = self.patch(self.ipmi, "_get_bmc_ip")
1031 mock_get_bmc_ip.side_effect = (1019 mock_get_bmc_ip.side_effect = (
1032 *[("Lan_Conf", None, mac_address) for _ in range(8)],1020 *[(None, mac_address) for _ in range(8)],
1033 ("Lan_Conf", ip, mac_address),1021 (ip, mac_address),
1034 )1022 )
10351023
1036 self.assertEqual((ip, mac_address), self.ipmi.get_bmc_ip())1024 self.assertEqual((ip, mac_address), self.ipmi.get_bmc_ip())
@@ -1041,7 +1029,6 @@ EndSection
1041 call("Lan_Conf", "IP_Address_Source", "Use_DHCP"),1029 call("Lan_Conf", "IP_Address_Source", "Use_DHCP"),
1042 ),1030 ),
1043 )1031 )
1044
1045 self.assertThat(1032 self.assertThat(
1046 mock_get_bmc_ip,1033 mock_get_bmc_ip,
1047 MockCallsMatch(call(), *[call(True) for _ in range(8)]),1034 MockCallsMatch(call(), *[call(True) for _ in range(8)]),
@@ -1050,7 +1037,7 @@ EndSection
1050 def test_get_bmc_ip_fails(self):1037 def test_get_bmc_ip_fails(self):
1051 mock_bmc_set = self.patch(self.ipmi, "_bmc_set")1038 mock_bmc_set = self.patch(self.ipmi, "_bmc_set")
1052 mock_get_bmc_ip = self.patch(self.ipmi, "_get_bmc_ip")1039 mock_get_bmc_ip = self.patch(self.ipmi, "_get_bmc_ip")
1053 mock_get_bmc_ip.return_value = ("Lan_Conf", None, None)1040 mock_get_bmc_ip.return_value = (None, None)
10541041
1055 self.assertRaises(SystemExit, self.ipmi.get_bmc_ip)1042 self.assertRaises(SystemExit, self.ipmi.get_bmc_ip)
1056 self.assertThat(1043 self.assertThat(

Subscribers

People subscribed via source and target branches