def test_fetch_url_urlerror(open_url_mock, fake_ansible_module):
    open_url_mock.side_effect = urllib_error.URLError('TESTS')
    r, info = fetch_url(fake_ansible_module, 'http://ansible.com/')
    assert info == {
        'msg': 'Request failed: <urlopen error TESTS>',
        'status': -1,
        'url': 'http://ansible.com/'
    }
Beispiel #2
0
 def test_check_id_exists_exceptions(
         self, idrac_connection_mock_for_redfish_storage_controller):
     f_module = self.get_module_mock()
     idrac_connection_mock_for_redfish_storage_controller.invoke_request.side_effect = urllib_error.URLError(
         'TESTS')
     with pytest.raises(Exception) as exc:
         self.module.check_id_exists(
             f_module, idrac_connection_mock_for_redfish_storage_controller,
             "item", "uri")
     assert "TESTS" in exc.value.args[0]
Beispiel #3
0
class TestIdracRedfishStorageController(FakeAnsibleModule):
    module = idrac_redfish_storage_controller

    msg = "All of the following: key, key_id and old_key are required for ReKey operation."

    @pytest.mark.parametrize("input", [{
        "param": {
            "command": "ReKey",
            "mode": "LKM",
            "key_id": "myid"
        },
        "msg": msg
    }, {
        "param": {
            "command": "ReKey",
            "mode": "LKM",
            "old_key": "mykey"
        },
        "msg": msg
    }, {
        "param": {
            "command": "ReKey",
            "mode": "LKM",
            "key": "mykey"
        },
        "msg": msg
    }])
    def test_validate_inputs_error_case_01(self, input):
        f_module = self.get_module_mock(params=input["param"])
        with pytest.raises(Exception) as exc:
            self.module.validate_inputs(f_module)
        assert exc.value.args[0] == input["msg"]

    @pytest.mark.parametrize("input", [{"controller_id": "c1"}])
    def test_check_encryption_capability_failure(
            self, idrac_connection_mock_for_redfish_storage_controller,
            redfish_response_mock, input):
        f_module = self.get_module_mock(params=input)
        msg = "Encryption is not supported on the storage controller: c1"
        redfish_response_mock.success = True
        redfish_response_mock.json_data = {
            'Oem': {
                'Dell': {
                    'DellController': {
                        'SecurityStatus': "EncryptionNotCapable"
                    }
                }
            }
        }
        with pytest.raises(Exception) as exc:
            self.module.check_encryption_capability(
                f_module, idrac_connection_mock_for_redfish_storage_controller)
        assert exc.value.args[0] == msg

    def test_check_raid_service(
            self, idrac_connection_mock_for_redfish_storage_controller,
            redfish_response_mock):
        f_module = self.get_module_mock()
        msg = "Installed version of iDRAC does not support this feature using Redfish API"
        redfish_response_mock.success = False
        with pytest.raises(Exception) as exc:
            self.module.check_raid_service(
                f_module, idrac_connection_mock_for_redfish_storage_controller)
        assert exc.value.args[0] == msg

    @pytest.mark.parametrize("input", [{
        "error": urllib_error.URLError("TESTS")
    }])
    def test_check_raid_service_exceptions(
            self, idrac_connection_mock_for_redfish_storage_controller, input):
        f_module = self.get_module_mock(params=input)
        idrac_connection_mock_for_redfish_storage_controller.invoke_request.side_effect = input[
            "error"]
        with pytest.raises(Exception) as exc:
            self.module.check_raid_service(
                f_module, idrac_connection_mock_for_redfish_storage_controller)
        assert "TESTS" in exc.value.args[0]

    def test_check_raid_service_HttpError_exception(
            self, idrac_connection_mock_for_redfish_storage_controller,
            redfish_default_args):
        f_module = self.get_module_mock(params=redfish_default_args)
        json_str = to_text(json.dumps({"data": "out"}))
        idrac_connection_mock_for_redfish_storage_controller.invoke_request.side_effect = HTTPError(
            'http://testhost.com', 400, 'http error message',
            {"accept-type": "application/json"}, StringIO(json_str))
        with pytest.raises(Exception) as exc:
            self.module.check_raid_service(
                f_module, idrac_connection_mock_for_redfish_storage_controller)
        assert exc.value.args[
            0] == "Installed version of iDRAC does not support this feature using Redfish API"

    @pytest.mark.parametrize("input", [{"volume_id": ["v1"]}])
    def test_check_volume_array_exists(
            self, idrac_connection_mock_for_redfish_storage_controller,
            redfish_response_mock, input):
        f_module = self.get_module_mock(params=input)
        msg = "Unable to locate the virtual disk with the ID: v1"
        redfish_response_mock.success = False
        with pytest.raises(Exception) as exc:
            self.module.check_volume_array_exists(
                f_module, idrac_connection_mock_for_redfish_storage_controller)
        assert exc.value.args[0] == msg

    def test_check_volume_array_exists_HttpError_exceptions(
            self, redfish_response_mock, redfish_default_args,
            idrac_connection_mock_for_redfish_storage_controller):
        redfish_default_args.update({"volume_id": ["v1"]})
        redfish_response_mock.json_data = {"volume_id": ["v1"]}
        f_module = self.get_module_mock(params=redfish_default_args)
        json_str = to_text(json.dumps({"data": "out"}))
        idrac_connection_mock_for_redfish_storage_controller.invoke_request.side_effect = HTTPError(
            'http://testhost.com', 400, 'http error message',
            {"accept-type": "application/json"}, StringIO(json_str))
        with pytest.raises(Exception) as exc:
            self.module.check_volume_array_exists(
                f_module, idrac_connection_mock_for_redfish_storage_controller)
        assert exc.value.args[
            0] == "Unable to locate the virtual disk with the ID: v1"

    def test_check_volume_array_exists_exceptions(
            self, redfish_response_mock, redfish_default_args,
            idrac_connection_mock_for_redfish_storage_controller):
        redfish_default_args.update({"volume_id": ["v1"]})
        redfish_response_mock.json_data = {"volume_id": ["v1"]}
        f_module = self.get_module_mock(params=redfish_default_args)
        idrac_connection_mock_for_redfish_storage_controller.invoke_request.side_effect = urllib_error.URLError(
            'TESTS')
        with pytest.raises(Exception) as exc:
            self.module.check_volume_array_exists(
                f_module, idrac_connection_mock_for_redfish_storage_controller)
        assert "TESTS" in exc.value.args[0]

    @pytest.mark.parametrize("input", [{"item": "x1"}])
    def test_check_id_exists(
            self, idrac_connection_mock_for_redfish_storage_controller,
            redfish_response_mock, input):
        f_module = self.get_module_mock(params=input)
        msg = "item with id x1 not found in system"
        redfish_response_mock.success = False
        with pytest.raises(Exception) as exc:
            self.module.check_id_exists(
                f_module, idrac_connection_mock_for_redfish_storage_controller,
                "item", "uri")
        assert exc.value.args[0] == msg

    def test_check_id_exists_exceptions(
            self, idrac_connection_mock_for_redfish_storage_controller):
        f_module = self.get_module_mock()
        idrac_connection_mock_for_redfish_storage_controller.invoke_request.side_effect = urllib_error.URLError(
            'TESTS')
        with pytest.raises(Exception) as exc:
            self.module.check_id_exists(
                f_module, idrac_connection_mock_for_redfish_storage_controller,
                "item", "uri")
        assert "TESTS" in exc.value.args[0]

    def test_check_id_exists_HttpError_exceptions(
            self, idrac_connection_mock_for_redfish_storage_controller,
            redfish_default_args):
        f_module = self.get_module_mock(params=redfish_default_args)
        f_module = self.get_module_mock(params=redfish_default_args)
        json_str = to_text(json.dumps({"data": "out"}))
        idrac_connection_mock_for_redfish_storage_controller.invoke_request.side_effect = HTTPError(
            'http://testhost.com', 400, 'http error message',
            {"accept-type": "application/json"}, StringIO(json_str))
        with pytest.raises(Exception) as exc:
            self.module.check_id_exists(
                f_module, idrac_connection_mock_for_redfish_storage_controller,
                "item", "uri")
        assert exc.value.args[0] == "item with id None not found in system"

    arg_list1 = [{
        "command": "ResetConfig",
        "controller_id": "c1"
    }, {
        "command": "RemoveControllerKey",
        "controller_id": "c1"
    }, {
        "command": "ReKey",
        "controller_id": "c1"
    }, {
        "command": "SetControllerKey",
        "controller_id": "c1",
        "key": "key",
        "key_id": "key_id"
    }, {
        "command": "AssignSpare",
        "volume_id": ["v1"],
        "target": "target"
    }]

    @pytest.mark.parametrize("param", arg_list1)
    def test_idrac_redfish_storage_controller_main_success_case_01(
            self, mocker, redfish_default_args, redfish_response_mock,
            idrac_connection_mock_for_redfish_storage_controller, param):
        mocker.patch(MODULE_PATH +
                     'idrac_redfish_storage_controller.validate_inputs')
        mocker.patch(MODULE_PATH +
                     'idrac_redfish_storage_controller.check_raid_service')
        mocker.patch(MODULE_PATH +
                     'idrac_redfish_storage_controller.check_id_exists')
        mocker.patch(
            MODULE_PATH +
            'idrac_redfish_storage_controller.check_volume_array_exists')
        mocker.patch(
            MODULE_PATH +
            'idrac_redfish_storage_controller.check_encryption_capability')
        f_module = self.get_module_mock(params=param)
        redfish_response_mock.success = True
        redfish_response_mock.headers = {"Location": "Jobs/1234"}
        redfish_default_args.update(param)
        result = self._run_module(redfish_default_args)
        assert result["changed"] is True
        assert result[
            'msg'] == "Successfully submitted the job that performs the {0} operation".format(
                param["command"])
        assert result["task"]["id"] == "1234"
        assert result["task"]["uri"] == "Jobs/1234"

    arg_list1 = [{
        "command": "ResetConfig",
        "controller_id": "c1"
    }, {
        "command": "RemoveControllerKey",
        "controller_id": "c1"
    }, {
        "command": "ReKey",
        "controller_id": "c1"
    }, {
        "command": "SetControllerKey",
        "controller_id": "c1",
        "key": "key",
        "key_id": "key_id"
    }, {
        "command": "AssignSpare",
        "target": "target"
    }]

    @pytest.mark.parametrize("param", arg_list1)
    def test_idrac_redfish_storage_controller_main_success_case_02(
            self, mocker, redfish_default_args, redfish_response_mock,
            idrac_connection_mock_for_redfish_storage_controller, param):
        mocker.patch(MODULE_PATH +
                     'idrac_redfish_storage_controller.validate_inputs')
        mocker.patch(MODULE_PATH +
                     'idrac_redfish_storage_controller.check_raid_service')
        mocker.patch(MODULE_PATH +
                     'idrac_redfish_storage_controller.check_id_exists')
        mocker.patch(
            MODULE_PATH +
            'idrac_redfish_storage_controller.check_volume_array_exists')
        mocker.patch(
            MODULE_PATH +
            'idrac_redfish_storage_controller.check_encryption_capability')
        f_module = self.get_module_mock(params=param)
        redfish_response_mock.success = True
        redfish_response_mock.headers = {"Location": "Jobs/1234"}
        redfish_default_args.update(param)
        result = self._run_module(redfish_default_args)
        assert result["changed"] is True
        assert result[
            'msg'] == "Successfully submitted the job that performs the {0} operation".format(
                param["command"])
        assert result["task"]["id"] == "1234"
        assert result["task"]["uri"] == "Jobs/1234"

    @pytest.mark.parametrize("exc_type", [
        RuntimeError, urllib_error.URLError, SSLValidationError,
        ConnectionError, KeyError, ImportError, ValueError, TypeError
    ])
    def test_idrac_redfish_storage_controller_main_exception_case(
            self, exc_type, mocker, redfish_default_args,
            redfish_response_mock,
            idrac_connection_mock_for_redfish_storage_controller):
        mocker.patch(
            MODULE_PATH +
            'idrac_redfish_storage_controller.check_encryption_capability',
            side_effect=exc_type('test'))
        mocker.patch(MODULE_PATH +
                     'idrac_redfish_storage_controller.check_raid_service',
                     side_effect=exc_type('test'))
        mocker.patch(MODULE_PATH +
                     'idrac_redfish_storage_controller.check_id_exists',
                     side_effect=exc_type('test'))
        mocker.patch(
            MODULE_PATH +
            'idrac_redfish_storage_controller.check_volume_array_exists',
            side_effect=exc_type('test'))
        mocker.patch(MODULE_PATH +
                     'idrac_redfish_storage_controller.validate_inputs',
                     side_effect=exc_type('test'))
        result = self._run_module_with_fail_json(redfish_default_args)
        assert 'power_state' not in result
        assert 'msg' in result
        assert result['failed'] is True

    arg_list1 = [{
        "command": "ResetConfig",
        "controller_id": "c1"
    }, {
        "command": "RemoveControllerKey",
        "controller_id": "c1"
    }, {
        "command": "ReKey",
        "controller_id": "c1"
    }, {
        "command": "SetControllerKey",
        "controller_id": "c1",
        "key": "key",
        "key_id": "key_id"
    }, {
        "command": "AssignSpare",
        "target": "target"
    }]

    @pytest.mark.parametrize("param", arg_list1)
    def test_idrac_redfish_main_HTTPError_case(
            self, param, idrac_connection_mock_for_redfish_storage_controller,
            redfish_default_args, mocker):
        redfish_default_args.update(param)
        json_str = to_text(json.dumps({"data": "out"}))
        mocker.patch(MODULE_PATH +
                     'idrac_redfish_storage_controller.check_raid_service',
                     side_effect=HTTPError('http://testhost.com', 400,
                                           'http error message',
                                           {"accept-type": "application/json"},
                                           StringIO(json_str)))
        result = self._run_module_with_fail_json(redfish_default_args)
        assert 'msg' in result
        assert result['failed'] is True
Beispiel #4
0
 def test_check_volume_array_exists_exceptions(
         self, redfish_response_mock, redfish_default_args,
         idrac_connection_mock_for_redfish_storage_controller):
     redfish_default_args.update({"volume_id": ["v1"]})
     redfish_response_mock.json_data = {"volume_id": ["v1"]}
     f_module = self.get_module_mock(params=redfish_default_args)
     idrac_connection_mock_for_redfish_storage_controller.invoke_request.side_effect = urllib_error.URLError(
         'TESTS')
     with pytest.raises(Exception) as exc:
         self.module.check_volume_array_exists(
             f_module, idrac_connection_mock_for_redfish_storage_controller)
     assert "TESTS" in exc.value.args[0]