@@ -1239,6 +1239,133 @@ def test_list_hardware_info(self, mocked_get_hostname, mocked_lshw):
12391239 self .assertEqual ('mock_hostname' , hardware_info ['hostname' ])
12401240 mocked_lshw .assert_called_once_with (self .hardware )
12411241
1242+ @mock .patch .object (hardware , 'get_cached_node' , autospec = True )
1243+ @mock .patch .object (hardware .GenericHardwareManager ,
1244+ '_get_system_lshw_dict' , autospec = True ,
1245+ return_value = {'id' : 'host' })
1246+ @mock .patch .object (netutils , 'get_hostname' , autospec = True )
1247+ def test_list_hardware_info_with_bmc_caching (
1248+ self , mocked_get_hostname , mocked_lshw , mocked_get_node ):
1249+ """Test that BMC information is cached after first detection."""
1250+ mocked_get_node .return_value = None # No skip_bmc_detect flag
1251+
1252+ # Mock all the hardware info methods
1253+ self .hardware .list_network_interfaces = mock .Mock (return_value = [])
1254+ self .hardware .get_cpus = mock .Mock ()
1255+ self .hardware .get_memory = mock .Mock ()
1256+ self .hardware .list_block_devices = mock .Mock (return_value = [])
1257+ self .hardware .get_boot_info = mock .Mock ()
1258+ self .hardware .get_system_vendor_info = mock .Mock ()
1259+ mocked_get_hostname .return_value = 'mock_hostname'
1260+
1261+ # Mock BMC methods
1262+ self .hardware .get_bmc_address = mock .Mock (return_value = '192.168.1.1' )
1263+ self .hardware .get_bmc_v6address = mock .Mock (return_value = 'fe80::1' )
1264+ self .hardware .get_bmc_mac = mock .Mock (return_value = 'aa:bb:cc:dd:ee:ff' )
1265+
1266+ # First call - should call BMC detection methods
1267+ hardware_info1 = self .hardware .list_hardware_info ()
1268+ self .assertEqual ('192.168.1.1' , hardware_info1 ['bmc_address' ])
1269+ self .assertEqual ('fe80::1' , hardware_info1 ['bmc_v6address' ])
1270+ self .assertEqual ('aa:bb:cc:dd:ee:ff' , hardware_info1 ['bmc_mac' ])
1271+
1272+ # Verify BMC methods were called
1273+ self .hardware .get_bmc_address .assert_called_once ()
1274+ self .hardware .get_bmc_v6address .assert_called_once ()
1275+ self .hardware .get_bmc_mac .assert_called_once ()
1276+
1277+ # Second call - should use cached values
1278+ hardware_info2 = self .hardware .list_hardware_info ()
1279+ self .assertEqual ('192.168.1.1' , hardware_info2 ['bmc_address' ])
1280+ self .assertEqual ('fe80::1' , hardware_info2 ['bmc_v6address' ])
1281+ self .assertEqual ('aa:bb:cc:dd:ee:ff' , hardware_info2 ['bmc_mac' ])
1282+
1283+ # BMC methods should NOT be called again (still only once)
1284+ self .hardware .get_bmc_address .assert_called_once ()
1285+ self .hardware .get_bmc_v6address .assert_called_once ()
1286+ self .hardware .get_bmc_mac .assert_called_once ()
1287+
1288+ @mock .patch .object (hardware , 'get_cached_node' , autospec = True )
1289+ @mock .patch .object (hardware .GenericHardwareManager ,
1290+ '_get_system_lshw_dict' , autospec = True ,
1291+ return_value = {'id' : 'host' })
1292+ @mock .patch .object (netutils , 'get_hostname' , autospec = True )
1293+ def test_list_hardware_info_skip_bmc_detect (
1294+ self , mocked_get_hostname , mocked_lshw , mocked_get_node ):
1295+ """Test that BMC detection is skipped when flag is set."""
1296+ mocked_get_node .return_value = {'skip_bmc_detect' : True }
1297+
1298+ # Mock all the hardware info methods
1299+ self .hardware .list_network_interfaces = mock .Mock (return_value = [])
1300+ self .hardware .get_cpus = mock .Mock ()
1301+ self .hardware .get_memory = mock .Mock ()
1302+ self .hardware .list_block_devices = mock .Mock (return_value = [])
1303+ self .hardware .get_boot_info = mock .Mock ()
1304+ self .hardware .get_system_vendor_info = mock .Mock ()
1305+ mocked_get_hostname .return_value = 'mock_hostname'
1306+
1307+ # Mock BMC methods - these should NOT be called
1308+ self .hardware .get_bmc_address = mock .Mock ()
1309+ self .hardware .get_bmc_v6address = mock .Mock ()
1310+ self .hardware .get_bmc_mac = mock .Mock ()
1311+
1312+ # Call list_hardware_info
1313+ hardware_info = self .hardware .list_hardware_info ()
1314+
1315+ # BMC info should be None
1316+ self .assertIsNone (hardware_info ['bmc_address' ])
1317+ self .assertIsNone (hardware_info ['bmc_v6address' ])
1318+ self .assertNotIn ('bmc_mac' , hardware_info )
1319+
1320+ # BMC detection methods should NOT have been called
1321+ self .hardware .get_bmc_address .assert_not_called ()
1322+ self .hardware .get_bmc_v6address .assert_not_called ()
1323+ self .hardware .get_bmc_mac .assert_not_called ()
1324+
1325+ @mock .patch .object (hardware , 'get_cached_node' , autospec = True )
1326+ @mock .patch .object (hardware .GenericHardwareManager ,
1327+ '_get_system_lshw_dict' , autospec = True ,
1328+ return_value = {'id' : 'host' })
1329+ @mock .patch .object (netutils , 'get_hostname' , autospec = True )
1330+ def test_list_hardware_info_bmc_mac_unavailable (
1331+ self , mocked_get_hostname , mocked_lshw , mocked_get_node ):
1332+ """Test BMC MAC marked unavailable when not supported."""
1333+ mocked_get_node .return_value = None
1334+
1335+ # Mock all the hardware info methods
1336+ self .hardware .list_network_interfaces = mock .Mock (return_value = [])
1337+ self .hardware .get_cpus = mock .Mock ()
1338+ self .hardware .get_memory = mock .Mock ()
1339+ self .hardware .list_block_devices = mock .Mock (return_value = [])
1340+ self .hardware .get_boot_info = mock .Mock ()
1341+ self .hardware .get_system_vendor_info = mock .Mock ()
1342+ mocked_get_hostname .return_value = 'mock_hostname'
1343+
1344+ # Mock BMC methods
1345+ self .hardware .get_bmc_address = mock .Mock (return_value = '192.168.1.1' )
1346+ self .hardware .get_bmc_v6address = mock .Mock (return_value = 'fe80::1' )
1347+ # BMC MAC raises IncompatibleHardwareMethodError
1348+ self .hardware .get_bmc_mac = mock .Mock (
1349+ side_effect = errors .IncompatibleHardwareMethodError )
1350+
1351+ # First call
1352+ hardware_info1 = self .hardware .list_hardware_info ()
1353+ self .assertEqual ('192.168.1.1' , hardware_info1 ['bmc_address' ])
1354+ self .assertEqual ('fe80::1' , hardware_info1 ['bmc_v6address' ])
1355+ self .assertNotIn ('bmc_mac' , hardware_info1 ) # Not in output
1356+
1357+ # Verify get_bmc_mac was called once
1358+ self .hardware .get_bmc_mac .assert_called_once ()
1359+
1360+ # Second call - get_bmc_mac should NOT be called again
1361+ hardware_info2 = self .hardware .list_hardware_info ()
1362+ self .assertEqual ('192.168.1.1' , hardware_info2 ['bmc_address' ])
1363+ self .assertEqual ('fe80::1' , hardware_info2 ['bmc_v6address' ])
1364+ self .assertNotIn ('bmc_mac' , hardware_info2 )
1365+
1366+ # Still only one call (cached as 'unavailable')
1367+ self .hardware .get_bmc_mac .assert_called_once ()
1368+
12421369 @mock .patch .object (hardware , 'list_all_block_devices' , autospec = True )
12431370 def test_list_block_devices (self , list_mock ):
12441371 device = hardware .BlockDevice ('/dev/hdaa' , 'small' , 65535 , False )
0 commit comments