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
@@ -0,0 +1,223 @@
1
+ describe HybridPlatformsConductor::Deployer do
2
+
3
+ context 'when checking log plugins' do
4
+
5
+ context 'with remote_fs' do
6
+
7
+ # Return a test platform ready to test the remote_fs log plugin
8
+ #
9
+ # Parameters::
10
+ # * *block* (Proc): Code called with platform prepared
11
+ def with_test_platform_for_remote_fs(&block)
12
+ with_test_platform({ nodes: { 'node' => { services: %w[service1 service2] } } }, additional_config: 'send_logs_to :remote_fs', &block)
13
+ end
14
+
15
+ it 'returns actions to save logs' do
16
+ with_test_platform_for_remote_fs do
17
+ with_connections_mocked_on ['node'] do
18
+ test_actions_executor.connector(:ssh).ssh_user = 'test_user'
19
+ expect_services_handler_to_deploy('node' => %w[service1 service2])
20
+ expect_actions_executor_runs [
21
+ # First run, we expect the mutex to be setup, and the deployment actions to be run
22
+ proc do |actions_per_nodes|
23
+ expect_actions_to_deploy_on(
24
+ actions_per_nodes,
25
+ 'node',
26
+ mocked_result: { 'node' => [0, 'Deploy successful stdout', 'Deploy successful stderr'] }
27
+ )
28
+ end,
29
+ # Second run, we expect the mutex to be released
30
+ proc { |actions_per_nodes| expect_actions_to_unlock(actions_per_nodes, 'node') },
31
+ # Third run, we expect logs to be uploaded on the node
32
+ proc do |actions_per_nodes|
33
+ expect(actions_per_nodes['node'].size).to eq 3
34
+ expect(actions_per_nodes['node'][0].keys.sort).to eq %i[ruby remote_bash].sort
35
+ expect(actions_per_nodes['node'][0][:remote_bash]).to eq 'sudo -u root mkdir -p /var/log/deployments && sudo -u root chmod 600 /var/log/deployments'
36
+ expect(actions_per_nodes['node'][1].keys.sort).to eq %i[scp].sort
37
+ expect(actions_per_nodes['node'][1][:scp].delete(:sudo)).to eq true
38
+ expect(actions_per_nodes['node'][1][:scp].delete(:owner)).to eq 'root'
39
+ expect(actions_per_nodes['node'][1][:scp].delete(:group)).to eq 'root'
40
+ expect(actions_per_nodes['node'][1][:scp].size).to eq 1
41
+ tmp_log_file = actions_per_nodes['node'][1][:scp].first[0]
42
+ expect(actions_per_nodes['node'][1][:scp].first[1]).to eq '/var/log/deployments'
43
+ expect(actions_per_nodes['node'][2].keys.sort).to eq %i[ruby remote_bash].sort
44
+ expect(actions_per_nodes['node'][2][:remote_bash]).to eq "sudo -u root chmod 600 /var/log/deployments/#{File.basename(tmp_log_file)}"
45
+ # Call the Ruby codes to be tested
46
+ actions_per_nodes['node'][0][:ruby].call
47
+ expect(File.exist?(tmp_log_file)).to eq true
48
+ file_content_regexp = Regexp.new <<~EOREGEXP
49
+ repo_name_0: platform
50
+ commit_id_0: 123456
51
+ commit_message_0: Test commit for node: service1, service2
52
+ date: \\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}
53
+ user: test_user
54
+ debug: No
55
+ services: service1, service2
56
+ exit_status: 0
57
+ ===== STDOUT =====
58
+ Deploy successful stdout
59
+ ===== STDERR =====
60
+ Deploy successful stderr
61
+ EOREGEXP
62
+ expect(File.read(tmp_log_file)).to match file_content_regexp
63
+ actions_per_nodes['node'][2][:ruby].call
64
+ # Check temporary log file gets deleted for security reasons
65
+ expect(File.exist?(tmp_log_file)).to eq false
66
+ end
67
+ ]
68
+ expect(test_deployer.deploy_on('node')).to eq('node' => [0, 'Deploy successful stdout', 'Deploy successful stderr'])
69
+ end
70
+ end
71
+ end
72
+
73
+ it 'returns actions to save logs using root' do
74
+ with_test_platform_for_remote_fs do
75
+ with_connections_mocked_on ['node'] do
76
+ test_actions_executor.connector(:ssh).ssh_user = 'root'
77
+ expect_services_handler_to_deploy('node' => %w[service1 service2])
78
+ expect_actions_executor_runs [
79
+ # First run, we expect the mutex to be setup, and the deployment actions to be run
80
+ proc do |actions_per_nodes|
81
+ expect_actions_to_deploy_on(
82
+ actions_per_nodes,
83
+ 'node',
84
+ sudo: nil,
85
+ mocked_result: { 'node' => [0, 'Deploy successful stdout', 'Deploy successful stderr'] }
86
+ )
87
+ end,
88
+ # Second run, we expect the mutex to be released
89
+ proc { |actions_per_nodes| expect_actions_to_unlock(actions_per_nodes, 'node', sudo: nil) },
90
+ # Third run, we expect logs to be uploaded on the node
91
+ proc do |actions_per_nodes|
92
+ expect(actions_per_nodes['node'].size).to eq 3
93
+ expect(actions_per_nodes['node'][0].keys.sort).to eq %i[ruby remote_bash].sort
94
+ expect(actions_per_nodes['node'][0][:remote_bash]).to eq 'mkdir -p /var/log/deployments && chmod 600 /var/log/deployments'
95
+ expect(actions_per_nodes['node'][1].keys.sort).to eq %i[scp].sort
96
+ expect(actions_per_nodes['node'][1][:scp].delete(:sudo)).to eq false
97
+ expect(actions_per_nodes['node'][1][:scp].delete(:owner)).to eq 'root'
98
+ expect(actions_per_nodes['node'][1][:scp].delete(:group)).to eq 'root'
99
+ expect(actions_per_nodes['node'][1][:scp].size).to eq 1
100
+ tmp_log_file = actions_per_nodes['node'][1][:scp].first[0]
101
+ expect(actions_per_nodes['node'][1][:scp].first[1]).to eq '/var/log/deployments'
102
+ expect(actions_per_nodes['node'][2].keys.sort).to eq %i[ruby remote_bash].sort
103
+ expect(actions_per_nodes['node'][2][:remote_bash]).to eq "chmod 600 /var/log/deployments/#{File.basename(tmp_log_file)}"
104
+ # Call the Ruby codes to be tested
105
+ actions_per_nodes['node'][0][:ruby].call
106
+ expect(File.exist?(tmp_log_file)).to eq true
107
+ file_content_regexp = Regexp.new <<~EOREGEXP
108
+ repo_name_0: platform
109
+ commit_id_0: 123456
110
+ commit_message_0: Test commit for node: service1, service2
111
+ date: \\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}
112
+ user: root
113
+ debug: No
114
+ services: service1, service2
115
+ exit_status: 0
116
+ ===== STDOUT =====
117
+ Deploy successful stdout
118
+ ===== STDERR =====
119
+ Deploy successful stderr
120
+ EOREGEXP
121
+ expect(File.read(tmp_log_file)).to match file_content_regexp
122
+ actions_per_nodes['node'][2][:ruby].call
123
+ # Check temporary log file gets deleted for security reasons
124
+ expect(File.exist?(tmp_log_file)).to eq false
125
+ end
126
+ ]
127
+ expect(test_deployer.deploy_on('node')).to eq('node' => [0, 'Deploy successful stdout', 'Deploy successful stderr'])
128
+ end
129
+ end
130
+ end
131
+
132
+ it 'reads logs' do
133
+ with_test_platform_for_remote_fs do
134
+ expect_actions_executor_runs [
135
+ # Expect the actions to get log files
136
+ proc do |actions_per_nodes|
137
+ expect(actions_per_nodes).to eq('node' => [{ remote_bash: 'sudo -u root cat /var/log/deployments/`sudo -u root ls -t /var/log/deployments/ | head -1`' }])
138
+ { 'node' => [0, <<~EO_STDOUT, ''] }
139
+ repo_name_0: platform
140
+ commit_id_0: 123456
141
+ commit_message_0: Test commit for node: service1, service2
142
+ diff_files_0: file1, file2, file3
143
+ date: 2017-11-23 18:43:01
144
+ user: test_user
145
+ debug: Yes
146
+ services: service1, service2, service3
147
+ exit_status: 0
148
+ ===== STDOUT =====
149
+ Deploy successful stdout
150
+ ===== STDERR =====
151
+ Deploy successful stderr
152
+ EO_STDOUT
153
+ end
154
+ ]
155
+ expect(test_deployer.deployment_info_from('node')).to eq(
156
+ 'node' => {
157
+ deployment_info: {
158
+ repo_name_0: 'platform',
159
+ commit_id_0: '123456',
160
+ commit_message_0: 'Test commit for node: service1, service2',
161
+ diff_files_0: %w[file1 file2 file3],
162
+ date: Time.parse('2017-11-23 18:43:01 UTC'),
163
+ debug: true,
164
+ user: 'test_user'
165
+ },
166
+ exit_status: 0,
167
+ services: %w[service1 service2 service3],
168
+ stderr: 'Deploy successful stderr',
169
+ stdout: 'Deploy successful stdout'
170
+ }
171
+ )
172
+ end
173
+ end
174
+
175
+ it 'reads logs using root' do
176
+ with_test_platform_for_remote_fs do
177
+ test_actions_executor.connector(:ssh).ssh_user = 'root'
178
+ expect_actions_executor_runs [
179
+ # Expect the actions to get log files
180
+ proc do |actions_per_nodes|
181
+ expect(actions_per_nodes).to eq('node' => [{ remote_bash: 'cat /var/log/deployments/`ls -t /var/log/deployments/ | head -1`' }])
182
+ { 'node' => [0, <<~EO_STDOUT, ''] }
183
+ repo_name_0: platform
184
+ commit_id_0: 123456
185
+ commit_message_0: Test commit for node: service1, service2
186
+ diff_files_0: file1, file2, file3
187
+ date: 2017-11-23 18:43:01
188
+ user: test_user
189
+ debug: Yes
190
+ services: service1, service2, service3
191
+ exit_status: 0
192
+ ===== STDOUT =====
193
+ Deploy successful stdout
194
+ ===== STDERR =====
195
+ Deploy successful stderr
196
+ EO_STDOUT
197
+ end
198
+ ]
199
+ expect(test_deployer.deployment_info_from('node')).to eq(
200
+ 'node' => {
201
+ deployment_info: {
202
+ repo_name_0: 'platform',
203
+ commit_id_0: '123456',
204
+ commit_message_0: 'Test commit for node: service1, service2',
205
+ diff_files_0: %w[file1 file2 file3],
206
+ date: Time.parse('2017-11-23 18:43:01 UTC'),
207
+ debug: true,
208
+ user: 'test_user'
209
+ },
210
+ exit_status: 0,
211
+ services: %w[service1 service2 service3],
212
+ stderr: 'Deploy successful stderr',
213
+ stdout: 'Deploy successful stdout'
214
+ }
215
+ )
216
+ end
217
+ end
218
+
219
+ end
220
+
221
+ end
222
+
223
+ end
@@ -1,29 +1,27 @@
1
1
  describe HybridPlatformsConductor::Deployer do
