Esempio n. 1
0
class TestLocalLambda_is_debugging(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_be_on(self):
        self.assertTrue(self.local_lambda.is_debugging())

    def test_must_be_off(self):

        self.local_lambda = LocalLambdaRunner(
            self.runtime_mock,
            self.function_provider_mock,
            self.cwd,
            self.env_vars_values,
            debug_port=None,  # No debug port
            debug_args=self.debug_args,
            aws_profile=self.aws_profile)

        self.assertFalse(self.local_lambda.is_debugging())
Esempio n. 2
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. 3
0
    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.environ = {
            "Variables": {
                "var1": "value1",
            }
        }

        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,
            aws_profile=self.aws_profile,
            aws_region=self.aws_region)

        self.aws_creds = {"key": "key"}
        self.local_lambda.get_aws_creds = Mock()
        self.local_lambda.get_aws_creds.return_value = self.aws_creds
Esempio n. 4
0
class TestLocalLambda_is_debugging(TestCase):
    def setUp(self):
        self.runtime_mock = Mock()
        self.function_provider_mock = Mock()
        self.cwd = "/my/current/working/directory"
        self.debug_context = Mock()
        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_be_on(self):
        self.assertTrue(self.local_lambda.is_debugging())

    def test_must_be_off(self):

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

        self.assertFalse(self.local_lambda.is_debugging())
Esempio n. 5
0
class TestLocalLambda_is_debugging(TestCase):

    def setUp(self):
        self.runtime_mock = Mock()
        self.function_provider_mock = Mock()
        self.cwd = "/my/current/working/directory"
        self.debug_context = Mock()
        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_be_on(self):
        self.assertTrue(self.local_lambda.is_debugging())

    def test_must_be_off(self):

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

        self.assertFalse(self.local_lambda.is_debugging())
Esempio n. 6
0
    def test_must_be_off(self):

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

        self.assertFalse(self.local_lambda.is_debugging())
Esempio n. 7
0
    def test_must_be_off(self):

        self.local_lambda = LocalLambdaRunner(
            self.runtime_mock,
            self.function_provider_mock,
            self.cwd,
            self.env_vars_values,
            debug_port=None,  # No debug port
            debug_args=self.debug_args,
            aws_profile=self.aws_profile)

        self.assertFalse(self.local_lambda.is_debugging())
Esempio n. 8
0
    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)
Esempio n. 9
0
    def setUp(self):
        self.runtime_mock = Mock()
        self.function_provider_mock = Mock()
        self.cwd = "/my/current/working/directory"
        self.debug_context = Mock()
        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)
Esempio n. 10
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. 11
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. 12
0
    def setUp(self):
        self.runtime_mock = Mock()
        self.function_provider_mock = Mock()
        self.cwd = "/my/current/working/directory"
        self.env_vars_values = {}
        self.debug_port = 123
        self.debug_args = "abc"
        self.aws_profile = "myprofile"

        self.relative_codeuri = "./my/path"
        self.absolute_codeuri = "/home/foo/bar"  # Some absolute path to use
        self.os_cwd = os.getcwd()

        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)
Esempio n. 13
0
    def test_must_be_off(self):

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

        self.assertFalse(self.local_lambda.is_debugging())
Esempio n. 14
0
    def setUp(self):
        self.host = "127.0.0.1"
        self.port = random.randint(30000, 40000)  # get a random port
        self.url = "http://{}:{}".format(self.host, self.port)

        self.code_abs_path = nodejs_lambda(API_GATEWAY_ECHO_EVENT)

        # Let's convert this absolute path to relative path. Let the parent be the CWD, and codeuri be the folder
        self.cwd = os.path.dirname(self.code_abs_path)
        self.code_uri = os.path.relpath(self.code_abs_path, self.cwd)  # Get relative path with respect to CWD

        # Setup a static file in the directory
        self.static_dir = "mystaticdir"
        self.static_file_name = "myfile.txt"
        self.static_file_content = "This is a static file"
        self._setup_static_file(
            os.path.join(self.cwd, self.static_dir),  # Create static directory with in cwd
            self.static_file_name,
            self.static_file_content,
        )

        # Create one Lambda function
        self.function_name = "name"
        self.function = provider.Function(
            name=self.function_name,
            runtime="nodejs4.3",
            memory=256,
            timeout=5,
            handler="index.handler",
            codeuri=self.code_uri,
            environment={},
            rolearn=None,
            layers=[],
        )
        self.mock_function_provider = Mock()
        self.mock_function_provider.get.return_value = self.function

        # Setup two APIs pointing to the same function
        routes = [
            Route(path="/get", methods=["GET"], function_name=self.function_name),
            Route(path="/post", methods=["POST"], function_name=self.function_name),
        ]
        api = Api(routes=routes)

        self.api_provider_mock = Mock()
        self.api_provider_mock.get_all.return_value = api

        # Now wire up the Lambda invoker and pass it through the context
        self.lambda_invoke_context_mock = Mock()
        manager = ContainerManager()
        layer_downloader = LayerDownloader("./", "./")
        lambda_image = LambdaImage(layer_downloader, False, False)
        local_runtime = LambdaRuntime(manager, lambda_image)
        lambda_runner = LocalLambdaRunner(local_runtime, self.mock_function_provider, self.cwd, debug_context=None)
        self.lambda_invoke_context_mock.local_lambda_runner = lambda_runner
        self.lambda_invoke_context_mock.get_cwd.return_value = self.cwd
