From f51426b6a4c67cf9eb7d9403152814b48f3d37af Mon Sep 17 00:00:00 2001 From: moshewe Date: Thu, 22 Apr 2021 11:24:22 +0300 Subject: [PATCH 1/3] Merging spec dict from parent on compilation --- argo/workflows/dsl/_workflow.py | 43 ++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/argo/workflows/dsl/_workflow.py b/argo/workflows/dsl/_workflow.py index 8e3cd58..4ecdd52 100644 --- a/argo/workflows/dsl/_workflow.py +++ b/argo/workflows/dsl/_workflow.py @@ -40,6 +40,7 @@ from argo.workflows.client.models import V1alpha1WorkflowStatus from argo.workflows.client.models import V1ObjectMeta from argo.workflows.client.models import V1alpha1WorkflowCreateRequest +from mergedict import ConfigDict from ._base import Prop from ._base import Spec @@ -47,20 +48,18 @@ __all__ = ["Workflow"] - _LOGGER = logging.getLogger(__name__) class WorkflowMeta(ABCMeta): - __model__ = V1alpha1Workflow def __new__( - cls, - name: Union[str, Type["Workflow"]], - bases: Tuple[Type["Workflow"], ...], - props: Dict[str, Any], - **kwargs, + cls, + name: Union[str, Type["Workflow"]], + bases: Tuple[Type["Workflow"], ...], + props: Dict[str, Any], + **kwargs, ): workflow_name = dasherize(underscore(name)) @@ -90,12 +89,12 @@ def __new__( @classmethod def __compile( - cls, - klass: "Workflow", - name: str, - bases: Tuple[Type["Workflow"], ...], - props: Dict[str, Any], - **kwargs, + cls, + klass: "Workflow", + name: str, + bases: Tuple[Type["Workflow"], ...], + props: Dict[str, Any], + **kwargs, ): tasks: List[V1alpha1DAGTask] = [] templates: List[V1alpha1Template] = [] @@ -144,12 +143,16 @@ def __compile( spec_dict: dict = klass.spec spec_dict["entrypoint"] = spec_dict.get("entrypoint", "main") spec_dict["templates"] = templates + parent_spec_dict: dict = bases[0].spec if isinstance(bases[0].spec, dict) else bases[ + 0].spec.to_dict() + config_spec_dict = ConfigDict(parent_spec_dict) + config_spec_dict.merge(spec_dict) - klass.spec: V1alpha1WorkflowSpec = V1alpha1WorkflowSpec(**spec_dict) + klass.spec: V1alpha1WorkflowSpec = V1alpha1WorkflowSpec(**config_spec_dict) @classmethod def __compile_closure( - cls, template: V1alpha1Template, scopes: Dict[str, Any] = None + cls, template: V1alpha1Template, scopes: Dict[str, Any] = None ) -> V1alpha1Template: scopes = scopes or {} @@ -386,11 +389,11 @@ def _compile(obj: Any): return self.model def submit( - self, - client: ApiClient, - namespace: str, - *, - parameters: Optional[Dict[str, str]] = None, + self, + client: ApiClient, + namespace: str, + *, + parameters: Optional[Dict[str, str]] = None, ) -> V1alpha1Workflow: """Submit an Argo Workflow to a given namespace. From b11cef5d634c45adac5a4c49a02fcb0a588408fb Mon Sep 17 00:00:00 2001 From: moshewe Date: Thu, 22 Apr 2021 11:24:58 +0300 Subject: [PATCH 2/3] Update requirements.txt --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index e601f6f..c33e99f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,6 +3,7 @@ inflection pyyaml requests python-dateutil +mergedict # --- development --- # black From 7f92144a50fa59179e42b6130bf7914a7bcc501e Mon Sep 17 00:00:00 2001 From: moshewe Date: Thu, 22 Apr 2021 21:04:54 +0300 Subject: [PATCH 3/3] Update _workflow.py fixed bug in spec dict merging --- argo/workflows/dsl/_workflow.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/argo/workflows/dsl/_workflow.py b/argo/workflows/dsl/_workflow.py index 4ecdd52..d2b0dab 100644 --- a/argo/workflows/dsl/_workflow.py +++ b/argo/workflows/dsl/_workflow.py @@ -141,11 +141,13 @@ def __compile( templates.insert(0, main_template) spec_dict: dict = klass.spec - spec_dict["entrypoint"] = spec_dict.get("entrypoint", "main") - spec_dict["templates"] = templates parent_spec_dict: dict = bases[0].spec if isinstance(bases[0].spec, dict) else bases[ 0].spec.to_dict() config_spec_dict = ConfigDict(parent_spec_dict) + + spec_dict["entrypoint"] = spec_dict.get("entrypoint", + parent_spec_dict.get("entrypoint", 'main')) + spec_dict["templates"] = templates config_spec_dict.merge(spec_dict) klass.spec: V1alpha1WorkflowSpec = V1alpha1WorkflowSpec(**config_spec_dict)