hybrid_platforms_conductor 32.16.4 → 33.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +42 -0
- data/README.md +6 -3
- data/bin/check-node +0 -1
- data/bin/deploy +0 -1
- data/bin/get_impacted_nodes +0 -1
- data/bin/last_deploys +12 -8
- data/bin/nodes_to_deploy +6 -6
- data/bin/setup +6 -6
- data/bin/topograph +1 -1
- data/docs/config_dsl.md +45 -1
- data/docs/executables.md +6 -7
- data/docs/executables/check-node.md +3 -3
- data/docs/executables/deploy.md +3 -3
- data/docs/executables/dump_nodes_json.md +3 -3
- data/docs/executables/test.md +3 -3
- data/docs/executables/topograph.md +3 -3
- data/docs/gen/mermaid/README.md-0.png +0 -0
- data/docs/gen/mermaid/docs/executables/check-node.md-0.png +0 -0
- data/docs/gen/mermaid/docs/executables/deploy.md-0.png +0 -0
- data/docs/gen/mermaid/docs/executables/free_ips.md-0.png +0 -0
- data/docs/gen/mermaid/docs/executables/get_impacted_nodes.md-0.png +0 -0
- data/docs/gen/mermaid/docs/executables/last_deploys.md-0.png +0 -0
- data/docs/gen/mermaid/docs/executables/nodes_to_deploy.md-0.png +0 -0
- data/docs/gen/mermaid/docs/executables/report.md-0.png +0 -0
- data/docs/gen/mermaid/docs/executables/run.md-0.png +0 -0
- data/docs/gen/mermaid/docs/executables/ssh_config.md-0.png +0 -0
- data/docs/gen/mermaid/docs/executables/test.md-0.png +0 -0
- data/docs/plugins.md +47 -0
- data/docs/plugins/connector/ssh.md +1 -1
- data/docs/plugins/log/remote_fs.md +26 -0
- data/docs/plugins/secrets_reader/cli.md +31 -0
- data/docs/plugins/secrets_reader/thycotic.md +46 -0
- data/docs/plugins/test/bitbucket_conf.md +1 -1
- data/docs/plugins/test/check_deploy_and_idempotence.md +1 -1
- data/docs/plugins/test/connection.md +1 -0
- data/docs/plugins/test/deploy_removes_root_access.md +1 -1
- data/docs/plugins/test/file_system.md +1 -0
- data/docs/plugins/test/github_ci.md +48 -0
- data/docs/plugins/test/hostname.md +1 -0
- data/docs/plugins/test/ip.md +1 -0
- data/docs/plugins/test/jenkins_ci_conf.md +1 -1
- data/docs/plugins/test/jenkins_ci_masters_ok.md +1 -1
- data/docs/plugins/test/local_users.md +1 -0
- data/docs/plugins/test/mounts.md +1 -0
- data/docs/plugins/test/orphan_files.md +1 -0
- data/docs/plugins/test/ports.md +1 -0
- data/docs/plugins/test/spectre.md +1 -0
- data/docs/plugins/test/vulnerabilities.md +1 -0
- data/lib/hybrid_platforms_conductor/action.rb +4 -4
- data/lib/hybrid_platforms_conductor/actions_executor.rb +45 -43
- data/lib/hybrid_platforms_conductor/bitbucket.rb +5 -4
- data/lib/hybrid_platforms_conductor/cmd_runner.rb +13 -12
- data/lib/hybrid_platforms_conductor/cmdb.rb +2 -2
- data/lib/hybrid_platforms_conductor/common_config_dsl/bitbucket.rb +2 -1
- data/lib/hybrid_platforms_conductor/common_config_dsl/confluence.rb +2 -1
- data/lib/hybrid_platforms_conductor/common_config_dsl/file_system_tests.rb +5 -4
- data/lib/hybrid_platforms_conductor/common_config_dsl/github.rb +63 -0
- data/lib/hybrid_platforms_conductor/common_config_dsl/idempotence_tests.rb +2 -2
- data/lib/hybrid_platforms_conductor/config.rb +7 -4
- data/lib/hybrid_platforms_conductor/confluence.rb +1 -1
- data/lib/hybrid_platforms_conductor/connector.rb +5 -2
- data/lib/hybrid_platforms_conductor/core_extensions/symbol/zero.rb +24 -0
- data/lib/hybrid_platforms_conductor/credentials.rb +39 -36
- data/lib/hybrid_platforms_conductor/current_dir_monitor.rb +4 -1
- data/lib/hybrid_platforms_conductor/deployer.rb +275 -224
- data/lib/hybrid_platforms_conductor/executable.rb +20 -15
- data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/config.rb +10 -7
- data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/host_ip.rb +1 -1
- data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/host_keys.rb +2 -2
- data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/platform_handlers.rb +4 -4
- data/lib/hybrid_platforms_conductor/hpc_plugins/connector/local.rb +2 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/connector/ssh.rb +45 -49
- data/lib/hybrid_platforms_conductor/hpc_plugins/log/my_log_plugin.rb.sample +100 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/log/remote_fs.rb +180 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/serverless_chef.rb +68 -66
- data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/serverless_chef/dsl_parser.rb +13 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/serverless_chef/recipes_tree_builder.rb +39 -38
- data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/yaml_inventory.rb +5 -4
- data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/docker.rb +43 -45
- data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/podman.rb +18 -20
- data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/proxmox.rb +118 -117
- data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/proxmox/proxmox_waiter.rb +39 -43
- data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/proxmox/reserve_proxmox_container +9 -13
- data/lib/hybrid_platforms_conductor/hpc_plugins/report/confluence.rb +2 -2
- data/lib/hybrid_platforms_conductor/hpc_plugins/report/mediawiki.rb +28 -21
- data/lib/hybrid_platforms_conductor/hpc_plugins/report/stdout.rb +26 -22
- data/lib/hybrid_platforms_conductor/hpc_plugins/secrets_reader/cli.rb +77 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/secrets_reader/my_secrets_reader_plugin.rb.sample +46 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/secrets_reader/thycotic.rb +90 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/bitbucket_conf.rb +3 -3
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/check_deploy_and_idempotence.rb +4 -2
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/connection.rb +3 -1
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/deploy_freshness.rb +7 -21
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/deploy_removes_root_access.rb +21 -19
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/divergence.rb +2 -2
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/executables.rb +2 -2
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/file_system.rb +21 -22
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/file_system_hdfs.rb +19 -21
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/github_ci.rb +31 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/hostname.rb +3 -1
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/idempotence.rb +2 -2
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/ip.rb +4 -2
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/jenkins_ci_conf.rb +21 -22
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/jenkins_ci_masters_ok.rb +10 -12
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/linear_strategy.rb +9 -9
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/local_users.rb +5 -3
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/mounts.rb +5 -3
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/orphan_files.rb +13 -10
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/ports.rb +5 -3
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/private_ips.rb +5 -5
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/public_ips.rb +5 -5
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/spectre.rb +7 -7
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/veids.rb +3 -3
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/vulnerabilities.rb +27 -25
- data/lib/hybrid_platforms_conductor/hpc_plugins/test_report/confluence.rb +2 -2
- data/lib/hybrid_platforms_conductor/hpc_plugins/test_report/stdout.rb +8 -6
- data/lib/hybrid_platforms_conductor/io_router.rb +14 -13
- data/lib/hybrid_platforms_conductor/json_dumper.rb +2 -2
- data/lib/hybrid_platforms_conductor/log.rb +31 -0
- data/lib/hybrid_platforms_conductor/logger_helpers.rb +19 -16
- data/lib/hybrid_platforms_conductor/nodes_handler.rb +89 -71
- data/lib/hybrid_platforms_conductor/parallel_threads.rb +7 -11
- data/lib/hybrid_platforms_conductor/platform_handler.rb +7 -7
- data/lib/hybrid_platforms_conductor/platforms_handler.rb +5 -3
- data/lib/hybrid_platforms_conductor/plugin.rb +2 -2
- data/lib/hybrid_platforms_conductor/plugins.rb +14 -8
- data/lib/hybrid_platforms_conductor/provisioner.rb +4 -4
- data/lib/hybrid_platforms_conductor/report.rb +2 -2
- data/lib/hybrid_platforms_conductor/reports_handler.rb +3 -2
- data/lib/hybrid_platforms_conductor/secrets_reader.rb +31 -0
- data/lib/hybrid_platforms_conductor/services_handler.rb +32 -29
- data/lib/hybrid_platforms_conductor/test_only_remote_node.rb +18 -0
- data/lib/hybrid_platforms_conductor/test_report.rb +15 -18
- data/lib/hybrid_platforms_conductor/tests_runner.rb +116 -118
- data/lib/hybrid_platforms_conductor/thycotic.rb +28 -19
- data/lib/hybrid_platforms_conductor/topographer.rb +200 -190
- data/lib/hybrid_platforms_conductor/topographer/plugins/graphviz.rb +8 -8
- data/lib/hybrid_platforms_conductor/topographer/plugins/json.rb +4 -4
- data/lib/hybrid_platforms_conductor/version.rb +1 -1
- data/spec/hybrid_platforms_conductor_test.rb +33 -12
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/bash_spec.rb +16 -11
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/interactive_spec.rb +1 -1
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/remote_bash_spec.rb +23 -18
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/ruby_spec.rb +67 -49
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/scp_spec.rb +20 -14
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions_spec.rb +63 -50
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/connection_spec.rb +35 -35
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/local/connectable_nodes_spec.rb +12 -8
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/local/remote_actions_spec.rb +4 -7
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/cli_options_spec.rb +21 -22
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/config_dsl_spec.rb +23 -24
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/connectable_nodes_spec.rb +10 -6
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/connections_spec.rb +73 -54
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/global_helpers_spec.rb +145 -126
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/node_helpers_spec.rb +3 -3
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/remote_actions_spec.rb +29 -25
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/logging_spec.rb +106 -91
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/parallel_spec.rb +272 -244
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/timeout_spec.rb +10 -12
- data/spec/hybrid_platforms_conductor_test/api/cmd_runner_spec.rb +36 -36
- data/spec/hybrid_platforms_conductor_test/api/config_spec.rb +24 -22
- data/spec/hybrid_platforms_conductor_test/api/deployer/check_spec.rb +4 -2
- data/spec/hybrid_platforms_conductor_test/api/deployer/config_dsl_spec.rb +43 -5
- data/spec/hybrid_platforms_conductor_test/api/deployer/deploy_spec.rb +199 -216
- data/spec/hybrid_platforms_conductor_test/api/deployer/log_plugins/remote_fs_spec.rb +223 -0
- data/spec/hybrid_platforms_conductor_test/api/deployer/parse_deploy_output_spec.rb +55 -59
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioner_spec.rb +36 -62
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/podman_spec.rb +17 -17
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/config_dsl_spec.rb +4 -4
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/create_spec.rb +44 -51
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/destroy_spec.rb +3 -3
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/ip_spec.rb +12 -16
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/destroy_vm_spec.rb +31 -19
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/expired_containers_spec.rb +324 -266
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/ips_assignment_spec.rb +89 -61
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/other_lxc_containers_resources_spec.rb +117 -93
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/pve_node_resources_spec.rb +71 -54
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/retries_spec.rb +10 -8
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/vm_ids_assignment_spec.rb +80 -60
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/start_spec.rb +1 -1
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/state_spec.rb +1 -1
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/stop_spec.rb +1 -1
- data/spec/hybrid_platforms_conductor_test/api/deployer/secrets_reader_plugins/cli_spec.rb +64 -0
- data/spec/hybrid_platforms_conductor_test/api/deployer/secrets_reader_plugins/thycotic_spec.rb +268 -0
- data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/config_spec.rb +8 -10
- data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/host_ip_spec.rb +33 -24
- data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/host_keys_spec.rb +64 -51
- data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/platform_handlers_spec.rb +3 -3
- data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs_plugins_api_spec.rb +50 -51
- data/spec/hybrid_platforms_conductor_test/api/nodes_handler/common_spec.rb +91 -81
- data/spec/hybrid_platforms_conductor_test/api/nodes_handler/config_dsl_spec.rb +14 -16
- data/spec/hybrid_platforms_conductor_test/api/nodes_handler/git_diff_impacts_spec.rb +51 -75
- data/spec/hybrid_platforms_conductor_test/api/nodes_handler/nodes_selectors_spec.rb +35 -26
- data/spec/hybrid_platforms_conductor_test/api/nodes_handler/platform_handlers_plugins_api_spec.rb +24 -16
- data/spec/hybrid_platforms_conductor_test/api/nodes_handler/several_platforms_spec.rb +29 -19
- data/spec/hybrid_platforms_conductor_test/api/platform_handler_spec.rb +4 -4
- data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/config_dsl_spec.rb +2 -2
- data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/deploy_output_parsing_spec.rb +6 -6
- data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/diff_impacts_spec.rb +57 -99
- data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/inventory_spec.rb +4 -4
- data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/packaging_spec.rb +32 -35
- data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/services_deployment_spec.rb +10 -10
- data/spec/hybrid_platforms_conductor_test/api/platforms_handler_spec.rb +38 -27
- data/spec/hybrid_platforms_conductor_test/api/plugins_spec.rb +46 -52
- data/spec/hybrid_platforms_conductor_test/api/reports_handler_spec.rb +2 -2
- data/spec/hybrid_platforms_conductor_test/api/services_handler/actions_to_deploy_spec.rb +90 -58
- data/spec/hybrid_platforms_conductor_test/api/services_handler/deploy_allowed_spec.rb +38 -34
- data/spec/hybrid_platforms_conductor_test/api/services_handler/log_info_spec.rb +11 -9
- data/spec/hybrid_platforms_conductor_test/api/services_handler/package_spec.rb +193 -171
- data/spec/hybrid_platforms_conductor_test/api/services_handler/parse_deploy_output_spec.rb +66 -54
- data/spec/hybrid_platforms_conductor_test/api/services_handler/prepare_for_deploy_spec.rb +147 -133
- data/spec/hybrid_platforms_conductor_test/api/tests_runner/common_spec.rb +69 -49
- data/spec/hybrid_platforms_conductor_test/api/tests_runner/global_spec.rb +5 -4
- data/spec/hybrid_platforms_conductor_test/api/tests_runner/node_check_spec.rb +8 -5
- data/spec/hybrid_platforms_conductor_test/api/tests_runner/node_spec.rb +8 -5
- data/spec/hybrid_platforms_conductor_test/api/tests_runner/node_ssh_spec.rb +30 -27
- data/spec/hybrid_platforms_conductor_test/api/tests_runner/platform_spec.rb +12 -9
- data/spec/hybrid_platforms_conductor_test/api/tests_runner/reports_spec.rb +48 -47
- data/spec/hybrid_platforms_conductor_test/api/tests_runner/test_plugins/bitbucket_conf_spec.rb +5 -5
- data/spec/hybrid_platforms_conductor_test/api/tests_runner/test_plugins/github_ci_spec.rb +72 -0
- data/spec/hybrid_platforms_conductor_test/api/tests_runner/test_reports_plugins/confluence_spec.rb +5 -5
- data/spec/hybrid_platforms_conductor_test/cmdb_plugins/test_cmdb.rb +9 -9
- data/spec/hybrid_platforms_conductor_test/cmdb_plugins/{test_cmdb2.rb → test_cmdb_2.rb} +6 -6
- data/spec/hybrid_platforms_conductor_test/cmdb_plugins/test_cmdb_others.rb +3 -3
- data/spec/hybrid_platforms_conductor_test/cmdb_plugins/{test_cmdb_others2.rb → test_cmdb_others_2.rb} +2 -2
- data/spec/hybrid_platforms_conductor_test/docs_spec.rb +1 -1
- data/spec/hybrid_platforms_conductor_test/executables/{check-node_spec.rb → check_node_spec.rb} +4 -6
- data/spec/hybrid_platforms_conductor_test/executables/deploy_spec.rb +4 -6
- data/spec/hybrid_platforms_conductor_test/executables/get_impacted_nodes_spec.rb +76 -77
- data/spec/hybrid_platforms_conductor_test/executables/last_deploys_spec.rb +159 -113
- data/spec/hybrid_platforms_conductor_test/executables/nodes_to_deploy_spec.rb +299 -160
- data/spec/hybrid_platforms_conductor_test/executables/options/actions_executor_spec.rb +4 -6
- data/spec/hybrid_platforms_conductor_test/executables/options/cmd_runner_spec.rb +3 -5
- data/spec/hybrid_platforms_conductor_test/executables/options/common_spec.rb +8 -8
- data/spec/hybrid_platforms_conductor_test/executables/options/deployer_spec.rb +12 -196
- data/spec/hybrid_platforms_conductor_test/executables/options/nodes_handler_spec.rb +9 -10
- data/spec/hybrid_platforms_conductor_test/executables/options/nodes_selectors_spec.rb +9 -10
- data/spec/hybrid_platforms_conductor_test/executables/options/reports_handler_spec.rb +1 -1
- data/spec/hybrid_platforms_conductor_test/executables/options/tests_runner_spec.rb +22 -22
- data/spec/hybrid_platforms_conductor_test/executables/report_spec.rb +22 -16
- data/spec/hybrid_platforms_conductor_test/executables/run_spec.rb +32 -32
- data/spec/hybrid_platforms_conductor_test/executables/ssh_config_spec.rb +7 -9
- data/spec/hybrid_platforms_conductor_test/executables/test_spec.rb +3 -5
- data/spec/hybrid_platforms_conductor_test/helpers/actions_executor_helpers.rb +2 -2
- data/spec/hybrid_platforms_conductor_test/helpers/cmd_runner_helpers.rb +4 -3
- data/spec/hybrid_platforms_conductor_test/helpers/cmdb_helpers.rb +2 -2
- data/spec/hybrid_platforms_conductor_test/helpers/config_helpers.rb +1 -1
- data/spec/hybrid_platforms_conductor_test/helpers/connector_ssh_helpers.rb +12 -13
- data/spec/hybrid_platforms_conductor_test/helpers/deployer_helpers.rb +245 -56
- data/spec/hybrid_platforms_conductor_test/helpers/executables_helpers.rb +11 -11
- data/spec/hybrid_platforms_conductor_test/helpers/nodes_handler_helpers.rb +1 -1
- data/spec/hybrid_platforms_conductor_test/helpers/platforms_handler_helpers.rb +39 -28
- data/spec/hybrid_platforms_conductor_test/helpers/plugins_helpers.rb +1 -1
- data/spec/hybrid_platforms_conductor_test/helpers/provisioner_proxmox_helpers.rb +86 -111
- data/spec/hybrid_platforms_conductor_test/helpers/reports_handler_helpers.rb +1 -1
- data/spec/hybrid_platforms_conductor_test/helpers/serverless_chef_helpers.rb +3 -3
- data/spec/hybrid_platforms_conductor_test/helpers/services_handler_helpers.rb +1 -1
- data/spec/hybrid_platforms_conductor_test/helpers/tests_runner_helpers.rb +1 -1
- 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
- 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
- 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
- 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
- data/spec/hybrid_platforms_conductor_test/platform_handler_plugins/test.rb +1 -1
- data/spec/hybrid_platforms_conductor_test/platform_handler_plugins/{test2.rb → test_2.rb} +0 -0
- data/spec/hybrid_platforms_conductor_test/rubocop_spec.rb +31 -0
- data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/1_node/nodes/node.json +3 -3
- data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/data_bags/nodes/node.json +3 -3
- data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/recipes/cookbooks/test_cookbook_2/libraries/default.rb +1 -0
- data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/several_cookbooks/other_cookbooks/test_cookbook_2/libraries/default.rb +1 -0
- data/spec/hybrid_platforms_conductor_test/shared_examples/deployer.rb +952 -0
- data/spec/hybrid_platforms_conductor_test/test_connector.rb +3 -3
- data/spec/hybrid_platforms_conductor_test/test_log_no_read_plugin.rb +84 -0
- data/spec/hybrid_platforms_conductor_test/test_log_plugin.rb +105 -0
- data/spec/hybrid_platforms_conductor_test/test_plugins/global.rb +1 -0
- data/spec/hybrid_platforms_conductor_test/test_plugins/node.rb +1 -0
- data/spec/hybrid_platforms_conductor_test/test_plugins/node_check.rb +1 -0
- data/spec/hybrid_platforms_conductor_test/test_plugins/platform.rb +1 -0
- data/spec/hybrid_platforms_conductor_test/test_plugins/several_checks.rb +2 -2
- data/spec/hybrid_platforms_conductor_test/test_secrets_reader_plugin.rb +45 -0
- data/spec/hybrid_platforms_conductor_test/tests_report_plugin.rb +5 -6
- data/spec/spec_helper.rb +17 -18
- data/tools/check_md +16 -20
- data/tools/generate_mermaid +1 -1
- metadata +82 -13
- data/spec/hybrid_platforms_conductor_test/helpers/deployer_test_helpers.rb +0 -916
data/docs/plugins.md
CHANGED
@@ -10,9 +10,11 @@ Following are all possible plugin types and the plugins shipped by default with
|
|
10
10
|
* [`action`](#action)
|
11
11
|
* [`cmdb`](#cmdb)
|
12
12
|
* [`connector`](#connector)
|
13
|
+
* [`log`](#log)
|
13
14
|
* [`platform_handler`](#platform_handler)
|
14
15
|
* [`provisioner`](#provisioner)
|
15
16
|
* [`report`](#report)
|
17
|
+
* [`secrets_reader`](#secrets_reader)
|
16
18
|
* [`test`](#test)
|
17
19
|
* [`test_report`](#test_report)
|
18
20
|
|
@@ -79,6 +81,30 @@ Plugins shipped by default:
|
|
79
81
|
* [`local`](plugins/connector/local.md)
|
80
82
|
* [`ssh`](plugins/connector/ssh.md)
|
81
83
|
|
84
|
+
<a name="log"></a>
|
85
|
+
## Logs
|
86
|
+
|
87
|
+
Save deployment logs to a given medium (files, log servers...).
|
88
|
+
|
89
|
+
Corresponding plugin type: `log`.
|
90
|
+
|
91
|
+
These plugins give ways for the [`Deployer`](../lib/hybrid_platforms_conductor/deployer.rb) to save logs output from services deployments on nodes.
|
92
|
+
Information that can be saved is:
|
93
|
+
* The deployment stdout.
|
94
|
+
* The deployment stderr.
|
95
|
+
* The deployment exit status.
|
96
|
+
* The list of services that have been deployed.
|
97
|
+
* Some deployment metadata (like git commits information that have been deployed).
|
98
|
+
|
99
|
+
Examples of log plugins are:
|
100
|
+
* Remote file system: Save logs on the node's remote file system (useful for local debugging).
|
101
|
+
* Log servers: Send logs to log servers.
|
102
|
+
|
103
|
+
Check the [sample plugin file](../lib/hybrid_platforms_conductor/hpc_plugins/log/my_log_plugin.rb.sample) to know more about the API that needs to be implemented by such plugins.
|
104
|
+
|
105
|
+
Plugins shipped by default:
|
106
|
+
* [`remote_fs`](plugins/log/remote_fs.md)
|
107
|
+
|
82
108
|
<a name="platform_handler"></a>
|
83
109
|
## Platform Handlers
|
84
110
|
|
@@ -152,6 +178,26 @@ Plugins shipped by default:
|
|
152
178
|
* [`mediawiki`](plugins/report/mediawiki.md)
|
153
179
|
* [`stdout`](plugins/report/stdout.md)
|
154
180
|
|
181
|
+
<a name="secrets_reader"></a>
|
182
|
+
## Secrets readers
|
183
|
+
|
184
|
+
Secrets reader are responsible for fetching secrets (passwords, private keys, API tokens...) needed during deployment from various sources (command line, environment, vaults, secrets servers...).
|
185
|
+
|
186
|
+
Corresponding plugin type: `secrets_reader`.
|
187
|
+
|
188
|
+
These plugins add new ways to retrieve secrets used by the [`Deployer`](../lib/hybrid_platforms_conductor/deployer.rb)
|
189
|
+
|
190
|
+
Examples of secrets readers are:
|
191
|
+
* Command-line: Give secrets from a local file.
|
192
|
+
* Vault: Get secrets from vaults (encrypted databases).
|
193
|
+
* Secrets servers: Query secrets servers to retrieve secrets.
|
194
|
+
|
195
|
+
Check the [sample plugin file](../lib/hybrid_platforms_conductor/hpc_plugins/secrets_reader/my_secrets_reader_plugin.rb.sample) to know more about the API that needs to be implemented by such plugins.
|
196
|
+
|
197
|
+
Plugins shipped by default:
|
198
|
+
* [`cli`](plugins/secrets_reader/cli.md)
|
199
|
+
* [`thycotic`](plugins/secrets_reader/thycotic.md)
|
200
|
+
|
155
201
|
<a name="test"></a>
|
156
202
|
## Tests
|
157
203
|
|
@@ -182,6 +228,7 @@ Plugins shipped by default:
|
|
182
228
|
* [`executables`](plugins/test/executables.md)
|
183
229
|
* [`file_system_hdfs`](plugins/test/file_system_hdfs.md)
|
184
230
|
* [`file_system`](plugins/test/file_system.md)
|
231
|
+
* [`github_ci`](plugins/test/github_ci.md)
|
185
232
|
* [`hostname`](plugins/test/hostname.md)
|
186
233
|
* [`idempotence`](plugins/test/idempotence.md)
|
187
234
|
* [`ip`](plugins/test/ip.md)
|
@@ -70,7 +70,7 @@ end
|
|
70
70
|
| `host_keys` | `Array<String>` | The node's host keys used to generate a `known_hosts` file with those to avoid user confirmations when connecting. |
|
71
71
|
| `hostname` | `String` | Host name used to connect in case no IP address can be found in metadata. |
|
72
72
|
| `private_ips` | `Array<String>` | IP list to connect in case `host_ip` is not defined in metadata. |
|
73
|
-
| `ssh_session_exec` | `
|
73
|
+
| `ssh_session_exec` | `Boolean` | If set to `false`, then consider that the node does not have any SSH SessionExec capabilities. This will make sure that remote command executions is done using stdin piping on interactive sessions instead of SSH commands execution. |
|
74
74
|
|
75
75
|
## Used environment variables
|
76
76
|
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# Log plugin: `remote_fs`
|
2
|
+
|
3
|
+
The `remote_fs` log plugin saves deployment logs in each remote node that has been deployed, in the `/var/log/deployments` directory.
|
4
|
+
|
5
|
+
## Config DSL extension
|
6
|
+
|
7
|
+
None
|
8
|
+
|
9
|
+
## Used credentials
|
10
|
+
|
11
|
+
| Credential | Usage
|
12
|
+
| --- | --- |
|
13
|
+
|
14
|
+
## Used Metadata
|
15
|
+
|
16
|
+
| Metadata | Type | Usage
|
17
|
+
| --- | --- | --- |
|
18
|
+
|
19
|
+
## Used environment variables
|
20
|
+
|
21
|
+
| Variable | Usage
|
22
|
+
| --- | --- |
|
23
|
+
|
24
|
+
## External tools dependencies
|
25
|
+
|
26
|
+
None
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# Secrets reader plugin: `cli`
|
2
|
+
|
3
|
+
The `cli` secrets reader plugin reads secrets from a local JSON file that can be given through the `--secrets` command-line parameter.
|
4
|
+
|
5
|
+
Example:
|
6
|
+
```bash
|
7
|
+
./bin/deploy --node my_node --secrets /path/to/my_secrets.json
|
8
|
+
```
|
9
|
+
|
10
|
+
## Config DSL extension
|
11
|
+
|
12
|
+
None
|
13
|
+
|
14
|
+
## Used credentials
|
15
|
+
|
16
|
+
| Credential | Usage
|
17
|
+
| --- | --- |
|
18
|
+
|
19
|
+
## Used Metadata
|
20
|
+
|
21
|
+
| Metadata | Type | Usage
|
22
|
+
| --- | --- | --- |
|
23
|
+
|
24
|
+
## Used environment variables
|
25
|
+
|
26
|
+
| Variable | Usage
|
27
|
+
| --- | --- |
|
28
|
+
|
29
|
+
## External tools dependencies
|
30
|
+
|
31
|
+
None
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# Secrets reader plugin: `thycotic`
|
2
|
+
|
3
|
+
The `thycotic` secrets reader plugin retrieves secrets from a [Thycotic secrets server](https://thycotic.com/products/secret-server-vdo/), using its SOAP API.
|
4
|
+
|
5
|
+
It is configured using the `secrets_from_thycotic` (see below) config DSL and uses the `thycotic` credential ID to authenticate.
|
6
|
+
|
7
|
+
## Config DSL extension
|
8
|
+
|
9
|
+
### `secrets_from_thycotic`
|
10
|
+
|
11
|
+
Define a Thycotic URL and Thycotic secret ID to fetch from a Thycotic server.
|
12
|
+
The Thycotic secret should contain a JSON file that will be retrieved locally to be used as a secrets source. The local copy will then be removed after deployment.
|
13
|
+
|
14
|
+
Can be applied to subset of nodes using the [`for_nodes` DSL method](/docs/config_dsl.md#for_nodes).
|
15
|
+
|
16
|
+
It takes the following parameters:
|
17
|
+
* **thycotic_url** (`String`): The Thycotic server URL.
|
18
|
+
* **secret_id** (`Integer`): The Thycotic secret ID containing the secrets file to be used as secrets.
|
19
|
+
|
20
|
+
Example:
|
21
|
+
```ruby
|
22
|
+
secrets_from_thycotic(
|
23
|
+
thycotic_url: 'https://my-thycotic-server.my-domain.com/SecretServer',
|
24
|
+
secret_id: 1107
|
25
|
+
)
|
26
|
+
```
|
27
|
+
|
28
|
+
## Used credentials
|
29
|
+
|
30
|
+
| Credential | Usage
|
31
|
+
| --- | --- |
|
32
|
+
| `thycotic` | Used to authenticate on the Thycotic server's SOAP API |
|
33
|
+
|
34
|
+
## Used Metadata
|
35
|
+
|
36
|
+
| Metadata | Type | Usage
|
37
|
+
| --- | --- | --- |
|
38
|
+
|
39
|
+
## Used environment variables
|
40
|
+
|
41
|
+
| Variable | Usage
|
42
|
+
| --- | --- |
|
43
|
+
|
44
|
+
## External tools dependencies
|
45
|
+
|
46
|
+
None
|
@@ -12,7 +12,7 @@ Define a Bitbucket installation to be targeted.
|
|
12
12
|
It takes the following parameters:
|
13
13
|
* **url** (`String`): URL to the Bitbucket server
|
14
14
|
* **project** (`String`): Project name from the Bitbucket server, storing repositories
|
15
|
-
* **repos** (`Array<String>` or `Symbol`): List of repository names from this project, or
|
15
|
+
* **repos** (`Array<String>` or `Symbol`): List of repository names from this project, or `:all` for all [default: `:all`]
|
16
16
|
* **checks** (`Hash<Symbol, Object>`): Checks definition to be perform on those repositories [default: {}]
|
17
17
|
* **branch_permissions** (`Array< Hash<Symbol, Object> >`): List of branch permissions to check [optional]
|
18
18
|
* **type** (`String`): Type of branch permissions to check. Examples of values are 'fast-forward-only', 'no-deletes', 'pull-request-only'.
|
@@ -49,7 +49,7 @@ end
|
|
49
49
|
|
50
50
|
| Metadata | Type | Usage
|
51
51
|
| --- | --- | --- |
|
52
|
-
| `root_access_allowed` | `
|
52
|
+
| `root_access_allowed` | `Boolean` | If set to `true`, then skip the test for `root` access being disabled after deployment |
|
53
53
|
|
54
54
|
## Used environment variables
|
55
55
|
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# Test plugin: `github_ci`
|
2
|
+
|
3
|
+
The `github_ci` test plugin checks that the `master` branch of Github repositories has a successful CI result from its [Github Actions](https://github.com/features/actions).
|
4
|
+
|
5
|
+
## Config DSL extension
|
6
|
+
|
7
|
+
### `github_repos`
|
8
|
+
|
9
|
+
Define Github repositories to be targeted.
|
10
|
+
|
11
|
+
It takes the following parameters:
|
12
|
+
* **url** (`String`): URL to the Github API [default: `'https://api.github.com'`]
|
13
|
+
* **user** (`String`): User or organization name, storing repositories
|
14
|
+
* **repos** (`Array<String>` or `Symbol`): List of repository names from this project, or `:all` for all [default: `:all`]
|
15
|
+
|
16
|
+
Example:
|
17
|
+
```ruby
|
18
|
+
github_repos(
|
19
|
+
# Github's user containing repositories
|
20
|
+
user: 'My-Github-User',
|
21
|
+
# List of repositories to check
|
22
|
+
repos: [
|
23
|
+
'my-platform-repo',
|
24
|
+
'my-chef-repo',
|
25
|
+
'my-hpc-plugins'
|
26
|
+
]
|
27
|
+
)
|
28
|
+
```
|
29
|
+
|
30
|
+
## Used credentials
|
31
|
+
|
32
|
+
| Credential | Usage
|
33
|
+
| --- | --- |
|
34
|
+
| `github` | Used to connect to the Github API. Password should be the Github API token. |
|
35
|
+
|
36
|
+
## Used Metadata
|
37
|
+
|
38
|
+
| Metadata | Type | Usage
|
39
|
+
| --- | --- | --- |
|
40
|
+
|
41
|
+
## Used environment variables
|
42
|
+
|
43
|
+
| Variable | Usage
|
44
|
+
| --- | --- |
|
45
|
+
|
46
|
+
## External tools dependencies
|
47
|
+
|
48
|
+
None
|
data/docs/plugins/test/ip.md
CHANGED
@@ -16,6 +16,7 @@ None
|
|
16
16
|
|
17
17
|
| Metadata | Type | Usage
|
18
18
|
| --- | --- | --- |
|
19
|
+
| `local_node` | `Boolean` | Skip this test for nodes having this metadata set to `true` |
|
19
20
|
| `private_ips` | `Array<String>` | List of possible private IPs the node should have |
|
20
21
|
|
21
22
|
## Used environment variables
|
@@ -12,7 +12,7 @@ It takes the following parameters:
|
|
12
12
|
* **url** (`String`): URL to the Bitbucket server
|
13
13
|
* **project** (`String`): Project name from the Bitbucket server, storing repositories
|
14
14
|
* **jenkins_ci_url** (`String` or `nil`): Corresponding Jenkins CI URL, or nil if none.
|
15
|
-
* **repos** (`Array<String>` or `Symbol`): List of repository names from this project, or
|
15
|
+
* **repos** (`Array<String>` or `Symbol`): List of repository names from this project, or `:all` for all [default: `:all`]
|
16
16
|
|
17
17
|
Example:
|
18
18
|
```ruby
|
@@ -12,7 +12,7 @@ It takes the following parameters:
|
|
12
12
|
* **url** (`String`): URL to the Bitbucket server
|
13
13
|
* **project** (`String`): Project name from the Bitbucket server, storing repositories
|
14
14
|
* **jenkins_ci_url** (`String` or `nil`): Corresponding Jenkins CI URL, or nil if none.
|
15
|
-
* **repos** (`Array<String>` or `Symbol`): List of repository names from this project, or
|
15
|
+
* **repos** (`Array<String>` or `Symbol`): List of repository names from this project, or `:all` for all [default: `:all`]
|
16
16
|
|
17
17
|
Example:
|
18
18
|
```ruby
|
data/docs/plugins/test/mounts.md
CHANGED
data/docs/plugins/test/ports.md
CHANGED
@@ -39,6 +39,7 @@ check_closed_ports 25, 110
|
|
39
39
|
| Metadata | Type | Usage
|
40
40
|
| --- | --- | --- |
|
41
41
|
| `host_ip` | `String` | Host IP address to be tested for port listening |
|
42
|
+
| `local_node` | `Boolean` | Skip this test for nodes having this metadata set to `true` |
|
42
43
|
|
43
44
|
## Used environment variables
|
44
45
|
|
@@ -54,6 +54,7 @@ None
|
|
54
54
|
| Metadata | Type | Usage
|
55
55
|
| --- | --- | --- |
|
56
56
|
| `image` | `String` | The name of the OS image to be used. The [configuration](../../config_dsl.md) should define the image and point it to a directory containing a `oval.json` that will contain definition of OVAL files to be checked for this OS(see above). |
|
57
|
+
| `local_node` | `Boolean` | Skip this test for nodes having this metadata set to `true` |
|
57
58
|
|
58
59
|
## Used environment variables
|
59
60
|
|
@@ -16,8 +16,8 @@ module HybridPlatformsConductor
|
|
16
16
|
# * *actions_executor* (ActionsExecutor): Actions Executor to be used. [default: ActionsExecutor.new]
|
17
17
|
# * *action_info* (Object or nil): Action info needed to setup the action, or nil if none [default: nil]
|
18
18
|
def initialize(
|
19
|
-
logger: Logger.new(
|
20
|
-
logger_stderr: Logger.new(
|
19
|
+
logger: Logger.new($stdout),
|
20
|
+
logger_stderr: Logger.new($stderr),
|
21
21
|
config: Config.new,
|
22
22
|
cmd_runner: CmdRunner.new,
|
23
23
|
actions_executor: ActionsExecutor.new,
|
@@ -27,7 +27,7 @@ module HybridPlatformsConductor
|
|
27
27
|
@cmd_runner = cmd_runner
|
28
28
|
@actions_executor = actions_executor
|
29
29
|
@action_info = action_info
|
30
|
-
setup(@action_info) if
|
30
|
+
setup(@action_info) if respond_to?(:setup)
|
31
31
|
end
|
32
32
|
|
33
33
|
# Do we need a connector to execute this action on a node?
|
@@ -53,7 +53,7 @@ module HybridPlatformsConductor
|
|
53
53
|
@timeout = timeout
|
54
54
|
@stdout_io = stdout_io
|
55
55
|
@stderr_io = stderr_io
|
56
|
-
@connector
|
56
|
+
@connector&.prepare_for(@node, @timeout, @stdout_io, @stderr_io)
|
57
57
|
end
|
58
58
|
|
59
59
|
private
|
@@ -35,7 +35,7 @@ module HybridPlatformsConductor
|
|
35
35
|
# * *config* (Config): Config to be used. [default = Config.new]
|
36
36
|
# * *cmd_runner* (CmdRunner): Command runner to be used. [default = CmdRunner.new]
|
37
37
|
# * *nodes_handler* (NodesHandler): Nodes handler to be used. [default = NodesHandler.new]
|
38
|
-
def initialize(logger: Logger.new(
|
38
|
+
def initialize(logger: Logger.new($stdout), logger_stderr: Logger.new($stderr), config: Config.new, cmd_runner: CmdRunner.new, nodes_handler: NodesHandler.new)
|
39
39
|
init_loggers(logger, logger_stderr)
|
40
40
|
@config = config
|
41
41
|
@cmd_runner = cmd_runner
|
@@ -74,17 +74,17 @@ module HybridPlatformsConductor
|
|
74
74
|
end
|
75
75
|
# Display options connectors might have
|
76
76
|
@connector_plugins.each do |connector_name, connector|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
77
|
+
next unless connector.respond_to?(:options_parse)
|
78
|
+
|
79
|
+
options_parser.separator ''
|
80
|
+
options_parser.separator "Connector #{connector_name} options:"
|
81
|
+
connector.options_parse(options_parser)
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
85
85
|
# Validate that parsed parameters are valid
|
86
86
|
def validate_params
|
87
|
-
@connector_plugins.
|
87
|
+
@connector_plugins.each_value do |connector|
|
88
88
|
connector.validate_params if connector.respond_to?(:validate_params)
|
89
89
|
end
|
90
90
|
end
|
@@ -102,7 +102,14 @@ module HybridPlatformsConductor
|
|
102
102
|
# * *progress_name* (String): Name to display on the progress bar [default: 'Executing actions']
|
103
103
|
# Result::
|
104
104
|
# * Hash<String, [Integer or Symbol, String, String]>: Exit status code (or Symbol in case of error or dry run), standard output and error for each node.
|
105
|
-
def execute_actions(
|
105
|
+
def execute_actions(
|
106
|
+
actions_per_nodes,
|
107
|
+
timeout: nil,
|
108
|
+
concurrent: false,
|
109
|
+
log_to_dir: "#{@config.hybrid_platforms_dir}/run_logs",
|
110
|
+
log_to_stdout: true,
|
111
|
+
progress_name: 'Executing actions'
|
112
|
+
)
|
106
113
|
# Keep a list of nodes that will need remote access
|
107
114
|
nodes_needing_connectors = []
|
108
115
|
# Compute the ordered list of actions per selected node
|
@@ -117,6 +124,7 @@ module HybridPlatformsConductor
|
|
117
124
|
nodes_actions_set.each do |action_type, action_info|
|
118
125
|
raise 'Cannot have concurrent executions for interactive sessions' if concurrent && action_type == :interactive && action_info
|
119
126
|
raise "Unknown action type #{action_type}" unless @action_plugins.key?(action_type)
|
127
|
+
|
120
128
|
action = @action_plugins[action_type].new(
|
121
129
|
logger: @logger,
|
122
130
|
logger_stderr: @logger_stderr,
|
@@ -137,7 +145,7 @@ module HybridPlatformsConductor
|
|
137
145
|
actions_per_node[node].concat(resolved_nodes_actions)
|
138
146
|
end
|
139
147
|
end
|
140
|
-
result =
|
148
|
+
result = actions_per_node.keys.map { |node| [node, nil] }.to_h
|
141
149
|
with_connections_prepared_to(nodes_needing_connectors, no_exception: true) do |connected_nodes|
|
142
150
|
missing_nodes = []
|
143
151
|
connected_nodes.each do |node, connector|
|
@@ -151,7 +159,7 @@ module HybridPlatformsConductor
|
|
151
159
|
# Prepare the result (stdout or nil per node)
|
152
160
|
unless accessible_nodes.empty?
|
153
161
|
# If we run in parallel then clone the connectors, so that each node has its own instance for thread-safe code.
|
154
|
-
connected_nodes =
|
162
|
+
connected_nodes = connected_nodes.transform_values(&:clone) if concurrent
|
155
163
|
@nodes_handler.for_each_node_in(
|
156
164
|
accessible_nodes,
|
157
165
|
parallel: concurrent,
|
@@ -185,10 +193,11 @@ module HybridPlatformsConductor
|
|
185
193
|
# * *connected_nodes* (Hash<String, Connector or Symbol>): Prepared connectors (or Symbol in case of failure with no_exception), per node name
|
186
194
|
def with_connections_prepared_to(nodes, no_exception: false)
|
187
195
|
# Make sure every node needing connectors finds a connector
|
188
|
-
nodes_needing_connectors =
|
189
|
-
@connector_plugins.
|
196
|
+
nodes_needing_connectors = nodes.map { |node| [node, nil] }.to_h
|
197
|
+
@connector_plugins.each_value do |connector|
|
190
198
|
nodes_without_connectors = nodes_needing_connectors.select { |_node, selected_connector| selected_connector.nil? }.keys
|
191
199
|
break if nodes_without_connectors.empty?
|
200
|
+
|
192
201
|
(connector.connectable_nodes_from(nodes_without_connectors) & nodes_without_connectors).each do |node|
|
193
202
|
nodes_needing_connectors[node] = connector if nodes_needing_connectors[node].nil?
|
194
203
|
end
|
@@ -206,23 +215,20 @@ module HybridPlatformsConductor
|
|
206
215
|
if connector_name.nil?
|
207
216
|
# All plugins have been prepared.
|
208
217
|
# Call our client code.
|
209
|
-
yield
|
210
|
-
|
211
|
-
|
212
|
-
selected_connector.nil? ? :no_connector : selected_connector
|
213
|
-
]
|
214
|
-
end]
|
218
|
+
yield(nodes_needing_connectors.transform_values do |selected_connector|
|
219
|
+
selected_connector.nil? ? :no_connector : selected_connector
|
220
|
+
end)
|
215
221
|
else
|
216
222
|
connector = @connector_plugins[connector_name]
|
217
223
|
selected_nodes = nodes_needing_connectors.select { |_node, selected_connector| selected_connector == connector }.keys
|
218
224
|
if selected_nodes.empty?
|
219
|
-
preparation_code.call(remaining_plugins_to_prepare[1
|
225
|
+
preparation_code.call(remaining_plugins_to_prepare[1..])
|
220
226
|
else
|
221
227
|
connector.with_connection_to(selected_nodes, no_exception: no_exception) do |connected_nodes|
|
222
228
|
(selected_nodes - connected_nodes).each do |node_in_error|
|
223
229
|
nodes_needing_connectors[node_in_error] = :connection_error
|
224
230
|
end
|
225
|
-
preparation_code.call(remaining_plugins_to_prepare[1
|
231
|
+
preparation_code.call(remaining_plugins_to_prepare[1..])
|
226
232
|
end
|
227
233
|
end
|
228
234
|
end
|
@@ -262,8 +268,6 @@ module HybridPlatformsConductor
|
|
262
268
|
if log_to_file
|
263
269
|
FileUtils.mkdir_p(File.dirname(log_to_file))
|
264
270
|
File.open(log_to_file, 'w')
|
265
|
-
else
|
266
|
-
nil
|
267
271
|
end
|
268
272
|
stdout_queue = Queue.new
|
269
273
|
stderr_queue = Queue.new
|
@@ -277,28 +281,26 @@ module HybridPlatformsConductor
|
|
277
281
|
(log_to_stdout ? [@logger_stderr] : []) +
|
278
282
|
(file_output.nil? ? [] : [file_output])
|
279
283
|
) do
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
remaining_timeout -= Time.now - start_time unless remaining_timeout.nil?
|
287
|
-
end
|
288
|
-
rescue ConnectionError
|
289
|
-
exit_status = :connection_error
|
290
|
-
stderr_queue << "#{$!}\n"
|
291
|
-
rescue CmdRunner::UnexpectedExitCodeError
|
292
|
-
exit_status = :failed_command
|
293
|
-
stderr_queue << "#{$!}\n"
|
294
|
-
rescue CmdRunner::TimeoutError
|
295
|
-
# Error has already been logged in stderr
|
296
|
-
exit_status = :timeout
|
297
|
-
rescue
|
298
|
-
log_error "Uncaught exception while executing actions on #{node}: #{$!}\n#{$!.backtrace.join("\n")}"
|
299
|
-
stderr_queue << "#{$!}\n"
|
300
|
-
exit_status = :failed_action
|
284
|
+
log_debug "[#{node}] - Execute #{actions.size} actions on #{node}..."
|
285
|
+
actions.each do |action|
|
286
|
+
action.prepare_for(node, connector, remaining_timeout, stdout_queue, stderr_queue)
|
287
|
+
start_time = Time.now
|
288
|
+
action.execute
|
289
|
+
remaining_timeout -= Time.now - start_time unless remaining_timeout.nil?
|
301
290
|
end
|
291
|
+
rescue ConnectionError
|
292
|
+
exit_status = :connection_error
|
293
|
+
stderr_queue << "#{$ERROR_INFO}\n"
|
294
|
+
rescue CmdRunner::UnexpectedExitCodeError
|
295
|
+
exit_status = :failed_command
|
296
|
+
stderr_queue << "#{$ERROR_INFO}\n"
|
297
|
+
rescue CmdRunner::TimeoutError
|
298
|
+
# Error has already been logged in stderr
|
299
|
+
exit_status = :timeout
|
300
|
+
rescue
|
301
|
+
log_error "Uncaught exception while executing actions on #{node}: #{$ERROR_INFO}\n#{$ERROR_INFO.backtrace.join("\n")}"
|
302
|
+
stderr_queue << "#{$ERROR_INFO}\n"
|
303
|
+
exit_status = :failed_action
|
302
304
|
end
|
303
305
|
[exit_status, stdout, stderr]
|
304
306
|
end
|