Esempio n. 15
0
    def setUp(self):
        self.region = "region"
        self.key = "key"
        self.secret = "secret"
        self.token = "token"

        self.runtime_mock = Mock()
        self.function_provider_mock = Mock()
        self.cwd = "cwd"
        self.env_vars_values = {}
        self.debug_port = 123
        self.debug_args = "abc"
        self.aws_profile = "myprofile"

        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)
Esempio n. 16
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. 17
0
    def setUp(self):
        self.region = "region"
        self.key = "key"
        self.secret = "secret"
        self.token = "token"

        self.runtime_mock = Mock()
        self.function_provider_mock = Mock()
        self.cwd = "cwd"
        self.env_vars_values = {}
        self.debug_context = None
        self.aws_profile = "myprofile"
        self.aws_region = "region"

        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)
Esempio n. 18
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. 19
0
    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,
        )
Esempio n. 20
0
    def setUp(self):
        self.runtime_mock = Mock()
        self.function_provider_mock = Mock()
        self.cwd = "/my/current/working/directory"
        self.env_vars_values = {}
        self.debug_context = None
        self.aws_profile = "myprofile"
        self.aws_region = "region"

        self.relative_codeuri = "./my/path"
        self.absolute_codeuri = "/home/foo/bar"  # Some absolute path to use
        self.os_cwd = os.getcwd()

        self.local_lambda = LocalLambdaRunner(
            self.runtime_mock,
            self.function_provider_mock,
            self.cwd,
            env_vars_values=self.env_vars_values,
            aws_profile=self.aws_profile,
            debug_context=self.debug_context,
            aws_region=self.aws_region)
Esempio n. 21
0
def make_service(function_provider, cwd):
    port = random_port()
    manager = ContainerManager()
    layer_downloader = LayerDownloader("./", "./")
    image_builder = LambdaImage(layer_downloader, False, False)
    local_runtime = LambdaRuntime(manager, image_builder)
    lambda_runner = LocalLambdaRunner(local_runtime=local_runtime, function_provider=function_provider, cwd=cwd)

    service = LocalLambdaInvokeService(lambda_runner, port=port, host="127.0.0.1")

    scheme = "http"
    url = "{}://127.0.0.1:{}".format(scheme, port)
    return service, port, url, scheme
Esempio n. 22
0
    def setUp(self):
        self.runtime_mock = Mock()
        self.function_provider_mock = Mock()
        # assuming there is only 1 root stack
        self.function_provider_mock.stacks = [
            Mock(stack_path="", location="template.yaml"),
            Mock(stack_path="ChildStackX",
                 location=os.path.join("ChildStackX", "template.yaml")),
        ]
        self.cwd = "/my/current/working/directory"
        self.aws_profile = "myprofile"
        self.debug_context = None
        self.env_vars_values = {}
        self.aws_region = "region"

        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,
        )
Esempio n. 23
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. 24
0
    def setUp(self):
        self.runtime_mock = Mock()
        self.function_provider_mock = Mock()
        self.cwd = "/my/current/working/directory"
        self.debug_context = Mock()
        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)
Esempio n. 25
0
class TestLocalLambda_get_invoke_config(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)

    @patch('samcli.commands.local.lib.local_lambda.FunctionConfig')
    def test_must_work(self, FunctionConfigMock):
        env_vars = "envvars"
        self.local_lambda._make_env_vars = Mock()
        self.local_lambda._make_env_vars.return_value = env_vars

        codepath = "codepath"
        self.local_lambda._get_code_path = Mock()
        self.local_lambda._get_code_path.return_value = codepath

        function = Function(name="function_name",
                            runtime="runtime",
                            memory=1234,
                            timeout=12,
                            handler="handler",
                            codeuri="codeuri",
                            environment=None,
                            rolearn=None)

        config = "someconfig"
        FunctionConfigMock.return_value = config
        actual = self.local_lambda._get_invoke_config(function)
        self.assertEquals(actual, config)

        FunctionConfigMock.assert_called_with(name=function.name,
                                              runtime=function.runtime,
                                              handler=function.handler,
                                              code_abs_path=codepath,
                                              memory=function.memory,
                                              timeout=function.timeout,
                                              env_vars=env_vars)

        self.local_lambda._get_code_path.assert_called_with(function.codeuri)
        self.local_lambda._make_env_vars.assert_called_with(function)
Esempio n. 26
0
def make_service(function_provider, cwd):
    port = random_port()
    manager = ContainerManager()
    local_runtime = LambdaRuntime(manager)
    lambda_runner = LocalLambdaRunner(local_runtime=local_runtime,
                                      function_provider=function_provider,
                                      cwd=cwd)

    service = LocalLambdaInvokeService(lambda_runner,
                                       port=port,
                                       host='127.0.0.1')

    scheme = "http"
    url = '{}://127.0.0.1:{}'.format(scheme, port)
    return service, port, url, scheme
