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,127 @@
1
+ describe HybridPlatformsConductor::NodesHandler do
2
+
3
+ it 'initializes with no platform' do
4
+ with_platforms '' do
5
+ expect(test_nodes_handler.known_nodes).to eq []
6
+ end
7
+ end
8
+
9
+ it 'initializes with a platform having no node' do
10
+ with_test_platform do
11
+ expect(test_nodes_handler.known_nodes).to eq []
12
+ end
13
+ end
14
+
15
+ it 'iterates over defined nodes sequentially' do
16
+ with_test_platform(nodes: { 'node1' => {}, 'node2' => {}, 'node3' => {}, 'node4' => {} }) do
17
+ nodes_iterated = []
18
+ test_nodes_handler.for_each_node_in(['node2', 'node3', 'node4']) do |node|
19
+ nodes_iterated << node
20
+ end
21
+ expect(nodes_iterated.sort).to eq %w[node2 node3 node4].sort
22
+ end
23
+ end
24
+
25
+ it 'iterates over defined nodes in parallel' do
26
+ with_test_platform(nodes: { 'node1' => {}, 'node2' => {}, 'node3' => {}, 'node4' => {} }) do
27
+ nodes_iterated = []
28
+ test_nodes_handler.for_each_node_in(['node2', 'node3', 'node4'], parallel: true) do |node|
29
+ sleep(
30
+ case node
31
+ when 'node2'
32
+ 2
33
+ when 'node3'
34
+ 3
35
+ when 'node4'
36
+ 1
37
+ end
38
+ )
39
+ nodes_iterated << node
40
+ end
41
+ expect(nodes_iterated).to eq %w[node4 node2 node3]
42
+ end
43
+ end
44
+
45
+ it 'iterates over defined nodes in parallel and handle errors correctly' do
46
+ with_test_platform(nodes: { 'node1' => {}, 'node2' => {}, 'node3' => {}, 'node4' => {} }) do
47
+ nodes_iterated = []
48
+ # Make sure we exit the test case even if the error is not handled correctly by using a timeout
49
+ Timeout.timeout(5) do
50
+ expect do
51
+ test_nodes_handler.for_each_node_in(['node2', 'node3', 'node4'], parallel: true) do |node|
52
+ case node
53
+ when 'node2'
54
+ sleep 2
55
+ when 'node3'
56
+ sleep 3
57
+ raise "Error iterating on #{node}"
58
+ when 'node4'
59
+ sleep 1
60
+ end
61
+ nodes_iterated << node
62
+ end
63
+ end.to raise_error 'Error iterating on node3'
64
+ end
65
+ expect(nodes_iterated).to eq %w[node4 node2]
66
+ end
67
+ end
68
+
69
+ it 'selects the correct configurations for a given node' do
70
+ with_test_platform(
71
+ nodes: { 'node1' => {}, 'node2' => {}, 'node3' => {}, 'node4' => {} },
72
+ nodes_lists: { 'nodeslist1' => %w[node1 node2], 'nodeslist2' => %w[node3 node4] }
73
+ ) do
74
+ expect(test_nodes_handler.select_confs_for_node('node2', [
75
+ {
76
+ conf: 'conf1',
77
+ nodes_selectors_stack: ['/node1/']
78
+ },
79
+ {
80
+ conf: 'conf2',
81
+ nodes_selectors_stack: ['/node2/']
82
+ },
83
+ {
84
+ conf: 'conf3',
85
+ nodes_selectors_stack: [[{ list: 'nodeslist1' }]]
86
+ },
87
+ {
88
+ conf: 'conf4',
89
+ nodes_selectors_stack: [[{ list: 'nodeslist2' }]]
90
+ }
91
+ ]).map { |config| config[:conf] }.sort).to eq %w[
92
+ conf2
93
+ conf3
94
+ ].sort
95
+ end
96
+ end
97
+
98
+ it 'selects the correct configurations for a given platform' do
99
+ with_test_platforms(
100
+ 'platform1' => { nodes: { 'node11' => {}, 'node12' => {}, 'node13' => {}, 'node14' => {} } },
101
+ 'platform2' => { nodes: { 'node21' => {}, 'node22' => {}, 'node23' => {}, 'node24' => {} } }
102
+ ) do
103
+ expect(test_nodes_handler.select_confs_for_platform('platform2', [
104
+ {
105
+ conf: 'conf1',
106
+ nodes_selectors_stack: ['/node1/']
107
+ },
108
+ {
109
+ conf: 'conf2',
110
+ nodes_selectors_stack: ['/node2/']
111
+ },
112
+ {
113
+ conf: 'conf3',
114
+ nodes_selectors_stack: [%w[node11 node13 node21 node22 node23 node24]]
115
+ },
116
+ {
117
+ conf: 'conf4',
118
+ nodes_selectors_stack: [%w[node11 node13 node21 node22 node24]]
119
+ }
120
+ ]).map { |config| config[:conf] }.sort).to eq %w[
121
+ conf2
122
+ conf3
123
+ ].sort
124
+ end
125
+ end
126
+
127
+ end
@@ -0,0 +1,318 @@
1
+ describe HybridPlatformsConductor::NodesHandler do
2
+
3
+ context 'checking computation of impacted nodes by a git diff' do
4
+
5
+ it 'returns all the impacted platform nodes by default' do
6
+ with_test_platforms(
7
+ {
8
+ 'platform_1' => { nodes: { 'node11' => {}, 'node12' => {} } },
9
+ 'platform_2' => { nodes: { 'node21' => {}, 'node22' => {} } }
10
+ },
11
+ true
12
+ ) do
13
+ with_cmd_runner_mocked([
14
+ [/cd .+\/platform_2 && git --no-pager diff --no-color master/, proc { [0, '', ''] }]
15
+ ]) do
16
+ expect(test_nodes_handler.impacted_nodes_from_git_diff('platform_2')).to eq [
17
+ %w[node21 node22].sort,
18
+ [],
19
+ [],
20
+ true
21
+ ]
22
+ end
23
+ end
24
+ end
25
+
26
+ it 'diffs from another commit if asked' do
27
+ with_test_platform({}, true) do
28
+ with_cmd_runner_mocked([
29
+ [/cd .+\/my_remote_platform && git --no-pager diff --no-color from_branch/, proc { [0, '', ''] }]
30
+ ]) do
31
+ expect(test_nodes_handler.impacted_nodes_from_git_diff('my_remote_platform', from_commit: 'from_branch')).to eq [[], [], [], true]
32
+ end
33
+ end
34
+ end
35
+
36
+ it 'diffs to another commit if asked' do
37
+ with_test_platform({}, true) do
38
+ with_cmd_runner_mocked([
39
+ [/cd .+\/my_remote_platform && git --no-pager diff --no-color master to_branch/, proc { [0, '', ''] }]
40
+ ]) do
41
+ expect(test_nodes_handler.impacted_nodes_from_git_diff('my_remote_platform', to_commit: 'to_branch')).to eq [[], [], [], true]
42
+ end
43
+ end
44
+ end
45
+
46
+ it 'gives the platform handler the correct git diff result' do
47
+ with_test_platform({}, true) do
48
+ with_cmd_runner_mocked([
49
+ [/cd .+\/my_remote_platform && git --no-pager diff --no-color master/, proc do
50
+ [
51
+ 0,
52
+ <<~EOS,
53
+ diff --git a/Gemfile b/Gemfile
54
+ index d65e2a6..cb9a38e 100644
55
+ --- a/Gemfile
56
+ +++ b/Gemfile
57
+ @@ -1,3 +1,5 @@
58
+ source 'http://rubygems.org'
59
+
60
+ gemspec
61
+ +
62
+ +gem 'byebug'
63
+
64
+ diff --git a/lib/hybrid_platforms_conductor/nodes_handler.rb b/lib/stale/hybrid_platforms_conductor/nodes_handler.rb
65
+ index e8e1778..69a84bd 100644
66
+ --- a/lib/hybrid_platforms_conductor/nodes_handler.rb
67
+ +++ b/lib/hybrid_platforms_conductor/nodes_handler.rb
68
+ @@ -133,6 +133,23 @@ module HybridPlatformsConductor
69
+ options_parser.on('-l', '--nodes-list LIST', 'Select nodes defined in a nodes list (can be used several times)') do |nodes_list|
70
+ nodes_selectors << { list: nodes_list }
71
+ end
72
+ + options_parser.on(
73
+ + '--nodes-git-impact GIT_IMPACT',
74
+ nodes_selectors << node
75
+ end
76
+ EOS
77
+ ''
78
+ ]
79
+ end]
80
+ ]) do
81
+ expect(test_nodes_handler.impacted_nodes_from_git_diff('my_remote_platform')).to eq [[], [], [], true]
82
+ expect(test_platforms_handler.platform('my_remote_platform').files_diffs).to eq(
83
+ 'Gemfile' => {
84
+ diff: <<~EOS.strip
85
+ index d65e2a6..cb9a38e 100644
86
+ --- a/Gemfile
87
+ +++ b/Gemfile
88
+ @@ -1,3 +1,5 @@
89
+ source 'http://rubygems.org'
90
+
91
+ gemspec
92
+ +
93
+ +gem 'byebug'
94
+
95
+ EOS
96
+ },
97
+ 'lib/hybrid_platforms_conductor/nodes_handler.rb' => {
98
+ moved_to: 'lib/stale/hybrid_platforms_conductor/nodes_handler.rb',
99
+ diff: <<~EOS.strip
100
+ index e8e1778..69a84bd 100644
101
+ --- a/lib/hybrid_platforms_conductor/nodes_handler.rb
102
+ +++ b/lib/hybrid_platforms_conductor/nodes_handler.rb
103
+ @@ -133,6 +133,23 @@ module HybridPlatformsConductor
104
+ options_parser.on('-l', '--nodes-list LIST', 'Select nodes defined in a nodes list (can be used several times)') do |nodes_list|
105
+ nodes_selectors << { list: nodes_list }
106
+ end
107
+ + options_parser.on(
108
+ + '--nodes-git-impact GIT_IMPACT',
109
+ nodes_selectors << node
110
+ end
111
+ EOS
112
+ }
113
+ )
114
+ end
115
+ end
116
+ end
117
+
118
+ it 'returns the impacted nodes given by the platform handler' do
119
+ with_test_platforms(
120
+ {
121
+ 'other_platform' => { nodes: { 'other_node_1' => {}, 'other_node_2' => {} } },
122
+ 'my_remote_platform' => {
123
+ nodes: { 'node1' => {}, 'node2' => {}, 'node3' => {} },
124
+ impacted_nodes: %w[node1 node3]
125
+ }
126
+ },
127
+ true
128
+ ) do
129
+ with_cmd_runner_mocked([
130
+ [/cd .+\/my_remote_platform && git --no-pager diff --no-color master/, proc { [0, '', ''] }]
131
+ ]) do
132
+ expect(test_nodes_handler.impacted_nodes_from_git_diff('my_remote_platform')).to eq [
133
+ %w[node1 node3],
134
+ %w[node1 node3],
135
+ [],
136
+ false
137
+ ]
138
+ end
139
+ end
140
+ end
141
+
142
+ it 'returns the impacted services given by the platform handler' do
143
+ with_test_platforms(
144
+ {
145
+ 'other_platform' => { nodes: { 'other_node_1' => {}, 'other_node_2' => {} } },
146
+ 'my_remote_platform' => {
147
+ nodes: {
148
+ 'node1' => { services: %w[service1 service2] },
149
+ 'node2' => { services: %w[service1 service3] },
150
+ 'node3' => { services: %w[service2 service4] }
151
+ },
152
+ impacted_services: %w[service1 service3]
153
+ }
154
+ },
155
+ true
156
+ ) do
157
+ with_cmd_runner_mocked([
158
+ [/cd .+\/my_remote_platform && git --no-pager diff --no-color master/, proc { [0, '', ''] }]
159
+ ]) do
160
+ expect(test_nodes_handler.impacted_nodes_from_git_diff('my_remote_platform')).to eq [
161
+ %w[node1 node2],
162
+ [],
163
+ %w[service1 service3],
164
+ false
165
+ ]
166
+ end
167
+ end
168
+ end
169
+
170
+ it 'returns the impacted global given by the platform handler' do
171
+ with_test_platforms(
172
+ {
173
+ 'other_platform' => { nodes: { 'other_node_1' => {}, 'other_node_2' => {} } },
174
+ 'my_remote_platform' => {
175
+ nodes: {
176
+ 'node1' => { services: %w[service1 service2] },
177
+ 'node2' => { services: %w[service1 service3] },
178
+ 'node3' => { services: %w[service2 service4] }
179
+ },
180
+ impacted_global: true
181
+ }
182
+ },
183
+ true
184
+ ) do
185
+ with_cmd_runner_mocked([
186
+ [/cd .+\/my_remote_platform && git --no-pager diff --no-color master/, proc { [0, '', ''] }]
187
+ ]) do
188
+ expect(test_nodes_handler.impacted_nodes_from_git_diff('my_remote_platform')).to eq [
189
+ %w[node1 node2 node3],
190
+ [],
191
+ [],
192
+ true
193
+ ]
194
+ end
195
+ end
196
+ end
197
+
198
+ it 'returns the impacted nodes given by the platform handler' do
199
+ with_test_platforms(
200
+ {
201
+ 'other_platform' => { nodes: { 'other_node_1' => {}, 'other_node_2' => {} } },
202
+ 'my_remote_platform' => {
203
+ nodes: { 'node1' => {}, 'node2' => {}, 'node3' => {} },
204
+ impacted_nodes: %w[node1 node3]
205
+ }
206
+ },
207
+ true
208
+ ) do
209
+ with_cmd_runner_mocked([
210
+ [/cd .+\/my_remote_platform && git --no-pager diff --no-color master/, proc { [0, '', ''] }]
211
+ ]) do
212
+ expect(test_nodes_handler.impacted_nodes_from_git_diff('my_remote_platform')).to eq [
213
+ %w[node1 node3],
214
+ %w[node1 node3],
215
+ [],
216
+ false
217
+ ]
218
+ end
219
+ end
220
+ end
221
+
222
+ it 'returns both impacted services and nodes given by the platform handler' do
223
+ with_test_platforms(
224
+ {
225
+ 'other_platform' => { nodes: { 'other_node_1' => {}, 'other_node_2' => {} } },
226
+ 'my_remote_platform' => {
227
+ nodes: {
228
+ 'node1' => { services: %w[service1 service2] },
229
+ 'node2' => { services: %w[service1 service3] },
230
+ 'node3' => { services: %w[service2 service4] },
231
+ 'node4' => { services: %w[service2 service4] }
232
+ },
233
+ impacted_nodes: %w[node4],
234
+ impacted_services: %w[service1 service3]
235
+ }
236
+ },
237
+ true
238
+ ) do
239
+ with_cmd_runner_mocked([
240
+ [/cd .+\/my_remote_platform && git --no-pager diff --no-color master/, proc { [0, '', ''] }]
241
+ ]) do
242
+ expect(test_nodes_handler.impacted_nodes_from_git_diff('my_remote_platform')).to eq [
243
+ %w[node1 node2 node4],
244
+ %w[node4],
245
+ %w[service1 service3],
246
+ false
247
+ ]
248
+ end
249
+ end
250
+ end
251
+
252
+ it 'returns all nodes of impacted services' do
253
+ with_test_platforms(
254
+ {
255
+ 'other_platform' => { nodes: { 'other_node_1' => {}, 'other_node_2' => {} } },
256
+ 'my_remote_platform' => {
257
+ nodes: {
258
+ 'node1' => { services: %w[service1 service2] },
259
+ 'node2' => { services: %w[service1 service3] },
260
+ 'node3' => { services: %w[service2 service4] },
261
+ 'node4' => { services: %w[service2 service4] },
262
+ 'node5' => { services: %w[service3 service4] },
263
+ 'node6' => { services: %w[service3 service4] },
264
+ 'node7' => { services: %w[service1 service4] }
265
+ },
266
+ impacted_services: %w[service2 service3]
267
+ }
268
+ },
269
+ true
270
+ ) do
271
+ with_cmd_runner_mocked([
272
+ [/cd .+\/my_remote_platform && git --no-pager diff --no-color master/, proc { [0, '', ''] }]
273
+ ]) do
274
+ expect(test_nodes_handler.impacted_nodes_from_git_diff('my_remote_platform')).to eq [
275
+ %w[node1 node2 node3 node4 node5 node6],
276
+ [],
277
+ %w[service2 service3],
278
+ false
279
+ ]
280
+ end
281
+ end
282
+ end
283
+
284
+ it 'returns the minimal subset of nodes impacted by services' do
285
+ with_test_platforms(
286
+ {
287
+ 'other_platform' => { nodes: { 'other_node_1' => {}, 'other_node_2' => {} } },
288
+ 'my_remote_platform' => {
289
+ nodes: {
290
+ 'node1' => { services: %w[service1 service2] },
291
+ 'node2' => { services: %w[service1 service3] },
292
+ 'node3' => { services: %w[service2 service4] },
293
+ 'node4' => { services: %w[service2 service4] },
294
+ 'node5' => { services: %w[service3 service4] },
295
+ 'node6' => { services: %w[service3 service4] },
296
+ 'node7' => { services: %w[service1 service4] }
297
+ },
298
+ impacted_services: %w[service2 service3]
299
+ }
300
+ },
301
+ true
302
+ ) do
303
+ with_cmd_runner_mocked([
304
+ [/cd .+\/my_remote_platform && git --no-pager diff --no-color master/, proc { [0, '', ''] }]
305
+ ]) do
306
+ expect(test_nodes_handler.impacted_nodes_from_git_diff('my_remote_platform', smallest_set: true)).to eq [
307
+ %w[node1 node2],
308
+ [],
309
+ %w[service2 service3],
310
+ false
311
+ ]
312
+ end
313
+ end
314
+ end
315
+
316
+ end
317
+
318
+ end
@@ -0,0 +1,132 @@
1
+ describe HybridPlatformsConductor::NodesHandler do
2
+
3
+ context 'checking nodes selection capabilities' do
4
+
5
+ # Set the test environment with a given list of nodes for our tests
6
+ #
7
+ # Parameters::
8
+ # * Proc: Code called when environment is ready
9
+ def with_test_platform_for_nodes
10
+ with_test_platforms(
11
+ 'platform1' => {
12
+ nodes: { 'node1' => {}, 'node2' => { services: ['service1'] }, 'node3' => { services: ['service2'] } },
13
+ nodes_lists: { 'nodeslist1' => %w[node1 node3], 'nodeslist2' => ['/node[12]/'] }
14
+ },
15
+ 'platform2' => {
16
+ nodes: { 'node4' => {}, 'node5' => { services: ['service3', 'service1'] }, 'node6' => {} }
17
+ }
18
+ ) do
19
+ yield
20
+ end
21
+ end
22
+
23
+ # List all tests of nodes selectors, and the corresponding nodes list they should be resolved into
24
+ {
25
+ [] => [],
26
+ [{ all: true }] => %w[node1 node2 node3 node4 node5 node6],
27
+ 'node1' => %w[node1],
28
+ '/node[12]/' => %w[node1 node2],
29
+ [{ list: 'nodeslist1' }] => %w[node1 node3],
30
+ [{ list: 'nodeslist2' }] => %w[node1 node2],
31
+ [{ platform: 'platform2' }] => %w[node4 node5 node6],
32
+ [{ service: 'service1' }] => %w[node2 node5],
33
+ ['/node[12]/', { service: 'service1' }] => %w[node1 node2 node5],
34
+ [{ git_diff: { platform: 'platform2' } }] => %w[node4 node5 node6]
35
+ }.each do |nodes_selectors, expected_nodes|
36
+
37
+ it "selects nodes correctly: #{nodes_selectors} resolves to #{expected_nodes}" do
38
+ with_test_platform_for_nodes do
39
+ expect(test_nodes_handler.select_nodes([])).to eq []
40
+ end
41
+ end
42
+
43
+ end
44
+
45
+ it 'fails when selecting unknown nodes' do
46
+ with_test_platform_for_nodes do
47
+ expect { test_nodes_handler.select_nodes('node1', 'node7') }.to raise_error(RuntimeError, 'Unknown nodes: node7')
48
+ end
49
+ end
50
+
51
+ it 'ignore unknown nodes when asked' do
52
+ with_test_platform_for_nodes do
53
+ expect(test_nodes_handler.select_nodes(['node1', 'node7'], ignore_unknowns: true).sort).to eq %w[node1 node7].sort
54
+ end
55
+ end
56
+
57
+ it 'selects the correct diff impacts' do
58
+ with_test_platform_for_nodes do
59
+ expect(test_nodes_handler).to receive(:impacted_nodes_from_git_diff).with(
60
+ 'platform2',
61
+ from_commit: 'master',
62
+ to_commit: nil,
63
+ smallest_set: false
64
+ ) { [%w[node4 node6], [], [], false] }
65
+ expect(test_nodes_handler.select_nodes([{ git_diff: { platform: 'platform2' } }]).sort).to eq %w[node4 node6].sort
66
+ end
67
+ end
68
+
69
+ it 'selects the correct diff impacts with from commit' do
70
+ with_test_platform_for_nodes do
71
+ expect(test_nodes_handler).to receive(:impacted_nodes_from_git_diff).with(
72
+ 'platform2',
73
+ from_commit: 'from_commit',
74
+ to_commit: nil,
75
+ smallest_set: false
76
+ ) { [%w[node4 node6], [], [], false] }
77
+ expect(test_nodes_handler.select_nodes([{ git_diff: { platform: 'platform2', from_commit: 'from_commit' } }]).sort).to eq %w[node4 node6].sort
78
+ end
79
+ end
80
+
81
+ it 'selects the correct diff impacts with to commit' do
82
+ with_test_platform_for_nodes do
83
+ expect(test_nodes_handler).to receive(:impacted_nodes_from_git_diff).with(
84
+ 'platform2',
85
+ from_commit: 'master',
86
+ to_commit: 'to_commit',
87
+ smallest_set: false
88
+ ) { [%w[node4 node6], [], [], false] }
89
+ expect(test_nodes_handler.select_nodes([{ git_diff: { platform: 'platform2', to_commit: 'to_commit' } }]).sort).to eq %w[node4 node6].sort
90
+ end
91
+ end
92
+
93
+ it 'selects the correct diff impacts with smallest set' do
94
+ with_test_platform_for_nodes do
95
+ expect(test_nodes_handler).to receive(:impacted_nodes_from_git_diff).with(
96
+ 'platform2',
97
+ from_commit: 'master',
98
+ to_commit: nil,
99
+ smallest_set: true
100
+ ) { [%w[node4 node6], [], [], false] }
101
+ expect(test_nodes_handler.select_nodes([{ git_diff: { platform: 'platform2', smallest_set: true } }]).sort).to eq %w[node4 node6].sort
102
+ end
103
+ end
104
+
105
+ it 'considers all nodes for en empty nodes selector stack' do
106
+ with_test_platform_for_nodes do
107
+ expect(test_nodes_handler.select_from_nodes_selector_stack([]).sort).to eq %w[node1 node2 node3 node4 node5 node6].sort
108
+ end
109
+ end
110
+
111
+ it 'considers nodes selector intersection in a nodes selector stack' do
112
+ with_test_platform_for_nodes do
113
+ expect(test_nodes_handler.select_from_nodes_selector_stack([
114
+ %w[node1 node2 node3],
115
+ %w[node2 node3 node4]
116
+ ]).sort).to eq %w[node2 node3].sort
117
+ end
118
+ end
119
+
120
+ it 'considers nodes selector intersection between different kind of selectors in a nodes selector stack' do
121
+ with_test_platform_for_nodes do
122
+ expect(test_nodes_handler.select_from_nodes_selector_stack([
123
+ '/node[1256]/',
124
+ [{ platform: 'platform2' }],
125
+ [{ service: 'service1' }]
126
+ ]).sort).to eq %w[node5].sort
127
+ end
128
+ end
129
+
130
+ end
131
+
132
+ end