hybrid_platforms_conductor 32.17.1 → 33.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (268) 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/log/remote_fs.md +26 -0
  31. data/docs/plugins/secrets_reader/cli.md +31 -0
  32. data/docs/plugins/secrets_reader/thycotic.md +46 -0
  33. data/lib/hybrid_platforms_conductor/action.rb +4 -4
  34. data/lib/hybrid_platforms_conductor/actions_executor.rb +45 -43
  35. data/lib/hybrid_platforms_conductor/bitbucket.rb +5 -4
  36. data/lib/hybrid_platforms_conductor/cmd_runner.rb +13 -12
  37. data/lib/hybrid_platforms_conductor/cmdb.rb +2 -2
  38. data/lib/hybrid_platforms_conductor/common_config_dsl/bitbucket.rb +2 -1
  39. data/lib/hybrid_platforms_conductor/common_config_dsl/confluence.rb +2 -1
  40. data/lib/hybrid_platforms_conductor/common_config_dsl/file_system_tests.rb +5 -4
  41. data/lib/hybrid_platforms_conductor/common_config_dsl/github.rb +4 -3
  42. data/lib/hybrid_platforms_conductor/common_config_dsl/idempotence_tests.rb +2 -2
  43. data/lib/hybrid_platforms_conductor/config.rb +8 -4
  44. data/lib/hybrid_platforms_conductor/confluence.rb +1 -1
  45. data/lib/hybrid_platforms_conductor/connector.rb +5 -2
  46. data/lib/hybrid_platforms_conductor/core_extensions/cleanroom/fix_kwargs.rb +116 -0
  47. data/lib/hybrid_platforms_conductor/core_extensions/symbol/zero.rb +24 -0
  48. data/lib/hybrid_platforms_conductor/credentials.rb +39 -36
  49. data/lib/hybrid_platforms_conductor/current_dir_monitor.rb +4 -1
  50. data/lib/hybrid_platforms_conductor/deployer.rb +275 -225
  51. data/lib/hybrid_platforms_conductor/executable.rb +20 -15
  52. data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/config.rb +10 -7
  53. data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/host_ip.rb +1 -1
  54. data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/host_keys.rb +2 -2
  55. data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/platform_handlers.rb +4 -4
  56. data/lib/hybrid_platforms_conductor/hpc_plugins/connector/local.rb +2 -0
  57. data/lib/hybrid_platforms_conductor/hpc_plugins/connector/ssh.rb +45 -49
  58. data/lib/hybrid_platforms_conductor/hpc_plugins/log/my_log_plugin.rb.sample +100 -0
  59. data/lib/hybrid_platforms_conductor/hpc_plugins/log/remote_fs.rb +180 -0
  60. data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/serverless_chef.rb +68 -66
  61. data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/serverless_chef/dsl_parser.rb +13 -0
  62. data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/serverless_chef/recipes_tree_builder.rb +39 -38
  63. data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/yaml_inventory.rb +5 -4
  64. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/docker.rb +43 -45
  65. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/podman.rb +18 -20
  66. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/proxmox.rb +119 -118
  67. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/proxmox/proxmox_waiter.rb +39 -43
  68. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/proxmox/reserve_proxmox_container +9 -13
  69. data/lib/hybrid_platforms_conductor/hpc_plugins/report/confluence.rb +2 -2
  70. data/lib/hybrid_platforms_conductor/hpc_plugins/report/mediawiki.rb +28 -21
  71. data/lib/hybrid_platforms_conductor/hpc_plugins/report/stdout.rb +26 -22
  72. data/lib/hybrid_platforms_conductor/hpc_plugins/secrets_reader/cli.rb +77 -0
  73. data/lib/hybrid_platforms_conductor/hpc_plugins/secrets_reader/my_secrets_reader_plugin.rb.sample +46 -0
  74. data/lib/hybrid_platforms_conductor/hpc_plugins/secrets_reader/thycotic.rb +90 -0
  75. data/lib/hybrid_platforms_conductor/hpc_plugins/test/bitbucket_conf.rb +3 -3
  76. data/lib/hybrid_platforms_conductor/hpc_plugins/test/check_deploy_and_idempotence.rb +4 -2
  77. data/lib/hybrid_platforms_conductor/hpc_plugins/test/deploy_freshness.rb +7 -21
  78. data/lib/hybrid_platforms_conductor/hpc_plugins/test/deploy_removes_root_access.rb +21 -19
  79. data/lib/hybrid_platforms_conductor/hpc_plugins/test/divergence.rb +2 -2
  80. data/lib/hybrid_platforms_conductor/hpc_plugins/test/executables.rb +2 -2
  81. data/lib/hybrid_platforms_conductor/hpc_plugins/test/file_system.rb +19 -21
  82. data/lib/hybrid_platforms_conductor/hpc_plugins/test/file_system_hdfs.rb +19 -21
  83. data/lib/hybrid_platforms_conductor/hpc_plugins/test/github_ci.rb +2 -3
  84. data/lib/hybrid_platforms_conductor/hpc_plugins/test/idempotence.rb +2 -2
  85. data/lib/hybrid_platforms_conductor/hpc_plugins/test/ip.rb +1 -1
  86. data/lib/hybrid_platforms_conductor/hpc_plugins/test/jenkins_ci_conf.rb +21 -22
  87. data/lib/hybrid_platforms_conductor/hpc_plugins/test/jenkins_ci_masters_ok.rb +10 -12
  88. data/lib/hybrid_platforms_conductor/hpc_plugins/test/linear_strategy.rb +9 -9
  89. data/lib/hybrid_platforms_conductor/hpc_plugins/test/local_users.rb +2 -2
  90. data/lib/hybrid_platforms_conductor/hpc_plugins/test/mounts.rb +2 -2
  91. data/lib/hybrid_platforms_conductor/hpc_plugins/test/orphan_files.rb +10 -9
  92. data/lib/hybrid_platforms_conductor/hpc_plugins/test/ports.rb +2 -2
  93. data/lib/hybrid_platforms_conductor/hpc_plugins/test/private_ips.rb +5 -5
  94. data/lib/hybrid_platforms_conductor/hpc_plugins/test/public_ips.rb +5 -5
  95. data/lib/hybrid_platforms_conductor/hpc_plugins/test/spectre.rb +4 -6
  96. data/lib/hybrid_platforms_conductor/hpc_plugins/test/veids.rb +3 -3
  97. data/lib/hybrid_platforms_conductor/hpc_plugins/test/vulnerabilities.rb +25 -24
  98. data/lib/hybrid_platforms_conductor/hpc_plugins/test_report/confluence.rb +2 -2
  99. data/lib/hybrid_platforms_conductor/hpc_plugins/test_report/stdout.rb +8 -6
  100. data/lib/hybrid_platforms_conductor/io_router.rb +14 -13
  101. data/lib/hybrid_platforms_conductor/json_dumper.rb +2 -2
  102. data/lib/hybrid_platforms_conductor/log.rb +31 -0
  103. data/lib/hybrid_platforms_conductor/logger_helpers.rb +19 -16
  104. data/lib/hybrid_platforms_conductor/nodes_handler.rb +89 -71
  105. data/lib/hybrid_platforms_conductor/parallel_threads.rb +7 -11
  106. data/lib/hybrid_platforms_conductor/platform_handler.rb +7 -7
  107. data/lib/hybrid_platforms_conductor/platforms_handler.rb +5 -3
  108. data/lib/hybrid_platforms_conductor/plugin.rb +2 -2
  109. data/lib/hybrid_platforms_conductor/plugins.rb +14 -8
  110. data/lib/hybrid_platforms_conductor/provisioner.rb +4 -4
  111. data/lib/hybrid_platforms_conductor/report.rb +2 -2
  112. data/lib/hybrid_platforms_conductor/reports_handler.rb +3 -2
  113. data/lib/hybrid_platforms_conductor/secrets_reader.rb +31 -0
  114. data/lib/hybrid_platforms_conductor/services_handler.rb +32 -29
  115. data/lib/hybrid_platforms_conductor/test_only_remote_node.rb +1 -1
  116. data/lib/hybrid_platforms_conductor/test_report.rb +15 -18
  117. data/lib/hybrid_platforms_conductor/tests_runner.rb +116 -118
  118. data/lib/hybrid_platforms_conductor/thycotic.rb +28 -19
  119. data/lib/hybrid_platforms_conductor/topographer.rb +200 -190
  120. data/lib/hybrid_platforms_conductor/topographer/plugins/graphviz.rb +8 -8
  121. data/lib/hybrid_platforms_conductor/topographer/plugins/json.rb +4 -4
  122. data/lib/hybrid_platforms_conductor/version.rb +1 -1
  123. data/spec/hybrid_platforms_conductor_test.rb +51 -12
  124. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/bash_spec.rb +18 -11
  125. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/interactive_spec.rb +2 -2
  126. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/remote_bash_spec.rb +32 -21
  127. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/ruby_spec.rb +75 -49
  128. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/scp_spec.rb +27 -15
  129. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions_spec.rb +90 -59
  130. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connection_spec.rb +46 -44
  131. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/local/connectable_nodes_spec.rb +12 -8
  132. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/local/remote_actions_spec.rb +4 -7
  133. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/cli_options_spec.rb +21 -22
  134. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/config_dsl_spec.rb +23 -24
  135. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/connectable_nodes_spec.rb +10 -6
  136. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/connections_spec.rb +106 -75
  137. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/global_helpers_spec.rb +145 -126
  138. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/node_helpers_spec.rb +3 -3
  139. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/remote_actions_spec.rb +29 -25
  140. data/spec/hybrid_platforms_conductor_test/api/actions_executor/logging_spec.rb +167 -142
  141. data/spec/hybrid_platforms_conductor_test/api/actions_executor/parallel_spec.rb +272 -244
  142. data/spec/hybrid_platforms_conductor_test/api/actions_executor/timeout_spec.rb +16 -16
  143. data/spec/hybrid_platforms_conductor_test/api/cmd_runner_spec.rb +36 -36
  144. data/spec/hybrid_platforms_conductor_test/api/config_spec.rb +24 -22
  145. data/spec/hybrid_platforms_conductor_test/api/deployer/check_spec.rb +4 -2
  146. data/spec/hybrid_platforms_conductor_test/api/deployer/config_dsl_spec.rb +43 -5
  147. data/spec/hybrid_platforms_conductor_test/api/deployer/deploy_spec.rb +199 -216
  148. data/spec/hybrid_platforms_conductor_test/api/deployer/log_plugins/remote_fs_spec.rb +223 -0
  149. data/spec/hybrid_platforms_conductor_test/api/deployer/parse_deploy_output_spec.rb +55 -59
  150. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioner_spec.rb +36 -62
  151. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/podman_spec.rb +17 -17
  152. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/config_dsl_spec.rb +4 -4
  153. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/create_spec.rb +44 -51
  154. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/destroy_spec.rb +3 -3
  155. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/ip_spec.rb +12 -16
  156. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/destroy_vm_spec.rb +31 -19
  157. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/expired_containers_spec.rb +324 -266
  158. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/ips_assignment_spec.rb +89 -61
  159. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/other_lxc_containers_resources_spec.rb +117 -93
  160. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/pve_node_resources_spec.rb +71 -54
  161. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/retries_spec.rb +10 -8
  162. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/vm_ids_assignment_spec.rb +80 -60
  163. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/start_spec.rb +1 -1
  164. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/state_spec.rb +1 -1
  165. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/stop_spec.rb +1 -1
  166. data/spec/hybrid_platforms_conductor_test/api/deployer/secrets_reader_plugins/cli_spec.rb +64 -0
  167. data/spec/hybrid_platforms_conductor_test/api/deployer/secrets_reader_plugins/thycotic_spec.rb +268 -0
  168. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/config_spec.rb +8 -10
  169. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/host_ip_spec.rb +33 -24
  170. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/host_keys_spec.rb +64 -51
  171. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/platform_handlers_spec.rb +3 -3
  172. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs_plugins_api_spec.rb +50 -51
  173. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/common_spec.rb +91 -81
  174. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/config_dsl_spec.rb +14 -16
  175. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/git_diff_impacts_spec.rb +51 -75
  176. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/nodes_selectors_spec.rb +35 -26
  177. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/platform_handlers_plugins_api_spec.rb +24 -16
  178. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/several_platforms_spec.rb +29 -19
  179. data/spec/hybrid_platforms_conductor_test/api/platform_handler_spec.rb +4 -4
  180. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/config_dsl_spec.rb +2 -2
  181. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/deploy_output_parsing_spec.rb +6 -6
  182. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/diff_impacts_spec.rb +57 -99
  183. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/inventory_spec.rb +4 -4
  184. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/packaging_spec.rb +32 -35
  185. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/services_deployment_spec.rb +10 -10
  186. data/spec/hybrid_platforms_conductor_test/api/platforms_handler_spec.rb +38 -27
  187. data/spec/hybrid_platforms_conductor_test/api/plugins_spec.rb +46 -52
  188. data/spec/hybrid_platforms_conductor_test/api/reports_handler_spec.rb +2 -2
  189. data/spec/hybrid_platforms_conductor_test/api/services_handler/actions_to_deploy_spec.rb +90 -58
  190. data/spec/hybrid_platforms_conductor_test/api/services_handler/deploy_allowed_spec.rb +38 -34
  191. data/spec/hybrid_platforms_conductor_test/api/services_handler/log_info_spec.rb +11 -9
  192. data/spec/hybrid_platforms_conductor_test/api/services_handler/package_spec.rb +193 -171
  193. data/spec/hybrid_platforms_conductor_test/api/services_handler/parse_deploy_output_spec.rb +66 -54
  194. data/spec/hybrid_platforms_conductor_test/api/services_handler/prepare_for_deploy_spec.rb +147 -133
  195. data/spec/hybrid_platforms_conductor_test/api/tests_runner/common_spec.rb +69 -49
  196. data/spec/hybrid_platforms_conductor_test/api/tests_runner/global_spec.rb +5 -4
  197. data/spec/hybrid_platforms_conductor_test/api/tests_runner/node_check_spec.rb +8 -5
  198. data/spec/hybrid_platforms_conductor_test/api/tests_runner/node_spec.rb +8 -5
  199. data/spec/hybrid_platforms_conductor_test/api/tests_runner/node_ssh_spec.rb +30 -27
  200. data/spec/hybrid_platforms_conductor_test/api/tests_runner/platform_spec.rb +12 -9
  201. data/spec/hybrid_platforms_conductor_test/api/tests_runner/reports_spec.rb +48 -47
  202. data/spec/hybrid_platforms_conductor_test/api/tests_runner/test_plugins/bitbucket_conf_spec.rb +5 -5
  203. data/spec/hybrid_platforms_conductor_test/api/tests_runner/test_plugins/github_ci_spec.rb +5 -5
  204. data/spec/hybrid_platforms_conductor_test/api/tests_runner/test_reports_plugins/confluence_spec.rb +5 -5
  205. data/spec/hybrid_platforms_conductor_test/cmdb_plugins/test_cmdb.rb +9 -9
  206. data/spec/hybrid_platforms_conductor_test/cmdb_plugins/{test_cmdb2.rb → test_cmdb_2.rb} +6 -6
  207. data/spec/hybrid_platforms_conductor_test/cmdb_plugins/test_cmdb_others.rb +3 -3
  208. data/spec/hybrid_platforms_conductor_test/cmdb_plugins/{test_cmdb_others2.rb → test_cmdb_others_2.rb} +2 -2
  209. data/spec/hybrid_platforms_conductor_test/docs_spec.rb +1 -1
  210. data/spec/hybrid_platforms_conductor_test/executables/{check-node_spec.rb → check_node_spec.rb} +4 -6
  211. data/spec/hybrid_platforms_conductor_test/executables/deploy_spec.rb +4 -6
  212. data/spec/hybrid_platforms_conductor_test/executables/get_impacted_nodes_spec.rb +76 -77
  213. data/spec/hybrid_platforms_conductor_test/executables/last_deploys_spec.rb +159 -113
  214. data/spec/hybrid_platforms_conductor_test/executables/nodes_to_deploy_spec.rb +299 -160
  215. data/spec/hybrid_platforms_conductor_test/executables/options/actions_executor_spec.rb +4 -6
  216. data/spec/hybrid_platforms_conductor_test/executables/options/cmd_runner_spec.rb +3 -5
  217. data/spec/hybrid_platforms_conductor_test/executables/options/common_spec.rb +8 -8
  218. data/spec/hybrid_platforms_conductor_test/executables/options/deployer_spec.rb +12 -196
  219. data/spec/hybrid_platforms_conductor_test/executables/options/nodes_handler_spec.rb +9 -10
  220. data/spec/hybrid_platforms_conductor_test/executables/options/nodes_selectors_spec.rb +9 -10
  221. data/spec/hybrid_platforms_conductor_test/executables/options/reports_handler_spec.rb +1 -1
  222. data/spec/hybrid_platforms_conductor_test/executables/options/tests_runner_spec.rb +22 -22
  223. data/spec/hybrid_platforms_conductor_test/executables/report_spec.rb +22 -16
  224. data/spec/hybrid_platforms_conductor_test/executables/run_spec.rb +32 -32
  225. data/spec/hybrid_platforms_conductor_test/executables/ssh_config_spec.rb +7 -9
  226. data/spec/hybrid_platforms_conductor_test/executables/test_spec.rb +3 -5
  227. data/spec/hybrid_platforms_conductor_test/helpers/actions_executor_helpers.rb +2 -2
  228. data/spec/hybrid_platforms_conductor_test/helpers/cmd_runner_helpers.rb +4 -3
  229. data/spec/hybrid_platforms_conductor_test/helpers/cmdb_helpers.rb +2 -2
  230. data/spec/hybrid_platforms_conductor_test/helpers/config_helpers.rb +1 -1
  231. data/spec/hybrid_platforms_conductor_test/helpers/connector_ssh_helpers.rb +12 -13
  232. data/spec/hybrid_platforms_conductor_test/helpers/deployer_helpers.rb +245 -56
  233. data/spec/hybrid_platforms_conductor_test/helpers/executables_helpers.rb +11 -11
  234. data/spec/hybrid_platforms_conductor_test/helpers/nodes_handler_helpers.rb +1 -1
  235. data/spec/hybrid_platforms_conductor_test/helpers/platforms_handler_helpers.rb +39 -28
  236. data/spec/hybrid_platforms_conductor_test/helpers/plugins_helpers.rb +1 -1
  237. data/spec/hybrid_platforms_conductor_test/helpers/provisioner_proxmox_helpers.rb +86 -111
  238. data/spec/hybrid_platforms_conductor_test/helpers/reports_handler_helpers.rb +1 -1
  239. data/spec/hybrid_platforms_conductor_test/helpers/serverless_chef_helpers.rb +3 -3
  240. data/spec/hybrid_platforms_conductor_test/helpers/services_handler_helpers.rb +1 -1
  241. data/spec/hybrid_platforms_conductor_test/helpers/tests_runner_helpers.rb +1 -1
  242. 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
  243. 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
  244. 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
  245. 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
  246. data/spec/hybrid_platforms_conductor_test/platform_handler_plugins/test.rb +1 -1
  247. data/spec/hybrid_platforms_conductor_test/platform_handler_plugins/{test2.rb → test_2.rb} +0 -0
  248. data/spec/hybrid_platforms_conductor_test/rubocop_spec.rb +31 -0
  249. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/1_node/nodes/node.json +3 -3
  250. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/data_bags/nodes/node.json +3 -3
  251. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/recipes/cookbooks/test_cookbook_2/libraries/default.rb +1 -0
  252. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/several_cookbooks/other_cookbooks/test_cookbook_2/libraries/default.rb +1 -0
  253. data/spec/hybrid_platforms_conductor_test/shared_examples/deployer.rb +952 -0
  254. data/spec/hybrid_platforms_conductor_test/test_connector.rb +4 -3
  255. data/spec/hybrid_platforms_conductor_test/test_log_no_read_plugin.rb +84 -0
  256. data/spec/hybrid_platforms_conductor_test/test_log_plugin.rb +105 -0
  257. data/spec/hybrid_platforms_conductor_test/test_plugins/global.rb +1 -0
  258. data/spec/hybrid_platforms_conductor_test/test_plugins/node.rb +1 -0
  259. data/spec/hybrid_platforms_conductor_test/test_plugins/node_check.rb +1 -0
  260. data/spec/hybrid_platforms_conductor_test/test_plugins/platform.rb +1 -0
  261. data/spec/hybrid_platforms_conductor_test/test_plugins/several_checks.rb +2 -2
  262. data/spec/hybrid_platforms_conductor_test/test_secrets_reader_plugin.rb +45 -0
  263. data/spec/hybrid_platforms_conductor_test/tests_report_plugin.rb +5 -6
  264. data/spec/spec_helper.rb +17 -18
  265. data/tools/check_md +16 -20
  266. data/tools/generate_mermaid +1 -1
  267. metadata +194 -144
  268. data/spec/hybrid_platforms_conductor_test/helpers/deployer_test_helpers.rb +0 -916
