Revert "Add NIC inspection for Gen9"

This reverts commit 7286d7019c.
The fix is reverted because iLO4 behaviour is not consistent in
reporting the NIC data even for MCTP compliant NIC cards.
And iLO4 does not has the intelligence to detect the
NIC health status out-of-band for non-MCTP compliant NIC cards.
It reports the correct status only when AMS is running on the
server which requires OS to be present onto the system.

Change-Id: I02c27d820b27bd532f23ab7ef276b39f868f5205
This commit is contained in:
Nisha Agarwal 2019-02-28 01:37:15 -08:00
parent 4dda230455
commit 5fbd785e91
7 changed files with 7 additions and 426 deletions

View File

@ -618,14 +618,6 @@ class IloClient(operations.IloOperations):
"RIBCL/Redfish failed to get the disk size. "
"Returning local_gb as 0.")
LOG.debug(msg)
# TODO(nisha): The get_essential_properties() is not implemented
# in ris.py so far. Since the active MACs cannot be retreived using
# RIBCL, the logic is implemented in ris.py for Gen9s.Eventually
# the whole get_essential_properties() need to be implemented
# in ris.py.
if ('Gen9' in self.model):
macs = self.ris.get_active_macs()
data['macs'] = macs
return data
def get_server_capabilities(self):

View File

@ -802,11 +802,7 @@ class RIBCLOperations(operations.IloOperations):
properties['cpus'] = cpus
properties['cpu_arch'] = cpu_arch
properties['local_gb'] = self._parse_storage_embedded_health(data)
# TODO(nisha): Remove this check once get_essential_properties() is
# completely implemented in ris.py for Gen9's.
macs = {}
if 'Gen8' in self.get_product_name():
macs = self._parse_nics_embedded_health(data)
macs = self._parse_nics_embedded_health(data)
return_value = {'properties': properties, 'macs': macs}
return return_value

View File

@ -2043,70 +2043,3 @@ class RISOperations(rest.RestConnectorBase, operations.IloOperations):
settings_result = bios_settings.get("SettingsResult").get("Messages")
status = "failed" if len(settings_result) > 1 else "success"
return {"status": status, "results": settings_result}
def _get_network_adapters(self):
"""Gets the network adapters list.
:raises: IloError, on an error from iLO.
:raises: IloCommandNotSupportedError, if the command is
not supported on the server.
:returns: the list of Network Adapters attached to the system.
"""
system = self._get_host_details()
if ('links' in system['Oem']['Hp'] and
'NetworkAdapters' in system['Oem']['Hp']['links']):
# Get the NetworkAdapters URI and list
uri = system['Oem']['Hp']['links']['NetworkAdapters']['href']
status, headers, net_details = self._rest_get(uri)
if status >= 300:
msg = self._get_extended_error(net_details)
raise exception.IloError(msg)
return net_details
else:
msg = ('"links/NetworkAdapters" section in ComputerSystem/Oem/Hp'
' does not exist')
raise exception.IloCommandNotSupportedError(msg)
def get_active_macs(self):
"""Gets the MACs which are physically connected.
:raises: IloError, on an error from iLO.
:raises: IloCommandNotSupportedError, if the command is
not supported on the server.
:returns: the dictionary of active MAC addresses like
{'NIC.LOM.1.1': '50:65:F3:6C:47:F8'}
"""
net_details = self._get_network_adapters()
active_macs = {}
if ('links' in net_details and
'Member' in net_details['links']):
for member in net_details['links']['Member']:
net_uri = member['href']
status, headers, mac_details = self._rest_get(net_uri)
if status >= 300:
msg = self._get_extended_error(mac_details)
raise exception.IloError(msg)
# In RIBCL and Redfish we are able to get the port
# numbers from the data received but it is not available
# as part of RIS output. Hence choosing the nearest
# and unique key as "StructuredName" from RIS output
# which returns value as 'NIC.LOM.1.1', 'NIC.LOM.1.2', etc.
# The last digit is actually the port number.
for macs in mac_details['PhysicalPorts']:
if (macs['Status']['Health'] == 'OK' and
macs['Status']['State'] == 'Enabled'):
mac_dict = {macs['Oem']['Hp']['StructuredName']:
macs['MacAddress']}
active_macs.update(mac_dict)
else:
msg = ('"links" or "links/Member" section in NetworkAdapters'
' does not exist')
raise exception.IloCommandNotSupportedError(msg)
if (len(active_macs) == 0):
LOG.warning(self._("Node doesn't have any NIC physically "
"connected."))
return active_macs

