Merge ~alexsander-souza/maas:lp1979403_to_3_3 into maas:3.3

Proposed by Alexsander de Souza
Status: Merged
Approved by: Alexsander de Souza
Approved revision: 1cc42682aa433cfd3e83a61b070c80a97bb02ae7
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~alexsander-souza/maas:lp1979403_to_3_3
Merge into: maas:3.3
Diff against target: 365 lines (+122/-94)
3 files modified
creds.yaml (+0/-0)
src/metadataserver/builtin_scripts/commissioning_scripts/bmc_config.py (+55/-40)
src/metadataserver/builtin_scripts/commissioning_scripts/tests/test_bmc_config.py (+67/-54)
Reviewer Review Type Date Requested Status
Alexsander de Souza Approve
MAAS Lander Approve
Review via email: mp+442141@code.launchpad.net

Commit message

Adding Lan_Conf_Channel_1 to 3

BMC with multiple channel can't find ip
so added Lan_Conf_Channel_1 to 3 to support them

(cherry picked from commit 9597b3b7457ccf202724f4b6dd8a7470695a6c24)

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

UNIT TESTS
-b lp1979403_to_3_3 lp:~alexsander-souza/maas/+git/maas into -b 3.3 lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci.internal:8080/job/maas-tester/2456/console
COMMIT: 1cc42682aa433cfd3e83a61b070c80a97bb02ae7

review: Needs Fixing
Revision history for this message
Alexsander de Souza (alexsander-souza) wrote :

jenkins: !test

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

UNIT TESTS
-b lp1979403_to_3_3 lp:~alexsander-souza/maas/+git/maas into -b 3.3 lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 1cc42682aa433cfd3e83a61b070c80a97bb02ae7

review: Approve
Revision history for this message
Alexsander de Souza (alexsander-souza) wrote :

