hybrid_platforms_conductor 32.17.0 → 33.0.2

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 (283) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +36 -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 +46 -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/check_deploy_and_idempotence.md +1 -1
  35. data/docs/plugins/test/connection.md +1 -0
  36. data/docs/plugins/test/deploy_removes_root_access.md +1 -1
  37. data/docs/plugins/test/file_system.md +1 -0
  38. data/docs/plugins/test/hostname.md +1 -0
  39. data/docs/plugins/test/ip.md +1 -0
  40. data/docs/plugins/test/local_users.md +1 -0
  41. data/docs/plugins/test/mounts.md +1 -0
  42. data/docs/plugins/test/orphan_files.md +1 -0
  43. data/docs/plugins/test/ports.md +1 -0
  44. data/docs/plugins/test/spectre.md +1 -0
  45. data/docs/plugins/test/vulnerabilities.md +1 -0
  46. data/lib/hybrid_platforms_conductor/action.rb +4 -4
  47. data/lib/hybrid_platforms_conductor/actions_executor.rb +45 -43
  48. data/lib/hybrid_platforms_conductor/bitbucket.rb +5 -4
  49. data/lib/hybrid_platforms_conductor/cmd_runner.rb +13 -12
  50. data/lib/hybrid_platforms_conductor/cmdb.rb +2 -2
  51. data/lib/hybrid_platforms_conductor/common_config_dsl/bitbucket.rb +2 -1
  52. data/lib/hybrid_platforms_conductor/common_config_dsl/confluence.rb +2 -1
  53. data/lib/hybrid_platforms_conductor/common_config_dsl/file_system_tests.rb +5 -4
  54. data/lib/hybrid_platforms_conductor/common_config_dsl/github.rb +4 -3
  55. data/lib/hybrid_platforms_conductor/common_config_dsl/idempotence_tests.rb +2 -2
  56. data/lib/hybrid_platforms_conductor/config.rb +8 -4
  57. data/lib/hybrid_platforms_conductor/confluence.rb +1 -1
  58. data/lib/hybrid_platforms_conductor/connector.rb +5 -2
  59. data/lib/hybrid_platforms_conductor/core_extensions/cleanroom/fix_kwargs.rb +116 -0
  60. data/lib/hybrid_platforms_conductor/core_extensions/symbol/zero.rb +24 -0
  61. data/lib/hybrid_platforms_conductor/credentials.rb +39 -36
  62. data/lib/hybrid_platforms_conductor/current_dir_monitor.rb +4 -1
  63. data/lib/hybrid_platforms_conductor/deployer.rb +275 -224
  64. data/lib/hybrid_platforms_conductor/executable.rb +20 -15
  65. data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/config.rb +10 -7
  66. data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/host_ip.rb +1 -1
  67. data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/host_keys.rb +2 -2
  68. data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/platform_handlers.rb +4 -4
  69. data/lib/hybrid_platforms_conductor/hpc_plugins/connector/local.rb +2 -0
  70. data/lib/hybrid_platforms_conductor/hpc_plugins/connector/ssh.rb +45 -49
  71. data/lib/hybrid_platforms_conductor/hpc_plugins/log/my_log_plugin.rb.sample +100 -0
  72. data/lib/hybrid_platforms_conductor/hpc_plugins/log/remote_fs.rb +180 -0
  73. data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/serverless_chef.rb +68 -66
  74. data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/serverless_chef/dsl_parser.rb +13 -0
  75. data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/serverless_chef/recipes_tree_builder.rb +39 -38
  76. data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/yaml_inventory.rb +5 -4
  77. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/docker.rb +43 -45
  78. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/podman.rb +18 -20
  79. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/proxmox.rb +118 -117
  80. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/proxmox/proxmox_waiter.rb +39 -43
  81. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/proxmox/reserve_proxmox_container +9 -13
  82. data/lib/hybrid_platforms_conductor/hpc_plugins/report/confluence.rb +2 -2
  83. data/lib/hybrid_platforms_conductor/hpc_plugins/report/mediawiki.rb +28 -21
  84. data/lib/hybrid_platforms_conductor/hpc_plugins/report/stdout.rb +26 -22
  85. data/lib/hybrid_platforms_conductor/hpc_plugins/secrets_reader/cli.rb +77 -0
  86. data/lib/hybrid_platforms_conductor/hpc_plugins/secrets_reader/my_secrets_reader_plugin.rb.sample +46 -0
  87. data/lib/hybrid_platforms_conductor/hpc_plugins/secrets_reader/thycotic.rb +90 -0
  88. data/lib/hybrid_platforms_conductor/hpc_plugins/test/bitbucket_conf.rb +3 -3
  89. data/lib/hybrid_platforms_conductor/hpc_plugins/test/check_deploy_and_idempotence.rb +4 -2
  90. data/lib/hybrid_platforms_conductor/hpc_plugins/test/connection.rb +3 -1
  91. data/lib/hybrid_platforms_conductor/hpc_plugins/test/deploy_freshness.rb +7 -21
  92. data/lib/hybrid_platforms_conductor/hpc_plugins/test/deploy_removes_root_access.rb +21 -19
  93. data/lib/hybrid_platforms_conductor/hpc_plugins/test/divergence.rb +2 -2
  94. data/lib/hybrid_platforms_conductor/hpc_plugins/test/executables.rb +2 -2
  95. data/lib/hybrid_platforms_conductor/hpc_plugins/test/file_system.rb +21 -22
  96. data/lib/hybrid_platforms_conductor/hpc_plugins/test/file_system_hdfs.rb +19 -21
  97. data/lib/hybrid_platforms_conductor/hpc_plugins/test/github_ci.rb +2 -3
  98. data/lib/hybrid_platforms_conductor/hpc_plugins/test/hostname.rb +3 -1
  99. data/lib/hybrid_platforms_conductor/hpc_plugins/test/idempotence.rb +2 -2
  100. data/lib/hybrid_platforms_conductor/hpc_plugins/test/ip.rb +4 -2
  101. data/lib/hybrid_platforms_conductor/hpc_plugins/test/jenkins_ci_conf.rb +21 -22
  102. data/lib/hybrid_platforms_conductor/hpc_plugins/test/jenkins_ci_masters_ok.rb +10 -12
  103. data/lib/hybrid_platforms_conductor/hpc_plugins/test/linear_strategy.rb +9 -9
  104. data/lib/hybrid_platforms_conductor/hpc_plugins/test/local_users.rb +5 -3
  105. data/lib/hybrid_platforms_conductor/hpc_plugins/test/mounts.rb +5 -3
  106. data/lib/hybrid_platforms_conductor/hpc_plugins/test/orphan_files.rb +13 -10
  107. data/lib/hybrid_platforms_conductor/hpc_plugins/test/ports.rb +5 -3
  108. data/lib/hybrid_platforms_conductor/hpc_plugins/test/private_ips.rb +5 -5
  109. data/lib/hybrid_platforms_conductor/hpc_plugins/test/public_ips.rb +5 -5
  110. data/lib/hybrid_platforms_conductor/hpc_plugins/test/spectre.rb +7 -7
  111. data/lib/hybrid_platforms_conductor/hpc_plugins/test/veids.rb +3 -3
  112. data/lib/hybrid_platforms_conductor/hpc_plugins/test/vulnerabilities.rb +27 -25
  113. data/lib/hybrid_platforms_conductor/hpc_plugins/test_report/confluence.rb +2 -2
  114. data/lib/hybrid_platforms_conductor/hpc_plugins/test_report/stdout.rb +8 -6
  115. data/lib/hybrid_platforms_conductor/io_router.rb +14 -13
  116. data/lib/hybrid_platforms_conductor/json_dumper.rb +2 -2
  117. data/lib/hybrid_platforms_conductor/log.rb +31 -0
  118. data/lib/hybrid_platforms_conductor/logger_helpers.rb +19 -16
  119. data/lib/hybrid_platforms_conductor/nodes_handler.rb +89 -71
  120. data/lib/hybrid_platforms_conductor/parallel_threads.rb +7 -11
  121. data/lib/hybrid_platforms_conductor/platform_handler.rb +7 -7
  122. data/lib/hybrid_platforms_conductor/platforms_handler.rb +5 -3
  123. data/lib/hybrid_platforms_conductor/plugin.rb +2 -2
  124. data/lib/hybrid_platforms_conductor/plugins.rb +14 -8
  125. data/lib/hybrid_platforms_conductor/provisioner.rb +4 -4
  126. data/lib/hybrid_platforms_conductor/report.rb +2 -2
  127. data/lib/hybrid_platforms_conductor/reports_handler.rb +3 -2
  128. data/lib/hybrid_platforms_conductor/secrets_reader.rb +31 -0
  129. data/lib/hybrid_platforms_conductor/services_handler.rb +32 -29
  130. data/lib/hybrid_platforms_conductor/test_only_remote_node.rb +18 -0
  131. data/lib/hybrid_platforms_conductor/test_report.rb +15 -18
  132. data/lib/hybrid_platforms_conductor/tests_runner.rb +116 -118
  133. data/lib/hybrid_platforms_conductor/thycotic.rb +28 -19
  134. data/lib/hybrid_platforms_conductor/topographer.rb +200 -190
  135. data/lib/hybrid_platforms_conductor/topographer/plugins/graphviz.rb +8 -8
  136. data/lib/hybrid_platforms_conductor/topographer/plugins/json.rb +4 -4
  137. data/lib/hybrid_platforms_conductor/version.rb +1 -1
  138. data/spec/hybrid_platforms_conductor_test.rb +33 -12
  139. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/bash_spec.rb +18 -11
  140. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/interactive_spec.rb +2 -2
  141. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/remote_bash_spec.rb +32 -21
  142. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/ruby_spec.rb +75 -49
  143. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/scp_spec.rb +27 -15
  144. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions_spec.rb +90 -59
  145. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connection_spec.rb +46 -44
  146. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/local/connectable_nodes_spec.rb +12 -8
  147. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/local/remote_actions_spec.rb +4 -7
  148. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/cli_options_spec.rb +21 -22
  149. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/config_dsl_spec.rb +23 -24
  150. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/connectable_nodes_spec.rb +10 -6
  151. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/connections_spec.rb +106 -75
  152. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/global_helpers_spec.rb +145 -126
  153. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/node_helpers_spec.rb +3 -3
  154. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/remote_actions_spec.rb +29 -25
  155. data/spec/hybrid_platforms_conductor_test/api/actions_executor/logging_spec.rb +167 -142
  156. data/spec/hybrid_platforms_conductor_test/api/actions_executor/parallel_spec.rb +272 -244
  157. data/spec/hybrid_platforms_conductor_test/api/actions_executor/timeout_spec.rb +16 -16
  158. data/spec/hybrid_platforms_conductor_test/api/cmd_runner_spec.rb +36 -36
  159. data/spec/hybrid_platforms_conductor_test/api/config_spec.rb +24 -22
  160. data/spec/hybrid_platforms_conductor_test/api/deployer/check_spec.rb +4 -2
  161. data/spec/hybrid_platforms_conductor_test/api/deployer/config_dsl_spec.rb +43 -5
  162. data/spec/hybrid_platforms_conductor_test/api/deployer/deploy_spec.rb +199 -216
  163. data/spec/hybrid_platforms_conductor_test/api/deployer/log_plugins/remote_fs_spec.rb +223 -0
  164. data/spec/hybrid_platforms_conductor_test/api/deployer/parse_deploy_output_spec.rb +55 -59
  165. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioner_spec.rb +36 -62
  166. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/podman_spec.rb +17 -17
  167. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/config_dsl_spec.rb +4 -4
  168. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/create_spec.rb +44 -51
  169. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/destroy_spec.rb +3 -3
  170. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/ip_spec.rb +12 -16
  171. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/destroy_vm_spec.rb +31 -19
  172. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/expired_containers_spec.rb +324 -266
  173. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/ips_assignment_spec.rb +89 -61
  174. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/other_lxc_containers_resources_spec.rb +117 -93
  175. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/pve_node_resources_spec.rb +71 -54
  176. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/retries_spec.rb +10 -8
  177. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/vm_ids_assignment_spec.rb +80 -60
  178. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/start_spec.rb +1 -1
  179. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/state_spec.rb +1 -1
  180. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/stop_spec.rb +1 -1
  181. data/spec/hybrid_platforms_conductor_test/api/deployer/secrets_reader_plugins/cli_spec.rb +64 -0
  182. data/spec/hybrid_platforms_conductor_test/api/deployer/secrets_reader_plugins/thycotic_spec.rb +268 -0
  183. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/config_spec.rb +8 -10
  184. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/host_ip_spec.rb +33 -24
  185. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/host_keys_spec.rb +64 -51
  186. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/platform_handlers_spec.rb +3 -3
  187. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs_plugins_api_spec.rb +50 -51
  188. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/common_spec.rb +91 -81
  189. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/config_dsl_spec.rb +14 -16
  190. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/git_diff_impacts_spec.rb +51 -75
  191. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/nodes_selectors_spec.rb +35 -26
  192. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/platform_handlers_plugins_api_spec.rb +24 -16
  193. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/several_platforms_spec.rb +29 -19
  194. data/spec/hybrid_platforms_conductor_test/api/platform_handler_spec.rb +4 -4
  195. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/config_dsl_spec.rb +2 -2
  196. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/deploy_output_parsing_spec.rb +6 -6
  197. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/diff_impacts_spec.rb +57 -99
  198. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/inventory_spec.rb +4 -4
  199. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/packaging_spec.rb +32 -35
  200. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/services_deployment_spec.rb +10 -10
  201. data/spec/hybrid_platforms_conductor_test/api/platforms_handler_spec.rb +38 -27
  202. data/spec/hybrid_platforms_conductor_test/api/plugins_spec.rb +46 -52
  203. data/spec/hybrid_platforms_conductor_test/api/reports_handler_spec.rb +2 -2
  204. data/spec/hybrid_platforms_conductor_test/api/services_handler/actions_to_deploy_spec.rb +90 -58
  205. data/spec/hybrid_platforms_conductor_test/api/services_handler/deploy_allowed_spec.rb +38 -34
  206. data/spec/hybrid_platforms_conductor_test/api/services_handler/log_info_spec.rb +11 -9
  207. data/spec/hybrid_platforms_conductor_test/api/services_handler/package_spec.rb +193 -171
  208. data/spec/hybrid_platforms_conductor_test/api/services_handler/parse_deploy_output_spec.rb +66 -54
  209. data/spec/hybrid_platforms_conductor_test/api/services_handler/prepare_for_deploy_spec.rb +147 -133
  210. data/spec/hybrid_platforms_conductor_test/api/tests_runner/common_spec.rb +69 -49
  211. data/spec/hybrid_platforms_conductor_test/api/tests_runner/global_spec.rb +5 -4
  212. data/spec/hybrid_platforms_conductor_test/api/tests_runner/node_check_spec.rb +8 -5
  213. data/spec/hybrid_platforms_conductor_test/api/tests_runner/node_spec.rb +8 -5
  214. data/spec/hybrid_platforms_conductor_test/api/tests_runner/node_ssh_spec.rb +30 -27
  215. data/spec/hybrid_platforms_conductor_test/api/tests_runner/platform_spec.rb +12 -9
  216. data/spec/hybrid_platforms_conductor_test/api/tests_runner/reports_spec.rb +48 -47
  217. data/spec/hybrid_platforms_conductor_test/api/tests_runner/test_plugins/bitbucket_conf_spec.rb +5 -5
  218. data/spec/hybrid_platforms_conductor_test/api/tests_runner/test_plugins/github_ci_spec.rb +5 -5
  219. data/spec/hybrid_platforms_conductor_test/api/tests_runner/test_reports_plugins/confluence_spec.rb +5 -5
  220. data/spec/hybrid_platforms_conductor_test/cmdb_plugins/test_cmdb.rb +9 -9
  221. data/spec/hybrid_platforms_conductor_test/cmdb_plugins/{test_cmdb2.rb → test_cmdb_2.rb} +6 -6
  222. data/spec/hybrid_platforms_conductor_test/cmdb_plugins/test_cmdb_others.rb +3 -3
  223. data/spec/hybrid_platforms_conductor_test/cmdb_plugins/{test_cmdb_others2.rb → test_cmdb_others_2.rb} +2 -2
  224. data/spec/hybrid_platforms_conductor_test/docs_spec.rb +1 -1
  225. data/spec/hybrid_platforms_conductor_test/executables/{check-node_spec.rb → check_node_spec.rb} +4 -6
  226. data/spec/hybrid_platforms_conductor_test/executables/deploy_spec.rb +4 -6
  227. data/spec/hybrid_platforms_conductor_test/executables/get_impacted_nodes_spec.rb +76 -77
  228. data/spec/hybrid_platforms_conductor_test/executables/last_deploys_spec.rb +159 -113
  229. data/spec/hybrid_platforms_conductor_test/executables/nodes_to_deploy_spec.rb +299 -160
  230. data/spec/hybrid_platforms_conductor_test/executables/options/actions_executor_spec.rb +4 -6
  231. data/spec/hybrid_platforms_conductor_test/executables/options/cmd_runner_spec.rb +3 -5
  232. data/spec/hybrid_platforms_conductor_test/executables/options/common_spec.rb +8 -8
  233. data/spec/hybrid_platforms_conductor_test/executables/options/deployer_spec.rb +12 -196
  234. data/spec/hybrid_platforms_conductor_test/executables/options/nodes_handler_spec.rb +9 -10
  235. data/spec/hybrid_platforms_conductor_test/executables/options/nodes_selectors_spec.rb +9 -10
  236. data/spec/hybrid_platforms_conductor_test/executables/options/reports_handler_spec.rb +1 -1
  237. data/spec/hybrid_platforms_conductor_test/executables/options/tests_runner_spec.rb +22 -22
  238. data/spec/hybrid_platforms_conductor_test/executables/report_spec.rb +22 -16
  239. data/spec/hybrid_platforms_conductor_test/executables/run_spec.rb +32 -32
  240. data/spec/hybrid_platforms_conductor_test/executables/ssh_config_spec.rb +7 -9
  241. data/spec/hybrid_platforms_conductor_test/executables/test_spec.rb +3 -5
  242. data/spec/hybrid_platforms_conductor_test/helpers/actions_executor_helpers.rb +2 -2
  243. data/spec/hybrid_platforms_conductor_test/helpers/cmd_runner_helpers.rb +4 -3
  244. data/spec/hybrid_platforms_conductor_test/helpers/cmdb_helpers.rb +2 -2
  245. data/spec/hybrid_platforms_conductor_test/helpers/config_helpers.rb +1 -1
  246. data/spec/hybrid_platforms_conductor_test/helpers/connector_ssh_helpers.rb +12 -13
  247. data/spec/hybrid_platforms_conductor_test/helpers/deployer_helpers.rb +245 -56
  248. data/spec/hybrid_platforms_conductor_test/helpers/executables_helpers.rb +11 -11
  249. data/spec/hybrid_platforms_conductor_test/helpers/nodes_handler_helpers.rb +1 -1
  250. data/spec/hybrid_platforms_conductor_test/helpers/platforms_handler_helpers.rb +39 -28
  251. data/spec/hybrid_platforms_conductor_test/helpers/plugins_helpers.rb +1 -1
  252. data/spec/hybrid_platforms_conductor_test/helpers/provisioner_proxmox_helpers.rb +86 -111
  253. data/spec/hybrid_platforms_conductor_test/helpers/reports_handler_helpers.rb +1 -1
  254. data/spec/hybrid_platforms_conductor_test/helpers/serverless_chef_helpers.rb +3 -3
  255. data/spec/hybrid_platforms_conductor_test/helpers/services_handler_helpers.rb +1 -1
  256. data/spec/hybrid_platforms_conductor_test/helpers/tests_runner_helpers.rb +1 -1
  257. 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
  258. 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
  259. 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
  260. 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
  261. data/spec/hybrid_platforms_conductor_test/platform_handler_plugins/test.rb +1 -1
  262. data/spec/hybrid_platforms_conductor_test/platform_handler_plugins/{test2.rb → test_2.rb} +0 -0
  263. data/spec/hybrid_platforms_conductor_test/rubocop_spec.rb +31 -0
  264. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/1_node/nodes/node.json +3 -3
  265. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/data_bags/nodes/node.json +3 -3
  266. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/recipes/cookbooks/test_cookbook_2/libraries/default.rb +1 -0
  267. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/several_cookbooks/other_cookbooks/test_cookbook_2/libraries/default.rb +1 -0
  268. data/spec/hybrid_platforms_conductor_test/shared_examples/deployer.rb +952 -0
  269. data/spec/hybrid_platforms_conductor_test/test_connector.rb +3 -3
  270. data/spec/hybrid_platforms_conductor_test/test_log_no_read_plugin.rb +84 -0
  271. data/spec/hybrid_platforms_conductor_test/test_log_plugin.rb +105 -0
  272. data/spec/hybrid_platforms_conductor_test/test_plugins/global.rb +1 -0
  273. data/spec/hybrid_platforms_conductor_test/test_plugins/node.rb +1 -0
  274. data/spec/hybrid_platforms_conductor_test/test_plugins/node_check.rb +1 -0
  275. data/spec/hybrid_platforms_conductor_test/test_plugins/platform.rb +1 -0
  276. data/spec/hybrid_platforms_conductor_test/test_plugins/several_checks.rb +2 -2
  277. data/spec/hybrid_platforms_conductor_test/test_secrets_reader_plugin.rb +45 -0
  278. data/spec/hybrid_platforms_conductor_test/tests_report_plugin.rb +5 -6
  279. data/spec/spec_helper.rb +17 -18
  280. data/tools/check_md +16 -20
  281. data/tools/generate_mermaid +1 -1
  282. metadata +195 -144
  283. data/spec/hybrid_platforms_conductor_test/helpers/deployer_test_helpers.rb +0 -916