Esempio n. 27
0
    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.environ = {
            "Variables": {
                "var1": "value1",
            }
        }

        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)

        self.aws_creds = {"key": "key"}
        self.local_lambda.get_aws_creds = Mock()
        self.local_lambda.get_aws_creds.return_value = self.aws_creds
Esempio n. 28
0
    def local_lambda_runner(self):
        """
        Returns an instance of the runner capable of running Lambda functions locally

        :return samcli.commands.local.lib.local_lambda.LocalLambdaRunner: Runner configured to run Lambda functions
            locally
        """

        container_manager = ContainerManager(docker_network_id=self._docker_network,
                                             skip_pull_image=self._skip_pull_image)

        lambda_runtime = LambdaRuntime(container_manager)
        return LocalLambdaRunner(local_runtime=lambda_runtime,
                                 function_provider=self._function_provider,
                                 cwd=self.get_cwd(),
                                 env_vars_values=self._env_vars_value,
                                 debug_context=self._debug_context,
                                 aws_profile=self._aws_profile,
                                 aws_region=self._aws_region)
Esempio n. 29
0
    def setUp(self):
        self.region = "region"
        self.key = "key"
        self.secret = "secret"
        self.token = "token"

        self.runtime_mock = Mock()
        self.function_provider_mock = Mock()
        self.cwd = "cwd"
        self.env_vars_values = {}
        self.debug_context = None
        self.aws_profile = "myprofile"
        self.aws_region = "region"

        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)
Esempio n. 30
0
    def local_lambda_runner(self):
        """
        Returns an instance of the runner capable of running Lambda functions locally

        :return samcli.commands.local.lib.local_lambda.LocalLambdaRunner: Runner configured to run Lambda functions
            locally
        """

        layer_downloader = LayerDownloader(self._layer_cache_basedir,
                                           self.get_cwd())
        image_builder = LambdaImage(layer_downloader, self._skip_pull_image,
                                    self._force_image_build)

        lambda_runtime = LambdaRuntime(self._container_manager, image_builder)
        return LocalLambdaRunner(local_runtime=lambda_runtime,
                                 function_provider=self._function_provider,
                                 cwd=self.get_cwd(),
                                 env_vars_values=self._env_vars_value,
                                 debug_context=self._debug_context)
Esempio n. 31
0
    def local_lambda_runner(self) -> LocalLambdaRunner:
        """
        Returns an instance of the runner capable of running Lambda functions locally

        :return samcli.commands.local.lib.local_lambda.LocalLambdaRunner: Runner configured to run Lambda functions
            locally
        """
        if self._local_lambda_runner:
            return self._local_lambda_runner

        self._local_lambda_runner = LocalLambdaRunner(
            local_runtime=self.lambda_runtime,
            function_provider=self._function_provider,
            cwd=self.get_cwd(),
            aws_profile=self._aws_profile,
            aws_region=self._aws_region,
            env_vars_values=self._env_vars_value,
            debug_context=self._debug_context,
        )
        return self._local_lambda_runner
Esempio n. 32
0
    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.environ = {
            "Variables": {
                "var1": "value1",
            }
        }

        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)

        self.aws_creds = {"key": "key"}
        self.local_lambda.get_aws_creds = Mock()
        self.local_lambda.get_aws_creds.return_value = self.aws_creds
Esempio n. 33
0
class TestLocalLambda_make_env_vars(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.environ = {
            "Variables": {
                "var1": "value1",
            }
        }

        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)

        self.aws_creds = {"key": "key"}
        self.local_lambda.get_aws_creds = Mock()
        self.local_lambda.get_aws_creds.return_value = self.aws_creds

    @parameterized.expand([
        # Override for the function exists
        ({"function_name": {"a": "b"}}, {"a": "b"}),

        # Override for the function does *not* exist
        ({"otherfunction": {"c": "d"}}, None),

        # Using a CloudFormation parameter file format
        ({"Parameters": {"p1": "v1"}}, {"p1": "v1"})
    ])
    @patch("samcli.commands.local.lib.local_lambda.EnvironmentVariables")
    @patch("samcli.commands.local.lib.local_lambda.os")
    def test_must_work_with_override_values(self, env_vars_values, expected_override_value, os_mock,
                                            EnvironmentVariablesMock):
        os_environ = {"some": "value"}
        os_mock.environ = os_environ

        function = Function(name="function_name",
                            runtime="runtime",
                            memory=1234,
                            timeout=12,
                            handler="handler",
                            codeuri="codeuri",
                            environment=self.environ,
                            rolearn=None,
                            layers=[])

        self.local_lambda.env_vars_values = env_vars_values

        self.local_lambda._make_env_vars(function)

        EnvironmentVariablesMock.assert_called_with(function.memory,
                                                    function.timeout,
                                                    function.handler,
                                                    variables={"var1": "value1"},
                                                    shell_env_values=os_environ,
                                                    override_values=expected_override_value,
                                                    aws_creds=self.aws_creds)

    @parameterized.expand([
        # Using a invalid file format
        ({"a": "b"}, OverridesNotWellDefinedError),

        ({"a": False}, OverridesNotWellDefinedError),

        ({"a": [True, False]}, OverridesNotWellDefinedError)
    ])
    @patch("samcli.commands.local.lib.local_lambda.os")
    def test_must_not_work_with_invalid_override_values(self, env_vars_values, expected_exception, os_mock):
        os_environ = {"some": "value"}
        os_mock.environ = os_environ

        function = Function(name="function_name",
                            runtime="runtime",
                            memory=1234,
                            timeout=12,
                            handler="handler",
                            codeuri="codeuri",
                            environment=self.environ,
                            rolearn=None,
                            layers=[])

        self.local_lambda.env_vars_values = env_vars_values

        with self.assertRaises(expected_exception):
            self.local_lambda._make_env_vars(function)

    @parameterized.expand([
        param({"a": "b"}),  # Does not have the "Variables" Key
        param("somestring"),  # Must be a dict type
        param(None)
    ])
    @patch("samcli.commands.local.lib.local_lambda.EnvironmentVariables")
    @patch("samcli.commands.local.lib.local_lambda.os")
    def test_must_work_with_invalid_environment_variable(self, environment_variable, os_mock, EnvironmentVariablesMock):
        os_environ = {"some": "value"}
        os_mock.environ = os_environ

        function = Function(name="function_name",
                            runtime="runtime",
                            memory=1234,
                            timeout=12,
                            handler="handler",
                            codeuri="codeuri",
                            environment=environment_variable,
                            rolearn=None,
                            layers=[])

        self.local_lambda.env_vars_values = {}

        self.local_lambda._make_env_vars(function)

        EnvironmentVariablesMock.assert_called_with(function.memory,
                                                    function.timeout,
                                                    function.handler,
                                                    variables=None,
                                                    shell_env_values=os_environ,
                                                    override_values=None,
                                                    aws_creds=self.aws_creds)