@@ -36,6 +36,7 @@ module HybridPlatformsConductorTest
36
36
  @accept_nodes = []
37
37
  @connected_nodes = nil
38
38
  @remote_bash_code = nil
39
+ @remote_copy_code = nil
39
40
  end
40
41
 
41
42
  # Complete an option parser with options meant to control this connector
@@ -45,7 +46,7 @@ module HybridPlatformsConductorTest
45
46
  #
46
47
  # Parameters::
47
48
  # * *options_parser* (OptionParser): The option parser to complete
48
- def options_parse(options_parser)
49
+ def options_parse(_options_parser)
49
50
  @calls << [:options_parse]
50
51
  end
51
52
 
@@ -102,7 +103,7 @@ module HybridPlatformsConductorTest
102
103
  # * *bash_cmds* (String): Bash commands to execute
103
104
  def remote_bash(bash_cmds)
104
105
  @calls << [:remote_bash, bash_cmds]
105
- @remote_bash_code.call(@stdout_io, @stderr_io, self) unless @remote_bash_code.nil?
106
+ @remote_bash_code&.call(@stdout_io, @stderr_io, self)
106
107
  end
107
108
 
108
109
  # Execute an interactive shell on the remote node
@@ -140,7 +141,7 @@ module HybridPlatformsConductorTest
140
141
  extra_opts[:owner] = owner if owner