2
2
 
3
- context 'checking parsing output of deployments' do
3
+ context 'when checking parsing output of deployments' do
4
4
 
5
5
  it 'returns tasks of deployment logs' do
6
- with_test_platform do
7
- expect(test_services_handler).to receive(:parse_deploy_output).with('stdout', 'stderr') do
8
- [
9
- {
10
- node: 'node',
11
- service: 'service',
12
- check: false,
13
- tasks: [
14
- {
15
- name: 'Task1',
16
- status: :identical
17
- },
18
- {
19
- name: 'Task2',
20
- status: :changed,
21
- diffs: 'Diffs for Task2'
22
- }
23
- ]
24
- }
25
- ]
26
- end
6
+ with_test_platform({}) do
7
+ expect(test_services_handler).to receive(:parse_deploy_output).with('stdout', 'stderr').and_return [
8
+ {
9
+ node: 'node',
10
+ service: 'service',
11
+ check: false,
12
+ tasks: [
13
+ {
14
+ name: 'Task1',
15
+ status: :identical
16
+ },
17
+ {
18
+ name: 'Task2',
19
+ status: :changed,
20
+ diffs: 'Diffs for Task2'
21
+ }
22
+ ]
23
+ }
24
+ ]
27
25
  expect(test_deployer.parse_deploy_output('node', 'stdout', 'stderr')).to eq [
28
26
  {
29
27
  name: 'Task1',
@@ -39,43 +37,41 @@ describe HybridPlatformsConductor::Deployer do
39
37
  end
40
38
 
41
39
  it 'returns tasks of deployment logs from several services deployments' do
42
- with_test_platform do
43
- expect(test_services_handler).to receive(:parse_deploy_output).with('stdout', 'stderr') do
44
- [
45
- {
46
- node: 'node1',
47
- service: 'service1',
48
- check: false,
49
- tasks: [
50
- {
51
- name: 'Task1',
52
- status: :identical
53
- },
54
- {
55
- name: 'Task2',
56
- status: :changed,
57
- diffs: 'Diffs for Task2'
58
- }
59
- ]
60
- },
61
- {
62
- node: 'node2',
63
- service: 'service2',
64
- check: false,
65
- tasks: [
66
- {
67
- name: 'Task3',
68
- status: :identical
69
- },
70
- {
71
- name: 'Task4',
72
- status: :changed,
73
- diffs: 'Diffs for Task4'
74
- }
75
- ]
76
- }
77
- ]
78
- end
40
+ with_test_platform({}) do
41
+ expect(test_services_handler).to receive(:parse_deploy_output).with('stdout', 'stderr').and_return [
42
+ {
43
+ node: 'node1',
44
+ service: 'service1',
45
+ check: false,
46
+ tasks: [
47
+ {
48
+ name: 'Task1',
49
+ status: :identical
50
+ },
51
+ {
52
+ name: 'Task2',
53
+ status: :changed,
54
+ diffs: 'Diffs for Task2'
55
+ }
56
+ ]
57
+ },
58
+ {
59
+ node: 'node2',
60
+ service: 'service2',
61
+ check: false,
62
+ tasks: [
63
+ {
64
+ name: 'Task3',
65
+ status: :identical
66
+ },
67
+ {
68
+ name: 'Task4',
69
+ status: :changed,
70
+ diffs: 'Diffs for Task4'
71
+ }
72
+ ]
73
+ }
74
+ ]
79
75
  expect(test_deployer.parse_deploy_output('node', 'stdout', 'stderr')).to eq [
80
76
  {
81
77
  name: 'Task1',
@@ -3,48 +3,40 @@ require 'securerandom'
3
3
 
4
4
  describe HybridPlatformsConductor::Deployer do
5
5
 
6
- context 'checking provisioning' do
6
+ context 'when checking provisioning' do
7
7
 
8
8
  it 'gives a new test instance ready to be used in place of the node' do
9
- with_test_platform(
10
- nodes: { 'node' => { meta: { host_ip: '192.168.42.42' } } }
11
- ) do |repository|
9
+ with_test_platform({ nodes: { 'node' => { meta: { host_ip: '192.168.42.42' } } } }) do
12
10
  register_plugins(:provisioner, { test_provisioner: HybridPlatformsConductorTest::TestProvisioner })
13
11
  File.write("#{test_config.hybrid_platforms_dir}/dummy_secrets.json", '{}')
14
12
  HybridPlatformsConductorTest::TestProvisioner.mocked_states = %i[created created running exited]
15
13
  HybridPlatformsConductorTest::TestProvisioner.mocked_ip = '172.17.0.1'
16
- expect(Socket).to receive(:tcp).with('172.17.0.1', 22, { connect_timeout: 1 }) do |&block|
17
- block.call
18
- end
14
+ expect(Socket).to receive(:tcp).with('172.17.0.1', 22, { connect_timeout: 1 }).and_yield
19
15
  provisioner = nil
20
16
  test_deployer.with_test_provisioned_instance(:test_provisioner, 'node', environment: 'hpc_testing_provisioner') do |sub_test_deployer, test_instance|
21
17
  expect(sub_test_deployer.local_environment).to eq true
22
18
  provisioner = test_instance
23
19
  expect(test_instance.node).to eq 'node'
24
- expect(test_instance.environment).to match /^#{Regexp.escape(`whoami`.strip)}_hpc_testing_provisioner_\d+_\d+_\w+$/
20
+ expect(test_instance.environment).to match(/^#{Regexp.escape(`whoami`.strip)}_hpc_testing_provisioner_\d+_\d+_\w+$/)
25
21
  end
26
22
  expect(provisioner.actions).to eq %i[create state state start state ip ip stop state destroy]
27
23
  end
28
24
  end
29
25
 
30
26
  it 'gives a new test instance ready to be used in place of the node, using the timeout given by the provisioner' do
31
- with_test_platform(
32
- nodes: { 'node' => { meta: { host_ip: '192.168.42.42' } } }
33
- ) do |repository|
27
+ with_test_platform({ nodes: { 'node' => { meta: { host_ip: '192.168.42.42' } } } }) do
34
28
  register_plugins(:provisioner, { test_provisioner: HybridPlatformsConductorTest::TestProvisioner })
35
29
  File.write("#{test_config.hybrid_platforms_dir}/dummy_secrets.json", '{}')
36
30
  HybridPlatformsConductorTest::TestProvisioner.mocked_states = %i[created created running exited]
37
31
  HybridPlatformsConductorTest::TestProvisioner.mocked_ip = '172.17.0.1'
38
32
  HybridPlatformsConductorTest::TestProvisioner.mocked_default_timeout = 666
39
- expect(Socket).to receive(:tcp).with('172.17.0.1', 22, { connect_timeout: 666 }) do |&block|
40
- block.call
41
- end
33
+ expect(Socket).to receive(:tcp).with('172.17.0.1', 22, { connect_timeout: 666 }).and_yield
42
34
  provisioner = nil
43
35
  test_deployer.with_test_provisioned_instance(:test_provisioner, 'node', environment: 'hpc_testing_provisioner') do |sub_test_deployer, test_instance|
44
36
  expect(sub_test_deployer.local_environment).to eq true
45
37
  provisioner = test_instance
46
38
  expect(test_instance.node).to eq 'node'
47
- expect(test_instance.environment).to match /^#{Regexp.escape(`whoami`.strip)}_hpc_testing_provisioner_\d+_\d+_\w+$/
39
+ expect(test_instance.environment).to match(/^#{Regexp.escape(`whoami`.strip)}_hpc_testing_provisioner_\d+_\d+_\w+$/)
48
40
  end
49
41
  expect(provisioner.actions).to eq %i[create state state start state ip ip stop state destroy]
50
42
  end
@@ -58,26 +50,24 @@ describe HybridPlatformsConductor::Deployer do
58
50
  'node2' => { meta: { host_ip: '192.168.42.2', ssh_session_exec: false } }
59
51
  }
60
52
  },
61
- false,
62
- '
53
+ additional_config: <<~'EO_CONFIG'
63
54
  for_nodes(%w[node1 node2]) do
64
55
  transform_ssh_connection do |node, connection, connection_user, gateway, gateway_user|
65
56
  ["#{connection}_#{node}", "#{connection_user}_#{node}", "#{gateway}_#{node}", "#{gateway_user}_#{node}"]
66
57
  end
67
58
  end
68
- '
69
- ) do |repository|
59
+ EO_CONFIG
60
+ ) do
70
61
  register_plugins(:provisioner, { test_provisioner: HybridPlatformsConductorTest::TestProvisioner })
71
62
  File.write("#{test_config.hybrid_platforms_dir}/dummy_secrets.json", '{}')
72
63
  HybridPlatformsConductorTest::TestProvisioner.mocked_states = %i[created created running exited]
73
64
  HybridPlatformsConductorTest::TestProvisioner.mocked_ip = '172.17.0.1'
74
- expect(Socket).to receive(:tcp).with('172.17.0.1', 22, { connect_timeout: 1 }) do |&block|
75
- block.call
76
- end
65
+ expect(Socket).to receive(:tcp).with('172.17.0.1', 22, { connect_timeout: 1 }).and_yield
77
66
  test_deployer.with_test_provisioned_instance(:test_provisioner, 'node1', environment: 'hpc_testing_provisioner') do |sub_test_deployer, test_instance|
78
- expect(sub_test_deployer.instance_eval { @nodes_handler.get_ssh_session_exec_of('node1') }).to eq true
79
- expect(sub_test_deployer.instance_eval { @nodes_handler.get_ssh_session_exec_of('node2') }).to eq false
80
- ssh_transforms = test_instance.instance_eval { @config.ssh_connection_transforms }
67
+ sub_nodes_handler = sub_test_deployer.instance_variable_get(:@nodes_handler)
68
+ expect(sub_nodes_handler.get_ssh_session_exec_of('node1')).to eq true
69
+ expect(sub_nodes_handler.get_ssh_session_exec_of('node2')).to eq false
70
+ ssh_transforms = test_instance.instance_variable_get(:@config).ssh_connection_transforms
81
71
  expect(ssh_transforms.size).to eq 1
82
72
  expect(ssh_transforms[0][:nodes_selectors_stack]).to eq [%w[node2]]
83
73
  end
@@ -92,17 +82,16 @@ describe HybridPlatformsConductor::Deployer do
92
82
  'node2' => { meta: { local_node: true } }
93
83
  }
94
84
  }
