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)
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
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), ]
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