test_submission_manager.py 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  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
  12. from time import sleep
  13. import pytest
  14. from taipy.core._version._version_manager_factory import _VersionManagerFactory
  15. from taipy.core.exceptions.exceptions import SubmissionNotDeletedException
  16. from taipy.core.job._job_manager_factory import _JobManagerFactory
  17. from taipy.core.job.job import Job
  18. from taipy.core.submission._submission_manager_factory import _SubmissionManagerFactory
  19. from taipy.core.submission.submission import Submission
  20. from taipy.core.submission.submission_status import SubmissionStatus
  21. from taipy.core.task._task_manager_factory import _TaskManagerFactory
  22. from taipy.core.task.task import Task
  23. def test_create_submission(scenario):
  24. submission_1 = _SubmissionManagerFactory._build_manager()._create(
  25. scenario.id, scenario._ID_PREFIX, scenario.config_id, debug=True, log="log_file", retry_note=5
  26. )
  27. assert isinstance(submission_1, Submission)
  28. assert submission_1.id is not None
  29. assert submission_1.entity_id == scenario.id
  30. assert submission_1.jobs == []
  31. assert submission_1.properties == {"debug": True, "log": "log_file", "retry_note": 5}
  32. assert isinstance(submission_1.creation_date, datetime)
  33. assert submission_1._submission_status == SubmissionStatus.SUBMITTED
  34. def test_get_submission():
  35. submission_manager = _SubmissionManagerFactory._build_manager()
  36. assert submission_manager._get("random_submission_id") is None
  37. submission_1 = submission_manager._create(
  38. "entity_id", "ENTITY_TYPE", "entity_config_id", debug=True, log="log_file", retry_note=5
  39. )
  40. submission_2 = submission_manager._get(submission_1.id)
  41. assert submission_1.id == submission_2.id
  42. assert submission_1.entity_id == submission_2.entity_id == "entity_id"
  43. assert submission_1.jobs == submission_2.jobs
  44. assert submission_1.creation_date == submission_2.creation_date
  45. assert submission_1.submission_status == submission_2.submission_status
  46. assert submission_1.properties == {"debug": True, "log": "log_file", "retry_note": 5}
  47. assert submission_1.properties == submission_2.properties
  48. def test_get_all_submission():
  49. submission_manager = _SubmissionManagerFactory._build_manager()
  50. version_manager = _VersionManagerFactory._build_manager()
  51. submission_manager._repository._save(
  52. Submission(
  53. "entity_id",
  54. "entity_type",
  55. "entity_config_id",
  56. "submission_id",
  57. version=version_manager._get_latest_version(),
  58. )
  59. )
  60. for version_name in ["abc", "xyz"]:
  61. for i in range(10):
  62. submission_manager._repository._save(
  63. Submission(
  64. "entity_id",
  65. "entity_type",
  66. "entity_config_id",
  67. f"submission_{version_name}_{i}",
  68. version=f"{version_name}",
  69. )
  70. )
  71. assert len(submission_manager._get_all()) == 1
  72. version_manager._set_experiment_version("xyz")
  73. version_manager._set_experiment_version("abc")
  74. assert len(submission_manager._get_all()) == 10
  75. assert len(submission_manager._get_all("abc")) == 10
  76. assert len(submission_manager._get_all("xyz")) == 10
  77. def test_get_latest_submission():
  78. task_1 = Task("task_config_1", {}, print, id="task_id_1")
  79. task_2 = Task("task_config_2", {}, print, id="task_id_2")
  80. submission_manager = _SubmissionManagerFactory._build_manager()
  81. submission_1 = submission_manager._create(task_1.id, task_1._ID_PREFIX, task_1.config_id)
  82. assert submission_manager._get_latest(task_1) == submission_1
  83. assert submission_manager._get_latest(task_2) is None
  84. sleep(0.01) # Comparison is based on time, precision on Windows is not enough important
  85. submission_2 = submission_manager._create(task_2.id, task_2._ID_PREFIX, task_2.config_id)
  86. assert submission_manager._get_latest(task_1) == submission_1
  87. assert submission_manager._get_latest(task_2) == submission_2
  88. sleep(0.01) # Comparison is based on time, precision on Windows is not enough important
  89. submission_3 = submission_manager._create(task_1.id, task_1._ID_PREFIX, task_1.config_id)
  90. assert submission_manager._get_latest(task_1) == submission_3
  91. assert submission_manager._get_latest(task_2) == submission_2
  92. sleep(0.01) # Comparison is based on time, precision on Windows is not enough important
  93. submission_4 = submission_manager._create(task_2.id, task_2._ID_PREFIX, task_2.config_id)
  94. assert submission_manager._get_latest(task_1) == submission_3
  95. assert submission_manager._get_latest(task_2) == submission_4
  96. def test_delete_submission():
  97. submission_manager = _SubmissionManagerFactory._build_manager()
  98. submission = Submission("entity_id", "entity_type", "entity_config_id", "submission_id")
  99. submission_manager._repository._save(submission)
  100. with pytest.raises(SubmissionNotDeletedException):
  101. submission_manager._delete(submission.id)
  102. submission.submission_status = SubmissionStatus.COMPLETED
  103. for i in range(10):
  104. submission_manager._repository._save(
  105. Submission("entity_id", "entity_type", "entity_config_id", f"submission_{i}")
  106. )
  107. assert len(submission_manager._get_all()) == 11
  108. assert isinstance(submission_manager._get(submission.id), Submission)
  109. submission_manager._delete(submission.id)
  110. assert len(submission_manager._get_all()) == 10
  111. assert submission_manager._get(submission.id) is None
  112. submission_manager._delete_all()
  113. assert len(submission_manager._get_all()) == 0
  114. def test_is_deletable():
  115. submission_manager = _SubmissionManagerFactory._build_manager()
  116. submission = Submission("entity_id", "entity_type", "entity_config_id", "submission_id")
  117. submission_manager._repository._save(submission)
  118. assert len(submission_manager._get_all()) == 1
  119. rc = submission_manager._is_deletable("some_submission")
  120. assert not rc
  121. assert "Entity 'some_submission' does not exist in the repository." in rc.reasons
  122. assert submission._submission_status == SubmissionStatus.SUBMITTED
  123. assert not submission.is_deletable()
  124. assert not submission_manager._is_deletable(submission)
  125. assert not submission_manager._is_deletable(submission.id)
  126. submission.submission_status = SubmissionStatus.UNDEFINED
  127. assert submission.submission_status == SubmissionStatus.UNDEFINED
  128. assert submission.is_deletable()
  129. assert submission_manager._is_deletable(submission)
  130. assert submission_manager._is_deletable(submission.id)
  131. submission.submission_status = SubmissionStatus.CANCELED
  132. assert submission.submission_status == SubmissionStatus.CANCELED
  133. assert submission.is_deletable()
  134. assert submission_manager._is_deletable(submission)
  135. assert submission_manager._is_deletable(submission.id)
  136. submission.submission_status = SubmissionStatus.FAILED
  137. assert submission.submission_status == SubmissionStatus.FAILED
  138. assert submission.is_deletable()
  139. assert submission_manager._is_deletable(submission)
  140. assert submission_manager._is_deletable(submission.id)
  141. submission.submission_status = SubmissionStatus.BLOCKED
  142. assert submission.submission_status == SubmissionStatus.BLOCKED
  143. assert not submission.is_deletable()
  144. assert not submission_manager._is_deletable(submission)
  145. assert not submission_manager._is_deletable(submission.id)
  146. submission.submission_status = SubmissionStatus.RUNNING
  147. assert submission.submission_status == SubmissionStatus.RUNNING
  148. assert not submission.is_deletable()
  149. assert not submission_manager._is_deletable(submission)
  150. assert not submission_manager._is_deletable(submission.id)
  151. submission.submission_status = SubmissionStatus.PENDING
  152. assert submission.submission_status == SubmissionStatus.PENDING
  153. assert not submission.is_deletable()
  154. assert not submission_manager._is_deletable(submission)
  155. assert not submission_manager._is_deletable(submission.id)
  156. submission.submission_status = SubmissionStatus.COMPLETED
  157. assert submission.submission_status == SubmissionStatus.COMPLETED
  158. assert submission.is_deletable()
  159. assert submission_manager._is_deletable(submission)
  160. assert submission_manager._is_deletable(submission.id)
  161. def test_hard_delete():
  162. submission_manager = _SubmissionManagerFactory._build_manager()
  163. job_manager = _JobManagerFactory._build_manager()
  164. task_manager = _TaskManagerFactory._build_manager()
  165. task = Task("task_config_id", {}, print)
  166. submission = Submission(task.id, task._ID_PREFIX, task.config_id, "SUBMISSION_submission_id")
  167. _SubmissionManagerFactory._build_manager()._repository._save(submission)
  168. job_1 = Job("JOB_job_id_1", task, submission.id, submission.entity_id) # will be deleted with submission
  169. job_2 = Job("JOB_job_id_2", task, "SUBMISSION_submission_id_2", submission.entity_id) # will not be deleted
  170. submission.jobs = [job_1]
  171. task_manager._repository._save(task)
  172. submission_manager._repository._save(submission)
  173. job_manager._repository._save(job_1)
  174. job_manager._repository._save(job_2)
  175. assert len(job_manager._get_all()) == 2
  176. assert len(submission_manager._get_all()) == 1
  177. submission_manager._hard_delete(submission.id)
  178. assert len(job_manager._get_all()) == 1
  179. assert len(submission_manager._get_all()) == 0