test_cycle_manager.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. # Copyright 2023 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
  12. from taipy.config.common.frequency import Frequency
  13. from taipy.config.common.scope import Scope
  14. from taipy.config.config import Config
  15. from taipy.core._orchestrator._orchestrator_factory import _OrchestratorFactory
  16. from taipy.core.config.job_config import JobConfig
  17. from taipy.core.cycle._cycle_manager import _CycleManager
  18. from taipy.core.cycle.cycle import Cycle
  19. from taipy.core.cycle.cycle_id import CycleId
  20. from taipy.core.data._data_manager import _DataManager
  21. from taipy.core.job._job_manager import _JobManager
  22. from taipy.core.scenario._scenario_manager import _ScenarioManager
  23. from taipy.core.sequence._sequence_manager import _SequenceManager
  24. from taipy.core.task._task_manager import _TaskManager
  25. def test_save_and_get_cycle_entity(tmpdir, cycle, current_datetime):
  26. _CycleManager._repository.base_path = tmpdir
  27. assert len(_CycleManager._get_all()) == 0
  28. _CycleManager._set(cycle)
  29. assert _CycleManager._exists(cycle.id)
  30. cycle_1 = _CycleManager._get(cycle.id)
  31. assert cycle_1.id == cycle.id
  32. assert cycle_1.name == cycle.name
  33. assert cycle_1.properties == cycle.properties
  34. assert cycle_1.creation_date == cycle.creation_date
  35. assert cycle_1.start_date == cycle.start_date
  36. assert cycle_1.end_date == cycle.end_date
  37. assert cycle_1.frequency == cycle.frequency
  38. assert len(_CycleManager._get_all()) == 1
  39. assert _CycleManager._get(cycle.id) == cycle
  40. assert _CycleManager._get(cycle.id).name == cycle.name
  41. assert isinstance(_CycleManager._get(cycle.id).creation_date, datetime)
  42. assert _CycleManager._get(cycle.id).creation_date == cycle.creation_date
  43. assert _CycleManager._get(cycle.id).frequency == Frequency.DAILY
  44. cycle_2_id = CycleId("cycle_2")
  45. assert _CycleManager._get(cycle_2_id) is None
  46. assert not _CycleManager._exists(cycle_2_id)
  47. cycle_3 = Cycle(
  48. Frequency.MONTHLY,
  49. {},
  50. creation_date=current_datetime,
  51. start_date=current_datetime,
  52. end_date=current_datetime,
  53. name="bar",
  54. id=cycle_1.id,
  55. )
  56. _CycleManager._set(cycle_3)
  57. cycle_3 = _CycleManager._get(cycle_1.id)
  58. assert _CycleManager._exists(cycle_1.id)
  59. assert len(_CycleManager._get_all()) == 1
  60. assert cycle_3.id == cycle_1.id
  61. assert cycle_3.name == cycle_3.name
  62. assert cycle_3.properties == cycle_3.properties
  63. assert cycle_3.creation_date == current_datetime
  64. assert cycle_3.start_date == current_datetime
  65. assert cycle_3.end_date == current_datetime
  66. assert cycle_3.frequency == cycle_3.frequency
  67. def test_create_and_delete_cycle_entity(tmpdir):
  68. _CycleManager._repository.base_path = tmpdir
  69. assert len(_CycleManager._get_all()) == 0
  70. cycle_1 = _CycleManager._create(Frequency.DAILY, name="foo", key="value")
  71. assert cycle_1.id is not None
  72. assert cycle_1.name == "foo"
  73. assert cycle_1.properties == {"key": "value"}
  74. assert cycle_1.creation_date is not None
  75. assert cycle_1.start_date is not None
  76. assert cycle_1.end_date is not None
  77. assert cycle_1.start_date < cycle_1.creation_date < cycle_1.end_date
  78. assert cycle_1.key == "value"
  79. assert cycle_1.frequency == Frequency.DAILY
  80. cycle_1_id = cycle_1.id
  81. assert _CycleManager._exists(cycle_1.id)
  82. assert len(_CycleManager._get_all()) == 1
  83. assert _CycleManager._get(cycle_1_id) == cycle_1
  84. assert _CycleManager._get(cycle_1_id).name == "foo"
  85. assert isinstance(_CycleManager._get(cycle_1_id).creation_date, datetime)
  86. assert _CycleManager._get(cycle_1_id).frequency == Frequency.DAILY
  87. cycle_2_id = CycleId("cycle_2")
  88. assert _CycleManager._get(cycle_2_id) is None
  89. assert not _CycleManager._exists(cycle_2_id)
  90. cycle_3 = _CycleManager._create(Frequency.MONTHLY, "bar")
  91. assert cycle_3.id is not None
  92. assert cycle_3.name == "bar"
  93. assert isinstance(cycle_3.creation_date, datetime)
  94. assert cycle_3.frequency == Frequency.MONTHLY
  95. cycle_3_id = cycle_3.id
  96. assert _CycleManager._exists(cycle_3_id)
  97. assert len(_CycleManager._get_all()) == 2
  98. assert _CycleManager._get(cycle_3_id).name == "bar"
  99. cycle_4 = _CycleManager._create(Frequency.YEARLY, "baz")
  100. cycle_4_id = cycle_4.id
  101. assert _CycleManager._exists(cycle_4_id)
  102. assert len(_CycleManager._get_all()) == 3
  103. _CycleManager._delete(cycle_4_id)
  104. assert len(_CycleManager._get_all()) == 2
  105. assert not _CycleManager._exists(cycle_4_id)
  106. assert _CycleManager._get(cycle_4_id) is None
  107. _CycleManager._delete_all()
  108. assert len(_CycleManager._get_all()) == 0
  109. assert not any(_CycleManager._exists(cycle_id) for cycle_id in [cycle_1_id, cycle_3_id, cycle_4_id])
  110. def test_get_cycle_start_date_and_end_date():
  111. creation_date_1 = datetime.fromisoformat("2021-11-11T11:11:01.000001")
  112. daily_start_date_1 = _CycleManager._get_start_date_of_cycle(Frequency.DAILY, creation_date=creation_date_1)
  113. weekly_start_date_1 = _CycleManager._get_start_date_of_cycle(Frequency.WEEKLY, creation_date=creation_date_1)
  114. monthly_start_date_1 = _CycleManager._get_start_date_of_cycle(Frequency.MONTHLY, creation_date=creation_date_1)
  115. yearly_start_date_1 = _CycleManager._get_start_date_of_cycle(Frequency.YEARLY, creation_date=creation_date_1)
  116. assert daily_start_date_1 == datetime.fromisoformat("2021-11-11T00:00:00.000000")
  117. assert weekly_start_date_1 == datetime.fromisoformat("2021-11-08T00:00:00.000000")
  118. assert monthly_start_date_1 == datetime.fromisoformat("2021-11-01T00:00:00.000000")
  119. assert yearly_start_date_1 == datetime.fromisoformat("2021-01-01T00:00:00.000000")
  120. daily_end_date_1 = _CycleManager._get_end_date_of_cycle(Frequency.DAILY, start_date=daily_start_date_1)
  121. weekly_end_date_1 = _CycleManager._get_end_date_of_cycle(Frequency.WEEKLY, start_date=weekly_start_date_1)
  122. monthly_end_date_1 = _CycleManager._get_end_date_of_cycle(Frequency.MONTHLY, start_date=monthly_start_date_1)
  123. yearly_end_date_1 = _CycleManager._get_end_date_of_cycle(Frequency.YEARLY, start_date=yearly_start_date_1)
  124. assert daily_end_date_1 == datetime.fromisoformat("2021-11-11T23:59:59.999999")
  125. assert weekly_end_date_1 == datetime.fromisoformat("2021-11-14T23:59:59.999999")
  126. assert monthly_end_date_1 == datetime.fromisoformat("2021-11-30T23:59:59.999999")
  127. assert yearly_end_date_1 == datetime.fromisoformat("2021-12-31T23:59:59.999999")
  128. creation_date_2 = datetime.now()
  129. daily_start_date_2 = _CycleManager._get_start_date_of_cycle(Frequency.DAILY, creation_date=creation_date_2)
  130. daily_end_date_2 = _CycleManager._get_end_date_of_cycle(Frequency.DAILY, daily_start_date_2)
  131. assert daily_start_date_2.date() == creation_date_2.date()
  132. assert daily_end_date_2.date() == creation_date_2.date()
  133. assert daily_start_date_2 < creation_date_2 < daily_end_date_2
  134. weekly_start_date_2 = _CycleManager._get_start_date_of_cycle(Frequency.WEEKLY, creation_date=creation_date_2)
  135. weekly_end_date_2 = _CycleManager._get_end_date_of_cycle(Frequency.WEEKLY, weekly_start_date_2)
  136. assert weekly_start_date_2 < creation_date_2 < weekly_end_date_2
  137. monthly_start_date_2 = _CycleManager._get_start_date_of_cycle(Frequency.MONTHLY, creation_date=creation_date_2)
  138. monthly_end_date_2 = _CycleManager._get_end_date_of_cycle(Frequency.MONTHLY, monthly_start_date_2)
  139. assert monthly_start_date_2.month == creation_date_2.month and monthly_start_date_2.day == 1
  140. assert monthly_end_date_2.month == creation_date_2.month
  141. assert monthly_start_date_2 < creation_date_2 < monthly_end_date_2
  142. yearly_start_date_2 = _CycleManager._get_start_date_of_cycle(Frequency.YEARLY, creation_date=creation_date_2)
  143. yearly_end_date_2 = _CycleManager._get_end_date_of_cycle(Frequency.YEARLY, yearly_start_date_2)
  144. assert yearly_start_date_2.year == creation_date_2.year
  145. assert yearly_start_date_2 == datetime(creation_date_2.year, 1, 1)
  146. assert yearly_end_date_2.year == creation_date_2.year
  147. assert yearly_end_date_2.date() == datetime(creation_date_2.year, 12, 31).date()
  148. assert yearly_start_date_2 < creation_date_2 < yearly_end_date_2
  149. def test_hard_delete_shared_entities():
  150. Config.configure_job_executions(mode=JobConfig._DEVELOPMENT_MODE)
  151. dn_config_1 = Config.configure_data_node("my_input_1", "pickle", scope=Scope.SCENARIO, default_data="testing")
  152. dn_config_2 = Config.configure_data_node("my_input_2", "pickle", scope=Scope.SCENARIO, default_data="testing")
  153. dn_config_3 = Config.configure_data_node("my_input_3", "pickle", scope=Scope.CYCLE, default_data="testing")
  154. dn_config_4 = Config.configure_data_node("my_input_4", "pickle", scope=Scope.GLOBAL, default_data="testing")
  155. task_config_1 = Config.configure_task("task_config_1", print, dn_config_1, dn_config_2)
  156. task_config_2 = Config.configure_task("task_config_2", print, dn_config_2, dn_config_3)
  157. task_config_3 = Config.configure_task("task_config_3", print, dn_config_3, dn_config_4) # scope = global
  158. creation_date = datetime.now()
  159. # Daily frequency so cycle attached to scenarios
  160. scenario_config_1 = Config.configure_scenario(
  161. "scenario_1",
  162. [task_config_1, task_config_2, task_config_3],
  163. creation_date=creation_date,
  164. frequency=Frequency.DAILY,
  165. )
  166. scenario_config_1.add_sequences(
  167. {
  168. "sequence_1": [task_config_1, task_config_2],
  169. "sequence_2": [task_config_1, task_config_2],
  170. "sequence_3": [task_config_3],
  171. }
  172. )
  173. # No Frequency so no cycle attached to scenarios
  174. scenario_config_2 = Config.configure_scenario("scenario_config_2", [task_config_2, task_config_3])
  175. scenario_config_2.add_sequences({"sequence_3": [task_config_3]})
  176. _OrchestratorFactory._build_dispatcher()
  177. scenario_1 = _ScenarioManager._create(scenario_config_1)
  178. scenario_2 = _ScenarioManager._create(scenario_config_1)
  179. scenario_3 = _ScenarioManager._create(scenario_config_2)
  180. scenario_1.submit()
  181. scenario_2.submit()
  182. scenario_3.submit()
  183. assert len(_ScenarioManager._get_all()) == 3
  184. assert len(_SequenceManager._get_all()) == 7
  185. assert len(_TaskManager._get_all()) == 7
  186. assert len(_DataManager._get_all()) == 8
  187. assert len(_JobManager._get_all()) == 8
  188. assert len(_CycleManager._get_all()) == 1
  189. _CycleManager._hard_delete(scenario_1.cycle.id)
  190. assert len(_CycleManager._get_all()) == 0
  191. assert len(_ScenarioManager._get_all()) == 1
  192. assert len(_SequenceManager._get_all()) == 1
  193. assert len(_TaskManager._get_all()) == 2
  194. assert len(_JobManager._get_all()) == 2
  195. assert len(_DataManager._get_all()) == 3
  196. def test_get_primary(tmpdir, cycle, current_datetime):
  197. _CycleManager._repository.base_path = tmpdir
  198. assert len(_CycleManager._get_all()) == 0
  199. _CycleManager._set(cycle)
  200. cycle_1 = _CycleManager._get(cycle.id)
  201. cycle_2 = Cycle(Frequency.MONTHLY, {}, current_datetime, current_datetime, current_datetime, name="foo")
  202. _CycleManager._set(cycle_2)
  203. cycle_2 = _CycleManager._get(cycle_2.id)
  204. cycles = _CycleManager._get_all()
  205. assert len(_CycleManager._get_all()) == 2
  206. assert (
  207. len(_CycleManager._get_cycles_by_frequency_and_start_date(cycle_1.frequency, cycle_1.start_date, cycles)) == 1
  208. )
  209. assert (
  210. len(_CycleManager._get_cycles_by_frequency_and_start_date(cycle_2.frequency, cycle_2.start_date, cycles)) == 1
  211. )
  212. assert (
  213. len(
  214. _CycleManager._get_cycles_by_frequency_and_start_date(
  215. Frequency.WEEKLY, datetime(2000, 1, 1, 1, 0, 0, 0), cycles
  216. )
  217. )
  218. == 0
  219. )
  220. assert (
  221. len(
  222. _CycleManager._get_cycles_by_frequency_and_overlapping_date(
  223. cycle_1.frequency, cycle_1.creation_date, cycles
  224. )
  225. )
  226. == 1
  227. )
  228. assert (
  229. _CycleManager._get_cycles_by_frequency_and_overlapping_date(cycle_1.frequency, cycle_1.creation_date, cycles)[0]
  230. == cycle_1
  231. )
  232. assert (
  233. len(
  234. _CycleManager._get_cycles_by_frequency_and_overlapping_date(
  235. Frequency.WEEKLY, datetime(2000, 1, 1, 1, 0, 0, 0), cycles
  236. )
  237. )
  238. == 0
  239. )