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)
Beispiel #3
0
 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
Beispiel #6
0
 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