141
142
  extra_opts[:group] = group if group
142
143
  @calls << [:remote_copy, from, to] + (extra_opts.empty? ? [] : [extra_opts])
143
- @remote_copy_code.call(@stdout_io, @stderr_io, self) unless @remote_copy_code.nil?
144
+ @remote_copy_code&.call(@stdout_io, @stderr_io, self)
144
145
  end
145
146
 
146
147
  # Integer: The current desired timeout
@@ -0,0 +1,84 @@
1
+ module HybridPlatformsConductorTest
2
+
3
+ # Test log without reading actions
4
+ class TestLogNoReadPlugin < HybridPlatformsConductor::Log
5
+
6
+ class << self
7
+
8
+ attr_accessor :calls
9
+
10
+ end
11
+
12
+ # Get actions to save logs
13
+ # [API] - This method is mandatory.
14
+ # [API] - The following API components are accessible:
15
+ # * *@config* (Config): Main configuration API.
16
+ # * *@nodes_handler* (NodesHandler): Nodes handler API.
17
+ # * *@actions_executor* (ActionsExecutor): Actions executor API.
18
+ #
19
+ # Parameters::
20
+ # * *node* (String): Node for which logs are being saved
21
+ # * *services* (Array<String>): The list of services that have been deployed on this node
22
+ # * *deployment_info* (Hash<Symbol,Object>): Additional information to attach to the logs
23
+ # * *exit_status* (Integer or Symbol): Exit status of the deployment
24
+ # * *stdout* (String): Deployment's stdout
25
+ # * *stderr* (String): Deployment's stderr
26
+ # Result::
27
+ # * Array< Hash<Symbol,Object> >: List of actions to be done
28
+ def actions_to_save_logs(node, services, deployment_info, exit_status, stdout, stderr)
29
+ TestLogNoReadPlugin.calls << {
30
+ method: :actions_to_save_logs,
31
+ node: node,
32
+ services: services,
33
+ # Don't store the date
34
+ deployment_info: deployment_info.reject { |k, _v| k == :date },
35
+ exit_status: exit_status,
36
+ stdout: stdout,
37
+ stderr: stderr
38
+ }
39
+ [{ bash: "echo Save test logs to #{node}" }]
40
+ end
41
+
42
+ # Get deployment logs from a node.
43
+ # This method can use the result of actions previously run to read logs, as returned by the actions_to_read_logs method.
44
+ # [API] - This method is mandatory.
45
+ # [API] - The following API components are accessible:
46
+ # * *@config* (Config): Main configuration API.
47
+ # * *@nodes_handler* (NodesHandler): Nodes handler API.
48
+ # * *@actions_executor* (ActionsExecutor): Actions executor API.
49
+ #
50
+ # Parameters::
51
+ # * *node* (String): The node we want deployment logs from
52
+ # * *exit_status* (Integer, Symbol or nil): Exit status of actions to read logs, or nil if no action was returned by actions_to_read_logs
53
+ # * *stdout* (String or nil): stdout of actions to read logs, or nil if no action was returned by actions_to_read_logs
54
+ # * *stderr* (String or nil): stderr of actions to read logs, or nil if no action was returned by actions_to_read_logs
55
+ # Result::
56
+ # * Hash<Symbol,Object>: Deployment log information:
57
+ # * *error* (String): Error string in case deployment logs could not be retrieved. If set then further properties will be ignored. [optional]
58
+ # * *services* (Array<String>): List of services deployed on the node
59
+ # * *deployment_info* (Hash<Symbol,Object>): Deployment metadata
60
+ # * *exit_status* (Integer or Symbol): Deployment exit status
61
+ # * *stdout* (String): Deployment stdout
62
+ # * *stderr* (String): Deployment stderr
63
+ def logs_for(node, exit_status, stdout, stderr)
64
+ TestLogNoReadPlugin.calls << {
65
+ method: :logs_for,
66
+ node: node,
67
+ exit_status: exit_status,
68
+ stdout: stdout,
69
+ stderr: stderr
70
+ }
71
+ {
72
+ services: %w[unknown],
73
+ deployment_info: {
74
+ user: 'test_user'
75
+ },
76
+ exit_status: 666,
77
+ stdout: 'Deployment test stdout',
78
+ stderr: 'Deployment test stderr'
79
+ }
80
+ end
81
+
82
+ end
83
+
84
+ end
@@ -0,0 +1,105 @@
1
+ module HybridPlatformsConductorTest
2
+
3
+ # Test log
4
+ class TestLogPlugin < HybridPlatformsConductor::Log
5
+
6
+ class << self
7
+
8
+ attr_accessor :calls
9
+
10
+ end
11
+
12
+ # Get actions to save logs
13
+ # [API] - This method is mandatory.
14
+ # [API] - The following API components are accessible:
15
+ # * *@config* (Config): Main configuration API.
16
+ # * *@nodes_handler* (NodesHandler): Nodes handler API.
17
+ # * *@actions_executor* (ActionsExecutor): Actions executor API.
18
+ #
19
+ # Parameters::
20
+ # * *node* (String): Node for which logs are being saved
21
+ # * *services* (Array<String>): The list of services that have been deployed on this node
22
+ # * *deployment_info* (Hash<Symbol,Object>): Additional information to attach to the logs
23
+ # * *exit_status* (Integer or Symbol): Exit status of the deployment
24
+ # * *stdout* (String): Deployment's stdout
25
+ # * *stderr* (String): Deployment's stderr
26
+ # Result::
27
+ # * Array< Hash<Symbol,Object> >: List of actions to be done
28
+ def actions_to_save_logs(node, services, deployment_info, exit_status, stdout, stderr)
29
+ TestLogPlugin.calls << {
30
+ method: :actions_to_save_logs,
31
+ node: node,
32
+ services: services,
33
+ # Don't store the date
34
+ deployment_info: deployment_info.reject { |k, _v| k == :date },
35
+ exit_status: exit_status,
36
+ stdout: stdout,
37
+ stderr: stderr
38
+ }
39
+ [{ bash: "echo Save test logs to #{node}" }]
40
+ end
41
+
42
+ # Get actions to read logs.
43
+ # If provided, this method can return some actions to be executed that will fetch logs from servers or remote nodes.
44
+ # By using this method to run actions instead of the synchronous method logs_from, such actions will be run in parallel which can greatly improve time-consuming operations when querying a lot of nodes.
45
+ # [API] - This method is optional.
46
+ # [API] - The following API components are accessible:
47
+ # * *@config* (Config): Main configuration API.
48
+ # * *@nodes_handler* (NodesHandler): Nodes handler API.
49
+ # * *@actions_executor* (ActionsExecutor): Actions executor API.
50
+ #
51
+ # Parameters::
52
+ # * *node* (String): Node for which deployment logs are being read
53
+ # Result::
54
+ # * Array< Hash<Symbol,Object> >: List of actions to be done
55
+ def actions_to_read_logs(node)
56
+ TestLogPlugin.calls << {
57
+ method: :actions_to_read_logs,
58
+ node: node
59
+ }
60
+ [{ bash: "echo Read logs for #{node}" }]
61
+ end
62
+
63
+ # Get deployment logs from a node.
64
+ # This method can use the result of actions previously run to read logs, as returned by the actions_to_read_logs method.
65
+ # [API] - This method is mandatory.
66
+ # [API] - The following API components are accessible:
67
+ # * *@config* (Config): Main configuration API.
68
+ # * *@nodes_handler* (NodesHandler): Nodes handler API.
69
+ # * *@actions_executor* (ActionsExecutor): Actions executor API.
70
+ #
71
+ # Parameters::
72
+ # * *node* (String): The node we want deployment logs from
73
+ # * *exit_status* (Integer, Symbol or nil): Exit status of actions to read logs, or nil if no action was returned by actions_to_read_logs
74
+ # * *stdout* (String or nil): stdout of actions to read logs, or nil if no action was returned by actions_to_read_logs
75
+ # * *stderr* (String or nil): stderr of actions to read logs, or nil if no action was returned by actions_to_read_logs
76
+ # Result::
77
+ # * Hash<Symbol,Object>: Deployment log information:
78
+ # * *error* (String): Error string in case deployment logs could not be retrieved. If set then further properties will be ignored. [optional]
79
+ # * *services* (Array<String>): List of services deployed on the node
80
+ # * *deployment_info* (Hash<Symbol,Object>): Deployment metadata
81
+ # * *exit_status* (Integer or Symbol): Deployment exit status
82
+ # * *stdout* (String): Deployment stdout
83
+ # * *stderr* (String): Deployment stderr
84
+ def logs_for(node, exit_status, stdout, stderr)
85
+ TestLogPlugin.calls << {
86
+ method: :logs_for,
87
+ node: node,
88
+ exit_status: exit_status,
89
+ stdout: stdout,
90
+ stderr: stderr
91
+ }
92
+ {
93
+ services: %w[unknown],
94
+ deployment_info: {
95
+ user: 'test_user'
96
+ },
97
+ exit_status: 666,
98
+ stdout: 'Deployment test stdout',
99
+ stderr: 'Deployment test stderr'
100
+ }
101
+ end
102
+
103
+ end
104
+
105
+ end
@@ -20,6 +20,7 @@ module HybridPlatformsConductorTest
20
20
  # Check my_test_plugin.rb.sample documentation for signature details.