95
- ) do |repository|
85
+ ) do
96
86
  register_plugins(:provisioner, { test_provisioner: HybridPlatformsConductorTest::TestProvisioner })
97
87
  File.write("#{test_config.hybrid_platforms_dir}/dummy_secrets.json", '{}')
98
88
  HybridPlatformsConductorTest::TestProvisioner.mocked_states = %i[created created running exited]
99
89
  HybridPlatformsConductorTest::TestProvisioner.mocked_ip = '172.17.0.1'
100
- expect(Socket).to receive(:tcp).with('172.17.0.1', 22, { connect_timeout: 1 }) do |&block|
101
- block.call
102
- end
103
- test_deployer.with_test_provisioned_instance(:test_provisioner, 'node1', environment: 'hpc_testing_provisioner') do |sub_test_deployer, test_instance|
104
- expect(sub_test_deployer.instance_eval { @nodes_handler.get_local_node_of('node1') }).to eq false
105
- expect(sub_test_deployer.instance_eval { @nodes_handler.get_local_node_of('node2') }).to eq true
90
+ expect(Socket).to receive(:tcp).with('172.17.0.1', 22, { connect_timeout: 1 }).and_yield
91
+ test_deployer.with_test_provisioned_instance(:test_provisioner, 'node1', environment: 'hpc_testing_provisioner') do |sub_test_deployer|
92
+ sub_nodes_handler = sub_test_deployer.instance_variable_get(:@nodes_handler)
93
+ expect(sub_nodes_handler.get_local_node_of('node1')).to eq false
94
+ expect(sub_nodes_handler.get_local_node_of('node2')).to eq true
106
95
  end
