hybrid_platforms_conductor 32.18.0 → 33.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +36 -0
- data/README.md +3 -3
- data/bin/check-node +0 -1
- data/bin/deploy +0 -1
- data/bin/get_impacted_nodes +0 -1
- data/bin/last_deploys +8 -7
- data/bin/nodes_to_deploy +2 -2
- data/bin/setup +6 -6
- data/bin/topograph +1 -1
- data/docs/config_dsl.md +23 -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/plugins.md +21 -0
- data/docs/plugins/secrets_reader/cli.md +31 -0
- data/docs/plugins/secrets_reader/thycotic.md +46 -0
- data/lib/hybrid_platforms_conductor/action.rb +4 -4
- data/lib/hybrid_platforms_conductor/actions_executor.rb +37 -42
- data/lib/hybrid_platforms_conductor/bitbucket.rb +5 -4
- data/lib/hybrid_platforms_conductor/cmd_runner.rb +26 -23
- 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 +4 -3
- data/lib/hybrid_platforms_conductor/common_config_dsl/idempotence_tests.rb +2 -2
- data/lib/hybrid_platforms_conductor/config.rb +8 -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/cleanroom/fix_kwargs.rb +116 -0
- 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 +185 -127
- 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 +5 -1
- data/lib/hybrid_platforms_conductor/hpc_plugins/connector/ssh.rb +45 -49
- data/lib/hybrid_platforms_conductor/hpc_plugins/log/remote_fs.rb +6 -5
- data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/serverless_chef.rb +77 -79
- 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 +119 -118
- 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/deploy_freshness.rb +0 -1
- 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 +19 -21
- 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 +2 -3
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/idempotence.rb +2 -2
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/ip.rb +1 -1
- 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 +2 -2
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/mounts.rb +2 -2
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/orphan_files.rb +10 -9
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/ports.rb +2 -2
- 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 +4 -6
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/veids.rb +3 -3
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/vulnerabilities.rb +25 -24
- 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 +2 -2
- 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 +1 -1
- 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 +29 -6
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/bash_spec.rb +18 -11
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/interactive_spec.rb +2 -2
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/remote_bash_spec.rb +32 -21
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/ruby_spec.rb +75 -49
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/scp_spec.rb +27 -15
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions_spec.rb +90 -59
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/connection_spec.rb +46 -44
- 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 +106 -75
- 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 +167 -142
- 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 +16 -16
- data/spec/hybrid_platforms_conductor_test/api/cmd_runner_spec.rb +42 -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 +24 -6
- data/spec/hybrid_platforms_conductor_test/api/deployer/deploy_spec.rb +34 -26
- data/spec/hybrid_platforms_conductor_test/api/deployer/log_plugins/remote_fs_spec.rb +21 -21
- 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 +4 -3
- 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 +5 -5
- 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 +13 -15
- data/spec/hybrid_platforms_conductor_test/executables/nodes_to_deploy_spec.rb +289 -307
- 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 -9
- 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 +216 -14
- 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 +4 -3
- data/spec/hybrid_platforms_conductor_test/test_log_no_read_plugin.rb +3 -1
- data/spec/hybrid_platforms_conductor_test/test_log_plugin.rb +3 -1
- 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 +186 -144
- data/spec/hybrid_platforms_conductor_test/helpers/deployer_test_helpers.rb +0 -916
@@ -12,7 +12,8 @@ module HybridPlatformsConductor
|
|
12
12
|
# Class running tests
|
13
13
|
class TestsRunner
|
14
14
|
|
15
|
-
include
|
15
|
+
include ParallelThreads
|
16
|
+
include LoggerHelpers
|
16
17
|
|
17
18
|
# List of tests to execute [default: []]
|
18
19
|
# Array<Symbol>
|
@@ -50,8 +51,8 @@ module HybridPlatformsConductor
|
|
50
51
|
# * *actions_executor* (ActionsExecutor): Actions Executor to be used for the tests [default: ActionsExecutor.new]
|
51
52
|
# * *deployer* (Deployer): Deployer to be used for the tests needed why-run deployments [default: Deployer.new]
|
52
53
|
def initialize(
|
53
|
-
logger: Logger.new(
|
54
|
-
logger_stderr: Logger.new(
|
54
|
+
logger: Logger.new($stdout),
|
55
|
+
logger_stderr: Logger.new($stderr),
|
55
56
|
config: Config.new,
|
56
57
|
cmd_runner: CmdRunner.new,
|
57
58
|
platforms_handler: PlatformsHandler.new,
|
@@ -74,10 +75,10 @@ module HybridPlatformsConductor
|
|
74
75
|
@reports_plugins = Plugins.new(:test_report, logger: @logger, logger_stderr: @logger_stderr)
|
75
76
|
# Register test classes from platforms
|
76
77
|
@platforms_handler.known_platforms.each do |platform|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
78
|
+
next unless platform.respond_to?(:tests)
|
79
|
+
|
80
|
+
platform.tests.each do |test_name, test_class|
|
81
|
+
@tests_plugins[test_name] = test_class
|
81
82
|
end
|
82
83
|
end
|
83
84
|
# Do we skip running check-node?
|
@@ -146,6 +147,7 @@ module HybridPlatformsConductor
|
|
146
147
|
@reports.sort!
|
147
148
|
unknown_tests = @tests - @tests_plugins.keys
|
148
149
|
raise "Unknown test names: #{unknown_tests.join(', ')}" unless unknown_tests.empty?
|
150
|
+
|
149
151
|
@nodes = @nodes_handler.select_nodes(nodes_selectors).uniq.sort
|
150
152
|
|
151
153
|
# Resolve the expected failures from the config.
|
@@ -173,11 +175,11 @@ module HybridPlatformsConductor
|
|
173
175
|
@platforms_handler.known_platforms.each do |platform|
|
174
176
|
platform_nodes = platform.known_nodes
|
175
177
|
@node_expected_failures.each do |test_name, expected_failures_for_test|
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
178
|
+
next unless (platform_nodes - expected_failures_for_test.keys).empty?
|
179
|
+
|
180
|
+
# We have an expected failure for this test
|
181
|
+
@platform_expected_failures[test_name] = {} unless @platform_expected_failures.key?(test_name)
|
182
|
+
@platform_expected_failures[test_name][platform.name] = expected_failures_for_test.values.uniq.join(' + ')
|
181
183
|
end
|
182
184
|
end
|
183
185
|
|
@@ -191,24 +193,24 @@ module HybridPlatformsConductor
|
|
191
193
|
run_tests_connection_on_nodes
|
192
194
|
run_tests_on_check_nodes
|
193
195
|
|
194
|
-
@tested_platforms = @tests_run.map
|
196
|
+
@tested_platforms = @tests_run.map(&:platform).compact.uniq.sort
|
195
197
|
|
196
198
|
# Check that tests that were expected to fail did not succeed.
|
197
199
|
@tests_run.each do |test|
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
200
|
+
next unless test.executed?
|
201
|
+
|
202
|
+
expected_failure = test.expected_failure
|
203
|
+
if expected_failure
|
204
|
+
if test.errors.empty?
|
205
|
+
# Should have failed
|
206
|
+
error(
|
207
|
+
"Test #{test} was marked to fail (#{expected_failure}) but it succeeded. Please remove it from the expected failures in case the issue has been resolved.",
|
208
|
+
platform: test.platform,
|
209
|
+
node: test.node,
|
210
|
+
force_failure: true
|
211
|
+
)
|
212
|
+
else
|
213
|
+
out "Expected failure for #{test} (#{expected_failure}):\n#{test.errors.map { |error| " - #{error}" }.join("\n")}".yellow
|
212
214
|
end
|
213
215
|
end
|
214
216
|
end
|
@@ -217,14 +219,12 @@ module HybridPlatformsConductor
|
|
217
219
|
@node_expected_failures.each do |test_name, test_expected_failures|
|
218
220
|
test_expected_failures.each do |node, expected_failure|
|
219
221
|
# Check that a test has been run for this expected failure
|
220
|
-
unless @tests_run.find do |test|
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
end
|
227
|
-
error("A test named #{test_name} for node #{node} was expected to fail (#{expected_failure}), but no test has been run. Please remove it from the expected failures if this expected failure is obsolete.")
|
222
|
+
error("A test named #{test_name} for node #{node} was expected to fail (#{expected_failure}), but no test has been run. Please remove it from the expected failures if this expected failure is obsolete.") unless @tests_run.find do |test|
|
223
|
+
test.name == test_name &&
|
224
|
+
(
|
225
|
+
(test.node.nil? && node == '') ||
|
226
|
+
(!test.node.nil? && node == test.node)
|
227
|
+
)
|
228
228
|
end
|
229
229
|
end
|
230
230
|
end
|
@@ -232,11 +232,9 @@ module HybridPlatformsConductor
|
|
232
232
|
|
233
233
|
# Produce reports
|
234
234
|
@reports.each do |report|
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
log_error "Uncaught exception while producing report #{report}: #{$!}\n#{$!.backtrace.join("\n")}"
|
239
|
-
end
|
235
|
+
@reports_plugins[report].new(@logger, @logger_stderr, @config, @nodes_handler, @nodes, @tested_platforms, @tests_run).report
|
236
|
+
rescue
|
237
|
+
log_error "Uncaught exception while producing report #{report}: #{$ERROR_INFO}\n#{$ERROR_INFO.backtrace.join("\n")}"
|
240
238
|
end
|
241
239
|
|
242
240
|
out
|
@@ -285,6 +283,9 @@ module HybridPlatformsConductor
|
|
285
283
|
name: test_name.nil? ? :global : test_name,
|
286
284
|
platform: platform,
|
287
285
|
node: node,
|
286
|
+
# Keep this else on purpose to show where global tests could have expected failures
|
287
|
+
# rubocop:disable Style/EmptyElse
|
288
|
+
# rubocop:disable Lint/DuplicateBranch
|
288
289
|
expected_failure: if ignore_expected_failure
|
289
290
|
nil
|
290
291
|
elsif !node.nil?
|
@@ -297,6 +298,8 @@ module HybridPlatformsConductor
|
|
297
298
|
# Global test
|
298
299
|
nil
|
299
300
|
end
|
301
|
+
# rubocop:enable Lint/DuplicateBranch
|
302
|
+
# rubocop:enable Style/EmptyElse
|
300
303
|
)
|
301
304
|
end
|
302
305
|
|
@@ -333,38 +336,38 @@ module HybridPlatformsConductor
|
|
333
336
|
[]
|
334
337
|
end
|
335
338
|
end.flatten
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
out "[ #{Time.now.utc.strftime('%F %T')} ] - [ #{test_category} ] - [ #{test.name} ] - Start test..."
|
356
|
-
begin_time = Time.now
|
357
|
-
begin
|
358
|
-
test_execution.call(test)
|
359
|
-
rescue
|
360
|
-
test.error "Uncaught exception during test: #{$!}", $!.backtrace.join("\n")
|
339
|
+
return if tests_to_run.empty?
|
340
|
+
|
341
|
+
section "Run #{tests_to_run.size} #{title}" do
|
342
|
+
tests_preparation&.call(tests_to_run)
|
343
|
+
for_each_element_in(
|
344
|
+
tests_to_run,
|
345
|
+
parallel: !log_debug? && nbr_threads_max > 1,
|
346
|
+
nbr_threads_max: nbr_threads_max,
|
347
|
+
progress: "Run #{title}"
|
348
|
+
) do |test|
|
349
|
+
test_category =
|
350
|
+
if test.platform.nil? && test.node.nil?
|
351
|
+
'Global'
|
352
|
+
elsif test.node.nil?
|
353
|
+
"Platform #{test.platform.name}"
|
354
|
+
elsif test.platform.nil?
|
355
|
+
"Node #{test.node}"
|
356
|
+
else
|
357
|
+
"Platform #{test.platform.name} / Node #{test.node}"
|
361
358
|
end
|
362
|
-
|
363
|
-
|
364
|
-
|
359
|
+
out "[ #{Time.now.utc.strftime('%F %T')} ] - [ #{test_category} ] - [ #{test.name} ] - Start test..."
|
360
|
+
begin_time = Time.now
|
361
|
+
begin
|
362
|
+
test_execution.call(test)
|
363
|
+
rescue
|
364
|
+
test.error "Uncaught exception during test: #{$ERROR_INFO}", $ERROR_INFO.backtrace.join("\n")
|
365
365
|
end
|
366
|
-
|
366
|
+
end_time = Time.now
|
367
|
+
test.executed
|
368
|
+
out "[ #{Time.now.utc.strftime('%F %T')} ] - [ #{test_category} ] - [ #{test.name} ] - Test finished in #{end_time - begin_time} seconds."
|
367
369
|
end
|
370
|
+
@tests_run.concat(tests_to_run)
|
368
371
|
end
|
369
372
|
end
|
370
373
|
|
@@ -411,21 +414,19 @@ module HybridPlatformsConductor
|
|
411
414
|
# Hash< String, Array< [ String, Hash<Symbol,Object> ] > >
|
412
415
|
@cmds_to_run = {}
|
413
416
|
selected_tests.each do |test|
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
]
|
424
|
-
end
|
425
|
-
rescue
|
426
|
-
test.error "Uncaught exception during test preparation: #{$!}", $!.backtrace.join("\n")
|
427
|
-
test.executed
|
417
|
+
test.test_on_node.each do |cmd, test_info|
|
418
|
+
test_info_normalized = test_info.is_a?(Hash) ? test_info.clone : { validator: test_info }
|
419
|
+
test_info_normalized[:timeout] = DEFAULT_CMD_TIMEOUT unless test_info_normalized.key?(:timeout)
|
420
|
+
test_info_normalized[:test] = test
|
421
|
+
@cmds_to_run[test.node] = [] unless @cmds_to_run.key?(test.node)
|
422
|
+
@cmds_to_run[test.node] << [
|
423
|
+
cmd,
|
424
|
+
test_info_normalized
|
425
|
+
]
|
428
426
|
end
|
427
|
+
rescue
|
428
|
+
test.error "Uncaught exception during test preparation: #{$ERROR_INFO}", $ERROR_INFO.backtrace.join("\n")
|
429
|
+
test.executed
|
429
430
|
end
|
430
431
|
# Compute the timeout that will be applied, from the max timeout sum for every node that has tests to run
|
431
432
|
timeout = CONNECTION_TIMEOUT + (
|
@@ -435,21 +436,18 @@ module HybridPlatformsConductor
|
|
435
436
|
)
|
436
437
|
# Run commands on nodes, in grouped way to avoid too many connections, per node
|
437
438
|
# Hash< String, Array<String> >
|
438
|
-
@test_cmds =
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
}
|
451
|
-
]
|
452
|
-
end]
|
439
|
+
@test_cmds = @cmds_to_run.transform_values do |cmds_list|
|
440
|
+
{
|
441
|
+
remote_bash: cmds_list.map do |(cmd, _test_info)|
|
442
|
+
[
|
443
|
+
"echo '#{CMD_SEPARATOR}'",
|
444
|
+
">&2 echo '#{CMD_SEPARATOR}'",
|
445
|
+
cmd,
|
446
|
+
'echo "$?"'
|
447
|
+
]
|
448
|
+
end.flatten
|
449
|
+
}
|
450
|
+
end
|
453
451
|
section "Run test commands on #{@test_cmds.keys.size} connected nodes (timeout to #{timeout} secs)" do
|
454
452
|
start_time = Time.now
|
455
453
|
@actions_executor.max_threads = @max_threads_connection_on_nodes
|
@@ -469,7 +467,7 @@ module HybridPlatformsConductor
|
|
469
467
|
if exit_status.is_a?(Symbol)
|
470
468
|
test.error "Error while executing tests: #{exit_status}: #{stderr}"
|
471
469
|
else
|
472
|
-
log_debug <<~
|
470
|
+
log_debug <<~EO_LOG
|
473
471
|
----- Commands for #{test.node}:
|
474
472
|
#{@test_cmds[test.node][:remote_bash].join("\n")}
|
475
473
|
----- STDOUT:
|
@@ -477,23 +475,23 @@ module HybridPlatformsConductor
|
|
477
475
|
----- STDERR:
|
478
476
|
#{stderr}
|
479
477
|
-----
|
480
|
-
|
478
|
+
EO_LOG
|
481
479
|
# Skip the first section, as it can contain SSH banners
|
482
|
-
cmd_stdouts = stdout.split("#{CMD_SEPARATOR}\n")[1
|
480
|
+
cmd_stdouts = stdout.split("#{CMD_SEPARATOR}\n")[1..]
|
483
481
|
cmd_stdouts = [] if cmd_stdouts.nil?
|
484
|
-
cmd_stderrs = stderr.split("#{CMD_SEPARATOR}\n")[1
|
482
|
+
cmd_stderrs = stderr.split("#{CMD_SEPARATOR}\n")[1..]
|
485
483
|
cmd_stderrs = [] if cmd_stderrs.nil?
|
486
484
|
@cmds_to_run[test.node].zip(cmd_stdouts, cmd_stderrs).each do |(cmd, test_info), cmd_stdout, cmd_stderr|
|
487
485
|
# Find the section that corresponds to this test
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
486
|
+
next unless test_info[:test] == test
|
487
|
+
|
488
|
+
cmd_stdout = '' if cmd_stdout.nil?
|
489
|
+
cmd_stderr = '' if cmd_stderr.nil?
|
490
|
+
stdout_lines = cmd_stdout.split("\n")
|
491
|
+
# Last line of stdout is the return code
|
492
|
+
return_code = stdout_lines.empty? ? :command_cant_run : Integer(stdout_lines.last)
|
493
|
+
test.error "Command '#{cmd}' returned error code #{return_code}", "----- STDOUT:\n#{stdout_lines[0..-2].join("\n")}\n----- STDERR:\n#{cmd_stderr}" unless return_code.zero?
|
494
|
+
test_info[:validator].call(stdout_lines[0..-2], cmd_stderr.split("\n"), return_code)
|
497
495
|
end
|
498
496
|
end
|
499
497
|
end
|
@@ -522,17 +520,17 @@ module HybridPlatformsConductor
|
|
522
520
|
:test_on_check_node,
|
523
521
|
@nodes.map { |node| { node: node } },
|
524
522
|
tests_preparation: proc do |selected_tests|
|
525
|
-
nodes_to_test = selected_tests.map
|
523
|
+
nodes_to_test = selected_tests.map(&:node).uniq.sort
|
526
524
|
@outputs =
|
527
525
|
if @skip_run
|
528
|
-
|
526
|
+
nodes_to_test.map do |node|
|
529
527
|
run_log_file_name = "#{@config.hybrid_platforms_dir}/run_logs/#{node}.stdout"
|
530
528
|
[
|
531
529
|
node,
|
532
530
|
# TODO: Find a way to also save stderr and the status code
|
533
|
-
[0, File.
|
531
|
+
[0, File.exist?(run_log_file_name) ? File.read(run_log_file_name) : nil, '']
|
534
532
|
]
|
535
|
-
end
|
533
|
+
end.to_h
|
536
534
|
else
|
537
535
|
# Why-run deploy on all nodes
|
538
536
|
@deployer.concurrent_execution = !log_debug?
|
@@ -543,7 +541,7 @@ module HybridPlatformsConductor
|
|
543
541
|
rescue
|
544
542
|
# If an exception occurred, make sure all concerned nodes are reporting the error
|
545
543
|
nodes_to_test.each do |node|
|
546
|
-
error "Error while checking check-node output: #{
|
544
|
+
error "Error while checking check-node output: #{$ERROR_INFO}#{log_debug? ? "\n#{$ERROR_INFO.backtrace.join("\n")}" : ''}", node: node
|
547
545
|
end
|
548
546
|
{}
|
549
547
|
end
|
@@ -556,11 +554,11 @@ module HybridPlatformsConductor
|
|
556
554
|
elsif stdout.is_a?(Symbol)
|
557
555
|
test.error "Check-node run failed: #{stdout}."
|
558
556
|
else
|
559
|
-
test.error "Check-node returned error code #{exit_status}" unless exit_status
|
557
|
+
test.error "Check-node returned error code #{exit_status}" unless exit_status.zero?
|
560
558
|
begin
|
561
559
|
test.test_on_check_node(stdout, stderr, exit_status)
|
562
560
|
rescue
|
563
|
-
test.error "Uncaught exception during test: #{
|
561
|
+
test.error "Uncaught exception during test: #{$ERROR_INFO}", $ERROR_INFO.backtrace.join("\n")
|
564
562
|
end
|
565
563
|
end
|
566
564
|
end
|
@@ -21,7 +21,7 @@ module HybridPlatformsConductor
|
|
21
21
|
# * *thycotic* (Thyctotic): The Thyctotic instance to use.
|
22
22
|
def self.with_thycotic(thycotic_url, logger, logger_stderr, domain: ENV['hpc_domain_for_thycotic'])
|
23
23
|
Credentials.with_credentials_for(:thycotic, logger, logger_stderr, url: thycotic_url) do |thycotic_user, thycotic_password|
|
24
|
-
yield Thycotic.new(thycotic_url, thycotic_user, thycotic_password, logger: logger, logger_stderr: logger_stderr)
|
24
|
+
yield Thycotic.new(thycotic_url, thycotic_user, thycotic_password, domain: domain, logger: logger, logger_stderr: logger_stderr)
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
@@ -39,8 +39,8 @@ module HybridPlatformsConductor
|
|
39
39
|
user,
|
40
40
|
password,
|
41
41
|
domain: ENV['hpc_domain_for_thycotic'],
|
42
|
-
logger: Logger.new(
|
43
|
-
logger_stderr: Logger.new(
|
42
|
+
logger: Logger.new($stdout),
|
43
|
+
logger_stderr: Logger.new($stderr)
|
44
44
|
)
|
45
45
|
init_loggers(logger, logger_stderr)
|
46
46
|
# Get a token to this SOAP API
|
@@ -50,11 +50,14 @@ module HybridPlatformsConductor
|
|
50
50
|
logger: @logger,
|
51
51
|
log: log_debug?
|
52
52
|
)
|
53
|
-
@token = @client.call(
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
53
|
+
@token = @client.call(
|
54
|
+
:authenticate,
|
55
|
+
message: {
|
56
|
+
username: user,
|
57
|
+
password: password,
|
58
|
+
domain: domain
|
59
|
+
}
|
60
|
+
).to_hash.dig(:authenticate_response, :authenticate_result, :token)
|
58
61
|
raise "Unable to get token from SOAP authentication to #{url}" if @token.nil?
|
59
62
|
end
|
60
63
|
|
@@ -65,13 +68,16 @@ module HybridPlatformsConductor
|
|
65
68
|
# Result::
|
66
69
|
# * Hash: The corresponding API result
|
67
70
|
def get_secret(secret_id)
|
68
|
-
@client.call(
|
69
|
-
|
70
|
-
|
71
|
-
|
71
|
+
@client.call(
|
72
|
+
:get_secret,
|
73
|
+
message: {
|
74
|
+
token: @token,
|
75
|
+
secretId: secret_id
|
76
|
+
}
|
77
|
+
).to_hash.dig(:get_secret_response, :get_secret_result)
|
72
78
|
end
|
73
79
|
|
74
|
-
# Get a file attached to a given secret
|
80
|
+
# Get a file attached to a given secret
|
75
81
|
#
|
76
82
|
# Parameters::
|
77
83
|
# * *secret_id* (Object): The secret ID
|
@@ -79,12 +85,15 @@ module HybridPlatformsConductor
|
|
79
85
|
# Result::
|
80
86
|
# * String or nil: The file content, or nil if none
|
81
87
|
def download_file_attachment_by_item_id(secret_id, secret_item_id)
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
+
encoded_file = @client.call(
|
89
|
+
:download_file_attachment_by_item_id,
|
90
|
+
message: {
|
91
|
+
token: @token,
|
92
|
+
secretId: secret_id,
|
93
|
+
secretItemId: secret_item_id
|
94
|
+
}
|
95
|
+
).to_hash.dig(:download_file_attachment_by_item_id_response, :download_file_attachment_by_item_id_result, :file_attachment)
|
96
|
+
encoded_file.nil? ? nil : Base64.decode64(encoded_file)
|
88
97
|
end
|
89
98
|
|
90
99
|
end
|