Remove compatibility with old bash-based introspection ramdisk
Inspector is using inventory directly, so we can remove the bits sending processed network and scheduling properties. Change-Id: I6c58bc3c5ea78fd2dbda82b38515f332ce2e8d4a
This commit is contained in:
parent
a6b09f2fa8
commit
10bff0a518
@ -16,13 +16,11 @@
|
|||||||
import os
|
import os
|
||||||
import time
|
import time
|
||||||
|
|
||||||
import netaddr
|
|
||||||
from oslo_concurrency import processutils
|
from oslo_concurrency import processutils
|
||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
from oslo_log import log as logging
|
from oslo_log import log as logging
|
||||||
from oslo_serialization import jsonutils
|
from oslo_serialization import jsonutils
|
||||||
from oslo_utils import excutils
|
from oslo_utils import excutils
|
||||||
from oslo_utils import units
|
|
||||||
import requests
|
import requests
|
||||||
import stevedore
|
import stevedore
|
||||||
|
|
||||||
@ -157,67 +155,6 @@ def setup_ipmi_credentials(resp):
|
|||||||
LOG.info('successfully set IPMI credentials: user %s', user)
|
LOG.info('successfully set IPMI credentials: user %s', user)
|
||||||
|
|
||||||
|
|
||||||
def discover_network_properties(inventory, data, failures):
|
|
||||||
"""Discover network and BMC related properties.
|
|
||||||
|
|
||||||
This logic should eventually move to inspector itself.
|
|
||||||
|
|
||||||
:param inventory: hardware inventory from a hardware manager
|
|
||||||
:param data: mutable data that we'll send to inspector
|
|
||||||
:param failures: AccumulatedFailures object
|
|
||||||
"""
|
|
||||||
data.setdefault('interfaces', {})
|
|
||||||
for iface in inventory['interfaces']:
|
|
||||||
is_loopback = (iface.ipv4_address and
|
|
||||||
netaddr.IPAddress(iface.ipv4_address).is_loopback())
|
|
||||||
if iface.name == 'lo' or is_loopback:
|
|
||||||
LOG.debug('ignoring local network interface %s', iface.name)
|
|
||||||
continue
|
|
||||||
|
|
||||||
LOG.debug('found network interface %s', iface.name)
|
|
||||||
|
|
||||||
if not iface.mac_address:
|
|
||||||
LOG.debug('no link information for interface %s', iface.name)
|
|
||||||
continue
|
|
||||||
|
|
||||||
if not iface.ipv4_address:
|
|
||||||
LOG.debug('no IP address for interface %s', iface.name)
|
|
||||||
|
|
||||||
data['interfaces'][iface.name] = {'mac': iface.mac_address,
|
|
||||||
'ip': iface.ipv4_address}
|
|
||||||
|
|
||||||
if data['interfaces']:
|
|
||||||
LOG.info('network interfaces: %s', data['interfaces'])
|
|
||||||
else:
|
|
||||||
failures.add('no network interfaces found')
|
|
||||||
|
|
||||||
|
|
||||||
def discover_scheduling_properties(inventory, data, root_disk=None):
|
|
||||||
"""Discover properties required for nova scheduler.
|
|
||||||
|
|
||||||
This logic should eventually move to inspector itself.
|
|
||||||
|
|
||||||
:param inventory: hardware inventory from a hardware manager
|
|
||||||
:param data: mutable data that we'll send to inspector
|
|
||||||
:param root_disk: root device (if it can be detected)
|
|
||||||
"""
|
|
||||||
data['cpus'] = inventory['cpu'].count
|
|
||||||
data['cpu_arch'] = inventory['cpu'].architecture
|
|
||||||
data['memory_mb'] = inventory['memory'].physical_mb
|
|
||||||
if root_disk is not None:
|
|
||||||
# -1 is required to give Ironic some spacing for partitioning
|
|
||||||
data['local_gb'] = root_disk.size / units.Gi - 1
|
|
||||||
|
|
||||||
for key in ('cpus', 'local_gb', 'memory_mb'):
|
|
||||||
try:
|
|
||||||
data[key] = int(data[key])
|
|
||||||
except (KeyError, ValueError, TypeError):
|
|
||||||
LOG.warning('value for %s is missing or malformed: %s',
|
|
||||||
key, data.get(key))
|
|
||||||
else:
|
|
||||||
LOG.info('value for %s is %s', key, data[key])
|
|
||||||
|
|
||||||
|
|
||||||
def _normalize_mac(mac):
|
def _normalize_mac(mac):
|
||||||
"""Convert MAC to a well-known format aa:bb:cc:dd:ee:ff."""
|
"""Convert MAC to a well-known format aa:bb:cc:dd:ee:ff."""
|
||||||
if '-' in mac:
|
if '-' in mac:
|
||||||
@ -274,12 +211,10 @@ def wait_for_dhcp():
|
|||||||
def collect_default(data, failures):
|
def collect_default(data, failures):
|
||||||
"""The default inspection collector.
|
"""The default inspection collector.
|
||||||
|
|
||||||
This is the only collector that is called by default. It is designed to be
|
This is the only collector that is called by default. It collects
|
||||||
both backward and future compatible:
|
the whole inventory as returned by the hardware manager(s).
|
||||||
1. it collects exactly the same data as the old bash-based ramdisk
|
|
||||||
2. it also posts the whole inventory which we'll eventually use.
|
|
||||||
|
|
||||||
In both cases it tries to get BMC address, PXE boot device and the expected
|
It also tries to get BMC address, PXE boot device and the expected
|
||||||
root device.
|
root device.
|
||||||
|
|
||||||
:param data: mutable data that we'll send to inspector
|
:param data: mutable data that we'll send to inspector
|
||||||
@ -288,9 +223,6 @@ def collect_default(data, failures):
|
|||||||
wait_for_dhcp()
|
wait_for_dhcp()
|
||||||
inventory = hardware.dispatch_to_managers('list_hardware_info')
|
inventory = hardware.dispatch_to_managers('list_hardware_info')
|
||||||
|
|
||||||
# In the future we will only need the current version of inventory,
|
|
||||||
# a guessed root disk, PXE boot interface and IPMI address.
|
|
||||||
# Everything else will be done by inspector itself and its plugins.
|
|
||||||
data['inventory'] = inventory
|
data['inventory'] = inventory
|
||||||
# Replicate the same logic as in deploy. We need to make sure that when
|
# Replicate the same logic as in deploy. We need to make sure that when
|
||||||
# root device hints are not set, inspector will use the same root disk as
|
# root device hints are not set, inspector will use the same root disk as
|
||||||
@ -310,11 +242,6 @@ def collect_default(data, failures):
|
|||||||
data['ipmi_address'] = inventory.get('bmc_address')
|
data['ipmi_address'] = inventory.get('bmc_address')
|
||||||
LOG.debug('BMC IP address: %s', data['ipmi_address'])
|
LOG.debug('BMC IP address: %s', data['ipmi_address'])
|
||||||
|
|
||||||
# These 2 calls are required for backward compatibility and should be
|
|
||||||
# dropped after inspector is ready (probably in Mitaka cycle).
|
|
||||||
discover_network_properties(inventory, data, failures)
|
|
||||||
discover_scheduling_properties(inventory, data, root_disk)
|
|
||||||
|
|
||||||
|
|
||||||
def collect_logs(data, failures):
|
def collect_logs(data, failures):
|
||||||
"""Collect system logs from the ramdisk.
|
"""Collect system logs from the ramdisk.
|
||||||
|
@ -262,77 +262,10 @@ class BaseDiscoverTest(test_base.BaseTestCase):
|
|||||||
self.data = {}
|
self.data = {}
|
||||||
|
|
||||||
|
|
||||||
class TestDiscoverNetworkProperties(BaseDiscoverTest):
|
|
||||||
def test_no_network_interfaces(self):
|
|
||||||
self.inventory['interfaces'] = [
|
|
||||||
hardware.NetworkInterface(name='lo',
|
|
||||||
mac_addr='aa:bb:cc:dd:ee:ff',
|
|
||||||
ipv4_address='127.0.0.1'),
|
|
||||||
hardware.NetworkInterface(name='local-2',
|
|
||||||
mac_addr='aa:bb:cc:dd:ee:ff',
|
|
||||||
ipv4_address='127.0.1.42'),
|
|
||||||
]
|
|
||||||
|
|
||||||
inspector.discover_network_properties(self.inventory, self.data,
|
|
||||||
self.failures)
|
|
||||||
|
|
||||||
self.assertIn('no network interfaces found', self.failures.get_error())
|
|
||||||
self.assertFalse(self.data['interfaces'])
|
|
||||||
|
|
||||||
def test_ok(self):
|
|
||||||
inspector.discover_network_properties(self.inventory, self.data,
|
|
||||||
self.failures)
|
|
||||||
|
|
||||||
self.assertEqual({'em1': {'mac': 'aa:bb:cc:dd:ee:ff',
|
|
||||||
'ip': '1.1.1.1'},
|
|
||||||
'em2': {'mac': '11:22:33:44:55:66',
|
|
||||||
'ip': None}},
|
|
||||||
self.data['interfaces'])
|
|
||||||
self.assertFalse(self.failures)
|
|
||||||
|
|
||||||
def test_missing(self):
|
|
||||||
self.inventory['interfaces'] = [
|
|
||||||
hardware.NetworkInterface(name='em1',
|
|
||||||
mac_addr='aa:bb:cc:dd:ee:ff'),
|
|
||||||
hardware.NetworkInterface(name='em2',
|
|
||||||
mac_addr=None,
|
|
||||||
ipv4_address='1.2.1.2'),
|
|
||||||
]
|
|
||||||
|
|
||||||
inspector.discover_network_properties(self.inventory, self.data,
|
|
||||||
self.failures)
|
|
||||||
|
|
||||||
self.assertEqual({'em1': {'mac': 'aa:bb:cc:dd:ee:ff', 'ip': None}},
|
|
||||||
self.data['interfaces'])
|
|
||||||
self.assertFalse(self.failures)
|
|
||||||
|
|
||||||
|
|
||||||
class TestDiscoverSchedulingProperties(BaseDiscoverTest):
|
|
||||||
def test_ok(self):
|
|
||||||
inspector.discover_scheduling_properties(
|
|
||||||
self.inventory, self.data,
|
|
||||||
root_disk=self.inventory['disks'][2])
|
|
||||||
|
|
||||||
self.assertEqual({'cpus': 4, 'cpu_arch': 'x86_64', 'local_gb': 464,
|
|
||||||
'memory_mb': 12288}, self.data)
|
|
||||||
|
|
||||||
def test_no_local_gb(self):
|
|
||||||
# Some DRAC servers do not have any visible hard drive until RAID is
|
|
||||||
# built
|
|
||||||
|
|
||||||
inspector.discover_scheduling_properties(self.inventory, self.data)
|
|
||||||
|
|
||||||
self.assertEqual({'cpus': 4, 'cpu_arch': 'x86_64', 'memory_mb': 12288},
|
|
||||||
self.data)
|
|
||||||
|
|
||||||
|
|
||||||
@mock.patch.object(inspector, 'wait_for_dhcp', autospec=True)
|
@mock.patch.object(inspector, 'wait_for_dhcp', autospec=True)
|
||||||
@mock.patch.object(inspector, 'discover_scheduling_properties', autospec=True)
|
|
||||||
@mock.patch.object(inspector, 'discover_network_properties', autospec=True)
|
|
||||||
@mock.patch.object(hardware, 'dispatch_to_managers', autospec=True)
|
@mock.patch.object(hardware, 'dispatch_to_managers', autospec=True)
|
||||||
class TestCollectDefault(BaseDiscoverTest):
|
class TestCollectDefault(BaseDiscoverTest):
|
||||||
def test_ok(self, mock_dispatch, mock_discover_net, mock_discover_sched,
|
def test_ok(self, mock_dispatch, mock_wait_for_dhcp):
|
||||||
mock_wait_for_dhcp):
|
|
||||||
mock_dispatch.return_value = self.inventory
|
mock_dispatch.return_value = self.inventory
|
||||||
|
|
||||||
inspector.collect_default(self.data, self.failures)
|
inspector.collect_default(self.data, self.failures)
|
||||||
@ -346,15 +279,9 @@ class TestCollectDefault(BaseDiscoverTest):
|
|||||||
self.data['root_disk'].name)
|
self.data['root_disk'].name)
|
||||||
|
|
||||||
mock_dispatch.assert_called_once_with('list_hardware_info')
|
mock_dispatch.assert_called_once_with('list_hardware_info')
|
||||||
mock_discover_net.assert_called_once_with(self.inventory, self.data,
|
|
||||||
self.failures)
|
|
||||||
mock_discover_sched.assert_called_once_with(
|
|
||||||
self.inventory, self.data,
|
|
||||||
root_disk=self.inventory['disks'][0])
|
|
||||||
mock_wait_for_dhcp.assert_called_once_with()
|
mock_wait_for_dhcp.assert_called_once_with()
|
||||||
|
|
||||||
def test_no_root_disk(self, mock_dispatch, mock_discover_net,
|
def test_no_root_disk(self, mock_dispatch, mock_wait_for_dhcp):
|
||||||
mock_discover_sched, mock_wait_for_dhcp):
|
|
||||||
mock_dispatch.return_value = self.inventory
|
mock_dispatch.return_value = self.inventory
|
||||||
self.inventory['disks'] = []
|
self.inventory['disks'] = []
|
||||||
|
|
||||||
@ -368,10 +295,6 @@ class TestCollectDefault(BaseDiscoverTest):
|
|||||||
self.assertNotIn('root_disk', self.data)
|
self.assertNotIn('root_disk', self.data)
|
||||||
|
|
||||||
mock_dispatch.assert_called_once_with('list_hardware_info')
|
mock_dispatch.assert_called_once_with('list_hardware_info')
|
||||||
mock_discover_net.assert_called_once_with(self.inventory, self.data,
|
|
||||||
self.failures)
|
|
||||||
mock_discover_sched.assert_called_once_with(
|
|
||||||
self.inventory, self.data, root_disk=None)
|
|
||||||
mock_wait_for_dhcp.assert_called_once_with()
|
mock_wait_for_dhcp.assert_called_once_with()
|
||||||
|
|
||||||
|
|
||||||
|
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
other:
|
||||||
|
- |
|
||||||
|
Introspection data no longer contains keys used for compatibility with
|
||||||
|
the old introspection ramdisk.
|
Loading…
Reference in New Issue
Block a user