self-approving backport

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
0new file mode 1006440new 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):
226 def _bmc_get_config(self, section=None):226 def _bmc_get_config(self, section=None):
227 """Fetch and cache all BMC settings."""227 """Fetch and cache all BMC settings."""
228 print("INFO: Reading current IPMI BMC values...")228 print("INFO: Reading current IPMI BMC values...")
229 cmd = ["bmc-config", "--checkout"]229 cmd = ["bmc-config", "--checkout", "--verbose"]
230 if section:230 if section:
231 cmd += ["-S", section]231 cmd += ["-S", section]
232 try:232 try:
@@ -392,41 +392,53 @@ class IPMIBase(BMCConfig):
392 def _config_ipmi_lan_channel_settings(self):392 def _config_ipmi_lan_channel_settings(self):
393 """Enable IPMI-over-Lan (Lan_Channel) if it is disabled"""393 """Enable IPMI-over-Lan (Lan_Channel) if it is disabled"""
394 print("INFO: Configuring IPMI Lan_Channel...")394 print("INFO: Configuring IPMI Lan_Channel...")
395 lan_channel = self._bmc_config.get("Lan_Channel", {})
396395
397 for key in [396 for channel in [
398 "Volatile_Access_Mode",397 "Lan_Channel",
399 "Non_Volatile_Access_Mode",398 "Lan_Channel_Channel_1",
399 "Lan_Channel_Channel_2",
400 "Lan_Channel_Channel_3",
400 ]:401 ]:
401 if lan_channel.get(key) != "Always_Available":402 lan_channel = self._bmc_config.get(channel, {})
402 print(403
403 "INFO: Enabling BMC network access - Lan_Channel:%s" % key404 if not lan_channel:
404 )405 continue
405 # Some BMC's don't support setting Lan_Channel (see LP: #1287274).406
406 # If that happens, it would cause the script to fail preventing407 for key in [
407 # the script from continuing. To address this, simply catch the408 "Volatile_Access_Mode",
408 # error, return and allow the script to continue.409 "Non_Volatile_Access_Mode",
409 try:410 ]:
410 self._bmc_set("Lan_Channel", key, "Always_Available")411 if lan_channel.get(key) != "Always_Available":
411 except Exception:
412 print(412 print(
413 "WARNING: Unable to set Lan_Channel:%s. "413 "INFO: Enabling BMC network access - %s:%s"
414 "BMC may be unavailable over the network!" % key414 % (channel, key)
415 )415 )
416416 # Some BMC's don't support setting Lan_Channel (see LP: #1287274).
417 self._bmc_set_keys(417 # If that happens, it would cause the script to fail preventing
418 "Lan_Channel",418 # the script from continuing. To address this, simply catch the
419 [419 # error, return and allow the script to continue.
420 f"{auth_type}_{volatility}"420 try:
421 for auth_type in [421 self._bmc_set(channel, key, "Always_Available")
422 "Enable_User_Level_Auth",422 except Exception:
423 "Enable_Per_Message_Auth",423 print(
424 "Enable_Pef_Alerting",424 "WARNING: Unable to set %s:%s. "
425 ]425 "BMC may be unavailable over the network!"
426 for volatility in ["Volatile", "Non_Volatile"]426 % (channel, key)
427 ],427 )
428 "Yes",428
429 )429 self._bmc_set_keys(
430 channel,
431 [
432 f"{auth_type}_{volatility}"
433 for auth_type in [
434 "Enable_User_Level_Auth",
435 "Enable_Per_Message_Auth",
436 "Enable_Pef_Alerting",
437 ]
438 for volatility in ["Volatile", "Non_Volatile"]
439 ],
440 "Yes",
441 )
430442
431 def _config_lan_conf_auth(self):443 def _config_lan_conf_auth(self):
432 """Configure Lan_Conf_Auth."""444 """Configure Lan_Conf_Auth."""
@@ -577,6 +589,9 @@ class IPMI(IPMIBase):
577 mac_address = None589 mac_address = None
578 for section_name, key in [590 for section_name, key in [
579 ("Lan_Conf", "IP_Address"),591 ("Lan_Conf", "IP_Address"),
592 ("Lan_Conf_Channel_1", "IP_Address"),
593 ("Lan_Conf_Channel_2", "IP_Address"),
594 ("Lan_Conf_Channel_3", "IP_Address"),
580 ("Lan6_Conf", "IPv6_Static_Addresses"),595 ("Lan6_Conf", "IPv6_Static_Addresses"),
581 ("Lan6_Conf", "IPv6_Dynamic_Addresses"),596 ("Lan6_Conf", "IPv6_Dynamic_Addresses"),
582 ]:597 ]:
@@ -599,28 +614,28 @@ class IPMI(IPMIBase):
599 time.sleep(2)614 time.sleep(2)
600 continue615 continue
601 if section_name.startswith("Lan6_"):616 if section_name.startswith("Lan6_"):
602 return "[%s]" % ip, mac_address617 return section_name, "[%s]" % ip, mac_address
603 return ip, mac_address618 return section_name, ip, mac_address
604 # No valid IP address was found.619 # No valid IP address was found.
605 return None, mac_address620 return None, None, mac_address
606621
607 def get_bmc_ip(self):622 def get_bmc_ip(self):
608 """Configure and retreive IPMI BMC IP."""623 """Configure and retreive IPMI BMC IP."""
609 ip_address, mac_address = self._get_bmc_ip()624 section_name, ip_address, mac_address = self._get_bmc_ip()
610 if ip_address:625 if ip_address:
611 return ip_address, mac_address626 return ip_address, mac_address
612 print("INFO: Attempting to enable preconfigured static IP on BMC...")627 print("INFO: Attempting to enable preconfigured static IP on BMC...")
613 self._bmc_set("Lan_Conf", "IP_Address_Source", "Static")628 self._bmc_set(section_name, "IP_Address_Source", "Static")
614 for _ in range(6):629 for _ in range(6):
615 time.sleep(10)630 time.sleep(10)
616 ip_address, mac_address = self._get_bmc_ip(True)631 _, ip_address, mac_address = self._get_bmc_ip(True)
617 if ip_address:632 if ip_address:
618 return ip_address, mac_address633 return ip_address, mac_address
619 print("INFO: Attempting to enable DHCP on BMC...")634 print("INFO: Attempting to enable DHCP on BMC...")
620 self._bmc_set("Lan_Conf", "IP_Address_Source", "Use_DHCP")635 self._bmc_set(section_name, "IP_Address_Source", "Use_DHCP")
621 for _ in range(6):636 for _ in range(6):
622 time.sleep(10)637 time.sleep(10)
623 ip_address, mac_address = self._get_bmc_ip(True)638 _, ip_address, mac_address = self._get_bmc_ip(True)
624 if ip_address:639 if ip_address:
625 print("WARNING: BMC is configured to use DHCP!")640 print("WARNING: BMC is configured to use DHCP!")
626 return ip_address, mac_address641 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 1fced30..ea4b710 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
490 self.assertRaises(SystemExit, self.ipmi.add_bmc_user)490 self.assertRaises(SystemExit, self.ipmi.add_bmc_user)
491491
492 def test_set_ipmi_lan_channel_setting_verifies(self):492 def test_set_ipmi_lan_channel_setting_verifies(self):
493 self.ipmi._bmc_config = {493
494 "Lan_Channel": {494 for channel in [
495 "Volatile_Access_Mode": "Always_Available",495 "Lan_Channel",
496 "Non_Volatile_Access_Mode": "Always_Available",496 "Lan_Channel_Channel_1",
497 "Lan_Channel_Channel_2",
498 "Lan_Channel_Channel_3",
499 ]:
500 self.ipmi._bmc_config = {
501 channel: {
502 "Volatile_Access_Mode": "Always_Available",
503 "Non_Volatile_Access_Mode": "Always_Available",
504 },
497 }505 }
498 }506 mock_bmc_set = self.patch(self.ipmi, "_bmc_set")
499 mock_bmc_set = self.patch(self.ipmi, "_bmc_set")507 mock_bmc_set_keys = self.patch(self.ipmi, "_bmc_set_keys")
500 mock_bmc_set_keys = self.patch(self.ipmi, "_bmc_set_keys")508 self.ipmi._config_ipmi_lan_channel_settings()
501 self.ipmi._config_ipmi_lan_channel_settings()509 self.assertFalse(mock_bmc_set.called)
502 self.assertThat(mock_bmc_set, MockNotCalled())510 mock_bmc_set_keys.assert_called_once_with(
503 self.assertThat(511 channel,
504 mock_bmc_set_keys,
505 MockCalledOnceWith(
506 "Lan_Channel",
507 [512 [
508 f"{auth_type}_{volatility}"513 f"{auth_type}_{volatility}"
509 for auth_type in [514 for auth_type in [
@@ -514,36 +519,36 @@ EndSection
514 for volatility in ["Volatile", "Non_Volatile"]519 for volatility in ["Volatile", "Non_Volatile"]
515 ],520 ],
516 "Yes",521 "Yes",
517 ),522 )
518 )
519523
520 def test_set_ipmi_lan_channel_setting_enables(self):524 def test_set_ipmi_lan_channel_setting_enables(self):
521 self.ipmi._bmc_config = {525 for channel in [
522 "Lan_Channel": {526 "Lan_Channel",
523 "Volatile_Access_Mode": "Disabled",527 "Lan_Channel_Channel_1",
524 "Non_Volatile_Access_Mode": "Pre_Boot_only",528 "Lan_Channel_Channel_2",
529 "Lan_Channel_Channel_3",
530 ]:
531 self.ipmi._bmc_config = {
532 channel: {
533 "Volatile_Access_Mode": "Disabled",
534 "Non_Volatile_Access_Mode": "Pre_Boot_only",
535 },
525 }536 }
526 }537 mock_bmc_set = self.patch(self.ipmi, "_bmc_set")
527 mock_bmc_set = self.patch(self.ipmi, "_bmc_set")538 mock_bmc_set_keys = self.patch(self.ipmi, "_bmc_set_keys")
528 mock_bmc_set_keys = self.patch(self.ipmi, "_bmc_set_keys")539 self.ipmi._config_ipmi_lan_channel_settings()
529 self.ipmi._config_ipmi_lan_channel_settings()540 mock_bmc_set.assert_has_calls(
530 self.assertThat(541 (
531 mock_bmc_set,542 call(channel, "Volatile_Access_Mode", "Always_Available"),
532 MockCallsMatch(543 call(
533 call(544 channel,
534 "Lan_Channel", "Volatile_Access_Mode", "Always_Available"545 "Non_Volatile_Access_Mode",
535 ),546 "Always_Available",
536 call(547 ),
537 "Lan_Channel",548 )
538 "Non_Volatile_Access_Mode",549 )
539 "Always_Available",550 mock_bmc_set_keys.assert_called_once_with(
540 ),551 channel,
541 ),
542 )
543 self.assertThat(
544 mock_bmc_set_keys,
545 MockCalledOnceWith(
546 "Lan_Channel",
547 [552 [
548 f"{auth_type}_{volatility}"553 f"{auth_type}_{volatility}"
549 for auth_type in [554 for auth_type in [
@@ -554,8 +559,7 @@ EndSection
554 for volatility in ["Volatile", "Non_Volatile"]559 for volatility in ["Volatile", "Non_Volatile"]
555 ],560 ],
556 "Yes",561 "Yes",
557 ),562 )
558 )
559563
560 def test_config_lan_conf_auth(self):564 def test_config_lan_conf_auth(self):
561 self.ipmi._bmc_config = {"Lan_Channel_Auth": {}}565 self.ipmi._bmc_config = {"Lan_Channel_Auth": {}}
@@ -718,7 +722,9 @@ EndSection
718 "MAC_Address": mac_address,722 "MAC_Address": mac_address,
719 }723 }
720 }724 }
721 self.assertEqual((ip, mac_address), self.ipmi._get_bmc_ip())725 self.assertEqual(
726 ("Lan_Conf", ip, mac_address), self.ipmi._get_bmc_ip()
727 )
722728
723 def test_get_bmc_ipv6_static(self):729 def test_get_bmc_ipv6_static(self):
724 ip = factory.make_ipv6_address()730 ip = factory.make_ipv6_address()
@@ -729,7 +735,9 @@ EndSection
729 "MAC_Address": mac_address,735 "MAC_Address": mac_address,
730 }736 }
731 }737 }
732 self.assertEqual((f"[{ip}]", mac_address), self.ipmi._get_bmc_ip())738 self.assertEqual(
739 ("Lan6_Conf", f"[{ip}]", mac_address), self.ipmi._get_bmc_ip()
740 )
733741
734 def test_get_bmc_ipv6_dynamic(self):742 def test_get_bmc_ipv6_dynamic(self):
735 ip = factory.make_ipv6_address()743 ip = factory.make_ipv6_address()
@@ -740,7 +748,9 @@ EndSection
740 "MAC_Address": mac_address,748 "MAC_Address": mac_address,
741 }749 }
742 }750 }
743 self.assertEqual((f"[{ip}]", mac_address), self.ipmi._get_bmc_ip())751 self.assertEqual(
752 ("Lan6_Conf", f"[{ip}]", mac_address), self.ipmi._get_bmc_ip()
753 )
744754
745 def test_get_bmc_ipv6_gets_mac_From_ipv4(self):755 def test_get_bmc_ipv6_gets_mac_From_ipv4(self):
746 ip = factory.make_ipv6_address()756 ip = factory.make_ipv6_address()
@@ -749,18 +759,20 @@ EndSection
749 "Lan_Conf": {"MAC_Address": mac_address},759 "Lan_Conf": {"MAC_Address": mac_address},
750 "Lan6_Conf": {"IPv6_Dynamic_Addresses": ip},760 "Lan6_Conf": {"IPv6_Dynamic_Addresses": ip},
751 }761 }
752 self.assertEqual((f"[{ip}]", mac_address), self.ipmi._get_bmc_ip())762 self.assertEqual(
763 ("Lan6_Conf", f"[{ip}]", mac_address), self.ipmi._get_bmc_ip()
764 )
753765
754 def test_get_bmc_ip_finds_none(self):766 def test_get_bmc_ip_finds_none(self):
755 self.patch(self.ipmi, "_bmc_get").return_value = ""767 self.patch(self.ipmi, "_bmc_get").return_value = ""
756 self.assertEqual((None, None), self.ipmi._get_bmc_ip())768 self.assertEqual((None, None, None), self.ipmi._get_bmc_ip())
757769
758 def test_get_bmc_ip(self):770 def test_get_bmc_ip(self):
759 ip = factory.make_ip_address()771 ip = factory.make_ip_address()
760 mac_address = factory.make_mac_address()772 mac_address = factory.make_mac_address()
761 mock_bmc_set = self.patch(self.ipmi, "_bmc_set")773 mock_bmc_set = self.patch(self.ipmi, "_bmc_set")
762 mock_get_bmc_ip = self.patch(self.ipmi, "_get_bmc_ip")774 mock_get_bmc_ip = self.patch(self.ipmi, "_get_bmc_ip")
763 mock_get_bmc_ip.return_value = ip, mac_address775 mock_get_bmc_ip.return_value = None, ip, mac_address
764776
765 self.assertEqual((ip, mac_address), self.ipmi.get_bmc_ip())777 self.assertEqual((ip, mac_address), self.ipmi.get_bmc_ip())
766 self.assertThat(mock_bmc_set, MockNotCalled())778 self.assertThat(mock_bmc_set, MockNotCalled())
@@ -772,9 +784,9 @@ EndSection
772 mock_bmc_set = self.patch(self.ipmi, "_bmc_set")784 mock_bmc_set = self.patch(self.ipmi, "_bmc_set")
773 mock_get_bmc_ip = self.patch(self.ipmi, "_get_bmc_ip")785 mock_get_bmc_ip = self.patch(self.ipmi, "_get_bmc_ip")
774 mock_get_bmc_ip.side_effect = (786 mock_get_bmc_ip.side_effect = (
775 (None, mac_address),787 ("Lan_Conf", None, mac_address),
776 (None, mac_address),788 ("Lan_Conf", None, mac_address),
777 (ip, mac_address),789 ("Lan_Conf", ip, mac_address),
778 )790 )
779791
780 self.assertEqual((ip, mac_address), self.ipmi.get_bmc_ip())792 self.assertEqual((ip, mac_address), self.ipmi.get_bmc_ip())
@@ -792,8 +804,8 @@ EndSection
792 mock_bmc_set = self.patch(self.ipmi, "_bmc_set")804 mock_bmc_set = self.patch(self.ipmi, "_bmc_set")
793 mock_get_bmc_ip = self.patch(self.ipmi, "_get_bmc_ip")805 mock_get_bmc_ip = self.patch(self.ipmi, "_get_bmc_ip")
794 mock_get_bmc_ip.side_effect = (806 mock_get_bmc_ip.side_effect = (
795 *[(None, mac_address) for _ in range(8)],807 *[("Lan_Conf", None, mac_address) for _ in range(8)],
796 (ip, mac_address),808 ("Lan_Conf", ip, mac_address),
797 )809 )
798810
799 self.assertEqual((ip, mac_address), self.ipmi.get_bmc_ip())811 self.assertEqual((ip, mac_address), self.ipmi.get_bmc_ip())
@@ -804,6 +816,7 @@ EndSection
804 call("Lan_Conf", "IP_Address_Source", "Use_DHCP"),816 call("Lan_Conf", "IP_Address_Source", "Use_DHCP"),
805 ),817 ),
806 )818 )
819
807 self.assertThat(820 self.assertThat(
808 mock_get_bmc_ip,821 mock_get_bmc_ip,
809 MockCallsMatch(call(), *[call(True) for _ in range(8)]),822 MockCallsMatch(call(), *[call(True) for _ in range(8)]),
@@ -812,7 +825,7 @@ EndSection
812 def test_get_bmc_ip_fails(self):825 def test_get_bmc_ip_fails(self):
813 mock_bmc_set = self.patch(self.ipmi, "_bmc_set")826 mock_bmc_set = self.patch(self.ipmi, "_bmc_set")
814 mock_get_bmc_ip = self.patch(self.ipmi, "_get_bmc_ip")827 mock_get_bmc_ip = self.patch(self.ipmi, "_get_bmc_ip")
815 mock_get_bmc_ip.return_value = (None, None)828 mock_get_bmc_ip.return_value = ("Lan_Conf", None, None)
816829
817 self.assertRaises(SystemExit, self.ipmi.get_bmc_ip)830 self.assertRaises(SystemExit, self.ipmi.get_bmc_ip)
818 self.assertThat(831 self.assertThat(

Subscribers

People subscribed via source and target branches