def setUp(self): super().setUp() patcher = mock.patch( "snapcraft.internal.build_providers._multipass." "_multipass.MultipassCommand", spec=MultipassCommand, ) self.multipass_cmd_mock = patcher.start() self.addCleanup(patcher.stop) self.project = get_project(base=self.base) def execute_effect(*, command, instance_name, hide_output): if hide_output: return None else: return b"" self.multipass_cmd_mock().execute.side_effect = execute_effect # default data returned for info so launch is triggered self.multipass_cmd_mock().info.side_effect = [ errors.ProviderInfoError(provider_name="multipass", exit_code=1, stderr=b"error"), _DEFAULT_INSTANCE_INFO.encode(), _DEFAULT_INSTANCE_INFO.encode(), ] self.expected_uid_map = {str(os.getuid()): "0"} self.expected_gid_map = {str(os.getgid()): "0"}
def setUp(self): super().setUp() patcher = mock.patch( "snapcraft.internal.build_providers._multipass." "_multipass.MultipassCommand", spec=MultipassCommand, ) self.multipass_cmd_mock = patcher.start() self.addCleanup(patcher.stop) patcher = mock.patch( "snapcraft.internal.build_providers._base_provider.Provider.clean_project", return_value=True, ) patcher.start() self.addCleanup(patcher.stop) # default data returned for info so launch is triggered self.multipass_cmd_mock().info.side_effect = [ errors.ProviderInfoError(provider_name="multipass", exit_code=1, stderr=b"error"), _DEFAULT_INSTANCE_INFO.encode(), _DEFAULT_INSTANCE_INFO.encode(), ]
def test_launch_for_type_base(self): self.project.info.name = "core18" self.project.info.type = "base" self.project.info.base = None instance = MultipassTestImpl(project=self.project, echoer=self.echoer_mock) self.useFixture( fixtures.MockPatchObject( instance, "_get_instance_info", side_effect=[ errors.ProviderInfoError(provider_name="multipass", exit_code=1, stderr=b"error"), {}, ], )) instance.create() self.multipass_cmd_mock().launch.assert_called_once_with( instance_name="snapcraft-core18", cpus="2", mem="2G", disk="256G", image="snapcraft:core18", )
def multipass_cmd(): """Fake MultipassCommand implementation.""" def execute_effect(*, command, instance_name, hide_output): if hide_output: return None return b"" patcher = mock.patch( "snapcraft.internal.build_providers._multipass." "_multipass.MultipassCommand", spec=MultipassCommand, ) multipass_cmd_mock = patcher.start() multipass_cmd_mock().execute.side_effect = execute_effect # default data returned for info so launch is triggered multipass_cmd_mock().info.side_effect = [ errors.ProviderInfoError(provider_name="multipass", exit_code=1, stderr=b"error"), _DEFAULT_INSTANCE_INFO.encode(), _DEFAULT_INSTANCE_INFO.encode(), ] yield multipass_cmd_mock patcher.stop()
def test_instance_does_not_exist_on_destroy(self): # An error is raised if the queried image does not exist self.multipass_cmd_mock().info.side_effect = errors.ProviderInfoError( provider_name=self.instance_name, exit_code=2) multipass = Multipass(project=self.project, echoer=self.echoer_mock) multipass.destroy() self.multipass_cmd_mock().stop.assert_not_called() self.multipass_cmd_mock().delete.assert_not_called()
def info(self, *, instance_name: str, output_format: str = None) -> bytes: """Passthrough for running multipass info.""" cmd = [self.provider_cmd, "info", instance_name] if output_format is not None: cmd.extend(["--format", output_format]) try: return _run_output(cmd) except subprocess.CalledProcessError as process_error: raise errors.ProviderInfoError( provider_name=self.provider_name, exit_code=process_error.returncode) from process_error
def info(self, *, instance_name: str, output_format: str = None) -> bytes: """Passthrough for running multipass info.""" cmd = [self.provider_cmd, "info", instance_name] if output_format is not None: cmd.extend(["--format", output_format]) process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = process.communicate() if process.returncode != 0: raise errors.ProviderInfoError( provider_name=self.provider_name, exit_code=process.returncode, stderr=stderr, ) return stdout
def setUp(self): super().setUp() patcher = mock.patch( "snapcraft.internal.build_providers._multipass._multipass._get_platform", return_value=self.platform, ) patcher.start() self.addCleanup(patcher.stop) patcher = mock.patch( "snapcraft.internal.build_providers._multipass." "_multipass.MultipassCommand", spec=MultipassCommand, ) self.multipass_cmd_mock = patcher.start() self.addCleanup(patcher.stop) self.project = get_project(base=self.base) def execute_effect(*, command, instance_name, hide_output): if command == ["sudo", "-i", "printenv", "HOME"]: return "/root".encode() elif hide_output: return None else: return b"" self.multipass_cmd_mock().execute.side_effect = execute_effect # default data returned for info so launch is triggered self.multipass_cmd_mock().info.side_effect = [ errors.ProviderInfoError(provider_name="multipass", exit_code=1, stderr=b"error"), _DEFAULT_INSTANCE_INFO.encode(), _DEFAULT_INSTANCE_INFO.encode(), ]