def do_cli( template, # pylint: disable=too-many-locals base_dir, build_dir, clean, use_container, manifest_path, docker_network, skip_pull_image, parameter_overrides): """ Implementation of the ``cli`` method """ LOG.debug("'build' command is called") if use_container: LOG.info("Starting Build inside a container") with BuildContext(template, base_dir, build_dir, clean=clean, manifest_path=manifest_path, use_container=use_container, parameter_overrides=parameter_overrides, docker_network=docker_network, skip_pull_image=skip_pull_image) as ctx: builder = ApplicationBuilder( ctx.function_provider, ctx.build_dir, ctx.base_dir, manifest_path_override=ctx.manifest_path_override, container_manager=ctx.container_manager) try: artifacts = builder.build() modified_template = builder.update_template( ctx.template_dict, ctx.original_template_path, artifacts) move_template(ctx.original_template_path, ctx.output_template_path, modified_template) click.secho("\nBuild Succeeded", fg="green") msg = gen_success_msg( os.path.relpath(ctx.build_dir), os.path.relpath(ctx.output_template_path), os.path.abspath( ctx.build_dir) == os.path.abspath(DEFAULT_BUILD_DIR)) click.secho(msg, fg="yellow") except (UnsupportedRuntimeException, BuildError, UnsupportedBuilderLibraryVersionError) as ex: click.secho("Build Failed", fg="red") raise UserException(str(ex))
def do_cli(template, # pylint: disable=too-many-locals base_dir, build_dir, clean, use_container, manifest_path, docker_network, skip_pull_image, parameter_overrides): """ Implementation of the ``cli`` method """ LOG.debug("'build' command is called") if use_container: LOG.info("Starting Build inside a container") with BuildContext(template, base_dir, build_dir, clean=clean, manifest_path=manifest_path, use_container=use_container, parameter_overrides=parameter_overrides, docker_network=docker_network, skip_pull_image=skip_pull_image) as ctx: builder = ApplicationBuilder(ctx.function_provider, ctx.build_dir, ctx.base_dir, manifest_path_override=ctx.manifest_path_override, container_manager=ctx.container_manager ) try: artifacts = builder.build() modified_template = builder.update_template(ctx.template_dict, ctx.original_template_path, artifacts) move_template(ctx.original_template_path, ctx.output_template_path, modified_template) click.secho("\nBuild Succeeded", fg="green") msg = gen_success_msg(os.path.relpath(ctx.build_dir), os.path.relpath(ctx.output_template_path), os.path.abspath(ctx.build_dir) == os.path.abspath(DEFAULT_BUILD_DIR)) click.secho(msg, fg="yellow") except (UnsupportedRuntimeException, BuildError, UnsupportedBuilderLibraryVersionError) as ex: click.secho("Build Failed", fg="red") raise UserException(str(ex))
def test_must_update_and_write_template(self, yaml_dump_mock, update_relative_paths_mock): template_dict = {"a": "b"} # Moving from /tmp/original/root/template.yaml to /tmp/new/root/othertemplate.yaml source = os.path.join("/", "tmp", "original", "root", "template.yaml") dest = os.path.join("/", "tmp", "new", "root", "othertemplate.yaml") modified_template = update_relative_paths_mock.return_value = "modified template" dumped_yaml = yaml_dump_mock.return_value = "dump result" m = mock_open() with patch("samcli.commands._utils.template.open", m): move_template(source, dest, template_dict) update_relative_paths_mock.assert_called_once_with( template_dict, os.path.dirname(source), os.path.dirname(dest)) yaml_dump_mock.assert_called_with(modified_template) m.assert_called_with(dest, "w") m.return_value.write.assert_called_with(dumped_yaml)
def test_must_update_and_write_template(self, yaml_dump_mock, update_relative_paths_mock): template_dict = {"a": "b"} # Moving from /tmp/original/root/template.yaml to /tmp/new/root/othertemplate.yaml source = os.path.join("/", "tmp", "original", "root", "template.yaml") dest = os.path.join("/", "tmp", "new", "root", "othertemplate.yaml") modified_template = update_relative_paths_mock.return_value = "modified template" dumped_yaml = yaml_dump_mock.return_value = "dump result" m = mock_open() with patch("samcli.commands._utils.template.open", m): move_template(source, dest, template_dict) update_relative_paths_mock.assert_called_once_with(template_dict, os.path.dirname(source), os.path.dirname(dest)) yaml_dump_mock.assert_called_with(modified_template) m.assert_called_with(dest, 'w') m.return_value.write.assert_called_with(dumped_yaml)
def do_cli( # pylint: disable=too-many-locals, too-many-statements function_identifier: Optional[str], template: str, base_dir: Optional[str], build_dir: str, cache_dir: str, clean: bool, use_container: bool, cached: bool, parallel: bool, manifest_path: Optional[str], docker_network: Optional[str], skip_pull_image: bool, parameter_overrides: Dict, mode: Optional[str], container_env_var: Optional[Tuple[str]], container_env_var_file: Optional[str], build_image: Optional[Tuple[str]], ) -> None: """ Implementation of the ``cli`` method """ from samcli.commands.exceptions import UserException from samcli.commands.build.build_context import BuildContext from samcli.lib.build.app_builder import ( ApplicationBuilder, BuildError, UnsupportedBuilderLibraryVersionError, ContainerBuildNotSupported, ) from samcli.lib.build.workflow_config import UnsupportedRuntimeException from samcli.local.lambdafn.exceptions import FunctionNotFound from samcli.commands._utils.template import move_template from samcli.lib.build.build_graph import InvalidBuildGraphException LOG.debug("'build' command is called") if cached: LOG.info("Starting Build use cache") if use_container: LOG.info("Starting Build inside a container") processed_env_vars = _process_env_var(container_env_var) processed_build_images = _process_image_options(build_image) with BuildContext( function_identifier, template, base_dir, build_dir, cache_dir, cached, clean=clean, manifest_path=manifest_path, use_container=use_container, parameter_overrides=parameter_overrides, docker_network=docker_network, skip_pull_image=skip_pull_image, mode=mode, container_env_var=processed_env_vars, container_env_var_file=container_env_var_file, build_images=processed_build_images, ) as ctx: try: builder = ApplicationBuilder( ctx.resources_to_build, ctx.build_dir, ctx.base_dir, ctx.cache_dir, ctx.cached, ctx.is_building_specific_resource, manifest_path_override=ctx.manifest_path_override, container_manager=ctx.container_manager, mode=ctx.mode, parallel=parallel, container_env_var=processed_env_vars, container_env_var_file=container_env_var_file, build_images=processed_build_images, ) except FunctionNotFound as ex: raise UserException(str(ex), wrapped_from=ex.__class__.__name__) from ex try: artifacts = builder.build() stack_output_template_path_by_stack_path = { stack.stack_path: stack.get_output_template_path(ctx.build_dir) for stack in ctx.stacks } for stack in ctx.stacks: modified_template = builder.update_template( stack, artifacts, stack_output_template_path_by_stack_path, ) move_template(stack.location, stack.get_output_template_path(ctx.build_dir), modified_template) click.secho("\nBuild Succeeded", fg="green") # try to use relpath so the command is easier to understand, however, # under Windows, when SAM and (build_dir or output_template_path) are # on different drive, relpath() fails. root_stack = SamLocalStackProvider.find_root_stack(ctx.stacks) out_template_path = root_stack.get_output_template_path( ctx.build_dir) try: build_dir_in_success_message = os.path.relpath(ctx.build_dir) output_template_path_in_success_message = os.path.relpath( out_template_path) except ValueError: LOG.debug( "Failed to retrieve relpath - using the specified path as-is instead" ) build_dir_in_success_message = ctx.build_dir output_template_path_in_success_message = out_template_path msg = gen_success_msg( build_dir_in_success_message, output_template_path_in_success_message, os.path.abspath( ctx.build_dir) == os.path.abspath(DEFAULT_BUILD_DIR), ) click.secho(msg, fg="yellow") except ( UnsupportedRuntimeException, BuildError, BuildInsideContainerError, UnsupportedBuilderLibraryVersionError, ContainerBuildNotSupported, InvalidBuildGraphException, ) as ex: click.secho("\nBuild Failed", fg="red") # Some Exceptions have a deeper wrapped exception that needs to be surfaced # from deeper than just one level down. deep_wrap = getattr(ex, "wrapped_from", None) wrapped_from = deep_wrap if deep_wrap else ex.__class__.__name__ raise UserException(str(ex), wrapped_from=wrapped_from) from ex
def do_cli( # pylint: disable=too-many-locals, too-many-statements function_identifier, template, base_dir, build_dir, clean, use_container, manifest_path, docker_network, skip_pull_image, parameter_overrides, mode, ): """ Implementation of the ``cli`` method """ from samcli.commands.exceptions import UserException from samcli.commands.build.build_context import BuildContext from samcli.lib.build.app_builder import ( ApplicationBuilder, BuildError, UnsupportedBuilderLibraryVersionError, ContainerBuildNotSupported, ) from samcli.lib.build.workflow_config import UnsupportedRuntimeException from samcli.local.lambdafn.exceptions import FunctionNotFound from samcli.commands._utils.template import move_template LOG.debug("'build' command is called") if use_container: LOG.info("Starting Build inside a container") with BuildContext( function_identifier, template, base_dir, build_dir, clean=clean, manifest_path=manifest_path, use_container=use_container, parameter_overrides=parameter_overrides, docker_network=docker_network, skip_pull_image=skip_pull_image, mode=mode, ) as ctx: try: builder = ApplicationBuilder( ctx.resources_to_build, ctx.build_dir, ctx.base_dir, manifest_path_override=ctx.manifest_path_override, container_manager=ctx.container_manager, mode=ctx.mode, ) except FunctionNotFound as ex: raise UserException(str(ex), wrapped_from=ex.__class__.__name__) try: artifacts = builder.build() modified_template = builder.update_template( ctx.template_dict, ctx.original_template_path, artifacts) move_template(ctx.original_template_path, ctx.output_template_path, modified_template) click.secho("\nBuild Succeeded", fg="green") # try to use relpath so the command is easier to understand, however, # under Windows, when SAM and (build_dir or output_template_path) are # on different drive, relpath() fails. try: build_dir_in_success_message = os.path.relpath(ctx.build_dir) output_template_path_in_success_message = os.path.relpath( ctx.output_template_path) except ValueError: LOG.debug( "Failed to retrieve relpath - using the specified path as-is instead" ) build_dir_in_success_message = ctx.build_dir output_template_path_in_success_message = ctx.output_template_path msg = gen_success_msg( build_dir_in_success_message, output_template_path_in_success_message, os.path.abspath( ctx.build_dir) == os.path.abspath(DEFAULT_BUILD_DIR), ) click.secho(msg, fg="yellow") except ( UnsupportedRuntimeException, BuildError, BuildInsideContainerError, UnsupportedBuilderLibraryVersionError, ContainerBuildNotSupported, ) as ex: click.secho("\nBuild Failed", fg="red") # Some Exceptions have a deeper wrapped exception that needs to be surfaced # from deeper than just one level down. deep_wrap = getattr(ex, "wrapped_from", None) wrapped_from = deep_wrap if deep_wrap else ex.__class__.__name__ raise UserException(str(ex), wrapped_from=wrapped_from)
def do_cli( function_identifier, # pylint: disable=too-many-locals template, base_dir, build_dir, clean, use_container, manifest_path, docker_network, skip_pull_image, parameter_overrides, mode): """ Implementation of the ``cli`` method """ LOG.debug("'build' command is called") if use_container: LOG.info("Starting Build inside a container") with BuildContext(function_identifier, template, base_dir, build_dir, clean=clean, manifest_path=manifest_path, use_container=use_container, parameter_overrides=parameter_overrides, docker_network=docker_network, skip_pull_image=skip_pull_image, mode=mode) as ctx: try: builder = ApplicationBuilder( ctx.functions_to_build, ctx.build_dir, ctx.base_dir, manifest_path_override=ctx.manifest_path_override, container_manager=ctx.container_manager, mode=ctx.mode) except FunctionNotFound as ex: raise UserException(str(ex)) try: artifacts = builder.build() modified_template = builder.update_template( ctx.template_dict, ctx.original_template_path, artifacts) move_template(ctx.original_template_path, ctx.output_template_path, modified_template) click.secho("\nBuild Succeeded", fg="green") # try to use relpath so the command is easier to understand, however, # under Windows, when SAM and (build_dir or output_template_path) are # on different drive, relpath() fails. try: build_dir_in_success_message = os.path.relpath(ctx.build_dir) output_template_path_in_success_message = os.path.relpath( ctx.output_template_path) except ValueError: LOG.debug( "Failed to retrieve relpath - using the specified path as-is instead" ) build_dir_in_success_message = ctx.build_dir output_template_path_in_success_message = ctx.output_template_path msg = gen_success_msg( build_dir_in_success_message, output_template_path_in_success_message, os.path.abspath( ctx.build_dir) == os.path.abspath(DEFAULT_BUILD_DIR)) click.secho(msg, fg="yellow") except (UnsupportedRuntimeException, BuildError, UnsupportedBuilderLibraryVersionError, ContainerBuildNotSupported) as ex: click.secho("\nBuild Failed", fg="red") raise UserException(str(ex))