@@ -50,7 +50,7 @@ module HybridPlatformsConductor
50
50
  # Result::
51
51
  # * Array<Test>: List of platform tests
52
52
  def platform_tests
53
- @tests.select { |test| !test.platform.nil? }
53
+ @tests.reject { |test| test.platform.nil? }
54
54
  end
55
55
 
56
56
  # Return node tests
@@ -58,7 +58,7 @@ module HybridPlatformsConductor
58
58
  # Result::
59
59
  # * Array<Test>: List of node tests
60
60
  def node_tests
61
- @tests.select { |test| !test.node.nil? }
61
+ @tests.reject { |test| test.node.nil? }
62
62
  end
63
63
 
64
64
  # Select tests corresponding to a given criteria
@@ -144,7 +144,7 @@ module HybridPlatformsConductor
144
144
  when :only_as_expected
145
145
  test.expected_failure ? test.errors : []
146
146
  when :only_as_non_expected
147
- !test.expected_failure ? test.errors : []
147
+ test.expected_failure ? [] : test.errors
148
148
  else
149
149
  raise "Unknown errors filter: #{fiter}"
150
150
  end
@@ -166,10 +166,10 @@ module HybridPlatformsConductor
166
166
  end
167
167
  groups = {}
168
168
  tests.group_by(&first_criteria).each do |first_group, grouped_tests|
