Merge "Report port and device inventory after the worker manifest"

This commit is contained in:
Zuul 2024-03-11 16:19:09 +00:00 committed by Gerrit Code Review
commit 6c3df45f05
3 changed files with 126 additions and 13 deletions

View File

@ -115,8 +115,7 @@ SYSINV_READY_FLAG = os.path.join(tsc.VOLATILE_PATH, ".sysinv_ready")
CONFIG_APPLIED_FILE = os.path.join(tsc.PLATFORM_CONF_PATH, ".config_applied") CONFIG_APPLIED_FILE = os.path.join(tsc.PLATFORM_CONF_PATH, ".config_applied")
CONFIG_APPLIED_DEFAULT = "install" CONFIG_APPLIED_DEFAULT = "install"
FIRST_BOOT_FLAG = os.path.join( FIRST_BOOT_FLAG = constants.FIRST_BOOT_FLAG
tsc.PLATFORM_CONF_PATH, ".first_boot")
PUPPET_HIERADATA_PATH = os.path.join(tsc.PUPPET_PATH, 'hieradata') PUPPET_HIERADATA_PATH = os.path.join(tsc.PUPPET_PATH, 'hieradata')
PUPPET_HIERADATA_CACHE_PATH = '/etc/puppet/cache/hieradata' PUPPET_HIERADATA_CACHE_PATH = '/etc/puppet/cache/hieradata'
@ -225,6 +224,7 @@ class AgentManager(service.PeriodicService):
self._first_grub_update = False self._first_grub_update = False
self._inventoried_initial = False self._inventoried_initial = False
self._inventory_reported = set() self._inventory_reported = set()
self._first_boot_flag = os.path.exists(FIRST_BOOT_FLAG)
def start(self): def start(self):
super(AgentManager, self).start() super(AgentManager, self).start()
@ -611,20 +611,29 @@ class AgentManager(service.PeriodicService):
def _get_ports_inventory(self): def _get_ports_inventory(self):
"""Collect ports inventory for this host""" """Collect ports inventory for this host"""
# During bootstrap (fresh install and also restore), and network first-boot
# send report unconditionally
# During host configuration (subsequent reboots):
# worker in subfunction : do not send report until worker manifest applied
# otherwise: send report unconditionally
port_list = [] port_list = []
pci_device_list = [] pci_device_list = []
host_macs = [] host_macs = []
initial_worker_config_completed = \ ansible_bootstrap_flag = \
os.path.exists(tsc.INITIAL_WORKER_CONFIG_COMPLETE) os.path.exists(constants.ANSIBLE_BOOTSTRAP_FLAG)
worker_config_completed = \ worker_config_completed = \
os.path.exists(tsc.VOLATILE_WORKER_CONFIG_COMPLETE) os.path.exists(tsc.VOLATILE_WORKER_CONFIG_COMPLETE)
# do not send report if the initial worker config is completed and # do not send report if it is neither first boot nor
# worker config has not finished, i.e.during subsequent # ansible-bootstrap, and worker config has not finished,
# reboot before the manifest enables and binds any SR-IOV devices # i.e. during subsequent reboot before the worker manifest
if (initial_worker_config_completed and # enables and binds any SR-IOV devices
not worker_config_completed): if (not self._first_boot_flag
and not ansible_bootstrap_flag
and constants.WORKER in self.subfunctions_list_get()
and not worker_config_completed):
return port_list, pci_device_list, host_macs return port_list, pci_device_list, host_macs
# find list of network related inics for this host # find list of network related inics for this host

View File