Esempio n. 34
0
class TestLocalLambda_get_invoke_config(TestCase):
    def setUp(self):
        self.runtime_mock = Mock()
        self.function_provider_mock = Mock()
        self.cwd = "/my/current/working/directory"
        self.aws_profile = "myprofile"
        self.debug_context = None
        self.env_vars_values = {}
        self.aws_region = "region"

        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,
        )

    @patch("samcli.commands.local.lib.local_lambda.resolve_code_path")
    @patch("samcli.commands.local.lib.local_lambda.LocalLambdaRunner.is_debugging")
    @patch("samcli.commands.local.lib.local_lambda.FunctionConfig")
    def test_must_work(self, FunctionConfigMock, is_debugging_mock, resolve_code_path_patch):
        is_debugging_mock.return_value = False

        env_vars = "envvars"
        self.local_lambda._make_env_vars = Mock()
        self.local_lambda._make_env_vars.return_value = env_vars

        codepath = "codepath"
        resolve_code_path_patch.return_value = codepath

        layers = ["layer1", "layer2"]

        function = Function(
            name="function_name",
            functionname="function_name",
            runtime="runtime",
            memory=1234,
            timeout=12,
            handler="handler",
            codeuri="codeuri",
            environment=None,
            rolearn=None,
            layers=layers,
            events=None,
        )

        config = "someconfig"
        FunctionConfigMock.return_value = config
        actual = self.local_lambda._get_invoke_config(function)
        self.assertEqual(actual, config)

        FunctionConfigMock.assert_called_with(
            name=function.functionname,
            runtime=function.runtime,
            handler=function.handler,
            code_abs_path=codepath,
            layers=layers,
            memory=function.memory,
            timeout=function.timeout,
            env_vars=env_vars,
        )

        resolve_code_path_patch.assert_called_with(self.cwd, function.codeuri)
        self.local_lambda._make_env_vars.assert_called_with(function)

    @patch("samcli.commands.local.lib.local_lambda.resolve_code_path")
    @patch("samcli.commands.local.lib.local_lambda.LocalLambdaRunner.is_debugging")
    @patch("samcli.commands.local.lib.local_lambda.FunctionConfig")
    def test_timeout_set_to_max_during_debugging(self, FunctionConfigMock, is_debugging_mock, resolve_code_path_patch):
        is_debugging_mock.return_value = True

        env_vars = "envvars"
        self.local_lambda._make_env_vars = Mock()
        self.local_lambda._make_env_vars.return_value = env_vars

        codepath = "codepath"
        resolve_code_path_patch.return_value = codepath

        function = Function(
            name="function_name",
            functionname="function_name",
            runtime="runtime",
            memory=1234,
            timeout=36000,
            handler="handler",
            codeuri="codeuri",
            environment=None,
            rolearn=None,
            layers=[],
            events=None,
        )

        config = "someconfig"
        FunctionConfigMock.return_value = config
        actual = self.local_lambda._get_invoke_config(function)
        self.assertEqual(actual, config)

        FunctionConfigMock.assert_called_with(
            name=function.functionname,
            runtime=function.runtime,
            handler=function.handler,
            code_abs_path=codepath,
            layers=[],
            memory=function.memory,
            timeout=function.timeout,
            env_vars=env_vars,
        )

        resolve_code_path_patch.assert_called_with(self.cwd, function.codeuri)
        self.local_lambda._make_env_vars.assert_called_with(function)