169
- next_grouped_errors = group_errors(grouped_tests, *group_criterias[1..-1], filter: filter)
169
+ next_grouped_errors = group_errors(grouped_tests, *group_criterias[1..], filter: filter)
170
170
  groups[first_group] = next_grouped_errors unless next_grouped_errors.empty?
171
171
  end
172
- Hash[groups.sort]
172
+ groups.sort.to_h
173
173
  end
174
174
  end
175
175
 
@@ -184,7 +184,7 @@ module HybridPlatformsConductor
184
184
  # * *tested_nodes_in_error_as_expected* (Array<String>): Tested nodes in error in the list that are part of the expected failures
185
185
  def nodes_by_nodes_list
186
186
  no_list_nodes = @nodes_handler.known_nodes
187
- Hash[(
187
+ (
188
188
  @nodes_handler.known_nodes_lists.sort.map do |nodes_list|
189
189
  nodes_from_list = @nodes_handler.nodes_from_list(nodes_list, ignore_unknowns: true)
190
190
  no_list_nodes -= nodes_from_list
@@ -193,17 +193,14 @@ module HybridPlatformsConductor
193
193
  ['No list', no_list_nodes],
194
194
  ['All', @nodes_handler.known_nodes]
195
195
  ]
196
- ).map do |list_name, list_nodes|
197
- [
198
- list_name,
199
- {
200
- nodes: list_nodes,
201
- tested_nodes: list_nodes & @tested_nodes,
202
- tested_nodes_in_error: list_nodes & group_errors(node_tests, :node).keys,
203
- tested_nodes_in_error_as_expected: list_nodes & group_errors(node_tests, :node, filter: :only_as_expected).keys
204
- }
205
- ]
206
- end]
196
+ ).to_h.transform_values do |list_nodes|
197
+ {
198
+ nodes: list_nodes,
199
+ tested_nodes: list_nodes & @tested_nodes,
200
+ tested_nodes_in_error: list_nodes & group_errors(node_tests, :node).keys,
201
+ tested_nodes_in_error_as_expected: list_nodes & group_errors(node_tests, :node, filter: :only_as_expected).keys
202
+ }
203
+ end
207
204
  end