@ -2118,6 +2118,9 @@ KUBE_POWER_MANAGER_VALUE = 'enabled'
# Default DNS service domain # Default DNS service domain
DEFAULT_DNS_SERVICE_DOMAIN = 'cluster.local' DEFAULT_DNS_SERVICE_DOMAIN = 'cluster.local'
# First boot
FIRST_BOOT_FLAG = os.path.join(tsc.PLATFORM_CONF_PATH, ".first_boot")
# Ansible bootstrap # Ansible bootstrap
ANSIBLE_BOOTSTRAP_FLAG = os.path.join(tsc.VOLATILE_PATH, ".ansible_bootstrap") ANSIBLE_BOOTSTRAP_FLAG = os.path.join(tsc.VOLATILE_PATH, ".ansible_bootstrap")
ANSIBLE_BOOTSTRAP_COMPLETED_FLAG = os.path.join(tsc.PLATFORM_CONF_PATH, ANSIBLE_BOOTSTRAP_COMPLETED_FLAG = os.path.join(tsc.PLATFORM_CONF_PATH,

View File

@ -27,6 +27,7 @@ from sysinv.agent.pci import PCIOperator
from sysinv.agent.pci import PCI from sysinv.agent.pci import PCI
from sysinv.agent.manager import AgentManager from sysinv.agent.manager import AgentManager
from sysinv.tests import base from sysinv.tests import base
from sysinv.common import constants
from sysinv.common import fpga_constants from sysinv.common import fpga_constants
import tsconfig.tsconfig as tsc import tsconfig.tsconfig as tsc
@ -170,10 +171,11 @@ class TestAgentOperator(base.TestCase):
mock.patch.object(PCIOperator, 'pci_get_device_attrs'), mock.patch.object(PCIOperator, 'pci_get_device_attrs'),
mock.patch.object(PCIOperator, 'inics_get'), mock.patch.object(PCIOperator, 'inics_get'),
mock.patch.object(PCIOperator, 'pci_devices_get'), mock.patch.object(PCIOperator, 'pci_devices_get'),
mock.patch.object(AgentManager, 'subfunctions_list_get'),
mock.patch.object(AgentManager, '_acquire_network_config_lock'), mock.patch.object(AgentManager, '_acquire_network_config_lock'),
mock.patch.object(AgentManager, '_release_network_config_lock')) as ( mock.patch.object(AgentManager, '_release_network_config_lock')) as (
mock_net_attrs, mock_device_attrs, mock_nics, mock_devices, mock_net_attrs, mock_device_attrs, mock_nics, mock_devices,
aquire_lock, release_lock): mock_subfunctions, aquire_lock, release_lock):
def fake_get_net_attrs(a): def fake_get_net_attrs(a):
return FAKE_PORT_ATTRIBUTES return FAKE_PORT_ATTRIBUTES
@ -187,26 +189,119 @@ class TestAgentOperator(base.TestCase):
def fake_get_devices(): def fake_get_devices():
return FAKE_DEVICES return FAKE_DEVICES
def fake_subfunctions_list_get():
return self.subfunctions_list
mock_net_attrs.side_effect = fake_get_net_attrs mock_net_attrs.side_effect = fake_get_net_attrs
mock_device_attrs.side_effect = fake_get_device_attrs mock_device_attrs.side_effect = fake_get_device_attrs
mock_nics.side_effect = fake_get_nics mock_nics.side_effect = fake_get_nics
mock_devices.side_effect = fake_get_devices mock_devices.side_effect = fake_get_devices
mock_subfunctions.side_effect = fake_subfunctions_list_get
ports, devices, macs = self.agent_manager._get_ports_inventory() ports, devices, macs = self.agent_manager._get_ports_inventory()
return ports, devices, macs return ports, devices, macs
@mock.patch('os.path.exists') @mock.patch('os.path.exists')
def test_get_pci_inventory_before_worker_initial_config_complete(self, mock_exists): def test_get_pci_inventory_during_network_boot_install(self, mock_exists):
def file_exists_side_effect(filename): def file_exists_side_effect(filename):
# Neither the initial nor volatile worker config complete flags are set if filename == constants.FIRST_BOOT_FLAG:
return False # first boot flag is set.
return True
else:
# ansible bootstrap flag is not set.
# Neither the initial nor volatile worker config complete flags are set
return False
self.agent_manager._first_boot_flag = True
mock_exists.side_effect = file_exists_side_effect mock_exists.side_effect = file_exists_side_effect
self.subfunctions_list = [constants.WORKER]
ports, devices, macs = self._get_ports_inventory() ports, devices, macs = self._get_ports_inventory()
assert len(ports) == 1 assert len(ports) == 1
assert len(devices) == 1 assert len(devices) == 1
assert len(macs) == 1 assert len(macs) == 1
@mock.patch('os.path.exists')
def test_get_pci_inventory_during_bootstrap_fresh_install(self, mock_exists):
def file_exists_side_effect(filename):
if filename == constants.ANSIBLE_BOOTSTRAP_FLAG:
# ansible bootstrap flag is set.
return True
else:
# Neither the initial nor volatile worker config complete flags are set
return False
mock_exists.side_effect = file_exists_side_effect
self.subfunctions_list = [constants.WORKER]
ports, devices, macs = self._get_ports_inventory()
assert len(ports) == 1
assert len(devices) == 1
assert len(macs) == 1
@mock.patch('os.path.exists')
def test_get_pci_inventory_during_restore(self, mock_exists):
def file_exists_side_effect(filename):
if filename in [constants.ANSIBLE_BOOTSTRAP_FLAG,
tsc.RESTORE_IN_PROGRESS_FLAG]:
# Both ansible bootstrap and restore flag are set.
return True
else:
# Neither the initial nor volatile worker config complete flags are set
return False
mock_exists.side_effect = file_exists_side_effect
self.subfunctions_list = [constants.WORKER]
ports, devices, macs = self._get_ports_inventory()
assert len(ports) == 1
assert len(devices) == 1
assert len(macs) == 1
@mock.patch('os.path.exists')
def test_get_pci_inventory_controller_before_config_complete(self, mock_exists):
def file_exists_side_effect(filename):
# Neither the initial nor volatile controller config complete flags are set
# Neither first boot nor ansible bootstrap flag are not set.
return False
mock_exists.side_effect = file_exists_side_effect
self.subfunctions_list = [constants.CONTROLLER]
ports, devices, macs = self._get_ports_inventory()
assert len(ports) == 1
assert len(devices) == 1
assert len(macs) == 1
@mock.patch('os.path.exists')
def test_get_pci_inventory_storage_before_config_complete(self, mock_exists):
def file_exists_side_effect(filename):
# Neither the initial nor volatile storage config complete flags are set
# Neither first boot nor ansible bootstrap flag are not set.
return False
mock_exists.side_effect = file_exists_side_effect
self.subfunctions_list = [constants.STORAGE]
ports, devices, macs = self._get_ports_inventory()
assert len(ports) == 1
assert len(devices) == 1
assert len(macs) == 1
@mock.patch('os.path.exists')
def test_get_pci_inventory_before_worker_initial_config_complete(self, mock_exists):
def file_exists_side_effect(filename):
# Neither the initial nor volatile worker config complete flags are set
# Neither first boot nor ansible bootstrap flag are not set.
return False
mock_exists.side_effect = file_exists_side_effect
self.subfunctions_list = [constants.WORKER]
ports, devices, macs = self._get_ports_inventory()
assert len(ports) == 0
assert len(devices) == 0
assert len(macs) == 0
@mock.patch('os.path.exists') @mock.patch('os.path.exists')
def test_get_pci_inventory_before_worker_config_complete(self, mock_exists): def test_get_pci_inventory_before_worker_config_complete(self, mock_exists):
def file_exists_side_effect(filename): def file_exists_side_effect(filename):
@ -214,8 +309,11 @@ class TestAgentOperator(base.TestCase):
# Only the initial worker config complete flag is set # Only the initial worker config complete flag is set
return True return True
else: else:
# worker config complete is not set.
# Neither first boot nor ansible bootstrap flag are set.
return False return False
mock_exists.side_effect = file_exists_side_effect mock_exists.side_effect = file_exists_side_effect
self.subfunctions_list = [constants.WORKER]
ports, devices, macs = self._get_ports_inventory() ports, devices, macs = self._get_ports_inventory()
assert len(ports) == 0 assert len(ports) == 0
@ -230,8 +328,10 @@ class TestAgentOperator(base.TestCase):
# Both of the initial and volatile worker config complete flags are set # Both of the initial and volatile worker config complete flags are set
return True return True
else: else:
# Neither first boot nor ansible bootstrap flag are set.
return False return False
mock_exists.side_effect = file_exists_side_effect mock_exists.side_effect = file_exists_side_effect
self.subfunctions_list = [constants.WORKER]
ports, devices, macs = self._get_ports_inventory() ports, devices, macs = self._get_ports_inventory()
for dev in devices: for dev in devices:
@ -250,6 +350,7 @@ class TestAgentOperator(base.TestCase):
else: else:
return False return False
mock_exists.side_effect = file_exists_side_effect mock_exists.side_effect = file_exists_side_effect
self.subfunctions_list = [constants.WORKER]
ports, devices, macs = self._get_ports_inventory() ports, devices, macs = self._get_ports_inventory()
for dev in devices: for dev in devices: