def test_must_raise_user_exception_on_invalid_env_vars( self, get_event_mock, InvokeContextMock): event_data = "data" get_event_mock.return_value = event_data ctx_mock = Mock() ctx_mock.region = self.region_name InvokeContextMock.side_effect = OverridesNotWellDefinedError( "bad env vars") with self.assertRaises(UserException) as ex_ctx: invoke_cli(ctx=ctx_mock, function_identifier=self.function_id, template=self.template, event=self.eventfile, no_event=self.no_event, env_vars=self.env_vars, debug_port=self.debug_port, debug_args=self.debug_args, debugger_path=self.debugger_path, docker_volume_basedir=self.docker_volume_basedir, docker_network=self.docker_network, log_file=self.log_file, skip_pull_image=self.skip_pull_image, parameter_overrides=self.parameter_overrides, layer_cache_basedir=self.layer_cache_basedir, force_image_build=self.force_image_build) msg = str(ex_ctx.exception) self.assertEquals(msg, "bad env vars")
def _make_env_vars( resource: Union[Function, LayerVersion], file_env_vars: Dict, inline_env_vars: Optional[Dict] ) -> Dict: """Returns the environment variables configuration for this function Priority order (high to low): 1. Function specific env vars from command line 2. Function specific env vars from json file 3. Global env vars from command line 4. Global env vars from json file Parameters ---------- resource : Union[Function, LayerVersion] Lambda function or layer to generate the configuration for file_env_vars : Dict The dictionary of environment variables loaded from the file inline_env_vars : Optional[Dict] The optional dictionary of environment variables defined inline Returns ------- dictionary Environment variable configuration for this function Raises ------ samcli.commands.local.lib.exceptions.OverridesNotWellDefinedError If the environment dict is in the wrong format to process environment vars """ name = resource.name result = {} # validate and raise OverridesNotWellDefinedError for env_var in list((file_env_vars or {}).values()) + list((inline_env_vars or {}).values()): if not isinstance(env_var, dict): reason = "Environment variables {} in incorrect format".format(env_var) LOG.debug(reason) raise OverridesNotWellDefinedError(reason) if file_env_vars: parameter_result = file_env_vars.get("Parameters", {}) result.update(parameter_result) if inline_env_vars: inline_parameter_result = inline_env_vars.get("Parameters", {}) result.update(inline_parameter_result) if file_env_vars: specific_result = file_env_vars.get(name, {}) result.update(specific_result) if inline_env_vars: inline_specific_result = inline_env_vars.get(name, {}) result.update(inline_specific_result) return result
def test_must_raise_user_exception_on_invalid_env_vars(self, invoke_context_mock): invoke_context_mock.side_effect = OverridesNotWellDefinedError("bad env vars") with self.assertRaises(UserException) as context: self.call_cli() msg = str(context.exception) expected = "bad env vars" self.assertEqual(msg, expected)
def _make_env_vars(self, function): """Returns the environment variables configuration for this function Parameters ---------- function : samcli.commands.local.lib.provider.Function Lambda function to generate the configuration for Returns ------- samcli.local.lambdafn.env_vars.EnvironmentVariables Environment variable configuration for this function Raises ------ samcli.commands.local.lib.exceptions.OverridesNotWellDefinedError If the environment dict is in the wrong format to process environment vars """ name = function.name variables = None if function.environment and isinstance(function.environment, dict) and "Variables" in function.environment: variables = function.environment["Variables"] else: LOG.debug("No environment variables found for function '%s'", name) # This could either be in standard format, or a CloudFormation parameter file format. # # Standard format is {FunctionName: {key:value}, FunctionName: {key:value}} # CloudFormation parameter file is {"Parameters": {key:value}} for env_var_value in self.env_vars_values.values(): if not isinstance(env_var_value, dict): reason = """ Environment variables must be in either CloudFormation parameter file format or in {FunctionName: {key:value}} JSON pairs """ LOG.debug(reason) raise OverridesNotWellDefinedError(reason) if "Parameters" in self.env_vars_values: LOG.debug("Environment variables overrides data is in CloudFormation parameter file format") # CloudFormation parameter file format overrides = self.env_vars_values["Parameters"] else: # Standard format LOG.debug("Environment variables overrides data is standard format") overrides = self.env_vars_values.get(name, None) shell_env = os.environ aws_creds = self.get_aws_creds() return EnvironmentVariables(function.memory, function.timeout, function.handler, variables=variables, shell_env_values=shell_env, override_values=overrides, aws_creds=aws_creds)