示例#1
0
def test_pull_never(podman_backend):
    with pytest.raises(subprocess.CalledProcessError):
        podman_backend.ImageClass._inspect("busybox:1.25.1")
    image = podman_backend.ImageClass("docker.io/library/busybox",
                                      tag="1.29.3",
                                      pull_policy=PodmanImagePullPolicy.NEVER)
    assert not image.is_present()
示例#2
0
def test_pull_if_not_present(podman_backend):
    image = podman_backend.ImageClass("docker.io/library/busybox",
                                      tag="1.29.3")
    try:
        assert image.is_present()
    finally:
        image.rmi(force=True)
示例#3
0
def test_list_containers(podman_backend):
    l = len(podman_backend.list_containers())
    assert l >= 0
    image = podman_backend.ImageClass(FEDORA_MINIMAL_REPOSITORY,
                                      tag=FEDORA_MINIMAL_REPOSITORY_TAG,
                                      pull_policy=PodmanImagePullPolicy.NEVER)
    prb = PodmanRunBuilder(command=["sleep", "1"],
                           additional_opts=[
                               "-e",
                               "FOO=BAR",
                           ])
    container = image.run_via_binary(run_command_instance=prb)
    try:
        container_list = podman_backend.list_containers()
        l = len(container_list)
        assert l >= 1
        print(container_list[0].metadata.identifier)
        cont_under_test = [
            x for x in container_list
            if x.metadata.identifier == container.get_id()
        ][0]
        assert cont_under_test.metadata.image
        assert cont_under_test.metadata.command
        assert cont_under_test.metadata.env_variables["FOO"] == "BAR"
        assert cont_under_test.get_IPv4s()
    finally:
        container.delete(force=True)
示例#4
0
def test_pull_always(podman_backend):
    image = podman_backend.ImageClass("docker.io/library/busybox",
                                      tag="latest",
                                      pull_policy=PodmanImagePullPolicy.ALWAYS)
    try:
        assert image.is_present()
    finally:
        image.rmi(force=True)
示例#5
0
def test_container_create_failed(podman_backend, podman_run_builder):
    """
    Test podman run with execution non-existing command
    """
    image = podman_backend.ImageClass(FEDORA_MINIMAL_REPOSITORY,
                                      tag=FEDORA_MINIMAL_REPOSITORY_TAG)
    podman_run_builder.arguments += ["waldo"]
    # should raise an exc, there is no such command: waldo; we need to find waldo first
    with pytest.raises(ConuException):
        image.run_via_binary(run_command_instance=podman_run_builder)
示例#6
0
def test_wait_for_status(podman_backend):
    image = podman_backend.ImageClass(FEDORA_MINIMAL_REPOSITORY,
                                      tag=FEDORA_MINIMAL_REPOSITORY_TAG)
    cmd = ['true']
    cont = image.run_via_binary(command=cmd)

    try:
        p = Probe(timeout=6, fnc=cont.is_running, expected_retval=False)
        p.run()  # let's wait for the container to exit
        assert cont.exit_code() == 0  # let's make sure it exited fine
    finally:
        cont.delete(force=True)
示例#7
0
def test_execute(podman_backend):
    image = podman_backend.ImageClass(FEDORA_MINIMAL_REPOSITORY,
                                      tag=FEDORA_MINIMAL_REPOSITORY_TAG)
    cmd = ['sleep', 'infinity']
    cont = image.run_via_binary(command=cmd)
    cont.execute(["bash", "-c", "exit 0"])
    assert "asd\nasd" == cont.execute(["printf", "asd\nasd"])
    assert "asd" == cont.execute(["printf", "asd"])
    with pytest.raises(subprocess.CalledProcessError) as ex:
        cont.execute(["bash", "-c", "exit 110"])
        assert "exit code 110" in ex.value.message
        assert "bash" in ex.value.message