Esempio n. 35
0
class TestLocalLambda_make_env_vars(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.environ = {"Variables": {"var1": "value1"}}

        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,
        )

        self.aws_creds = {"key": "key"}
        self.local_lambda.get_aws_creds = Mock()
        self.local_lambda.get_aws_creds.return_value = self.aws_creds

    @parameterized.expand(
        [
            # Override for the function exists
            ({"function_name": {"a": "b"}}, {"a": "b"}),
            # Override for the function does *not* exist
            ({"otherfunction": {"c": "d"}}, None),
            # Using a CloudFormation parameter file format
            ({"Parameters": {"p1": "v1"}}, {"p1": "v1"}),
        ]
    )
    @patch("samcli.commands.local.lib.local_lambda.EnvironmentVariables")
    @patch("samcli.commands.local.lib.local_lambda.os")
    def test_must_work_with_override_values(
        self, env_vars_values, expected_override_value, os_mock, EnvironmentVariablesMock
    ):
        os_environ = {"some": "value"}
        os_mock.environ = os_environ

        function = Function(
            name="function_name",
            functionname="function_name",
            runtime="runtime",
            memory=1234,
            timeout=12,
            handler="handler",
            codeuri="codeuri",
            environment=self.environ,
            rolearn=None,
            layers=[],
            events=None,
        )

        self.local_lambda.env_vars_values = env_vars_values

        self.local_lambda._make_env_vars(function)

        EnvironmentVariablesMock.assert_called_with(
            function.memory,
            function.timeout,
            function.handler,
            variables={"var1": "value1"},
            shell_env_values=os_environ,
            override_values=expected_override_value,
            aws_creds=self.aws_creds,
        )

    @parameterized.expand(
        [
            # Using a invalid file format
            ({"a": "b"}, OverridesNotWellDefinedError),
            ({"a": False}, OverridesNotWellDefinedError),
            ({"a": [True, False]}, OverridesNotWellDefinedError),
        ]
    )
    @patch("samcli.commands.local.lib.local_lambda.os")
    def test_must_not_work_with_invalid_override_values(self, env_vars_values, expected_exception, os_mock):
        os_environ = {"some": "value"}
        os_mock.environ = os_environ

        function = Function(
            name="function_name",
            functionname="function_name",
            runtime="runtime",
            memory=1234,
            timeout=12,
            handler="handler",
            codeuri="codeuri",
            environment=self.environ,
            rolearn=None,
            layers=[],
            events=None,
        )

        self.local_lambda.env_vars_values = env_vars_values

        with self.assertRaises(expected_exception):
            self.local_lambda._make_env_vars(function)

    @parameterized.expand(
        [
            param({"a": "b"}),  # Does not have the "Variables" Key
            param("somestring"),  # Must be a dict type
            param(None),
        ]
    )
    @patch("samcli.commands.local.lib.local_lambda.EnvironmentVariables")
    @patch("samcli.commands.local.lib.local_lambda.os")
    def test_must_work_with_invalid_environment_variable(self, environment_variable, os_mock, EnvironmentVariablesMock):
        os_environ = {"some": "value"}
        os_mock.environ = os_environ

        function = Function(
            name="function_name",
            functionname="function_name",
            runtime="runtime",
            memory=1234,
            timeout=12,
            handler="handler",
            codeuri="codeuri",
            environment=environment_variable,
            rolearn=None,
            layers=[],
            events=None,
        )

        self.local_lambda.env_vars_values = {}

        self.local_lambda._make_env_vars(function)

        EnvironmentVariablesMock.assert_called_with(
            function.memory,
            function.timeout,
            function.handler,
            variables=None,
            shell_env_values=os_environ,
            override_values=None,
            aws_creds=self.aws_creds,
        )