107
96
  end
108
97
  end
@@ -115,22 +104,19 @@ describe HybridPlatformsConductor::Deployer do
115
104
  'node2' => { meta: { host_ip: '192.168.42.2' } }
116
105
  }
117
106
  },
118
- false,
119
- '
107
+ additional_config: <<~'EO_CONFIG'
120
108
  for_nodes(%w[node1 node2]) do
121
109
  sudo_for { |user| "other_sudo --user #{user}" }
122
110
  end
123
- '
124
- ) do |repository|
111
+ EO_CONFIG
112
+ ) do
125
113
  register_plugins(:provisioner, { test_provisioner: HybridPlatformsConductorTest::TestProvisioner })
126
114
  File.write("#{test_config.hybrid_platforms_dir}/dummy_secrets.json", '{}')
127
115
  HybridPlatformsConductorTest::TestProvisioner.mocked_states = %i[created created running exited]
128
116
  HybridPlatformsConductorTest::TestProvisioner.mocked_ip = '172.17.0.1'
129
- expect(Socket).to receive(:tcp).with('172.17.0.1', 22, { connect_timeout: 1 }) do |&block|
130
- block.call
131
- end
132
- test_deployer.with_test_provisioned_instance(:test_provisioner, 'node1', environment: 'hpc_testing_provisioner') do |sub_test_deployer, test_instance|
133
- sudo_procs = test_instance.instance_eval { @config.sudo_procs }
117
+ expect(Socket).to receive(:tcp).with('172.17.0.1', 22, { connect_timeout: 1 }).and_yield
118
+ test_deployer.with_test_provisioned_instance(:test_provisioner, 'node1', environment: 'hpc_testing_provisioner') do |_sub_test_deployer, test_instance|
119
+ sudo_procs = test_instance.instance_variable_get(:@config).sudo_procs
134
120
  expect(sudo_procs.size).to eq 1
