def test_get_init_containers_with_dockerfiles(self):
        dockerfile_args1 = V1DockerfileType(image="foo/test",
                                            lang_env="LANG",
                                            env=[],
                                            run=["step1", "step2"])
        dockerfile_args2 = V1DockerfileType(
            image="foo/test",
            lang_env="LANG",
            env=[],
            run=["step1", "step2"],
            filename="dockerfile2",
            path="/test",
        )
        containers = self.converter.get_init_containers(
            contexts=None,
            artifacts_store=None,
            init_connections=[
                V1Init(dockerfile=dockerfile_args1),
                V1Init(dockerfile=dockerfile_args2, path="/test"),
            ],
            init_containers=[],
            connection_by_names={},
            polyaxon_init=V1PolyaxonInitContainer(image="foo/foo"),
        )
        for container in containers:
            container.name = ""
        expected_containers = [
            get_dockerfile_init_container(
                dockerfile_args=dockerfile_args1,
                polyaxon_init=V1PolyaxonInitContainer(image="foo/foo"),
                env=self.converter.get_init_service_env_vars(),
                contexts=None,
                run_path=self.converter.run_path,
                run_instance=self.converter.run_instance,
            ),
            get_dockerfile_init_container(
                dockerfile_args=dockerfile_args2,
                polyaxon_init=V1PolyaxonInitContainer(image="foo/foo"),
                env=self.converter.get_init_service_env_vars(),
                mount_path="/test",
                contexts=None,
                run_path=self.converter.run_path,
                run_instance=self.converter.run_instance,
            ),
        ]
        for container in expected_containers:
            container.name = ""

        assert expected_containers == containers
    def test_get_init_containers_with_files(self):
        file_args1 = V1FileType(filename="test.sh", content="test", chmod="+x")
        file_args2 = V1FileType(
            filename="test.csv",
            content="csv",
            kind=V1ArtifactKind.CSV,
        )
        containers = self.converter.get_init_containers(
            contexts=None,
            artifacts_store=None,
            init_connections=[
                V1Init(dockerfile=file_args1),
                V1Init(dockerfile=file_args2, path="/test"),
            ],
            init_containers=[],
            connection_by_names={},
            polyaxon_init=V1PolyaxonInitContainer(image="foo/foo"),
        )
        expected_containers = [
            get_dockerfile_init_container(
                dockerfile_args=file_args1,
                polyaxon_init=V1PolyaxonInitContainer(image="foo/foo"),
                env=self.converter.get_init_service_env_vars(),
                contexts=None,
                run_path=self.converter.run_path,
                run_instance=self.converter.run_instance,
            ),
            get_dockerfile_init_container(
                dockerfile_args=file_args2,
                polyaxon_init=V1PolyaxonInitContainer(image="foo/foo"),
                env=self.converter.get_init_service_env_vars(),
                mount_path="/test",
                contexts=None,
                run_path=self.converter.run_path,
                run_instance=self.converter.run_instance,
            ),
        ]

        self.assert_containers(expected_containers, containers)
