test_cycle_manager.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  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 src.taipy.core._orchestrator._orchestrator_factory import _OrchestratorFactory
  13. from src.taipy.core.config.job_config import JobConfig
  14. from src.taipy.core.cycle._cycle_manager import _CycleManager
  15. from src.taipy.core.cycle.cycle import Cycle
  16. from src.taipy.core.cycle.cycle_id import CycleId
  17. from src.taipy.core.data._data_manager import _DataManager
  18. from src.taipy.core.job._job_manager import _JobManager
  19. from src.taipy.core.scenario._scenario_manager import _ScenarioManager
  20. from src.taipy.core.sequence._sequence_manager import _SequenceManager
  21. from src.taipy.core.task._task_manager import _TaskManager
  22. from taipy.config.common.frequency import Frequency
  23. from taipy.config.common.scope import Scope
  24. from taipy.config.config import Config
  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", "in_memory", scope=Scope.SCENARIO, default_data="testing")
  152. dn_config_2 = Config.configure_data_node("my_input_2", "in_memory", scope=Scope.SCENARIO, default_data="testing")
  153. dn_config_3 = Config.configure_data_node("my_input_3", "in_memory", scope=Scope.CYCLE, default_data="testing")
  154. dn_config_4 = Config.configure_data_node("my_input_4", "in_memory", 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. scenario_config_1 = Config.configure_scenario(
  160. "scenario_config_1",
  161. [task_config_1, task_config_2, task_config_3],
  162. creation_date=creation_date,
  163. frequency=Frequency.DAILY,
  164. )
  165. scenario_config_1.add_sequences(
  166. {
  167. "sequence_1": [task_config_1, task_config_2],
  168. "sequence_2": [task_config_1, task_config_2],
  169. "sequence_3": [task_config_3],
  170. }
  171. )
  172. scenario_config_2 = Config.configure_scenario(
  173. "scenario_config_2", [task_config_2, task_config_3]
  174. ) # No Frequency so cycle attached to scenarios
  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. )