@@ -1509,6 +1509,133 @@ def test_list_hardware_info(self, mocked_get_hostname, mocked_lshw):
15091509 self .assertEqual ('mock_hostname' , hardware_info ['hostname' ])
15101510 mocked_lshw .assert_called_once_with (self .hardware )
15111511
1512+ @mock .patch .object (hardware , 'get_cached_node' , autospec = True )
1513+ @mock .patch .object (hardware .GenericHardwareManager ,
1514+ '_get_system_lshw_dict' , autospec = True ,
1515+ return_value = {'id' : 'host' })
1516+ @mock .patch .object (netutils , 'get_hostname' , autospec = True )
1517+ def test_list_hardware_info_with_bmc_caching (
1518+ self , mocked_get_hostname , mocked_lshw , mocked_get_node ):
1519+ """Test that BMC information is cached after first detection."""
1520+ mocked_get_node .return_value = None # No skip_bmc_detect flag
1521+
1522+ # Mock all the hardware info methods
1523+ self .hardware .list_network_interfaces = mock .Mock (return_value = [])
1524+ self .hardware .get_cpus = mock .Mock ()
1525+ self .hardware .get_memory = mock .Mock ()
1526+ self .hardware .list_block_devices = mock .Mock (return_value = [])
1527+ self .hardware .get_boot_info = mock .Mock ()
1528+ self .hardware .get_system_vendor_info = mock .Mock ()
1529+ mocked_get_hostname .return_value = 'mock_hostname'
1530+
1531+ # Mock BMC methods
1532+ self .hardware .get_bmc_address = mock .Mock (return_value = '192.168.1.1' )
1533+ self .hardware .get_bmc_v6address = mock .Mock (return_value = 'fe80::1' )
1534+ self .hardware .get_bmc_mac = mock .Mock (return_value = 'aa:bb:cc:dd:ee:ff' )
1535+
1536+ # First call - should call BMC detection methods
1537+ hardware_info1 = self .hardware .list_hardware_info ()
1538+ self .assertEqual ('192.168.1.1' , hardware_info1 ['bmc_address' ])
1539+ self .assertEqual ('fe80::1' , hardware_info1 ['bmc_v6address' ])
1540+ self .assertEqual ('aa:bb:cc:dd:ee:ff' , hardware_info1 ['bmc_mac' ])
1541+
1542+ # Verify BMC methods were called
1543+ self .hardware .get_bmc_address .assert_called_once ()
1544+ self .hardware .get_bmc_v6address .assert_called_once ()
1545+ self .hardware .get_bmc_mac .assert_called_once ()
1546+
1547+ # Second call - should use cached values
1548+ hardware_info2 = self .hardware .list_hardware_info ()
1549+ self .assertEqual ('192.168.1.1' , hardware_info2 ['bmc_address' ])
1550+ self .assertEqual ('fe80::1' , hardware_info2 ['bmc_v6address' ])
1551+ self .assertEqual ('aa:bb:cc:dd:ee:ff' , hardware_info2 ['bmc_mac' ])
1552+
1553+ # BMC methods should NOT be called again (still only once)
1554+ self .hardware .get_bmc_address .assert_called_once ()
1555+ self .hardware .get_bmc_v6address .assert_called_once ()
1556+ self .hardware .get_bmc_mac .assert_called_once ()
1557+
1558+ @mock .patch .object (hardware , 'get_cached_node' , autospec = True )
1559+ @mock .patch .object (hardware .GenericHardwareManager ,
1560+ '_get_system_lshw_dict' , autospec = True ,
1561+ return_value = {'id' : 'host' })
1562+ @mock .patch .object (netutils , 'get_hostname' , autospec = True )
1563+ def test_list_hardware_info_skip_bmc_detect (
1564+ self , mocked_get_hostname , mocked_lshw , mocked_get_node ):
1565+ """Test that BMC detection is skipped when flag is set."""
1566+ mocked_get_node .return_value = {'skip_bmc_detect' : True }
1567+
1568+ # Mock all the hardware info methods
1569+ self .hardware .list_network_interfaces = mock .Mock (return_value = [])
1570+ self .hardware .get_cpus = mock .Mock ()
1571+ self .hardware .get_memory = mock .Mock ()
1572+ self .hardware .list_block_devices = mock .Mock (return_value = [])
1573+ self .hardware .get_boot_info = mock .Mock ()
1574+ self .hardware .get_system_vendor_info = mock .Mock ()
1575+ mocked_get_hostname .return_value = 'mock_hostname'
1576+
1577+ # Mock BMC methods - these should NOT be called
1578+ self .hardware .get_bmc_address = mock .Mock ()
1579+ self .hardware .get_bmc_v6address = mock .Mock ()
1580+ self .hardware .get_bmc_mac = mock .Mock ()
1581+
1582+ # Call list_hardware_info
1583+ hardware_info = self .hardware .list_hardware_info ()
1584+
1585+ # BMC info should be None
1586+ self .assertIsNone (hardware_info ['bmc_address' ])
1587+ self .assertIsNone (hardware_info ['bmc_v6address' ])
1588+ self .assertNotIn ('bmc_mac' , hardware_info )
1589+
1590+ # BMC detection methods should NOT have been called
1591+ self .hardware .get_bmc_address .assert_not_called ()
1592+ self .hardware .get_bmc_v6address .assert_not_called ()
1593+ self .hardware .get_bmc_mac .assert_not_called ()
1594+
1595+ @mock .patch .object (hardware , 'get_cached_node' , autospec = True )
1596+ @mock .patch .object (hardware .GenericHardwareManager ,
1597+ '_get_system_lshw_dict' , autospec = True ,
1598+ return_value = {'id' : 'host' })
1599+ @mock .patch .object (netutils , 'get_hostname' , autospec = True )
1600+ def test_list_hardware_info_bmc_mac_unavailable (
1601+ self , mocked_get_hostname , mocked_lshw , mocked_get_node ):
1602+ """Test BMC MAC marked unavailable when not supported."""
1603+ mocked_get_node .return_value = None
1604+
1605+ # Mock all the hardware info methods
1606+ self .hardware .list_network_interfaces = mock .Mock (return_value = [])
1607+ self .hardware .get_cpus = mock .Mock ()
1608+ self .hardware .get_memory = mock .Mock ()
1609+ self .hardware .list_block_devices = mock .Mock (return_value = [])
1610+ self .hardware .get_boot_info = mock .Mock ()
1611+ self .hardware .get_system_vendor_info = mock .Mock ()
1612+ mocked_get_hostname .return_value = 'mock_hostname'
1613+
1614+ # Mock BMC methods
1615+ self .hardware .get_bmc_address = mock .Mock (return_value = '192.168.1.1' )
1616+ self .hardware .get_bmc_v6address = mock .Mock (return_value = 'fe80::1' )
1617+ # BMC MAC raises IncompatibleHardwareMethodError
1618+ self .hardware .get_bmc_mac = mock .Mock (
1619+ side_effect = errors .IncompatibleHardwareMethodError )
1620+
1621+ # First call
1622+ hardware_info1 = self .hardware .list_hardware_info ()
1623+ self .assertEqual ('192.168.1.1' , hardware_info1 ['bmc_address' ])
1624+ self .assertEqual ('fe80::1' , hardware_info1 ['bmc_v6address' ])
1625+ self .assertNotIn ('bmc_mac' , hardware_info1 ) # Not in output
1626+
1627+ # Verify get_bmc_mac was called once
1628+ self .hardware .get_bmc_mac .assert_called_once ()
1629+
1630+ # Second call - get_bmc_mac should NOT be called again
1631+ hardware_info2 = self .hardware .list_hardware_info ()
1632+ self .assertEqual ('192.168.1.1' , hardware_info2 ['bmc_address' ])
1633+ self .assertEqual ('fe80::1' , hardware_info2 ['bmc_v6address' ])
1634+ self .assertNotIn ('bmc_mac' , hardware_info2 )
1635+
1636+ # Still only one call (cached as 'unavailable')
1637+ self .hardware .get_bmc_mac .assert_called_once ()
1638+
15121639 @mock .patch .object (hardware , 'list_all_block_devices' , autospec = True )
15131640 def test_list_block_devices (self , list_mock ):
15141641 device = hardware .BlockDevice ('/dev/hdaa' , 'small' , 65535 , False )
0 commit comments