Ejemplo n.º 3
0
    def handle_init_connections(
        self,
        polyaxon_init: V1PolyaxonInitContainer,
        artifacts_store: V1ConnectionType,
        init_connections: List[V1Init],
        connection_by_names: Dict[str, V1ConnectionType],
        contexts: PluginsContextsSpec,
    ) -> List[k8s_schemas.V1Container]:
        containers = []
        external_host = contexts.external_host if contexts else False

        # Prepare connections that Polyaxon can init automatically
        for init_connection in init_connections:
            if init_connection.connection:
                connection_spec = connection_by_names.get(
                    init_connection.connection)
                # Handling ssh with git
                if (V1ConnectionKind.is_ssh(connection_spec.kind)
                        and init_connection.git):
                    connection_spec.schema.patch_git(init_connection.git)
                    containers.append(
                        get_git_init_container(
                            polyaxon_init=polyaxon_init,
                            connection=connection_spec,
                            container=init_connection.container,
                            env=self.get_init_service_env_vars(
                                external_host=external_host),
                            mount_path=init_connection.path,
                            contexts=contexts,
                            track=True,
                        ))
                elif V1ConnectionKind.is_git(connection_spec.kind):
                    if init_connection.git:  # Update the default schema
                        connection_spec.schema.patch(init_connection.git)
                    containers.append(
                        get_git_init_container(
                            polyaxon_init=polyaxon_init,
                            connection=connection_spec,
                            container=init_connection.container,
                            env=self.get_init_service_env_vars(
                                external_host=external_host),
                            mount_path=init_connection.path,
                            contexts=contexts,
                            track=True,
                        ))
                elif V1ConnectionKind.is_artifact(connection_spec.kind):
                    containers.append(
                        get_store_container(
                            polyaxon_init=polyaxon_init,
                            connection=connection_spec,
                            artifacts=init_connection.artifacts,
                            container=init_connection.container,
                            env=self.get_init_service_env_vars(
                                external_host=external_host),
                            mount_path=init_connection.path,
                            is_default_artifacts_store=artifacts_store and
                            init_connection.connection == artifacts_store.name,
                        ))
                else:
                    containers.append(
                        get_custom_init_container(
                            connection=connection_spec,
                            container=init_connection.container,
                            env=self.get_init_service_env_vars(
                                external_host=external_host),
                            mount_path=init_connection.path,
                            contexts=contexts,
                        ))
            else:
                # artifacts init without connection should default to the artifactsStore
                if init_connection.artifacts:
                    containers.append(
                        get_store_container(
                            polyaxon_init=polyaxon_init,
                            connection=artifacts_store,
                            artifacts=init_connection.artifacts,
                            container=init_connection.container,
                            env=self.get_init_service_env_vars(
                                external_host=external_host),
                            mount_path=init_connection.path,
                            is_default_artifacts_store=True,
                        ))
                # git init without connection
                if init_connection.git:
                    git_name = init_connection.git.get_name()
                    containers.append(
                        get_git_init_container(
                            polyaxon_init=polyaxon_init,
                            connection=V1ConnectionType(
                                name=git_name,
                                kind=V1ConnectionKind.GIT,
                                schema=init_connection.git,
                                secret=None,
                            ),
                            container=init_connection.container,
                            env=self.get_init_service_env_vars(
                                external_host=external_host),
                            mount_path=init_connection.path,
                            contexts=contexts,
                            track=False,
                        ))
                # Dockerfile initialization
                if init_connection.dockerfile:
                    containers.append(
                        get_dockerfile_init_container(
                            polyaxon_init=polyaxon_init,
                            dockerfile_args=init_connection.dockerfile,
                            env=self.get_init_service_env_vars(
                                external_host=external_host),
                            mount_path=init_connection.path,
                            contexts=contexts,
                            run_path=self.run_path,
                            run_instance=self.run_instance,
                        ))
                # File initialization
                if init_connection.file:
                    containers.append(
                        get_file_init_container(
                            polyaxon_init=polyaxon_init,
                            file_args=init_connection.file,
                            env=self.get_init_service_env_vars(
                                external_host=external_host),
                            mount_path=init_connection.path,
                            contexts=contexts,
                            run_path=self.run_path,
                            run_instance=self.run_instance,
                        ))

        return containers
