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
@@ -3,9 +3,13 @@ require 'tempfile'
3
3
  require 'tty-command'
4
4
  require 'hybrid_platforms_conductor/logger_helpers'
5
5
  require 'hybrid_platforms_conductor/io_router'
6
+ require 'hybrid_platforms_conductor/core_extensions/symbol/zero'
7
+
8
+ Symbol.include HybridPlatformsConductor::CoreExtensions::Symbol::Zero
6
9
 
7
10
  module HybridPlatformsConductor
8
11
 
12
+ # API to execute local commands, with IO control over files, stdout, timeouts, exceptions.
9
13
  class CmdRunner
10
14
 
11
15
  class UnexpectedExitCodeError < StandardError
@@ -21,7 +25,7 @@ module HybridPlatformsConductor
21
25
  # Result::
22
26
  # * String: The executable prefix
23
27
  def self.executables_prefix
24
- $0.include?('/') ? "#{File.dirname($0)}/" : ''
28
+ $PROGRAM_NAME.include?('/') ? "#{File.dirname($PROGRAM_NAME)}/" : ''
25
29
  end
26
30
 
27
31
  # Dry-run switch. When true, then commands are just printed out without being executed.
@@ -33,7 +37,7 @@ module HybridPlatformsConductor
33
37
  # Parameters::
34
38
  # * *logger* (Logger): Logger to be used [default = Logger.new(STDOUT)]
35
39
  # * *logger_stderr* (Logger): Logger to be used for stderr [default = Logger.new(STDERR)]
36
- def initialize(logger: Logger.new(STDOUT), logger_stderr: Logger.new(STDERR))
40
+ def initialize(logger: Logger.new($stdout), logger_stderr: Logger.new($stderr))
37
41
  init_loggers(logger, logger_stderr)
38
42
  @dry_run = false
39
43
  end
@@ -42,8 +46,7 @@ module HybridPlatformsConductor
42
46
  #
43
47
  # Parameters::
44
48
  # * *options_parser* (OptionParser): The option parser to complete
45
- # * *parallel* (Boolean): Do we activate options regarding parallel execution? [default = true]
46
- def options_parse(options_parser, parallel: true)
49
+ def options_parse(options_parser)
47
50
  options_parser.separator ''
48
51
  options_parser.separator 'Command runner options:'
49
52
  options_parser.on('-s', '--show-commands', 'Display the commands that would be run instead of running them') do
@@ -86,7 +89,7 @@ module HybridPlatformsConductor
86
89
  expected_code = [expected_code] unless expected_code.is_a?(Array)
87
90
  if @dry_run
88
91
  out cmd
89
- return expected_code.first, '', ''
92
+ [expected_code.first, '', '']
90
93
  else