示例#8
0
def test_container_logs(podman_backend):
    image = podman_backend.ImageClass(FEDORA_MINIMAL_REPOSITORY,
                                      tag=FEDORA_MINIMAL_REPOSITORY_TAG)
    command = ["bash", "-c", "for x in `seq 1 5`; do echo $x; done"]
    cont = image.run_via_binary(command=command)
    try:
        Probe(timeout=5, fnc=cont.is_running, expected_retval=False).run()
        assert not cont.is_running()
        assert list(cont.logs()) == [
            '1', '\n', '2', '\n', '3', '\n', '4', '\n', '5', '\n'
        ]
    finally:
        cont.delete(force=True)
示例#9
0
文件: test_podman.py 项目: r00ta/conu
def test_run_with_volumes_metadata_check(tmpdir, podman_backend):
    t = str(tmpdir)
    image = podman_backend.ImageClass(FEDORA_MINIMAL_REPOSITORY,
                                      tag=FEDORA_MINIMAL_REPOSITORY_TAG,
                                      pull_policy=PodmanImagePullPolicy.NEVER)
    container = image.run_via_binary(volumes=(Directory(t), "/mountpoint",
                                              "Z"))
    try:
        mount = container.inspect()["Mounts"][0]
        assert mount["source"] == t
        assert mount["destination"] == "/mountpoint"
        assert "Z" in mount["options"]
    finally:
        container.delete(force=True)
示例#10
0
def test_container_create_failed(podman_backend):
    """
    Test podman run with execution non-existing command
    """
    # FIXME: Cleanup containers after run
    image = podman_backend.ImageClass(FEDORA_MINIMAL_REPOSITORY,
                                      tag=FEDORA_MINIMAL_REPOSITORY_TAG)
    # should raise an exc, there is no such command: waldo; we need to find waldo first
    with pytest.raises(ConuException):
        image.run_via_binary(command=["waldo"])
    c = image.run_via_binary_in_foreground(PodmanRunBuilder(command=["waldo"]))
    c.popen_instance.communicate()
    try:
        assert c.popen_instance.returncode > 0
    finally:
        c.delete(force=True)
示例#11
0
def test_http_client(podman_backend):
    image = podman_backend.ImageClass(FEDORA_REPOSITORY)
    c = image.run_via_binary(
        command=["python3", "-m", "http.server", "--bind", "0.0.0.0 8000"])
    try:
        c.wait_for_port(8000)
        assert c.is_running()
        r = c.http_request(port="8000")
        assert "<!DOCTYPE HTML PUBLIC" in r.content.decode("utf-8")
        assert r.ok
        r2 = c.http_request(path="/etc", port="8000")
        assert "<!DOCTYPE HTML PUBLIC" in r2.content.decode("utf-8")
        assert "passwd" in r2.content.decode("utf-8")
        assert r2.ok
    finally:
        c.delete(force=True)
示例#12
0
def test_container_metadata(podman_backend):
    image = podman_backend.ImageClass(FEDORA_MINIMAL_REPOSITORY,
                                      tag=FEDORA_MINIMAL_REPOSITORY_TAG)
    # TODO: add port bindings to the mix once they are supported in rootless mode
    c = image.run_via_binary(
        PodmanRunBuilder(
            command=["cat"],
            additional_opts=[
                '-i',
                '-t',
                '--name',
                'mycontainer',
                # '-p', '1234:12345',
                # '-p', '123:12345',
                # '-p', '8080',
                '--hostname',
                'my_hostname',
                '-e',
                'ENV1=my_env',
                '-e',
                'ASD=',
                '-e',
                'A=B=C=D',
                '--label',
                'testlabel1=testvalue1'
            ]))

    try:
        container_metadata = c.get_metadata()

        assert container_metadata.command == ["cat"]
        assert container_metadata.name == "mycontainer"
        assert container_metadata.env_variables["ENV1"] == "my_env"
        assert container_metadata.env_variables["ASD"] == ""
        assert container_metadata.env_variables["A"] == "B=C=D"
        assert container_metadata.hostname == "my_hostname"

        # FIXME: podman raise an error when you send option  '-e XYZ': no such env variable
        # assert "XYZ" not in list(container_metadata.env_variables.keys())
        # assert 12345 in container_metadata.port_mappings
        # assert container_metadata.port_mappings[12345] == [1234, 123]
        # assert 8080 in container_metadata.port_mappings
        # assert set(container_metadata.exposed_ports) == {8080, 12345}
        assert container_metadata.labels["testlabel1"] == "testvalue1"
        assert container_metadata.status == ContainerStatus.RUNNING
    finally:
        c.delete(force=True)
