Esempio n. 1
0
    def test_must_invoke(self):
        input_event = '"some data"'
        expected_env_vars = {
            "var1": "override_value1",
            "var2": "shell_env_value2"
        }

        manager = ContainerManager()
        local_runtime = LambdaRuntime(manager)
        runner = LocalLambdaRunner(local_runtime, self.mock_function_provider, self.cwd, self.env_var_overrides,
                                   debug_args=None, debug_port=None, aws_profile=None)

        # Append the real AWS credentials to the expected values.
        creds = runner.get_aws_creds()
        # default value for creds is not configured by the test. But coming from a downstream class
        expected_env_vars["AWS_SECRET_ACCESS_KEY"] = creds.get("secret", "defaultsecret")
        expected_env_vars["AWS_ACCESS_KEY_ID"] = creds.get("key", "defaultkey")
        expected_env_vars["AWS_REGION"] = creds.get("region", "us-east-1")

        stdout_stream = io.BytesIO()
        stderr_stream = io.BytesIO()
        runner.invoke(self.function_name, input_event, stdout=stdout_stream, stderr=stderr_stream)

        # stderr is where the Lambda container runtime logs are available. It usually contains requestId, start time
        # etc. So it is non-zero in size
        self.assertGreater(len(stderr_stream.getvalue().strip()), 0, "stderr stream must contain data")

        # This should contain all the environment variables passed to the function
        actual_output = json.loads(stdout_stream.getvalue().strip().decode('utf-8'))

        for key, value in expected_env_vars.items():
            self.assertTrue(key in actual_output, "Key '{}' must be in function output".format(key))
            self.assertEquals(actual_output.get(key), value)
Esempio n. 2
0
class TestLocalLambda_invoke(TestCase):
    def setUp(self):
        self.runtime_mock = Mock()
        self.function_provider_mock = Mock()
        self.cwd = "/my/current/working/directory"
        self.debug_context = None
        self.aws_profile = "myprofile"
        self.aws_region = "region"
        self.env_vars_values = {}

        self.local_lambda = LocalLambdaRunner(
            self.runtime_mock,
            self.function_provider_mock,
            self.cwd,
            env_vars_values=self.env_vars_values,
            debug_context=self.debug_context,
        )

    def test_must_work(self):
        name = "name"
        event = "event"
        stdout = "stdout"
        stderr = "stderr"
        function = Mock(functionname="name")
        invoke_config = "config"

        self.function_provider_mock.get_all.return_value = [function]
        self.local_lambda._get_invoke_config = Mock()
        self.local_lambda._get_invoke_config.return_value = invoke_config

        self.local_lambda.invoke(name, event, stdout, stderr)

        self.runtime_mock.invoke.assert_called_with(invoke_config,
                                                    event,
                                                    debug_context=None,
                                                    stdout=stdout,
                                                    stderr=stderr)

    def test_must_raise_if_function_not_found(self):
        function = Mock()
        function.name = "name"
        function.functionname = "FunctionLogicalId"

        self.function_provider_mock.get.return_value = None  # function not found
        self.function_provider_mock.get_all.return_value = [function]
        with self.assertRaises(FunctionNotFound):
            self.local_lambda.invoke("name", "event")
Esempio n. 3
0
class TestLocalLambda_invoke_with_container_host_option(TestCase):
    def setUp(self):
        self.runtime_mock = Mock()
        self.function_provider_mock = Mock()
        self.cwd = "/my/current/working/directory"
        self.debug_context = None
        self.aws_profile = "myprofile"
        self.aws_region = "region"
        self.env_vars_values = {}
        self.container_host = "localhost"
        self.container_host_interface = "127.0.0.1"

        self.local_lambda = LocalLambdaRunner(
            self.runtime_mock,
            self.function_provider_mock,
            self.cwd,
            env_vars_values=self.env_vars_values,
            debug_context=self.debug_context,
            container_host=self.container_host,
            container_host_interface=self.container_host_interface,
        )

    def test_must_work(self):
        name = "name"
        event = "event"
        stdout = "stdout"
        stderr = "stderr"
        function = Mock(functionname="name")
        invoke_config = "config"

        self.function_provider_mock.get_all.return_value = [function]
        self.local_lambda.get_invoke_config = Mock()
        self.local_lambda.get_invoke_config.return_value = invoke_config

        self.local_lambda.invoke(name, event, stdout, stderr)

        self.runtime_mock.invoke.assert_called_with(
            invoke_config,
            event,
            debug_context=None,
            stdout=stdout,
            stderr=stderr,
            container_host="localhost",
            container_host_interface="127.0.0.1",
        )