135
121
  expect(sudo_procs[0][:nodes_selectors_stack]).to eq [%w[node2]]
136
122
  end
@@ -138,16 +124,12 @@ describe HybridPlatformsConductor::Deployer do
138
124
  end
139
125
 
140
126
  it 'does not destroy instances when asked to reuse' do
141
- with_test_platform(
142
- nodes: { 'node' => { meta: { host_ip: '192.168.42.42' } } }
143
- ) do |repository|
127
+ with_test_platform({ nodes: { 'node' => { meta: { host_ip: '192.168.42.42' } } } }) do
144
128
  register_plugins(:provisioner, { test_provisioner: HybridPlatformsConductorTest::TestProvisioner })
145
129
  File.write("#{test_config.hybrid_platforms_dir}/dummy_secrets.json", '{}')
146
130
  HybridPlatformsConductorTest::TestProvisioner.mocked_states = %i[created created running exited]
147
131
  HybridPlatformsConductorTest::TestProvisioner.mocked_ip = '172.17.0.1'
148
- expect(Socket).to receive(:tcp).with('172.17.0.1', 22, { connect_timeout: 1 }) do |&block|
149
- block.call
150
- end
132
+ expect(Socket).to receive(:tcp).with('172.17.0.1', 22, { connect_timeout: 1 }).and_yield
151
133
  provisioner = nil
