Beispiel #1
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)

        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"},
        )
Beispiel #3
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(),
        ]
Beispiel #4
0
    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()
Beispiel #6
0
    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()