hybrid_platforms_conductor 32.18.0 → 33.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (255) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +36 -0
  3. data/README.md +3 -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 +8 -7
  8. data/bin/nodes_to_deploy +2 -2
  9. data/bin/setup +6 -6
  10. data/bin/topograph +1 -1
  11. data/docs/config_dsl.md +23 -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/plugins.md +21 -0
  19. data/docs/plugins/secrets_reader/cli.md +31 -0
  20. data/docs/plugins/secrets_reader/thycotic.md +46 -0
  21. data/lib/hybrid_platforms_conductor/action.rb +4 -4
  22. data/lib/hybrid_platforms_conductor/actions_executor.rb +37 -42
  23. data/lib/hybrid_platforms_conductor/bitbucket.rb +5 -4
  24. data/lib/hybrid_platforms_conductor/cmd_runner.rb +26 -23
  25. data/lib/hybrid_platforms_conductor/cmdb.rb +2 -2
  26. data/lib/hybrid_platforms_conductor/common_config_dsl/bitbucket.rb +2 -1
  27. data/lib/hybrid_platforms_conductor/common_config_dsl/confluence.rb +2 -1
  28. data/lib/hybrid_platforms_conductor/common_config_dsl/file_system_tests.rb +5 -4
  29. data/lib/hybrid_platforms_conductor/common_config_dsl/github.rb +4 -3
  30. data/lib/hybrid_platforms_conductor/common_config_dsl/idempotence_tests.rb +2 -2
  31. data/lib/hybrid_platforms_conductor/config.rb +8 -4
  32. data/lib/hybrid_platforms_conductor/confluence.rb +1 -1
  33. data/lib/hybrid_platforms_conductor/connector.rb +5 -2
  34. data/lib/hybrid_platforms_conductor/core_extensions/cleanroom/fix_kwargs.rb +116 -0
  35. data/lib/hybrid_platforms_conductor/core_extensions/symbol/zero.rb +24 -0
  36. data/lib/hybrid_platforms_conductor/credentials.rb +39 -36
  37. data/lib/hybrid_platforms_conductor/current_dir_monitor.rb +4 -1
  38. data/lib/hybrid_platforms_conductor/deployer.rb +185 -127
  39. data/lib/hybrid_platforms_conductor/executable.rb +20 -15
  40. data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/config.rb +10 -7
  41. data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/host_ip.rb +1 -1
  42. data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/host_keys.rb +2 -2
  43. data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/platform_handlers.rb +4 -4
  44. data/lib/hybrid_platforms_conductor/hpc_plugins/connector/local.rb +5 -1
  45. data/lib/hybrid_platforms_conductor/hpc_plugins/connector/ssh.rb +45 -49
  46. data/lib/hybrid_platforms_conductor/hpc_plugins/log/remote_fs.rb +6 -5
  47. data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/serverless_chef.rb +77 -79
  48. data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/serverless_chef/dsl_parser.rb +13 -0
  49. data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/serverless_chef/recipes_tree_builder.rb +39 -38
  50. data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/yaml_inventory.rb +5 -4
  51. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/docker.rb +43 -45
  52. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/podman.rb +18 -20
  53. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/proxmox.rb +119 -118
  54. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/proxmox/proxmox_waiter.rb +39 -43
  55. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/proxmox/reserve_proxmox_container +9 -13
  56. data/lib/hybrid_platforms_conductor/hpc_plugins/report/confluence.rb +2 -2
  57. data/lib/hybrid_platforms_conductor/hpc_plugins/report/mediawiki.rb +28 -21
  58. data/lib/hybrid_platforms_conductor/hpc_plugins/report/stdout.rb +26 -22
  59. data/lib/hybrid_platforms_conductor/hpc_plugins/secrets_reader/cli.rb +77 -0
  60. data/lib/hybrid_platforms_conductor/hpc_plugins/secrets_reader/my_secrets_reader_plugin.rb.sample +46 -0
  61. data/lib/hybrid_platforms_conductor/hpc_plugins/secrets_reader/thycotic.rb +90 -0
  62. data/lib/hybrid_platforms_conductor/hpc_plugins/test/bitbucket_conf.rb +3 -3
  63. data/lib/hybrid_platforms_conductor/hpc_plugins/test/check_deploy_and_idempotence.rb +4 -2
  64. data/lib/hybrid_platforms_conductor/hpc_plugins/test/deploy_freshness.rb +0 -1
  65. data/lib/hybrid_platforms_conductor/hpc_plugins/test/deploy_removes_root_access.rb +21 -19
  66. data/lib/hybrid_platforms_conductor/hpc_plugins/test/divergence.rb +2 -2
  67. data/lib/hybrid_platforms_conductor/hpc_plugins/test/executables.rb +2 -2
  68. data/lib/hybrid_platforms_conductor/hpc_plugins/test/file_system.rb +19 -21
  69. data/lib/hybrid_platforms_conductor/hpc_plugins/test/file_system_hdfs.rb +19 -21
  70. data/lib/hybrid_platforms_conductor/hpc_plugins/test/github_ci.rb +2 -3
  71. data/lib/hybrid_platforms_conductor/hpc_plugins/test/idempotence.rb +2 -2
  72. data/lib/hybrid_platforms_conductor/hpc_plugins/test/ip.rb +1 -1
  73. data/lib/hybrid_platforms_conductor/hpc_plugins/test/jenkins_ci_conf.rb +21 -22
  74. data/lib/hybrid_platforms_conductor/hpc_plugins/test/jenkins_ci_masters_ok.rb +10 -12
  75. data/lib/hybrid_platforms_conductor/hpc_plugins/test/linear_strategy.rb +9 -9
  76. data/lib/hybrid_platforms_conductor/hpc_plugins/test/local_users.rb +2 -2
  77. data/lib/hybrid_platforms_conductor/hpc_plugins/test/mounts.rb +2 -2
  78. data/lib/hybrid_platforms_conductor/hpc_plugins/test/orphan_files.rb +10 -9
  79. data/lib/hybrid_platforms_conductor/hpc_plugins/test/ports.rb +2 -2
  80. data/lib/hybrid_platforms_conductor/hpc_plugins/test/private_ips.rb +5 -5
  81. data/lib/hybrid_platforms_conductor/hpc_plugins/test/public_ips.rb +5 -5
  82. data/lib/hybrid_platforms_conductor/hpc_plugins/test/spectre.rb +4 -6
  83. data/lib/hybrid_platforms_conductor/hpc_plugins/test/veids.rb +3 -3
  84. data/lib/hybrid_platforms_conductor/hpc_plugins/test/vulnerabilities.rb +25 -24
  85. data/lib/hybrid_platforms_conductor/hpc_plugins/test_report/confluence.rb +2 -2
  86. data/lib/hybrid_platforms_conductor/hpc_plugins/test_report/stdout.rb +8 -6
  87. data/lib/hybrid_platforms_conductor/io_router.rb +14 -13
  88. data/lib/hybrid_platforms_conductor/json_dumper.rb +2 -2
  89. data/lib/hybrid_platforms_conductor/log.rb +2 -2
  90. data/lib/hybrid_platforms_conductor/logger_helpers.rb +19 -16
  91. data/lib/hybrid_platforms_conductor/nodes_handler.rb +89 -71
  92. data/lib/hybrid_platforms_conductor/parallel_threads.rb +7 -11
  93. data/lib/hybrid_platforms_conductor/platform_handler.rb +7 -7
  94. data/lib/hybrid_platforms_conductor/platforms_handler.rb +5 -3
  95. data/lib/hybrid_platforms_conductor/plugin.rb +2 -2
  96. data/lib/hybrid_platforms_conductor/plugins.rb +14 -8
  97. data/lib/hybrid_platforms_conductor/provisioner.rb +4 -4
  98. data/lib/hybrid_platforms_conductor/report.rb +2 -2
  99. data/lib/hybrid_platforms_conductor/reports_handler.rb +3 -2
  100. data/lib/hybrid_platforms_conductor/secrets_reader.rb +31 -0
  101. data/lib/hybrid_platforms_conductor/services_handler.rb +32 -29
  102. data/lib/hybrid_platforms_conductor/test_only_remote_node.rb +1 -1
  103. data/lib/hybrid_platforms_conductor/test_report.rb +15 -18
  104. data/lib/hybrid_platforms_conductor/tests_runner.rb +116 -118
  105. data/lib/hybrid_platforms_conductor/thycotic.rb +28 -19
  106. data/lib/hybrid_platforms_conductor/topographer.rb +200 -190
  107. data/lib/hybrid_platforms_conductor/topographer/plugins/graphviz.rb +8 -8
  108. data/lib/hybrid_platforms_conductor/topographer/plugins/json.rb +4 -4
  109. data/lib/hybrid_platforms_conductor/version.rb +1 -1
  110. data/spec/hybrid_platforms_conductor_test.rb +29 -6
  111. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/bash_spec.rb +18 -11
  112. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/interactive_spec.rb +2 -2
  113. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/remote_bash_spec.rb +32 -21
  114. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/ruby_spec.rb +75 -49
  115. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/scp_spec.rb +27 -15
  116. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions_spec.rb +90 -59
  117. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connection_spec.rb +46 -44
  118. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/local/connectable_nodes_spec.rb +12 -8
  119. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/local/remote_actions_spec.rb +4 -7
  120. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/cli_options_spec.rb +21 -22
  121. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/config_dsl_spec.rb +23 -24
  122. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/connectable_nodes_spec.rb +10 -6
  123. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/connections_spec.rb +106 -75
  124. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/global_helpers_spec.rb +145 -126
  125. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/node_helpers_spec.rb +3 -3
  126. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/remote_actions_spec.rb +29 -25
  127. data/spec/hybrid_platforms_conductor_test/api/actions_executor/logging_spec.rb +167 -142
  128. data/spec/hybrid_platforms_conductor_test/api/actions_executor/parallel_spec.rb +272 -244
  129. data/spec/hybrid_platforms_conductor_test/api/actions_executor/timeout_spec.rb +16 -16
  130. data/spec/hybrid_platforms_conductor_test/api/cmd_runner_spec.rb +42 -36
  131. data/spec/hybrid_platforms_conductor_test/api/config_spec.rb +24 -22
  132. data/spec/hybrid_platforms_conductor_test/api/deployer/check_spec.rb +4 -2
  133. data/spec/hybrid_platforms_conductor_test/api/deployer/config_dsl_spec.rb +24 -6
  134. data/spec/hybrid_platforms_conductor_test/api/deployer/deploy_spec.rb +34 -26
  135. data/spec/hybrid_platforms_conductor_test/api/deployer/log_plugins/remote_fs_spec.rb +21 -21
  136. data/spec/hybrid_platforms_conductor_test/api/deployer/parse_deploy_output_spec.rb +55 -59
  137. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioner_spec.rb +36 -62
  138. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/podman_spec.rb +17 -17
  139. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/config_dsl_spec.rb +4 -4
  140. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/create_spec.rb +44 -51
  141. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/destroy_spec.rb +3 -3
  142. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/ip_spec.rb +12 -16
  143. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/destroy_vm_spec.rb +31 -19
  144. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/expired_containers_spec.rb +324 -266
  145. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/ips_assignment_spec.rb +89 -61
  146. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/other_lxc_containers_resources_spec.rb +117 -93
  147. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/pve_node_resources_spec.rb +71 -54
  148. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/retries_spec.rb +10 -8
  149. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/vm_ids_assignment_spec.rb +80 -60
  150. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/start_spec.rb +1 -1
  151. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/state_spec.rb +1 -1
  152. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/stop_spec.rb +1 -1
  153. data/spec/hybrid_platforms_conductor_test/api/deployer/secrets_reader_plugins/cli_spec.rb +64 -0
  154. data/spec/hybrid_platforms_conductor_test/api/deployer/secrets_reader_plugins/thycotic_spec.rb +268 -0
  155. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/config_spec.rb +8 -10
  156. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/host_ip_spec.rb +33 -24
  157. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/host_keys_spec.rb +64 -51
  158. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/platform_handlers_spec.rb +3 -3
  159. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs_plugins_api_spec.rb +50 -51
  160. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/common_spec.rb +91 -81
  161. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/config_dsl_spec.rb +14 -16
  162. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/git_diff_impacts_spec.rb +51 -75
  163. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/nodes_selectors_spec.rb +35 -26
  164. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/platform_handlers_plugins_api_spec.rb +24 -16
  165. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/several_platforms_spec.rb +29 -19
  166. data/spec/hybrid_platforms_conductor_test/api/platform_handler_spec.rb +4 -4
  167. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/config_dsl_spec.rb +2 -2
  168. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/deploy_output_parsing_spec.rb +6 -6
  169. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/diff_impacts_spec.rb +57 -99
  170. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/inventory_spec.rb +4 -4
  171. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/packaging_spec.rb +32 -35
  172. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/services_deployment_spec.rb +10 -10
  173. data/spec/hybrid_platforms_conductor_test/api/platforms_handler_spec.rb +38 -27
  174. data/spec/hybrid_platforms_conductor_test/api/plugins_spec.rb +46 -52
  175. data/spec/hybrid_platforms_conductor_test/api/reports_handler_spec.rb +2 -2
  176. data/spec/hybrid_platforms_conductor_test/api/services_handler/actions_to_deploy_spec.rb +90 -58
  177. data/spec/hybrid_platforms_conductor_test/api/services_handler/deploy_allowed_spec.rb +38 -34
  178. data/spec/hybrid_platforms_conductor_test/api/services_handler/log_info_spec.rb +11 -9
  179. data/spec/hybrid_platforms_conductor_test/api/services_handler/package_spec.rb +193 -171
  180. data/spec/hybrid_platforms_conductor_test/api/services_handler/parse_deploy_output_spec.rb +66 -54
  181. data/spec/hybrid_platforms_conductor_test/api/services_handler/prepare_for_deploy_spec.rb +147 -133
  182. data/spec/hybrid_platforms_conductor_test/api/tests_runner/common_spec.rb +69 -49
  183. data/spec/hybrid_platforms_conductor_test/api/tests_runner/global_spec.rb +4 -3
  184. data/spec/hybrid_platforms_conductor_test/api/tests_runner/node_check_spec.rb +8 -5
  185. data/spec/hybrid_platforms_conductor_test/api/tests_runner/node_spec.rb +8 -5
  186. data/spec/hybrid_platforms_conductor_test/api/tests_runner/node_ssh_spec.rb +30 -27
  187. data/spec/hybrid_platforms_conductor_test/api/tests_runner/platform_spec.rb +12 -9
  188. data/spec/hybrid_platforms_conductor_test/api/tests_runner/reports_spec.rb +48 -47
  189. data/spec/hybrid_platforms_conductor_test/api/tests_runner/test_plugins/bitbucket_conf_spec.rb +5 -5
  190. data/spec/hybrid_platforms_conductor_test/api/tests_runner/test_plugins/github_ci_spec.rb +5 -5
  191. data/spec/hybrid_platforms_conductor_test/api/tests_runner/test_reports_plugins/confluence_spec.rb +5 -5
  192. data/spec/hybrid_platforms_conductor_test/cmdb_plugins/test_cmdb.rb +9 -9
  193. data/spec/hybrid_platforms_conductor_test/cmdb_plugins/{test_cmdb2.rb → test_cmdb_2.rb} +6 -6
  194. data/spec/hybrid_platforms_conductor_test/cmdb_plugins/test_cmdb_others.rb +3 -3
  195. data/spec/hybrid_platforms_conductor_test/cmdb_plugins/{test_cmdb_others2.rb → test_cmdb_others_2.rb} +2 -2
  196. data/spec/hybrid_platforms_conductor_test/docs_spec.rb +1 -1
  197. data/spec/hybrid_platforms_conductor_test/executables/{check-node_spec.rb → check_node_spec.rb} +4 -6
  198. data/spec/hybrid_platforms_conductor_test/executables/deploy_spec.rb +4 -6
  199. data/spec/hybrid_platforms_conductor_test/executables/get_impacted_nodes_spec.rb +76 -77
  200. data/spec/hybrid_platforms_conductor_test/executables/last_deploys_spec.rb +13 -15
  201. data/spec/hybrid_platforms_conductor_test/executables/nodes_to_deploy_spec.rb +289 -307
  202. data/spec/hybrid_platforms_conductor_test/executables/options/actions_executor_spec.rb +4 -6
  203. data/spec/hybrid_platforms_conductor_test/executables/options/cmd_runner_spec.rb +3 -5
  204. data/spec/hybrid_platforms_conductor_test/executables/options/common_spec.rb +8 -9
  205. data/spec/hybrid_platforms_conductor_test/executables/options/deployer_spec.rb +12 -196
  206. data/spec/hybrid_platforms_conductor_test/executables/options/nodes_handler_spec.rb +9 -10
  207. data/spec/hybrid_platforms_conductor_test/executables/options/nodes_selectors_spec.rb +9 -10
  208. data/spec/hybrid_platforms_conductor_test/executables/options/reports_handler_spec.rb +1 -1
  209. data/spec/hybrid_platforms_conductor_test/executables/options/tests_runner_spec.rb +22 -22
  210. data/spec/hybrid_platforms_conductor_test/executables/report_spec.rb +22 -16
  211. data/spec/hybrid_platforms_conductor_test/executables/run_spec.rb +32 -32
  212. data/spec/hybrid_platforms_conductor_test/executables/ssh_config_spec.rb +7 -9
  213. data/spec/hybrid_platforms_conductor_test/executables/test_spec.rb +3 -5
  214. data/spec/hybrid_platforms_conductor_test/helpers/actions_executor_helpers.rb +2 -2
  215. data/spec/hybrid_platforms_conductor_test/helpers/cmd_runner_helpers.rb +4 -3
  216. data/spec/hybrid_platforms_conductor_test/helpers/cmdb_helpers.rb +2 -2
  217. data/spec/hybrid_platforms_conductor_test/helpers/config_helpers.rb +1 -1
  218. data/spec/hybrid_platforms_conductor_test/helpers/connector_ssh_helpers.rb +12 -13
  219. data/spec/hybrid_platforms_conductor_test/helpers/deployer_helpers.rb +216 -14
  220. data/spec/hybrid_platforms_conductor_test/helpers/executables_helpers.rb +11 -11
  221. data/spec/hybrid_platforms_conductor_test/helpers/nodes_handler_helpers.rb +1 -1
  222. data/spec/hybrid_platforms_conductor_test/helpers/platforms_handler_helpers.rb +39 -28
  223. data/spec/hybrid_platforms_conductor_test/helpers/plugins_helpers.rb +1 -1
  224. data/spec/hybrid_platforms_conductor_test/helpers/provisioner_proxmox_helpers.rb +86 -111
  225. data/spec/hybrid_platforms_conductor_test/helpers/reports_handler_helpers.rb +1 -1
  226. data/spec/hybrid_platforms_conductor_test/helpers/serverless_chef_helpers.rb +3 -3
  227. data/spec/hybrid_platforms_conductor_test/helpers/services_handler_helpers.rb +1 -1
  228. data/spec/hybrid_platforms_conductor_test/helpers/tests_runner_helpers.rb +1 -1
  229. 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
  230. 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
  231. 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
  232. 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
  233. data/spec/hybrid_platforms_conductor_test/platform_handler_plugins/test.rb +1 -1
  234. data/spec/hybrid_platforms_conductor_test/platform_handler_plugins/{test2.rb → test_2.rb} +0 -0
  235. data/spec/hybrid_platforms_conductor_test/rubocop_spec.rb +31 -0
  236. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/1_node/nodes/node.json +3 -3
  237. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/data_bags/nodes/node.json +3 -3
  238. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/recipes/cookbooks/test_cookbook_2/libraries/default.rb +1 -0
  239. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/several_cookbooks/other_cookbooks/test_cookbook_2/libraries/default.rb +1 -0
  240. data/spec/hybrid_platforms_conductor_test/shared_examples/deployer.rb +952 -0
  241. data/spec/hybrid_platforms_conductor_test/test_connector.rb +4 -3
  242. data/spec/hybrid_platforms_conductor_test/test_log_no_read_plugin.rb +3 -1
  243. data/spec/hybrid_platforms_conductor_test/test_log_plugin.rb +3 -1
  244. data/spec/hybrid_platforms_conductor_test/test_plugins/global.rb +1 -0
  245. data/spec/hybrid_platforms_conductor_test/test_plugins/node.rb +1 -0
  246. data/spec/hybrid_platforms_conductor_test/test_plugins/node_check.rb +1 -0
  247. data/spec/hybrid_platforms_conductor_test/test_plugins/platform.rb +1 -0
  248. data/spec/hybrid_platforms_conductor_test/test_plugins/several_checks.rb +2 -2
  249. data/spec/hybrid_platforms_conductor_test/test_secrets_reader_plugin.rb +45 -0
  250. data/spec/hybrid_platforms_conductor_test/tests_report_plugin.rb +5 -6
  251. data/spec/spec_helper.rb +17 -18
  252. data/tools/check_md +16 -20
  253. data/tools/generate_mermaid +1 -1
  254. metadata +186 -144
  255. data/spec/hybrid_platforms_conductor_test/helpers/deployer_test_helpers.rb +0 -916