Esempio n. 4
0
class TestLocalLambda_invoke(TestCase):

    def setUp(self):
        self.runtime_mock = Mock()
        self.function_provider_mock = Mock()
        self.cwd = "/my/current/working/directory"
        self.debug_context = None
        self.aws_profile = "myprofile"
        self.aws_region = "region"
        self.env_vars_values = {}

        self.local_lambda = LocalLambdaRunner(self.runtime_mock,
                                              self.function_provider_mock,
                                              self.cwd,
                                              env_vars_values=self.env_vars_values,
                                              debug_context=self.debug_context)

    def test_must_work(self):
        name = "name"
        event = "event"
        stdout = "stdout"
        stderr = "stderr"
        function = Mock()
        invoke_config = "config"

        self.function_provider_mock.get.return_value = function
        self.local_lambda._get_invoke_config = Mock()
        self.local_lambda._get_invoke_config.return_value = invoke_config

        self.local_lambda.invoke(name, event, stdout, stderr)

        self.runtime_mock.invoke.assert_called_with(invoke_config, event,
                                                    debug_context=None,
                                                    stdout=stdout, stderr=stderr)

    def test_must_raise_if_function_not_found(self):
        function = Mock()
        function.name = 'FunctionLogicalId'

        self.function_provider_mock.get.return_value = None  # function not found
        self.function_provider_mock.get_all.return_value = [function]
        with self.assertRaises(FunctionNotFound):
            self.local_lambda.invoke("name", "event")
Esempio n. 5
0
class TestLocalLambda_invoke(TestCase):
    def setUp(self):
        self.runtime_mock = Mock()
        self.function_provider_mock = Mock()
        self.cwd = "/my/current/working/directory"
        self.debug_port = 123
        self.debug_args = "abc"
        self.aws_profile = "myprofile"
        self.env_vars_values = {}

        self.local_lambda = LocalLambdaRunner(self.runtime_mock,
                                              self.function_provider_mock,
                                              self.cwd, self.env_vars_values,
                                              self.debug_port, self.debug_args,
                                              self.aws_profile)

    def test_must_work(self):
        name = "name"
        event = "event"
        stdout = "stdout"
        stderr = "stderr"
        function = Mock()
        invoke_config = "config"

        self.function_provider_mock.get.return_value = function
        self.local_lambda._get_invoke_config = Mock()
        self.local_lambda._get_invoke_config.return_value = invoke_config

        self.local_lambda.invoke(name, event, stdout, stderr)

        self.runtime_mock.invoke.assert_called_with(invoke_config,
                                                    event,
                                                    debug_port=self.debug_port,
                                                    debug_args=self.debug_args,
                                                    stdout=stdout,
                                                    stderr=stderr)

    def test_must_raise_if_function_not_found(self):

        self.function_provider_mock.get.return_value = None  # function not found
        with self.assertRaises(FunctionNotFound):
            self.local_lambda.invoke("name", "event")
Esempio n. 6
0
    def test_must_invoke(self):
        input_event = '"some data"'
        expected_env_vars = {
            "var1": "override_value1",
            "var2": "shell_env_value2"
        }

        manager = ContainerManager()
        layer_downloader = LayerDownloader("./", "./")
        lambda_image = LambdaImage(layer_downloader, False, False)
        local_runtime = LambdaRuntime(manager, lambda_image)
        runner = LocalLambdaRunner(local_runtime, self.mock_function_provider, self.cwd, self.env_var_overrides,
                                   debug_context=None)

        # Append the real AWS credentials to the expected values.
        creds = runner.get_aws_creds()
        # default value for creds is not configured by the test. But coming from a downstream class
        expected_env_vars["AWS_SECRET_ACCESS_KEY"] = creds.get("secret", "defaultsecret")
        expected_env_vars["AWS_ACCESS_KEY_ID"] = creds.get("key", "defaultkey")
        expected_env_vars["AWS_REGION"] = creds.get("region", "us-east-1")

        stdout_stream = io.BytesIO()
        stderr_stream = io.BytesIO()

        stdout_stream_writer = StreamWriter(stdout_stream)
        stderr_stream_writer = StreamWriter(stderr_stream)
        runner.invoke(self.function_name, input_event, stdout=stdout_stream_writer, stderr=stderr_stream_writer)

        # stderr is where the Lambda container runtime logs are available. It usually contains requestId, start time
        # etc. So it is non-zero in size
        self.assertGreater(len(stderr_stream.getvalue().strip()), 0, "stderr stream must contain data")

        # This should contain all the environment variables passed to the function
        actual_output = json.loads(stdout_stream.getvalue().strip().decode('utf-8'))

        for key, value in expected_env_vars.items():
            self.assertTrue(key in actual_output, "Key '{}' must be in function output".format(key))
            self.assertEqual(actual_output.get(key), value)