Esempio n. 36
0
class TestLocalLambda_get_aws_creds(TestCase):
    def setUp(self):
        self.region = "region"
        self.key = "key"
        self.secret = "secret"
        self.token = "token"

        self.runtime_mock = Mock()
        self.function_provider_mock = Mock()
        self.cwd = "cwd"
        self.env_vars_values = {}
        self.debug_context = None
        self.aws_profile = "myprofile"
        self.aws_region = "region"

        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,
            aws_profile=self.aws_profile,
            aws_region=self.aws_region,
        )

    @patch("samcli.commands.local.lib.local_lambda.boto3")
    def test_must_get_from_boto_session(self, boto3_mock):
        creds = Mock()
        creds.access_key = self.key
        creds.secret_key = self.secret
        creds.token = self.token

        mock_session = Mock()
        mock_session.region_name = self.region

        boto3_mock.session.Session.return_value = mock_session
        mock_session.get_credentials.return_value = creds

        expected = {"region": self.region, "key": self.key, "secret": self.secret, "sessiontoken": self.token}

        actual = self.local_lambda.get_aws_creds()
        self.assertEqual(expected, actual)

        boto3_mock.session.Session.assert_called_with(profile_name=self.aws_profile, region_name=self.aws_region)

    @patch("samcli.commands.local.lib.local_lambda.boto3")
    def test_must_work_with_no_region_name(self, boto3_mock):
        creds = Mock()
        creds.access_key = self.key
        creds.secret_key = self.secret
        creds.token = self.token

        mock_session = Mock()
        del mock_session.region_name  # Ask mock to return AttributeError when 'region_name' is accessed

        boto3_mock.session.Session.return_value = mock_session
        mock_session.get_credentials.return_value = creds

        expected = {"key": self.key, "secret": self.secret, "sessiontoken": self.token}

        actual = self.local_lambda.get_aws_creds()
        self.assertEqual(expected, actual)

        boto3_mock.session.Session.assert_called_with(profile_name=self.aws_profile, region_name=self.aws_region)

    @patch("samcli.commands.local.lib.local_lambda.boto3")
    def test_must_work_with_no_access_key(self, boto3_mock):
        creds = Mock()
        del creds.access_key  # No access key
        creds.secret_key = self.secret
        creds.token = self.token

        mock_session = Mock()
        mock_session.region_name = self.region

        boto3_mock.session.Session.return_value = mock_session
        mock_session.get_credentials.return_value = creds

        expected = {"region": self.region, "secret": self.secret, "sessiontoken": self.token}

        actual = self.local_lambda.get_aws_creds()
        self.assertEqual(expected, actual)

        boto3_mock.session.Session.assert_called_with(profile_name=self.aws_profile, region_name=self.aws_region)

    @patch("samcli.commands.local.lib.local_lambda.boto3")
    def test_must_work_with_no_secret_key(self, boto3_mock):
        creds = Mock()
        creds.access_key = self.key
        del creds.secret_key  # No secret key
        creds.token = self.token

        mock_session = Mock()
        mock_session.region_name = self.region

        boto3_mock.session.Session.return_value = mock_session
        mock_session.get_credentials.return_value = creds

        expected = {"region": self.region, "key": self.key, "sessiontoken": self.token}

        actual = self.local_lambda.get_aws_creds()
        self.assertEqual(expected, actual)

        boto3_mock.session.Session.assert_called_with(profile_name=self.aws_profile, region_name=self.aws_region)

    @patch("samcli.commands.local.lib.local_lambda.boto3")
    def test_must_work_with_no_session_token(self, boto3_mock):
        creds = Mock()
        creds.access_key = self.key
        creds.secret_key = self.secret
        del creds.token  # No Token

        mock_session = Mock()
        mock_session.region_name = self.region

        boto3_mock.DEFAULT_SESSION = None
        boto3_mock.session.Session.return_value = mock_session
        mock_session.get_credentials.return_value = creds

        expected = {"region": self.region, "key": self.key, "secret": self.secret}

        actual = self.local_lambda.get_aws_creds()
        self.assertEqual(expected, actual)

        boto3_mock.session.Session.assert_called()

    @patch("samcli.commands.local.lib.local_lambda.boto3")
    def test_must_work_with_no_credentials(self, boto3_mock):
        boto3_mock.DEFAULT_SESSION = None
        mock_session = Mock()
        boto3_mock.session.Session.return_value = mock_session
        mock_session.get_credentials.return_value = None

        expected = {"region": mock_session.region_name}
        actual = self.local_lambda.get_aws_creds()
        self.assertEqual(expected, actual)

        boto3_mock.session.Session.assert_called()

    @patch("samcli.commands.local.lib.local_lambda.boto3")
    def test_must_work_with_no_session(self, boto3_mock):
        boto3_mock.DEFAULT_SESSION = None
        boto3_mock.session.Session.return_value = None

        expected = {}
        actual = self.local_lambda.get_aws_creds()
        self.assertEqual(expected, actual)

        boto3_mock.session.Session.assert_called()