@@ -11,7 +11,7 @@ module HybridPlatformsConductor
11
11
  # Check that all repositories have a successful master branch on a Jenkins CI
12
12
  class JenkinsCiMastersOk < HybridPlatformsConductor::Test
13
13
 
14
- self.extend_config_dsl_with CommonConfigDsl::Bitbucket, :init_bitbucket
14
+ extend_config_dsl_with CommonConfigDsl::Bitbucket, :init_bitbucket
15
15
 
16
16
  SUCCESS_STATUSES = [
17
17
  # Add nil as the status of a currently running job (which is always the case for hybrid-platforms) is null
@@ -29,17 +29,15 @@ module HybridPlatformsConductor
29
29
  else
30
30
  master_info_url = "#{repo_info[:jenkins_ci_url]}/job/master/api/json"
31
31
  Credentials.with_credentials_for(:jenkins_ci, @logger, @logger_stderr, url: master_info_url) do |jenkins_user, jenkins_password|
32
- begin
33
- # Get the master branch info from the API
34
- master_info = JSON.parse(open(master_info_url, http_basic_authentication: [jenkins_user, jenkins_password]).read)
35
- # Get the last build's URL
36
- last_build_info_url = "#{master_info['lastBuild']['url']}/api/json"
37
- last_build_info = JSON.parse(open(last_build_info_url, http_basic_authentication: [jenkins_user, jenkins_password]).read)
38
- log_debug "Build info for #{master_info_url}:\n#{JSON.pretty_generate(last_build_info)}"
39
- error "Last build for job #{repo_info[:project]}/#{repo_info[:name]} is in status #{last_build_info['result']}: #{master_info['lastBuild']['url']}" unless SUCCESS_STATUSES.include?(last_build_info['result'])
40
- rescue
41
- error "Error while checking Jenkins CI job for #{repo_info[:project]}/#{repo_info[:name]} from URL #{master_info_url}: #{$!}"
42
- end
32
+ # Get the master branch info from the API
33
+ master_info = JSON.parse(URI.parse(master_info_url).open(http_basic_authentication: [jenkins_user, jenkins_password]).read)
34
+ # Get the last build's URL
35
+ last_build_info_url = "#{master_info['lastBuild']['url']}/api/json"
36
+ last_build_info = JSON.parse(URI.parse(last_build_info_url).open(http_basic_authentication: [jenkins_user, jenkins_password]).read)
37
+ log_debug "Build info for #{master_info_url}:\n#{JSON.pretty_generate(last_build_info)}"
38
+ error "Last build for job #{repo_info[:project]}/#{repo_info[:name]} is in status #{last_build_info['result']}: #{master_info['lastBuild']['url']}" unless SUCCESS_STATUSES.include?(last_build_info['result'])
39
+ rescue
40
+ error "Error while checking Jenkins CI job for #{repo_info[:project]}/#{repo_info[:name]} from URL #{master_info_url}: #{$ERROR_INFO}"
43
41
  end
44
42
  end
45
43
  end
@@ -17,7 +17,7 @@ module HybridPlatformsConductor
17
17
  log_to_stdout: log_debug?
18
18
  )