21
21
  def test
22
22
  raise 'Failing test' if Global.fail
23
+
23
24
  Global.nbr_runs += 1
24
25
  end
25
26
 
@@ -33,6 +33,7 @@ module HybridPlatformsConductorTest
33
33
  # Check my_test_plugin.rb.sample documentation for signature details.
34
34
  def test_for_node
35
35
  raise "Failing test #{@name} for #{@node}" if Node.fail_for.key?(@name) && Node.fail_for[@name].include?(@node)
36
+
36
37
  sleep_time = Node.sleeps.dig(@name, @node)
37
38
  sleep sleep_time unless sleep_time.nil?
38
39
  Node.runs << [@name, @node]
@@ -29,6 +29,7 @@ module HybridPlatformsConductorTest
29
29
  # Check my_test_plugin.rb.sample documentation for signature details.
30
30
  def test_on_check_node(stdout, stderr, exit_status)
31
31
  raise 'Failing test' if NodeCheck.fail_for.include? @node
32
+
32
33
  NodeCheck.runs << [@name, @node, stdout, stderr, exit_status]
33
34
  end
34
35
 
@@ -30,6 +30,7 @@ module HybridPlatformsConductorTest
30
30
  def test_on_platform
31
31
  platform_name = @platform.name
32
32
  raise 'Failing test' if Platform.fail_for.include? platform_name
