hybrid_platforms_conductor 32.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. checksums.yaml +7 -0
  2. data/bin/check-node +24 -0
  3. data/bin/deploy +12 -0
  4. data/bin/dump_nodes_json +12 -0
  5. data/bin/free_ips +23 -0
  6. data/bin/free_veids +17 -0
  7. data/bin/get_impacted_nodes +43 -0
  8. data/bin/last_deploys +56 -0
  9. data/bin/nodes_to_deploy +104 -0
  10. data/bin/report +10 -0
  11. data/bin/run +39 -0
  12. data/bin/setup +11 -0
  13. data/bin/ssh_config +14 -0
  14. data/bin/test +13 -0
  15. data/bin/topograph +54 -0
  16. data/lib/hybrid_platforms_conductor/action.rb +82 -0
  17. data/lib/hybrid_platforms_conductor/actions_executor.rb +307 -0
  18. data/lib/hybrid_platforms_conductor/bitbucket.rb +123 -0
  19. data/lib/hybrid_platforms_conductor/cmd_runner.rb +188 -0
  20. data/lib/hybrid_platforms_conductor/cmdb.rb +34 -0
  21. data/lib/hybrid_platforms_conductor/common_config_dsl/bitbucket.rb +78 -0
  22. data/lib/hybrid_platforms_conductor/common_config_dsl/confluence.rb +43 -0
  23. data/lib/hybrid_platforms_conductor/common_config_dsl/file_system_tests.rb +110 -0
  24. data/lib/hybrid_platforms_conductor/common_config_dsl/idempotence_tests.rb +38 -0
  25. data/lib/hybrid_platforms_conductor/config.rb +263 -0
  26. data/lib/hybrid_platforms_conductor/confluence.rb +119 -0
  27. data/lib/hybrid_platforms_conductor/connector.rb +84 -0
  28. data/lib/hybrid_platforms_conductor/credentials.rb +127 -0
  29. data/lib/hybrid_platforms_conductor/current_dir_monitor.rb +42 -0
  30. data/lib/hybrid_platforms_conductor/deployer.rb +598 -0
  31. data/lib/hybrid_platforms_conductor/executable.rb +145 -0
  32. data/lib/hybrid_platforms_conductor/hpc_plugins/action/bash.rb +44 -0
  33. data/lib/hybrid_platforms_conductor/hpc_plugins/action/interactive.rb +44 -0
  34. data/lib/hybrid_platforms_conductor/hpc_plugins/action/my_action.rb.sample +79 -0
  35. data/lib/hybrid_platforms_conductor/hpc_plugins/action/remote_bash.rb +63 -0
  36. data/lib/hybrid_platforms_conductor/hpc_plugins/action/ruby.rb +69 -0
  37. data/lib/hybrid_platforms_conductor/hpc_plugins/action/scp.rb +61 -0
  38. data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/config.rb +78 -0
  39. data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/host_ip.rb +104 -0
  40. data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/host_keys.rb +114 -0
  41. data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/my_cmdb.rb.sample +129 -0
  42. data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/platform_handlers.rb +66 -0
  43. data/lib/hybrid_platforms_conductor/hpc_plugins/connector/my_connector.rb.sample +156 -0
  44. data/lib/hybrid_platforms_conductor/hpc_plugins/connector/ssh.rb +702 -0
  45. data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/platform_handler_plugin.rb.sample +292 -0
  46. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/docker.rb +148 -0
  47. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/my_provisioner.rb.sample +103 -0
  48. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/podman.rb +125 -0
  49. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/proxmox.rb +522 -0
  50. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/proxmox/proxmox_waiter.rb +707 -0
  51. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/proxmox/reserve_proxmox_container +122 -0
  52. data/lib/hybrid_platforms_conductor/hpc_plugins/report/confluence.rb +69 -0
  53. data/lib/hybrid_platforms_conductor/hpc_plugins/report/mediawiki.rb +164 -0
  54. data/lib/hybrid_platforms_conductor/hpc_plugins/report/my_report_plugin.rb.sample +88 -0
  55. data/lib/hybrid_platforms_conductor/hpc_plugins/report/stdout.rb +61 -0
  56. data/lib/hybrid_platforms_conductor/hpc_plugins/report/templates/confluence_inventory.html.erb +33 -0
  57. data/lib/hybrid_platforms_conductor/hpc_plugins/test/bitbucket_conf.rb +137 -0
  58. data/lib/hybrid_platforms_conductor/hpc_plugins/test/can_be_checked.rb +21 -0
  59. data/lib/hybrid_platforms_conductor/hpc_plugins/test/check_deploy_and_idempotence.rb +112 -0
  60. data/lib/hybrid_platforms_conductor/hpc_plugins/test/check_from_scratch.rb +35 -0
  61. data/lib/hybrid_platforms_conductor/hpc_plugins/test/connection.rb +28 -0
  62. data/lib/hybrid_platforms_conductor/hpc_plugins/test/deploy_freshness.rb +44 -0
  63. data/lib/hybrid_platforms_conductor/hpc_plugins/test/deploy_from_scratch.rb +36 -0
  64. data/lib/hybrid_platforms_conductor/hpc_plugins/test/deploy_removes_root_access.rb +49 -0
  65. data/lib/hybrid_platforms_conductor/hpc_plugins/test/divergence.rb +25 -0
  66. data/lib/hybrid_platforms_conductor/hpc_plugins/test/executables.rb +46 -0
  67. data/lib/hybrid_platforms_conductor/hpc_plugins/test/file_system.rb +45 -0
  68. data/lib/hybrid_platforms_conductor/hpc_plugins/test/file_system_hdfs.rb +45 -0
  69. data/lib/hybrid_platforms_conductor/hpc_plugins/test/hostname.rb +25 -0
  70. data/lib/hybrid_platforms_conductor/hpc_plugins/test/idempotence.rb +77 -0
  71. data/lib/hybrid_platforms_conductor/hpc_plugins/test/ip.rb +38 -0
  72. data/lib/hybrid_platforms_conductor/hpc_plugins/test/jenkins_ci_conf.rb +56 -0
  73. data/lib/hybrid_platforms_conductor/hpc_plugins/test/jenkins_ci_masters_ok.rb +54 -0
  74. data/lib/hybrid_platforms_conductor/hpc_plugins/test/linear_strategy.rb +47 -0
  75. data/lib/hybrid_platforms_conductor/hpc_plugins/test/local_users.rb +82 -0
  76. data/lib/hybrid_platforms_conductor/hpc_plugins/test/mounts.rb +120 -0
  77. data/lib/hybrid_platforms_conductor/hpc_plugins/test/my_test_plugin.rb.sample +143 -0
  78. data/lib/hybrid_platforms_conductor/hpc_plugins/test/orphan_files.rb +74 -0
  79. data/lib/hybrid_platforms_conductor/hpc_plugins/test/ports.rb +85 -0
  80. data/lib/hybrid_platforms_conductor/hpc_plugins/test/private_ips.rb +38 -0
  81. data/lib/hybrid_platforms_conductor/hpc_plugins/test/public_ips.rb +38 -0
  82. data/lib/hybrid_platforms_conductor/hpc_plugins/test/spectre-meltdown-checker.sh +1930 -0
  83. data/lib/hybrid_platforms_conductor/hpc_plugins/test/spectre.rb +56 -0
  84. data/lib/hybrid_platforms_conductor/hpc_plugins/test/veids.rb +31 -0
  85. data/lib/hybrid_platforms_conductor/hpc_plugins/test/vulnerabilities.rb +159 -0
  86. data/lib/hybrid_platforms_conductor/hpc_plugins/test_report/confluence.rb +122 -0
  87. data/lib/hybrid_platforms_conductor/hpc_plugins/test_report/my_test_report.rb.sample +48 -0
  88. data/lib/hybrid_platforms_conductor/hpc_plugins/test_report/stdout.rb +120 -0
  89. data/lib/hybrid_platforms_conductor/hpc_plugins/test_report/templates/_confluence_errors_status.html.erb +46 -0
  90. data/lib/hybrid_platforms_conductor/hpc_plugins/test_report/templates/_confluence_gauge.html.erb +49 -0
  91. data/lib/hybrid_platforms_conductor/hpc_plugins/test_report/templates/confluence.html.erb +242 -0
  92. data/lib/hybrid_platforms_conductor/io_router.rb +70 -0
  93. data/lib/hybrid_platforms_conductor/json_dumper.rb +88 -0
  94. data/lib/hybrid_platforms_conductor/logger_helpers.rb +319 -0
  95. data/lib/hybrid_platforms_conductor/mutex_dir +76 -0
  96. data/lib/hybrid_platforms_conductor/nodes_handler.rb +597 -0
  97. data/lib/hybrid_platforms_conductor/parallel_threads.rb +97 -0
  98. data/lib/hybrid_platforms_conductor/platform_handler.rb +188 -0
  99. data/lib/hybrid_platforms_conductor/platforms_handler.rb +118 -0
  100. data/lib/hybrid_platforms_conductor/plugin.rb +53 -0
  101. data/lib/hybrid_platforms_conductor/plugins.rb +101 -0
  102. data/lib/hybrid_platforms_conductor/provisioner.rb +181 -0
  103. data/lib/hybrid_platforms_conductor/report.rb +31 -0
  104. data/lib/hybrid_platforms_conductor/reports_handler.rb +84 -0
  105. data/lib/hybrid_platforms_conductor/services_handler.rb +274 -0
  106. data/lib/hybrid_platforms_conductor/test.rb +141 -0
  107. data/lib/hybrid_platforms_conductor/test_by_service.rb +22 -0
  108. data/lib/hybrid_platforms_conductor/test_report.rb +282 -0
  109. data/lib/hybrid_platforms_conductor/tests_runner.rb +590 -0
  110. data/lib/hybrid_platforms_conductor/thycotic.rb +92 -0
  111. data/lib/hybrid_platforms_conductor/topographer.rb +859 -0
  112. data/lib/hybrid_platforms_conductor/topographer/plugin.rb +20 -0
  113. data/lib/hybrid_platforms_conductor/topographer/plugins/graphviz.rb +127 -0
  114. data/lib/hybrid_platforms_conductor/topographer/plugins/json.rb +72 -0
  115. data/lib/hybrid_platforms_conductor/topographer/plugins/my_topographer_output_plugin.rb.sample +37 -0
  116. data/lib/hybrid_platforms_conductor/topographer/plugins/svg.rb +30 -0
  117. data/lib/hybrid_platforms_conductor/version.rb +5 -0
  118. data/spec/hybrid_platforms_conductor_test.rb +159 -0
  119. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/bash_spec.rb +43 -0
  120. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/interactive_spec.rb +18 -0
  121. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/remote_bash_spec.rb +102 -0
  122. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/ruby_spec.rb +108 -0
  123. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/scp_spec.rb +79 -0
  124. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions_spec.rb +199 -0
  125. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connection_spec.rb +212 -0
  126. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/cli_options_spec.rb +125 -0
  127. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/config_dsl_spec.rb +50 -0
  128. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/connectable_nodes_spec.rb +28 -0
  129. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/connections_spec.rb +448 -0
  130. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/global_helpers_spec.rb +313 -0
  131. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/node_helpers_spec.rb +32 -0
  132. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/remote_actions_spec.rb +134 -0
  133. data/spec/hybrid_platforms_conductor_test/api/actions_executor/logging_spec.rb +256 -0
  134. data/spec/hybrid_platforms_conductor_test/api/actions_executor/parallel_spec.rb +338 -0
  135. data/spec/hybrid_platforms_conductor_test/api/actions_executor/timeout_spec.rb +101 -0
  136. data/spec/hybrid_platforms_conductor_test/api/cmd_runner_spec.rb +165 -0
  137. data/spec/hybrid_platforms_conductor_test/api/config_spec.rb +238 -0
  138. data/spec/hybrid_platforms_conductor_test/api/deployer/check_spec.rb +9 -0
  139. data/spec/hybrid_platforms_conductor_test/api/deployer/deploy_spec.rb +243 -0
  140. data/spec/hybrid_platforms_conductor_test/api/deployer/parse_deploy_output_spec.rb +104 -0
  141. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioner_spec.rb +131 -0
  142. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/docker/Dockerfile +10 -0
  143. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/docker_spec.rb +123 -0
  144. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/podman_spec.rb +211 -0
  145. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/config_dsl_spec.rb +126 -0
  146. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/create_spec.rb +290 -0
  147. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/destroy_spec.rb +43 -0
  148. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/ip_spec.rb +60 -0
  149. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/proxmox.json +3 -0
  150. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/destroy_vm_spec.rb +82 -0
  151. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/expired_containers_spec.rb +786 -0
  152. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/ips_assignment_spec.rb +112 -0
  153. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/other_lxc_containers_resources_spec.rb +190 -0
  154. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/pve_node_resources_spec.rb +200 -0
  155. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/retries_spec.rb +35 -0
  156. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/vm_ids_assignment_spec.rb +67 -0
  157. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/start_spec.rb +79 -0
  158. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/state_spec.rb +28 -0
  159. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/stop_spec.rb +41 -0
  160. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/config_spec.rb +33 -0
  161. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/host_ip_spec.rb +64 -0
  162. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/host_keys_spec.rb +133 -0
  163. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/platform_handlers_spec.rb +19 -0
  164. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs_plugins_api_spec.rb +446 -0
  165. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/common_spec.rb +127 -0
  166. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/git_diff_impacts_spec.rb +318 -0
  167. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/nodes_selectors_spec.rb +132 -0
  168. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/platform_handlers_plugins_api_spec.rb +60 -0
  169. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/several_platforms_spec.rb +58 -0
  170. data/spec/hybrid_platforms_conductor_test/api/platform_handler_spec.rb +97 -0
  171. data/spec/hybrid_platforms_conductor_test/api/platforms_handler_spec.rb +104 -0
  172. data/spec/hybrid_platforms_conductor_test/api/plugins_spec.rb +243 -0
  173. data/spec/hybrid_platforms_conductor_test/api/reports_handler_spec.rb +44 -0
  174. data/spec/hybrid_platforms_conductor_test/api/services_handler/actions_to_deploy_spec.rb +121 -0
  175. data/spec/hybrid_platforms_conductor_test/api/services_handler/deploy_allowed_spec.rb +142 -0
  176. data/spec/hybrid_platforms_conductor_test/api/services_handler/log_info_spec.rb +101 -0
  177. data/spec/hybrid_platforms_conductor_test/api/services_handler/package_spec.rb +388 -0
  178. data/spec/hybrid_platforms_conductor_test/api/services_handler/parse_deploy_output_spec.rb +274 -0
  179. data/spec/hybrid_platforms_conductor_test/api/services_handler/prepare_for_deploy_spec.rb +264 -0
  180. data/spec/hybrid_platforms_conductor_test/api/tests_runner/common_spec.rb +194 -0
  181. data/spec/hybrid_platforms_conductor_test/api/tests_runner/global_spec.rb +37 -0
  182. data/spec/hybrid_platforms_conductor_test/api/tests_runner/node_check_spec.rb +194 -0
  183. data/spec/hybrid_platforms_conductor_test/api/tests_runner/node_spec.rb +137 -0
  184. data/spec/hybrid_platforms_conductor_test/api/tests_runner/node_ssh_spec.rb +257 -0
  185. data/spec/hybrid_platforms_conductor_test/api/tests_runner/platform_spec.rb +110 -0
  186. data/spec/hybrid_platforms_conductor_test/api/tests_runner/reports_spec.rb +367 -0
  187. data/spec/hybrid_platforms_conductor_test/api/tests_runner/test_plugins/bitbucket_conf_spec.rb +111 -0
  188. data/spec/hybrid_platforms_conductor_test/api/tests_runner/test_reports_plugins/confluence_spec.rb +29 -0
  189. data/spec/hybrid_platforms_conductor_test/cmdb_plugins/test_cmdb.rb +166 -0
  190. data/spec/hybrid_platforms_conductor_test/cmdb_plugins/test_cmdb2.rb +93 -0
  191. data/spec/hybrid_platforms_conductor_test/cmdb_plugins/test_cmdb_others.rb +60 -0
  192. data/spec/hybrid_platforms_conductor_test/cmdb_plugins/test_cmdb_others2.rb +58 -0
  193. data/spec/hybrid_platforms_conductor_test/executables/check-node_spec.rb +35 -0
  194. data/spec/hybrid_platforms_conductor_test/executables/deploy_spec.rb +35 -0
  195. data/spec/hybrid_platforms_conductor_test/executables/get_impacted_nodes_spec.rb +158 -0
  196. data/spec/hybrid_platforms_conductor_test/executables/last_deploys_spec.rb +173 -0
  197. data/spec/hybrid_platforms_conductor_test/executables/nodes_to_deploy_spec.rb +283 -0
  198. data/spec/hybrid_platforms_conductor_test/executables/options/actions_executor_spec.rb +28 -0
  199. data/spec/hybrid_platforms_conductor_test/executables/options/cmd_runner_spec.rb +28 -0
  200. data/spec/hybrid_platforms_conductor_test/executables/options/common_spec.rb +67 -0
  201. data/spec/hybrid_platforms_conductor_test/executables/options/deployer_spec.rb +251 -0
  202. data/spec/hybrid_platforms_conductor_test/executables/options/nodes_handler_spec.rb +111 -0
  203. data/spec/hybrid_platforms_conductor_test/executables/options/nodes_selectors_spec.rb +71 -0
  204. data/spec/hybrid_platforms_conductor_test/executables/options/reports_handler_spec.rb +54 -0
  205. data/spec/hybrid_platforms_conductor_test/executables/options/tests_runner_spec.rb +139 -0
  206. data/spec/hybrid_platforms_conductor_test/executables/report_spec.rb +60 -0
  207. data/spec/hybrid_platforms_conductor_test/executables/run_spec.rb +173 -0
  208. data/spec/hybrid_platforms_conductor_test/executables/ssh_config_spec.rb +35 -0
  209. data/spec/hybrid_platforms_conductor_test/executables/test_spec.rb +41 -0
  210. data/spec/hybrid_platforms_conductor_test/helpers/actions_executor_helpers.rb +98 -0
  211. data/spec/hybrid_platforms_conductor_test/helpers/cmd_runner_helpers.rb +92 -0
  212. data/spec/hybrid_platforms_conductor_test/helpers/cmdb_helpers.rb +37 -0
  213. data/spec/hybrid_platforms_conductor_test/helpers/config_helpers.rb +20 -0
  214. data/spec/hybrid_platforms_conductor_test/helpers/connector_ssh_helpers.rb +130 -0
  215. data/spec/hybrid_platforms_conductor_test/helpers/deployer_helpers.rb +149 -0
  216. data/spec/hybrid_platforms_conductor_test/helpers/deployer_test_helpers.rb +812 -0
  217. data/spec/hybrid_platforms_conductor_test/helpers/executables_helpers.rb +96 -0
  218. data/spec/hybrid_platforms_conductor_test/helpers/nodes_handler_helpers.rb +20 -0
  219. data/spec/hybrid_platforms_conductor_test/helpers/platform_handler_helpers.rb +35 -0
  220. data/spec/hybrid_platforms_conductor_test/helpers/platforms_handler_helpers.rb +127 -0
  221. data/spec/hybrid_platforms_conductor_test/helpers/plugins_helpers.rb +48 -0
  222. data/spec/hybrid_platforms_conductor_test/helpers/provisioner_proxmox_helpers.rb +789 -0
  223. data/spec/hybrid_platforms_conductor_test/helpers/reports_handler_helpers.rb +29 -0
  224. data/spec/hybrid_platforms_conductor_test/helpers/services_handler_helpers.rb +20 -0
  225. data/spec/hybrid_platforms_conductor_test/helpers/tests_runner_helpers.rb +38 -0
  226. data/spec/hybrid_platforms_conductor_test/mocked_lib/my_test_gem/hpc_plugins/test_plugin_type/test_plugin_id1.rb +22 -0
  227. data/spec/hybrid_platforms_conductor_test/mocked_lib/my_test_gem/hpc_plugins/test_plugin_type/test_plugin_id2.rb +22 -0
  228. data/spec/hybrid_platforms_conductor_test/mocked_lib/my_test_gem2/sub_dir/hpc_plugins/test_plugin_type/test_plugin_id3.rb +26 -0
  229. data/spec/hybrid_platforms_conductor_test/mocked_lib/my_test_gem2/sub_dir/hpc_plugins/test_plugin_type2/test_plugin_id4.rb +26 -0
  230. data/spec/hybrid_platforms_conductor_test/platform_handler_plugins/test.rb +225 -0
  231. data/spec/hybrid_platforms_conductor_test/platform_handler_plugins/test2.rb +11 -0
  232. data/spec/hybrid_platforms_conductor_test/report_plugin.rb +35 -0
  233. data/spec/hybrid_platforms_conductor_test/test_action.rb +66 -0
  234. data/spec/hybrid_platforms_conductor_test/test_connector.rb +151 -0
  235. data/spec/hybrid_platforms_conductor_test/test_plugins/global.rb +30 -0
  236. data/spec/hybrid_platforms_conductor_test/test_plugins/node.rb +53 -0
  237. data/spec/hybrid_platforms_conductor_test/test_plugins/node_check.rb +47 -0
  238. data/spec/hybrid_platforms_conductor_test/test_plugins/node_ssh.rb +42 -0
  239. data/spec/hybrid_platforms_conductor_test/test_plugins/platform.rb +50 -0
  240. data/spec/hybrid_platforms_conductor_test/test_plugins/several_checks.rb +50 -0
  241. data/spec/hybrid_platforms_conductor_test/test_provisioner.rb +95 -0
  242. data/spec/hybrid_platforms_conductor_test/tests_report_plugin.rb +49 -0
  243. data/spec/spec_helper.rb +111 -0
  244. metadata +566 -0
