Example #1
0
def test_incompatible_instance_os(
    lxc, project, instance_name, instance_launcher, tmp_path
):
    alias = BuilddImageAlias.XENIAL
    provider = lxd.LXDProvider()

    instance_launcher(
        config_keys=dict(),
        instance_name=instance_name,
        image_remote="ubuntu",
        image=alias.value,
        project=project,
        ephemeral=False,
    )

    # Insert incompatible config.
    test_file = tmp_path / "os-release"
    test_file.write_text(
        textwrap.dedent(
            """
            NAME="Ubuntu"
            VERSION="20.10 (Groovy Gorilla)"
            ID=ubuntu
            ID_LIKE=debian
            PRETTY_NAME="Ubuntu 20.10"
            VERSION_ID="20.10"
            HOME_URL="https://www.ubuntu.com/"
            SUPPORT_URL="https://help.ubuntu.com/"
            BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
            PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
            VERSION_CODENAME=groovy
            UBUNTU_CODENAME=groovy
            """
        )
    )
    lxc.file_push(
        instance_name=instance_name,
        project=project,
        source=test_file,
        destination=pathlib.Path("/etc/os-release"),
    )

    image = BuilddImage(alias=alias)

    with pytest.raises(images.CompatibilityError) as exc_info:
        provider.create_instance(
            auto_clean=False,
            name=instance_name,
            image_configuration=image,
            image_name=alias.value,
            image_remote="ubuntu",
            project=project,
            remote="local",
        )

    assert (
        exc_info.value.reason == f"Expected OS version '{alias.value!s}', found '20.10'"
    )
Example #2
0
def test_incompatible_instance_compatibility_tag(lxc, project, instance_name,
                                                 instance_launcher, tmp_path):
    alias = BuilddImageAlias.XENIAL
    instance_launcher(
        config_keys=dict(),
        instance_name=instance_name,
        image_remote="ubuntu",
        image=str(alias.value),
        project=project,
        ephemeral=False,
    )

    # Insert incompatible config.
    test_file = tmp_path / "image.conf"
    test_file.write_text("compatibility_tag: craft-buildd-image-vX")
    lxc.file_push(
        instance=instance_name,
        project=project,
        source=test_file,
        destination=pathlib.Path("/etc/craft-image.conf"),
    )

    image = BuilddImage(alias=alias)

    with pytest.raises(images.CompatibilityError) as exc_info:
        provider = lxd.LXDProvider(
            instance_name=instance_name,
            image=image,
            image_remote_addr="https://cloud-images.ubuntu.com/buildd/releases",
            image_remote_name="ubuntu",
            image_remote_protocol="simplestreams",
            lxc=lxc,
            use_ephemeral_instances=False,
            use_intermediate_image=False,
            project=project,
            remote="local",
            auto_clean=False,
        )
        provider.setup()

    assert (
        exc_info.value.reason ==
        "Expected image compatibility tag 'craft-buildd-image-v0', found 'craft-buildd-image-vX'"
    )

    lxd.LXDProvider(
        instance_name=instance_name,
        image=image,
        image_remote_addr="https://cloud-images.ubuntu.com/buildd/releases",
        image_remote_name="ubuntu",
        image_remote_protocol="simplestreams",
        lxc=lxc,
        use_ephemeral_instances=False,
        use_intermediate_image=False,
        project=project,
        remote="local",
        auto_clean=True,
    )
def test_incompatible_instance_os(instance_launcher, instance_name,
                                  auto_clean):
    alias = BuilddImageAlias.XENIAL
    image = BuilddImage(alias=alias)
    image_name = "snapcraft:core"

    with instance_launcher(
            image_name=image_name,
            name=instance_name,
    ) as instance:
        # Insert incompatible os-release.
        instance.create_file(
            destination=pathlib.Path("/etc/os-release"),
            content=textwrap.dedent("""
                NAME="Ubuntu"
                VERSION="20.10 (Groovy Gorilla)"
                ID=ubuntu
                ID_LIKE=debian
                PRETTY_NAME="Ubuntu 20.10"
                VERSION_ID="20.10"
                HOME_URL="https://www.ubuntu.com/"
                SUPPORT_URL="https://help.ubuntu.com/"
                BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
                PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
                VERSION_CODENAME=groovy
                UBUNTU_CODENAME=groovy
                """).encode(),
            file_mode="0644",
            user="******",
            group="root",
        )

        provider = MultipassProvider()

        if auto_clean:
            provider.create_instance(
                name=instance_name,
                image_configuration=image,
                image_name=image_name,
                auto_clean=auto_clean,
            )
        else:
            with pytest.raises(images.CompatibilityError) as exc_info:
                provider.create_instance(
                    name=instance_name,
                    image_configuration=image,
                    image_name=image_name,
                    auto_clean=auto_clean,
                )

            assert (exc_info.value.reason ==
                    f"Expected OS version '{alias.value!s}', found '20.10'")