208
205
 
209
206
  # Flatten a tree hash.
@@ -259,7 +256,7 @@ module HybridPlatformsConductor
259
256
  # * *not_run*: All non-successful tests have not been run
260
257
  def classify_tests(tests)
261
258
  info = {
262
- not_run: tests.select { |test| !test.executed? },
259
+ not_run: tests.reject(&:executed?),
263
260
  success: tests.select { |test| test.executed? && test.errors.empty? },
264
261
  unexpected_error: tests.select { |test| test.executed? && !test.errors.empty? && test.expected_failure.nil? },
265
262
  expected_error: tests.select { |test| test.executed? && !test.errors.empty? && !test.expected_failure.nil? }
@@ -12,7 +12,8 @@ module HybridPlatformsConductor
12
12
  # Class running tests
13
13
  class TestsRunner
14
14
 
15
- include LoggerHelpers, ParallelThreads
15
+ include ParallelThreads
16
+ include LoggerHelpers
16
17
 
17
18
  # List of tests to execute [default: []]
18
19
  # Array<Symbol>
@@ -50,8 +51,8 @@ module HybridPlatformsConductor
50
51
  # * *actions_executor* (ActionsExecutor): Actions Executor to be used for the tests [default: ActionsExecutor.new]
51
52
  # * *deployer* (Deployer): Deployer to be used for the tests needed why-run deployments [default: Deployer.new]
52
53
  def initialize(
53
- logger: Logger.new(STDOUT),
54
- logger_stderr: Logger.new(STDERR),
54
+ logger: Logger.new($stdout),
55
+ logger_stderr: Logger.new($stderr),
55
56
  config: Config.new,
56
57
  cmd_runner: CmdRunner.new,
57
58
  platforms_handler: PlatformsHandler.new,
@@ -74,10 +75,10 @@ module HybridPlatformsConductor
74
75
  @reports_plugins = Plugins.new(:test_report, logger: @logger, logger_stderr: @logger_stderr)
75
76
  # Register test classes from platforms
76
77
  @platforms_handler.known_platforms.each do |platform|
77
- if platform.respond_to?(:tests)
78
- platform.tests.each do |test_name, test_class|
79
- @tests_plugins[test_name] = test_class
80
- end
78
+ next unless platform.respond_to?(:tests)
79
+
80
+ platform.tests.each do |test_name, test_class|
81
+ @tests_plugins[test_name] = test_class
81
82
  end
82
83
  end
83
84
  # Do we skip running check-node?
@@ -146,6 +147,7 @@ module HybridPlatformsConductor
146
147
  @reports.sort!
147
148
  unknown_tests = @tests - @tests_plugins.keys
148
149
  raise "Unknown test names: #{unknown_tests.join(', ')}" unless unknown_tests.empty?
150
+
149
151
  @nodes = @nodes_handler.select_nodes(nodes_selectors).uniq.sort
150
152
 
151
153
  # Resolve the expected failures from the config.
@@ -173,11 +175,11 @@ module HybridPlatformsConductor
173
175
  @platforms_handler.known_platforms.each do |platform|
174
176
  platform_nodes = platform.known_nodes
175
177
  @node_expected_failures.each do |test_name, expected_failures_for_test|
176
- if (platform_nodes - expected_failures_for_test.keys).empty?
177
- # We have an expected failure for this test
178
- @platform_expected_failures[test_name] = {} unless @platform_expected_failures.key?(test_name)
179
- @platform_expected_failures[test_name][platform.name] = expected_failures_for_test.values.uniq.join(' + ')
180
- end
178
+ next unless (platform_nodes - expected_failures_for_test.keys).empty?
179
+
180
+ # We have an expected failure for this test
181
+ @platform_expected_failures[test_name] = {} unless @platform_expected_failures.key?(test_name)
182
+ @platform_expected_failures[test_name][platform.name] = expected_failures_for_test.values.uniq.join(' + ')
181
183
  end
182
184
  end
183
185
 
@@ -191,24 +193,24 @@ module HybridPlatformsConductor
191
193
  run_tests_connection_on_nodes
192
194
  run_tests_on_check_nodes
193
195
 
194
- @tested_platforms = @tests_run.map { |test| test.platform }.compact.uniq.sort
196
+ @tested_platforms = @tests_run.map(&:platform).compact.uniq.sort
195
197
 
196
198
  # Check that tests that were expected to fail did not succeed.
197
199
  @tests_run.each do |test|
198
- if test.executed?
199
- expected_failure = test.expected_failure
200
- if expected_failure
201
- if test.errors.empty?
202
- # Should have failed
203
- error(
204
- "Test #{test} was marked to fail (#{expected_failure}) but it succeeded. Please remove it from the expected failures in case the issue has been resolved.",
205
- platform: test.platform,
206
- node: test.node,
207
- force_failure: true
208
- )
209
- else
210
- out "Expected failure for #{test} (#{expected_failure}):\n#{test.errors.map { |error| " - #{error}" }.join("\n")}".yellow
211
- end
200
+ next unless test.executed?
201
+
202
+ expected_failure = test.expected_failure
203
+ if expected_failure
204
+ if test.errors.empty?
205
+ # Should have failed
206
+ error(
207
+ "Test #{test} was marked to fail (#{expected_failure}) but it succeeded. Please remove it from the expected failures in case the issue has been resolved.",
208
+ platform: test.platform,
209
+ node: test.node,
210
+ force_failure: true
211
+ )
212
+ else
213
+ out "Expected failure for #{test} (#{expected_failure}):\n#{test.errors.map { |error| " - #{error}" }.join("\n")}".yellow
212
214
  end
213
215
  end
214
216
  end
@@ -217,14 +219,12 @@ module HybridPlatformsConductor
217
219
  @node_expected_failures.each do |test_name, test_expected_failures|
218
220
  test_expected_failures.each do |node, expected_failure|
219
221
  # Check that a test has been run for this expected failure
220
- unless @tests_run.find do |test|
221
- test.name == test_name &&
222
- (
223
- (test.node.nil? && node == '') ||
224
- (!test.node.nil? && node == test.node)
225
- )
226
- end
227
- error("A test named #{test_name} for node #{node} was expected to fail (#{expected_failure}), but no test has been run. Please remove it from the expected failures if this expected failure is obsolete.")
222
+ error("A test named #{test_name} for node #{node} was expected to fail (#{expected_failure}), but no test has been run. Please remove it from the expected failures if this expected failure is obsolete.") unless @tests_run.find do |test|
223
+ test.name == test_name &&
224
+ (
225
+ (test.node.nil? && node == '') ||
226
+ (!test.node.nil? && node == test.node)
227
+ )
228
228
  end
229
229
  end
230
230
  end
@@ -232,11 +232,9 @@ module HybridPlatformsConductor
232
232
 
233
233
  # Produce reports
234
234
  @reports.each do |report|
235
- begin
236
- @reports_plugins[report].new(@logger, @logger_stderr, @config, @nodes_handler, @nodes, @tested_platforms, @tests_run).report
237
- rescue
238
- log_error "Uncaught exception while producing report #{report}: #{$!}\n#{$!.backtrace.join("\n")}"
239
- end
235
+ @reports_plugins[report].new(@logger, @logger_stderr, @config, @nodes_handler, @nodes, @tested_platforms, @tests_run).report
236
+ rescue
237
+ log_error "Uncaught exception while producing report #{report}: #{$ERROR_INFO}\n#{$ERROR_INFO.backtrace.join("\n")}"
240
238
  end
241
239
 
242
240
  out
@@ -285,6 +283,9 @@ module HybridPlatformsConductor
285
283
  name: test_name.nil? ? :global : test_name,
286
284
  platform: platform,
287
285
  node: node,
286
+ # Keep this else on purpose to show where global tests could have expected failures
287
+ # rubocop:disable Style/EmptyElse
288
+ # rubocop:disable Lint/DuplicateBranch
288
289
  expected_failure: if ignore_expected_failure
289
290
  nil
290
291
  elsif !node.nil?
@@ -297,6 +298,8 @@ module HybridPlatformsConductor
297
298
  # Global test
298
299
  nil
299
300
  end
301
+ # rubocop:enable Lint/DuplicateBranch
302
+ # rubocop:enable Style/EmptyElse
300
303
  )
301
304
  end
302
305
 
@@ -333,38 +336,38 @@ module HybridPlatformsConductor
333
336
  []
334
337
  end
335
338
  end.flatten
336
- unless tests_to_run.empty?
337
- section "Run #{tests_to_run.size} #{title}" do
338
- tests_preparation.call(tests_to_run) unless tests_preparation.nil?
339
- for_each_element_in(
340
- tests_to_run,
341
- parallel: !log_debug? && nbr_threads_max > 1,
342
- nbr_threads_max: nbr_threads_max,
343
- progress: "Run #{title}"
344
- ) do |test|
345
- test_category =
346
- if test.platform.nil? && test.node.nil?
347
- 'Global'
348
- elsif test.node.nil?
349
- "Platform #{test.platform.name}"
350
- elsif test.platform.nil?
351
- "Node #{test.node}"
352
- else
353
- "Platform #{test.platform.name} / Node #{test.node}"
354
- end
355
- out "[ #{Time.now.utc.strftime('%F %T')} ] - [ #{test_category} ] - [ #{test.name} ] - Start test..."
356
- begin_time = Time.now
357
- begin
358
- test_execution.call(test)
359
- rescue
360
- test.error "Uncaught exception during test: #{$!}", $!.backtrace.join("\n")
339
+ return if tests_to_run.empty?
340
+
341
+ section "Run #{tests_to_run.size} #{title}" do
342
+ tests_preparation&.call(tests_to_run)
343
+ for_each_element_in(
344
+ tests_to_run,
345
+ parallel: !log_debug? && nbr_threads_max > 1,
346
+ nbr_threads_max: nbr_threads_max,
347
+ progress: "Run #{title}"
348
+ ) do |test|
349
+ test_category =
350
+ if test.platform.nil? && test.node.nil?
351
+ 'Global'
352
+ elsif test.node.nil?
353
+ "Platform #{test.platform.name}"
354
+ elsif test.platform.nil?
355
+ "Node #{test.node}"
356
+ else
357
+ "Platform #{test.platform.name} / Node #{test.node}"
361
358
  end
362
- end_time = Time.now
363
- test.executed
364
- out "[ #{Time.now.utc.strftime('%F %T')} ] - [ #{test_category} ] - [ #{test.name} ] - Test finished in #{end_time - begin_time} seconds."
359
+ out "[ #{Time.now.utc.strftime('%F %T')} ] - [ #{test_category} ] - [ #{test.name} ] - Start test..."
360
+ begin_time = Time.now
361
+ begin
362
+ test_execution.call(test)
363
+ rescue
364
+ test.error "Uncaught exception during test: #{$ERROR_INFO}", $ERROR_INFO.backtrace.join("\n")
365
365
  end
366
- @tests_run.concat(tests_to_run)
366
+ end_time = Time.now
367
+ test.executed
368
+ out "[ #{Time.now.utc.strftime('%F %T')} ] - [ #{test_category} ] - [ #{test.name} ] - Test finished in #{end_time - begin_time} seconds."
367
369
  end
370
+ @tests_run.concat(tests_to_run)
368
371
  end
369
372
  end
370
373
 
@@ -411,21 +414,19 @@ module HybridPlatformsConductor
411
414
  # Hash< String, Array< [ String, Hash<Symbol,Object> ] > >
412
415
  @cmds_to_run = {}
413
416
  selected_tests.each do |test|
414
- begin
415
- test.test_on_node.each do |cmd, test_info|
416
- test_info_normalized = test_info.is_a?(Hash) ? test_info.clone : { validator: test_info }
417
- test_info_normalized[:timeout] = DEFAULT_CMD_TIMEOUT unless test_info_normalized.key?(:timeout)
418
- test_info_normalized[:test] = test
419
- @cmds_to_run[test.node] = [] unless @cmds_to_run.key?(test.node)
420
- @cmds_to_run[test.node] << [
421
- cmd,
422
- test_info_normalized
423
- ]
424
- end
425
- rescue
426
- test.error "Uncaught exception during test preparation: #{$!}", $!.backtrace.join("\n")
427
- test.executed
417
+ test.test_on_node.each do |cmd, test_info|
418
+ test_info_normalized = test_info.is_a?(Hash) ? test_info.clone : { validator: test_info }
419
+ test_info_normalized[:timeout] = DEFAULT_CMD_TIMEOUT unless test_info_normalized.key?(:timeout)
420
+ test_info_normalized[:test] = test
421
+ @cmds_to_run[test.node] = [] unless @cmds_to_run.key?(test.node)
422
+ @cmds_to_run[test.node] << [
423
+ cmd,
424
+ test_info_normalized
425
+ ]
428
426
  end
427
+ rescue
428
+ test.error "Uncaught exception during test preparation: #{$ERROR_INFO}", $ERROR_INFO.backtrace.join("\n")
429
+ test.executed
429
430
  end
430
431
  # Compute the timeout that will be applied, from the max timeout sum for every node that has tests to run
431
432
  timeout = CONNECTION_TIMEOUT + (
@@ -435,21 +436,18 @@ module HybridPlatformsConductor
435
436
  )
436
437
  # Run commands on nodes, in grouped way to avoid too many connections, per node
437
438
  # Hash< String, Array<String> >
438
- @test_cmds = Hash[@cmds_to_run.map do |node, cmds_list|
439
- [
440
- node,
441
- {
442
- remote_bash: cmds_list.map do |(cmd, _test_info)|
443
- [
444
- "echo '#{CMD_SEPARATOR}'",
445
- ">&2 echo '#{CMD_SEPARATOR}'",
446
- cmd,
447
- "echo \"$?\""
448
- ]
449
- end.flatten
450
- }
451
- ]
452
- end]
439
+ @test_cmds = @cmds_to_run.transform_values do |cmds_list|
440
+ {
441
+ remote_bash: cmds_list.map do |(cmd, _test_info)|
442
+ [
443
+ "echo '#{CMD_SEPARATOR}'",
444
+ ">&2 echo '#{CMD_SEPARATOR}'",
445
+ cmd,
446
+ 'echo "$?"'
447
+ ]
448
+ end.flatten
449
+ }
450
+ end
453
451
  section "Run test commands on #{@test_cmds.keys.size} connected nodes (timeout to #{timeout} secs)" do
454
452
  start_time = Time.now
455
453
  @actions_executor.max_threads = @max_threads_connection_on_nodes
@@ -469,7 +467,7 @@ module HybridPlatformsConductor
469
467
  if exit_status.is_a?(Symbol)
470
468
  test.error "Error while executing tests: #{exit_status}: #{stderr}"
471
469
  else
472
- log_debug <<~EOS
470
+ log_debug <<~EO_LOG
473
471
  ----- Commands for #{test.node}:
474
472
  #{@test_cmds[test.node][:remote_bash].join("\n")}
475
473
  ----- STDOUT:
@@ -477,23 +475,23 @@ module HybridPlatformsConductor
477
475
  ----- STDERR:
478
476
  #{stderr}
479
477
  -----
480
- EOS
478
+ EO_LOG
481
479
  # Skip the first section, as it can contain SSH banners
482
- cmd_stdouts = stdout.split("#{CMD_SEPARATOR}\n")[1..-1]
480
+ cmd_stdouts = stdout.split("#{CMD_SEPARATOR}\n")[1..]
483
481
  cmd_stdouts = [] if cmd_stdouts.nil?
484
- cmd_stderrs = stderr.split("#{CMD_SEPARATOR}\n")[1..-1]
482
+ cmd_stderrs = stderr.split("#{CMD_SEPARATOR}\n")[1..]
485
483
  cmd_stderrs = [] if cmd_stderrs.nil?
486
484
  @cmds_to_run[test.node].zip(cmd_stdouts, cmd_stderrs).each do |(cmd, test_info), cmd_stdout, cmd_stderr|
487
485
  # Find the section that corresponds to this test
488
- if test_info[:test] == test
489
- cmd_stdout = '' if cmd_stdout.nil?
490
- cmd_stderr = '' if cmd_stderr.nil?
491
- stdout_lines = cmd_stdout.split("\n")
492
- # Last line of stdout is the return code
493
- return_code = stdout_lines.empty? ? :command_cant_run : Integer(stdout_lines.last)
494
- test.error "Command '#{cmd}' returned error code #{return_code}", "----- STDOUT:\n#{stdout_lines[0..-2].join("\n")}\n----- STDERR:\n#{cmd_stderr}" unless return_code == 0
495
- test_info[:validator].call(stdout_lines[0..-2], cmd_stderr.split("\n"), return_code)
496
- end
486
+ next unless test_info[:test] == test
487
+
488
+ cmd_stdout = '' if cmd_stdout.nil?
489
+ cmd_stderr = '' if cmd_stderr.nil?
490
+ stdout_lines = cmd_stdout.split("\n")
491
+ # Last line of stdout is the return code
492
+ return_code = stdout_lines.empty? ? :command_cant_run : Integer(stdout_lines.last)
493
+ test.error "Command '#{cmd}' returned error code #{return_code}", "----- STDOUT:\n#{stdout_lines[0..-2].join("\n")}\n----- STDERR:\n#{cmd_stderr}" unless return_code.zero?
494
+ test_info[:validator].call(stdout_lines[0..-2], cmd_stderr.split("\n"), return_code)
497
495
  end
498
496
  end
499
497
  end
@@ -522,17 +520,17 @@ module HybridPlatformsConductor
522
520
  :test_on_check_node,
523
521
  @nodes.map { |node| { node: node } },
524
522
  tests_preparation: proc do |selected_tests|
525
- nodes_to_test = selected_tests.map { |test| test.node }.uniq.sort
523
+ nodes_to_test = selected_tests.map(&:node).uniq.sort
526
524
  @outputs =
527
525
  if @skip_run
528
- Hash[nodes_to_test.map do |node|
526
+ nodes_to_test.map do |node|
529
527
  run_log_file_name = "#{@config.hybrid_platforms_dir}/run_logs/#{node}.stdout"
530
528
  [
531
529
  node,
532
530
  # TODO: Find a way to also save stderr and the status code
533
- [0, File.exists?(run_log_file_name) ? File.read(run_log_file_name) : nil, '']
531
+ [0, File.exist?(run_log_file_name) ? File.read(run_log_file_name) : nil, '']
534
532
  ]
535
- end]
533
+ end.to_h
536
534
  else
537
535
  # Why-run deploy on all nodes
538
536
  @deployer.concurrent_execution = !log_debug?
@@ -543,7 +541,7 @@ module HybridPlatformsConductor
543
541
  rescue
544
542
  # If an exception occurred, make sure all concerned nodes are reporting the error
545
543
  nodes_to_test.each do |node|
546
- error "Error while checking check-node output: #{$!}#{log_debug? ? "\n#{$!.backtrace.join("\n")}" : ''}", node: node
544
+ error "Error while checking check-node output: #{$ERROR_INFO}#{log_debug? ? "\n#{$ERROR_INFO.backtrace.join("\n")}" : ''}", node: node
547
545
  end
548
546
  {}
549
547
  end
@@ -556,11 +554,11 @@ module HybridPlatformsConductor
556
554
  elsif stdout.is_a?(Symbol)
557
555
  test.error "Check-node run failed: #{stdout}."
558
556
  else
559
- test.error "Check-node returned error code #{exit_status}" unless exit_status == 0
557
+ test.error "Check-node returned error code #{exit_status}" unless exit_status.zero?
560
558
  begin
561
559
  test.test_on_check_node(stdout, stderr, exit_status)
562
560
  rescue
563
- test.error "Uncaught exception during test: #{$!}", $!.backtrace.join("\n")
561
+ test.error "Uncaught exception during test: #{$ERROR_INFO}", $ERROR_INFO.backtrace.join("\n")
564
562
  end
565
563
  end
566
564
  end