Esempio n. 37
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)
Esempio n. 38
0
class TestLocalLambda_get_aws_creds(TestCase):

    def setUp(self):
        self.region = "region"
        self.key = "key"
        self.secret = "secret"
        self.token = "token"

        self.runtime_mock = Mock()
        self.function_provider_mock = Mock()
        self.cwd = "cwd"
        self.env_vars_values = {}
        self.debug_context = None
        self.aws_profile = "myprofile"
        self.aws_region = "region"

        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)

    @patch("samcli.commands.local.lib.local_lambda.boto3")
    def test_must_get_from_boto_session(self, boto3_mock):
        creds = Mock()
        creds.access_key = self.key
        creds.secret_key = self.secret
        creds.token = self.token

        mock_session = Mock()
        mock_session.region_name = self.region

        boto3_mock.DEFAULT_SESSION = mock_session
        mock_session.get_credentials.return_value = creds

        expected = {
            "region": self.region,
            "key": self.key,
            "secret": self.secret,
            "sessiontoken": self.token
        }

        actual = self.local_lambda.get_aws_creds()
        self.assertEquals(expected, actual)

    @patch("samcli.commands.local.lib.local_lambda.boto3")
    def test_must_work_with_no_region_name(self, boto3_mock):
        creds = Mock()
        creds.access_key = self.key
        creds.secret_key = self.secret
        creds.token = self.token

        mock_session = Mock()
        del mock_session.region_name   # Ask mock to return AttributeError when 'region_name' is accessed

        boto3_mock.DEFAULT_SESSION = None
        boto3_mock.session.Session.return_value = mock_session
        mock_session.get_credentials.return_value = creds

        expected = {
            "key": self.key,
            "secret": self.secret,
            "sessiontoken": self.token
        }

        actual = self.local_lambda.get_aws_creds()
        self.assertEquals(expected, actual)

        boto3_mock.session.Session.assert_called_with()

    @patch("samcli.commands.local.lib.local_lambda.boto3")
    def test_must_work_with_no_access_key(self, boto3_mock):
        creds = Mock()
        del creds.access_key   # No access key
        creds.secret_key = self.secret
        creds.token = self.token

        mock_session = Mock()
        mock_session.region_name = self.region

        boto3_mock.DEFAULT_SESSION = None
        boto3_mock.session.Session.return_value = mock_session
        mock_session.get_credentials.return_value = creds

        expected = {
            "region": self.region,
            "secret": self.secret,
            "sessiontoken": self.token
        }

        actual = self.local_lambda.get_aws_creds()
        self.assertEquals(expected, actual)

        boto3_mock.session.Session.assert_called_with()

    @patch("samcli.commands.local.lib.local_lambda.boto3")
    def test_must_work_with_no_secret_key(self, boto3_mock):
        creds = Mock()
        creds.access_key = self.key
        del creds.secret_key   # No secret key
        creds.token = self.token

        mock_session = Mock()
        mock_session.region_name = self.region

        boto3_mock.DEFAULT_SESSION = None
        boto3_mock.session.Session.return_value = mock_session
        mock_session.get_credentials.return_value = creds

        expected = {
            "region": self.region,
            "key": self.key,
            "sessiontoken": self.token
        }

        actual = self.local_lambda.get_aws_creds()
        self.assertEquals(expected, actual)

        boto3_mock.session.Session.assert_called_with()

    @patch("samcli.commands.local.lib.local_lambda.boto3")
    def test_must_work_with_no_session_token(self, boto3_mock):
        creds = Mock()
        creds.access_key = self.key
        creds.secret_key = self.secret
        del creds.token   # No Token

        mock_session = Mock()
        mock_session.region_name = self.region

        boto3_mock.DEFAULT_SESSION = None
        boto3_mock.session.Session.return_value = mock_session
        mock_session.get_credentials.return_value = creds

        expected = {
            "region": self.region,
            "key": self.key,
            "secret": self.secret
        }

        actual = self.local_lambda.get_aws_creds()
        self.assertEquals(expected, actual)

        boto3_mock.session.Session.assert_called()

    @patch("samcli.commands.local.lib.local_lambda.boto3")
    def test_must_work_with_no_credentials(self, boto3_mock):
        boto3_mock.DEFAULT_SESSION = None
        mock_session = Mock()
        boto3_mock.session.Session.return_value = mock_session
        mock_session.get_credentials.return_value = None

        expected = {}
        actual = self.local_lambda.get_aws_creds()
        self.assertEquals(expected, actual)

        boto3_mock.session.Session.assert_called()

    @patch("samcli.commands.local.lib.local_lambda.boto3")
    def test_must_work_with_no_session(self, boto3_mock):
        boto3_mock.DEFAULT_SESSION = None
        boto3_mock.session.Session.return_value = None

        expected = {}
        actual = self.local_lambda.get_aws_creds()
        self.assertEquals(expected, actual)

        boto3_mock.session.Session.assert_called()
Esempio n. 39
0
class TestLocalLambda_get_invoke_config(TestCase):
    def setUp(self):
        self.runtime_mock = Mock()
        self.function_provider_mock = Mock()
        # assuming there is only 1 root stack
        self.function_provider_mock.stacks = [
            Mock(stack_path="", location="template.yaml"),
            Mock(stack_path="ChildStackX",
                 location=os.path.join("ChildStackX", "template.yaml")),
        ]
        self.cwd = "/my/current/working/directory"
        self.aws_profile = "myprofile"
        self.debug_context = None
        self.env_vars_values = {}
        self.aws_region = "region"

        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,
        )

    @patch("samcli.commands.local.lib.local_lambda.resolve_code_path")
    @patch(
        "samcli.commands.local.lib.local_lambda.LocalLambdaRunner.is_debugging"
    )
    @patch("samcli.commands.local.lib.local_lambda.FunctionConfig")
    def test_must_work(self, FunctionConfigMock, is_debugging_mock,
                       resolve_code_path_patch):
        is_debugging_mock.return_value = False

        env_vars = "envvars"
        self.local_lambda._make_env_vars = Mock()
        self.local_lambda._make_env_vars.return_value = env_vars

        codepath = "codepath"
        resolve_code_path_patch.return_value = codepath

        layers = ["layer1", "layer2"]

        function = Function(
            stack_path="",
            name="function_name",
            functionname="function_name",
            runtime="runtime",
            memory=1234,
            timeout=12,
            handler="handler",
            codeuri="codeuri",
            environment=None,
            rolearn=None,
            layers=layers,
            events=None,
            metadata=None,
            inlinecode=None,
            imageuri=None,
            imageconfig=None,
            packagetype=ZIP,
            codesign_config_arn=None,
        )

        config = "someconfig"
        FunctionConfigMock.return_value = config
        actual = self.local_lambda.get_invoke_config(function)
        self.assertEqual(actual, config)

        FunctionConfigMock.assert_called_with(
            imageconfig=function.imageconfig,
            imageuri=function.imageuri,
            name=function.functionname,
            packagetype=function.packagetype,
            runtime=function.runtime,
            handler=function.handler,
            code_abs_path=codepath,
            layers=layers,
            memory=function.memory,
            timeout=function.timeout,
            env_vars=env_vars,
        )

        resolve_code_path_patch.assert_called_with(self.cwd, function.codeuri)
        self.local_lambda._make_env_vars.assert_called_with(function)

    @patch("samcli.commands.local.lib.local_lambda.resolve_code_path")
    @patch(
        "samcli.commands.local.lib.local_lambda.LocalLambdaRunner.is_debugging"
    )
    @patch("samcli.commands.local.lib.local_lambda.FunctionConfig")
    def test_timeout_set_to_max_during_debugging(
        self,
        FunctionConfigMock,
        is_debugging_mock,
        resolve_code_path_patch,
    ):
        is_debugging_mock.return_value = True

        env_vars = "envvars"
        self.local_lambda._make_env_vars = Mock()
        self.local_lambda._make_env_vars.return_value = env_vars

        codepath = "codepath"
        resolve_code_path_patch.return_value = codepath

        function = Function(
            stack_path=Mock(),
            name="function_name",
            functionname="function_name",
            runtime="runtime",
            memory=1234,
            timeout=36000,
            handler="handler",
            codeuri="codeuri",
            environment=None,
            rolearn=None,
            layers=[],
            events=None,
            metadata=None,
            inlinecode=None,
            imageuri=None,
            imageconfig=None,
            packagetype=ZIP,
            codesign_config_arn=None,
        )

        config = "someconfig"
        FunctionConfigMock.return_value = config
        actual = self.local_lambda.get_invoke_config(function)
        self.assertEqual(actual, config)

        FunctionConfigMock.assert_called_with(
            imageconfig=function.imageconfig,
            imageuri=function.imageuri,
            name=function.functionname,
            packagetype=function.packagetype,
            runtime=function.runtime,
            handler=function.handler,
            code_abs_path=codepath,
            layers=[],
            memory=function.memory,
            timeout=function.timeout,
            env_vars=env_vars,
        )

        resolve_code_path_patch.assert_called_with(self.cwd, "codeuri")
        self.local_lambda._make_env_vars.assert_called_with(function)
