Skip to content

Commit

Permalink
resolve pseudo region in build amd deploy comands (aws#2884)
Browse files Browse the repository at this point in the history
* resolve pseudo region from command argument or envvar if available

* Revert "resolve pseudo region from command argument or envvar if available"

This reverts commit abc0b2b.

* pass the aws-region to the BuildContext, DeployContext and Deploy command

* Add integration tests

* Make black happy

* Temporary skip SAR build INTEGRATION TEST till we figure out the credeential issue

* skip SAR tests when no credentials are available

* Use the constant IntrinsicsSymbolTable.AWS_REGION instead of the string 'AWS::Region'

* expand build SAR integration tests to four(all combinations of use-containr and us-east-2 region)

* refactoring, merge stack_names and stack_names_with_regions together

Co-authored-by: _sam <[email protected]>
  • Loading branch information
2 people authored and moelasmar committed Jul 1, 2021
1 parent c277f22 commit 4e4b9f5
Show file tree
Hide file tree
Showing 14 changed files with 224 additions and 64 deletions.
20 changes: 14 additions & 6 deletions samcli/commands/build/build_context.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,18 @@

import logging
import os
import shutil
from typing import Optional, List
import pathlib
import shutil
from typing import Dict, Optional, List

from samcli.commands.build.exceptions import InvalidBuildDirException, MissingBuildMethodException
from samcli.lib.intrinsic_resolver.intrinsics_symbol_table import IntrinsicsSymbolTable
from samcli.lib.providers.provider import ResourcesToBuildCollector, Stack, Function, LayerVersion
from samcli.lib.providers.sam_stack_provider import SamLocalStackProvider
from samcli.local.docker.manager import ContainerManager
from samcli.lib.providers.sam_function_provider import SamFunctionProvider
from samcli.lib.providers.sam_layer_provider import SamLayerProvider
from samcli.lib.providers.sam_stack_provider import SamLocalStackProvider
from samcli.local.docker.manager import ContainerManager
from samcli.local.lambdafn.exceptions import ResourceNotFound
from samcli.commands.build.exceptions import InvalidBuildDirException, MissingBuildMethodException

LOG = logging.getLogger(__name__)

Expand Down Expand Up @@ -45,6 +46,7 @@ def __init__(
container_env_var: Optional[dict] = None,
container_env_var_file: Optional[str] = None,
build_images: Optional[dict] = None,
aws_region: Optional[str] = None,
) -> None:

self._resource_identifier = resource_identifier
Expand All @@ -60,6 +62,10 @@ def __init__(
self._clean = clean
self._use_container = use_container
self._parameter_overrides = parameter_overrides
# Override certain CloudFormation pseudo-parameters based on values provided by customer
self._global_parameter_overrides: Optional[Dict] = None
if aws_region:
self._global_parameter_overrides = {IntrinsicsSymbolTable.AWS_REGION: aws_region}
self._docker_network = docker_network
self._skip_pull_image = skip_pull_image
self._mode = mode
Expand All @@ -76,7 +82,9 @@ def __init__(
def __enter__(self) -> "BuildContext":

self._stacks, remote_stack_full_paths = SamLocalStackProvider.get_stacks(
self._template_file, parameter_overrides=self._parameter_overrides
self._template_file,
parameter_overrides=self._parameter_overrides,
global_parameter_overrides=self._global_parameter_overrides,
)

if remote_stack_full_paths:
Expand Down
3 changes: 3 additions & 0 deletions samcli/commands/build/command.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,7 @@ def cli(
mode = _get_mode_value_from_envvar("SAM_BUILD_MODE", choices=["debug"])

do_cli(
ctx,
resource_logical_id,
template_file,
base_dir,
Expand All @@ -229,6 +230,7 @@ def cli(


def do_cli( # pylint: disable=too-many-locals, too-many-statements
click_ctx,
function_identifier: Optional[str],
template: str,
base_dir: Optional[str],
Expand Down Expand Up @@ -291,6 +293,7 @@ def do_cli( # pylint: disable=too-many-locals, too-many-statements
container_env_var=processed_env_vars,
container_env_var_file=container_env_var_file,
build_images=processed_build_images,
aws_region=click_ctx.region,
) as ctx:
try:
builder = ApplicationBuilder(
Expand Down
11 changes: 9 additions & 2 deletions samcli/commands/deploy/deploy_context.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

import logging
import os
from typing import Dict, List
from typing import Dict, List, Optional

import boto3
import click
Expand All @@ -30,6 +30,7 @@
hide_noecho_parameter_overrides,
)
from samcli.lib.deploy.deployer import Deployer
from samcli.lib.intrinsic_resolver.intrinsics_symbol_table import IntrinsicsSymbolTable
from samcli.lib.package.s3_uploader import S3Uploader
from samcli.lib.providers.sam_stack_provider import SamLocalStackProvider
from samcli.lib.utils.botoconfig import get_boto_config_with_user_agent
Expand Down Expand Up @@ -80,6 +81,10 @@ def __init__(
self.s3_prefix = s3_prefix
self.kms_key_id = kms_key_id
self.parameter_overrides = parameter_overrides
# Override certain CloudFormation pseudo-parameters based on values provided by customer
self.global_parameter_overrides: Optional[Dict] = None
if region:
self.global_parameter_overrides = {IntrinsicsSymbolTable.AWS_REGION: region}
self.capabilities = capabilities
self.no_execute_changeset = no_execute_changeset
self.role_arn = role_arn
Expand Down Expand Up @@ -210,7 +215,9 @@ def deploy(
Should wait for customer's confirm before executing the changeset
"""
stacks, _ = SamLocalStackProvider.get_stacks(
self.template_file, parameter_overrides=sanitize_parameter_overrides(self.parameter_overrides)
self.template_file,
parameter_overrides=sanitize_parameter_overrides(self.parameter_overrides),
global_parameter_overrides=self.global_parameter_overrides,
)
auth_required_per_resource = auth_per_resource(stacks)

Expand Down
14 changes: 9 additions & 5 deletions samcli/commands/deploy/guided_context.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,17 @@

import click
from botocore.session import get_session
from click.types import FuncParamType
from click import prompt
from click import confirm
from click import prompt
from click.types import FuncParamType

from samcli.commands._utils.options import _space_separated_list_func_type
from samcli.commands._utils.template import (
get_template_parameters,
get_template_artifacts_format,
get_template_function_resource_ids,
)
from samcli.commands.deploy.auth_utils import auth_per_resource
from samcli.commands.deploy.code_signer_utils import (
signer_config_per_function,
extract_profile_name_and_owner_from_existing,
Expand All @@ -25,10 +26,10 @@
)
from samcli.commands.deploy.exceptions import GuidedDeployFailedError
from samcli.commands.deploy.guided_config import GuidedConfig
from samcli.commands.deploy.auth_utils import auth_per_resource
from samcli.commands.deploy.utils import sanitize_parameter_overrides
from samcli.lib.config.samconfig import DEFAULT_ENV, DEFAULT_CONFIG_FILE_NAME
from samcli.lib.bootstrap.bootstrap import manage_stack
from samcli.lib.config.samconfig import DEFAULT_ENV, DEFAULT_CONFIG_FILE_NAME
from samcli.lib.intrinsic_resolver.intrinsics_symbol_table import IntrinsicsSymbolTable
from samcli.lib.package.ecr_utils import is_ecr_url
from samcli.lib.package.image_utils import tag_translation, NonLocalImageException, NoImageFoundException
from samcli.lib.providers.provider import Stack
Expand Down Expand Up @@ -127,11 +128,14 @@ def guided_prompts(self, parameter_override_keys):
f"\t{self.start_bold}Stack Name{self.end_bold}", default=default_stack_name, type=click.STRING
)
region = prompt(f"\t{self.start_bold}AWS Region{self.end_bold}", default=default_region, type=click.STRING)
global_parameter_overrides = {IntrinsicsSymbolTable.AWS_REGION: region}
input_parameter_overrides = self.prompt_parameters(
parameter_override_keys, self.parameter_overrides_from_cmdline, self.start_bold, self.end_bold
)
stacks, _ = SamLocalStackProvider.get_stacks(
self.template_file, parameter_overrides=sanitize_parameter_overrides(input_parameter_overrides)
self.template_file,
parameter_overrides=sanitize_parameter_overrides(input_parameter_overrides),
global_parameter_overrides=global_parameter_overrides,
)
image_repositories = self.prompt_image_repository(stacks)

Expand Down
4 changes: 4 additions & 0 deletions tests/integration/buildcmd/build_integ_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ def get_command_list(
container_env_var=None,
container_env_var_file=None,
build_image=None,
region=None,
):

command_list = [self.cmd, "build"]
Expand Down Expand Up @@ -117,6 +118,9 @@ def get_command_list(
if build_image:
command_list += ["--build-image", build_image]

if region:
command_list += ["--region", region]

return command_list

def verify_docker_container_cleanedup(self, runtime):
Expand Down
66 changes: 51 additions & 15 deletions tests/integration/buildcmd/test_build_cmd.py
Original file line number Diff line number Diff line change
@@ -1,38 +1,41 @@
import re
import shutil
import sys
import os
import logging
import os
import random
from unittest import skipIf
import shutil
import sys
from pathlib import Path
from parameterized import parameterized, parameterized_class
from subprocess import Popen, PIPE, TimeoutExpired
from unittest import skipIf

import pytest
from parameterized import parameterized, parameterized_class

from samcli.lib.utils import osutils
from .build_integ_base import (
BuildIntegBase,
DedupBuildIntegBase,
CachedBuildIntegBase,
BuildIntegRubyBase,
NestedBuildIntegBase,
IntrinsicIntegBase,
)
from tests.testing_utils import (
IS_WINDOWS,
RUNNING_ON_CI,
RUNNING_TEST_FOR_MASTER_ON_CI,
RUN_BY_CANARY,
CI_OVERRIDE,
run_command,
SKIP_DOCKER_TESTS,
SKIP_DOCKER_MESSAGE,
)
from .build_integ_base import (
BuildIntegBase,
DedupBuildIntegBase,
CachedBuildIntegBase,
BuildIntegRubyBase,
NestedBuildIntegBase,
IntrinsicIntegBase,
)

LOG = logging.getLogger(__name__)

TIMEOUT = 420 # 7 mins

# SAR tests require credentials. This is to skip running the test where credentials are not available.
SKIP_SAR_TESTS = RUNNING_ON_CI and RUNNING_TEST_FOR_MASTER_ON_CI and not RUN_BY_CANARY


@skipIf(
((IS_WINDOWS and RUNNING_ON_CI) and not CI_OVERRIDE),
Expand Down Expand Up @@ -2016,3 +2019,36 @@ def test_functions_layers_with_s3_codeuri(self):
[""], # there is only one stack
command_result,
)


@skipIf(SKIP_SAR_TESTS, "Skip SAR tests")
class TestBuildSAR(BuildIntegBase):
template = "aws-serverless-application-with-application-id-map.yaml"

@parameterized.expand(
[
("use_container", "us-east-2"),
("use_container", "eu-west-1"),
("use_container", None),
(False, "us-east-2"),
(False, "eu-west-1"),
(False, None),
]
)
@pytest.mark.flaky(reruns=3)
def test_sar_application_with_location_resolved_from_map(self, use_container, region):
if use_container and SKIP_DOCKER_TESTS:
self.skipTest(SKIP_DOCKER_MESSAGE)

cmdlist = self.get_command_list(use_container=use_container, region=region)
LOG.info("Running Command: %s", cmdlist)
LOG.info(self.working_dir)
process_execute = run_command(cmdlist, cwd=self.working_dir)

if region == "us-east-2": # Success [the !FindInMap contains an entry for use-east-2 region only]
self.assertEqual(process_execute.process.returncode, 0)
else:
# Using other regions or the default SAM CLI region (us-east-1, in case if None region given)
# will fail the build as there is no mapping
self.assertEqual(process_execute.process.returncode, 1)
self.assertIn("Property \\'ApplicationId\\' cannot be resolved.", str(process_execute.stderr))
5 changes: 5 additions & 0 deletions tests/integration/deploy/deploy_integ_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ def get_deploy_command_list(
template_file=None,
s3_prefix=None,
capabilities=None,
capabilities_list=None,
force_upload=False,
notification_arns=None,
fail_on_empty_changeset=None,
Expand Down Expand Up @@ -58,6 +59,10 @@ def get_deploy_command_list(
command_list = command_list + ["--image-repositories", str(image_repositories)]
if capabilities:
command_list = command_list + ["--capabilities", str(capabilities)]
elif capabilities_list:
command_list.append("--capabilities")
for capability in capabilities_list:
command_list.append(str(capability))
if parameter_overrides:
command_list = command_list + ["--parameter-overrides", str(parameter_overrides)]
if role_arn:
Expand Down
Loading

0 comments on commit 4e4b9f5

Please sign in to comment.