test_override_config.py 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  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. import os
  12. from unittest import mock
  13. import pytest
  14. from taipy.config.config import Config
  15. from taipy.config.exceptions.exceptions import InconsistentEnvVariableError, MissingEnvVariableError
  16. from tests.core.utils.named_temporary_file import NamedTemporaryFile
  17. def test_override_default_configuration_with_code_configuration():
  18. assert not Config.core.root_folder == "foo"
  19. assert len(Config.data_nodes) == 1
  20. assert len(Config.tasks) == 1
  21. assert len(Config.scenarios) == 1
  22. Config.configure_job_executions(max_nb_of_workers=-1)
  23. Config.configure_core(root_folder="foo")
  24. foo_config = Config.configure_data_node("foo", "in_memory")
  25. xyz_config = Config.configure_data_node("xyz")
  26. bar_config = Config.configure_task("bar", print, [foo_config], [])
  27. qux_config = Config.configure_scenario("qux", [bar_config], [xyz_config])
  28. assert Config.job_config.max_nb_of_workers == -1
  29. assert Config.core.root_folder == "foo"
  30. assert len(Config.data_nodes) == 3
  31. assert "default" in Config.data_nodes
  32. assert foo_config.id in Config.data_nodes
  33. assert xyz_config.id in Config.data_nodes
  34. assert Config.data_nodes[foo_config.id].storage_type == "in_memory"
  35. assert Config.data_nodes[xyz_config.id].storage_type == "pickle"
  36. assert len(Config.tasks) == 2
  37. assert "default" in Config.tasks
  38. assert bar_config.id in Config.tasks
  39. assert len(Config.tasks[bar_config.id].input_configs) == 1
  40. assert Config.tasks[bar_config.id].input_configs[0].id == foo_config.id
  41. assert len(Config.tasks[bar_config.id].output_configs) == 0
  42. assert Config.tasks[bar_config.id].function == print
  43. assert len(Config.scenarios) == 2
  44. assert "default" in Config.scenarios
  45. assert qux_config.id in Config.scenarios
  46. assert len(Config.scenarios[qux_config.id].tasks) == 1
  47. assert Config.scenarios[qux_config.id].tasks[0].id == bar_config.id
  48. assert len(Config.scenarios[qux_config.id].additional_data_nodes) == 1
  49. assert Config.scenarios[qux_config.id].additional_data_nodes[0].id == xyz_config.id
  50. def test_override_default_config_with_code_config_including_env_variable_values():
  51. Config.configure_core()
  52. assert Config.core.repository_type == "filesystem"
  53. Config.configure_core(repository_type="othertype")
  54. assert Config.core.repository_type == "othertype"
  55. with mock.patch.dict(os.environ, {"REPOSITORY_TYPE": "foo"}):
  56. Config.configure_core(repository_type="ENV[REPOSITORY_TYPE]")
  57. assert Config.core.repository_type == "foo"
  58. def test_override_default_configuration_with_file_configuration():
  59. tf = NamedTemporaryFile(
  60. """
  61. [TAIPY]
  62. [JOB]
  63. max_nb_of_workers = -1
  64. [DATA_NODE.foo]
  65. [TASK.bar]
  66. [SCENARIO.qux]
  67. """
  68. )
  69. assert Config.job_config.max_nb_of_workers == 1
  70. assert len(Config.data_nodes) == 1
  71. assert len(Config.tasks) == 1
  72. assert len(Config.scenarios) == 1
  73. Config.override(tf.filename)
  74. assert Config.job_config.max_nb_of_workers == -1
  75. assert len(Config.data_nodes) == 2
  76. assert "default" in Config.data_nodes
  77. assert "foo" in Config.data_nodes
  78. assert len(Config.tasks) == 2
  79. assert "default" in Config.tasks
  80. assert "bar" in Config.tasks
  81. assert "default" in Config.scenarios
  82. assert len(Config.scenarios) == 2
  83. assert "qux" in Config.scenarios
  84. def test_override_default_config_with_file_config_including_env_variable_values():
  85. tf = NamedTemporaryFile(
  86. """
  87. [JOB]
  88. max_nb_of_workers = "ENV[FOO]:int"
  89. start_executor = "ENV[BAR]"
  90. """
  91. )
  92. assert Config.job_config.max_nb_of_workers == 1
  93. assert not Config.job_config.start_executor
  94. with mock.patch.dict(os.environ, {"FOO": "6", "BAR": "TRUe"}):
  95. Config.override(tf.filename)
  96. assert Config.job_config.max_nb_of_workers == 6
  97. assert Config.job_config.start_executor
  98. with mock.patch.dict(os.environ, {"FOO": "foo", "BAR": "true"}):
  99. with pytest.raises(InconsistentEnvVariableError):
  100. Config.override(tf.filename)
  101. with mock.patch.dict(os.environ, {"FOO": "5"}):
  102. with pytest.raises(MissingEnvVariableError):
  103. Config.override(tf.filename)
  104. def test_code_configuration_do_not_override_file_configuration():
  105. config_from_filename = NamedTemporaryFile(
  106. """
  107. [JOB]
  108. max_nb_of_workers = 2
  109. """
  110. )
  111. Config.override(config_from_filename.filename)
  112. Config.configure_job_executions(max_nb_of_workers=21)
  113. assert Config.job_config.max_nb_of_workers == 2 # From file config
  114. def test_code_configuration_do_not_override_file_configuration_including_env_variable_values():
  115. config_from_filename = NamedTemporaryFile(
  116. """
  117. [JOB]
  118. max_nb_of_workers = 2
  119. """
  120. )
  121. Config.override(config_from_filename.filename)
  122. with mock.patch.dict(os.environ, {"FOO": "21"}):
  123. Config.configure_job_executions(max_nb_of_workers="ENV[FOO]")
  124. assert Config.job_config.max_nb_of_workers == 2 # From file config
  125. def test_file_configuration_override_code_configuration():
  126. config_from_filename = NamedTemporaryFile(
  127. """
  128. [JOB]
  129. max_nb_of_workers = 2
  130. """
  131. )
  132. Config.configure_job_executions(max_nb_of_workers=21)
  133. Config.override(config_from_filename.filename)
  134. assert Config.job_config.max_nb_of_workers == 2 # From file config
  135. def test_file_configuration_override_code_configuration_including_env_variable_values():
  136. config_from_filename = NamedTemporaryFile(
  137. """
  138. [JOB]
  139. max_nb_of_workers = "ENV[FOO]:int"
  140. """
  141. )
  142. Config.configure_job_executions(max_nb_of_workers=21)
  143. with mock.patch.dict(os.environ, {"FOO": "2"}):
  144. Config.override(config_from_filename.filename)
  145. assert Config.job_config.max_nb_of_workers == 2 # From file config
  146. def test_override_default_configuration_with_multiple_configurations():
  147. file_config = NamedTemporaryFile(
  148. """
  149. [DATA_NODE.default]
  150. has_header = true
  151. [DATA_NODE.my_datanode]
  152. path = "/data/csv"
  153. [JOB]
  154. max_nb_of_workers = 10
  155. [TAIPY]
  156. """
  157. )
  158. # Default config is applied
  159. assert Config.job_config.max_nb_of_workers == 1
  160. # Code config is applied
  161. Config.configure_job_executions(max_nb_of_workers=-1)
  162. assert Config.job_config.max_nb_of_workers == -1
  163. # File config is applied
  164. Config.override(file_config.filename)
  165. assert Config.job_config.max_nb_of_workers == 10
  166. assert Config.data_nodes["my_datanode"].has_header
  167. assert Config.data_nodes["my_datanode"].path == "/data/csv"
  168. assert Config.data_nodes["my_datanode"].not_defined is None
  169. def test_override_default_configuration_with_multiple_configurations_including_environment_variable_values():
  170. file_config = NamedTemporaryFile(
  171. """
  172. [DATA_NODE.default]
  173. has_header = true
  174. [DATA_NODE.my_datanode]
  175. path = "ENV[FOO]"
  176. [JOB]
  177. max_nb_of_workers = 10
  178. [TAIPY]
  179. """
  180. )
  181. with mock.patch.dict(os.environ, {"FOO": "/data/csv", "BAR": "/baz/data/csv"}):
  182. # Default config is applied
  183. assert Config.job_config.max_nb_of_workers == 1
  184. # Code config is applied
  185. Config.configure_job_executions(max_nb_of_workers=-1)
  186. Config.configure_data_node("my_datanode", path="ENV[BAR]")
  187. assert Config.job_config.max_nb_of_workers == -1
  188. assert Config.data_nodes["my_datanode"].path == "/baz/data/csv"
  189. # File config is applied
  190. Config.override(file_config.filename)
  191. assert Config.job_config.max_nb_of_workers == 10
  192. assert Config.data_nodes["my_datanode"].has_header
  193. assert Config.data_nodes["my_datanode"].path == "/data/csv"
  194. assert Config.data_nodes["my_datanode"].not_defined is None