33
+
33
34
  sleep_time = Platform.sleeps.dig(@name, platform_name)
34
35
  sleep sleep_time unless sleep_time.nil?
35
36
  Platform.runs << [@name, platform_name]
@@ -32,14 +32,14 @@ module HybridPlatformsConductorTest
32
32
  # Check my_test_plugin.rb.sample documentation for signature details.
33
33
  def test_on_node
34
34
  {
35
- "test_#{@node}.sh" => proc do |stdout, stderr, exit_code|
35
+ "test_#{@node}.sh" => proc do |stdout, stderr|
36
36
  SeveralChecks.runs << [@name, @node, "Node SSH test: #{stdout.join("\n")} - #{stderr.join("\n")}"]
37
37
  end
38
38
  }
39
39
  end
40
40
 
41
41
  # Check my_test_plugin.rb.sample documentation for signature details.
42
- def test_on_check_node(stdout, stderr, exit_status)
42
+ def test_on_check_node(stdout, _stderr, _exit_status)
43
43
  SeveralChecks.runs << [@name, @node, "Node check-node test: #{stdout}"]
44
44
  end
45
45
 
@@ -0,0 +1,45 @@
1
+ require 'hybrid_platforms_conductor/secrets_reader'
2
+
3
+ module HybridPlatformsConductorTest
4
+
5
+ # Mock a secrets reader plugin
6
+ class TestSecretsReaderPlugin < HybridPlatformsConductor::SecretsReader
7
+
8
+ class << self
9
+
10
+ attr_accessor :calls, :deployer, :mocked_secrets
11
+
12
+ end
13
+
14
+ # Return secrets for a given service to be deployed on a node.
15
+ # [API] - This method is mandatory
16
+ # [API] - The following API components are accessible:
17
+ # * *@config* (Config): Main configuration API.
18
+ # * *@cmd_runner* (CmdRunner): Command Runner API.
19
+ # * *@nodes_handler* (NodesHandler): Nodes handler API.
20
+ #
21
+ # Parameters::
22
+ # * *node* (String): Node to be deployed
23
+ # * *service* (String): Service to be deployed
24
+ # Result::
25
+ # * Hash: The secrets
26
+ def secrets_for(node, service)
27
+ # Get the name by looking into the plugins' map
28
+ plugin_name, _plugin = TestSecretsReaderPlugin.deployer.instance_variable_get(:@secrets_readers).find { |_plugin_name, plugin| plugin == self }
29
+ TestSecretsReaderPlugin.calls << {
30
+ instance: plugin_name,
31
+ node: node,
32
+ service: service
33
+ }
34
+ TestSecretsReaderPlugin.mocked_secrets.dig(node, service, plugin_name) || {
35
+ node => {
36
+ service => {
37
+ plugin_name.to_s => 'Secret value'
38
+ }
39
+ }
40
+ }
41
+ end
42
+
43
+ end
44
+
45
+ end
@@ -4,9 +4,11 @@ module HybridPlatformsConductorTest
4
4
  class TestsReportPlugin < HybridPlatformsConductor::TestReport