Esempio n. 7
0
class TestLocalLambda_invoke(TestCase):
    def setUp(self):
        self.runtime_mock = Mock()
        self.function_provider_mock = Mock()
        self.cwd = "/my/current/working/directory"
        self.debug_context = None
        self.aws_profile = "myprofile"
        self.aws_region = "region"
        self.env_vars_values = {}

        self.local_lambda = LocalLambdaRunner(
            self.runtime_mock,
            self.function_provider_mock,
            self.cwd,
            env_vars_values=self.env_vars_values,
            debug_context=self.debug_context,
        )

    def test_must_work(self):
        name = "name"
        event = "event"
        stdout = "stdout"
        stderr = "stderr"
        function = Mock(functionname="name")
        invoke_config = "config"

        self.function_provider_mock.get_all.return_value = [function]
        self.local_lambda.get_invoke_config = Mock()
        self.local_lambda.get_invoke_config.return_value = invoke_config

        self.local_lambda.invoke(name, event, stdout, stderr)

        self.runtime_mock.invoke.assert_called_with(invoke_config,
                                                    event,
                                                    debug_context=None,
                                                    stdout=stdout,
                                                    stderr=stderr)

    def test_must_work_packagetype_ZIP(self):
        name = "name"
        event = "event"
        stdout = "stdout"
        stderr = "stderr"
        function = Mock(functionname="name",
                        handler="app.handler",
                        runtime="test",
                        packagetype=ZIP)
        invoke_config = "config"

        self.function_provider_mock.get.return_value = function
        self.local_lambda.get_invoke_config = Mock()
        self.local_lambda.get_invoke_config.return_value = invoke_config

        self.local_lambda.invoke(name, event, stdout, stderr)

        self.runtime_mock.invoke.assert_called_with(invoke_config,
                                                    event,
                                                    debug_context=None,
                                                    stdout=stdout,
                                                    stderr=stderr)

    def test_must_raise_if_no_privilege(self):
        function = Mock()
        function.name = "name"
        function.functionname = "FunctionLogicalId"
        invoke_config = "config"

        self.function_provider_mock.get_all.return_value = [function]
        self.local_lambda.get_invoke_config = Mock()
        self.local_lambda.get_invoke_config.return_value = invoke_config

        os_error = OSError()
        os_error.winerror = 1314
        self.runtime_mock.invoke.side_effect = os_error

        with self.assertRaises(NoPrivilegeException):
            self.local_lambda.invoke("name", "event")

    def test_must_raise_os_error(self):
        function = Mock()
        function.name = "name"
        function.functionname = "FunctionLogicalId"
        invoke_config = "config"

        self.function_provider_mock.get_all.return_value = [function]
        self.local_lambda.get_invoke_config = Mock()
        self.local_lambda.get_invoke_config.return_value = invoke_config

        os_error = OSError()
        os_error.winerror = 1315
        self.runtime_mock.invoke.side_effect = os_error

        with self.assertRaises(OSError):
            self.local_lambda.invoke("name", "event")

    def test_must_raise_if_function_not_found(self):
        function = Mock()
        function.name = "name"
        function.functionname = "FunctionLogicalId"

        self.function_provider_mock.get.return_value = None  # function not found
        self.function_provider_mock.get_all.return_value = [function]
        with self.assertRaises(FunctionNotFound):
            self.local_lambda.invoke("name", "event")

    def test_must_not_raise_if_invoked_container_has_no_response(self):
        function = Mock()
        function.name = "name"
        function.functionname = "FunctionLogicalId"
        invoke_config = "invoke_config"

        self.function_provider_mock.get.return_value = function
        self.local_lambda.get_invoke_config = Mock()
        self.local_lambda.get_invoke_config.return_value = invoke_config
        self.runtime_mock.invoke = Mock(side_effect=ContainerResponseException)
        # No exception raised back
        self.local_lambda.invoke("name", "event")

    def test_works_if_imageuri_and_Image_packagetype(self):
        name = "name"
        event = "event"
        stdout = "stdout"
        stderr = "stderr"
        function = Mock(functionname="name",
                        packagetype=IMAGE,
                        imageuri="testimage:tag")
        invoke_config = "config"

        self.function_provider_mock.get.return_value = function
        self.local_lambda.get_invoke_config = Mock()
        self.local_lambda.get_invoke_config.return_value = invoke_config
        self.local_lambda.invoke(name, event, stdout, stderr)
        self.runtime_mock.invoke.assert_called_with(invoke_config,
                                                    event,
                                                    debug_context=None,
                                                    stdout=stdout,
                                                    stderr=stderr)

    def test_must_raise_if_imageuri_not_found(self):
        name = "name"
        event = "event"
        stdout = "stdout"
        stderr = "stderr"
        function = Mock(functionname="name", packagetype=IMAGE, imageuri=None)

        self.function_provider_mock.get.return_value = function

        with self.assertRaises(InvalidIntermediateImageError):
            self.local_lambda.invoke(name, event, stdout, stderr)