Esempio n. 40
0
class TestLocalLambda_get_invoke_config(TestCase):

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

        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)

    @patch('samcli.commands.local.lib.local_lambda.resolve_code_path')
    @patch('samcli.commands.local.lib.local_lambda.LocalLambdaRunner.is_debugging')
    @patch('samcli.commands.local.lib.local_lambda.FunctionConfig')
    def test_must_work(self, FunctionConfigMock, is_debugging_mock, resolve_code_path_patch):
        is_debugging_mock.return_value = False

        env_vars = "envvars"
        self.local_lambda._make_env_vars = Mock()
        self.local_lambda._make_env_vars.return_value = env_vars

        codepath = "codepath"
        resolve_code_path_patch.return_value = codepath

        layers = ['layer1', 'layer2']

        function = Function(name="function_name",
                            runtime="runtime",
                            memory=1234,
                            timeout=12,
                            handler="handler",
                            codeuri="codeuri",
                            environment=None,
                            rolearn=None,
                            layers=layers)

        config = "someconfig"
        FunctionConfigMock.return_value = config
        actual = self.local_lambda._get_invoke_config(function)
        self.assertEquals(actual, config)

        FunctionConfigMock.assert_called_with(name=function.name,
                                              runtime=function.runtime,
                                              handler=function.handler,
                                              code_abs_path=codepath,
                                              layers=layers,
                                              memory=function.memory,
                                              timeout=function.timeout,
                                              env_vars=env_vars)

        resolve_code_path_patch.assert_called_with(self.cwd, function.codeuri)
        self.local_lambda._make_env_vars.assert_called_with(function)

    @patch('samcli.commands.local.lib.local_lambda.resolve_code_path')
    @patch('samcli.commands.local.lib.local_lambda.LocalLambdaRunner.is_debugging')
    @patch('samcli.commands.local.lib.local_lambda.FunctionConfig')
    def test_timeout_set_to_max_during_debugging(self, FunctionConfigMock, is_debugging_mock, resolve_code_path_patch):
        is_debugging_mock.return_value = True

        env_vars = "envvars"
        self.local_lambda._make_env_vars = Mock()
        self.local_lambda._make_env_vars.return_value = env_vars

        codepath = "codepath"
        resolve_code_path_patch.return_value = codepath

        function = Function(name="function_name",
                            runtime="runtime",
                            memory=1234,
                            timeout=36000,
                            handler="handler",
                            codeuri="codeuri",
                            environment=None,
                            rolearn=None,
                            layers=[])

        config = "someconfig"
        FunctionConfigMock.return_value = config
        actual = self.local_lambda._get_invoke_config(function)
        self.assertEquals(actual, config)

        FunctionConfigMock.assert_called_with(name=function.name,
                                              runtime=function.runtime,
                                              handler=function.handler,
                                              code_abs_path=codepath,
                                              layers=[],
                                              memory=function.memory,
                                              timeout=function.timeout,
                                              env_vars=env_vars)

        resolve_code_path_patch.assert_called_with(self.cwd, function.codeuri)
        self.local_lambda._make_env_vars.assert_called_with(function)