hybrid_platforms_conductor 32.16.4 → 33.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (286) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +42 -0
  3. data/README.md +6 -3
  4. data/bin/check-node +0 -1
  5. data/bin/deploy +0 -1
  6. data/bin/get_impacted_nodes +0 -1
  7. data/bin/last_deploys +12 -8
  8. data/bin/nodes_to_deploy +6 -6
  9. data/bin/setup +6 -6
  10. data/bin/topograph +1 -1
  11. data/docs/config_dsl.md +45 -1
  12. data/docs/executables.md +6 -7
  13. data/docs/executables/check-node.md +3 -3
  14. data/docs/executables/deploy.md +3 -3
  15. data/docs/executables/dump_nodes_json.md +3 -3
  16. data/docs/executables/test.md +3 -3
  17. data/docs/executables/topograph.md +3 -3
  18. data/docs/gen/mermaid/README.md-0.png +0 -0
  19. data/docs/gen/mermaid/docs/executables/check-node.md-0.png +0 -0
  20. data/docs/gen/mermaid/docs/executables/deploy.md-0.png +0 -0
  21. data/docs/gen/mermaid/docs/executables/free_ips.md-0.png +0 -0
  22. data/docs/gen/mermaid/docs/executables/get_impacted_nodes.md-0.png +0 -0
  23. data/docs/gen/mermaid/docs/executables/last_deploys.md-0.png +0 -0
  24. data/docs/gen/mermaid/docs/executables/nodes_to_deploy.md-0.png +0 -0
  25. data/docs/gen/mermaid/docs/executables/report.md-0.png +0 -0
  26. data/docs/gen/mermaid/docs/executables/run.md-0.png +0 -0
  27. data/docs/gen/mermaid/docs/executables/ssh_config.md-0.png +0 -0
  28. data/docs/gen/mermaid/docs/executables/test.md-0.png +0 -0
  29. data/docs/plugins.md +47 -0
  30. data/docs/plugins/connector/ssh.md +1 -1
  31. data/docs/plugins/log/remote_fs.md +26 -0
  32. data/docs/plugins/secrets_reader/cli.md +31 -0
  33. data/docs/plugins/secrets_reader/thycotic.md +46 -0
  34. data/docs/plugins/test/bitbucket_conf.md +1 -1
  35. data/docs/plugins/test/check_deploy_and_idempotence.md +1 -1
  36. data/docs/plugins/test/connection.md +1 -0
  37. data/docs/plugins/test/deploy_removes_root_access.md +1 -1
  38. data/docs/plugins/test/file_system.md +1 -0
  39. data/docs/plugins/test/github_ci.md +48 -0
  40. data/docs/plugins/test/hostname.md +1 -0
  41. data/docs/plugins/test/ip.md +1 -0
  42. data/docs/plugins/test/jenkins_ci_conf.md +1 -1
  43. data/docs/plugins/test/jenkins_ci_masters_ok.md +1 -1
  44. data/docs/plugins/test/local_users.md +1 -0
  45. data/docs/plugins/test/mounts.md +1 -0
  46. data/docs/plugins/test/orphan_files.md +1 -0
  47. data/docs/plugins/test/ports.md +1 -0
  48. data/docs/plugins/test/spectre.md +1 -0
  49. data/docs/plugins/test/vulnerabilities.md +1 -0
  50. data/lib/hybrid_platforms_conductor/action.rb +4 -4
  51. data/lib/hybrid_platforms_conductor/actions_executor.rb +45 -43
  52. data/lib/hybrid_platforms_conductor/bitbucket.rb +5 -4
  53. data/lib/hybrid_platforms_conductor/cmd_runner.rb +13 -12
  54. data/lib/hybrid_platforms_conductor/cmdb.rb +2 -2
  55. data/lib/hybrid_platforms_conductor/common_config_dsl/bitbucket.rb +2 -1
  56. data/lib/hybrid_platforms_conductor/common_config_dsl/confluence.rb +2 -1
  57. data/lib/hybrid_platforms_conductor/common_config_dsl/file_system_tests.rb +5 -4
  58. data/lib/hybrid_platforms_conductor/common_config_dsl/github.rb +63 -0
  59. data/lib/hybrid_platforms_conductor/common_config_dsl/idempotence_tests.rb +2 -2
  60. data/lib/hybrid_platforms_conductor/config.rb +7 -4
  61. data/lib/hybrid_platforms_conductor/confluence.rb +1 -1
  62. data/lib/hybrid_platforms_conductor/connector.rb +5 -2
  63. data/lib/hybrid_platforms_conductor/core_extensions/symbol/zero.rb +24 -0
  64. data/lib/hybrid_platforms_conductor/credentials.rb +39 -36
  65. data/lib/hybrid_platforms_conductor/current_dir_monitor.rb +4 -1
  66. data/lib/hybrid_platforms_conductor/deployer.rb +275 -224
  67. data/lib/hybrid_platforms_conductor/executable.rb +20 -15
  68. data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/config.rb +10 -7
  69. data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/host_ip.rb +1 -1
  70. data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/host_keys.rb +2 -2
  71. data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/platform_handlers.rb +4 -4
  72. data/lib/hybrid_platforms_conductor/hpc_plugins/connector/local.rb +2 -0
  73. data/lib/hybrid_platforms_conductor/hpc_plugins/connector/ssh.rb +45 -49
  74. data/lib/hybrid_platforms_conductor/hpc_plugins/log/my_log_plugin.rb.sample +100 -0
  75. data/lib/hybrid_platforms_conductor/hpc_plugins/log/remote_fs.rb +180 -0
  76. data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/serverless_chef.rb +68 -66
  77. data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/serverless_chef/dsl_parser.rb +13 -0
  78. data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/serverless_chef/recipes_tree_builder.rb +39 -38
  79. data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/yaml_inventory.rb +5 -4
  80. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/docker.rb +43 -45
  81. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/podman.rb +18 -20
  82. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/proxmox.rb +118 -117
  83. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/proxmox/proxmox_waiter.rb +39 -43
  84. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/proxmox/reserve_proxmox_container +9 -13
  85. data/lib/hybrid_platforms_conductor/hpc_plugins/report/confluence.rb +2 -2
  86. data/lib/hybrid_platforms_conductor/hpc_plugins/report/mediawiki.rb +28 -21
  87. data/lib/hybrid_platforms_conductor/hpc_plugins/report/stdout.rb +26 -22
  88. data/lib/hybrid_platforms_conductor/hpc_plugins/secrets_reader/cli.rb +77 -0
  89. data/lib/hybrid_platforms_conductor/hpc_plugins/secrets_reader/my_secrets_reader_plugin.rb.sample +46 -0
  90. data/lib/hybrid_platforms_conductor/hpc_plugins/secrets_reader/thycotic.rb +90 -0
  91. data/lib/hybrid_platforms_conductor/hpc_plugins/test/bitbucket_conf.rb +3 -3
  92. data/lib/hybrid_platforms_conductor/hpc_plugins/test/check_deploy_and_idempotence.rb +4 -2
  93. data/lib/hybrid_platforms_conductor/hpc_plugins/test/connection.rb +3 -1
  94. data/lib/hybrid_platforms_conductor/hpc_plugins/test/deploy_freshness.rb +7 -21
  95. data/lib/hybrid_platforms_conductor/hpc_plugins/test/deploy_removes_root_access.rb +21 -19
  96. data/lib/hybrid_platforms_conductor/hpc_plugins/test/divergence.rb +2 -2
  97. data/lib/hybrid_platforms_conductor/hpc_plugins/test/executables.rb +2 -2
  98. data/lib/hybrid_platforms_conductor/hpc_plugins/test/file_system.rb +21 -22
  99. data/lib/hybrid_platforms_conductor/hpc_plugins/test/file_system_hdfs.rb +19 -21
  100. data/lib/hybrid_platforms_conductor/hpc_plugins/test/github_ci.rb +31 -0
  101. data/lib/hybrid_platforms_conductor/hpc_plugins/test/hostname.rb +3 -1
  102. data/lib/hybrid_platforms_conductor/hpc_plugins/test/idempotence.rb +2 -2
  103. data/lib/hybrid_platforms_conductor/hpc_plugins/test/ip.rb +4 -2
  104. data/lib/hybrid_platforms_conductor/hpc_plugins/test/jenkins_ci_conf.rb +21 -22
  105. data/lib/hybrid_platforms_conductor/hpc_plugins/test/jenkins_ci_masters_ok.rb +10 -12
  106. data/lib/hybrid_platforms_conductor/hpc_plugins/test/linear_strategy.rb +9 -9
  107. data/lib/hybrid_platforms_conductor/hpc_plugins/test/local_users.rb +5 -3
  108. data/lib/hybrid_platforms_conductor/hpc_plugins/test/mounts.rb +5 -3
  109. data/lib/hybrid_platforms_conductor/hpc_plugins/test/orphan_files.rb +13 -10
  110. data/lib/hybrid_platforms_conductor/hpc_plugins/test/ports.rb +5 -3
  111. data/lib/hybrid_platforms_conductor/hpc_plugins/test/private_ips.rb +5 -5
  112. data/lib/hybrid_platforms_conductor/hpc_plugins/test/public_ips.rb +5 -5
  113. data/lib/hybrid_platforms_conductor/hpc_plugins/test/spectre.rb +7 -7
  114. data/lib/hybrid_platforms_conductor/hpc_plugins/test/veids.rb +3 -3
  115. data/lib/hybrid_platforms_conductor/hpc_plugins/test/vulnerabilities.rb +27 -25
  116. data/lib/hybrid_platforms_conductor/hpc_plugins/test_report/confluence.rb +2 -2
  117. data/lib/hybrid_platforms_conductor/hpc_plugins/test_report/stdout.rb +8 -6
  118. data/lib/hybrid_platforms_conductor/io_router.rb +14 -13
  119. data/lib/hybrid_platforms_conductor/json_dumper.rb +2 -2
  120. data/lib/hybrid_platforms_conductor/log.rb +31 -0
  121. data/lib/hybrid_platforms_conductor/logger_helpers.rb +19 -16
  122. data/lib/hybrid_platforms_conductor/nodes_handler.rb +89 -71
  123. data/lib/hybrid_platforms_conductor/parallel_threads.rb +7 -11
  124. data/lib/hybrid_platforms_conductor/platform_handler.rb +7 -7
  125. data/lib/hybrid_platforms_conductor/platforms_handler.rb +5 -3
  126. data/lib/hybrid_platforms_conductor/plugin.rb +2 -2
  127. data/lib/hybrid_platforms_conductor/plugins.rb +14 -8
  128. data/lib/hybrid_platforms_conductor/provisioner.rb +4 -4
  129. data/lib/hybrid_platforms_conductor/report.rb +2 -2
  130. data/lib/hybrid_platforms_conductor/reports_handler.rb +3 -2
  131. data/lib/hybrid_platforms_conductor/secrets_reader.rb +31 -0
  132. data/lib/hybrid_platforms_conductor/services_handler.rb +32 -29
  133. data/lib/hybrid_platforms_conductor/test_only_remote_node.rb +18 -0
  134. data/lib/hybrid_platforms_conductor/test_report.rb +15 -18
  135. data/lib/hybrid_platforms_conductor/tests_runner.rb +116 -118
  136. data/lib/hybrid_platforms_conductor/thycotic.rb +28 -19
  137. data/lib/hybrid_platforms_conductor/topographer.rb +200 -190
  138. data/lib/hybrid_platforms_conductor/topographer/plugins/graphviz.rb +8 -8
  139. data/lib/hybrid_platforms_conductor/topographer/plugins/json.rb +4 -4
  140. data/lib/hybrid_platforms_conductor/version.rb +1 -1
  141. data/spec/hybrid_platforms_conductor_test.rb +33 -12
  142. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/bash_spec.rb +16 -11
  143. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/interactive_spec.rb +1 -1
  144. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/remote_bash_spec.rb +23 -18
  145. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/ruby_spec.rb +67 -49
  146. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/scp_spec.rb +20 -14
  147. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions_spec.rb +63 -50
  148. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connection_spec.rb +35 -35
  149. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/local/connectable_nodes_spec.rb +12 -8
  150. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/local/remote_actions_spec.rb +4 -7
  151. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/cli_options_spec.rb +21 -22
  152. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/config_dsl_spec.rb +23 -24
  153. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/connectable_nodes_spec.rb +10 -6
  154. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/connections_spec.rb +73 -54
  155. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/global_helpers_spec.rb +145 -126
  156. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/node_helpers_spec.rb +3 -3
  157. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/remote_actions_spec.rb +29 -25
  158. data/spec/hybrid_platforms_conductor_test/api/actions_executor/logging_spec.rb +106 -91
  159. data/spec/hybrid_platforms_conductor_test/api/actions_executor/parallel_spec.rb +272 -244
  160. data/spec/hybrid_platforms_conductor_test/api/actions_executor/timeout_spec.rb +10 -12
  161. data/spec/hybrid_platforms_conductor_test/api/cmd_runner_spec.rb +36 -36
  162. data/spec/hybrid_platforms_conductor_test/api/config_spec.rb +24 -22
  163. data/spec/hybrid_platforms_conductor_test/api/deployer/check_spec.rb +4 -2
  164. data/spec/hybrid_platforms_conductor_test/api/deployer/config_dsl_spec.rb +43 -5
  165. data/spec/hybrid_platforms_conductor_test/api/deployer/deploy_spec.rb +199 -216
  166. data/spec/hybrid_platforms_conductor_test/api/deployer/log_plugins/remote_fs_spec.rb +223 -0
  167. data/spec/hybrid_platforms_conductor_test/api/deployer/parse_deploy_output_spec.rb +55 -59
  168. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioner_spec.rb +36 -62
  169. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/podman_spec.rb +17 -17
  170. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/config_dsl_spec.rb +4 -4
  171. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/create_spec.rb +44 -51
  172. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/destroy_spec.rb +3 -3
  173. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/ip_spec.rb +12 -16
  174. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/destroy_vm_spec.rb +31 -19
  175. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/expired_containers_spec.rb +324 -266
  176. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/ips_assignment_spec.rb +89 -61
  177. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/other_lxc_containers_resources_spec.rb +117 -93
  178. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/pve_node_resources_spec.rb +71 -54
  179. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/retries_spec.rb +10 -8
  180. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/vm_ids_assignment_spec.rb +80 -60
  181. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/start_spec.rb +1 -1
  182. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/state_spec.rb +1 -1
  183. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/stop_spec.rb +1 -1
  184. data/spec/hybrid_platforms_conductor_test/api/deployer/secrets_reader_plugins/cli_spec.rb +64 -0
  185. data/spec/hybrid_platforms_conductor_test/api/deployer/secrets_reader_plugins/thycotic_spec.rb +268 -0
  186. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/config_spec.rb +8 -10
  187. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/host_ip_spec.rb +33 -24
  188. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/host_keys_spec.rb +64 -51
  189. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/platform_handlers_spec.rb +3 -3
  190. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs_plugins_api_spec.rb +50 -51
  191. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/common_spec.rb +91 -81
  192. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/config_dsl_spec.rb +14 -16
  193. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/git_diff_impacts_spec.rb +51 -75
  194. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/nodes_selectors_spec.rb +35 -26
  195. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/platform_handlers_plugins_api_spec.rb +24 -16
  196. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/several_platforms_spec.rb +29 -19
  197. data/spec/hybrid_platforms_conductor_test/api/platform_handler_spec.rb +4 -4
  198. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/config_dsl_spec.rb +2 -2
  199. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/deploy_output_parsing_spec.rb +6 -6
  200. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/diff_impacts_spec.rb +57 -99
  201. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/inventory_spec.rb +4 -4
  202. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/packaging_spec.rb +32 -35
  203. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/services_deployment_spec.rb +10 -10
  204. data/spec/hybrid_platforms_conductor_test/api/platforms_handler_spec.rb +38 -27
  205. data/spec/hybrid_platforms_conductor_test/api/plugins_spec.rb +46 -52
  206. data/spec/hybrid_platforms_conductor_test/api/reports_handler_spec.rb +2 -2
  207. data/spec/hybrid_platforms_conductor_test/api/services_handler/actions_to_deploy_spec.rb +90 -58
  208. data/spec/hybrid_platforms_conductor_test/api/services_handler/deploy_allowed_spec.rb +38 -34
  209. data/spec/hybrid_platforms_conductor_test/api/services_handler/log_info_spec.rb +11 -9
  210. data/spec/hybrid_platforms_conductor_test/api/services_handler/package_spec.rb +193 -171
  211. data/spec/hybrid_platforms_conductor_test/api/services_handler/parse_deploy_output_spec.rb +66 -54
  212. data/spec/hybrid_platforms_conductor_test/api/services_handler/prepare_for_deploy_spec.rb +147 -133
  213. data/spec/hybrid_platforms_conductor_test/api/tests_runner/common_spec.rb +69 -49
  214. data/spec/hybrid_platforms_conductor_test/api/tests_runner/global_spec.rb +5 -4
  215. data/spec/hybrid_platforms_conductor_test/api/tests_runner/node_check_spec.rb +8 -5
  216. data/spec/hybrid_platforms_conductor_test/api/tests_runner/node_spec.rb +8 -5
  217. data/spec/hybrid_platforms_conductor_test/api/tests_runner/node_ssh_spec.rb +30 -27
  218. data/spec/hybrid_platforms_conductor_test/api/tests_runner/platform_spec.rb +12 -9
  219. data/spec/hybrid_platforms_conductor_test/api/tests_runner/reports_spec.rb +48 -47
  220. data/spec/hybrid_platforms_conductor_test/api/tests_runner/test_plugins/bitbucket_conf_spec.rb +5 -5
  221. data/spec/hybrid_platforms_conductor_test/api/tests_runner/test_plugins/github_ci_spec.rb +72 -0
  222. data/spec/hybrid_platforms_conductor_test/api/tests_runner/test_reports_plugins/confluence_spec.rb +5 -5
  223. data/spec/hybrid_platforms_conductor_test/cmdb_plugins/test_cmdb.rb +9 -9
  224. data/spec/hybrid_platforms_conductor_test/cmdb_plugins/{test_cmdb2.rb → test_cmdb_2.rb} +6 -6
  225. data/spec/hybrid_platforms_conductor_test/cmdb_plugins/test_cmdb_others.rb +3 -3
  226. data/spec/hybrid_platforms_conductor_test/cmdb_plugins/{test_cmdb_others2.rb → test_cmdb_others_2.rb} +2 -2
  227. data/spec/hybrid_platforms_conductor_test/docs_spec.rb +1 -1
  228. data/spec/hybrid_platforms_conductor_test/executables/{check-node_spec.rb → check_node_spec.rb} +4 -6
  229. data/spec/hybrid_platforms_conductor_test/executables/deploy_spec.rb +4 -6
  230. data/spec/hybrid_platforms_conductor_test/executables/get_impacted_nodes_spec.rb +76 -77
  231. data/spec/hybrid_platforms_conductor_test/executables/last_deploys_spec.rb +159 -113
  232. data/spec/hybrid_platforms_conductor_test/executables/nodes_to_deploy_spec.rb +299 -160
  233. data/spec/hybrid_platforms_conductor_test/executables/options/actions_executor_spec.rb +4 -6
  234. data/spec/hybrid_platforms_conductor_test/executables/options/cmd_runner_spec.rb +3 -5
  235. data/spec/hybrid_platforms_conductor_test/executables/options/common_spec.rb +8 -8
  236. data/spec/hybrid_platforms_conductor_test/executables/options/deployer_spec.rb +12 -196
  237. data/spec/hybrid_platforms_conductor_test/executables/options/nodes_handler_spec.rb +9 -10
  238. data/spec/hybrid_platforms_conductor_test/executables/options/nodes_selectors_spec.rb +9 -10
  239. data/spec/hybrid_platforms_conductor_test/executables/options/reports_handler_spec.rb +1 -1
  240. data/spec/hybrid_platforms_conductor_test/executables/options/tests_runner_spec.rb +22 -22
  241. data/spec/hybrid_platforms_conductor_test/executables/report_spec.rb +22 -16
  242. data/spec/hybrid_platforms_conductor_test/executables/run_spec.rb +32 -32
  243. data/spec/hybrid_platforms_conductor_test/executables/ssh_config_spec.rb +7 -9
  244. data/spec/hybrid_platforms_conductor_test/executables/test_spec.rb +3 -5
  245. data/spec/hybrid_platforms_conductor_test/helpers/actions_executor_helpers.rb +2 -2
  246. data/spec/hybrid_platforms_conductor_test/helpers/cmd_runner_helpers.rb +4 -3
  247. data/spec/hybrid_platforms_conductor_test/helpers/cmdb_helpers.rb +2 -2
  248. data/spec/hybrid_platforms_conductor_test/helpers/config_helpers.rb +1 -1
  249. data/spec/hybrid_platforms_conductor_test/helpers/connector_ssh_helpers.rb +12 -13
  250. data/spec/hybrid_platforms_conductor_test/helpers/deployer_helpers.rb +245 -56
  251. data/spec/hybrid_platforms_conductor_test/helpers/executables_helpers.rb +11 -11
  252. data/spec/hybrid_platforms_conductor_test/helpers/nodes_handler_helpers.rb +1 -1
  253. data/spec/hybrid_platforms_conductor_test/helpers/platforms_handler_helpers.rb +39 -28
  254. data/spec/hybrid_platforms_conductor_test/helpers/plugins_helpers.rb +1 -1
  255. data/spec/hybrid_platforms_conductor_test/helpers/provisioner_proxmox_helpers.rb +86 -111
  256. data/spec/hybrid_platforms_conductor_test/helpers/reports_handler_helpers.rb +1 -1
  257. data/spec/hybrid_platforms_conductor_test/helpers/serverless_chef_helpers.rb +3 -3
  258. data/spec/hybrid_platforms_conductor_test/helpers/services_handler_helpers.rb +1 -1
  259. data/spec/hybrid_platforms_conductor_test/helpers/tests_runner_helpers.rb +1 -1
  260. data/spec/hybrid_platforms_conductor_test/mocked_lib/my_test_gem/hpc_plugins/test_plugin_type/{test_plugin_id1.rb → test_plugin_id_1.rb} +0 -0
  261. data/spec/hybrid_platforms_conductor_test/mocked_lib/my_test_gem/hpc_plugins/test_plugin_type/{test_plugin_id2.rb → test_plugin_id_2.rb} +0 -0
  262. data/spec/hybrid_platforms_conductor_test/mocked_lib/my_test_gem2/sub_dir/hpc_plugins/test_plugin_type/{test_plugin_id3.rb → test_plugin_id_3.rb} +0 -0
  263. data/spec/hybrid_platforms_conductor_test/mocked_lib/my_test_gem2/sub_dir/hpc_plugins/{test_plugin_type2/test_plugin_id4.rb → test_plugin_type_2/test_plugin_id_4.rb} +0 -0
  264. data/spec/hybrid_platforms_conductor_test/platform_handler_plugins/test.rb +1 -1
  265. data/spec/hybrid_platforms_conductor_test/platform_handler_plugins/{test2.rb → test_2.rb} +0 -0
  266. data/spec/hybrid_platforms_conductor_test/rubocop_spec.rb +31 -0
  267. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/1_node/nodes/node.json +3 -3
  268. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/data_bags/nodes/node.json +3 -3
  269. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/recipes/cookbooks/test_cookbook_2/libraries/default.rb +1 -0
  270. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/several_cookbooks/other_cookbooks/test_cookbook_2/libraries/default.rb +1 -0
  271. data/spec/hybrid_platforms_conductor_test/shared_examples/deployer.rb +952 -0
  272. data/spec/hybrid_platforms_conductor_test/test_connector.rb +3 -3
  273. data/spec/hybrid_platforms_conductor_test/test_log_no_read_plugin.rb +84 -0
  274. data/spec/hybrid_platforms_conductor_test/test_log_plugin.rb +105 -0
  275. data/spec/hybrid_platforms_conductor_test/test_plugins/global.rb +1 -0
  276. data/spec/hybrid_platforms_conductor_test/test_plugins/node.rb +1 -0
  277. data/spec/hybrid_platforms_conductor_test/test_plugins/node_check.rb +1 -0
  278. data/spec/hybrid_platforms_conductor_test/test_plugins/platform.rb +1 -0
  279. data/spec/hybrid_platforms_conductor_test/test_plugins/several_checks.rb +2 -2
  280. data/spec/hybrid_platforms_conductor_test/test_secrets_reader_plugin.rb +45 -0
  281. data/spec/hybrid_platforms_conductor_test/tests_report_plugin.rb +5 -6
  282. data/spec/spec_helper.rb +17 -18
  283. data/tools/check_md +16 -20
  284. data/tools/generate_mermaid +1 -1
  285. metadata +82 -13
  286. data/spec/hybrid_platforms_conductor_test/helpers/deployer_test_helpers.rb +0 -916