19
19
  stdout.split("\n").each do |merge_commit_id|
20
- _exit_status, stdout, _stderr = @cmd_runner.run_cmd(<<~EOS, log_to_stdout: log_debug?, no_exception: true, expected_code: [0, 1])
20
+ _exit_status, stdout, _stderr = @cmd_runner.run_cmd(<<~EO_BASH, log_to_stdout: log_debug?, no_exception: true, expected_code: [0, 1])
21
21
  cd #{@platform.repository_path} && \
22
22
  git --no-pager log \
23
23
  $(git merge-base \
@@ -27,14 +27,14 @@ module HybridPlatformsConductor
27
27
  --pretty=format:\"%H\" \
28
28
  --graph \
29
29
  | grep '|'
30
- EOS
31
- if !stdout.empty?
32
- _exit_status, stdout, _stderr = @cmd_runner.run_cmd(
33
- "cd #{@platform.repository_path} && git --no-pager log #{merge_commit_id} --pretty=format:%aI",
34
- log_to_stdout: log_debug?
35
- )
36
- error "Git history is not linear because of Merge commit #{merge_commit_id}" if Time.now - Time.parse(stdout.strip) < LOOKING_PERIOD
37
- end
30
+ EO_BASH
31
+ next if stdout.empty?
32
+
33
+ _exit_status, stdout, _stderr = @cmd_runner.run_cmd(
34
+ "cd #{@platform.repository_path} && git --no-pager log #{merge_commit_id} --pretty=format:%aI",
35
+ log_to_stdout: log_debug?
36
+ )
37
+ error "Git history is not linear because of Merge commit #{merge_commit_id}" if Time.now - Time.parse(stdout.strip) < LOOKING_PERIOD
38
38
  end
39
39
  end
40
40
 
@@ -24,7 +24,7 @@ module HybridPlatformsConductor
24
24
  # Array< Hash<Symbol, Object> >
25
25
  attr_reader :users_that_should_be_present
26
26
 
27
- # Initialize the DSL
27
+ # Initialize the DSL
28
28
  def init_local_users_test
29
29
  @users_that_should_be_absent = []
30
30
  @users_that_should_be_present = []
@@ -54,7 +54,7 @@ module HybridPlatformsConductor
54
54
 
55
55
  end
56
56
 
57
- self.extend_config_dsl_with ConfigDslExtension, :init_local_users_test
57
+ extend_config_dsl_with ConfigDslExtension, :init_local_users_test
58
58
 
59
59
  # Check my_test_plugin.rb.sample documentation for signature details.
60
60
  def test_on_node
@@ -24,7 +24,7 @@ module HybridPlatformsConductor
24
24
  # Array< Hash<Symbol, Object> >
25
25
  attr_reader :mount_rules_that_should_be_present
26
26
 
27
- # Initialize the DSL
27
+ # Initialize the DSL
28
28
  def init_mounts_test
29
29
  @mount_rules_that_should_be_absent = []
30
30
  @mount_rules_that_should_be_present = []
@@ -58,7 +58,7 @@ module HybridPlatformsConductor
58
58
 
59
59
  end
60
60
 
61
- self.extend_config_dsl_with ConfigDslExtension, :init_mounts_test
61
+ extend_config_dsl_with ConfigDslExtension, :init_mounts_test
62
62
 
63
63
  # Check my_test_plugin.rb.sample documentation for signature details.
64
64
  def test_on_node
@@ -18,7 +18,7 @@ module HybridPlatformsConductor
18
18
  # Array< Hash<Symbol, Object> >
19
19
  attr_reader :ignored_orphan_files_paths
20
20
 
21
- # Initialize the DSL
21
+ # Initialize the DSL
22
22
  def init_orphan_files_test
23
23
  # List of paths to ignore info. Each info has the following properties:
24
24
  # * *nodes_selectors_stack* (Array<Object>): Stack of nodes selectors impacted by this rule
@@ -34,13 +34,13 @@ module HybridPlatformsConductor
34
34
  def ignore_orphan_files_from(paths_to_ignore)
35
35
  @ignored_orphan_files_paths << {
36
36
  ignored_paths: paths_to_ignore.is_a?(Array) ? paths_to_ignore : [paths_to_ignore],
37
- nodes_selectors_stack: current_nodes_selectors_stack,
37
+ nodes_selectors_stack: current_nodes_selectors_stack
38
38
  }
39
39
  end
40
40
 
41
41
  end
42
42
 
43
- self.extend_config_dsl_with ConfigDslExtension, :init_orphan_files_test
43
+ extend_config_dsl_with ConfigDslExtension, :init_orphan_files_test
44
44
 
45
45
  # List of directories to always ignore
46
46
  DIRECTORIES_TO_ALWAYS_IGNORE = [
@@ -53,12 +53,13 @@ module HybridPlatformsConductor
53
53
  def test_on_node
54
54
  {
55
55
  # TODO: Access the user correctly when the user notion will be moved out of the ssh connector
56
- "#{@deployer.instance_variable_get(:@actions_executor).connector(:ssh).ssh_user == 'root' ? '' : "#{@nodes_handler.sudo_on(@node)} "}/usr/bin/find / \\( #{@nodes_handler.
57
- select_confs_for_node(@node, @config.ignored_orphan_files_paths).
58
- inject(DIRECTORIES_TO_ALWAYS_IGNORE) { |merged_paths, paths_to_ignore_info| merged_paths + paths_to_ignore_info[:ignored_paths] }.
59
- uniq.
60
- map { |dir| "-path #{dir}" }.
61
- join(' -o ')
56
+ "#{@deployer.instance_variable_get(:@actions_executor).connector(:ssh).ssh_user == 'root' ? '' : "#{@nodes_handler.sudo_on(@node)} "}/usr/bin/find / \\( #{
57
+ @nodes_handler.
58
+ select_confs_for_node(@node, @config.ignored_orphan_files_paths).
59
+ inject(DIRECTORIES_TO_ALWAYS_IGNORE) { |merged_paths, paths_to_ignore_info| merged_paths + paths_to_ignore_info[:ignored_paths] }.
60
+ uniq.
61
+ map { |dir| "-path #{dir}" }.
62
+ join(' -o ')
62
63
  } \\) -prune -o -nogroup -nouser -print" => {
63
64
  validator: proc do |stdout|
64
65
  assert_equal stdout, [], "#{stdout.size} orphan files found.", stdout.join("\n")
@@ -21,7 +21,7 @@ module HybridPlatformsConductor
21
21
  # Array< Hash<Symbol, Object> >
22
22
  attr_reader :ports_rules
23
23
 
24
- # Initialize the DSL
24
+ # Initialize the DSL
25
25
  def init_ports_test
26
26
  @ports_rules = []
27
27
  end
@@ -52,7 +52,7 @@ module HybridPlatformsConductor
52
52
 
53
53
  end
54
54
 
55
- self.extend_config_dsl_with ConfigDslExtension, :init_ports_test
55
+ extend_config_dsl_with ConfigDslExtension, :init_ports_test
56
56
 
57
57
  # Check my_test_plugin.rb.sample documentation for signature details.
58
58
  def test_for_node
@@ -11,15 +11,15 @@ module HybridPlatformsConductor
11
11
  def test
12
12
  # Get a map of private IPs per node
13
13
  @nodes_handler.prefetch_metadata_of @nodes_handler.known_nodes, :private_ips
14
- private_ips = Hash[@nodes_handler.
14
+ private_ips = @nodes_handler.
15
15
  known_nodes.
16
- map { |node| [node, @nodes_handler.get_private_ips_of(node) || []] }
17
- ]
16
+ map { |node| [node, @nodes_handler.get_private_ips_of(node) || []] }.
17
+ to_h
18
18
 
19
19
  # Check there are no duplicates
20
20
  nodes_per_private_ip = {}
21
- private_ips.each do |node, private_ips|
22
- private_ips.each do |private_ip|
21
+ private_ips.each do |node, node_private_ips|
22
+ node_private_ips.each do |private_ip|
23
23
  nodes_per_private_ip[private_ip] = [] unless nodes_per_private_ip.key?(private_ip)
24
24
  nodes_per_private_ip[private_ip] << node
25
25
  end
@@ -11,15 +11,15 @@ module HybridPlatformsConductor
11
11
  def test
12
12
  # Get a map of public IPs per node
13
13
  @nodes_handler.prefetch_metadata_of @nodes_handler.known_nodes, :public_ips
14
- public_ips = Hash[@nodes_handler.
14
+ public_ips = @nodes_handler.
15
15
  known_nodes.
16
- map { |node| [node, @nodes_handler.get_public_ips_of(node) || []] }
17
- ]
16
+ map { |node| [node, @nodes_handler.get_public_ips_of(node) || []] }.
17
+ to_h
18
18
 
19
19
  # Check there are no duplicates
20
20
  nodes_per_public_ip = {}
21
- public_ips.each do |node, public_ips|
22
- public_ips.each do |public_ip|
21
+ public_ips.each do |node, node_public_ips|
22
+ node_public_ips.each do |public_ip|
23
23
  nodes_per_public_ip[public_ip] = [] unless nodes_per_public_ip.key?(public_ip)
24
24
  nodes_per_public_ip[public_ip] << node
25
25
  end
@@ -17,11 +17,11 @@ module HybridPlatformsConductor
17
17
 
18
18
  # Check my_test_plugin.rb.sample documentation for signature details.
19
19
  def test_on_node
20
- spectre_cmd = <<~EOS
20
+ spectre_cmd = <<~EO_BASH
21
21
  #{@deployer.instance_variable_get(:@actions_executor).connector(:ssh).ssh_user == 'root' ? '' : "#{@nodes_handler.sudo_on(@node)} "}/bin/bash <<'EOAction'
22
22
  #{File.read("#{__dir__}/spectre-meltdown-checker.sh")}
23
23
  EOAction
24
- EOS
24
+ EO_BASH
25
25
  {
26
26
  spectre_cmd => {
27
27
  validator: proc do |stdout|
@@ -31,13 +31,11 @@ module HybridPlatformsConductor
31
31
  if status_idx.nil?
32
32
  error "Unable to find vulnerability section #{id}"
33
33
  else
34
- while !stdout[status_idx].nil? && !(stdout[status_idx] =~ /STATUS:[^A-Z]+([A-Z ]+)/)
35
- status_idx += 1
36
- end
34
+ status_idx += 1 while !stdout[status_idx].nil? && stdout[status_idx] !~ /STATUS:[^A-Z]+([A-Z ]+)/
37
35
  if stdout[status_idx].nil?
38
36
  error "Unable to find vulnerability status for #{id}"
39
37
  else
40
- status = $1.strip
38
+ status = Regexp.last_match(1).strip
41
39
  error "Status for #{name}: #{status}" if status != 'NOT VULNERABLE'
42
40
  end
43
41
  end
@@ -11,10 +11,10 @@ module HybridPlatformsConductor
11
11
  def test
12
12
  # Get a map of VEIDs per node
13
13
  @nodes_handler.prefetch_metadata_of @nodes_handler.known_nodes, :veid
14
- veids = Hash[@nodes_handler.
14
+ veids = @nodes_handler.
15
15
  known_nodes.
16
- map { |node| [node, @nodes_handler.get_veid_of(node) ? @nodes_handler.get_veid_of(node).to_i : nil] }
17
- ]
16
+ map { |node| [node, @nodes_handler.get_veid_of(node) ? @nodes_handler.get_veid_of(node).to_i : nil] }.
17
+ to_h
18
18
 
19
19
  # Check there are no duplicates
20
20
  veids.group_by { |_node, veid| veid }.each do |veid, nodes|
@@ -48,8 +48,9 @@ module HybridPlatformsConductor
48
48
  # Follow the last link recursively until we find a .xml or compressed file
49
49
  current_url = artifactory_url
50
50
  loop do
51
- current_url = "#{current_url}#{current_url.end_with?('/') ? '' : '/'}#{Nokogiri::HTML.parse(URI.open(current_url)).css('a').last['href']}"
51
+ current_url = "#{current_url}#{current_url.end_with?('/') ? '' : '/'}#{Nokogiri::HTML.parse(URI.parse(current_url).open).css('a').last['href']}"
52
52
  break if current_url.end_with?('.xml') || KNOWN_COMPRESSIONS.keys.any? { |file_ext| current_url.end_with?(".#{file_ext}") }
53
+
53
54
  log_debug "Follow last link to #{current_url}"
54
55
  end
55
56
  current_url
@@ -57,7 +58,7 @@ module HybridPlatformsConductor
57
58
  )
58
59
  # TODO: Access the user correctly when the user notion will be moved out of the ssh connector
59
60
  sudo = @deployer.instance_variable_get(:@actions_executor).connector(:ssh).ssh_user == 'root' ? '' : "#{@nodes_handler.sudo_on(@node)} "
60
- Hash[urls.map do |url|
61
+ urls.map do |url|
61
62
  # 1. Get the OVAL file on the node to be tested (uncompress it if needed)
62
63
  # 2. Make sure oscap is installed
63
64
  # 3. Generate the report for this OVAL file using oscap
@@ -67,13 +68,13 @@ module HybridPlatformsConductor
67
68
  packages_to_install = []
68
69
  KNOWN_COMPRESSIONS.each do |file_ext, compress_info|
69
70
  file_ending = ".#{file_ext}"
70
- if local_oval_file.end_with?(file_ending)
71
- uncompress_cmds << compress_info[:cmd].call(local_oval_file)
72
- packages_to_install.concat(compress_info[:packages])
73
- local_oval_file = File.basename(local_oval_file, file_ending)
74
- end
71
+ next unless local_oval_file.end_with?(file_ending)
72
+
73
+ uncompress_cmds << compress_info[:cmd].call(local_oval_file)
74
+ packages_to_install.concat(compress_info[:packages])
75
+ local_oval_file = File.basename(local_oval_file, file_ending)
75
76
  end
76
- cmds = <<~EOS
77
+ cmds = <<~EO_BASH
77
78
  set -e
78
79
  #{
79
80
  case image
@@ -85,7 +86,7 @@ module HybridPlatformsConductor
85
86
  # On Debian 10 we have to compile it from sources, as the packaged official version has core dumps.
86
87
  # cf https://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg1688223.html
87
88
  # TODO: Remove this Debian 10 specificity when the official libopenscap8 will be corrected
88
- <<~EOS2
89
+ <<~EO_BASH2
89
90
  if [ ! -x "$(command -v oscap)" ] || [ "$(oscap --version | head -n 1 | awk '{print $6}')" != "1.3.4" ]; then
90
91
  rm -rf openscap
91
92
  git clone --recurse-submodules https://github.com/OpenSCAP/openscap.git
@@ -97,7 +98,7 @@ module HybridPlatformsConductor
97
98
  #{sudo}make install
98
99
  fi
99
100
  #{sudo}apt install -y wget #{packages_to_install.join(' ')}
100
- EOS2
101
+ EO_BASH2
101
102
  else
102
103
  raise "Non supported image: #{image}. Please adapt this test's code."
103
104
  end
@@ -111,7 +112,7 @@ module HybridPlatformsConductor
111
112
  echo "===== RESULTS ====="
112
113
  cat "#{local_oval_file}.results.xml"
113
114
  cd ..
114
- EOS
115
+ EO_BASH
115
116
  [
116
117
  cmds,
117
118
  {
@@ -120,21 +121,21 @@ module HybridPlatformsConductor
120
121
  if idx_results.nil?
121
122
  error 'No results given by the oscap run', stdout.join("\n")
122
123
  else
123
- results = Nokogiri::XML(stdout[idx_results + 1..-1].join("\n"))
124
+ results = Nokogiri::XML(stdout[idx_results + 1..].join("\n"))
124
125
  results.remove_namespaces!
125
126
  oval_definitions = results.css('oval_results oval_definitions definitions definition')
126
127
  results.css('results system definitions definition').each do |definition_xml|
127
- if definition_xml['result'] == 'true'
128
- # Just found an OVAL item to be patched.
129
- definition_id = definition_xml['definition_id']
130
- oval_definition = oval_definitions.find { |el| el['id'] == definition_id }
131
- # We don't forcefully want to report all missing patches. Only the most important ones.
132
- severity = oval_definition.css('metadata advisory severity').text
133
- severity = 'Unknown' if severity.empty?
134
- if !oval_info.key?('reported_severities') || oval_info['reported_severities'].include?(severity)
135
- # Only consider the first line of the description, as sometimes it's very long
136
- error "Non-patched #{severity} vulnerability found: #{oval_definition.css('metadata title').text} - #{oval_definition.css('metadata description').text.split("\n").first}"
137
- end
128
+ next unless definition_xml['result'] == 'true'
129
+
130
+ # Just found an OVAL item to be patched.
131
+ definition_id = definition_xml['definition_id']
132
+ oval_definition = oval_definitions.find { |el| el['id'] == definition_id }
133
+ # We don't forcefully want to report all missing patches. Only the most important ones.
134
+ severity = oval_definition.css('metadata advisory severity').text
135
+ severity = 'Unknown' if severity.empty?
136
+ if !oval_info.key?('reported_severities') || oval_info['reported_severities'].include?(severity)
137
+ # Only consider the first line of the description, as sometimes it's very long
138
+ error "Non-patched #{severity} vulnerability found: #{oval_definition.css('metadata title').text} - #{oval_definition.css('metadata description').text.split("\n").first}"
138
139
  end
139
140
  end
140
141
  end
@@ -143,7 +144,7 @@ module HybridPlatformsConductor
143
144
  timeout: 240
144
145
  }
145
146
  ]
146
- end]
147
+ end.to_h
147
148
  else
148
149
  error "No OVAL file defined for image #{image} at #{oval_file}"
149
150
  {}
@@ -12,7 +12,7 @@ module HybridPlatformsConductor
12
12
  # Report tests results on a generated Confluence page
13
13
  class Confluence < HybridPlatformsConductor::TestReport
14
14
 
15
- self.extend_config_dsl_with CommonConfigDsl::Confluence, :init_confluence
15
+ extend_config_dsl_with CommonConfigDsl::Confluence, :init_confluence
16
16
 
17
17
  # Maximum errors to be reported by item
18
18
  MAX_ERROR_ITEMS_DISPLAYED = 10
@@ -34,7 +34,7 @@ module HybridPlatformsConductor
34
34
  at('h1:contains("Evolution")').
35
35
  search('~ structured-macro:first-of-type').
36
36
  css('table td').
37
- map { |td_element| td_element.text }.
37
+ map(&:text).
38
38
  each_slice(2).
39
39
  to_a.
40
40
  map { |(time_str, value_str)| [Time.parse("#{time_str} UTC"), value_str.to_f] }
@@ -97,18 +97,20 @@ module HybridPlatformsConductor
97
97
  table << [
98
98
  nodes_list,
99
99
  nodes_info[:nodes].size,
100
- nodes_info[:nodes].empty? ? '' : "#{(nodes_info[:tested_nodes].size*100.0/nodes_info[:nodes].size).to_i} %",
100
+ nodes_info[:nodes].empty? ? '' : "#{(nodes_info[:tested_nodes].size * 100.0 / nodes_info[:nodes].size).to_i} %",
101
101
  nodes_info[:tested_nodes].empty? ? '' : "#{((nodes_info[:tested_nodes].size - nodes_info[:tested_nodes_in_error_as_expected].size) * 100.0 / nodes_info[:tested_nodes].size).to_i} %",
102
102
  nodes_info[:tested_nodes].empty? ? '' : "#{((nodes_info[:tested_nodes].size - nodes_info[:tested_nodes_in_error].size) * 100.0 / nodes_info[:tested_nodes].size).to_i} %",
103
- nodes_info[:nodes].empty? ? '' :
103
+ if nodes_info[:nodes].empty?
104
+ ''
105
+ else
104
106
  ('=' * ((nodes_info[:tested_nodes_in_error_as_expected].size * PROGRESS_BAR_SIZE.to_f) / nodes_info[:nodes].size).round).yellow.bold +
105
- ('=' * (((nodes_info[:tested_nodes_in_error].size - nodes_info[:tested_nodes_in_error_as_expected].size).abs * PROGRESS_BAR_SIZE.to_f) / nodes_info[:nodes].size).round).red.bold +
106
- ('=' * (((nodes_info[:tested_nodes].size - nodes_info[:tested_nodes_in_error].size) * PROGRESS_BAR_SIZE.to_f) / nodes_info[:nodes].size).round).green.bold +
107
- ('=' * (((nodes_info[:nodes].size - nodes_info[:tested_nodes].size) * PROGRESS_BAR_SIZE.to_f) / nodes_info[:nodes].size).round).white.bold
107
+ ('=' * (((nodes_info[:tested_nodes_in_error].size - nodes_info[:tested_nodes_in_error_as_expected].size).abs * PROGRESS_BAR_SIZE.to_f) / nodes_info[:nodes].size).round).red.bold +
108
+ ('=' * (((nodes_info[:tested_nodes].size - nodes_info[:tested_nodes_in_error].size) * PROGRESS_BAR_SIZE.to_f) / nodes_info[:nodes].size).round).green.bold +
109
+ ('=' * (((nodes_info[:nodes].size - nodes_info[:tested_nodes].size) * PROGRESS_BAR_SIZE.to_f) / nodes_info[:nodes].size).round).white.bold
110
+ end
108
111
  ]
109
112
  end
110
113
  end)
111
-
112
114
  end
113
115
 
114
116
  end
@@ -30,6 +30,7 @@ module HybridPlatformsConductor
30
30
  # Start routing messages asynchronously
31
31
  def start
32
32
  raise 'IO router is already started. Can\'t start it again.' unless @reading_thread.nil?
33
+
33
34
  @end_read = false
34
35
  # Create a thread to handle routes asynchronously
35
36
  @reading_thread = Thread.new do
@@ -37,22 +38,21 @@ module HybridPlatformsConductor
37
38
  need_to_stop = @end_read.clone
38
39
  data_found = false
39
40
  @routes.each do |src_io, dst_ios|
40
- if src_io.is_a?(Queue)
41
- queue_size = src_io.size
42
- if queue_size > 0
43
- # There is data to be read from src_io
44
- data_found = true
45
- data_chunk_str = queue_size.times.map { src_io.pop }.join
46
- dst_ios.each do |dst_io|
47
- dst_io << data_chunk_str
48
- dst_io.flush if dst_io.respond_to?(:flush)
49
- end
50
- end
51
- else
52
- raise "Unknown type of source IO: #{src_io}"
41
+ raise "Unknown type of source IO: #{src_io}" unless src_io.is_a?(Queue)
42
+
43
+ queue_size = src_io.size
44
+ next unless queue_size.positive?
45
+
46
+ # There is data to be read from src_io
47
+ data_found = true
48
+ data_chunk_str = queue_size.times.map { src_io.pop }.join
49
+ dst_ios.each do |dst_io|
50
+ dst_io << data_chunk_str
51
+ dst_io.flush if dst_io.respond_to?(:flush)
53
52
  end
54
53
  end
55
54
  break if need_to_stop && !data_found
55
+
56
56
  sleep 0.1
57
57
  end
58
58
  end
@@ -61,6 +61,7 @@ module HybridPlatformsConductor
61
61
  # Stop routing messages asynchronously
62
62
  def stop
63
63
  raise 'IO router is not started. Can\'t stop it.' if @reading_thread.nil?
64
+
64
65
  @end_read = true
65
66
  @reading_thread.join
66
67
  end