Replace copy.copy with copy.deepcopy
The function copy.copy only copies reference and so if the object has dict or nested dicts, these instances can be modified by code that has reference to the original dict. Change-Id: Ib2680f09b5a5d45fd7180e95ab5fedef05664c5b Closes-Bug: #1503851
This commit is contained in:
parent
107cd6c5cb
commit
55540e116e
@ -466,7 +466,7 @@ class DefaultEngine(base.Engine, coordination.Service):
|
||||
'state': states.RUNNING,
|
||||
'input': wf_input or {},
|
||||
'output': {},
|
||||
'context': copy.copy(wf_input) or {},
|
||||
'context': copy.deepcopy(wf_input) or {},
|
||||
'task_execution_id': params.get('task_execution_id'),
|
||||
'runtime_context': {
|
||||
'with_items_index': params.get('with_items_index', 0)
|
||||
|
@ -405,7 +405,7 @@ def _schedule_run_action(task_ex, task_spec, action_input, index):
|
||||
task_spec.get_target(),
|
||||
utils.merge_dicts(
|
||||
copy.deepcopy(action_input),
|
||||
copy.copy(task_ex.in_context)
|
||||
copy.deepcopy(task_ex.in_context)
|
||||
)
|
||||
)
|
||||
|
||||
|
@ -26,7 +26,7 @@ LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def validate_input(definition, input, spec=None):
|
||||
input_param_names = copy.copy(list((input or {}).keys()))
|
||||
input_param_names = copy.deepcopy(list((input or {}).keys()))
|
||||
missing_param_names = []
|
||||
|
||||
spec_input = (spec.get_input() if spec else
|
||||
|
@ -193,7 +193,7 @@ def _evaluate_item(item, context):
|
||||
|
||||
|
||||
def evaluate_recursively(data, context):
|
||||
data = copy.copy(data)
|
||||
data = copy.deepcopy(data)
|
||||
|
||||
if not context:
|
||||
return data
|
||||
|
@ -142,7 +142,7 @@ class CallScheduler(periodic_task.PeriodicTasks):
|
||||
call.target_method_name
|
||||
)
|
||||
|
||||
method_args = copy.copy(call.method_arguments)
|
||||
method_args = copy.deepcopy(call.method_arguments)
|
||||
|
||||
if call.serializers:
|
||||
# Deserialize arguments.
|
||||
|
@ -95,18 +95,18 @@ ACTION_EX = {
|
||||
UPDATED_ACTION_EX_DB = copy.copy(ACTION_EX_DB).to_dict()
|
||||
UPDATED_ACTION_EX_DB['state'] = 'SUCCESS'
|
||||
UPDATED_ACTION_EX_DB['task_name'] = 'task1'
|
||||
UPDATED_ACTION = copy.copy(ACTION_EX)
|
||||
UPDATED_ACTION = copy.deepcopy(ACTION_EX)
|
||||
UPDATED_ACTION['state'] = 'SUCCESS'
|
||||
UPDATED_ACTION_OUTPUT = UPDATED_ACTION['output']
|
||||
|
||||
ERROR_ACTION_EX = copy.copy(ACTION_EX_DB).to_dict()
|
||||
ERROR_ACTION_EX['state'] = 'ERROR'
|
||||
ERROR_ACTION_EX['task_name'] = 'task1'
|
||||
ERROR_ACTION = copy.copy(ACTION_EX)
|
||||
ERROR_ACTION = copy.deepcopy(ACTION_EX)
|
||||
ERROR_ACTION['state'] = 'ERROR'
|
||||
ERROR_ACTION_RES = ERROR_ACTION['output']
|
||||
|
||||
BROKEN_ACTION = copy.copy(ACTION_EX)
|
||||
BROKEN_ACTION = copy.deepcopy(ACTION_EX)
|
||||
BROKEN_ACTION['output'] = 'string not escaped'
|
||||
|
||||
MOCK_ACTION = mock.MagicMock(return_value=ACTION_EX_DB)
|
||||
@ -257,7 +257,7 @@ class TestActionExecutionsController(base.FunctionalTest):
|
||||
|
||||
@mock.patch.object(rpc.EngineClient, 'on_action_complete')
|
||||
def test_put_without_result(self, f):
|
||||
action_ex = copy.copy(UPDATED_ACTION)
|
||||
action_ex = copy.deepcopy(UPDATED_ACTION)
|
||||
del action_ex['output']
|
||||
|
||||
f.return_value = UPDATED_ACTION_EX_DB
|
||||
|
@ -81,7 +81,7 @@ my_action:
|
||||
|
||||
UPDATED_ACTION_DB = copy.copy(ACTION_DB)
|
||||
UPDATED_ACTION_DB['definition'] = UPDATED_ACTION_DEFINITION
|
||||
UPDATED_ACTION = copy.copy(ACTION)
|
||||
UPDATED_ACTION = copy.deepcopy(ACTION)
|
||||
UPDATED_ACTION['definition'] = UPDATED_ACTION_DEFINITION
|
||||
|
||||
MOCK_ACTION = mock.MagicMock(return_value=ACTION_DB)
|
||||
|
@ -47,7 +47,7 @@ TRIGGER = {
|
||||
'remaining_executions': 42
|
||||
}
|
||||
|
||||
trigger_values = copy.copy(TRIGGER)
|
||||
trigger_values = copy.deepcopy(TRIGGER)
|
||||
trigger_values['workflow_input'] = json.loads(
|
||||
trigger_values['workflow_input'])
|
||||
|
||||
@ -61,7 +61,7 @@ TRIGGER_DB.update(trigger_values)
|
||||
UPDATED_TRIGGER_DB = copy.copy(TRIGGER_DB)
|
||||
UPDATED_TRIGGER_DB['pattern'] = '*/1 * * * *'
|
||||
|
||||
UPDATED_TRIGGER = copy.copy(TRIGGER)
|
||||
UPDATED_TRIGGER = copy.deepcopy(TRIGGER)
|
||||
UPDATED_TRIGGER['pattern'] = '*/1 * * * *'
|
||||
|
||||
MOCK_WF = mock.MagicMock(return_value=WF)
|
||||
|
@ -54,13 +54,13 @@ WF_EX_JSON = {
|
||||
'workflow_name': 'some',
|
||||
}
|
||||
|
||||
UPDATED_WF_EX = copy.copy(WF_EX)
|
||||
UPDATED_WF_EX = copy.deepcopy(WF_EX)
|
||||
UPDATED_WF_EX['state'] = states.PAUSED
|
||||
|
||||
UPDATED_WF_EX_JSON = copy.copy(WF_EX_JSON)
|
||||
UPDATED_WF_EX_JSON = copy.deepcopy(WF_EX_JSON)
|
||||
UPDATED_WF_EX_JSON['state'] = states.PAUSED
|
||||
|
||||
WF_EX_JSON_WITH_DESC = copy.copy(WF_EX_JSON)
|
||||
WF_EX_JSON_WITH_DESC = copy.deepcopy(WF_EX_JSON)
|
||||
WF_EX_JSON_WITH_DESC['description'] = "execution description."
|
||||
|
||||
MOCK_WF_EX = mock.MagicMock(return_value=WF_EX)
|
||||
@ -98,7 +98,7 @@ class TestExecutionsController(base.FunctionalTest):
|
||||
def test_put(self):
|
||||
resp = self.app.put_json('/v2/executions/123', UPDATED_WF_EX_JSON)
|
||||
|
||||
UPDATED_WF_EX_WITH_DESC = copy.copy(UPDATED_WF_EX_JSON)
|
||||
UPDATED_WF_EX_WITH_DESC = copy.deepcopy(UPDATED_WF_EX_JSON)
|
||||
UPDATED_WF_EX_WITH_DESC['description'] = 'execution description.'
|
||||
|
||||
self.assertEqual(200, resp.status_int)
|
||||
@ -110,12 +110,12 @@ class TestExecutionsController(base.FunctionalTest):
|
||||
MOCK_WF_EX
|
||||
)
|
||||
def test_put_stop(self):
|
||||
update_exec = copy.copy(WF_EX_JSON)
|
||||
update_exec = copy.deepcopy(WF_EX_JSON)
|
||||
update_exec['state'] = states.ERROR
|
||||
update_exec['state_info'] = "Force"
|
||||
|
||||
with mock.patch.object(rpc.EngineClient, 'stop_workflow') as mock_pw:
|
||||
wf_ex = copy.copy(WF_EX)
|
||||
wf_ex = copy.deepcopy(WF_EX)
|
||||
wf_ex['state'] = states.ERROR
|
||||
wf_ex['state_info'] = "Force"
|
||||
mock_pw.return_value = wf_ex
|
||||
@ -134,12 +134,12 @@ class TestExecutionsController(base.FunctionalTest):
|
||||
MOCK_WF_EX
|
||||
)
|
||||
def test_put_state_info_unset(self):
|
||||
update_exec = copy.copy(WF_EX_JSON)
|
||||
update_exec = copy.deepcopy(WF_EX_JSON)
|
||||
update_exec['state'] = states.ERROR
|
||||
update_exec.pop('state_info', None)
|
||||
|
||||
with mock.patch.object(rpc.EngineClient, 'stop_workflow') as mock_pw:
|
||||
wf_ex = copy.copy(WF_EX)
|
||||
wf_ex = copy.deepcopy(WF_EX)
|
||||
wf_ex['state'] = states.ERROR
|
||||
del wf_ex.state_info
|
||||
mock_pw.return_value = wf_ex
|
||||
|
@ -57,7 +57,7 @@ WORKBOOK = {
|
||||
|
||||
UPDATED_WORKBOOK_DB = copy.copy(WORKBOOK_DB)
|
||||
UPDATED_WORKBOOK_DB['definition'] = UPDATED_WORKBOOK_DEF
|
||||
UPDATED_WORKBOOK = copy.copy(WORKBOOK)
|
||||
UPDATED_WORKBOOK = copy.deepcopy(WORKBOOK)
|
||||
UPDATED_WORKBOOK['definition'] = UPDATED_WORKBOOK_DEF
|
||||
|
||||
WB_DEF_INVALID_MODEL_EXCEPTION = """
|
||||
|
@ -106,7 +106,7 @@ flow:
|
||||
|
||||
UPDATED_WF_DB = copy.copy(WF_DB)
|
||||
UPDATED_WF_DB['definition'] = UPDATED_WF_DEFINITION
|
||||
UPDATED_WF = copy.copy(WF)
|
||||
UPDATED_WF = copy.deepcopy(WF)
|
||||
UPDATED_WF['definition'] = UPDATED_WF_DEFINITION
|
||||
|
||||
WF_DEF_INVALID_MODEL_EXCEPTION = """
|
||||
|
@ -885,7 +885,7 @@ class TaskExecutionTest(SQLAlchemyTest):
|
||||
def test_create_and_get_and_load_task_execution(self):
|
||||
wf_ex = db_api.create_workflow_execution(WF_EXECS[0])
|
||||
|
||||
values = copy.copy(TASK_EXECS[0])
|
||||
values = copy.deepcopy(TASK_EXECS[0])
|
||||
values.update({'workflow_execution_id': wf_ex.id})
|
||||
|
||||
created = db_api.create_task_execution(values)
|
||||
@ -907,7 +907,7 @@ class TaskExecutionTest(SQLAlchemyTest):
|
||||
with db_api.transaction():
|
||||
wf_ex = db_api.create_workflow_execution(WF_EXECS[0])
|
||||
|
||||
values = copy.copy(TASK_EXECS[0])
|
||||
values = copy.deepcopy(TASK_EXECS[0])
|
||||
values.update({'workflow_execution_id': wf_ex.id})
|
||||
|
||||
task = db_api.create_task_execution(values)
|
||||
@ -945,7 +945,7 @@ class TaskExecutionTest(SQLAlchemyTest):
|
||||
def test_update_task_execution(self):
|
||||
wf_ex = db_api.create_workflow_execution(WF_EXECS[0])
|
||||
|
||||
values = copy.copy(TASK_EXECS[0])
|
||||
values = copy.deepcopy(TASK_EXECS[0])
|
||||
values.update({'workflow_execution_id': wf_ex.id})
|
||||
|
||||
created = db_api.create_task_execution(values)
|
||||
@ -971,7 +971,7 @@ class TaskExecutionTest(SQLAlchemyTest):
|
||||
|
||||
wf_ex = db_api.create_workflow_execution(WF_EXECS[0])
|
||||
|
||||
values = copy.copy(TASK_EXECS[0])
|
||||
values = copy.deepcopy(TASK_EXECS[0])
|
||||
values.update({'workflow_execution_id': wf_ex.id})
|
||||
|
||||
created = db_api.create_or_update_task_execution(id, values)
|
||||
@ -997,12 +997,12 @@ class TaskExecutionTest(SQLAlchemyTest):
|
||||
def test_get_task_executions(self):
|
||||
wf_ex = db_api.create_workflow_execution(WF_EXECS[0])
|
||||
|
||||
values = copy.copy(TASK_EXECS[0])
|
||||
values = copy.deepcopy(TASK_EXECS[0])
|
||||
values.update({'workflow_execution_id': wf_ex.id})
|
||||
|
||||
created0 = db_api.create_task_execution(values)
|
||||
|
||||
values = copy.copy(TASK_EXECS[1])
|
||||
values = copy.deepcopy(TASK_EXECS[1])
|
||||
values.update({'workflow_execution_id': wf_ex.id})
|
||||
|
||||
created1 = db_api.create_task_execution(values)
|
||||
@ -1018,7 +1018,7 @@ class TaskExecutionTest(SQLAlchemyTest):
|
||||
def test_delete_task_execution(self):
|
||||
wf_ex = db_api.create_workflow_execution(WF_EXECS[0])
|
||||
|
||||
values = copy.copy(TASK_EXECS[0])
|
||||
values = copy.deepcopy(TASK_EXECS[0])
|
||||
values.update({'workflow_execution_id': wf_ex.id})
|
||||
|
||||
created = db_api.create_task_execution(values)
|
||||
@ -1038,7 +1038,7 @@ class TaskExecutionTest(SQLAlchemyTest):
|
||||
def test_task_execution_repr(self):
|
||||
wf_ex = db_api.create_workflow_execution(WF_EXECS[0])
|
||||
|
||||
values = copy.copy(TASK_EXECS[0])
|
||||
values = copy.deepcopy(TASK_EXECS[0])
|
||||
values.update({'workflow_execution_id': wf_ex.id})
|
||||
|
||||
s = db_api.create_task_execution(values).__repr__()
|
||||
|
@ -247,7 +247,7 @@ class WithItemsEngineTest(base.EngineTestCase):
|
||||
def test_with_items_static_var(self):
|
||||
wb_service.create_workbook_v2(WORKBOOK_WITH_STATIC_VAR)
|
||||
|
||||
wf_input = copy.copy(WORKFLOW_INPUT)
|
||||
wf_input = copy.deepcopy(WORKFLOW_INPUT)
|
||||
wf_input.update({'greeting': 'Hello'})
|
||||
# Start workflow.
|
||||
wf_ex = self.engine.start_workflow('wb1.with_items', wf_input)
|
||||
|
@ -98,7 +98,7 @@ class WorkflowController(object):
|
||||
upstream_task_execs = self._get_upstream_task_executions(task_spec)
|
||||
|
||||
return u.merge_dicts(
|
||||
copy.copy(self.wf_ex.context),
|
||||
copy.deepcopy(self.wf_ex.context),
|
||||
data_flow.evaluate_upstream_context(upstream_task_execs)
|
||||
)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user