def _run_in_provider(project: Project, command_name: str, parsed_args: "argparse.Namespace") -> None: """Pack image in provider instance.""" emit.debug("Checking build provider availability") provider_name = "lxd" if parsed_args.use_lxd else None provider = providers.get_provider(provider_name) provider.ensure_provider_is_available() cmd = ["snapcraft", command_name] if hasattr(parsed_args, "parts"): cmd.extend(parsed_args.parts) if getattr(parsed_args, "output", None): cmd.extend(["--output", parsed_args.output]) if emit.get_mode() == EmitterMode.VERBOSE: cmd.append("--verbose") elif emit.get_mode() == EmitterMode.QUIET: cmd.append("--quiet") elif emit.get_mode() == EmitterMode.DEBUG: cmd.append("--verbosity=debug") elif emit.get_mode() == EmitterMode.TRACE: cmd.append("--verbosity=trace") if parsed_args.debug: cmd.append("--debug") if getattr(parsed_args, "shell", False): cmd.append("--shell") if getattr(parsed_args, "shell_after", False): cmd.append("--shell-after") if getattr(parsed_args, "enable_manifest", False): cmd.append("--enable-manifest") build_information = getattr(parsed_args, "manifest_build_information", None) if build_information: cmd.append("--manifest-build-information") cmd.append(build_information) output_dir = utils.get_managed_environment_project_path() emit.progress("Launching instance...") with provider.launched_environment( project_name=project.name, project_path=Path().absolute(), base=project.get_effective_base(), bind_ssh=parsed_args.bind_ssh, build_on=get_host_architecture(), build_for=get_host_architecture(), ) as instance: try: with emit.pause(): instance.execute_run(cmd, check=True, cwd=output_dir) capture_logs_from_instance(instance) except subprocess.CalledProcessError as err: capture_logs_from_instance(instance) raise providers.ProviderError( f"Failed to execute {command_name} in instance.") from err
def test_dispatcher_generic_setup_trace(options): """Generic parameter handling for trace log setup, directly or after the command.""" cmd = create_command("somecommand") groups = [CommandGroup("title", [cmd])] emit.set_mode(EmitterMode.NORMAL) # this is how `main` will init the Emitter dispatcher = Dispatcher(groups) dispatcher.pre_parse_args(options) assert emit.get_mode() == EmitterMode.TRACE
def test_dispatcher_generic_setup_default(): """Generic parameter handling for default values.""" cmd = create_command("somecommand") groups = [CommandGroup("title", [cmd])] emit.set_mode(EmitterMode.NORMAL) # this is how `main` will init the Emitter dispatcher = Dispatcher(groups) dispatcher.pre_parse_args(["somecommand"]) assert emit.get_mode() == EmitterMode.NORMAL
def pack_charm_in_instance(self, *, bases_index: int, build_on: Base, build_on_index: int) -> str: """Pack instance in Charm.""" charm_name = format_charm_file_name(self.metadata.name, self.config.bases[bases_index]) # If building in project directory, use the project path as the working # directory. The output charms will be placed in the correct directory # without needing retrieval. If outputing to a directory other than the # charm project directory, we need to output the charm outside the # project directory and can retrieve it when complete. cwd = pathlib.Path.cwd() if cwd == self.charmdir: instance_output_dir = env.get_managed_environment_project_path() pull_charm = False else: instance_output_dir = env.get_managed_environment_home_path() pull_charm = True cmd = ["charmcraft", "pack", "--bases-index", str(bases_index)] if emit.get_mode() == EmitterMode.VERBOSE: cmd.append("--verbose") elif emit.get_mode() == EmitterMode.QUIET: cmd.append("--quiet") elif emit.get_mode() == EmitterMode.TRACE: cmd.append("--trace") if self.debug: cmd.append("--debug") if self.shell: cmd.append("--shell") if self.shell_after: cmd.append("--shell-after") emit.progress(f"Launching environment to pack for base {build_on}") with self.provider.launched_environment( charm_name=self.metadata.name, project_path=self.charmdir, base=build_on, bases_index=bases_index, build_on_index=build_on_index, ) as instance: emit.progress("Packing the charm") try: with emit.open_stream(f"Running {cmd}") as stream: instance.execute_run( cmd, check=True, cwd=instance_output_dir, stdout=stream, stderr=stream, ) except subprocess.CalledProcessError as error: capture_logs_from_instance(instance) raise CommandError( f"Failed to build charm for bases index '{bases_index}'." ) from error if pull_charm: try: instance.pull_file( source=instance_output_dir / charm_name, destination=cwd / charm_name, ) except FileNotFoundError as error: raise CommandError( "Unexpected error retrieving charm from instance." ) from error emit.progress("Charm packed ok") return charm_name