Ejemplo n.º 4
0
    def test_get_dockerfile_init_container(self):
        dockerfile_args = V1DockerfileType(image="test/test")
        container = get_dockerfile_init_container(
            polyaxon_init=V1PolyaxonInitContainer(image="foo", image_tag=""),
            dockerfile_args=dockerfile_args,
            env=None,
            contexts=PluginsContextsSpec.from_config(V1Plugins(auth=True)),
            run_path="test",
            run_instance="foo.bar.runs.uuid",
        )
        assert INIT_DOCKERFILE_CONTAINER_PREFIX in container.name
        assert container.image == "foo"
        assert container.image_pull_policy is None
        assert container.command == ["polyaxon", "docker", "generate"]
        assert container.args == [
            "--build-context={}".format(dockerfile_args.to_dict(dump=True)),
            "--destination={}".format(CONTEXT_MOUNT_ARTIFACTS),
            "--copy-path={}".format(
                CONTEXT_MOUNT_RUN_OUTPUTS_FORMAT.format("test")),
            "--track",
        ]
        assert container.env == [
            get_run_instance_env_var(run_instance="foo.bar.runs.uuid")
        ]
        assert container.resources == get_init_resources()
        assert container.volume_mounts == [
            get_connections_context_mount(
                name=constants.CONTEXT_VOLUME_ARTIFACTS,
                mount_path=CONTEXT_MOUNT_ARTIFACTS,
            ),
            get_auth_context_mount(read_only=True),
        ]

        dockerfile_args = V1DockerfileType(
            image="test/test",
            lang_env="LANG",
            run=["step1", "step2"],
            env=[["key1", "val1"], ["key2", "val2"]],
            uid=2222,
            gid=2222,
        )
        container = get_dockerfile_init_container(
            polyaxon_init=V1PolyaxonInitContainer(
                image="init/init",
                image_tag="",
                image_pull_policy="IfNotPresent"),
            env=[],
            dockerfile_args=dockerfile_args,
            mount_path="/somepath",
            contexts=PluginsContextsSpec.from_config(V1Plugins(auth=True)),
            run_path="test",
            run_instance="foo.bar.runs.uuid",
        )
        assert INIT_DOCKERFILE_CONTAINER_PREFIX in container.name
        assert container.image == "init/init"
        assert container.image_pull_policy == "IfNotPresent"
        assert container.command == ["polyaxon", "docker", "generate"]
        assert container.args == [
            "--build-context={}".format(dockerfile_args.to_dict(dump=True)),
            "--destination=/somepath",
            "--copy-path={}".format(
                CONTEXT_MOUNT_RUN_OUTPUTS_FORMAT.format("test")),
            "--track",
        ]
        assert container.env == [
            get_run_instance_env_var(run_instance="foo.bar.runs.uuid")
        ]
        assert container.resources == get_init_resources()
        assert container.volume_mounts == [
            get_connections_context_mount(name=get_volume_name("/somepath"),
                                          mount_path="/somepath"),
            get_auth_context_mount(read_only=True),
        ]
Ejemplo n.º 5
0
    def handle_init_connections(
        self,
        polyaxon_init: V1PolyaxonInitContainer,
        init_connections: List[V1Init],
        connection_by_names: Dict[str, V1ConnectionType],
        contexts: PluginsContextsSpec,
    ) -> List[k8s_schemas.V1Container]:
        containers = []

        # Prepare connections that Polyaxon can inti automatically
        for init_connection in init_connections:
            if init_connection.connection:
                connection_spec = connection_by_names.get(
                    init_connection.connection)
                if init_connection.git:  # Update the default schema
                    connection_spec.schema.patch(init_connection.git)
                if connection_spec.kind == V1ConnectionKind.GIT:
                    containers.append(
                        get_git_init_container(
                            polyaxon_init=polyaxon_init,
                            connection=connection_spec,
                            container=init_connection.container,
                            env=self.get_init_service_env_vars(),
                            mount_path=init_connection.path,
                            contexts=contexts,
                            track=True,
                        ))
                if V1ConnectionKind.is_artifact(connection_spec.kind):
                    containers.append(
                        get_store_container(
                            polyaxon_init=polyaxon_init,
                            connection=connection_spec,
                            artifacts=init_connection.artifacts,
                            container=init_connection.container,
                            env=self.get_init_service_env_vars(),
                            mount_path=init_connection.path,
                        ))
            else:
                # git init without connection
                if init_connection.git:
                    git_name = init_connection.git.get_name()
                    containers.append(
                        get_git_init_container(
                            polyaxon_init=polyaxon_init,
                            connection=V1ConnectionType(
                                name=git_name,
                                kind=V1ConnectionKind.GIT,
                                schema=init_connection.git,
                                secret=None,
                            ),
                            container=init_connection.container,
                            env=self.get_init_service_env_vars(),
                            mount_path=init_connection.path,
                            contexts=contexts,
                            track=False,
                        ))
                # Dockerfile initialization
                if init_connection.dockerfile:
                    containers.append(
                        get_dockerfile_init_container(
                            polyaxon_init=polyaxon_init,
                            dockerfile_args=init_connection.dockerfile,
                            env=self.get_init_service_env_vars(),
                            mount_path=init_connection.path,
                            contexts=contexts,
                            run_path=self.run_path,
                        ))

        return containers