Example #1
0
def test_rename():
    name = random_name()
    new_name = random_name()
    assert name != new_name
    container = docker.container.run("hello-world", name=name, detach=True)
    docker.container.rename(container, new_name)
    container.reload()

    assert container.name == new_name
    docker.container.remove(container)
Example #2
0
def test_filters():
    random_label_value = random_name()

    containers_with_labels = []

    for _ in range(3):
        containers_with_labels.append(
            docker.run(
                "busybox",
                ["sleep", "infinity"],
                remove=True,
                detach=True,
                labels=dict(dodo=random_label_value),
            ))

    containers_with_wrong_labels = []
    for _ in range(3):
        containers_with_wrong_labels.append(
            docker.run(
                "busybox",
                ["sleep", "infinity"],
                remove=True,
                detach=True,
                labels=dict(dodo="something"),
            ))

    expected_containers_with_labels = docker.container.list(filters=dict(
        label=f"dodo={random_label_value}"))

    assert set(expected_containers_with_labels) == set(containers_with_labels)

    for container in containers_with_labels + containers_with_wrong_labels:
        container.kill()
def test_network_create_with_labels():
    my_name = random_name()
    labels = {"hello": "world", "meme": "meme-label"}
    with docker.network.create(my_name, labels=labels) as my_network:
        assert my_network.name == my_name
        for key, value in labels.items():
            assert my_network.labels[key] == value
Example #4
0
    def copy(
        self,
        source: Union[ValidPath, VolumePath],
        destination: Union[ValidPath, VolumePath],
    ):
        """Copy files/folders between a volume and the local filesystem.

        # Arguments
            source: If `source` is a directory/file inside a Docker volume,
                a tuple `(my_volume, path_in_volume)` must be provided. The volume
                can be a `python_on_whales.Volume` or a volume name as `str`. The path
                can be a `pathlib.Path` or a `str`. If `source` is  a local directory,
                a `pathlib.Path` or `str` should be provided. End the source path with
                `/.` if you want to copy the directory content in another directory.
            destination: Same as `source`.
        """
        with tempfile.TemporaryDirectory() as temp_dir:
            temp_dir = Path(temp_dir)
            content = "FROM scratch\nCOPY Dockerfile /\nCMD /Dockerfile"
            (temp_dir / "Dockerfile").write_text(content)
            buildx = python_on_whales.components.buildx.BuildxCLI(
                self.client_config)
            image_name = random_name()
            dummy_image = buildx.build(temp_dir,
                                       tags=image_name,
                                       progress=False,
                                       load=True)

        container = python_on_whales.components.container.ContainerCLI(
            self.client_config)
        volume_in_container = Path("/volume")
        if isinstance(source, tuple):
            volume_name = str(source[0])

            dummy_container = container.create(dummy_image,
                                               volumes=[(volume_name,
                                                         volume_in_container)])
            container.copy(
                (dummy_container, os.path.join(volume_in_container,
                                               source[1])),
                destination,
            )
        elif isinstance(destination, tuple):
            volume_name = str(destination[0])
            dummy_container = container.create(dummy_image,
                                               volumes=[(volume_name,
                                                         volume_in_container)])
            container.copy(
                source,
                (dummy_container,
                 os.path.join(volume_in_container, destination[1])),
            )
        else:
            raise ValueError("source or destination should be a tuple.")
        dummy_container.remove()
        python_on_whales.components.image.ImageCLI(
            self.client_config).remove(image_name)
Example #5
0
def test_run_volumes():
    volume_name = random_name()
    docker.run(
        "busybox",
        ["touch", "/some/path/dodo"],
        volumes=[(volume_name, "/some/path")],
        remove=True,
    )
    docker.volume.remove(volume_name)
def test_copy_from_and_to_directory(tmp_path):
    my_image = docker.pull("busybox:1")
    (tmp_path / "dodo.txt").write_text("Hello world!")

    new_image_name = random_name()
    my_image.copy_to(tmp_path, "/some_path", new_tag=new_image_name)

    new_image_name = docker.image.inspect(new_image_name)
    new_image_name.copy_from("/some_path", tmp_path / "some_path")
    assert "Hello world!" == (tmp_path / "some_path" / "dodo.txt").read_text()
def test_copy_from_and_to(tmp_path):
    my_image = docker.pull("busybox:1")
    (tmp_path / "dodo.txt").write_text("Hello world!")

    new_image_name = random_name()
    my_image.copy_to(tmp_path / "dodo.txt", "/dada.txt", new_tag=new_image_name)

    new_image_name = docker.image.inspect(new_image_name)
    new_image_name.copy_from("/dada.txt", tmp_path / "dudu.txt")
    assert (tmp_path / "dodo.txt").read_text() == (tmp_path / "dudu.txt").read_text()
Example #8
0
def test_context_manager_with_create():
    container_name = random_name()
    with pytest.raises(ArithmeticError):
        with docker.container.create("busybox:1", ["sleep", "infinity"],
                                     name=container_name) as c:
            assert isinstance(c, python_on_whales.Container)
            raise ArithmeticError

    assert container_name not in [
        x.name for x in docker.container.list(all=True)
    ]
Example #9
0
def test_context_manager():
    container_name = random_name()
    with pytest.raises(ArithmeticError):
        with docker.run("busybox:1", ["sleep", "infinity"],
                        detach=True,
                        name=container_name):
            raise ArithmeticError

    assert container_name not in [
        x.name for x in docker.container.list(all=True)
    ]
def test_context_manager():
    with pytest.raises(DockerException):
        with docker.network.create(random_name()) as my_net:
            docker.run(
                "busybox",
                ["ping", "idonotexistatall.com"],
                networks=[my_net],
                remove=True,
            )
            # an exception will be raised because the container will fail
            # but the network will be removed anyway.

    assert my_net not in docker.network.list()
Example #11
0
def test_name():
    name = random_name()
    container = docker.container.run("hello-world", name=name, detach=True)
    assert container.name == name
    docker.container.remove(container)
def test_network_create_remove():
    my_name = random_name()
    with docker.network.create(my_name) as my_network:
        assert my_network.name == my_name
Example #13
0
def test_network_create_remove():
    my_name = random_name()
    my_network = docker.network.create(my_name)
    assert my_network.name == my_name
    docker.network.remove(my_name)
Example #14
0
def test_prune_prunes_network():
    network_name = random_name()
    my_net = docker.network.create(network_name)
    assert my_net in docker.network.list()
    docker.system.prune()
    assert my_net not in docker.network.list()