@@ -0,0 +1,44 @@
1
+ describe HybridPlatformsConductor::ReportsHandler do
2
+
3
+ # Setup a test platform for our reports testing
4
+ #
5
+ # Parameters::
6
+ # * Proc: Code called when platform is setup
7
+ def with_test_platform_for_reports_test
8
+ with_test_platform(nodes: { 'node1' => {}, 'node2' => {}, 'node3' => {} }) do
9
+ register_report_plugins(test_reports_handler, report: HybridPlatformsConductorTest::ReportPlugin)
10
+ test_reports_handler.format = :report
11
+ yield
12
+ end
13
+ end
14
+
15
+ it 'delivers a simple report on all the inventory' do
16
+ with_test_platform_for_reports_test do
17
+ test_reports_handler.produce_report_for [{ all: true }]
18
+ expect(HybridPlatformsConductorTest::ReportPlugin.generated_reports).to eq ['Report generated for node1, node2, node3 in en']
19
+ end
20
+ end
21
+
22
+ it 'delivers a simple report on some nodes only' do
23
+ with_test_platform_for_reports_test do
24
+ test_reports_handler.produce_report_for %w[node1 node3]
25
+ expect(HybridPlatformsConductorTest::ReportPlugin.generated_reports).to eq ['Report generated for node1, node3 in en']
26
+ end
27
+ end
28
+
29
+ it 'delivers a simple report with a different locale' do
30
+ with_test_platform_for_reports_test do
31
+ test_reports_handler.locale = :fr
32
+ test_reports_handler.produce_report_for [{ all: true }]
33
+ expect(HybridPlatformsConductorTest::ReportPlugin.generated_reports).to eq ['Report generated for node1, node2, node3 in fr']
34
+ end
35
+ end
36
+
37
+ it 'fails when delivering a simple report with an unknown locale' do
38
+ with_test_platform_for_reports_test do
39
+ test_reports_handler.locale = :de
40
+ expect { test_reports_handler.produce_report_for([{ all: true }])}.to raise_error(RuntimeError, 'Unknown locale for format report: de')
41
+ end
42
+ end
43
+
44
+ end
@@ -0,0 +1,121 @@
1
+ describe HybridPlatformsConductor::ServicesHandler do
2
+
3
+ context 'checking actions to deploy services on a node' do
4
+
5
+ # Expect actions for a deployment to match a given list
6
+ #
7
+ # Parameters::
8
+ # * *node* (String): Node on which we deploy
9
+ # * *services* (Array<String>): Services being deployed
10
+ # * *check* (Boolean): Are we asking for a deployment in check mode?
11
+ # * expected_deploys* (Array< Hash<Symbol,Object> >): Expected deployment actions:
12
+ # * *node* (String): Node on which deployment should occur
13
+ # * *service* (String): Service that should be deployed
14
+ # * *platform* (String): Platform that should be used to deploy this service [default: 'platform']
15
+ # * *check* (Boolean): Should the action be deployed in check mode? [default: false]
16
+ def expect_deploy_actions(node, services, check, expected_deploys)
17
+ actions = test_services_handler.actions_to_deploy_on(node, services, check)
18
+ expect(actions.size).to eq expected_deploys.size * 3
19
+ actions.each_slice(3).zip(expected_deploys) do |((marker_begin, action, marker_end), expected_deploy)|
20
+ # Check that we log the begin marker before deploying the service
21
+ expect(marker_begin.keys).to eq [:ruby]
22
+ stdout_begin = StringIO.new
23
+ stderr_begin = StringIO.new
24
+ marker_begin[:ruby].call(stdout_begin, stderr_begin)
25
+ expect(stdout_begin.string.strip).to eq "===== [ #{expected_deploy[:node]} / #{expected_deploy[:service]} ] - HPC Service #{expected_deploy[:check] ? 'Check' : 'Deploy' } ===== Begin"
26
+ expect(stderr_begin.string.strip).to eq "===== [ #{expected_deploy[:node]} / #{expected_deploy[:service]} ] - HPC Service #{expected_deploy[:check] ? 'Check' : 'Deploy' } ===== Begin"
27
+ # Check that the service is deployed according to our mocked PlatformHandler
28
+ expect(action).to eq(bash: "echo \"#{expected_deploy[:check] ? 'Checking' : 'Deploying'} #{expected_deploy[:service]} (#{expected_deploy[:platform] || 'platform'}) on #{expected_deploy[:node]}\"")
29
+ # Check that we log the end marker after deploying the service
30
+ stdout_end = StringIO.new
31
+ stderr_end = StringIO.new
32
+ marker_end[:ruby].call(stdout_end, stderr_end)
33
+ expect(stdout_end.string.strip).to eq "===== [ #{expected_deploy[:node]} / #{expected_deploy[:service]} ] - HPC Service #{expected_deploy[:check] ? 'Check' : 'Deploy' } ===== End"
34
+ expect(stderr_end.string.strip).to eq "===== [ #{expected_deploy[:node]} / #{expected_deploy[:service]} ] - HPC Service #{expected_deploy[:check] ? 'Check' : 'Deploy' } ===== End"
35
+ end
36
+ end
37
+
38
+ it 'deploys a service' do
39
+ with_test_platform(
40
+ nodes: { 'node' => { services: %w[service1] } },
41
+ deployable_services: %w[service1]
42
+ ) do
43
+ expect_deploy_actions('node', %w[service1], false, [
44
+ { node: 'node', service: 'service1' }
45
+ ])
46
+ end
47
+ end
48
+
49
+ it 'deploys a service in why-run mode' do
50
+ with_test_platform(
51
+ nodes: { 'node' => { services: %w[service1] } },
52
+ deployable_services: %w[service1]
53
+ ) do
54
+ expect_deploy_actions('node', %w[service1], true, [
55
+ { node: 'node', service: 'service1', check: true }
56
+ ])
57
+ end
58
+ end
59
+
60
+ it 'deploys several services' do
61
+ with_test_platform(
62
+ nodes: { 'node' => { services: %w[service1 service2] } },
63
+ deployable_services: %w[service1 service2]
64
+ ) do
65
+ expect_deploy_actions('node', %w[service1 service2], false, [
66
+ { node: 'node', service: 'service1' },
67
+ { node: 'node', service: 'service2' }
68
+ ])
69
+ end
70
+ end
71
+
72
+ it 'deploys several services from different platforms' do
73
+ with_test_platforms(
74
+ 'platform1' => { nodes: { 'node' => { services: %w[service1 service2] } }, deployable_services: %w[service1] },
75
+ 'platform2' => { nodes: {}, deployable_services: %w[service2] }
76
+ ) do
77
+ expect_deploy_actions('node', %w[service1 service2], false, [
78
+ { node: 'node', service: 'service1', platform: 'platform1' },
79
+ { node: 'node', service: 'service2', platform: 'platform2' }
80
+ ])
81
+ end
82
+ end
83
+
84
+ it 'deploys several services from different platforms in the correct order' do
85
+ with_test_platforms(
86
+ 'platform1' => { nodes: { 'node' => { services: %w[service1 service2 service3 service4] } }, deployable_services: %w[service1] },
87
+ 'platform2' => { nodes: {}, deployable_services: %w[service2 service3] },
88
+ 'platform3' => { nodes: {}, deployable_services: %w[service4] }
89
+ ) do
90
+ expect_deploy_actions('node', %w[service3 service1 service4 service2], false, [
91
+ { node: 'node', service: 'service3', platform: 'platform2' },
92
+ { node: 'node', service: 'service1', platform: 'platform1' },
93
+ { node: 'node', service: 'service4', platform: 'platform3' },
94
+ { node: 'node', service: 'service2', platform: 'platform2' }
95
+ ])
96
+ end
97
+ end
98
+
99
+ it 'deploys only required services' do
100
+ with_test_platform(
101
+ nodes: { 'node' => { services: %w[service1 service2] } },
102
+ deployable_services: %w[service1 service2]
103
+ ) do
104
+ expect_deploy_actions('node', %w[service2], false, [
105
+ { node: 'node', service: 'service2' }
106
+ ])
107
+ end
108
+ end
109
+
110
+ it 'fails if a service can\'t be deployed' do
111
+ with_test_platform(
112
+ nodes: { 'node' => { services: %w[service1 service2] } },
113
+ deployable_services: %w[service1]
114
+ ) do
115
+ expect { test_services_handler.actions_to_deploy_on('node', %w[service2], false) }.to raise_error 'No platform is able to deploy the service service2'
116
+ end
117
+ end
118
+
119
+ end
120
+
121
+ end
@@ -0,0 +1,142 @@
1
+ describe HybridPlatformsConductor::ServicesHandler do
2
+
3
+ context 'checking deployment authorization' do
4
+
5
+ # Setup a test platform for our services testing
6
+ #
7
+ # Parameters::
8
+ # * Proc: Code called when platform is setup
9
+ # * Parameters::
10
+ # * *repository* (String): Platform repository path
11
+ def with_test_platform_for_services_test
12
+ with_test_platform(
13
+ {
14
+ nodes: { 'node1' => { services: %w[service1] }, 'node2' => {}, 'node3' => {} },
15
+ deployable_services: %w[service1]
16
+ },
17
+ true
18
+ ) do |repository|
19
+ yield repository
20
+ end
21
+ end
22
+
23
+ # Create a commit on branch and check it out
24
+ #
25
+ # Parameters::
26
+ # * *repository* (String): Path to the git repository
27
+ def checkout_non_master_on(repository)
28
+ git = Git.open(repository)
29
+ git.branch('other_branch').checkout
30
+ FileUtils.touch("#{repository}/other_file")
31
+ git.add('other_file')
32
+ git.commit('Test commit')
33
+ end
34
+
35
+ it 'allows deployment in local environment' do
36
+ with_test_platform_for_services_test do
37
+ with_cmd_runner_mocked([]) do
38
+ expect(test_services_handler.deploy_allowed?(services: { 'node1' => %w[service1] }, secrets: {}, local_environment: true)).to eq nil
39
+ end
40
+ end
41
+ end
42
+
43
+ it 'allows deployment if branch is on master' do
44
+ with_test_platform_for_services_test do
45
+ expect(test_services_handler.deploy_allowed?(services: { 'node1' => %w[service1] }, secrets: {}, local_environment: false)).to eq nil
46
+ end
47
+ end
48
+
49
+ it 'allows deployment if it is not a git repository' do
50
+ with_test_platform(
51
+ nodes: { 'node1' => { services: %w[service1] }, 'node2' => {}, 'node3' => {} },
52
+ deployable_services: %w[service1]
53
+ ) do
54
+ expect(test_services_handler.deploy_allowed?(services: { 'node1' => %w[service1] }, secrets: {}, local_environment: false)).to eq nil
55
+ end
56
+ end
57
+
58
+ it 'allows deployment if branch is on a master remote' do
59
+ with_test_platform_for_services_test do |repository|
60
+ with_repository(File.basename(repository), as_git: true) do |remote_repo|
61
+ git = Git.open(repository)
62
+ git.add_remote('another_remote', remote_repo).fetch
63
+ git.checkout('remotes/another_remote/master')
64
+ expect(test_services_handler.deploy_allowed?(services: { 'node1' => %w[service1] }, secrets: {}, local_environment: false)).to eq nil
65
+ end
66
+ end
67
+ end
68
+
69
+ it 'allows deployment if branch is on master even if not checked-out' do
70
+ with_test_platform_for_services_test do |repository|
71
+ Git.open(repository).branch('other_branch').checkout
72
+ expect(test_services_handler.deploy_allowed?(services: { 'node1' => %w[service1] }, secrets: {}, local_environment: false)).to eq nil
73
+ end
74
+ end
75
+
76
+ it 'refuses deployment if branch is not master' do
77
+ with_test_platform_for_services_test do |repository|
78
+ checkout_non_master_on(repository)
79
+ expect(test_services_handler.deploy_allowed?(services: { 'node1' => %w[service1] }, secrets: {}, local_environment: false)).to eq "The following platforms have not checked out master: #{repository}. Only master should be deployed in production."
80
+ end
81
+ end
82
+
83
+ it 'checks for master branch on all platforms before allowing deployment' do
84
+ with_test_platforms(
85
+ {
86
+ 'platform1' => { nodes: { 'node1' => { services: %w[service1] } }, deployable_services: %w[service1] },
87
+ 'platform2' => { nodes: { 'node2' => { services: %w[service2] } }, deployable_services: %w[service2] },
88
+ 'platform3' => { nodes: { 'node3' => { services: %w[service3] } }, deployable_services: %w[service3] }
89
+ },
90
+ true
91
+ ) do |repositories|
92
+ expect(test_services_handler.deploy_allowed?(
93
+ services: { 'node1' => %w[service1], 'node2' => %w[service2], 'node3' => %w[service3] },
94
+ secrets: {},
95
+ local_environment: false
96
+ )).to eq nil
97
+ end
98
+ end
99
+
100
+ it 'refuses deployment if at least 1 platform is not on master' do
101
+ with_test_platforms(
102
+ {
103
+ 'platform1' => { nodes: { 'node1' => { services: %w[service1] } }, deployable_services: %w[service1] },
104
+ 'platform2' => { nodes: { 'node2' => { services: %w[service2] } }, deployable_services: %w[service2] },
105
+ 'platform3' => { nodes: { 'node3' => { services: %w[service3] } }, deployable_services: %w[service3] },
106
+ 'platform4' => { nodes: { 'node4' => { services: %w[service4] } }, deployable_services: %w[service4] }
107
+ },
108
+ true
109
+ ) do |repositories|
110
+ checkout_non_master_on(repositories['platform2'])
111
+ checkout_non_master_on(repositories['platform4'])
112
+ expect(test_services_handler.deploy_allowed?(
113
+ services: { 'node1' => %w[service1], 'node2' => %w[service2], 'node3' => %w[service3], 'node4' => %w[service4] },
114
+ secrets: {},
115
+ local_environment: false
116
+ )).to eq "The following platforms have not checked out master: #{repositories['platform2']}, #{repositories['platform4']}. Only master should be deployed in production."
117
+ end
118
+ end
119
+
120
+ it 'ignores platforms not having to be packaged to check for deployment authorization' do
121
+ with_test_platforms(
122
+ {
123
+ 'platform1' => { nodes: { 'node1' => { services: %w[service1] } }, deployable_services: %w[service1] },
124
+ 'platform2' => { nodes: { 'node2' => { services: %w[service2] } }, deployable_services: %w[service2] },
125
+ 'platform3' => { nodes: { 'node3' => { services: %w[service3] } }, deployable_services: %w[service3] },
126
+ 'platform4' => { nodes: { 'node4' => { services: %w[service4] } }, deployable_services: %w[service4] }
127
+ },
128
+ true
129
+ ) do |repositories|
130
+ checkout_non_master_on(repositories['platform2'])
131
+ checkout_non_master_on(repositories['platform4'])
132
+ expect(test_services_handler.deploy_allowed?(
133
+ services: { 'node1' => %w[service1 service3] },
134
+ secrets: {},
135
+ local_environment: false
136
+ )).to eq nil
137
+ end
138
+ end
139
+
140
+ end
141
+
142
+ end
@@ -0,0 +1,101 @@
1
+ describe HybridPlatformsConductor::ServicesHandler do
2
+
3
+ context 'checking logs associated to a deployment' do
4
+
5
+ it 'logs platforms info' do
6
+ with_test_platform(
7
+ nodes: { 'node' => { services: %w[service1] } },
8
+ deployable_services: %w[service1]
9
+ ) do
10
+ expect(test_services_handler.log_info_for('node', %w[service1])).to eq(
11
+ repo_name_0: 'platform'
12
+ )
13
+ end
14
+ end
15
+
16
+ it 'logs platforms info from a git repository' do
17
+ with_test_platform(
18
+ {
19
+ nodes: { 'node' => { services: %w[service1] } },
20
+ deployable_services: %w[service1]
21
+ },
22
+ true
23
+ ) do |repository|
24
+ expect(test_services_handler.log_info_for('node', %w[service1])).to eq(
25
+ commit_id_0: Git.open(repository).log.first.sha,
26
+ commit_message_0: 'Test commit',
27
+ diff_files_0: '',
28
+ repo_name_0: 'my_remote_platform'
29
+ )
30
+ end
31
+ end
32
+
33
+ it 'logs platforms info from a git repository with differing files' do
34
+ with_test_platform(
35
+ {
36
+ nodes: { 'node' => { services: %w[service1] } },
37
+ deployable_services: %w[service1]
38
+ },
39
+ true
40
+ ) do |repository|
41
+ FileUtils.touch "#{repository}/new_file"
42
+ expect(test_services_handler.log_info_for('node', %w[service1])).to eq(
43
+ commit_id_0: Git.open(repository).log.first.sha,
44
+ commit_message_0: 'Test commit',
45
+ diff_files_0: 'new_file',
46
+ repo_name_0: 'my_remote_platform'
47
+ )
48
+ end
49
+ end
50
+
51
+ it 'logs several platforms info' do
52
+ with_test_platforms(
53
+ {
54
+ 'platform1' => { nodes: { 'node' => { services: %w[service1 service2 service3] } }, deployable_services: %w[service1] },
55
+ 'platform2' => { nodes: {}, deployable_services: %w[service2] },
56
+ 'platform3' => { nodes: {}, deployable_services: %w[service3] },
57
+ },
58
+ true
59
+ ) do |repositories|
60
+ expect(test_services_handler.log_info_for('node', %w[service1 service2 service3])).to eq(
61
+ commit_id_0: Git.open(repositories['platform1']).log.first.sha,
62
+ commit_message_0: 'Test commit',
63
+ diff_files_0: '',
64
+ repo_name_0: 'platform1',
65
+ commit_id_1: Git.open(repositories['platform2']).log.first.sha,
66
+ commit_message_1: 'Test commit',
67
+ diff_files_1: '',
68
+ repo_name_1: 'platform2',
69
+ commit_id_2: Git.open(repositories['platform3']).log.first.sha,
70
+ commit_message_2: 'Test commit',
71
+ diff_files_2: '',
72
+ repo_name_2: 'platform3'
73
+ )
74
+ end
75
+ end
76
+
77
+ it 'logs only concerned platforms info' do
78
+ with_test_platforms(
79
+ {
80
+ 'platform1' => { nodes: { 'node' => { services: %w[service1 service2 service3] } }, deployable_services: %w[service1] },
81
+ 'platform2' => { nodes: {}, deployable_services: %w[service2] },
82
+ 'platform3' => { nodes: {}, deployable_services: %w[service3] },
83
+ },
84
+ true
85
+ ) do |repositories|
86
+ expect(test_services_handler.log_info_for('node', %w[service1 service3])).to eq(
87
+ commit_id_0: Git.open(repositories['platform1']).log.first.sha,
88
+ commit_message_0: 'Test commit',
89
+ diff_files_0: '',
90
+ repo_name_0: 'platform1',
91
+ commit_id_1: Git.open(repositories['platform3']).log.first.sha,
92
+ commit_message_1: 'Test commit',
93
+ diff_files_1: '',
94
+ repo_name_1: 'platform3'
95
+ )
96
+ end
97
+ end
98
+
99
+ end
100
+
101
+ end
@@ -0,0 +1,388 @@
1
+ describe HybridPlatformsConductor::ServicesHandler do
2
+
3
+ context 'checking packaging' do
4
+
5
+ it 'packages 1 platform' do
6
+ with_test_platform(
7
+ nodes: { 'node1' => { services: %w[service1] }, 'node2' => {}, 'node3' => {} },
8
+ deployable_services: %w[service1],
9
+ package: proc do |services:, secrets:, local_environment:|
10
+ expect(services).to eq('node1' => %w[service1])
11
+ expect(secrets).to eq({})
12
+ expect(local_environment).to eq false
13
+ end
14
+ ) do
15
+ test_services_handler.package(
16
+ services: { 'node1' => %w[service1] },
17
+ secrets: {},
18
+ local_environment: false
19
+ )
20
+ end
21
+ end
22
+
23
+ it 'packages 1 platform only once' do
24
+ nbr_calls = 0
25
+ with_test_platform(
26
+ nodes: { 'node1' => { services: %w[service1] }, 'node2' => {}, 'node3' => {} },
27
+ deployable_services: %w[service1],
28
+ package: proc do |services:, secrets:, local_environment:|
29
+ expect(services).to eq('node1' => %w[service1])
30
+ expect(secrets).to eq({})
31
+ expect(local_environment).to eq false
32
+ nbr_calls += 1
33
+ end
34
+ ) do
35
+ 3.times do
36
+ test_services_handler.package(
37
+ services: { 'node1' => %w[service1] },
38
+ secrets: {},
39
+ local_environment: false
40
+ )
41
+ end
42
+ expect(nbr_calls).to eq 1
43
+ end
44
+ end
45
+
46
+ it 'packages 1 platform only once even across different ServicesHandler instances' do
47
+ nbr_calls = 0
48
+ with_test_platform(
49
+ nodes: { 'node1' => { services: %w[service1] }, 'node2' => {}, 'node3' => {} },
50
+ deployable_services: %w[service1],
51
+ package: proc do |services:, secrets:, local_environment:|
52
+ expect(services).to eq('node1' => %w[service1])
53
+ expect(secrets).to eq({})
54
+ expect(local_environment).to eq false
55
+ nbr_calls += 1
56
+ end
57
+ ) do
58
+ test_services_handler.package(
59
+ services: { 'node1' => %w[service1] },
60
+ secrets: {},
61
+ local_environment: false
62
+ )
63
+ HybridPlatformsConductor::ServicesHandler.new(
64
+ logger: logger,
65
+ logger_stderr: logger,
66
+ config: test_config,
67
+ cmd_runner: test_cmd_runner,
68
+ platforms_handler: test_platforms_handler,
69
+ nodes_handler: test_nodes_handler,
70
+ actions_executor: test_actions_executor
71
+ ).package(
72
+ services: { 'node1' => %w[service1] },
73
+ secrets: {},
74
+ local_environment: false
75
+ )
76
+ expect(nbr_calls).to eq 1
77
+ end
78
+ end
79
+
80
+ it 'packages 1 platform with secrets' do
81
+ with_test_platform(
82
+ nodes: { 'node1' => { services: %w[service1] }, 'node2' => {}, 'node3' => {} },
83
+ deployable_services: %w[service1],
84
+ package: proc do |services:, secrets:, local_environment:|
85
+ expect(services).to eq('node1' => %w[service1])
86
+ expect(secrets).to eq('my_secret' => 'value')
87
+ expect(local_environment).to eq false
88
+ end
89
+ ) do
90
+ test_services_handler.package(
91
+ services: { 'node1' => %w[service1] },
92
+ secrets: { 'my_secret' => 'value' },
93
+ local_environment: false
94
+ )
95
+ end
96
+ end
97
+
98
+ it 'packages 1 platform for a local environment' do
99
+ with_test_platform(
100
+ nodes: { 'node1' => { services: %w[service1] }, 'node2' => {}, 'node3' => {} },
101
+ deployable_services: %w[service1],
102
+ package: proc do |services:, secrets:, local_environment:|
103
+ expect(services).to eq('node1' => %w[service1])
104
+ expect(secrets).to eq({})
105
+ expect(local_environment).to eq true
106
+ end
107
+ ) do
108
+ test_services_handler.package(
109
+ services: { 'node1' => %w[service1] },
110
+ secrets: {},
111
+ local_environment: true
112
+ )
113
+ end
114
+ end
115
+
116
+ it 'packages several platforms' do
117
+ nbr_calls = {
118
+ 'platform1' => 0,
119
+ 'platform2' => 0,
120
+ 'platform3' => 0
121
+ }
122
+ with_test_platforms(
123
+ 'platform1' => {
124
+ nodes: { 'node1' => { services: %w[service1] } },
125
+ deployable_services: %w[service1],
126
+ package: proc do |services:, secrets:, local_environment:|
127
+ expect(services).to eq('node1' => %w[service1])
128
+ expect(secrets).to eq({})
129
+ expect(local_environment).to eq false
130
+ nbr_calls['platform1'] += 1
131
+ end
132
+ },
133
+ 'platform2' => {
134
+ nodes: { 'node2' => { services: %w[service2] } },
135
+ deployable_services: %w[service2],
136
+ package: proc do |services:, secrets:, local_environment:|
137
+ expect(services).to eq('node2' => %w[service2])
138
+ expect(secrets).to eq({})
139
+ expect(local_environment).to eq false
140
+ nbr_calls['platform2'] += 1
141
+ end
142
+ },
143
+ 'platform3' => {
144
+ nodes: { 'node3' => { services: %w[service3] } },
145
+ deployable_services: %w[service3],
146
+ package: proc do |services:, secrets:, local_environment:|
147
+ expect(services).to eq('node3' => %w[service3])
148
+ expect(secrets).to eq({})
149
+ expect(local_environment).to eq false
150
+ nbr_calls['platform3'] += 1
151
+ end
152
+ }
153
+ ) do
154
+ test_services_handler.package(
155
+ services: { 'node1' => %w[service1], 'node2' => %w[service2], 'node3' => %w[service3] },
156
+ secrets: {},
157
+ local_environment: false
158
+ )
159
+ expect(nbr_calls).to eq(
160
+ 'platform1' => 1,
161
+ 'platform2' => 1,
162
+ 'platform3' => 1
163
+ )
164
+ end
165
+ end
166
+
167
+ it 'packages only the concerned platforms' do
168
+ nbr_calls = {
169
+ 'platform1' => 0,
170
+ 'platform2' => 0,
171
+ 'platform3' => 0
172
+ }
173
+ with_test_platforms(
174
+ 'platform1' => {
175
+ nodes: { 'node1' => { services: %w[service1] } },
176
+ deployable_services: %w[service1],
177
+ package: proc do |services:, secrets:, local_environment:|
178
+ expect(services).to eq('node1' => %w[service1])
179
+ expect(secrets).to eq({})
180
+ expect(local_environment).to eq false
181
+ nbr_calls['platform1'] += 1
182
+ end
183
+ },
184
+ 'platform2' => {
185
+ nodes: { 'node2' => { services: %w[service2] } },
186
+ deployable_services: %w[service2],
187
+ package: proc do |services:, secrets:, local_environment:|
188
+ expect(services).to eq('node2' => %w[service2])
189
+ expect(secrets).to eq({})
190
+ expect(local_environment).to eq false
191
+ nbr_calls['platform2'] += 1
192
+ end
193
+ },
194
+ 'platform3' => {
195
+ nodes: { 'node3' => { services: %w[service3] } },
196
+ deployable_services: %w[service3],
197
+ package: proc do |services:, secrets:, local_environment:|
198
+ expect(services).to eq('node1' => %w[service3])
199
+ expect(secrets).to eq({})
200
+ expect(local_environment).to eq false
201
+ nbr_calls['platform3'] += 1
202
+ end
203
+ }
204
+ ) do
205
+ test_services_handler.package(
206
+ services: { 'node1' => %w[service1 service3] },
207
+ secrets: {},
208
+ local_environment: false
209
+ )
210
+ expect(nbr_calls).to eq(
211
+ 'platform1' => 1,
212
+ 'platform2' => 0,
213
+ 'platform3' => 1
214
+ )
215
+ end
216
+ end
217
+
218
+ it 'packages the platforms with only the services they can deploy' do
219
+ nbr_calls = {
220
+ 'platform1' => 0,
221
+ 'platform2' => 0,
222
+ 'platform3' => 0
223
+ }
224
+ with_test_platforms(
225
+ 'platform1' => {
226
+ nodes: { 'node' => { services: %w[service1 service2 service3 service4 service5 service6] } },
227
+ deployable_services: %w[service1 service2],
228
+ package: proc do |services:, secrets:, local_environment:|
229
+ expect(services).to eq('node' => %w[service1 service2])
230
+ expect(secrets).to eq({})
231
+ expect(local_environment).to eq false
232
+ nbr_calls['platform1'] += 1
233
+ end
234
+ },
235
+ 'platform2' => {
236
+ nodes: {},
237
+ deployable_services: %w[service3 service4],
238
+ package: proc do |services:, secrets:, local_environment:|
239
+ expect(services).to eq('node' => %w[service3])
240
+ expect(secrets).to eq({})
241
+ expect(local_environment).to eq false
242
+ nbr_calls['platform2'] += 1
243
+ end
244
+ },
245
+ 'platform3' => {
246
+ nodes: {},
247
+ deployable_services: %w[service5 service6],
248
+ package: proc do |services:, secrets:, local_environment:|
249
+ expect(services).to eq('node' => %w[service5 service6])
250
+ expect(secrets).to eq({})
251
+ expect(local_environment).to eq false
252
+ nbr_calls['platform3'] += 1
253
+ end
254
+ }
255
+ ) do
256
+ test_services_handler.package(
257
+ services: { 'node' => %w[service1 service2 service3 service5 service6] },
258
+ secrets: {},
259
+ local_environment: false
260
+ )
261
+ expect(nbr_calls).to eq(
262
+ 'platform1' => 1,
263
+ 'platform2' => 1,
264
+ 'platform3' => 1
265
+ )
266
+ end
267
+ end
268
+
269
+ it 'packages only the platforms that were not previously packaged' do
270
+ nbr_calls = {
271
+ 'platform1' => 0,
272
+ 'platform2' => 0,
273
+ 'platform3' => 0
274
+ }
275
+ with_test_platforms(
276
+ 'platform1' => {
277
+ nodes: { 'node1' => { services: %w[service1] } },
278
+ deployable_services: %w[service1],
279
+ package: proc do |services:, secrets:, local_environment:|
280
+ expect(services).to eq('node1' => %w[service1])
281
+ expect(secrets).to eq({})
282
+ expect(local_environment).to eq false
283
+ nbr_calls['platform1'] += 1
284
+ end
285
+ },
286
+ 'platform2' => {
287
+ nodes: { 'node2' => { services: %w[service2] } },
288
+ deployable_services: %w[service2],
289
+ package: proc do |services:, secrets:, local_environment:|
290
+ expect(services).to eq('node2' => %w[service2])
291
+ expect(secrets).to eq({})
292
+ expect(local_environment).to eq false
293
+ nbr_calls['platform2'] += 1
294
+ end
295
+ },
296
+ 'platform3' => {
297
+ nodes: { 'node3' => { services: %w[service3] } },
298
+ deployable_services: %w[service3],
299
+ package: proc do |services:, secrets:, local_environment:|
300
+ expect(services).to eq('node3' => %w[service3])
301
+ expect(secrets).to eq({})
302
+ expect(local_environment).to eq false
303
+ nbr_calls['platform3'] += 1
304
+ end
305
+ }
306
+ ) do
307
+ test_services_handler.package(
308
+ services: { 'node1' => %w[service1], 'node3' => %w[service3] },
309
+ secrets: {},
310
+ local_environment: false
311
+ )
312
+ expect(nbr_calls).to eq(
313
+ 'platform1' => 1,
314
+ 'platform2' => 0,
315
+ 'platform3' => 1
316
+ )
317
+ test_services_handler.package(
318
+ services: { 'node1' => %w[service1], 'node2' => %w[service2] },
319
+ secrets: {},
320
+ local_environment: false
321
+ )
322
+ expect(nbr_calls).to eq(
323
+ 'platform1' => 1,
324
+ 'platform2' => 1,
325
+ 'platform3' => 1
326
+ )
327
+ end
328
+ end
329
+
330
+ it 'packages the platforms again if secrets are different' do
331
+ nbr_calls = 0
332
+ expected_secrets = {}
333
+ with_test_platform(
334
+ nodes: { 'node1' => { services: %w[service1] } },
335
+ deployable_services: %w[service1],
336
+ package: proc do |services:, secrets:, local_environment:|
337
+ expect(services).to eq('node1' => %w[service1])
338
+ expect(secrets).to eq(expected_secrets)
339
+ expect(local_environment).to eq false
340
+ nbr_calls += 1
341
+ end
342
+ ) do
343
+ test_services_handler.package(
344
+ services: { 'node1' => %w[service1] },
345
+ secrets: {},
346
+ local_environment: false
347
+ )
348
+ expected_secrets = { 'my_secret' => 'value' }
349
+ test_services_handler.package(
350
+ services: { 'node1' => %w[service1] },
351
+ secrets: { 'my_secret' => 'value' },
352
+ local_environment: false
353
+ )
354
+ expect(nbr_calls).to eq 2
355
+ end
356
+ end
357
+
358
+ it 'packages the platforms again if local environment is different' do
359
+ nbr_calls = 0
360
+ expected_local = false
361
+ with_test_platform(
362
+ nodes: { 'node1' => { services: %w[service1] } },
363
+ deployable_services: %w[service1],
364
+ package: proc do |services:, secrets:, local_environment:|
365
+ expect(services).to eq('node1' => %w[service1])
366
+ expect(secrets).to eq({})
367
+ expect(local_environment).to eq expected_local
368
+ nbr_calls += 1
369
+ end
370
+ ) do
371
+ test_services_handler.package(
372
+ services: { 'node1' => %w[service1] },
373
+ secrets: {},
374
+ local_environment: false
375
+ )
376
+ expected_local = true
377
+ test_services_handler.package(
378
+ services: { 'node1' => %w[service1] },
379
+ secrets: {},
380
+ local_environment: true
381
+ )
382
+ expect(nbr_calls).to eq 2
383
+ end
384
+ end
385
+
386
+ end
387
+
388
+ end