def test_patch_nontrivial_roles(self): metadata_manager = MetadataManager(["qualifier"]) this_dir = os.path.dirname(os.path.realpath(__file__)) metadata_dir = os.path.join(this_dir, 'metadata') self.assertTrue(metadata_manager.read_metadata_from_dir(metadata_dir)) metadata_container = metadata_manager.metadata_container role_administrator_json = { "@odata.type": "#Role.v1_0_0.Role", "Description": "Administrator User Role", "OemPrivileges": ["OemClearLog", "OemPowerControl"], "@odata.id": "/redfish/v1/AccountService/Roles/Administrator", "@odata.context": "/redfish/v1/$metadata#AccountService/Roles/Administrator/$entity", "AssignedPrivileges": [ "Login", "ConfigureManager", "ConfigureUsers", "ConfigureSelf", "ConfigureComponents" ], "Id": "Administrator", "IsPredefined": True, "Name": "User Role" } role_operator_json = { "@odata.type": "#Role.v1_0_0.Role", "Description": "Operator User Role", "OemPrivileges": [], "@odata.id": "/redfish/v1/AccountService/Roles/Operator", "@odata.context": "/redfish/v1/$metadata#AccountService/Roles/Operator/$entity", "AssignedPrivileges": ["Login", "ConfigureSelf", "ConfigureComponents"], "Id": "Operator", "IsPredefined": True, "Name": "User Role" } role_readonly_json = { "@odata.type": "#Role.v1_0_0.Role", "Description": "ReadOnly User Role", "OemPrivileges": [], "@odata.id": "/redfish/v1/AccountService/Roles/ReadOnly", "@odata.context": "/redfish/v1/$metadata#AccountService/Roles/ReadOnly/$entity", "AssignedPrivileges": ["Login", "ConfigureSelf"], "Id": "ReadOnly", "IsPredefined": True, "Name": "User Role" } role_custom_json = { "@odata.type": "#Role.v1_0_0.Role", "Description": "Custom User Role", "OemPrivileges": [], "@odata.id": "/redfish/v1/AccountService/Roles/Custom", "@odata.context": "/redfish/v1/$metadata#AccountService/Roles/ReadOnly/$entity", "AssignedPrivileges": ["Login", "ConfigureSelf"], "Id": "ReadOnly", "IsPredefined": False, "Name": "Custom Role" } self.discovery_container.add_resource( ApiResource("/redfish/v1/AccountService/Roles/Administrator", "https://localhost:8443", role_administrator_json, "#Role.v1_0_0.Role")) self.discovery_container.add_resource( ApiResource("/redfish/v1/AccountService/Roles/Operator", "https://localhost:8443", role_operator_json, "#Role.v1_0_0.Role")) self.discovery_container.add_resource( ApiResource("/redfish/v1/AccountService/Roles/ReadOnly", "https://localhost:8443", role_readonly_json, "#Role.v1_0_0.Role")) self.discovery_container.add_resource( ApiResource("/redfish/v1/AccountService/Roles/Custom", "https://localhost:8443", role_custom_json, "#Role.v1_0_0.Custom")) with mock.patch('cts_core.commons.api_caller.ApiCaller.__init__' ) as api_caller_init_mock: api_caller_init_mock.return_value = None validator = MetadataPatchValidator(metadata_container, None, PatchingStrategy2_2()) # this ValidationStatus.BLOCKED should be not affect final ValidationStatus validator._verify_property = MagicMock( return_value=(ValidationStatus.PASSED, None)) validator._restore_property = MagicMock( return_value=ValidationStatus.PASSED) validator._patch_property = MagicMock( return_value=(True, True, ValidationStatus.PASSED)) with mock.patch( 'cts_core.validation.patch.metadata_patch_validator.MetadataPatchValidator' '._validate_resource') as validate_resource: with StdoutCapture() as out: self.assertEqual( ValidationStatus.PASSED, validator.validate(self.discovery_container)) self.assertEquals( 1, validate_resource.call_count) # only for 'custom' role
def test_patch_nontrivial_boot_property(self): metadata_manager = MetadataManager(["qualifier"]) this_dir = os.path.dirname(os.path.realpath(__file__)) metadata_dir = os.path.join(this_dir, 'metadata') self.assertTrue(metadata_manager.read_metadata_from_dir(metadata_dir)) metadata_container = metadata_manager.metadata_container entity_json = { "@odata.context": "/redfish/v1/$metadata#ComputerSystem.ComputerSystem", "@odata.id": "/redfish/v1/Systems/34", "@odata.type": "#ComputerSystem.v1_3_0.ComputerSystem", "Id": "34", "Name": "Computer System", "Description": "Computer System description", "SystemType": "Physical", "AssetTag": "AZaz09[]!@#$%^&*()_+", "Manufacturer": None, "Model": None, "SKU": None, "SerialNumber": None, "PartNumber": None, "UUID": "1d7a1040-05e4-11e6-a108-54ab3a8ec80f", "HostName": None, "Status": { "State": "Enabled", "Health": "OK", "HealthRollup": "OK" }, "IndicatorLED": None, "PowerState": "Off", "BiosVersion": "F20A3A03", "Boot": { "@odata.type": "#ComputerSystem.v1_1_0.Boot", "BootSourceOverrideEnabled": "Disabled", "BootSourceOverrideTarget": "None", "*****@*****.**": ["Hdd", "Pxe", "None", "RemoteDrive"], "BootSourceOverrideMode": "Legacy", "*****@*****.**": ["Legacy", "UEFI"] }, "ProcessorSummary": { "Count": 2, "Model": "Intel(R) Xeon(R)", "Status": { "State": "Enabled", "Health": "OK", "HealthRollup": "OK" } }, "MemorySummary": { "TotalSystemMemoryGiB": 30.52, "Status": { "State": "Enabled", "Health": "OK", "HealthRollup": "OK" } }, "Processors": { "@odata.id": "/redfish/v1/Systems/34/Processors" }, "EthernetInterfaces": { "@odata.id": "/redfish/v1/Systems/34/EthernetInterfaces" }, "NetworkInterfaces": { "@odata.id": "/redfish/v1/Systems/34/NetworkInterfaces" }, "Storage": { "@odata.id": "/redfish/v1/Systems/34/Storage" }, "Memory": { "@odata.id": "/redfish/v1/Systems/34/Memory" }, "PCIeDevices": [], "PCIeFunctions": [], "TrustedModules": [], "Links": { "@odata.type": "#ComputerSystem.v1_2_0.Links", "Chassis": [{ "@odata.id": "/redfish/v1/Chassis/38" }], "Endpoints": [], "ManagedBy": [{ "@odata.id": "/redfish/v1/Managers/38" }], "Oem": {} }, "Actions": { "#ComputerSystem.Reset": { "target": "/redfish/v1/Systems/34/Actions/ComputerSystem.Reset", "*****@*****.**": [ "On", "ForceOff", "GracefulShutdown", "GracefulRestart", "ForceRestart" ] }, "Oem": { "#Intel.Oem.ChangeTPMState": { "target": "/redfish/v1/Systems/34/Actions/Oem/Intel.Oem.ChangeTPMState", "*****@*****.**": [] } } }, "Oem": { "Intel_RackScale": { "@odata.type": "#Intel.Oem.ComputerSystem", "PciDevices": [], "PCIeConnectionId": [], "ProcessorSockets": 2, "MemorySockets": 16, "DiscoveryState": "Basic", "UserModeEnabled": None, "TrustedExecutionTechnologyEnabled": None, "Metrics": { "@odata.id": "/redfish/v1/Systems/34/Metrics" } } } } self.discovery_container.add_resource( ApiResource("/redfish/v1/Systems/34", "https://localhost:8443", entity_json, "#ComputerSystem.v1_3_0.ComputerSystem")) with mock.patch('cts_core.commons.api_caller.ApiCaller.__init__' ) as api_caller_init_mock: api_caller_init_mock.return_value = None validator = MetadataPatchValidator(metadata_container, None, PatchingStrategy2_2()) # this ValidationStatus.BLOCKED should be not affect final ValidationStatus validator._verify_property = MagicMock( return_value=(ValidationStatus.PASSED, None)) validator._restore_property = MagicMock( return_value=ValidationStatus.PASSED) validator._patch_property = MagicMock( return_value=(True, True, ValidationStatus.PASSED)) with mock.patch( 'cts_core.commons.api_caller.ApiCaller.patch_resource' ) as api_caller_patch_resource: api_caller_patch_resource.return_value = ( RequestStatus.SUCCESS, 200, None, None) with mock.patch( 'cts_core.commons.api_caller.ApiCaller.get_resource' ) as api_caller_get_resource: api_caller_get_resource.return_value = (Link( "/redfish/v1/Systems/34", "https://localhost:8443"), RequestStatus.SUCCESS, 200, entity_json, None) with StdoutCapture() as out: self.assertEqual( ValidationStatus.PASSED, validator.validate(self.discovery_container)) self.assertNotIn('WARNING::Skipping non-trivial property', out.raw)
def load(self, metadata_ref, qualifiers): if os.path.isdir(metadata_ref): metadata_manager = MetadataManager(qualifiers) if metadata_manager.read_metadata_from_dir(metadata_ref): return metadata_manager.metadata_container return None
def test_patch_nontrivial_boot_property(self): metadata_manager = MetadataManager(["qualifier"]) this_dir = os.path.dirname(os.path.realpath(__file__)) metadata_dir = os.path.join(this_dir, 'metadata') self.assertTrue(metadata_manager.read_metadata_from_dir(metadata_dir)) metadata_container = metadata_manager.metadata_container entity_json ={ "@odata.context": "/redfish/v1/$metadata#ComputerSystem.ComputerSystem", "@odata.id": "/redfish/v1/Systems/34", "@odata.type": "#ComputerSystem.v1_3_0.ComputerSystem", "Id": "34", "Name": "Computer System", "Description": "Computer System description", "SystemType": "Physical", "AssetTag": "AZaz09[]!@#$%^&*()_+", "Manufacturer": None, "Model": None, "SKU": None, "SerialNumber": None, "PartNumber": None, "UUID": "1d7a1040-05e4-11e6-a108-54ab3a8ec80f", "HostName": None, "Status": { "State": "Enabled", "Health": "OK", "HealthRollup": "OK" }, "IndicatorLED": None, "PowerState": "Off", "BiosVersion": "F20A3A03", "Boot": { "@odata.type": "#ComputerSystem.v1_1_0.Boot", "BootSourceOverrideEnabled": "Disabled", "BootSourceOverrideTarget": "None", "*****@*****.**": [ "Hdd", "Pxe", "None", "RemoteDrive" ], "BootSourceOverrideMode": "Legacy", "*****@*****.**": [ "Legacy", "UEFI" ] }, "ProcessorSummary": { "Count": 2, "Model": "Intel(R) Xeon(R)", "Status": { "State": "Enabled", "Health": "OK", "HealthRollup": "OK" } }, "MemorySummary": { "TotalSystemMemoryGiB": 30.52, "Status": { "State": "Enabled", "Health": "OK", "HealthRollup": "OK" } }, "Processors": { "@odata.id": "/redfish/v1/Systems/34/Processors" }, "EthernetInterfaces": { "@odata.id": "/redfish/v1/Systems/34/EthernetInterfaces" }, "NetworkInterfaces": { "@odata.id": "/redfish/v1/Systems/34/NetworkInterfaces" }, "Storage": { "@odata.id": "/redfish/v1/Systems/34/Storage" }, "Memory": { "@odata.id": "/redfish/v1/Systems/34/Memory" }, "PCIeDevices": [], "PCIeFunctions": [], "TrustedModules": [], "Links": { "@odata.type": "#ComputerSystem.v1_2_0.Links", "Chassis": [ { "@odata.id": "/redfish/v1/Chassis/38" } ], "Endpoints": [], "ManagedBy": [ { "@odata.id": "/redfish/v1/Managers/38" } ], "Oem": {} }, "Actions": { "#ComputerSystem.Reset": { "target": "/redfish/v1/Systems/34/Actions/ComputerSystem.Reset", "*****@*****.**": [ "On", "ForceOff", "GracefulShutdown", "GracefulRestart", "ForceRestart" ] }, "Oem": { "#Intel.Oem.ChangeTPMState": { "target": "/redfish/v1/Systems/34/Actions/Oem/Intel.Oem.ChangeTPMState", "*****@*****.**": [] } } }, "Oem": { "Intel_RackScale": { "@odata.type": "#Intel.Oem.ComputerSystem", "PciDevices": [], "PCIeConnectionId": [], "ProcessorSockets": 2, "MemorySockets": 16, "DiscoveryState": "Basic", "UserModeEnabled": None, "TrustedExecutionTechnologyEnabled": None, "Metrics": { "@odata.id": "/redfish/v1/Systems/34/Metrics" } } } } self.discovery_container.add_resource(ApiResource("/redfish/v1/Systems/34", "https://localhost:8443", entity_json, "#ComputerSystem.v1_3_0.ComputerSystem")) with mock.patch('cts_core.commons.api_caller.ApiCaller.__init__') as api_caller_init_mock: api_caller_init_mock.return_value = None validator = MetadataPatchValidator(metadata_container, None, PatchingStrategy2_2()) # this ValidationStatus.BLOCKED should be not affect final ValidationStatus validator._verify_property = MagicMock(return_value=(ValidationStatus.PASSED, None)) validator._restore_property = MagicMock(return_value=ValidationStatus.PASSED) validator._patch_property = MagicMock(return_value=(True, True, ValidationStatus.PASSED)) with mock.patch('cts_core.commons.api_caller.ApiCaller.patch_resource') as api_caller_patch_resource: api_caller_patch_resource.return_value = (RequestStatus.SUCCESS, 200, None, None) with mock.patch('cts_core.commons.api_caller.ApiCaller.get_resource') as api_caller_get_resource: api_caller_get_resource.return_value = (Link("/redfish/v1/Systems/34", "https://localhost:8443"), RequestStatus.SUCCESS, 200, entity_json, None) with StdoutCapture() as out: self.assertEqual(ValidationStatus.PASSED, validator.validate(self.discovery_container)) self.assertNotIn('WARNING::Skipping non-trivial property', out.raw)
def test_patch_nontrivial_roles(self): metadata_manager = MetadataManager(["qualifier"]) this_dir = os.path.dirname(os.path.realpath(__file__)) metadata_dir = os.path.join(this_dir, 'metadata') self.assertTrue(metadata_manager.read_metadata_from_dir(metadata_dir)) metadata_container = metadata_manager.metadata_container role_administrator_json = { "@odata.type": "#Role.v1_0_0.Role", "Description": "Administrator User Role", "OemPrivileges": [ "OemClearLog", "OemPowerControl" ], "@odata.id": "/redfish/v1/AccountService/Roles/Administrator", "@odata.context": "/redfish/v1/$metadata#AccountService/Roles/Administrator/$entity", "AssignedPrivileges": [ "Login", "ConfigureManager", "ConfigureUsers", "ConfigureSelf", "ConfigureComponents" ], "Id": "Administrator", "IsPredefined": True, "Name": "User Role" } role_operator_json = { "@odata.type": "#Role.v1_0_0.Role", "Description": "Operator User Role", "OemPrivileges": [], "@odata.id": "/redfish/v1/AccountService/Roles/Operator", "@odata.context": "/redfish/v1/$metadata#AccountService/Roles/Operator/$entity", "AssignedPrivileges": [ "Login", "ConfigureSelf", "ConfigureComponents" ], "Id": "Operator", "IsPredefined": True, "Name": "User Role" } role_readonly_json = { "@odata.type": "#Role.v1_0_0.Role", "Description": "ReadOnly User Role", "OemPrivileges": [], "@odata.id": "/redfish/v1/AccountService/Roles/ReadOnly", "@odata.context": "/redfish/v1/$metadata#AccountService/Roles/ReadOnly/$entity", "AssignedPrivileges": [ "Login", "ConfigureSelf" ], "Id": "ReadOnly", "IsPredefined": True, "Name": "User Role" } role_custom_json = { "@odata.type": "#Role.v1_0_0.Role", "Description": "Custom User Role", "OemPrivileges": [], "@odata.id": "/redfish/v1/AccountService/Roles/Custom", "@odata.context": "/redfish/v1/$metadata#AccountService/Roles/ReadOnly/$entity", "AssignedPrivileges": [ "Login", "ConfigureSelf" ], "Id": "ReadOnly", "IsPredefined": False, "Name": "Custom Role" } self.discovery_container.add_resource(ApiResource("/redfish/v1/AccountService/Roles/Administrator", "https://localhost:8443", role_administrator_json, "#Role.v1_0_0.Role")) self.discovery_container.add_resource(ApiResource("/redfish/v1/AccountService/Roles/Operator", "https://localhost:8443", role_operator_json, "#Role.v1_0_0.Role")) self.discovery_container.add_resource(ApiResource("/redfish/v1/AccountService/Roles/ReadOnly", "https://localhost:8443", role_readonly_json, "#Role.v1_0_0.Role")) self.discovery_container.add_resource(ApiResource("/redfish/v1/AccountService/Roles/Custom", "https://localhost:8443", role_custom_json, "#Role.v1_0_0.Custom")) with mock.patch('cts_core.commons.api_caller.ApiCaller.__init__') as api_caller_init_mock: api_caller_init_mock.return_value = None validator = MetadataPatchValidator(metadata_container, None, PatchingStrategy2_2()) # this ValidationStatus.BLOCKED should be not affect final ValidationStatus validator._verify_property = MagicMock(return_value=(ValidationStatus.PASSED, None)) validator._restore_property = MagicMock(return_value=ValidationStatus.PASSED) validator._patch_property = MagicMock(return_value=(True, True, ValidationStatus.PASSED)) with mock.patch('cts_core.validation.patch.metadata_patch_validator.MetadataPatchValidator' '._validate_resource') as validate_resource: with StdoutCapture() as out: self.assertEqual(ValidationStatus.PASSED, validator.validate(self.discovery_container)) self.assertEquals(1, validate_resource.call_count) # only for 'custom' role
def load(self, metadata_ref, qualifiers): if os.path.isdir(metadata_ref): metadata_manager = MetadataManager(qualifiers) if metadata_manager.read_metadata_from_dir(metadata_ref): return metadata_manager.metadata_container return None