From f2a9bd45abf0b08e1a906faf29e4a85579d1ba0b Mon Sep 17 00:00:00 2001 From: Renat Akhmerov Date: Fri, 27 Apr 2018 17:01:31 +0700 Subject: [PATCH] Do not copy workflow environment into subworkflows * We previously always copied a workflow environment of a parent workflow into a subworkflow when starting it. However, this is redundant because we now have 'root_execution_id' field in the the workflow execution model so that we can always get an environment of a subworkflow just by accessing the root execution. It saves a lot of space in DB and increases performance in cases when we have a large workflow environment and many subworkflows. Related-Bug: #1757966 Change-Id: I15077240ba53663a6267b886ab7b081a7dde2710 --- mistral/engine/actions.py | 4 ---- mistral/tests/unit/engine/test_environment.py | 6 ++---- mistral/tests/unit/engine/test_subworkflows.py | 8 +------- mistral/workflow/data_flow.py | 11 ++++++++++- 4 files changed, 13 insertions(+), 16 deletions(-) diff --git a/mistral/engine/actions.py b/mistral/engine/actions.py index 2c8c7c81e..014b59b87 100644 --- a/mistral/engine/actions.py +++ b/mistral/engine/actions.py @@ -565,10 +565,6 @@ class WorkflowAction(Action): 'namespace': parent_wf_ex.params['namespace'] } - if 'env' in parent_wf_ex.params: - wf_params['env'] = parent_wf_ex.params['env'] - wf_params['evaluate_env'] = parent_wf_ex.params.get('evaluate_env') - if 'notify' in parent_wf_ex.params: wf_params['notify'] = parent_wf_ex.params['notify'] diff --git a/mistral/tests/unit/engine/test_environment.py b/mistral/tests/unit/engine/test_environment.py index 0d9f3a13a..128dffbb3 100644 --- a/mistral/tests/unit/engine/test_environment.py +++ b/mistral/tests/unit/engine/test_environment.py @@ -14,7 +14,6 @@ import mock from oslo_config import cfg -import testtools from mistral.db.v2 import api as db_api from mistral.executors import default_executor as d_exe @@ -394,7 +393,6 @@ class EnvironmentTest(base.EngineTestCase): self.assertNotIn('__env', wf_ex.context) - @testtools.skip("Not implemented yet") def test_subworkflow_env_no_duplicate(self): wf_text = """--- version: '2.0' @@ -449,5 +447,5 @@ class EnvironmentTest(base.EngineTestCase): # The environment of the subworkflow must be empty. # To evaluate expressions it should be taken from the # parent workflow execution. - self.assertIsNone(sub_wf_ex.params['env']) - self.assertIsNone(sub_wf_ex.context['__env']) + self.assertDictEqual({}, sub_wf_ex.params['env']) + self.assertNotIn('__env', sub_wf_ex.context) diff --git a/mistral/tests/unit/engine/test_subworkflows.py b/mistral/tests/unit/engine/test_subworkflows.py index 9f6cfed2c..635e70b38 100644 --- a/mistral/tests/unit/engine/test_subworkflows.py +++ b/mistral/tests/unit/engine/test_subworkflows.py @@ -367,14 +367,8 @@ class SubworkflowsTest(base.EngineTestCase): wf1_ex = self._assert_single_item(wf_execs, name='wb1.wf1') wf2_ex = self._assert_single_item(wf_execs, name='wb1.wf2') - expected_start_params = { - 'task_name': 'task2', - 'task_execution_id': wf1_ex.task_execution_id, - 'env': env - } - self.assertIsNotNone(wf1_ex.task_execution_id) - self.assertDictContainsSubset(expected_start_params, wf1_ex.params) + self.assertDictContainsSubset({}, wf1_ex.params) # Wait till workflow 'wf1' is completed. self.await_workflow_success(wf1_ex.id) diff --git a/mistral/workflow/data_flow.py b/mistral/workflow/data_flow.py index fbcc05c90..f746fade7 100644 --- a/mistral/workflow/data_flow.py +++ b/mistral/workflow/data_flow.py @@ -17,6 +17,7 @@ from oslo_config import cfg from oslo_log import log as logging from mistral import context as auth_ctx +from mistral.db.v2 import api as db_api from mistral.db.v2.sqlalchemy import models from mistral import exceptions as exc from mistral import expressions as expr @@ -328,6 +329,14 @@ def evaluate_object_fields(obj, context): def get_workflow_environment_dict(wf_ex): - env_dict = wf_ex.params['env'] if wf_ex and 'env' in wf_ex.params else {} + if not wf_ex: + return {} + + if wf_ex.root_execution_id: + return get_workflow_environment_dict( + db_api.get_workflow_execution(wf_ex.root_execution_id) + ) + + env_dict = wf_ex.params['env'] if 'env' in wf_ex.params else {} return {'__env': env_dict}