91
94
  log_debug "#{timeout.nil? ? '' : "[ Timeout #{timeout} ] - "}#{cmd.light_cyan.bold}"
92
95
  exit_status = nil
@@ -100,15 +103,13 @@ module HybridPlatformsConductor
100
103
  FileUtils.mkdir_p(File.dirname(log_to_file))
101
104
  File.open(log_to_file, 'w')
102
105
  end
103
- else
104
- nil
105
106
  end
106
107
  start_time = Time.now if log_debug?
107
108
  bash_file = nil
108
109
  if force_bash
109
110
  bash_file = Tempfile.new('hpc_bash')
110
111
  bash_file.write(cmd)
111
- bash_file.chmod 0700
112
+ bash_file.chmod 0o700
112
113
  bash_file.close
113
114
  cmd = "/bin/bash -c #{bash_file.path}"
114
115
  end
@@ -149,10 +150,10 @@ module HybridPlatformsConductor
149
150
  rescue
150
151
  exit_status = :command_error
151
152
  cmd_stdout = cmd_result_stdout
152
- cmd_stderr = "#{cmd_result_stderr.empty? ? '' : "#{cmd_result_stderr}\n"}#{$!}\n#{$!.backtrace.join("\n")}"
153
+ cmd_stderr = "#{cmd_result_stderr.empty? ? '' : "#{cmd_result_stderr}\n"}#{$ERROR_INFO}\n#{$ERROR_INFO.backtrace.join("\n")}"
153
154
  ensure
154
- file_output.close unless file_output.nil?
155
- bash_file.unlink unless bash_file.nil?
155
+ file_output&.close
156
+ bash_file&.unlink
156
157
  end
157
158
  if log_debug?
158
159
  elapsed = Time.now - start_time
@@ -169,7 +170,7 @@ module HybridPlatformsConductor
169
170
  raise exit_status == :timeout ? TimeoutError : UnexpectedExitCodeError, error_title
170
171
  end
171
172
  end
172
- return exit_status, cmd_stdout, cmd_stderr
173
+ [exit_status, cmd_stdout, cmd_stderr]
173
174
  end
174
175
  end
175
176
 
@@ -16,8 +16,8 @@ module HybridPlatformsConductor
16
16
  # * *platforms_handler* (PlatformsHandler): Platforms Handler to be used. [default: PlatformsHandler.new]
17
17
  # * *nodes_handler* (NodesHandler): Nodes Handler to be used. [default: NodesHandler.new]
18
18
  def initialize(
19
- logger: Logger.new(STDOUT),
20
- logger_stderr: Logger.new(STDERR),
19
+ logger: Logger.new($stdout),
20
+ logger_stderr: Logger.new($stderr),
21
21
  config: Config.new,
22
22
  cmd_runner: CmdRunner.new,
23
23
  platforms_handler: PlatformsHandler.new,
@@ -4,9 +4,10 @@ module HybridPlatformsConductor
4
4
 
5
5
  module CommonConfigDsl
6
6
 
7
+ # Add common Bitbucket config DSL to declare known Bitbucket repositories
7
8
  module Bitbucket
8
9
 
9
- # Initialize the DSL
10
+ # Initialize the DSL
10
11
  def init_bitbucket
11
12
  # List of Bitbucket repositories definitions
12
13
  # Array< Hash<Symbol, Object> >
@@ -2,9 +2,10 @@ module HybridPlatformsConductor
2
2
 
3
3
  module CommonConfigDsl
4
4
 
5
+ # Add common Confluence config DSL to declare known Confluence installations
5
6
  module Confluence
6
7
 
7
- # Initialize the DSL
8
+ # Initialize the DSL
8
9
  def init_confluence
9
10
  # Confluence configuration (can be nil if none)
10
11
  # Hash<Symbol, Object> or nil. See #confluence_info to know details.
@@ -19,7 +19,7 @@ module HybridPlatformsConductor
19
19
  # Array< Hash<Symbol, Object> >
20
20
  attr_reader :fs_paths_rules
21
21
 
22
- # Initialize the DSL
22
+ # Initialize the DSL
23
23
  def init_file_system_tests
24
24
  @fs_paths_rules = []
25
25
  @context = {
@@ -49,7 +49,7 @@ module HybridPlatformsConductor
49
49
  paths: paths.flatten,
50
50
  nodes_selectors_stack: current_nodes_selectors_stack,
51
51
  context: @context.clone,
52
- state: :present
52
+ state: :present
53
53
  }
54
54
  end
55
55
 
@@ -84,7 +84,7 @@ module HybridPlatformsConductor
84
84
  select_confs_for_node(node, fs_paths_rules).
85
85
  inject({}) do |merged_paths, paths_info|
86
86
  if paths_info[:context][:file_system_type] == file_system_type
87
- merged_paths.merge(Hash[paths_info[:paths].map do |path|
87
+ merged_paths.merge(paths_info[:paths].map do |path|
88
88
  [
89
89
  path,
90
90
  {
@@ -92,9 +92,10 @@ module HybridPlatformsConductor
92
92
  context: paths_info[:context]
93
93
  }
94
94
  ]
95
- end]) do |path, rule_info_1, rule_info_2|
95
+ end.to_h) do |path, rule_info_1, rule_info_2|
96
96
  # Just check that configuration is not inconsistent
97
97
  raise "Inconsistent rule for #{file_system_type} file system checks in configuration for #{node}: #{path} is marked as being both #{rule_info_1[:state]} and #{rule_info_2[:state]}" if rule_info_1[:state] != rule_info_2[:state]
98
+
98
99
  rule_info_2
99
100
  end
100
101
  else
@@ -5,9 +5,10 @@ module HybridPlatformsConductor
5
5
 
6
6
  module CommonConfigDsl
7
7
 
8
+ # Add common Github config DSL to declare known Github repositories
8
9
  module Github
9
10
 
10
- # Initialize the DSL
11
+ # Initialize the DSL
11
12
  def init_github
12
13
  # List of Github repositories definitions
13
14
  # Array< Hash<Symbol, Object> >
@@ -18,10 +19,10 @@ module HybridPlatformsConductor
18
19
  # Register new Github repositories
19
20
  #
20
21
  # Parameters::
21
- # * *url* (String): URL to the Github API [default: 'https://api.github.com']
22
22
  # * *user* (String): User or organization name, storing repositories
23
+ # * *url* (String): URL to the Github API [default: 'https://api.github.com']
23
24
  # * *repos* (Array<String> or Symbol): List of repository names from this project, or :all for all [default: :all]
24
- def github_repos(url: 'https://api.github.com', user:, repos: :all)
25
+ def github_repos(user:, url: 'https://api.github.com', repos: :all)
25
26
  @github_repos << {
26
27
  url: url,
27
28
  user: user,
@@ -38,7 +38,7 @@ module HybridPlatformsConductor
38
38
  def ignore_idempotence_tasks(tasks_to_ignore)
39
39
  @ignored_idempotence_tasks << {
40
40
  ignored_tasks: tasks_to_ignore,
41
- nodes_selectors_stack: current_nodes_selectors_stack,
41
+ nodes_selectors_stack: current_nodes_selectors_stack
42
42
  }
43
43
  end
44
44
 
@@ -49,7 +49,7 @@ module HybridPlatformsConductor
49
49
  def ignore_divergent_tasks(tasks_to_ignore)
50
50
  @ignored_divergent_tasks << {
51
51
  ignored_tasks: tasks_to_ignore,
52
- nodes_selectors_stack: current_nodes_selectors_stack,
52
+ nodes_selectors_stack: current_nodes_selectors_stack
53
53
  }
54
54
  end
55
55
 
@@ -1,4 +1,5 @@
1
1
  require 'cleanroom'
2
+ require 'hybrid_platforms_conductor/core_extensions/cleanroom/fix_kwargs'
2
3
  require 'git'
3
4
  require 'ice_cube'
4
5
  require 'hybrid_platforms_conductor/plugins'
@@ -8,7 +9,8 @@ module HybridPlatformsConductor
8
9
  # Object used to access the whole configuration
9
10
  class Config
10
11
 
11
- include LoggerHelpers, Cleanroom
12
+ include Cleanroom
13
+ include LoggerHelpers
12
14
 
13
15
  class << self
14
16
 
@@ -35,6 +37,7 @@ module HybridPlatformsConductor
35
37
  # Directory of the definition of the platforms
36
38
  # String
37
39
  attr_reader :hybrid_platforms_dir
40
+
38
41
  expose :hybrid_platforms_dir
39
42
 
40
43
  # List of expected failures info. Each info has the following properties:
@@ -60,7 +63,7 @@ module HybridPlatformsConductor
60
63
  # Parameters::
61
64
  # * *logger* (Logger): Logger to be used [default = Logger.new(STDOUT)]
62
65
  # * *logger_stderr* (Logger): Logger to be used for stderr [default = Logger.new(STDERR)]
63
- def initialize(logger: Logger.new(STDOUT), logger_stderr: Logger.new(STDERR))
66
+ def initialize(logger: Logger.new($stdout), logger_stderr: Logger.new($stderr))
64
67
  init_loggers(logger, logger_stderr)
65
68
  @hybrid_platforms_dir = File.expand_path(ENV['hpc_platforms'].nil? ? '.' : ENV['hpc_platforms'])
66
69
  # Stack of the nodes selectors scopes
@@ -94,7 +97,7 @@ module HybridPlatformsConductor
94
97
  end
95
98
  # Call initializers if needed
96
99
  Config.mixin_initializers.each do |mixin_init_method|
97
- self.send(mixin_init_method)
100
+ send(mixin_init_method)
98
101
  end
99
102
  include_config_from "#{@hybrid_platforms_dir}/hpc_config.rb"
100
103
  end
@@ -105,7 +108,7 @@ module HybridPlatformsConductor
105
108
  # * *dsl_file* (String): Path to the DSL file
106
109
  def include_config_from(dsl_file)
107
110
  log_debug "Include config from #{dsl_file}"
108
- self.evaluate_file(dsl_file)
111
+ evaluate_file(dsl_file)
109
112
  end
110
113
  expose :include_config_from
111
114
 
@@ -116,6 +119,7 @@ module HybridPlatformsConductor
116
119
  # * *dir* (String): Directory containing the Dockerfile defining the image
117
120
  def os_image(image, dir)
118
121
  raise "OS image #{image} already defined to #{@os_images[image]}" if @os_images.key?(image)
122
+
119
123
  @os_images[image] = dir
120
124
  end
121
125
  expose :os_image
@@ -34,7 +34,7 @@ module HybridPlatformsConductor
34
34
  # * *confluence_password* (String): Confluence password to be used when querying the API
35
35
  # * *logger* (Logger): Logger to be used [default = Logger.new(STDOUT)]
36
36
  # * *logger_stderr* (Logger): Logger to be used for stderr [default = Logger.new(STDERR)]
37
- def initialize(confluence_url, confluence_user_name, confluence_password, logger: Logger.new(STDOUT), logger_stderr: Logger.new(STDERR))
37
+ def initialize(confluence_url, confluence_user_name, confluence_password, logger: Logger.new($stdout), logger_stderr: Logger.new($stderr))
38
38
  init_loggers(logger, logger_stderr)
39
39
  @confluence_url = confluence_url
40
40
  @confluence_user_name = confluence_user_name
@@ -15,8 +15,8 @@ module HybridPlatformsConductor
15
15
  # * *cmd_runner* (CmdRunner): Command executor to be used. [default: CmdRunner.new]
16
16
  # * *nodes_handler* (NodesHandler): NodesHandler to be used. [default: NodesHandler.new]
17
17
  def initialize(
18
- logger: Logger.new(STDOUT),
19
- logger_stderr: Logger.new(STDERR),
18
+ logger: Logger.new($stdout),
19
+ logger_stderr: Logger.new($stderr),
20
20
  config: Config.new,
21
21
  cmd_runner: CmdRunner.new,
22
22
  nodes_handler: NodesHandler.new
@@ -45,8 +45,10 @@ module HybridPlatformsConductor
45
45
  @stderr_io = stderr_io
46
46
  end
47
47
 
48
+ # rubocop:disable Lint/UnusedMethodArgument
48
49
  # Prepare connections to a given set of nodes.
49
50
  # Useful to prefetch metadata or open bulk connections.
51
+ # This method is supposed to be overridden by sub-classes (hence the rubocop exception).
50
52
  #
51
53
  # Parameters::
52
54
  # * *nodes* (Array<String>): Nodes to prepare the connection to
@@ -57,6 +59,7 @@ module HybridPlatformsConductor
57
59
  def with_connection_to(nodes, no_exception: false)
58
60
  yield nodes
59
61
  end
62
+ # rubocop:enable Lint/UnusedMethodArgument
60
63
 
61
64
  private
62
65
 
@@ -0,0 +1,116 @@
1
+ # This is a patch of cleanroom Rubygem v1.0.0 that adds kwargs support for Ruby 3.
2
+ # TODO: Remove this patch when the following code will be merged in a new version of cleanroom:
3
+ # https://github.com/sethvargo/cleanroom/compare/master...Muriel-Salvan:handle_kwargs?expand=1
4
+
5
+ module Cleanroom
6
+
7
+ # Add kwargs support
8
+ module ClassMethods
9
+
10
+ #
11
+ # Expose the given method to the DSL.
12
+ #
13
+ # @param [Symbol] name
14
+ #
15
+ def expose(name)
16
+ raise NameError, "undefined method `#{name}' for class `#{self.name}'" unless public_method_defined?(name)
17
+
18
+ exposed_methods_with_kwargs[name] = true if instance_method(name).parameters.any? { |(arg_type, _arg_name)| KWARGS_TYPES.include?(arg_type) }
19
+ exposed_methods[name] = true
20
+ end
21
+
22
+ private
23
+
24
+ # Define the types of argument types that point kwargs arguments.
25
+ # Useful to treat them differently as when defining a method with kwargs, Ruby will pass parameters having a to_hash method differently to such methods:
26
+ #
27
+ # See this example illustrating the difference in treatment with and without kwargs in the method definition:
28
+ # def without_kwargs(*args)
29
+ # p args
30
+ # end
31
+ # def with_kwargs(*args, **kwargs)
32
+ # p args
33
+ # p kwargs
34
+ # end
35
+ # s_without_to_hash = 'Without to_hash'
36
+ # s_with_to_hash = 'With to_hash'
37
+ # s_with_to_hash.define_singleton_method(:to_hash) { { string: self.to_s } }
38
+ # without_kwargs(s_without_to_hash)
39
+ # ["Without to_hash"]
40
+ # without_kwargs(s_with_to_hash)
41
+ # ["With to_hash"]
42
+ # with_kwargs(s_without_to_hash)
43
+ # ["Without to_hash"]
44
+ # {}
45
+ # with_kwargs(s_with_to_hash)
46
+ # []
47
+ # {:string=>"With to_hash"}
48
+ KWARGS_TYPES = %i[key keyreq]
49
+
50
+ #
51
+ # The list of exposed methods with kwargs.
52
+ #
53
+ # @return [Hash]
54
+ #
55
+ def exposed_methods_with_kwargs
56
+ @exposed_methods_with_kwargs ||= from_superclass(:exposed_methods_with_kwargs, {}).dup
57
+ end
58
+
59
+ #
60
+ # The cleanroom instance for this class. This method is intentionally
61
+ # NOT cached!
62
+ #
63
+ # @return [Class]
64
+ #
65
+ def cleanroom
66
+ exposed = exposed_methods.keys
67
+ exposed_with_kwargs = exposed_methods_with_kwargs.keys
68
+ parent = name || 'Anonymous'
69
+
70
+ Class.new(Object) do
71
+ class << self
72
+
73
+ def class_eval
74
+ raise Cleanroom::InaccessibleError.new(:class_eval, self)
75
+ end
76
+
77
+ def instance_eval
78
+ raise Cleanroom::InaccessibleError.new(:instance_eval, self)
79
+ end
80
+
81
+ end
82
+
83
+ define_method(:initialize) do |instance|
84
+ define_singleton_method(:__instance__) do
85
+ raise Cleanroom::InaccessibleError.new(:__instance__, self) unless caller[0].include?(__FILE__)
86
+
87
+ instance
88
+ end
89
+ end
90
+
91
+ (exposed - exposed_with_kwargs).each do |exposed_method|
92
+ define_method(exposed_method) do |*args, &block|
93
+ __instance__.public_send(exposed_method, *args, &block)
94
+ end
95
+ end
96
+
97
+ exposed_with_kwargs.each do |exposed_method|
98
+ define_method(exposed_method) do |*args, **kwargs, &block|
99
+ __instance__.public_send(exposed_method, *args, **kwargs, &block)
100
+ end
101
+ end
102
+
103
+ define_method(:class_eval) do
104
+ raise Cleanroom::InaccessibleError.new(:class_eval, self)
105
+ end
106
+
107
+ define_method(:inspect) do
108
+ "#<#{parent} (Cleanroom)>"
109
+ end
110
+ alias_method :to_s, :inspect
111
+ end
112
+ end
113
+
114
+ end
115
+
116
+ end
@@ -0,0 +1,24 @@
1
+ module HybridPlatformsConductor
2
+
3
+ module CoreExtensions
4
+
5
+ module Symbol
6
+
7
+ # As it is better to test status code 0 with zero? and as we use status codes as symbols in case of errors, make the zero? call return appropriately.
8
+ module Zero
9
+
10
+ # Does the symbol equal zero?
11
+ #
12
+ # Result::
13
+ # * false: It does not.
14
+ def zero?
15
+ false
16
+ end
17
+
18
+ end
19
+
20
+ end
21
+
22
+ end
23
+
24
+ end