fix(sdk): DSL - Enabled arbitrary ContainerOp names (#4554)
Fixes https://github.com/kubeflow/pipelines/issues/4522
This commit is contained in:
parent
4ec84e6527
commit
1aa8068507
|
|
@ -716,11 +716,6 @@ class BaseOp(object):
|
||||||
init_containers: List[UserContainer] = None,
|
init_containers: List[UserContainer] = None,
|
||||||
sidecars: List[Sidecar] = None,
|
sidecars: List[Sidecar] = None,
|
||||||
is_exit_handler: bool = False):
|
is_exit_handler: bool = False):
|
||||||
valid_name_regex = r'^[A-Za-z][A-Za-z0-9\s_-]*$'
|
|
||||||
if not re.match(valid_name_regex, name):
|
|
||||||
raise ValueError(
|
|
||||||
'Only letters, numbers, spaces, "_", and "-" are allowed in name. Must begin with letter: %s'
|
|
||||||
% (name))
|
|
||||||
|
|
||||||
if is_exit_handler:
|
if is_exit_handler:
|
||||||
warnings.warn('is_exit_handler=True is no longer needed.', DeprecationWarning)
|
warnings.warn('is_exit_handler=True is no longer needed.', DeprecationWarning)
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ from typing import Union
|
||||||
from . import _container_op
|
from . import _container_op
|
||||||
from . import _resource_op
|
from . import _resource_op
|
||||||
from . import _ops_group
|
from . import _ops_group
|
||||||
from ._component_bridge import _create_container_op_from_component_and_arguments
|
from ._component_bridge import _create_container_op_from_component_and_arguments, _sanitize_python_function_name
|
||||||
from ..components import _components
|
from ..components import _components
|
||||||
from ..components._naming import _make_name_unique_by_adding_index
|
from ..components._naming import _make_name_unique_by_adding_index
|
||||||
import sys
|
import sys
|
||||||
|
|
@ -254,8 +254,13 @@ class Pipeline():
|
||||||
Returns
|
Returns
|
||||||
op_name: a unique op name.
|
op_name: a unique op name.
|
||||||
"""
|
"""
|
||||||
|
# Sanitizing the op name.
|
||||||
|
# Technically this could be delayed to the compilation stage, but string serialization of PipelineParams make unsanitized names problematic.
|
||||||
|
op_name = _sanitize_python_function_name(op.human_name).replace('_', '-')
|
||||||
#If there is an existing op with this name then generate a new name.
|
#If there is an existing op with this name then generate a new name.
|
||||||
op_name = _make_name_unique_by_adding_index(op.human_name, list(self.ops.keys()), ' ')
|
op_name = _make_name_unique_by_adding_index(op_name, list(self.ops.keys()), ' ')
|
||||||
|
if op_name == '':
|
||||||
|
op_name = _make_name_unique_by_adding_index('task', list(self.ops.keys()), ' ')
|
||||||
|
|
||||||
self.ops[op_name] = op
|
self.ops[op_name] = op
|
||||||
if not define_only:
|
if not define_only:
|
||||||
|
|
|
||||||
|
|
@ -1003,3 +1003,17 @@ implementation:
|
||||||
self.assertNotIn(' ', argument['name'], 'The input name "{}" of template "{}" was not sanitized.'.format(argument['name'], template['name']))
|
self.assertNotIn(' ', argument['name'], 'The input name "{}" of template "{}" was not sanitized.'.format(argument['name'], template['name']))
|
||||||
for argument in template['inputs']['artifacts']:
|
for argument in template['inputs']['artifacts']:
|
||||||
self.assertNotIn(' ', argument['name'], 'The input name "{}" of template "{}" was not sanitized.'.format(argument['name'], template['name']))
|
self.assertNotIn(' ', argument['name'], 'The input name "{}" of template "{}" was not sanitized.'.format(argument['name'], template['name']))
|
||||||
|
|
||||||
|
def test_container_op_with_arbitrary_name(self):
|
||||||
|
def some_pipeline():
|
||||||
|
dsl.ContainerOp(
|
||||||
|
name=r''' !"#$%&'()*+,-./:;<=>?@[\]^_`''',
|
||||||
|
image='alpine:latest',
|
||||||
|
)
|
||||||
|
dsl.ContainerOp(
|
||||||
|
name=r''' !"#$%&'()*+,-./:;<=>?@[\]^_`''',
|
||||||
|
image='alpine:latest',
|
||||||
|
)
|
||||||
|
workflow_dict = compiler.Compiler()._compile(some_pipeline)
|
||||||
|
for template in workflow_dict['spec']['templates']:
|
||||||
|
self.assertNotEqual(template['name'], '')
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue