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 test_mount_prime_directory(self, xdg_dirs, in_snap, snap_injector, multipass_cmd, base, expected_image): with MultipassTestImpl(project=get_project(base), echoer=mock.Mock(), is_ephemeral=False) as instance: instance._mount_prime_directory() multipass_cmd().mount.assert_called_once_with( source=mock.ANY, target="snapcraft-project-name:/root/prime", uid_map={str(os.getuid()): "0"}, gid_map={str(os.getgid()): "0"}, )
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(), ]
def test_plaftorm_and_base_unsupported(self): project = get_project(base="core17") multipass = Multipass(project=project, echoer=self.echoer_mock) self.assertRaises(errors.UnsupportedHostError, multipass.create)
def test_lifecycle(self, xdg_dirs, in_snap, snap_injector, multipass_cmd, base, expected_image): with MultipassTestImpl(project=get_project(base=base), echoer=mock.Mock(), is_ephemeral=False) as instance: instance.mount_project() instance.execute_step(steps.PULL) multipass_cmd().launch.assert_called_once_with( instance_name="snapcraft-project-name", cpus="2", mem="2G", disk="256G", image=expected_image, ) multipass_cmd().execute.assert_called() for args, kwargs in multipass_cmd().execute.call_args_list: assert kwargs["command"][0:3] == [ "sudo", "-H", "-i", ] assert kwargs["hide_output"] is False assert kwargs["instance_name"] == "snapcraft-project-name" multipass_cmd().mount.assert_called_once_with( source=mock.ANY, target="snapcraft-project-name:/root/project", uid_map={str(os.getuid()): "0"}, gid_map={str(os.getgid()): "0"}, ) multipass_cmd().umount.assert_not_called() assert multipass_cmd().info.call_count == 3 multipass_cmd().info.assert_has_calls([ mock.call(instance_name="snapcraft-project-name", output_format="json"), mock.call(instance_name="snapcraft-project-name", output_format="json"), ]) assert multipass_cmd().push_file.mock_calls == [ call( destination= "snapcraft-project-name:/var/tmp/L3Jvb3QvLmJhc2hyYw==", source=mock.ANY, ), call( destination= "snapcraft-project-name:/var/tmp/L2Jpbi9fc25hcGNyYWZ0X3Byb21wdA==", source=mock.ANY, ), call( destination= "snapcraft-project-name:/var/tmp/L2V0Yy9hcHQvc291cmNlcy5saXN0", source=mock.ANY, ), call( destination= "snapcraft-project-name:/var/tmp/L2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZGVmYXVsdC5zb3VyY2Vz", source=mock.ANY, ), call( destination= "snapcraft-project-name:/var/tmp/L2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZGVmYXVsdC1zZWN1cml0eS5zb3VyY2Vz", source=mock.ANY, ), call( destination= "snapcraft-project-name:/var/tmp/L2V0Yy9hcHQvYXB0LmNvbmYuZC8wMC1zbmFwY3JhZnQ=", source=mock.ANY, ), ] multipass_cmd().stop.assert_called_once_with( instance_name="snapcraft-project-name", time=10) multipass_cmd().delete.assert_not_called()
def test_lifecycle(self, xdg_dirs, in_snap, snap_injector, multipass_cmd, base, expected_image): with MultipassTestImpl(project=get_project(base=base), echoer=mock.Mock(), is_ephemeral=False) as instance: instance.mount_project() instance.execute_step(steps.PULL) multipass_cmd().launch.assert_called_once_with( instance_name="snapcraft-project-name", cpus="2", mem="2G", disk="256G", image=expected_image, ) assert multipass_cmd().execute.mock_calls == [ call( command=[ "sudo", "-H", "-i", "env", "SNAPCRAFT_HAS_TTY=False", "mv", "/var/tmp/L3Jvb3QvLmJhc2hyYw==", "/root/.bashrc", ], hide_output=False, instance_name="snapcraft-project-name", ), call( command=[ "sudo", "-H", "-i", "env", "SNAPCRAFT_HAS_TTY=False", "chown", "root:root", "/root/.bashrc", ], hide_output=False, instance_name="snapcraft-project-name", ), call( command=[ "sudo", "-H", "-i", "env", "SNAPCRAFT_HAS_TTY=False", "chmod", "0600", "/root/.bashrc", ], hide_output=False, instance_name="snapcraft-project-name", ), call( command=[ "sudo", "-H", "-i", "env", "SNAPCRAFT_HAS_TTY=False", "mv", "/var/tmp/L2Jpbi9fc25hcGNyYWZ0X3Byb21wdA==", "/bin/_snapcraft_prompt", ], hide_output=False, instance_name="snapcraft-project-name", ), call( command=[ "sudo", "-H", "-i", "env", "SNAPCRAFT_HAS_TTY=False", "chown", "root:root", "/bin/_snapcraft_prompt", ], hide_output=False, instance_name="snapcraft-project-name", ), call( command=[ "sudo", "-H", "-i", "env", "SNAPCRAFT_HAS_TTY=False", "chmod", "0755", "/bin/_snapcraft_prompt", ], hide_output=False, instance_name="snapcraft-project-name", ), call( command=[ "sudo", "-H", "-i", "env", "SNAPCRAFT_HAS_TTY=False", "mv", "/var/tmp/L2V0Yy9hcHQvc291cmNlcy5saXN0", "/etc/apt/sources.list", ], hide_output=False, instance_name="snapcraft-project-name", ), call( command=[ "sudo", "-H", "-i", "env", "SNAPCRAFT_HAS_TTY=False", "chown", "root:root", "/etc/apt/sources.list", ], hide_output=False, instance_name="snapcraft-project-name", ), call( command=[ "sudo", "-H", "-i", "env", "SNAPCRAFT_HAS_TTY=False", "chmod", "0644", "/etc/apt/sources.list", ], hide_output=False, instance_name="snapcraft-project-name", ), call( command=[ "sudo", "-H", "-i", "env", "SNAPCRAFT_HAS_TTY=False", "mv", "/var/tmp/L2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZGVmYXVsdC5zb3VyY2Vz", "/etc/apt/sources.list.d/default.sources", ], hide_output=False, instance_name="snapcraft-project-name", ), call( command=[ "sudo", "-H", "-i", "env", "SNAPCRAFT_HAS_TTY=False", "chown", "root:root", "/etc/apt/sources.list.d/default.sources", ], hide_output=False, instance_name="snapcraft-project-name", ), call( command=[ "sudo", "-H", "-i", "env", "SNAPCRAFT_HAS_TTY=False", "chmod", "0644", "/etc/apt/sources.list.d/default.sources", ], hide_output=False, instance_name="snapcraft-project-name", ), call( command=[ "sudo", "-H", "-i", "env", "SNAPCRAFT_HAS_TTY=False", "mv", "/var/tmp/L2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZGVmYXVsdC1zZWN1cml0eS5zb3VyY2Vz", "/etc/apt/sources.list.d/default-security.sources", ], hide_output=False, instance_name="snapcraft-project-name", ), call( command=[ "sudo", "-H", "-i", "env", "SNAPCRAFT_HAS_TTY=False", "chown", "root:root", "/etc/apt/sources.list.d/default-security.sources", ], hide_output=False, instance_name="snapcraft-project-name", ), call( command=[ "sudo", "-H", "-i", "env", "SNAPCRAFT_HAS_TTY=False", "chmod", "0644", "/etc/apt/sources.list.d/default-security.sources", ], hide_output=False, instance_name="snapcraft-project-name", ), call( command=[ "sudo", "-H", "-i", "env", "SNAPCRAFT_HAS_TTY=False", "mv", "/var/tmp/L2V0Yy9hcHQvYXB0LmNvbmYuZC8wMC1zbmFwY3JhZnQ=", "/etc/apt/apt.conf.d/00-snapcraft", ], hide_output=False, instance_name="snapcraft-project-name", ), call( command=[ "sudo", "-H", "-i", "env", "SNAPCRAFT_HAS_TTY=False", "chown", "root:root", "/etc/apt/apt.conf.d/00-snapcraft", ], hide_output=False, instance_name="snapcraft-project-name", ), call( command=[ "sudo", "-H", "-i", "env", "SNAPCRAFT_HAS_TTY=False", "chmod", "0644", "/etc/apt/apt.conf.d/00-snapcraft", ], hide_output=False, instance_name="snapcraft-project-name", ), call( command=[ "sudo", "-H", "-i", "env", "SNAPCRAFT_HAS_TTY=False", "apt-get", "update", ], hide_output=False, instance_name="snapcraft-project-name", ), call( command=[ "sudo", "-H", "-i", "env", "SNAPCRAFT_HAS_TTY=False", "apt-get", "dist-upgrade", "--yes", ], hide_output=False, instance_name="snapcraft-project-name", ), call( command=[ "sudo", "-H", "-i", "env", "SNAPCRAFT_HAS_TTY=False", "snapcraft", "pull", ], hide_output=False, instance_name="snapcraft-project-name", ), ] multipass_cmd().mount.assert_called_once_with( source=mock.ANY, target="snapcraft-project-name:/root/project", uid_map={str(os.getuid()): "0"}, gid_map={str(os.getgid()): "0"}, ) multipass_cmd().umount.assert_not_called() assert multipass_cmd().info.call_count == 3 multipass_cmd().info.assert_has_calls([ mock.call(instance_name="snapcraft-project-name", output_format="json"), mock.call(instance_name="snapcraft-project-name", output_format="json"), ]) assert multipass_cmd().push_file.mock_calls == [ call( destination= "snapcraft-project-name:/var/tmp/L3Jvb3QvLmJhc2hyYw==", source=mock.ANY, ), call( destination= "snapcraft-project-name:/var/tmp/L2Jpbi9fc25hcGNyYWZ0X3Byb21wdA==", source=mock.ANY, ), call( destination= "snapcraft-project-name:/var/tmp/L2V0Yy9hcHQvc291cmNlcy5saXN0", source=mock.ANY, ), call( destination= "snapcraft-project-name:/var/tmp/L2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZGVmYXVsdC5zb3VyY2Vz", source=mock.ANY, ), call( destination= "snapcraft-project-name:/var/tmp/L2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZGVmYXVsdC1zZWN1cml0eS5zb3VyY2Vz", source=mock.ANY, ), call( destination= "snapcraft-project-name:/var/tmp/L2V0Yy9hcHQvYXB0LmNvbmYuZC8wMC1zbmFwY3JhZnQ=", source=mock.ANY, ), ] multipass_cmd().stop.assert_called_once_with( instance_name="snapcraft-project-name", time=10) multipass_cmd().delete.assert_not_called()