5
5
 
6
6
  class << self
7
+
7
8
  # Reports (that can be compared), per report name
8
9
  # Array< Hash<Symbol, Object> >
9
10
  attr_accessor :reports
11
+
10
12
  end
11
13
 
12
14
  # Handle tests reports
@@ -15,12 +17,9 @@ module HybridPlatformsConductorTest
15
17
  global_tests: report_from(global_tests),
16
18
  platform_tests: report_from(platform_tests),
17
19
  node_tests: report_from(node_tests),
18
- errors_per_test: Hash[group_errors(node_tests, :test_name).map do |test_name, errors|
19
- [
20
- test_name,
21
- errors.map { |error| error.split("\n").first }
22
- ]
23
- end],
20
+ errors_per_test: group_errors(node_tests, :test_name).transform_values do |errors|
21
+ errors.map { |error| error.split("\n").first }
22
+ end,
24
23
  nodes_by_nodes_list: nodes_by_nodes_list
25
24
  }
26
25
  end
data/spec/spec_helper.rb CHANGED
@@ -32,7 +32,7 @@ RSpec.configure do |config|
32
32
  expectations.include_chain_clauses_in_custom_matcher_descriptions = true
33
33
 
34
34
  # Increase the diffs length being output, as some tests are dealing with a few lines of stdout
