Skip to content

Commit 06ac9bd

Browse files
committed
bug(backend,sdk): Use a valid path separator for Modelcar imports (kubeflow#11767)
Forward slashes are invalid characters in a path and can't be escaped. Signed-off-by: mprahl <[email protected]> (cherry picked from commit 2694605)
1 parent 6585333 commit 06ac9bd

File tree

4 files changed

+15
-12
lines changed

4 files changed

+15
-12
lines changed

backend/src/v2/component/launcher_v2.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -821,7 +821,7 @@ func LocalPathForURI(uri string) (string, error) {
821821
return "/s3/" + strings.TrimPrefix(uri, "s3://"), nil
822822
}
823823
if strings.HasPrefix(uri, "oci://") {
824-
return "/oci/" + strings.ReplaceAll(strings.TrimPrefix(uri, "oci://"), "/", "\\/") + "/models", nil
824+
return "/oci/" + strings.ReplaceAll(strings.TrimPrefix(uri, "oci://"), "/", "_") + "/models", nil
825825
}
826826
return "", fmt.Errorf("failed to generate local path for URI %s: unsupported storage scheme", uri)
827827
}

backend/src/v2/driver/driver_test.go

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -439,15 +439,15 @@ func Test_initPodSpecPatch_modelcar_input_artifact(t *testing.T) {
439439
assert.Len(t, podSpec.Containers, 2)
440440
assert.Len(t, podSpec.Containers[0].VolumeMounts, 1)
441441
assert.Equal(t, podSpec.Containers[0].VolumeMounts[0].Name, "oci-0")
442-
assert.Equal(t, podSpec.Containers[0].VolumeMounts[0].MountPath, "/oci/registry.domain.local\\/my-model:latest")
443-
assert.Equal(t, podSpec.Containers[0].VolumeMounts[0].SubPath, "registry.domain.local\\/my-model:latest")
442+
assert.Equal(t, podSpec.Containers[0].VolumeMounts[0].MountPath, "/oci/registry.domain.local_my-model:latest")
443+
assert.Equal(t, podSpec.Containers[0].VolumeMounts[0].SubPath, "registry.domain.local_my-model:latest")
444444

445445
assert.Equal(t, podSpec.Containers[1].Name, "oci-0")
446446
assert.Equal(t, podSpec.Containers[1].Image, "registry.domain.local/my-model:latest")
447447
assert.Len(t, podSpec.Containers[1].VolumeMounts, 1)
448448
assert.Equal(t, podSpec.Containers[1].VolumeMounts[0].Name, "oci-0")
449-
assert.Equal(t, podSpec.Containers[1].VolumeMounts[0].MountPath, "/oci/registry.domain.local\\/my-model:latest")
450-
assert.Equal(t, podSpec.Containers[1].VolumeMounts[0].SubPath, "registry.domain.local\\/my-model:latest")
449+
assert.Equal(t, podSpec.Containers[1].VolumeMounts[0].MountPath, "/oci/registry.domain.local_my-model:latest")
450+
assert.Equal(t, podSpec.Containers[1].VolumeMounts[0].SubPath, "registry.domain.local_my-model:latest")
451451
}
452452

453453
func Test_makeVolumeMountPatch(t *testing.T) {
@@ -925,7 +925,8 @@ func Test_extendPodSpecPatch_ConfigMap(t *testing.T) {
925925
VolumeSource: k8score.VolumeSource{
926926
ConfigMap: &k8score.ConfigMapVolumeSource{
927927
LocalObjectReference: k8score.LocalObjectReference{Name: "cm1"},
928-
Optional: &[]bool{false}[0]},
928+
Optional: &[]bool{false}[0],
929+
},
929930
},
930931
},
931932
},
@@ -967,7 +968,8 @@ func Test_extendPodSpecPatch_ConfigMap(t *testing.T) {
967968
VolumeSource: k8score.VolumeSource{
968969
ConfigMap: &k8score.ConfigMapVolumeSource{
969970
LocalObjectReference: k8score.LocalObjectReference{Name: "cm1"},
970-
Optional: &[]bool{false}[0]},
971+
Optional: &[]bool{false}[0],
972+
},
971973
},
972974
},
973975
},
@@ -1009,7 +1011,8 @@ func Test_extendPodSpecPatch_ConfigMap(t *testing.T) {
10091011
VolumeSource: k8score.VolumeSource{
10101012
ConfigMap: &k8score.ConfigMapVolumeSource{
10111013
LocalObjectReference: k8score.LocalObjectReference{Name: "cm1"},
1012-
Optional: &[]bool{true}[0]},
1014+
Optional: &[]bool{true}[0],
1015+
},
10131016
},
10141017
},
10151018
},

sdk/python/kfp/dsl/types/artifact_types.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ def _get_path(self) -> Optional[str]:
9898
return _S3_LOCAL_MOUNT_PREFIX + self.uri[len(S3_REMOTE_PREFIX):]
9999

100100
elif self.uri.startswith(OCI_REMOTE_PREFIX):
101-
escaped_uri = self.uri[len(OCI_REMOTE_PREFIX):].replace('/', '\\/')
101+
escaped_uri = self.uri[len(OCI_REMOTE_PREFIX):].replace('/', '_')
102102
return _OCI_LOCAL_MOUNT_PREFIX + escaped_uri
103103
# uri == path for local execution
104104
return self.uri
@@ -115,7 +115,7 @@ def convert_local_path_to_remote_path(path: str) -> str:
115115
elif path.startswith(_S3_LOCAL_MOUNT_PREFIX):
116116
return S3_REMOTE_PREFIX + path[len(_S3_LOCAL_MOUNT_PREFIX):]
117117
elif path.startswith(_OCI_LOCAL_MOUNT_PREFIX):
118-
remote_path = path[len(_OCI_LOCAL_MOUNT_PREFIX):].replace('\\/', '/')
118+
remote_path = path[len(_OCI_LOCAL_MOUNT_PREFIX):].replace('_', '/')
119119
if remote_path.endswith("/models"):
120120
remote_path = remote_path[:-len("/models")]
121121

sdk/python/kfp/dsl/types/artifact_types_test.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,9 +138,9 @@ class TestConvertLocalPathToRemotePath(parameterized.TestCase):
138138
('/gcs/foo/bar', 'gs://foo/bar'),
139139
('/minio/foo/bar', 'minio://foo/bar'),
140140
('/s3/foo/bar', 's3://foo/bar'),
141-
('/oci/quay.io\\/org\\/repo:latest/models',
141+
('/oci/quay.io_org_repo:latest/models',
142142
'oci://quay.io/org/repo:latest'),
143-
('/oci/quay.io\\/org\\/repo:latest', 'oci://quay.io/org/repo:latest'),
143+
('/oci/quay.io_org_repo:latest', 'oci://quay.io/org/repo:latest'),
144144
('/tmp/kfp_outputs', '/tmp/kfp_outputs'),
145145
('/some/random/path', '/some/random/path'),
146146
]])

0 commit comments

Comments
 (0)