示例#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"}
示例#2
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(),
        ]
示例#3
0
    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()
示例#5
0
    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()
示例#6
0
 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
示例#7
0
 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
示例#8
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(),
        ]