35
- expectations.max_formatted_output_length = 65536
35
+ expectations.max_formatted_output_length = 65_536
36
36
 
37
37
  end
38
38
 
@@ -55,57 +55,56 @@ RSpec.configure do |config|
55
55
  # triggering implicit auto-inclusion in groups with matching metadata.
56
56
  config.shared_context_metadata_behavior = :apply_to_host_groups
57
57
 
58
- # The settings below are suggested to provide a good initial experience
59
- # with RSpec, but feel free to customize to your heart's content.
60
- =begin
58
+ # The settings below are suggested to provide a good initial experience
59
+ # with RSpec, but feel free to customize to your heart's content.
60
+
61
61
  # This allows you to limit a spec run to individual examples or groups
62
62
  # you care about by tagging them with `:focus` metadata. When nothing
63
63
  # is tagged with `:focus`, all examples get run. RSpec also provides
64
64
  # aliases for `it`, `describe`, and `context` that include `:focus`
65
65
  # metadata: `fit`, `fdescribe` and `fcontext`, respectively.
66
- config.filter_run_when_matching :focus
66
+ # config.filter_run_when_matching :focus
67
67
 
68
68
  # Allows RSpec to persist some state between runs in order to support
69
69
  # the `--only-failures` and `--next-failure` CLI options. We recommend