示例#13
0
def test_container(podman_backend):
    """
    Basic tests of interacting with a podman container
    """
    image = podman_backend.ImageClass(FEDORA_MINIMAL_REPOSITORY,
                                      tag=FEDORA_MINIMAL_REPOSITORY_TAG)
    c = image.run_via_binary(
        PodmanRunBuilder(command=["cat"], additional_opts=["-i", "-t"]))
    try:
        assert c.is_running()
        assert "Config" in c.inspect()
        assert "Config" in c.inspect()
        assert c.get_id() == str(c)
        assert repr(c)
        assert isinstance(c.get_id(), string_types)
    finally:
        c.delete(force=True)
示例#14
0
def test_http_client_context(podman_backend):
    image = podman_backend.ImageClass(FEDORA_REPOSITORY)
    c = image.run_via_binary(
        command=["python3", "-m", "http.server", "--bind", "0.0.0.0 8000"])
    try:
        c.wait_for_port(8000)
        with c.http_client(port=8000) as session:
            r = session.get("/")
            assert r.ok
            assert "<!DOCTYPE HTML PUBLIC" in r.content.decode("utf-8")

            r2 = session.get("/etc")
            assert "<!DOCTYPE HTML PUBLIC" in r2.content.decode("utf-8")
            assert "passwd" in r2.content.decode("utf-8")
            assert r2.ok
    finally:
        c.delete(force=True)
示例#15
0
def test_container(podman_backend, podman_run_builder):
    """
    Basic tests of interacting with a podman container
    """
    image = podman_backend.ImageClass(FEDORA_MINIMAL_REPOSITORY,
                                      tag=FEDORA_MINIMAL_REPOSITORY_TAG)
    podman_run_builder.arguments += ["cat"]
    podman_run_builder.options += ["-i", "-t"]
    c = image.run_via_binary(run_command_instance=podman_run_builder)
    try:
        assert c.is_running()
        assert "Config" in c.inspect()
        assert "Config" in c.inspect()
        assert c.get_id() == str(c)
        assert repr(c)
        assert isinstance(c.get_id(), string_types)
    finally:
        c.delete(force=True)
示例#16
0
def test_run_with_volumes_metadata_check(tmpdir, podman_backend):
    t = str(tmpdir)
    mountpoint_path = "/mountpoint"
    image = podman_backend.ImageClass(FEDORA_MINIMAL_REPOSITORY,
                                      tag=FEDORA_MINIMAL_REPOSITORY_TAG,
                                      pull_policy=PodmanImagePullPolicy.NEVER)
    container = image.run_via_binary(volumes=(Directory(t), mountpoint_path,
                                              "Z"))
    try:
        for mount in container.inspect()["Mounts"]:
            if mount["source"] == t and mount["destination"] == mountpoint_path:
                assert "Z" in mount["options"]
                break
        # break was not reached: the mountpoint was not found
        else:
            assert False, "No mountpoint matching criteria: %s:%s:%s" % (
                t, mountpoint_path, "Z")
    finally:
        container.delete(force=True)