152
134
  test_deployer.with_test_provisioned_instance(:test_provisioner, 'node', environment: 'hpc_testing_provisioner', reuse_instance: true) do |sub_test_deployer, test_instance|
153
135
  expect(sub_test_deployer.local_environment).to eq true
@@ -160,16 +142,12 @@ describe HybridPlatformsConductor::Deployer do
160
142
  end
161
143
 
162
144
  it 'reuses running instances when asked to reuse' do
163
- with_test_platform(
164
- nodes: { 'node' => { meta: { host_ip: '192.168.42.42' } } }
165
- ) do |repository|
145
+ with_test_platform({ nodes: { 'node' => { meta: { host_ip: '192.168.42.42' } } } }) do
166
146
  register_plugins(:provisioner, { test_provisioner: HybridPlatformsConductorTest::TestProvisioner })
167
147
  File.write("#{test_config.hybrid_platforms_dir}/dummy_secrets.json", '{}')
168
148
  HybridPlatformsConductorTest::TestProvisioner.mocked_states = %i[running running running exited]
169
149
  HybridPlatformsConductorTest::TestProvisioner.mocked_ip = '172.17.0.1'
170
- expect(Socket).to receive(:tcp).with('172.17.0.1', 22, { connect_timeout: 1 }) do |&block|
171
- block.call
172
- end
150
+ expect(Socket).to receive(:tcp).with('172.17.0.1', 22, { connect_timeout: 1 }).and_yield
173
151
  provisioner = nil