70
70
  # you configure your source control system to ignore this file.
71
- config.example_status_persistence_file_path = "spec/examples.txt"
71
+ # config.example_status_persistence_file_path = "spec/examples.txt"
72
72
 
73
73
  # Limits the available syntax to the non-monkey patched syntax that is
74
74
  # recommended. For more details, see:
75
75
  # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/
76
76
  # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
77
77
  # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode
78
- config.disable_monkey_patching!
78
+ # config.disable_monkey_patching!
79
79
 
80
80
  # This setting enables warnings. It's recommended, but in some cases may
81
81
  # be too noisy due to issues in dependencies.
82
- config.warnings = true
82
+ # config.warnings = true
83
83
 
84
84
  # Many RSpec users commonly either run the entire suite or an individual
85
85
  # file, and it's useful to allow more verbose output when running an
86
86
  # individual spec file.
87
- if config.files_to_run.one?
88
- # Use the documentation formatter for detailed output,
89
- # unless a formatter has already been configured
90
- # (e.g. via a command-line flag).
91
- config.default_formatter = "doc"
92
- end
87
+ # if config.files_to_run.one?
88
+ # # Use the documentation formatter for detailed output,
89
+ # # unless a formatter has already been configured
90
+ # # (e.g. via a command-line flag).
91
+ # config.default_formatter = "doc"
92
+ # end
93
93
 
94
94
  # Print the 10 slowest examples and example groups at the
95
95
  # end of the spec run, to help surface which specs are running
96
96
  # particularly slow.
97
- config.profile_examples = 10
97
+ # config.profile_examples = 10
98
98
 
99
99
  # Run specs in random order to surface order dependencies. If you find an
100
100
  # order dependency and want to debug it, you can fix the order by providing
101
101
  # the seed, which is printed after each run.
102
102
  # --seed 1234
103
- config.order = :random
103
+ # config.order = :random
104
104
 
105
105
  # Seed global randomization in this process using the `--seed` CLI option.
106
106
  # Setting this allows you to use `--seed` to deterministically reproduce
107
107
  # test failures related to randomization by passing the same `--seed` value
108
108
  # as the one that triggered the failure.
109
- Kernel.srand config.seed
110
- =end
109
+ # Kernel.srand config.seed
111
110
  end
data/tools/check_md CHANGED
@@ -18,7 +18,7 @@ def link_to_file(link, file)
18
18
  if link_file == ''
19
19
  file
20
20
  elsif link_file.start_with?('/')
21
- link_file[1..-1]
21
+ link_file[1..]
22
22
  else
23
23
  File.expand_path("#{File.dirname(file)}/#{link_file}").gsub("#{Dir.pwd}/", '')
24
24
  end
@@ -29,22 +29,20 @@ end
29
29
  # Parameters::
30
30
  # * *file* (String): Markdown file to be parsed
31
31
  def parse_md(file)
32
- unless @info.key?(file)
33
- puts "Parsing #{file}..."
34
- content = File.read(file)
35
- @info[file] = {
36
- anchors: content.scan(/<a name="([^"]*)"><\/a>/).map { |(anchor)| anchor },
37
- links: content.scan(/\[[^\]]*\]\(([^\)]*)\)/).map { |(link)| link }
38
- }
39
- # Parse linked files
40
- @info[file][:links].each do |link|
41
- puts "Found #{file} => #{link}"
42
- end
43
- @info[file][:links].each do |link|
44
- unless link.start_with?('http')
45
- linked_file = link_to_file(link, file)
46
- parse_md(linked_file) if File.exist?(linked_file) && linked_file.end_with?('.md')
47
- end
32
+ return if @info.key?(file)
33
+
34
+ puts "Parsing #{file}..."
35
+ content = File.read(file)
36
+ @info[file] = {
37
+ anchors: content.scan(%r{<a name="([^"]*)"></a>}).map { |(anchor)| anchor },
38
+ links: content.scan(/\[[^\]]*\]\(([^)]*)\)/).map { |(link)| link }
39
+ }
40
+ # Parse linked files
41
+ @info[file][:links].each do |link|
42
+ puts "Found #{file} => #{link}"
43
+ unless link.start_with?('http')
44
+ linked_file = link_to_file(link, file)
45
+ parse_md(linked_file) if File.exist?(linked_file) && linked_file.end_with?('.md')
48
46
  end
49
47
  end
50
48
  end
@@ -63,9 +61,7 @@ errors = []
63
61
  anchor = link.split('#')[1]
64
62
  linked_file = link_to_file(link, file)
65
63
  if @info.key?(linked_file)
66
- if anchor.nil?
67
- '*'
68
- elsif @info[linked_file][:anchors].include?(anchor)
64
+ if anchor.nil? || @info[linked_file][:anchors].include?(anchor)
69
65
  '*'
70
66
  else
71
67
  errors << "[#{file} -> #{link}] - Destination has no anchor named #{anchor}"