From d5fbf8913f0990f5d0e3b99edb79a8d8da801b12 Mon Sep 17 00:00:00 2001 From: Jessica Castelino Date: Fri, 12 Mar 2021 13:43:49 -0500 Subject: [PATCH] Objectify firmware audit data Recently merged commit broke firmware audit and caused firmware_sync_status to be unknown even after the device image was uploaded on system controller. This commit fixes firmware audit by objectify the firmware audit data similar to patch and kubernetes audit data. Change-Id: Ibb53641b9ead78767523612a1cff8c8993c874dd Story: 2007267 Task: 42048 Signed-off-by: Jessica Castelino --- .../dcmanager/audit/firmware_audit.py | 34 ++++++++++++++++++- .../unit/audit/test_firmware_audit_manager.py | 31 +++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/distributedcloud/dcmanager/audit/firmware_audit.py b/distributedcloud/dcmanager/audit/firmware_audit.py index dd331f44e..caf921448 100644 --- a/distributedcloud/dcmanager/audit/firmware_audit.py +++ b/distributedcloud/dcmanager/audit/firmware_audit.py @@ -34,6 +34,31 @@ from dcmanager.common import consts LOG = logging.getLogger(__name__) +class FirmwareAuditData(object): + def __init__(self, uuid, applied, pci_vendor, + pci_device, applied_labels): + self.uuid = uuid + self.applied = applied + self.pci_vendor = pci_vendor + self.pci_device = pci_device + self.applied_labels = applied_labels + + def to_dict(self): + return { + 'uuid': self.uuid, + 'applied': self.applied, + 'pci_vendor': self.pci_vendor, + 'pci_device': self.pci_device, + 'applied_labels': self.applied_labels, + } + + @classmethod + def from_dict(cls, values): + if values is None: + return None + return cls(**values) + + class FirmwareAudit(object): """Manages tasks related to firmware audits.""" @@ -77,7 +102,11 @@ class FirmwareAudit(object): # Filter images which have been applied on RegionOne for image in local_device_images: if image.applied: - filtered_images.append(image) + filtered_images.append(FirmwareAuditData(image.uuid, + image.applied, + image.pci_vendor, + image.pci_device, + image.applied_labels)) LOG.debug("RegionOne applied_images: %s" % filtered_images) except Exception: LOG.exception('Cannot retrieve device images for RegionOne, ' @@ -224,7 +253,10 @@ class FirmwareAudit(object): # Check that all device images applied in RegionOne # are applied and installed on this subcloud + # The audit_data for region one is a dictionary for image in audit_data: + # audit_data will be a dict from passing through RPC, so objectify + image = FirmwareAuditData.from_dict(image) proceed = self._check_subcloud_device_has_image(image, enabled_host_device_list, subcloud_device_image_states, diff --git a/distributedcloud/dcmanager/tests/unit/audit/test_firmware_audit_manager.py b/distributedcloud/dcmanager/tests/unit/audit/test_firmware_audit_manager.py index c8842627d..9f9ed23c5 100644 --- a/distributedcloud/dcmanager/tests/unit/audit/test_firmware_audit_manager.py +++ b/distributedcloud/dcmanager/tests/unit/audit/test_firmware_audit_manager.py @@ -376,6 +376,13 @@ class TestFirmwareAudit(base.DCManagerTestCase): self.mock_audit_worker_api.return_value = self.fake_audit_worker_api self.addCleanup(p.stop) + def _rpc_convert(self, object_list): + # Convert to dict like what would happen calling via RPC + dict_results = [] + for result in object_list: + dict_results.append(result.to_dict()) + return dict_results + def test_init(self): fm = firmware_audit.FirmwareAudit(self.ctxt, self.fake_dcmanager_api) @@ -406,6 +413,9 @@ class TestFirmwareAudit(base.DCManagerTestCase): patch_audit_data, firmware_audit_data, kubernetes_audit_data = \ am._get_audit_data(True, True, True) + # Convert to dict like what would happen calling via RPC + firmware_audit_data = self._rpc_convert(firmware_audit_data) + for name in ['subcloud1', 'subcloud2']: fm.subcloud_firmware_audit(name, firmware_audit_data) expected_calls = [ @@ -439,6 +449,9 @@ class TestFirmwareAudit(base.DCManagerTestCase): patch_audit_data, firmware_audit_data, kubernetes_audit_data = \ am._get_audit_data(True, True, True) + # Convert to dict like what would happen calling via RPC + firmware_audit_data = self._rpc_convert(firmware_audit_data) + for name in ['subcloud1', 'subcloud2']: fm.subcloud_firmware_audit(name, firmware_audit_data) expected_calls = [ @@ -472,6 +485,9 @@ class TestFirmwareAudit(base.DCManagerTestCase): patch_audit_data, firmware_audit_data, kubernetes_audit_data = \ am._get_audit_data(True, True, True) + # Convert to dict like what would happen calling via RPC + firmware_audit_data = self._rpc_convert(firmware_audit_data) + for name in ['subcloud1', 'subcloud2']: fm.subcloud_firmware_audit(name, firmware_audit_data) expected_calls = [ @@ -505,6 +521,9 @@ class TestFirmwareAudit(base.DCManagerTestCase): patch_audit_data, firmware_audit_data, kubernetes_audit_data = \ am._get_audit_data(True, True, True) + # Convert to dict like what would happen calling via RPC + firmware_audit_data = self._rpc_convert(firmware_audit_data) + for name in ['subcloud1', 'subcloud2']: fm.subcloud_firmware_audit(name, firmware_audit_data) expected_calls = [ @@ -538,6 +557,9 @@ class TestFirmwareAudit(base.DCManagerTestCase): patch_audit_data, firmware_audit_data, kubernetes_audit_data = \ am._get_audit_data(True, True, True) + # Convert to dict like what would happen calling via RPC + firmware_audit_data = self._rpc_convert(firmware_audit_data) + for name in ['subcloud1', 'subcloud2']: fm.subcloud_firmware_audit(name, firmware_audit_data) expected_calls = [ @@ -571,6 +593,9 @@ class TestFirmwareAudit(base.DCManagerTestCase): patch_audit_data, firmware_audit_data, kubernetes_audit_data = \ am._get_audit_data(True, True, True) + # Convert to dict like what would happen calling via RPC + firmware_audit_data = self._rpc_convert(firmware_audit_data) + for name in ['subcloud1', 'subcloud2']: fm.subcloud_firmware_audit(name, firmware_audit_data) expected_calls = [ @@ -604,6 +629,9 @@ class TestFirmwareAudit(base.DCManagerTestCase): patch_audit_data, firmware_audit_data, kubernetes_audit_data = \ am._get_audit_data(True, True, True) + # Convert to dict like what would happen calling via RPC + firmware_audit_data = self._rpc_convert(firmware_audit_data) + for name in ['subcloud1', 'subcloud2']: fm.subcloud_firmware_audit(name, firmware_audit_data) expected_calls = [ @@ -637,6 +665,9 @@ class TestFirmwareAudit(base.DCManagerTestCase): patch_audit_data, firmware_audit_data, kubernetes_audit_data = \ am._get_audit_data(True, True, True) + # Convert to dict like what would happen calling via RPC + firmware_audit_data = self._rpc_convert(firmware_audit_data) + for name in ['subcloud1', 'subcloud2']: fm.subcloud_firmware_audit(name, firmware_audit_data) expected_calls = [