View File

@ -169,9 +169,6 @@ RESPONSE_BODY_FOR_REST_OP = """
"MEMORY": {
"href": "/rest/v1/Systems/1/Memory"
},
"NetworkAdapters": {
"href": "/rest/v1/Systems/1/NetworkAdapters"
},
"PCIDevices": {
"href": "/rest/v1/Systems/1/PCIDevices"
},
@ -4846,177 +4843,3 @@ ArrayControllers"
}
}
"""
NO_MACS_CONNECTED = """
{
"@odata.context": "/redfish/v1/$metadata#Systems/Members/1/\
NetworkAdapters/Members/$entity",
"@odata.id": "/redfish/v1/Systems/1/NetworkAdapters/1/",
"@odata.type": "#BaseNetworkAdapter.1.1.0.BaseNetworkAdapter",
"Firmware": {
"Current": {
"VersionString": null
}
},
"Id": "1",
"Name": "HP Ethernet 1Gb 2-port 361i Adapter - NIC",
"PartNumber": null,
"PhysicalPorts": [{
"FullDuplex": false,
"IPv4Addresses": [{
"Address": null
}],
"IPv6Addresses": [{
"Address": null
}],
"MacAddress": "50:65:F3:6C:47:F8",
"Name": null,
"Oem": {
"Hp": {
"@odata.type": "#HpBaseNetworkAdapterExt.1.0.0.\
HpBaseNetworkAdapterExt",
"BadReceives": null,
"BadTransmits": null,
"GoodReceives": null,
"GoodTransmits": null,
"StructuredName": "NIC.LOM.1.1",
"Team": null,
"Type": "HpBaseNetworkAdapterExt.1.0.0"
}
},
"SpeedMbps": 0,
"Status": {
"Health": "Warning",
"State": "Disabled"
},
"UEFIDevicePath": "PciRoot(0x0)/Pci(0x2,0x3)/Pci(0x0,0x0)"
}],
"SerialNumber": null,
"Status": {
"Health": "Warning",
"State": "Disabled"
},
"StructuredName": "NIC.LOM.1.1",
"Type": "BaseNetworkAdapter.1.1.0",
"UEFIDevicePath": "PciRoot(0x0)/Pci(0x2,0x3)/Pci(0x0,0x0)",
"links": {
"self": {
"href": "/rest/v1/Systems/1/NetworkAdapters/1"
}
}
}
"""
ONE_MAC_CONNECTED = """
{
"@odata.context": "/redfish/v1/$metadata#Systems/Members/1/\
NetworkAdapters/Members/$entity",
"@odata.id": "/redfish/v1/Systems/1/NetworkAdapters/1/",
"@odata.type": "#BaseNetworkAdapter.1.1.0.BaseNetworkAdapter",
"Firmware": {
"Current": {
"VersionString": null
}
},
"Id": "1",
"Name": "HP Ethernet 1Gb 2-port 361i Adapter - NIC",
"PartNumber": null,
"PhysicalPorts": [{
"FullDuplex": false,
"IPv4Addresses": [{
"Address": null
}],
"IPv6Addresses": [{
"Address": null
}],
"MacAddress": "50:65:F3:6C:47:F8",
"Name": null,
"Oem": {
"Hp": {
"@odata.type": "#HpBaseNetworkAdapterExt.1.0.0.\
HpBaseNetworkAdapterExt",
"BadReceives": null,
"BadTransmits": null,
"GoodReceives": null,
"GoodTransmits": null,
"StructuredName": "NIC.LOM.1.1",
"Team": null,
"Type": "HpBaseNetworkAdapterExt.1.0.0"
}
},
"SpeedMbps": 0,
"Status": {
"Health": "OK",
"State": "Enabled"
},
"UEFIDevicePath": "PciRoot(0x0)/Pci(0x2,0x3)/Pci(0x0,0x0)"
}, {
"FullDuplex": false,
"IPv4Addresses": [{
"Address": null
}],
"IPv6Addresses": [{
"Address": null
}],
"MacAddress": "50:65:F3:6C:47:F9",
"Name": null,
"Oem": {
"Hp": {
"@odata.type": "#HpBaseNetworkAdapterExt.1.0.0.\
HpBaseNetworkAdapterExt",
"BadReceives": null,
"BadTransmits": null,
"GoodReceives": null,
"GoodTransmits": null,
"StructuredName": "NIC.LOM.1.2",
"Team": null,
"Type": "HpBaseNetworkAdapterExt.1.0.0"
}
},
"SpeedMbps": 0,
"Status": {
"Health": "Warning",
"State": "Disabled"
},
"UEFIDevicePath": "PciRoot(0x0)/Pci(0x2,0x3)/Pci(0x0,0x1)"
}],
"SerialNumber": null,
"Status": {
"Health": "OK",
"State": "Enabled"
},
"StructuredName": "NIC.LOM.1.1",
"Type": "BaseNetworkAdapter.1.1.0",
"UEFIDevicePath": "PciRoot(0x0)/Pci(0x2,0x3)/Pci(0x0,0x0)",
"links": {
"self": {
"href": "/rest/v1/Systems/1/NetworkAdapters/1"
}
}
}
"""
NETWORK_ADAPTER_LIST = """
{
"@odata.context": "/redfish/v1/$metadata#Systems/Members/1/NetworkAdapters",
"@odata.id": "/redfish/v1/Systems/1/NetworkAdapters/",
"@odata.type": "#BaseNetworkAdapterCollection.BaseNetworkAdapterCollection",
"Description": "NetworkAdapters view",
"MemberType": "BaseNetworkAdapter.1",
"Members": [{
"@odata.id": "/redfish/v1/Systems/1/NetworkAdapters/1/"
}],
"Members@odata.count": 1,
"Name": "NetworkAdapters Collection",
"Total": 1,
"Type": "Collection.1.0.0",
"links": {
"Member": [{
"href": "/rest/v1/Systems/1/NetworkAdapters/1"
}],
"self": {
"href": "/rest/v1/Systems/1/NetworkAdapters"
}
}
}
"""