示例#17
0
def test_exit_code(podman_backend):
    image = podman_backend.ImageClass(FEDORA_MINIMAL_REPOSITORY,
                                      tag=FEDORA_MINIMAL_REPOSITORY_TAG)
    cmd = ['sleep', '0.3']
    cont = image.run_via_binary(command=cmd)
    try:
        p = Probe(timeout=5, fnc=cont.is_running, expected_retval=False)
        p.run()
        assert not cont.is_running() and cont.exit_code() == 0
    finally:
        cont.delete(force=True)

    cmd = ['bash', '-c', "exit 42"]
    cont = image.run_via_binary(command=cmd)
    try:
        cont.wait()
        assert cont.exit_code() == 42
    finally:
        cont.delete(force=True)
示例#18
0
def test_podman_image(podman_backend):
    """
    Test interaction with an image
    """
    image = podman_backend.ImageClass(FEDORA_MINIMAL_REPOSITORY,
                                      tag=FEDORA_MINIMAL_REPOSITORY_TAG)
    assert "%s:%s" % (FEDORA_MINIMAL_REPOSITORY,
                      FEDORA_MINIMAL_REPOSITORY_TAG) == image.get_full_name()
    assert "%s:%s" % (FEDORA_MINIMAL_REPOSITORY, FEDORA_MINIMAL_REPOSITORY_TAG
                      ) in image.inspect()['RepoTags']
    assert "Config" in image.inspect()
    assert "fedora-minimal:26" in image.get_full_name()
    assert "registry.fedoraproject.org/fedora-minimal:26" == str(image)
    assert "PodmanImage(repository=%s, tag=%s)" % (
        FEDORA_MINIMAL_REPOSITORY,
        FEDORA_MINIMAL_REPOSITORY_TAG) == repr(image)
    assert isinstance(image.get_id(), string_types)
    new_image = image.tag_image(tag="test")
    assert new_image.is_present()
    new_image.rmi(via_name=True)
    assert not new_image.is_present()
示例#19
0
def test_interactive_container(podman_backend):
    image = podman_backend.ImageClass(FEDORA_MINIMAL_REPOSITORY,
                                      tag=FEDORA_MINIMAL_REPOSITORY_TAG)
    command = ["bash"]
    additional_opts = ["-i"]
    cont = image.run_via_binary_in_foreground(command=command,
                                              additional_opts=additional_opts,
                                              popen_params={
                                                  "stdin": subprocess.PIPE,
                                                  "stdout": subprocess.PIPE
                                              })
    try:
        assert cont.is_running()
        assert "" == cont.logs()
        assert cont.is_running()
        time.sleep(0.1)
        cont.popen_instance.stdin.write(b"echo palacinky\n")
        cont.popen_instance.stdin.flush()
        time.sleep(0.2)
        assert b"palacinky" in cont.popen_instance.stdout.readline()
    finally:
        cont.delete(force=True)
示例#20
0
def test_set_name(podman_backend):
    test_name = 'jondoe'
    image = podman_backend.ImageClass(FEDORA_MINIMAL_REPOSITORY,
                                      tag=FEDORA_MINIMAL_REPOSITORY_TAG,
                                      pull_policy=PodmanImagePullPolicy.NEVER)
    cont = image.run_via_binary()
    assert cont.name
    cont.delete(force=True)

    cont = image.run_via_binary_in_foreground()
    assert cont.name
    cont.delete(force=True)

    additional_opts = ['--name', test_name]
    cont = image.run_via_binary(additional_opts=additional_opts)
    assert cont.name == test_name
    cont.delete(force=True)

    additional_opts = ['--name', test_name]
    cont = image.run_via_binary_in_foreground(additional_opts=additional_opts)
    assert cont.name == test_name
    cont.delete(force=True)
示例#21
0
def test_image_wrong_types(podman_backend):
    with pytest.raises(ConuException) as exc:
        podman_backend.ImageClass(FEDORA_MINIMAL_REPOSITORY,
                                  PodmanImagePullPolicy.NEVER)
        assert "tag" in exc.value.message