data/docs/plugins.md CHANGED
@@ -10,9 +10,11 @@ Following are all possible plugin types and the plugins shipped by default with
10
10
  * [`action`](#action)
11
11
  * [`cmdb`](#cmdb)
12
12
  * [`connector`](#connector)
13
+ * [`log`](#log)
13
14
  * [`platform_handler`](#platform_handler)
14
15
  * [`provisioner`](#provisioner)
15
16
  * [`report`](#report)
17
+ * [`secrets_reader`](#secrets_reader)
16
18
  * [`test`](#test)
17
19
  * [`test_report`](#test_report)
18
20
 
@@ -79,6 +81,30 @@ Plugins shipped by default:
79
81
  * [`local`](plugins/connector/local.md)
80
82
  * [`ssh`](plugins/connector/ssh.md)
81
83
 
84
+ <a name="log"></a>
85
+ ## Logs
86
+
87
+ Save deployment logs to a given medium (files, log servers...).
88
+
89
+ Corresponding plugin type: `log`.
90
+
91
+ These plugins give ways for the [`Deployer`](../lib/hybrid_platforms_conductor/deployer.rb) to save logs output from services deployments on nodes.
92
+ Information that can be saved is:
93
+ * The deployment stdout.
94
+ * The deployment stderr.
95
+ * The deployment exit status.
96
+ * The list of services that have been deployed.
97
+ * Some deployment metadata (like git commits information that have been deployed).
98
+
99
+ Examples of log plugins are:
100
+ * Remote file system: Save logs on the node's remote file system (useful for local debugging).
101
+ * Log servers: Send logs to log servers.
102
+
103
+ Check the [sample plugin file](../lib/hybrid_platforms_conductor/hpc_plugins/log/my_log_plugin.rb.sample) to know more about the API that needs to be implemented by such plugins.
104
+
105
+ Plugins shipped by default:
106
+ * [`remote_fs`](plugins/log/remote_fs.md)
107
+
82
108
  <a name="platform_handler"></a>
83
109
  ## Platform Handlers
84
110
 
@@ -152,6 +178,26 @@ Plugins shipped by default:
152
178
  * [`mediawiki`](plugins/report/mediawiki.md)
153
179
  * [`stdout`](plugins/report/stdout.md)
154
180
 
181
+ <a name="secrets_reader"></a>
182
+ ## Secrets readers
183
+
184
+ Secrets reader are responsible for fetching secrets (passwords, private keys, API tokens...) needed during deployment from various sources (command line, environment, vaults, secrets servers...).
185
+
186
+ Corresponding plugin type: `secrets_reader`.
187
+
188
+ These plugins add new ways to retrieve secrets used by the [`Deployer`](../lib/hybrid_platforms_conductor/deployer.rb)
189
+
190
+ Examples of secrets readers are:
191
+ * Command-line: Give secrets from a local file.
192
+ * Vault: Get secrets from vaults (encrypted databases).
193
+ * Secrets servers: Query secrets servers to retrieve secrets.
194
+
195
+ Check the [sample plugin file](../lib/hybrid_platforms_conductor/hpc_plugins/secrets_reader/my_secrets_reader_plugin.rb.sample) to know more about the API that needs to be implemented by such plugins.
196
+
197
+ Plugins shipped by default:
198
+ * [`cli`](plugins/secrets_reader/cli.md)
199
+ * [`thycotic`](plugins/secrets_reader/thycotic.md)
200
+
155
201
  <a name="test"></a>
156
202
  ## Tests
157
203
 
@@ -182,6 +228,7 @@ Plugins shipped by default:
182
228
  * [`executables`](plugins/test/executables.md)
183
229
  * [`file_system_hdfs`](plugins/test/file_system_hdfs.md)
184
230
  * [`file_system`](plugins/test/file_system.md)
231
+ * [`github_ci`](plugins/test/github_ci.md)
185
232
  * [`hostname`](plugins/test/hostname.md)
186
233
  * [`idempotence`](plugins/test/idempotence.md)
187
234
  * [`ip`](plugins/test/ip.md)
@@ -70,7 +70,7 @@ end
70
70
  | `host_keys` | `Array<String>` | The node's host keys used to generate a `known_hosts` file with those to avoid user confirmations when connecting. |
71
71
  | `hostname` | `String` | Host name used to connect in case no IP address can be found in metadata. |
72
72
  | `private_ips` | `Array<String>` | IP list to connect in case `host_ip` is not defined in metadata. |
73
- | `ssh_session_exec` | `String` | If set to the string `false`, then consider that the node does not have any SSH SessionExec capabilities. This will make sure that remote command executions is done using stdin piping on interactive sessions instead of SSH commands execution. |
73
+ | `ssh_session_exec` | `Boolean` | If set to `false`, then consider that the node does not have any SSH SessionExec capabilities. This will make sure that remote command executions is done using stdin piping on interactive sessions instead of SSH commands execution. |
74
74
 
75
75
  ## Used environment variables
76
76
 
@@ -0,0 +1,26 @@
1
+ # Log plugin: `remote_fs`
2
+
3
+ The `remote_fs` log plugin saves deployment logs in each remote node that has been deployed, in the `/var/log/deployments` directory.
4
+
5
+ ## Config DSL extension
6
+
7
+ None
8
+
9
+ ## Used credentials
10
+
11
+ | Credential | Usage
12
+ | --- | --- |
13
+
14
+ ## Used Metadata
15
+
16
+ | Metadata | Type | Usage
17
+ | --- | --- | --- |
18
+
19
+ ## Used environment variables
20
+
21
+ | Variable | Usage
22
+ | --- | --- |
23
+
24
+ ## External tools dependencies
25
+
26
+ None
@@ -0,0 +1,31 @@
1
+ # Secrets reader plugin: `cli`
2
+
3
+ The `cli` secrets reader plugin reads secrets from a local JSON file that can be given through the `--secrets` command-line parameter.
4
+
5
+ Example:
6
+ ```bash
7
+ ./bin/deploy --node my_node --secrets /path/to/my_secrets.json
8
+ ```
9
+
10
+ ## Config DSL extension
11
+
12
+ None
13
+
14
+ ## Used credentials
15
+
16
+ | Credential | Usage
17
+ | --- | --- |
18
+
19
+ ## Used Metadata
20
+
21
+ | Metadata | Type | Usage
22
+ | --- | --- | --- |
23
+
24
+ ## Used environment variables
25
+
26
+ | Variable | Usage
27
+ | --- | --- |
28
+
29
+ ## External tools dependencies
30
+
31
+ None
@@ -0,0 +1,46 @@
1
+ # Secrets reader plugin: `thycotic`
2
+
3
+ The `thycotic` secrets reader plugin retrieves secrets from a [Thycotic secrets server](https://thycotic.com/products/secret-server-vdo/), using its SOAP API.
4
+
5
+ It is configured using the `secrets_from_thycotic` (see below) config DSL and uses the `thycotic` credential ID to authenticate.
6
+
7
+ ## Config DSL extension
8
+
9
+ ### `secrets_from_thycotic`
10
+
11
+ Define a Thycotic URL and Thycotic secret ID to fetch from a Thycotic server.
12
+ The Thycotic secret should contain a JSON file that will be retrieved locally to be used as a secrets source. The local copy will then be removed after deployment.
13
+
14
+ Can be applied to subset of nodes using the [`for_nodes` DSL method](/docs/config_dsl.md#for_nodes).
15
+
16
+ It takes the following parameters:
17
+ * **thycotic_url** (`String`): The Thycotic server URL.
18
+ * **secret_id** (`Integer`): The Thycotic secret ID containing the secrets file to be used as secrets.
19
+
20
+ Example:
21
+ ```ruby
22
+ secrets_from_thycotic(
23
+ thycotic_url: 'https://my-thycotic-server.my-domain.com/SecretServer',
24
+ secret_id: 1107
25
+ )
26
+ ```
27
+
28
+ ## Used credentials
29
+
30
+ | Credential | Usage
31
+ | --- | --- |
32
+ | `thycotic` | Used to authenticate on the Thycotic server's SOAP API |
33
+
34
+ ## Used Metadata
35
+
36
+ | Metadata | Type | Usage
37
+ | --- | --- | --- |
38
+
39
+ ## Used environment variables
40
+
41
+ | Variable | Usage
42
+ | --- | --- |
43
+
44
+ ## External tools dependencies
45
+
46
+ None
@@ -12,7 +12,7 @@ Define a Bitbucket installation to be targeted.
12
12
  It takes the following parameters:
13
13
  * **url** (`String`): URL to the Bitbucket server
14
14
  * **project** (`String`): Project name from the Bitbucket server, storing repositories
15
- * **repos** (`Array<String>` or `Symbol`): List of repository names from this project, or :all for all [default: :all]
15
+ * **repos** (`Array<String>` or `Symbol`): List of repository names from this project, or `:all` for all [default: `:all`]
16
16
  * **checks** (`Hash<Symbol, Object>`): Checks definition to be perform on those repositories [default: {}]
17
17
  * **branch_permissions** (`Array< Hash<Symbol, Object> >`): List of branch permissions to check [optional]
18
18
  * **type** (`String`): Type of branch permissions to check. Examples of values are 'fast-forward-only', 'no-deletes', 'pull-request-only'.
@@ -49,7 +49,7 @@ end
49
49
 
50
50
  | Metadata | Type | Usage
51
51
  | --- | --- | --- |
52
- | `root_access_allowed` | `String` | If set to `true`, then skip the test for `root` access being disabled after deployment |
52
+ | `root_access_allowed` | `Boolean` | If set to `true`, then skip the test for `root` access being disabled after deployment |
53
53
 
54
54
  ## Used environment variables
55
55
 
@@ -16,6 +16,7 @@ None
16
16
 
17
17
  | Metadata | Type | Usage
18
18
  | --- | --- | --- |
19
+ | `local_node` | `Boolean` | Skip this test for nodes having this metadata set to `true` |
19
20
 
20
21
  ## Used environment variables
21
22
 
@@ -17,7 +17,7 @@ None
17
17
 
18
18
  | Metadata | Type | Usage
19
19
  | --- | --- | --- |
20
- | `root_access_allowed` | `String` | If set to `true`, then skip this test |
20
+ | `root_access_allowed` | `Boolean` | If set to `true`, then skip this test |
21
21
 
22
22
  ## Used environment variables
23
23
 
@@ -38,6 +38,7 @@ end
38
38
 
39
39
  | Metadata | Type | Usage
40
40
  | --- | --- | --- |
41
+ | `local_node` | `Boolean` | Skip this test for nodes having this metadata set to `true` |
41
42
 
42
43
  ## Used environment variables
43
44
 
@@ -0,0 +1,48 @@
1
+ # Test plugin: `github_ci`
2
+
3
+ The `github_ci` test plugin checks that the `master` branch of Github repositories has a successful CI result from its [Github Actions](https://github.com/features/actions).
4
+
5
+ ## Config DSL extension
6
+
7
+ ### `github_repos`
8
+
9
+ Define Github repositories to be targeted.
10
+
11
+ It takes the following parameters:
12
+ * **url** (`String`): URL to the Github API [default: `'https://api.github.com'`]
13
+ * **user** (`String`): User or organization name, storing repositories
14
+ * **repos** (`Array<String>` or `Symbol`): List of repository names from this project, or `:all` for all [default: `:all`]
15
+
16
+ Example:
17
+ ```ruby
18
+ github_repos(
19
+ # Github's user containing repositories
20
+ user: 'My-Github-User',
21
+ # List of repositories to check
22
+ repos: [
23
+ 'my-platform-repo',
24
+ 'my-chef-repo',
25
+ 'my-hpc-plugins'
26
+ ]
27
+ )
28
+ ```
29
+
30
+ ## Used credentials
31
+
32
+ | Credential | Usage
33
+ | --- | --- |
34
+ | `github` | Used to connect to the Github API. Password should be the Github API token. |
35
+
36
+ ## Used Metadata
37
+
38
+ | Metadata | Type | Usage
39
+ | --- | --- | --- |
40
+
41
+ ## Used environment variables
42
+
43
+ | Variable | Usage
44
+ | --- | --- |
45
+
46
+ ## External tools dependencies
47
+
48
+ None
@@ -16,6 +16,7 @@ None
16
16
 
17
17
  | Metadata | Type | Usage
18
18
  | --- | --- | --- |
19
+ | `local_node` | `Boolean` | Skip this test for nodes having this metadata set to `true` |
19
20
 
20
21
  ## Used environment variables
21
22
 
@@ -16,6 +16,7 @@ None
16
16
 
17
17
  | Metadata | Type | Usage
18
18
  | --- | --- | --- |
19
+ | `local_node` | `Boolean` | Skip this test for nodes having this metadata set to `true` |
19
20
  | `private_ips` | `Array<String>` | List of possible private IPs the node should have |
20
21
 
21
22
  ## Used environment variables
@@ -12,7 +12,7 @@ It takes the following parameters:
12
12
  * **url** (`String`): URL to the Bitbucket server
13
13
  * **project** (`String`): Project name from the Bitbucket server, storing repositories
14
14
  * **jenkins_ci_url** (`String` or `nil`): Corresponding Jenkins CI URL, or nil if none.
15
- * **repos** (`Array<String>` or `Symbol`): List of repository names from this project, or :all for all [default: :all]
15
+ * **repos** (`Array<String>` or `Symbol`): List of repository names from this project, or `:all` for all [default: `:all`]
16
16
 
17
17
  Example:
18
18
  ```ruby
@@ -12,7 +12,7 @@ It takes the following parameters:
12
12
  * **url** (`String`): URL to the Bitbucket server
13
13
  * **project** (`String`): Project name from the Bitbucket server, storing repositories
14
14
  * **jenkins_ci_url** (`String` or `nil`): Corresponding Jenkins CI URL, or nil if none.
15
- * **repos** (`Array<String>` or `Symbol`): List of repository names from this project, or :all for all [default: :all]
15
+ * **repos** (`Array<String>` or `Symbol`): List of repository names from this project, or `:all` for all [default: `:all`]
16
16
 
17
17
  Example:
18
18
  ```ruby
@@ -37,6 +37,7 @@ check_local_users_do_not_exist %w[olduser1 olduser2]
37
37
 
38
38
  | Metadata | Type | Usage
39
39
  | --- | --- | --- |
40
+ | `local_node` | `Boolean` | Skip this test for nodes having this metadata set to `true` |
40
41
 
41
42
  ## Used environment variables
42
43
 
@@ -44,6 +44,7 @@ end
44
44
 
45
45
  | Metadata | Type | Usage
46
46
  | --- | --- | --- |
47
+ | `local_node` | `Boolean` | Skip this test for nodes having this metadata set to `true` |
47
48
 
48
49
  ## Used environment variables
49
50
 
@@ -27,6 +27,7 @@ end
27
27
 
28
28
  | Metadata | Type | Usage
29
29
  | --- | --- | --- |
30
+ | `local_node` | `Boolean` | Skip this test for nodes having this metadata set to `true` |
30
31
 
31
32
  ## Used environment variables
32
33
 
@@ -39,6 +39,7 @@ check_closed_ports 25, 110
39
39
  | Metadata | Type | Usage
40
40
  | --- | --- | --- |
41
41
  | `host_ip` | `String` | Host IP address to be tested for port listening |
42
+ | `local_node` | `Boolean` | Skip this test for nodes having this metadata set to `true` |
42
43
 
43
44
  ## Used environment variables
44
45
 
@@ -15,6 +15,7 @@ None
15
15
 
16
16
  | Metadata | Type | Usage
17
17
  | --- | --- | --- |
18
+ | `local_node` | `Boolean` | Skip this test for nodes having this metadata set to `true` |
18
19
 
19
20
  ## Used environment variables
20
21
 
@@ -54,6 +54,7 @@ None
54
54
  | Metadata | Type | Usage
55
55
  | --- | --- | --- |
56
56
  | `image` | `String` | The name of the OS image to be used. The [configuration](../../config_dsl.md) should define the image and point it to a directory containing a `oval.json` that will contain definition of OVAL files to be checked for this OS(see above). |
57
+ | `local_node` | `Boolean` | Skip this test for nodes having this metadata set to `true` |
57
58
 
58
59
  ## Used environment variables
59
60
 
@@ -16,8 +16,8 @@ module HybridPlatformsConductor
16
16
  # * *actions_executor* (ActionsExecutor): Actions Executor to be used. [default: ActionsExecutor.new]
17
17
  # * *action_info* (Object or nil): Action info needed to setup the action, or nil if none [default: nil]
18
18
  def initialize(
19
- logger: Logger.new(STDOUT),
20
- logger_stderr: Logger.new(STDERR),
19
+ logger: Logger.new($stdout),
20
+ logger_stderr: Logger.new($stderr),
21
21
  config: Config.new,
22
22
  cmd_runner: CmdRunner.new,
23
23
  actions_executor: ActionsExecutor.new,
@@ -27,7 +27,7 @@ module HybridPlatformsConductor
27
27
  @cmd_runner = cmd_runner
28
28
  @actions_executor = actions_executor
29
29
  @action_info = action_info
30
- setup(@action_info) if self.respond_to?(:setup)
30
+ setup(@action_info) if respond_to?(:setup)
31
31
  end
32
32
 
33
33
  # Do we need a connector to execute this action on a node?
@@ -53,7 +53,7 @@ module HybridPlatformsConductor
53
53
  @timeout = timeout
54
54
  @stdout_io = stdout_io
55
55
  @stderr_io = stderr_io
56
- @connector.prepare_for(@node, @timeout, @stdout_io, @stderr_io) if @connector
56
+ @connector&.prepare_for(@node, @timeout, @stdout_io, @stderr_io)
57
57
  end
58
58
 
59
59
  private
@@ -35,7 +35,7 @@ module HybridPlatformsConductor
35
35
  # * *config* (Config): Config to be used. [default = Config.new]
36
36
  # * *cmd_runner* (CmdRunner): Command runner to be used. [default = CmdRunner.new]
37
37
  # * *nodes_handler* (NodesHandler): Nodes handler to be used. [default = NodesHandler.new]
38
- def initialize(logger: Logger.new(STDOUT), logger_stderr: Logger.new(STDERR), config: Config.new, cmd_runner: CmdRunner.new, nodes_handler: NodesHandler.new)
38
+ def initialize(logger: Logger.new($stdout), logger_stderr: Logger.new($stderr), config: Config.new, cmd_runner: CmdRunner.new, nodes_handler: NodesHandler.new)
39
39
  init_loggers(logger, logger_stderr)
40
40
  @config = config
41
41
  @cmd_runner = cmd_runner
@@ -74,17 +74,17 @@ module HybridPlatformsConductor
74
74
  end
75
75
  # Display options connectors might have
76
76
  @connector_plugins.each do |connector_name, connector|
77
- if connector.respond_to?(:options_parse)
78
- options_parser.separator ''
79
- options_parser.separator "Connector #{connector_name} options:"
80
- connector.options_parse(options_parser)
81
- end
77
+ next unless connector.respond_to?(:options_parse)
78
+
79
+ options_parser.separator ''
80
+ options_parser.separator "Connector #{connector_name} options:"
81
+ connector.options_parse(options_parser)
82
82
  end
83
83
  end
84
84
 
85
85
  # Validate that parsed parameters are valid
86
86
  def validate_params
87
- @connector_plugins.values.each do |connector|
87
+ @connector_plugins.each_value do |connector|
88
88
  connector.validate_params if connector.respond_to?(:validate_params)
89
89
  end
90
90
  end
@@ -102,7 +102,14 @@ module HybridPlatformsConductor
102
102
  # * *progress_name* (String): Name to display on the progress bar [default: 'Executing actions']
103
103
  # Result::
104
104
  # * Hash<String, [Integer or Symbol, String, String]>: Exit status code (or Symbol in case of error or dry run), standard output and error for each node.
105
- def execute_actions(actions_per_nodes, timeout: nil, concurrent: false, log_to_dir: "#{@config.hybrid_platforms_dir}/run_logs", log_to_stdout: true, progress_name: 'Executing actions')
105
+ def execute_actions(
106
+ actions_per_nodes,
107
+ timeout: nil,
108
+ concurrent: false,
109
+ log_to_dir: "#{@config.hybrid_platforms_dir}/run_logs",
110
+ log_to_stdout: true,
111
+ progress_name: 'Executing actions'
112
+ )
106
113
  # Keep a list of nodes that will need remote access
107
114
  nodes_needing_connectors = []
108
115
  # Compute the ordered list of actions per selected node
@@ -117,6 +124,7 @@ module HybridPlatformsConductor
117
124
  nodes_actions_set.each do |action_type, action_info|
118
125
  raise 'Cannot have concurrent executions for interactive sessions' if concurrent && action_type == :interactive && action_info
119
126
  raise "Unknown action type #{action_type}" unless @action_plugins.key?(action_type)
127
+
120
128
  action = @action_plugins[action_type].new(
121
129
  logger: @logger,
122
130
  logger_stderr: @logger_stderr,
@@ -137,7 +145,7 @@ module HybridPlatformsConductor
137
145
  actions_per_node[node].concat(resolved_nodes_actions)
138
146
  end
139
147
  end
140
- result = Hash[actions_per_node.keys.map { |node| [node, nil] }]
148
+ result = actions_per_node.keys.map { |node| [node, nil] }.to_h
141
149
  with_connections_prepared_to(nodes_needing_connectors, no_exception: true) do |connected_nodes|
142
150
  missing_nodes = []
143
151
  connected_nodes.each do |node, connector|
@@ -151,7 +159,7 @@ module HybridPlatformsConductor
151
159
  # Prepare the result (stdout or nil per node)
152
160
  unless accessible_nodes.empty?
153
161
  # If we run in parallel then clone the connectors, so that each node has its own instance for thread-safe code.
154
- connected_nodes = Hash[connected_nodes.map { |node, connector| [node, connector.clone] }] if concurrent
162
+ connected_nodes = connected_nodes.transform_values(&:clone) if concurrent
155
163
  @nodes_handler.for_each_node_in(
156
164
  accessible_nodes,
157
165
  parallel: concurrent,
@@ -185,10 +193,11 @@ module HybridPlatformsConductor
185
193
  # * *connected_nodes* (Hash<String, Connector or Symbol>): Prepared connectors (or Symbol in case of failure with no_exception), per node name
186
194
  def with_connections_prepared_to(nodes, no_exception: false)
187
195
  # Make sure every node needing connectors finds a connector
188
- nodes_needing_connectors = Hash[nodes.map { |node| [node, nil] }]
189
- @connector_plugins.each do |connector_name, connector|
196
+ nodes_needing_connectors = nodes.map { |node| [node, nil] }.to_h
197
+ @connector_plugins.each_value do |connector|
190
198
  nodes_without_connectors = nodes_needing_connectors.select { |_node, selected_connector| selected_connector.nil? }.keys
191
199
  break if nodes_without_connectors.empty?
200
+
192
201
  (connector.connectable_nodes_from(nodes_without_connectors) & nodes_without_connectors).each do |node|
193
202
  nodes_needing_connectors[node] = connector if nodes_needing_connectors[node].nil?
194
203
  end
@@ -206,23 +215,20 @@ module HybridPlatformsConductor
206
215
  if connector_name.nil?
207
216
  # All plugins have been prepared.
208
217
  # Call our client code.
209
- yield Hash[nodes_needing_connectors.map do |node, selected_connector|
210
- [
211
- node,
212
- selected_connector.nil? ? :no_connector : selected_connector
213
- ]
214
- end]
218
+ yield(nodes_needing_connectors.transform_values do |selected_connector|
219
+ selected_connector.nil? ? :no_connector : selected_connector
220
+ end)
215
221
  else
216
222
  connector = @connector_plugins[connector_name]
217
223
  selected_nodes = nodes_needing_connectors.select { |_node, selected_connector| selected_connector == connector }.keys
218
224
  if selected_nodes.empty?
219
- preparation_code.call(remaining_plugins_to_prepare[1..-1])
225
+ preparation_code.call(remaining_plugins_to_prepare[1..])
220
226
  else
221
227
  connector.with_connection_to(selected_nodes, no_exception: no_exception) do |connected_nodes|
222
228
  (selected_nodes - connected_nodes).each do |node_in_error|
223
229
  nodes_needing_connectors[node_in_error] = :connection_error
224
230
  end
225
- preparation_code.call(remaining_plugins_to_prepare[1..-1])
231
+ preparation_code.call(remaining_plugins_to_prepare[1..])
226
232
  end
227
233
  end
228
234
  end
@@ -262,8 +268,6 @@ module HybridPlatformsConductor
262
268
  if log_to_file
263
269
  FileUtils.mkdir_p(File.dirname(log_to_file))
264
270
  File.open(log_to_file, 'w')
265
- else
266
- nil
267
271
  end
268
272
  stdout_queue = Queue.new
269
273
  stderr_queue = Queue.new
@@ -277,28 +281,26 @@ module HybridPlatformsConductor
277
281
  (log_to_stdout ? [@logger_stderr] : []) +
278
282
  (file_output.nil? ? [] : [file_output])
279
283
  ) do
280
- begin
281
- log_debug "[#{node}] - Execute #{actions.size} actions on #{node}..."
282
- actions.each do |action|
283
- action.prepare_for(node, connector, remaining_timeout, stdout_queue, stderr_queue)
284
- start_time = Time.now
285
- action.execute
286
- remaining_timeout -= Time.now - start_time unless remaining_timeout.nil?
287
- end
288
- rescue ConnectionError
289
- exit_status = :connection_error
290
- stderr_queue << "#{$!}\n"
291
- rescue CmdRunner::UnexpectedExitCodeError
292
- exit_status = :failed_command
293
- stderr_queue << "#{$!}\n"
294
- rescue CmdRunner::TimeoutError
295
- # Error has already been logged in stderr
296
- exit_status = :timeout
297
- rescue
298
- log_error "Uncaught exception while executing actions on #{node}: #{$!}\n#{$!.backtrace.join("\n")}"
299
- stderr_queue << "#{$!}\n"
300
- exit_status = :failed_action
284
+ log_debug "[#{node}] - Execute #{actions.size} actions on #{node}..."
285
+ actions.each do |action|
286
+ action.prepare_for(node, connector, remaining_timeout, stdout_queue, stderr_queue)
287
+ start_time = Time.now
288
+ action.execute
289
+ remaining_timeout -= Time.now - start_time unless remaining_timeout.nil?
301
290
  end
291
+ rescue ConnectionError
292
+ exit_status = :connection_error
293
+ stderr_queue << "#{$ERROR_INFO}\n"
294
+ rescue CmdRunner::UnexpectedExitCodeError
295
+ exit_status = :failed_command
296
+ stderr_queue << "#{$ERROR_INFO}\n"
297
+ rescue CmdRunner::TimeoutError
298
+ # Error has already been logged in stderr
299
+ exit_status = :timeout
300
+ rescue
301
+ log_error "Uncaught exception while executing actions on #{node}: #{$ERROR_INFO}\n#{$ERROR_INFO.backtrace.join("\n")}"
302
+ stderr_queue << "#{$ERROR_INFO}\n"
303
+ exit_status = :failed_action
302
304
  end
303
305
  [exit_status, stdout, stderr]
304
306
  end