View File

@ -1086,12 +1086,11 @@ class IloClientTestCase(testtools.TestCase):
self.client.set_bios_settings(d, apply_filter)
bios_settings_mock.assert_called_once_with(d, False)
@mock.patch.object(ris.RISOperations, 'get_active_macs')
@mock.patch.object(client.IloClient, '_call_method')
@mock.patch.object(snmp_cpqdisk_sizes, 'get_local_gb')
def test_get_essential_prop_no_snmp_ris(self,
snmp_mock,
call_mock, mac_mock):
call_mock):
self.client.model = 'Gen9'
properties = {'local_gb': 250}
data = {'properties': properties}
@ -1099,15 +1098,12 @@ class IloClientTestCase(testtools.TestCase):
self.client.get_essential_properties()
call_mock.assert_called_once_with('get_essential_properties')
self.assertFalse(snmp_mock.called)
self.assertTrue(mac_mock.called)
@mock.patch.object(ris.RISOperations, 'get_active_macs')
@mock.patch.object(client.IloClient, '_call_method')
@mock.patch.object(snmp_cpqdisk_sizes, 'get_local_gb')
def test_get_essential_prop_no_snmp_local_gb_0(self,
snmp_mock,
call_mock,
mac_mock):
call_mock):
self.client.model = 'Gen9'
properties = {'local_gb': 0}
data = {'properties': properties}
@ -1115,14 +1111,12 @@ class IloClientTestCase(testtools.TestCase):
self.client.get_essential_properties()
call_mock.assert_called_once_with('get_essential_properties')
self.assertFalse(snmp_mock.called)
self.assertTrue(mac_mock.called)
@mock.patch.object(ris.RISOperations, 'get_active_macs')
@mock.patch.object(client.IloClient, '_call_method')
@mock.patch.object(snmp_cpqdisk_sizes, 'get_local_gb')
def test_get_essential_prop_snmp_true(self,
snmp_mock,
call_mock, mac_mock):
call_mock):
self.client.model = 'Gen9'
snmp_credentials = {'auth_user': 'user',
'auth_prot_pp': '1234',
@ -1139,15 +1133,12 @@ class IloClientTestCase(testtools.TestCase):
call_mock.assert_called_once_with('get_essential_properties')
snmp_mock.assert_called_once_with(
self.client.ipmi_host_info['address'], snmp_credentials)
self.assertTrue(mac_mock.called)
@mock.patch.object(ris.RISOperations, 'get_active_macs')
@mock.patch.object(client.IloClient, '_call_method')
@mock.patch.object(snmp_cpqdisk_sizes, 'get_local_gb')
def test_get_essential_prop_snmp_true_local_gb_0(self,
snmp_mock,
call_mock,
mac_mock):
call_mock):
self.client.model = 'Gen9'
snmp_credentials = {'auth_user': 'user',
'auth_prot_pp': '1234',
@ -1164,14 +1155,11 @@ class IloClientTestCase(testtools.TestCase):
call_mock.assert_called_once_with('get_essential_properties')
snmp_mock.assert_called_once_with(
self.client.ipmi_host_info['address'], snmp_credentials)
self.assertTrue(mac_mock.called)
@mock.patch.object(ris.RISOperations, 'get_active_macs')
@mock.patch.object(snmp_cpqdisk_sizes, 'get_local_gb')
@mock.patch.object(client.IloClient, '_call_method')
def test_get_essential_prop_snmp_false_local_gb_0(self, call_mock,
snmp_mock,
mac_mock):
snmp_mock):
self.client.model = 'Gen9'
snmp_credentials = {'auth_user': 'user',
@ -1188,44 +1176,6 @@ class IloClientTestCase(testtools.TestCase):
self.client.get_essential_properties()
call_mock.assert_called_once_with('get_essential_properties')
self.assertFalse(snmp_mock.called)
self.assertTrue(mac_mock.called)
@mock.patch.object(ris.RISOperations, 'get_active_macs')
@mock.patch.object(client.IloClient, '_call_method')
def test_get_essential_prop_macs_gen9(self, call_mock,
mac_mock):
self.client.model = 'Gen9'
properties = {'local_gb': 123456789}
mac_mock.return_value = {'NIC.LOM.1.1': '50:65:F3:6C:47:F8'}
mac_dict = {'Port 1': '50:65:F3:6C:47:F8',
'Port 2': '50:65:F3:6C:47:F9'}
data = {'properties': properties, 'macs': mac_dict}
expected_data = {'properties': properties,
'macs': {'NIC.LOM.1.1': '50:65:F3:6C:47:F8'}}
call_mock.return_value = data
actual_data = self.client.get_essential_properties()
self.assertEqual(actual_data, expected_data)
call_mock.assert_called_once_with('get_essential_properties')
self.assertTrue(mac_mock.called)
@mock.patch.object(ris.RISOperations, 'get_active_macs')
@mock.patch.object(client.IloClient, '_call_method')
def test_get_essential_prop_macs_gen8(self, call_mock,
mac_mock):
self.client.model = 'Gen8'
properties = {'local_gb': 123456789}
mac_dict = {'Port 1': '50:65:F3:6C:47:F8',
'Port 2': '50:65:F3:6C:47:F9'}
data = {'properties': properties, 'macs': mac_dict}
expected_data = {'properties': properties,
'macs': mac_dict}
call_mock.return_value = data
actual_data = self.client.get_essential_properties()
self.assertEqual(actual_data, expected_data)
call_mock.assert_called_once_with('get_essential_properties')
self.assertFalse(mac_mock.called)
@mock.patch.object(client.IloClient, '_call_method')
def test_inject_nmi(self, call_mock):

View File

@ -712,13 +712,11 @@ class IloRibclTestCase(unittest.TestCase):
self.assertIsInstance(gpu_cnt, dict)
self.assertIn('pci_gpu_devices', gpu_cnt)
@mock.patch.object(ribcl.RIBCLOperations, 'get_product_name')
@mock.patch.object(ribcl.RIBCLOperations, 'get_host_health_data')
def test_get_essential_properties(self, health_data_mock, prod_mock):
def test_get_essential_properties(self, health_data_mock):
data = constants.GET_EMBEDDED_HEALTH_OUTPUT
json_data = json.loads(data)
health_data_mock.return_value = json_data
prod_mock.return_value = "Gen8"
expected_properties = {'macs': {
u'Port 4': u'40:a8:f0:1e:86:77',
u'Port 3': u'40:a8:f0:1e:86:76',
@ -737,26 +735,6 @@ class IloRibclTestCase(unittest.TestCase):
self.assertIn('properties', properties)
self.assertEqual(expected_properties, properties)
@mock.patch.object(ribcl.RIBCLOperations, 'get_product_name')
@mock.patch.object(ribcl.RIBCLOperations, 'get_host_health_data')
def test_get_essential_properties_Gen9(self, health_data_mock, prod_mock):
data = constants.GET_EMBEDDED_HEALTH_OUTPUT
json_data = json.loads(data)
health_data_mock.return_value = json_data
prod_mock.return_value = "Gen9"
expected_properties = {'macs': {},
'properties': {
'memory_mb': 32768,
'cpu_arch': 'x86_64',
'local_gb': 98,
'cpus': 32}
}
properties = self.ilo.get_essential_properties()
self.assertIsInstance(properties, dict)
self.assertIn('macs', properties)
self.assertIn('properties', properties)
self.assertEqual(expected_properties, properties)
@mock.patch.object(ribcl.RIBCLOperations, 'get_product_name')
@mock.patch.object(ribcl.RIBCLOperations, 'get_host_health_data')
@mock.patch.object(ribcl.RIBCLOperations, 'get_supported_boot_mode')

View File

@ -2641,94 +2641,3 @@ class TestRISOperationsPrivateMethods(testtools.TestCase):
'ProLiant BL460c Gen9',
self.client.create_raid_configuration,
raid_config)
@mock.patch.object(ris.RISOperations, '_rest_get')
@mock.patch.object(ris.RISOperations, '_get_host_details')
def test__get_network_adapters(self, get_host_details_mock, get_mock):
system_data = json.loads(ris_outputs.RESPONSE_BODY_FOR_REST_OP)
get_host_details_mock.return_value = system_data
net_uri = '/rest/v1/Systems/1/NetworkAdapters'
net_list = json.loads(ris_outputs.NETWORK_ADAPTER_LIST)
get_mock.return_value = (200, ris_outputs.GET_HEADERS,
net_list)
self.client._get_network_adapters()
get_mock.assert_called_once_with(net_uri)
@mock.patch.object(ris.RISOperations, '_rest_get')
@mock.patch.object(ris.RISOperations, '_get_host_details')
def test__get_network_adapters_fail(self, get_host_details_mock,
get_mock):
system_data = json.loads(ris_outputs.RESPONSE_BODY_FOR_REST_OP)
get_host_details_mock.return_value = system_data
net_uri = '/rest/v1/Systems/1/NetworkAdapters'
net_list = json.loads(ris_outputs.NETWORK_ADAPTER_LIST)
get_mock.return_value = (301, ris_outputs.GET_HEADERS,
net_list)
self.assertRaises(exception.IloError,
self.client._get_network_adapters)
get_mock.assert_called_once_with(net_uri)
@mock.patch.object(ris.RISOperations, '_get_host_details')
def test__get_network_adapters_not_supported(self, get_details_mock):
host_response = json.loads(ris_outputs.RESPONSE_BODY_FOR_REST_OP)
del host_response['Oem']['Hp']['links']['NetworkAdapters']
get_details_mock.return_value = host_response
self.assertRaises(exception.IloCommandNotSupportedError,
self.client._get_network_adapters)
get_details_mock.assert_called_once_with()
@mock.patch.object(ris.RISOperations, '_rest_get')
@mock.patch.object(ris.RISOperations, '_get_network_adapters')
def test_get_active_macs_one_mac(self, network_mock, rest_mock):
net_details = json.loads(ris_outputs.NETWORK_ADAPTER_LIST)
mac_details = json.loads(ris_outputs.ONE_MAC_CONNECTED)
network_mock.return_value = net_details
uri = '/rest/v1/Systems/1/NetworkAdapters/1'
rest_mock.return_value = (200, ris_outputs.GET_HEADERS,
mac_details)
expected_macs = {'NIC.LOM.1.1': '50:65:F3:6C:47:F8'}
actual_macs = self.client.get_active_macs()
self.assertEqual(expected_macs, actual_macs)
network_mock.assert_called_once_with()
rest_mock.assert_called_once_with(uri)
@mock.patch.object(ris.RISOperations, '_rest_get')
@mock.patch.object(ris.RISOperations, '_get_network_adapters')
def test_get_active_macs_no_connected_mac(self, network_mock, rest_mock):
net_details = json.loads(ris_outputs.NETWORK_ADAPTER_LIST)
mac_details = json.loads(ris_outputs.NO_MACS_CONNECTED)
network_mock.return_value = net_details
rest_mock.return_value = (200, ris_outputs.GET_HEADERS,
mac_details)
expected_macs = {}
actual_macs = self.client.get_active_macs()
self.assertEqual(expected_macs, actual_macs)
network_mock.assert_called_once_with()
self.assertTrue(rest_mock.called)
@mock.patch.object(ris.RISOperations, '_rest_get')
@mock.patch.object(ris.RISOperations, '_get_network_adapters')
def test_get_active_macs_error(self, network_mock, rest_mock):
net_details = json.loads(ris_outputs.NETWORK_ADAPTER_LIST)
network_mock.return_value = net_details
uri = "/rest/v1/Systems/1/NetworkAdapters/1"
rest_mock.return_value = (301, ris_outputs.GET_HEADERS,
ris_outputs.REST_FAILURE_OUTPUT)
exc = self.assertRaises(exception.IloError,
self.client.get_active_macs)
network_mock.assert_called_once_with()
rest_mock.assert_called_once_with(uri)
self.assertIn('FakeFailureMessage', str(exc))
@mock.patch.object(ris.RISOperations, '_get_network_adapters')
def test_get_active_macs_not_supported(self, network_mock):
net_details = json.loads(ris_outputs.NETWORK_ADAPTER_LIST)
network_mock.return_value = net_details
del net_details['links']['Member']
exc = self.assertRaises(exception.IloCommandNotSupportedError,
self.client.get_active_macs)
msg = ('"links" or "links/Member" section in NetworkAdapters'
' does not exist')
network_mock.assert_called_once_with()
self.assertIn(msg, str(exc))