Example #4
0
def test_incompatible_instance_compatibility_tag(
    lxc, project, instance_name, instance_launcher, tmp_path
):
    alias = BuilddImageAlias.XENIAL
    provider = lxd.LXDProvider()

    instance_launcher(
        config_keys=dict(),
        instance_name=instance_name,
        image_remote="ubuntu",
        image=alias.value,
        project=project,
        ephemeral=False,
    )

    # Insert incompatible config.
    test_file = tmp_path / "image.conf"
    test_file.write_text("compatibility_tag: craft-buildd-image-vX")
    lxc.file_push(
        instance_name=instance_name,
        project=project,
        source=test_file,
        destination=pathlib.Path("/etc/craft-image.conf"),
    )

    image = BuilddImage(alias=alias)

    with pytest.raises(images.CompatibilityError) as exc_info:
        provider.create_instance(
            auto_clean=False,
            name=instance_name,
            image_configuration=image,
            image_name=alias.value,
            image_remote="ubuntu",
            project=project,
            remote="local",
        )

    assert (
        exc_info.value.reason
        == "Expected image compatibility tag 'craft-buildd-image-v0', found 'craft-buildd-image-vX'"
    )
def test_incompatible_instance_tag(instance_launcher, instance_name,
                                   auto_clean):
    alias = BuilddImageAlias.XENIAL
    image = BuilddImage(alias=alias)
    image_name = "snapcraft:core"

    with instance_launcher(
            image_name=image_name,
            name=instance_name,
    ) as instance:
        # Insert incompatible config.
        instance.create_file(
            destination=pathlib.Path("/etc/craft-image.conf"),
            content="compatibility_tag: craft-buildd-image-vX".encode(),
            file_mode="0644",
            user="******",
            group="root",
        )

        provider = MultipassProvider()

        if auto_clean:
            provider.create_instance(
                name=instance_name,
                image_configuration=image,
                image_name=image_name,
                auto_clean=auto_clean,
            )
        else:
            with pytest.raises(images.CompatibilityError) as exc_info:
                provider.create_instance(
                    name=instance_name,
                    image_configuration=image,
                    image_name=image_name,
                    auto_clean=auto_clean,
                )

            assert (
                exc_info.value.reason ==
                "Expected image compatibility tag 'craft-buildd-image-v0', found 'craft-buildd-image-vX'"
            )
def test_multipass_provider(instance_name, alias, image_name):
    image_configuration = BuilddImage(alias=alias)
    provider = MultipassProvider()

    instance = provider.create_instance(
        name=instance_name,
        image_configuration=image_configuration,
        image_name=image_name,
        auto_clean=True,
    )

    assert isinstance(instance, MultipassInstance)
    assert instance.exists() is True
    assert instance.is_running() is True

    proc = instance.execute_run(["echo", "hi"],
                                check=True,
                                stdout=subprocess.PIPE)

    assert proc.stdout == b"hi\n"

    instance.execute_run(["sudo", "apt", "update"], check=True)
Example #7
0
def test_lxd_provider(project, instance_name, alias, ephemeral, use_snapshots):
    image = BuilddImage(alias=alias)
    provider = lxd.LXDProvider()

    instance = provider.create_instance(
        auto_clean=False,
        name=instance_name,
        image_configuration=image,
        image_name=str(alias.value),
        image_remote="ubuntu",
        project=project,
        remote="local",
        ephemeral=ephemeral,
        use_snapshots=use_snapshots,
    )

    assert isinstance(instance, lxd.LXDInstance)
    assert instance.exists() is True
    assert instance.is_running() is True

    proc = instance.execute_run(["echo", "hi"], check=True, stdout=subprocess.PIPE)

    assert proc.stdout == b"hi\n"
Example #8
0
def test_lxd_provider(lxc, project, alias, use_ephemeral_instances,
                      use_intermediate_image):
    image = BuilddImage(alias=alias)
    provider = LXDProvider(
        instance_name="test1",
        image=image,
        image_remote_addr="https://cloud-images.ubuntu.com/buildd/releases",
        image_remote_name="ubuntu",
        image_remote_protocol="simplestreams",
        lxc=lxc,
        use_ephemeral_instances=use_ephemeral_instances,
        use_intermediate_image=use_intermediate_image,
        project=project,
        remote="local",
    )

    instance = provider.setup()

    assert isinstance(instance, LXDInstance)
    assert instance.exists() is True
    assert instance.is_running() is True

    proc = instance.execute_run(["echo", "hi"],
                                check=True,
                                stdout=subprocess.PIPE)

    assert proc.stdout == b"hi\n"

    provider.teardown(clean=False)

    assert instance.exists() is not use_ephemeral_instances
    assert instance.is_running() is False

    provider.teardown(clean=True)

    assert instance.exists() is False
    assert instance.is_running() is False