test_scenario_duplicator.py 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640
  1. # Copyright 2021-2025 Avaiga Private Limited
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
  4. # the License. You may obtain a copy of the License at
  5. #
  6. # http://www.apache.org/licenses/LICENSE-2.0
  7. #
  8. # Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
  9. # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
  10. # specific language governing permissions and limitations under the License.
  11. from datetime import datetime, timedelta
  12. from taipy import Config, Frequency, Scope, Sequence
  13. from taipy.core.cycle._cycle_manager import _CycleManager
  14. from taipy.core.data._data_manager import _DataManager
  15. from taipy.core.job._job_manager import _JobManager
  16. from taipy.core.scenario._scenario_duplicator import _ScenarioDuplicator
  17. from taipy.core.scenario._scenario_manager import _ScenarioManager
  18. from taipy.core.sequence._sequence_manager import _SequenceManager
  19. from taipy.core.submission._submission_manager import _SubmissionManager
  20. from taipy.core.task._task_manager import _TaskManager
  21. def identity(x):
  22. return x
  23. def test_constructor():
  24. dn_config_1 = Config.configure_pickle_data_node("dn_1")
  25. additional_dn_config_1 = Config.configure_data_node("additional_dn_1")
  26. task_config_1 = Config.configure_task("task_1", print, [dn_config_1], [])
  27. scenario_config_1 = Config.configure_scenario("scenario_1", [task_config_1], [additional_dn_config_1])
  28. scenario = _ScenarioManager._create(scenario_config_1)
  29. duplicator = _ScenarioDuplicator(scenario)
  30. assert duplicator.scenario == scenario
  31. assert duplicator.data_to_duplicate == {"dn_1", "additional_dn_1"}
  32. duplicator = _ScenarioDuplicator(scenario, True)
  33. assert duplicator.scenario == scenario
  34. assert duplicator.data_to_duplicate == {"dn_1", "additional_dn_1"}
  35. duplicator = _ScenarioDuplicator(scenario, False)
  36. assert duplicator.scenario == scenario
  37. assert duplicator.data_to_duplicate == set()
  38. duplicator = _ScenarioDuplicator(scenario, {"dn_1"})
  39. assert duplicator.scenario == scenario
  40. assert duplicator.data_to_duplicate == {"dn_1"}
  41. duplicator = _ScenarioDuplicator(scenario, {"additional_dn_1"})
  42. assert duplicator.scenario == scenario
  43. assert duplicator.data_to_duplicate == {"additional_dn_1"}
  44. def test_duplicate_scenario_scoped_dns_no_cycle_one_sequence():
  45. dn_config_1 = Config.configure_pickle_data_node("dn_1", default_data="data1", key1="value1")
  46. dn_config_2 = Config.configure_pickle_data_node("dn_2", key1="value2")
  47. additional_dn_config_1 = Config.configure_data_node("additional_dn_1")
  48. task_config_1 = Config.configure_task("task_1",
  49. print,
  50. input=[dn_config_1],
  51. output=[dn_config_2],
  52. skippable=True,
  53. k="v")
  54. scenario_config_1 = Config.configure_scenario("scenario_1", [task_config_1], [additional_dn_config_1])
  55. creation_date = datetime.now() - timedelta(minutes=1)
  56. name = "original"
  57. scenario = _ScenarioManager._create(scenario_config_1, creation_date, name)
  58. scenario.properties["key"] = "value"
  59. scenario.add_sequence("sequence_1", [scenario.task_1], {"key_seq": "value_seq"})
  60. scenario.submit()
  61. assert len(_ScenarioManager._get_all()) == 1
  62. assert len(_DataManager._get_all()) == 3
  63. assert len(_TaskManager._get_all()) == 1
  64. assert len(_SequenceManager._get_all()) == 1
  65. assert len(_CycleManager._get_all()) == 0
  66. assert len(_SubmissionManager._get_all()) == 1
  67. assert len(_JobManager._get_all()) == 1
  68. new_scenario = _ScenarioDuplicator(scenario, False).duplicate()
  69. # Check scenario attributes
  70. assert scenario.id != new_scenario.id
  71. assert scenario.config_id == new_scenario.config_id == "scenario_1"
  72. assert scenario.name == name
  73. assert new_scenario.name == name
  74. assert scenario.creation_date == creation_date
  75. assert new_scenario.creation_date > creation_date
  76. assert scenario.cycle is None
  77. assert new_scenario.cycle is None
  78. # Check task attributes
  79. assert len(scenario.tasks) == len(new_scenario.tasks) == 1
  80. task = scenario.tasks["task_1"]
  81. new_task = new_scenario.tasks["task_1"]
  82. assert task.id != new_task.id
  83. assert task._config_id == new_task._config_id == "task_1"
  84. assert task._owner_id == scenario.id
  85. assert new_task._owner_id == new_scenario.id
  86. assert task._parent_ids == {scenario.id, Sequence._new_id("sequence_1", scenario.id)}
  87. assert new_task._parent_ids == {new_scenario.id, Sequence._new_id("sequence_1", new_scenario.id)}
  88. assert task._function == new_task._function
  89. assert task._skippable == new_task._skippable is True
  90. assert task._properties == new_task._properties == {"k": "v"}
  91. # Check data node attributes
  92. assert len(scenario.data_nodes) == len(new_scenario.data_nodes) == 3
  93. def assert_dn(config_id, ppties, additional_dn=False):
  94. dn = scenario.data_nodes[config_id]
  95. new_dn = new_scenario.data_nodes[config_id]
  96. assert dn.id != new_dn.id
  97. assert dn._config_id == new_dn._config_id == config_id
  98. assert dn._owner_id == scenario.id
  99. assert new_dn._owner_id == new_scenario.id
  100. if additional_dn:
  101. assert dn._parent_ids == {scenario.id}
  102. assert new_dn._parent_ids == {new_scenario.id}
  103. else:
  104. assert dn._parent_ids == {task.id}
  105. assert new_dn._parent_ids == {new_task.id}
  106. assert dn._scope == new_dn._scope == Scope.SCENARIO
  107. assert len(dn._properties) == len(new_dn._properties)
  108. for k, v in dn._properties.items():
  109. assert new_dn._properties[k] == v
  110. for k, v in ppties.items():
  111. assert dn._properties[k] == new_dn._properties[k] == v
  112. # assert dn_1._last_edit_date < new_dn_1._last_edit_date>
  113. # assert dn_1.edits
  114. # assert new_dn_1.edits
  115. assert_dn("dn_1", {"key1": "value1"})
  116. assert_dn("dn_2", {"key1": "value2"})
  117. assert_dn("additional_dn_1", {}, additional_dn=True)
  118. # Check sequence attributes
  119. assert len(scenario.sequences) == len(new_scenario.sequences) == 1
  120. sequence = scenario.sequences["sequence_1"]
  121. new_sequence = new_scenario.sequences["sequence_1"]
  122. assert sequence.id != new_sequence.id
  123. assert len(sequence._tasks) == len(new_sequence._tasks) == 1
  124. assert sequence.tasks["task_1"].id == task.id
  125. assert new_sequence.tasks["task_1"].id == new_task.id
  126. assert sequence._owner_id == scenario.id
  127. assert new_sequence._owner_id == new_scenario.id
  128. assert sequence._parent_ids == {scenario.id}
  129. assert new_sequence._parent_ids == {new_scenario.id}
  130. assert len(sequence._properties) == len(new_sequence._properties)
  131. for k, v in sequence._properties.items():
  132. assert new_sequence._properties[k] == v
  133. assert sequence._properties["key_seq"] == new_sequence._properties["key_seq"] == "value_seq"
  134. # Check cycles, submissions and jobs are not duplicated
  135. assert len(_ScenarioManager._get_all()) == 2
  136. assert len(_DataManager._get_all()) == 6
  137. assert len(_TaskManager._get_all()) == 2
  138. assert len(_SequenceManager._get_all()) == 2
  139. assert len(_CycleManager._get_all()) == 0
  140. assert len(_SubmissionManager._get_all()) == 1
  141. assert len(_JobManager._get_all()) == 1
  142. def test_duplicate_same_cycle():
  143. dn_cfg_1 = Config.configure_pickle_data_node("dn_1", scope=Scope.GLOBAL)
  144. dn_cfg_2 = Config.configure_pickle_data_node("dn_2", scope=Scope.CYCLE)
  145. dn_cfg_3 = Config.configure_pickle_data_node("dn_3", scope=Scope.SCENARIO)
  146. dn_cfg_4 = Config.configure_pickle_data_node("dn_4", scope=Scope.SCENARIO)
  147. t_cfg_1 = Config.configure_task("task_1", identity, input=[dn_cfg_1], output=[dn_cfg_2])
  148. t_cfg_2 = Config.configure_task("task_2", identity, input=[dn_cfg_2], output=[dn_cfg_3])
  149. t_cfg_3 = Config.configure_task("task_3", identity, input=[dn_cfg_3], output=[dn_cfg_4])
  150. s_cfg_1 = Config.configure_scenario("scenario_1", [t_cfg_1, t_cfg_2, t_cfg_3], frequency=Frequency.DAILY)
  151. creation_date = datetime.now() - timedelta(days=2)
  152. name = "original"
  153. scenario = _ScenarioManager._create(s_cfg_1, creation_date, name)
  154. assert len(_ScenarioManager._get_all()) == 1
  155. assert len(_TaskManager._get_all()) == 3
  156. assert len(_DataManager._get_all()) == 4
  157. new_name = "new"
  158. new_scenario = _ScenarioDuplicator(scenario, False).duplicate(creation_date, new_name)
  159. assert len(_ScenarioManager._get_all()) == 2
  160. assert len(_TaskManager._get_all()) == 5
  161. assert len(_DataManager._get_all()) == 6
  162. # Check scenario attributes
  163. assert scenario.id != new_scenario.id
  164. assert scenario.config_id == new_scenario.config_id == "scenario_1"
  165. assert scenario.name == name
  166. assert new_scenario.name == new_name
  167. assert scenario.creation_date == new_scenario.creation_date == creation_date
  168. assert scenario.cycle.id == new_scenario.cycle.id
  169. assert len(scenario.sequences) == len(new_scenario.sequences) == 0
  170. # Check tasks attributes
  171. assert len(scenario.tasks) == len(new_scenario.tasks) == 3
  172. task_1 = scenario.tasks["task_1"]
  173. new_task_1 = new_scenario.tasks["task_1"]
  174. assert task_1 == new_task_1
  175. assert task_1.id == new_task_1.id
  176. assert task_1._config_id == new_task_1._config_id == "task_1"
  177. assert task_1._owner_id == new_task_1._owner_id == scenario.cycle.id
  178. assert task_1._parent_ids == new_task_1._parent_ids == {scenario.id, new_scenario.id}
  179. assert task_1._function == new_task_1._function
  180. assert task_1._skippable == new_task_1._skippable is False
  181. assert task_1._properties == new_task_1._properties == {}
  182. task_2 = scenario.tasks["task_2"]
  183. new_task_2 = new_scenario.tasks["task_2"]
  184. assert task_2.id != new_task_2.id
  185. assert task_2._config_id == new_task_2._config_id == "task_2"
  186. assert task_2._owner_id == scenario.id
  187. assert new_task_2._owner_id == new_scenario.id
  188. assert task_2._parent_ids == {scenario.id}
  189. assert new_task_2._parent_ids == {new_scenario.id}
  190. assert task_2._function == new_task_2._function
  191. assert task_2._skippable == new_task_2._skippable is False
  192. assert task_2._properties == new_task_2._properties == {}
  193. task_3 = scenario.tasks["task_3"]
  194. new_task_3 = new_scenario.tasks["task_3"]
  195. assert task_3.id != new_task_3.id
  196. assert task_3._config_id == new_task_3._config_id == "task_3"
  197. assert task_3._owner_id == scenario.id
  198. assert new_task_3._owner_id == new_scenario.id
  199. assert task_3._parent_ids == {scenario.id}
  200. assert new_task_3._parent_ids == {new_scenario.id}
  201. assert task_3._function == new_task_3._function
  202. assert task_3._skippable == new_task_3._skippable is False
  203. assert task_3._properties == new_task_3._properties == {}
  204. # Check data node attributes
  205. assert len(scenario.data_nodes) == len(new_scenario.data_nodes) == 4
  206. dn_1 = scenario.data_nodes["dn_1"]
  207. new_dn_1 = new_scenario.data_nodes["dn_1"]
  208. assert dn_1.id == new_dn_1.id
  209. assert dn_1._config_id == new_dn_1._config_id == "dn_1"
  210. assert dn_1._scope == new_dn_1._scope == Scope.GLOBAL
  211. assert dn_1._owner_id == new_dn_1._owner_id is None
  212. assert dn_1._parent_ids == new_dn_1._parent_ids == {task_1.id, new_task_1.id}
  213. assert dn_1._last_edit_date == new_dn_1._last_edit_date
  214. assert dn_1._edits == new_dn_1._edits
  215. assert len(dn_1._properties) == len(new_dn_1._properties)
  216. for k, v in dn_1._properties.items():
  217. assert new_dn_1._properties[k] == v
  218. dn_2 = scenario.dn_2
  219. new_dn_2 = new_scenario.dn_2
  220. assert dn_2.id == new_dn_2.id
  221. assert dn_2._config_id == new_dn_2._config_id == "dn_2"
  222. assert dn_2._scope == new_dn_2._scope == Scope.CYCLE
  223. assert dn_2._owner_id == new_dn_2._owner_id == scenario.cycle.id
  224. assert dn_2._parent_ids == {task_1.id, task_2.id, new_task_2.id}
  225. assert new_dn_2._parent_ids == {task_1.id, task_2.id, new_task_2.id}
  226. assert dn_2._last_edit_date == new_dn_2._last_edit_date
  227. assert dn_2._edits == new_dn_2._edits
  228. assert len(dn_2._properties) == len(new_dn_2._properties)
  229. for k, v in dn_2._properties.items():
  230. assert new_dn_2._properties[k] == v
  231. dn_3 = scenario.data_nodes["dn_3"]
  232. new_dn_3 = new_scenario.data_nodes["dn_3"]
  233. assert dn_3.id != new_dn_3.id
  234. assert dn_3._config_id == new_dn_3._config_id == "dn_3"
  235. assert dn_3._scope == new_dn_3._scope == Scope.SCENARIO
  236. assert dn_3._owner_id == scenario.id
  237. assert new_dn_3._owner_id == new_scenario.id
  238. assert dn_3._parent_ids == {task_2.id, task_3.id}
  239. assert new_dn_3._parent_ids == {new_task_2.id, new_task_3.id}
  240. assert dn_3._last_edit_date == new_dn_3._last_edit_date
  241. assert dn_3._edits == new_dn_3._edits
  242. assert len(dn_3._properties) == len(new_dn_3._properties)
  243. for k, v in dn_3._properties.items():
  244. assert new_dn_3._properties[k] == v
  245. dn_4 = scenario.data_nodes["dn_4"]
  246. new_dn_4 = new_scenario.data_nodes["dn_4"]
  247. assert dn_4.id != new_dn_4.id
  248. assert dn_4._config_id == new_dn_4._config_id == "dn_4"
  249. assert dn_4._scope == new_dn_4._scope == Scope.SCENARIO
  250. assert dn_4._owner_id == scenario.id
  251. assert new_dn_4._owner_id == new_scenario.id
  252. assert dn_4._parent_ids == {task_3.id}
  253. assert new_dn_4._parent_ids == {new_task_3.id}
  254. assert dn_4._last_edit_date == new_dn_4._last_edit_date
  255. assert dn_4._edits == new_dn_4._edits
  256. assert len(dn_4._properties) == len(new_dn_4._properties)
  257. for k, v in dn_4._properties.items():
  258. assert new_dn_4._properties[k] == v
  259. def test_duplicate_to_new_cycle():
  260. dn_cfg_1 = Config.configure_pickle_data_node("dn_1", scope=Scope.GLOBAL)
  261. dn_cfg_2 = Config.configure_pickle_data_node("dn_2", scope=Scope.CYCLE)
  262. dn_cfg_3 = Config.configure_pickle_data_node("dn_3", scope=Scope.SCENARIO)
  263. dn_cfg_4 = Config.configure_pickle_data_node("dn_4", scope=Scope.SCENARIO)
  264. t_cfg_1 = Config.configure_task("task_1", identity, input=[dn_cfg_1], output=[dn_cfg_2])
  265. t_cfg_2 = Config.configure_task("task_2", identity, input=[dn_cfg_2], output=[dn_cfg_3])
  266. t_cfg_3 = Config.configure_task("task_3", identity, input=[dn_cfg_3], output=[dn_cfg_4])
  267. s_cfg_1 = Config.configure_scenario("scenario_1", [t_cfg_1, t_cfg_2, t_cfg_3], frequency=Frequency.DAILY)
  268. creation_date = datetime.now() - timedelta(days=2)
  269. name = "original"
  270. scenario = _ScenarioManager._create(s_cfg_1, creation_date, name)
  271. assert len(_CycleManager._get_all()) == 1
  272. assert len(_ScenarioManager._get_all()) == 1
  273. assert len(_TaskManager._get_all()) == 3
  274. assert len(_DataManager._get_all()) == 4
  275. new_creation_date = datetime.now()
  276. new_name = "new"
  277. new_scenario = _ScenarioDuplicator(scenario, False).duplicate(new_creation_date, new_name)
  278. assert len(_CycleManager._get_all()) == 2
  279. assert len(_ScenarioManager._get_all()) == 2
  280. assert len(_TaskManager._get_all()) == 6
  281. assert len(_DataManager._get_all()) == 7
  282. # Check scenario attributes
  283. assert scenario.id != new_scenario.id
  284. assert scenario.config_id == new_scenario.config_id == "scenario_1"
  285. assert scenario.name == name
  286. assert new_scenario.name == new_name
  287. assert scenario.creation_date == creation_date
  288. assert new_scenario.creation_date == new_creation_date
  289. assert scenario.cycle.id != new_scenario.cycle.id
  290. # Check tasks attributes
  291. assert len(scenario.tasks) == len(new_scenario.tasks) == 3
  292. task_1 = scenario.tasks["task_1"]
  293. new_task_1 = new_scenario.tasks["task_1"]
  294. assert task_1 != new_task_1
  295. assert task_1.id != new_task_1.id
  296. assert task_1._config_id == new_task_1._config_id == "task_1"
  297. assert task_1._owner_id == scenario.cycle.id
  298. assert new_task_1._owner_id == new_scenario.cycle.id
  299. assert task_1._parent_ids == {scenario.id}
  300. assert new_task_1._parent_ids == {new_scenario.id}
  301. assert task_1._function == new_task_1._function
  302. assert task_1._skippable == new_task_1._skippable is False
  303. assert task_1._properties == new_task_1._properties == {}
  304. task_2 = scenario.tasks["task_2"]
  305. new_task_2 = new_scenario.tasks["task_2"]
  306. assert task_2.id != new_task_2.id
  307. assert task_2._config_id == new_task_2._config_id == "task_2"
  308. assert task_2._owner_id == scenario.id
  309. assert new_task_2._owner_id == new_scenario.id
  310. assert task_2._parent_ids == {scenario.id}
  311. assert new_task_2._parent_ids == {new_scenario.id}
  312. assert task_2._function == new_task_2._function
  313. assert task_2._skippable == new_task_2._skippable is False
  314. assert task_2._properties == new_task_2._properties == {}
  315. task_3 = scenario.tasks["task_3"]
  316. new_task_3 = new_scenario.tasks["task_3"]
  317. assert task_3.id != new_task_3.id
  318. assert task_3._config_id == new_task_3._config_id == "task_3"
  319. assert task_3._owner_id == scenario.id
  320. assert new_task_3._owner_id == new_scenario.id
  321. assert task_3._parent_ids == {scenario.id}
  322. assert new_task_3._parent_ids == {new_scenario.id}
  323. assert task_3._function == new_task_3._function
  324. assert task_3._skippable == new_task_3._skippable is False
  325. assert task_3._properties == new_task_3._properties == {}
  326. # Check data node attributes
  327. assert len(scenario.data_nodes) == len(new_scenario.data_nodes) == 4
  328. dn_1 = scenario.data_nodes["dn_1"]
  329. new_dn_1 = new_scenario.data_nodes["dn_1"]
  330. assert dn_1.id == new_dn_1.id
  331. assert dn_1._config_id == new_dn_1._config_id == "dn_1"
  332. assert dn_1._scope == new_dn_1._scope == Scope.GLOBAL
  333. assert dn_1._owner_id == new_dn_1._owner_id is None
  334. assert dn_1._parent_ids == new_dn_1._parent_ids == {task_1.id, new_task_1.id}
  335. assert dn_1._last_edit_date == new_dn_1._last_edit_date
  336. assert dn_1._edits == new_dn_1._edits
  337. assert len(dn_1._properties) == len(new_dn_1._properties)
  338. for k, v in dn_1._properties.items():
  339. assert new_dn_1._properties[k] == v
  340. dn_2 = scenario.dn_2
  341. new_dn_2 = new_scenario.dn_2
  342. assert dn_2.id != new_dn_2.id
  343. assert dn_2._config_id == new_dn_2._config_id == "dn_2"
  344. assert dn_2._scope == new_dn_2._scope == Scope.CYCLE
  345. assert dn_2._owner_id == scenario.cycle.id
  346. assert new_dn_2._owner_id == new_scenario.cycle.id
  347. assert dn_2._parent_ids == {task_1.id, task_2.id}
  348. assert new_dn_2._parent_ids == {new_task_1.id, new_task_2.id}
  349. assert dn_2._last_edit_date == new_dn_2._last_edit_date
  350. assert dn_2._edits == new_dn_2._edits
  351. assert len(dn_2._properties) == len(new_dn_2._properties)
  352. for k, v in dn_2._properties.items():
  353. assert new_dn_2._properties[k] == v
  354. dn_3 = scenario.data_nodes["dn_3"]
  355. new_dn_3 = new_scenario.data_nodes["dn_3"]
  356. assert dn_3.id != new_dn_3.id
  357. assert dn_3._config_id == new_dn_3._config_id == "dn_3"
  358. assert dn_3._scope == new_dn_3._scope == Scope.SCENARIO
  359. assert dn_3._owner_id == scenario.id
  360. assert new_dn_3._owner_id == new_scenario.id
  361. assert dn_3._parent_ids == {task_2.id, task_3.id}
  362. assert new_dn_3._parent_ids == {new_task_2.id, new_task_3.id}
  363. assert dn_3._last_edit_date == new_dn_3._last_edit_date
  364. assert dn_3._edits == new_dn_3._edits
  365. assert len(dn_3._properties) == len(new_dn_3._properties)
  366. for k, v in dn_3._properties.items():
  367. assert new_dn_3._properties[k] == v
  368. dn_4 = scenario.data_nodes["dn_4"]
  369. new_dn_4 = new_scenario.data_nodes["dn_4"]
  370. assert dn_4.id != new_dn_4.id
  371. assert dn_4._config_id == new_dn_4._config_id == "dn_4"
  372. assert dn_4._scope == new_dn_4._scope == Scope.SCENARIO
  373. assert dn_4._owner_id == scenario.id
  374. assert new_dn_4._owner_id == new_scenario.id
  375. assert dn_4._parent_ids == {task_3.id}
  376. assert new_dn_4._parent_ids == {new_task_3.id}
  377. assert dn_4._last_edit_date == new_dn_4._last_edit_date
  378. assert dn_4._edits == new_dn_4._edits
  379. assert len(dn_4._properties) == len(new_dn_4._properties)
  380. for k, v in dn_4._properties.items():
  381. assert new_dn_4._properties[k] == v
  382. def test_duplicate_to_new_cycle_with_existing_scenario():
  383. dn_cfg_1 = Config.configure_pickle_data_node("dn_1", scope=Scope.GLOBAL)
  384. dn_cfg_2 = Config.configure_pickle_data_node("dn_2", scope=Scope.CYCLE)
  385. dn_cfg_3 = Config.configure_pickle_data_node("dn_3", scope=Scope.SCENARIO)
  386. dn_cfg_4 = Config.configure_pickle_data_node("dn_4", scope=Scope.SCENARIO)
  387. t_cfg_1 = Config.configure_task("task_1", identity, input=[dn_cfg_1], output=[dn_cfg_2])
  388. t_cfg_2 = Config.configure_task("task_2", identity, input=[dn_cfg_2], output=[dn_cfg_3])
  389. t_cfg_3 = Config.configure_task("task_3", identity, input=[dn_cfg_3], output=[dn_cfg_4])
  390. s_cfg_1 = Config.configure_scenario("scenario_1", [t_cfg_1, t_cfg_2, t_cfg_3], frequency=Frequency.DAILY)
  391. creation_date = datetime.now() - timedelta(days=2)
  392. new_creation_date = datetime.now()
  393. name = "original"
  394. existing_name = "existing"
  395. new_name = "new"
  396. scenario = _ScenarioManager._create(s_cfg_1, creation_date, name)
  397. existing_scenario = _ScenarioManager._create(s_cfg_1, new_creation_date, existing_name)
  398. assert len(_CycleManager._get_all()) == 2
  399. assert len(_ScenarioManager._get_all()) == 2
  400. assert len(_TaskManager._get_all()) == 6
  401. assert len(_DataManager._get_all()) == 7
  402. new_scenario = _ScenarioDuplicator(scenario, False).duplicate(new_creation_date, new_name)
  403. assert len(_CycleManager._get_all()) == 2
  404. assert len(_ScenarioManager._get_all()) == 3
  405. assert len(_TaskManager._get_all()) == 8
  406. assert len(_DataManager._get_all()) == 9
  407. # Check scenario attributes
  408. assert scenario.id != new_scenario.id != existing_scenario.id
  409. assert scenario.config_id == new_scenario.config_id == "scenario_1"
  410. assert scenario.name == name
  411. assert new_scenario.name == new_name
  412. assert scenario.creation_date == creation_date
  413. assert new_scenario.creation_date == new_creation_date
  414. assert scenario.cycle.id != new_scenario.cycle.id == existing_scenario.cycle.id
  415. # Check tasks attributes
  416. assert len(scenario.tasks) == len(new_scenario.tasks) == 3
  417. task_1 = scenario.tasks["task_1"]
  418. existing_task_1 = existing_scenario.tasks["task_1"]
  419. new_task_1 = new_scenario.tasks["task_1"]
  420. assert existing_task_1 == new_task_1
  421. assert existing_task_1.id == new_task_1.id
  422. assert task_1._config_id == existing_task_1._config_id == new_task_1._config_id == "task_1"
  423. assert task_1._owner_id == scenario.cycle.id
  424. assert existing_task_1._owner_id == new_task_1._owner_id == existing_scenario.cycle.id
  425. assert task_1._parent_ids == {scenario.id}
  426. assert existing_task_1._parent_ids == new_task_1._parent_ids == {existing_scenario.id, new_scenario.id}
  427. assert task_1._function == existing_task_1._function == new_task_1._function
  428. assert task_1._skippable == existing_task_1._skippable == new_task_1._skippable is False
  429. assert task_1._properties == existing_task_1._properties == new_task_1._properties == {}
  430. task_2 = scenario.tasks["task_2"]
  431. existing_task_2 = existing_scenario.tasks["task_2"]
  432. new_task_2 = new_scenario.tasks["task_2"]
  433. assert task_2.id != new_task_2.id
  434. assert task_2._config_id == new_task_2._config_id == "task_2"
  435. assert task_2._owner_id == scenario.id
  436. assert new_task_2._owner_id == new_scenario.id
  437. assert task_2._parent_ids == {scenario.id}
  438. assert new_task_2._parent_ids == {new_scenario.id}
  439. assert task_2._function == new_task_2._function
  440. assert task_2._skippable == new_task_2._skippable is False
  441. assert task_2._properties == new_task_2._properties == {}
  442. task_3 = scenario.tasks["task_3"]
  443. new_task_3 = new_scenario.tasks["task_3"]
  444. assert task_3.id != new_task_3.id
  445. assert task_3._config_id == new_task_3._config_id == "task_3"
  446. assert task_3._owner_id == scenario.id
  447. assert new_task_3._owner_id == new_scenario.id
  448. assert task_3._parent_ids == {scenario.id}
  449. assert new_task_3._parent_ids == {new_scenario.id}
  450. assert task_3._function == new_task_3._function
  451. assert task_3._skippable == new_task_3._skippable is False
  452. assert task_3._properties == new_task_3._properties == {}
  453. # Check data node attributes
  454. assert len(scenario.data_nodes) == len(new_scenario.data_nodes) == 4
  455. dn_1 = scenario.data_nodes["dn_1"]
  456. new_dn_1 = new_scenario.data_nodes["dn_1"]
  457. assert dn_1.id == new_dn_1.id
  458. assert dn_1._config_id == new_dn_1._config_id == "dn_1"
  459. assert dn_1._scope == new_dn_1._scope == Scope.GLOBAL
  460. assert dn_1._owner_id == new_dn_1._owner_id is None
  461. assert dn_1._parent_ids == new_dn_1._parent_ids == {task_1.id, new_task_1.id}
  462. assert dn_1._last_edit_date == new_dn_1._last_edit_date
  463. assert dn_1._edits == new_dn_1._edits
  464. assert len(dn_1._properties) == len(new_dn_1._properties)
  465. for k, v in dn_1._properties.items():
  466. assert new_dn_1._properties[k] == v
  467. dn_2 = scenario.dn_2
  468. existing_dn_2 = existing_scenario.dn_2
  469. new_dn_2 = new_scenario.dn_2
  470. assert dn_2.id != new_dn_2.id == existing_dn_2.id
  471. assert dn_2._config_id == existing_dn_2._config_id == new_dn_2._config_id == "dn_2"
  472. assert dn_2._scope == existing_dn_2._scope == new_dn_2._scope == Scope.CYCLE
  473. assert dn_2._owner_id == scenario.cycle.id
  474. assert existing_dn_2._owner_id == new_dn_2._owner_id == new_scenario.cycle.id
  475. assert dn_2._parent_ids == {task_1.id, task_2.id}
  476. assert existing_dn_2._parent_ids == new_dn_2._parent_ids == {new_task_1.id, new_task_2.id, existing_task_2.id}
  477. assert dn_2._last_edit_date == new_dn_2._last_edit_date
  478. assert dn_2._edits == new_dn_2._edits
  479. assert len(dn_2._properties) == len(new_dn_2._properties)
  480. for k, v in dn_2._properties.items():
  481. if k == "path":
  482. assert new_dn_2._properties[k] == existing_dn_2._properties[k] != v
  483. else:
  484. assert new_dn_2._properties[k] == existing_dn_2._properties[k] == v
  485. dn_3 = scenario.data_nodes["dn_3"]
  486. existing_dn_3 = existing_scenario.data_nodes["dn_3"]
  487. new_dn_3 = new_scenario.data_nodes["dn_3"]
  488. assert dn_3.id != new_dn_3.id != existing_dn_3.id
  489. assert dn_3._config_id == new_dn_3._config_id == existing_dn_3._config_id == "dn_3"
  490. assert dn_3._scope == new_dn_3._scope == existing_dn_3._scope == Scope.SCENARIO
  491. assert dn_3._owner_id == scenario.id
  492. assert existing_dn_3._owner_id != new_dn_3._owner_id == new_scenario.id
  493. assert dn_3._parent_ids == {task_2.id, task_3.id}
  494. assert new_dn_3._parent_ids == {new_task_2.id, new_task_3.id}
  495. assert dn_3._last_edit_date == new_dn_3._last_edit_date
  496. assert dn_3._edits == new_dn_3._edits
  497. assert len(dn_3._properties) == len(new_dn_3._properties)
  498. for k, v in dn_3._properties.items():
  499. assert new_dn_3._properties[k] == v
  500. dn_4 = scenario.data_nodes["dn_4"]
  501. new_dn_4 = new_scenario.data_nodes["dn_4"]
  502. assert dn_4.id != new_dn_4.id
  503. assert dn_4._config_id == new_dn_4._config_id == "dn_4"
  504. assert dn_4._scope == new_dn_4._scope == Scope.SCENARIO
  505. assert dn_4._owner_id == scenario.id
  506. assert new_dn_4._owner_id == new_scenario.id
  507. assert dn_4._parent_ids == {task_3.id}
  508. assert new_dn_4._parent_ids == {new_task_3.id}
  509. assert dn_4._last_edit_date == new_dn_4._last_edit_date
  510. assert dn_4._edits == new_dn_4._edits
  511. assert len(dn_4._properties) == len(new_dn_4._properties)
  512. for k, v in dn_4._properties.items():
  513. assert new_dn_4._properties[k] == v
  514. def test_duplicate_with_all_global_dn():
  515. dn_config_1 = Config.configure_pickle_data_node("dn_1", scope=Scope.GLOBAL)
  516. dn_config_2 = Config.configure_pickle_data_node("dn_2", scope=Scope.GLOBAL)
  517. task_config_1 = Config.configure_task("task_1", print, [dn_config_1], [dn_config_2])
  518. scenario_config_1 = Config.configure_scenario("scenario_1", [task_config_1], frequency=Frequency.DAILY)
  519. scenario = _ScenarioManager._create(scenario_config_1, datetime.now() - timedelta(days=10), "original")
  520. assert len(_ScenarioManager._get_all()) == 1
  521. assert len(_DataManager._get_all()) == 2
  522. assert len(_TaskManager._get_all()) == 1
  523. new_scenario = _ScenarioDuplicator(scenario, False).duplicate(datetime.now(), "new")
  524. assert len(_ScenarioManager._get_all()) == 2
  525. assert len(_DataManager._get_all()) == 2
  526. assert len(_TaskManager._get_all()) == 1
  527. # Check scenario attributes
  528. assert scenario.id != new_scenario.id
  529. assert scenario.config_id == new_scenario.config_id == "scenario_1"
  530. assert scenario.name == "original"
  531. assert new_scenario.name == "new"
  532. assert scenario.creation_date != new_scenario.creation_date
  533. assert scenario.cycle.id != new_scenario.cycle.id
  534. # Check tasks attributes
  535. assert len(scenario.tasks) == len(new_scenario.tasks) == 1
  536. task_1 = scenario.tasks["task_1"]
  537. new_task_1 = new_scenario.tasks["task_1"]
  538. assert task_1 == new_task_1
  539. assert task_1.id == new_task_1.id
  540. assert task_1._config_id == new_task_1._config_id == "task_1"
  541. assert task_1._owner_id == new_task_1._owner_id is None
  542. assert task_1._parent_ids == new_task_1._parent_ids == {scenario.id, new_scenario.id}
  543. assert task_1._function == new_task_1._function
  544. assert task_1._skippable == new_task_1._skippable is False
  545. assert task_1._properties == new_task_1._properties == {}
  546. # Check data node attributes
  547. assert len(scenario.data_nodes) == len(new_scenario.data_nodes) == 2
  548. dn_1 = scenario.data_nodes["dn_1"]
  549. new_dn_1 = new_scenario.data_nodes["dn_1"]
  550. assert dn_1.id == new_dn_1.id
  551. assert dn_1._config_id == new_dn_1._config_id == "dn_1"
  552. assert dn_1._scope == new_dn_1._scope == Scope.GLOBAL
  553. assert dn_1._owner_id == new_dn_1._owner_id is None
  554. assert dn_1._parent_ids == new_dn_1._parent_ids == {task_1.id, new_task_1.id}
  555. assert dn_1._last_edit_date == new_dn_1._last_edit_date
  556. assert dn_1._edits == new_dn_1._edits
  557. assert len(dn_1._properties) == len(new_dn_1._properties)
  558. for k, v in dn_1._properties.items():
  559. assert new_dn_1._properties[k] == v
  560. # Check data node attributes
  561. dn_2 = scenario.dn_2
  562. new_dn_2 = new_scenario.dn_2
  563. assert dn_2.id == new_dn_2.id
  564. assert dn_2._config_id == new_dn_2._config_id == "dn_2"
  565. assert dn_2._scope == new_dn_2._scope == Scope.GLOBAL
  566. assert dn_2._owner_id == new_dn_2._owner_id is None
  567. assert dn_2._parent_ids == {task_1.id}
  568. assert dn_2._last_edit_date == new_dn_2._last_edit_date
  569. assert dn_2._edits == new_dn_2._edits
  570. assert len(dn_2._properties) == len(new_dn_2._properties)
  571. for k, v in dn_2._properties.items():
  572. assert new_dn_2._properties[k] == v