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,61 @@
1
+ module HybridPlatformsConductor
2
+
3
+ module HpcPlugins
4
+
5
+ module Action
6
+
7
+ # Copy files and directories from the local host to the remote one
8
+ class Scp < HybridPlatformsConductor::Action
9
+
10
+ # Setup the action.
11
+ # This is called by the constructor itself, when an action is instantiated to be executed for a node.
12
+ # [API] - This method is optional
13
+ # [API] - @cmd_runner is accessible
14
+ # [API] - @actions_executor is accessible
15
+ #
16
+ # Parameters::
17
+ # * *mappings* (Hash<String or Symbol, Object>): Set of couples source => destination_dir to copy files or directories from the local file system to the remote file system.
18
+ # The following properties can also be used:
19
+ # * *sudo* (Boolean): Do we use sudo to make the copy? [default: false]
20
+ # * *owner* (String or nil): Owner to use for files, or nil to use current one [default: nil]
21
+ # * *group* (String or nil): Group to use for files, or nil to use current one [default: nil]
22
+ def setup(mappings)
23
+ @mappings = mappings
24
+ @sudo = @mappings.delete(:sudo) || false
25
+ @owner = @mappings.delete(:owner)
26
+ @group = @mappings.delete(:group)
27
+ end
28
+
29
+ # Do we need a connector to execute this action on a node?
30
+ #
31
+ # Result::
32
+ # * Boolean: Do we need a connector to execute this action on a node?
33
+ def need_connector?
34
+ true
35
+ end
36
+
37
+ # Execute the action
38
+ # [API] - This method is mandatory
39
+ # [API] - @cmd_runner is accessible
40
+ # [API] - @actions_executor is accessible
41
+ # [API] - @action_info is accessible with the action details
42
+ # [API] - @node (String) can be used to know on which node the action is to be executed
43
+ # [API] - @connector (Connector or nil) can be used to access the node's connector if the action needs remote connection
44
+ # [API] - @timeout (Integer) should be used to make sure the action execution does not get past this number of seconds
45
+ # [API] - @stdout_io can be used to log stdout messages
46
+ # [API] - @stderr_io can be used to log stderr messages
47
+ # [API] - run_cmd(String) method can be used to execute a command. See CmdRunner#run_cmd to know about the result's signature.
48
+ def execute
49
+ @mappings.each do |from, to|
50
+ log_debug "[#{@node}] - Copy to remote \"#{from}\" => \"#{to}\""
51
+ @connector.remote_copy from, to, sudo: @sudo, owner: @owner, group: @group
52
+ end
53
+ end
54
+
55
+ end
56
+
57
+ end
58
+
59
+ end
60
+
61
+ end
@@ -0,0 +1,78 @@
1
+ module HybridPlatformsConductor
2
+
3
+ module HpcPlugins
4
+
5
+ module Cmdb
6
+
7
+ # CMDB getting metadata from the Config DSL
8
+ class Config < HybridPlatformsConductor::Cmdb
9
+
10
+ # Extend the Config DSL
11
+ module ConfigDSLExtension
12
+
13
+ # List of metadata to be set. Each info has the following properties:
14
+ # * *nodes_selectors_stack* (Array<Object>): Stack of nodes selectors impacted by this rule.
15
+ # * *metadata* (Hash<Symbol,Object>): Metadata to associate to the nodes.
16
+ # Array< Hash<Symbol, Object> >
17
+ attr_reader :nodes_metadata
18
+
19
+ # Mixin initializer
20
+ def init_cmdb_config
21
+ @nodes_metadata = []
22
+ end
23
+
24
+ # Set metadata associated to the nodes
25
+ #
26
+ # Parameters::
27
+ # * *metadata* (Hash<Symbol,Object>): Metadata to associate to the nodes.
28
+ def set_metadata(metadata)
29
+ @nodes_metadata << {
30
+ metadata: metadata,
31
+ nodes_selectors_stack: current_nodes_selectors_stack
32
+ }
33
+ end
34
+
35
+ end
36
+
37
+ extend_config_dsl_with ConfigDSLExtension, :init_cmdb_config
38
+
39
+ # get_* methods are automatically detected as possible metadata properties this plugin can fill.
40
+ # The property name filled by such method is given by the method's name: get_my_property will fill the :my_property metadata.
41
+ # The method get_others is used specifically to return properties whose name is unknown before fetching them.
42
+
43
+ # Get other properties for a given set of nodes.
44
+ # It's better to not use this method and prefer using methods naming the property being returned.
45
+ # As the nodes_handler can't know in advance which properties will be returned, it will call it every time there is a missing property.
46
+ # If this method always returns the same values, it would be clever to cache it here.
47
+ # [API] - This method is optional.
48
+ # [API] - @platforms_handler can be used.
49
+ # [API] - @nodes_handler can be used.
50
+ # [API] - @cmd_runner can be used.
51
+ #
52
+ # Parameters::
53
+ # * *nodes* (Array<String>): The nodes to lookup the property for.
54
+ # * *metadata* (Hash<String, Hash<Symbol,Object> >): Existing metadata for each node. Dependent properties should be present here.
55
+ # Result::
56
+ # * Hash<String, Hash<Symbol,Object> >: The corresponding properties, per required node.
57
+ # Nodes for which the property can't be fetched can be ommitted.
58
+ def get_others(nodes, metadata)
59
+ # Keep metadata values in a cache, per node
60
+ @cached_metadata = {} unless defined?(@cached_metadata)
61
+ nodes.each do |node|
62
+ unless @cached_metadata.key?(node)
63
+ @cached_metadata[node] = @nodes_handler.
64
+ select_confs_for_node(node, @config.nodes_metadata).
65
+ map { |nodes_metadata_info| nodes_metadata_info[:metadata] }.
66
+ inject({}) { |merged_metadata, metadata| merged_metadata.merge(metadata) }
67
+ end
68
+ end
69
+ @cached_metadata.slice(*nodes)
70
+ end
71
+
72
+ end
73
+
74
+ end
75
+
76
+ end
77
+
78
+ end
@@ -0,0 +1,104 @@
1
+ require 'hybrid_platforms_conductor/parallel_threads'
2
+
3
+ module HybridPlatformsConductor
4
+
5
+ module HpcPlugins
6
+
7
+ module Cmdb
8
+
9
+ # Get the host IP
10
+ class HostIp < HybridPlatformsConductor::Cmdb
11
+
12
+ include ParallelThreads
13
+
14
+ # get_* methods are automatically detected as possible metadata properties this plugin can fill.
15
+ # The property name filled by such method is given by the method's name: get_my_property will fill the :my_property metadata.
16
+ # The method get_others is used specifically to return properties whose name is unknown before fetching them.
17
+
18
+ # Return possible dependencies between properties.
19
+ # A property can need another property to be set before.
20
+ # For example an IP would need first to have the hostname to be known in order to be looked up.
21
+ # [API] - This method is optional
22
+ #
23
+ # Result::
24
+ # * Hash<Symbol, Symbol or Array<Symbol> >: The list of necessary properties (or single one) that should be set, per property name (:others can also be used here)
25
+ def property_dependencies
26
+ {
27
+ host_ip: :hostname
28
+ }
29
+ end
30
+
31
+ # Get a specific property for a given set of nodes.
32
+ # [API] - @platforms_handler can be used.
33
+ # [API] - @nodes_handler can be used.
34
+ # [API] - @cmd_runner can be used.
35
+ #
36
+ # Parameters::
37
+ # * *nodes* (Array<String>): The nodes to lookup the property for.
38
+ # * *metadata* (Hash<String, Hash<Symbol,Object> >): Existing metadata for each node. Dependent properties should be present here.
39
+ # Result::
40
+ # * Hash<String, Object>: The corresponding property, per required node.
41
+ # Nodes for which the property can't be fetched can be ommitted.
42
+ def get_host_ip(nodes, metadata)
43
+ updated_metadata = {}
44
+ # Get the list of nodes, per hostname (just in case several nodes share the same hostname)
45
+ # Hash<String, Array<String> >
46
+ hostnames = Hash.new { |hash, key| hash[key] = [] }
47
+ metadata.each do |node, node_metadata|
48
+ hostnames[node_metadata[:hostname]] << node if node_metadata[:hostname]
49
+ end
50
+ unless hostnames.empty?
51
+ ip_for(*hostnames.keys).each do |hostname, ip|
52
+ hostnames[hostname].each do |node|
53
+ updated_metadata[node] = ip
54
+ end
55
+ end
56
+ end
57
+ updated_metadata
58
+ end
59
+
60
+ private
61
+
62
+ # Timeout (in seconds) to use getent, per host
63
+ TIMEOUT_GETENT = 30
64
+ # Number of threads max to use for getent calls
65
+ MAX_THREADS_GETENT = 32
66
+
67
+ # Discover the real IPs associated to a list of hosts.
68
+ #
69
+ # Parameters::
70
+ # * *hosts* (Array<String>): The hosts to check for
71
+ # Result::
72
+ # * Hash<String, String or nil>: The corresponding IP (or nil if none), per host name
73
+ def ip_for(*hosts)
74
+ results = {}
75
+ log_debug "Get IPs of #{hosts.size} hosts..."
76
+ for_each_element_in(
77
+ hosts,
78
+ parallel: true,
79
+ nbr_threads_max: MAX_THREADS_GETENT,
80
+ progress: log_debug? ? 'Gather IPs' : nil
81
+ ) do |host|
82
+ _exit_status, stdout, _stderr = @cmd_runner.run_cmd(
83
+ "getent hosts #{host}",
84
+ timeout: TIMEOUT_GETENT,
85
+ log_to_stdout: log_debug?,
86
+ no_exception: true
87
+ )
88
+ ip = stdout.strip.split(/\s+/).first
89
+ if ip.nil?
90
+ log_warn "Host #{host} has no IP."
91
+ else
92
+ results[host] = ip
93
+ end
94
+ end
95
+ results
96
+ end
97
+
98
+ end
99
+
100
+ end
101
+
102
+ end
103
+
104
+ end
@@ -0,0 +1,114 @@
1
+ require 'hybrid_platforms_conductor/parallel_threads'
2
+
3
+ module HybridPlatformsConductor
4
+
5
+ module HpcPlugins
6
+
7
+ module Cmdb
8
+
9
+ # Get the needed host keys to nodes
10
+ class HostKeys < HybridPlatformsConductor::Cmdb
11
+
12
+ include ParallelThreads
13
+
14
+ # get_* methods are automatically detected as possible metadata properties this plugin can fill.
15
+ # The property name filled by such method is given by the method's name: get_my_property will fill the :my_property metadata.
16
+ # The method get_others is used specifically to return properties whose name is unknown before fetching them.
17
+
18
+ # Return possible dependencies between properties.
19
+ # A property can need another property to be set before.
20
+ # For example an IP would need first to have the hostname to be known in order to be looked up.
21
+ # [API] - This method is optional
22
+ #
23
+ # Result::
24
+ # * Hash<Symbol, Symbol or Array<Symbol> >: The list of necessary properties (or single one) that should be set, per property name (:others can also be used here)
25
+ def property_dependencies
26
+ {
27
+ host_keys: %i[hostname host_ip]
28
+ }
29
+ end
30
+
31
+ # Get a specific property for a given set of nodes.
32
+ # [API] - @platforms_handler can be used.
33
+ # [API] - @nodes_handler can be used.
34
+ # [API] - @cmd_runner can be used.
35
+ #
36
+ # Parameters::
37
+ # * *nodes* (Array<String>): The nodes to lookup the property for.
38
+ # * *metadata* (Hash<String, Hash<Symbol,Object> >): Existing metadata for each node. Dependent properties should be present here.
39
+ # Result::
40
+ # * Hash<String, Object>: The corresponding property, per required node.
41
+ # Nodes for which the property can't be fetched can be ommitted.
42
+ def get_host_keys(nodes, metadata)
43
+ updated_metadata = {}
44
+ # Get the list of nodes, per hostname (just in case several nodes share the same hostname)
45
+ # Hash<String, Array<String> >
46
+ hostnames = Hash.new { |hash, key| hash[key] = [] }
47
+ metadata.each do |node, node_metadata|
48
+ if node_metadata[:host_ip]
49
+ hostnames[node_metadata[:host_ip]] << node
50
+ elsif node_metadata[:hostname]
51
+ hostnames[node_metadata[:hostname]] << node
52
+ end
53
+ end
54
+ unless hostnames.empty?
55
+ host_keys_for(*hostnames.keys).each do |hostname, ip|
56
+ hostnames[hostname].each do |node|
57
+ updated_metadata[node] = ip
58
+ end
59
+ end
60
+ end
61
+ updated_metadata
62
+ end
63
+
64
+ private
65
+
66
+ # Timeout (in seconds) to use ssh-keyscan, per host
67
+ TIMEOUT_SSH_KEYSCAN = 30
68
+ # Number of threads max to use for ssh-keyscan calls
69
+ MAX_THREADS_SSH_KEY_SCAN = 32
70
+
71
+ # Discover the host keys associated to a list of hosts.
72
+ #
73
+ # Parameters::
74
+ # * *hosts* (Array<String>): The hosts to check for
75
+ # Result::
76
+ # * Hash<String, Array<String> >: The corresponding host keys, per host name
77
+ def host_keys_for(*hosts)
78
+ results = {}
79
+ log_debug "Get host keys of #{hosts.size} hosts..."
80
+ for_each_element_in(
81
+ hosts,
82
+ parallel: true,
83
+ nbr_threads_max: MAX_THREADS_SSH_KEY_SCAN,
84
+ progress: log_debug? ? 'Gather host keys' : nil
85
+ ) do |host|
86
+ exit_status, stdout, _stderr = @cmd_runner.run_cmd(
87
+ "ssh-keyscan #{host}",
88
+ timeout: TIMEOUT_SSH_KEYSCAN,
89
+ log_to_stdout: log_debug?,
90
+ no_exception: true
91
+ )
92
+ if exit_status == 0
93
+ found_keys = []
94
+ stdout.split("\n").each do |line|
95
+ unless line =~ /^# .*$/
96
+ _host, type, key = line.split(/\s+/)
97
+ found_keys << "#{type} #{key}"
98
+ end
99
+ end
100
+ results[host] = found_keys.sort unless found_keys.empty?
101
+ else
102
+ log_warn "Unable to get host key for #{host}. Ignoring it. Accessing #{host} might require manual acceptance of its host key."
103
+ end
104
+ end
105
+ results
106
+ end
107
+
108
+ end
109
+
110
+ end
111
+
112
+ end
113
+
114
+ end
@@ -0,0 +1,129 @@
1
+ module HybridPlatformsConductor
2
+
3
+ module HpcPlugins
4
+
5
+ module Cmdb
6
+
7
+ # Example of a CMDB plugin
8
+ class MyCmdb < HybridPlatformsConductor::Cmdb
9
+
10
+ # Are dependencies met before using this plugin?
11
+ # [API] - This method is optional
12
+ #
13
+ # Result::
14
+ # * Boolean: Are dependencies met before using this plugin?
15
+ def self.valid?
16
+ begin
17
+ @cmd_runner.run_cmd 'command -v getent'
18
+ rescue
19
+ false
20
+ end
21
+ true
22
+ end
23
+
24
+ # Add a Mixin to the DSL parsing the platforms configuration file.
25
+ # This can be used by any plugin to add plugin-specific configuration getters and setters, accessible later from NodesHandler instances.
26
+ # An optional initializer can also be given.
27
+ # [API] - Those calls are optional
28
+ module MyDSLExtension
29
+
30
+ attr_accessor :my_property
31
+
32
+ # Initialize the DSL
33
+ def init_my_dsl_extension
34
+ @my_property = 42
35
+ end
36
+
37
+ end
38
+ self.extend_config_dsl_with MyDSLExtension, :init_my_dsl_extension
39
+
40
+ # get_* methods are automatically detected as possible metadata properties this plugin can fill.
41
+ # The property name filled by such method is given by the method's name: get_my_property will fill the :my_property metadata.
42
+ # The method get_others is used specifically to return properties whose name is unknown before fetching them.
43
+
44
+ # Return possible dependencies between properties.
45
+ # A property can need another property to be set before.
46
+ # For example an IP would need first to have the hostname to be known in order to be looked up.
47
+ # [API] - This method is optional
48
+ #
49
+ # Result::
50
+ # * Hash<Symbol, Symbol or Array<Symbol> >: The list of necessary properties (or single one) that should be set, per property name (:others can also be used here)
51
+ def property_dependencies
52
+ {
53
+ ip: :hostname
54
+ }
55
+ end
56
+
57
+ # Get a specific property for a given set of nodes.
58
+ # [API] - @platforms_handler can be used.
59
+ # [API] - @nodes_handler can be used.
60
+ # [API] - @cmd_runner can be used.
61
+ #
62
+ # Parameters::
63
+ # * *nodes* (Array<String>): The nodes to lookup the property for.
64
+ # * *metadata* (Hash<String, Hash<Symbol,Object> >): Existing metadata for each node. Dependent properties should be present here.
65
+ # Result::
66
+ # * Hash<String, Object>: The corresponding property, per required node.
67
+ # Nodes for which the property can't be fetched can be ommitted.
68
+ def get_ip(nodes, metadata)
69
+ Hash[nodes.map do |node|
70
+ _exit_status, stdout = @cmd_runner.run_cmd "getent hosts #{metadata[node][:hostname]}"
71
+ [node, stdout.strip.split(/\s+/).first]
72
+ end]
73
+ end
74
+
75
+ # Get a specific property for a given set of nodes.
76
+ # [API] - @platforms_handler can be used.
77
+ # [API] - @nodes_handler can be used.
78
+ # [API] - @cmd_runner can be used.
79
+ #
80
+ # Parameters::
81
+ # * *nodes* (Array<String>): The nodes to lookup the property for.
82
+ # * *metadata* (Hash<String, Hash<Symbol,Object> >): Existing metadata for each node. Dependent properties should be present here.
83
+ # Result::
84
+ # * Hash<String, Object>: The corresponding property, per required node.
85
+ # Nodes for which the property can't be fetched can be ommitted.
86
+ def get_description(nodes, metadata)
87
+ descriptions = {}
88
+ nodes.each do |node|
89
+ # Let's say the description of a node is stored in a text file of the node's name
90
+ desc_file = "/path/to/descriptions/#{node}.txt"
91
+ descriptions[node] = File.read(desc_file) if File.exist?(desc_file)
92
+ end
93
+ descriptions
94
+ end
95
+
96
+ # Get other properties for a given set of nodes.
97
+ # It's better to not use this method and prefer using methods naming the property being returned.
98
+ # As the nodes_handler can't know in advance which properties will be returned, it will call it every time there is a missing property.
99
+ # If this method always returns the same values, it would be clever to cache it here.
100
+ # [API] - This method is optional.
101
+ # [API] - @platforms_handler can be used.
102
+ # [API] - @nodes_handler can be used.
103
+ # [API] - @cmd_runner can be used.
104
+ #
105
+ # Parameters::
106
+ # * *nodes* (Array<String>): The nodes to lookup the property for.
107
+ # * *metadata* (Hash<String, Hash<Symbol,Object> >): Existing metadata for each node. Dependent properties should be present here.
108
+ # Result::
109
+ # * Hash<String, Hash<Symbol,Object> >: The corresponding properties, per required node.
110
+ # Nodes for which the property can't be fetched can be ommitted.
111
+ def get_others(nodes, metadata)
112
+ Hash[nodes.map do |node|
113
+ [
114
+ node,
115
+ {
116
+ property1: 42,
117
+ property2: 666
118
+ }
119
+ ]
120
+ end]
121
+ end
122
+
123
+ end
124
+
125
+ end
126
+
127
+ end
128
+
129
+ end