174
152
  test_deployer.with_test_provisioned_instance(:test_provisioner, 'node', environment: 'hpc_testing_provisioner', reuse_instance: true) do |sub_test_deployer, test_instance|
175
153
  expect(sub_test_deployer.local_environment).to eq true
@@ -182,34 +160,30 @@ describe HybridPlatformsConductor::Deployer do
182
160
  end
183
161
 
184
162
  it 'fails when the provisioner can\'t start' do
185
- with_test_platform(
186
- nodes: { 'node' => { meta: { host_ip: '192.168.42.42' } } }
187
- ) do |repository|
163
+ with_test_platform({ nodes: { 'node' => { meta: { host_ip: '192.168.42.42' } } } }) do
188
164
  register_plugins(:provisioner, { test_provisioner: HybridPlatformsConductorTest::TestProvisioner })
189
165
  File.write("#{test_config.hybrid_platforms_dir}/dummy_secrets.json", '{}')
190
166
  HybridPlatformsConductorTest::TestProvisioner.mocked_states = %i[created created created exited exited]
191
167
  expect do
192
168
  test_deployer.with_test_provisioned_instance(:test_provisioner, 'node', environment: 'hpc_testing_provisioner') do |sub_test_deployer, test_instance|
193
169
  end
194
- end.to raise_error /\[ node\/#{Regexp.escape(`whoami`.strip)}_hpc_testing_provisioner_\d+_\d+_\w+ \] - Instance fails to be in a state among \(running\) with timeout 1\. Currently in state exited/
170
+ end.to raise_error(%r{\[ node/#{Regexp.escape(`whoami`.strip)}_hpc_testing_provisioner_\d+_\d+_\w+ \] - Instance fails to be in a state among \(running\) with timeout 1\. Currently in state exited})
195
171
  end
196
172
  end
197
173
 
198
174
  it 'fails when the provisioner can\'t have its SSH port opened' do
199
- with_test_platform(
200
- nodes: { 'node' => { meta: { host_ip: '192.168.42.42' } } }
201
- ) do |repository|
175
+ with_test_platform({ nodes: { 'node' => { meta: { host_ip: '192.168.42.42' } } } }) do
202
176
  register_plugins(:provisioner, { test_provisioner: HybridPlatformsConductorTest::TestProvisioner })
203
177
  File.write("#{test_config.hybrid_platforms_dir}/dummy_secrets.json", '{}')
204
178
  HybridPlatformsConductorTest::TestProvisioner.mocked_states = %i[created created running exited]
205
179
  HybridPlatformsConductorTest::TestProvisioner.mocked_ip = '172.17.0.1'
206
- expect(Socket).to receive(:tcp).with('172.17.0.1', 22, { connect_timeout: 1 }) do |&block|
180
+ expect(Socket).to receive(:tcp).with('172.17.0.1', 22, { connect_timeout: 1 }) do
207
181
  raise Errno::ETIMEDOUT, 'Timeout while reading from port 22'
208
182
  end
209
183
  expect do
210
184
  test_deployer.with_test_provisioned_instance(:test_provisioner, 'node', environment: 'hpc_testing_provisioner') do |sub_test_deployer, test_instance|
211
185
  end
212
- end.to raise_error /\[ node\/#{Regexp.escape(`whoami`.strip)}_hpc_testing_provisioner_\d+_\d+_\w+ \] - Instance fails to have port 22 opened with timeout 1\./
186
+ end.to raise_error(%r{\[ node/#{Regexp.escape(`whoami`.strip)}_hpc_testing_provisioner_\d+_\d+_\w+ \] - Instance fails to have port 22 opened with timeout 1\.})
213
187
  end
214
188
  end
215
189