hybrid_platforms_conductor 32.3.6
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.
- checksums.yaml +7 -0
- data/bin/check-node +24 -0
- data/bin/deploy +12 -0
- data/bin/dump_nodes_json +12 -0
- data/bin/free_ips +23 -0
- data/bin/free_veids +17 -0
- data/bin/get_impacted_nodes +43 -0
- data/bin/last_deploys +56 -0
- data/bin/nodes_to_deploy +104 -0
- data/bin/report +10 -0
- data/bin/run +39 -0
- data/bin/setup +11 -0
- data/bin/ssh_config +14 -0
- data/bin/test +13 -0
- data/bin/topograph +54 -0
- data/lib/hybrid_platforms_conductor/action.rb +82 -0
- data/lib/hybrid_platforms_conductor/actions_executor.rb +307 -0
- data/lib/hybrid_platforms_conductor/bitbucket.rb +123 -0
- data/lib/hybrid_platforms_conductor/cmd_runner.rb +188 -0
- data/lib/hybrid_platforms_conductor/cmdb.rb +34 -0
- data/lib/hybrid_platforms_conductor/common_config_dsl/bitbucket.rb +78 -0
- data/lib/hybrid_platforms_conductor/common_config_dsl/confluence.rb +43 -0
- data/lib/hybrid_platforms_conductor/common_config_dsl/file_system_tests.rb +110 -0
- data/lib/hybrid_platforms_conductor/common_config_dsl/idempotence_tests.rb +38 -0
- data/lib/hybrid_platforms_conductor/config.rb +263 -0
- data/lib/hybrid_platforms_conductor/confluence.rb +119 -0
- data/lib/hybrid_platforms_conductor/connector.rb +84 -0
- data/lib/hybrid_platforms_conductor/credentials.rb +127 -0
- data/lib/hybrid_platforms_conductor/current_dir_monitor.rb +42 -0
- data/lib/hybrid_platforms_conductor/deployer.rb +598 -0
- data/lib/hybrid_platforms_conductor/executable.rb +145 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/action/bash.rb +44 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/action/interactive.rb +44 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/action/my_action.rb.sample +79 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/action/remote_bash.rb +63 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/action/ruby.rb +69 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/action/scp.rb +61 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/config.rb +78 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/host_ip.rb +104 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/host_keys.rb +114 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/my_cmdb.rb.sample +129 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/platform_handlers.rb +66 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/connector/my_connector.rb.sample +156 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/connector/ssh.rb +702 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/platform_handler_plugin.rb.sample +292 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/docker.rb +148 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/my_provisioner.rb.sample +103 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/podman.rb +125 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/proxmox.rb +522 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/proxmox/proxmox_waiter.rb +707 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/proxmox/reserve_proxmox_container +122 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/report/confluence.rb +69 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/report/mediawiki.rb +164 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/report/my_report_plugin.rb.sample +88 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/report/stdout.rb +61 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/report/templates/confluence_inventory.html.erb +33 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/bitbucket_conf.rb +137 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/can_be_checked.rb +21 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/check_deploy_and_idempotence.rb +112 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/check_from_scratch.rb +35 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/connection.rb +28 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/deploy_freshness.rb +44 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/deploy_from_scratch.rb +36 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/deploy_removes_root_access.rb +49 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/divergence.rb +25 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/executables.rb +46 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/file_system.rb +45 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/file_system_hdfs.rb +45 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/hostname.rb +25 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/idempotence.rb +77 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/ip.rb +38 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/jenkins_ci_conf.rb +56 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/jenkins_ci_masters_ok.rb +54 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/linear_strategy.rb +47 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/local_users.rb +82 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/mounts.rb +120 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/my_test_plugin.rb.sample +143 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/orphan_files.rb +74 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/ports.rb +85 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/private_ips.rb +38 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/public_ips.rb +38 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/spectre-meltdown-checker.sh +1930 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/spectre.rb +56 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/veids.rb +31 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/vulnerabilities.rb +159 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test_report/confluence.rb +122 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test_report/my_test_report.rb.sample +48 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test_report/stdout.rb +120 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test_report/templates/_confluence_errors_status.html.erb +46 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test_report/templates/_confluence_gauge.html.erb +49 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/test_report/templates/confluence.html.erb +242 -0
- data/lib/hybrid_platforms_conductor/io_router.rb +70 -0
- data/lib/hybrid_platforms_conductor/json_dumper.rb +88 -0
- data/lib/hybrid_platforms_conductor/logger_helpers.rb +319 -0
- data/lib/hybrid_platforms_conductor/mutex_dir +76 -0
- data/lib/hybrid_platforms_conductor/nodes_handler.rb +597 -0
- data/lib/hybrid_platforms_conductor/parallel_threads.rb +97 -0
- data/lib/hybrid_platforms_conductor/platform_handler.rb +188 -0
- data/lib/hybrid_platforms_conductor/platforms_handler.rb +118 -0
- data/lib/hybrid_platforms_conductor/plugin.rb +53 -0
- data/lib/hybrid_platforms_conductor/plugins.rb +101 -0
- data/lib/hybrid_platforms_conductor/provisioner.rb +181 -0
- data/lib/hybrid_platforms_conductor/report.rb +31 -0
- data/lib/hybrid_platforms_conductor/reports_handler.rb +84 -0
- data/lib/hybrid_platforms_conductor/services_handler.rb +274 -0
- data/lib/hybrid_platforms_conductor/test.rb +141 -0
- data/lib/hybrid_platforms_conductor/test_by_service.rb +22 -0
- data/lib/hybrid_platforms_conductor/test_report.rb +282 -0
- data/lib/hybrid_platforms_conductor/tests_runner.rb +590 -0
- data/lib/hybrid_platforms_conductor/thycotic.rb +92 -0
- data/lib/hybrid_platforms_conductor/topographer.rb +859 -0
- data/lib/hybrid_platforms_conductor/topographer/plugin.rb +20 -0
- data/lib/hybrid_platforms_conductor/topographer/plugins/graphviz.rb +127 -0
- data/lib/hybrid_platforms_conductor/topographer/plugins/json.rb +72 -0
- data/lib/hybrid_platforms_conductor/topographer/plugins/my_topographer_output_plugin.rb.sample +37 -0
- data/lib/hybrid_platforms_conductor/topographer/plugins/svg.rb +30 -0
- data/lib/hybrid_platforms_conductor/version.rb +5 -0
- data/spec/hybrid_platforms_conductor_test.rb +159 -0
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/bash_spec.rb +43 -0
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/interactive_spec.rb +18 -0
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/remote_bash_spec.rb +102 -0
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/ruby_spec.rb +108 -0
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/scp_spec.rb +79 -0
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions_spec.rb +199 -0
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/connection_spec.rb +212 -0
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/cli_options_spec.rb +125 -0
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/config_dsl_spec.rb +50 -0
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/connectable_nodes_spec.rb +28 -0
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/connections_spec.rb +448 -0
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/global_helpers_spec.rb +313 -0
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/node_helpers_spec.rb +32 -0
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/remote_actions_spec.rb +134 -0
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/logging_spec.rb +256 -0
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/parallel_spec.rb +338 -0
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/timeout_spec.rb +101 -0
- data/spec/hybrid_platforms_conductor_test/api/cmd_runner_spec.rb +165 -0
- data/spec/hybrid_platforms_conductor_test/api/config_spec.rb +238 -0
- data/spec/hybrid_platforms_conductor_test/api/deployer/check_spec.rb +9 -0
- data/spec/hybrid_platforms_conductor_test/api/deployer/deploy_spec.rb +243 -0
- data/spec/hybrid_platforms_conductor_test/api/deployer/parse_deploy_output_spec.rb +104 -0
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioner_spec.rb +131 -0
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/docker/Dockerfile +10 -0
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/docker_spec.rb +123 -0
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/podman_spec.rb +211 -0
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/config_dsl_spec.rb +126 -0
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/create_spec.rb +290 -0
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/destroy_spec.rb +43 -0
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/ip_spec.rb +60 -0
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/proxmox.json +3 -0
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/destroy_vm_spec.rb +82 -0
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/expired_containers_spec.rb +786 -0
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/ips_assignment_spec.rb +112 -0
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/other_lxc_containers_resources_spec.rb +190 -0
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/pve_node_resources_spec.rb +200 -0
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/retries_spec.rb +35 -0
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/vm_ids_assignment_spec.rb +67 -0
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/start_spec.rb +79 -0
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/state_spec.rb +28 -0
- data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/stop_spec.rb +41 -0
- data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/config_spec.rb +33 -0
- data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/host_ip_spec.rb +64 -0
- data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/host_keys_spec.rb +133 -0
- data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/platform_handlers_spec.rb +19 -0
- data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs_plugins_api_spec.rb +446 -0
- data/spec/hybrid_platforms_conductor_test/api/nodes_handler/common_spec.rb +127 -0
- data/spec/hybrid_platforms_conductor_test/api/nodes_handler/git_diff_impacts_spec.rb +318 -0
- data/spec/hybrid_platforms_conductor_test/api/nodes_handler/nodes_selectors_spec.rb +132 -0
- data/spec/hybrid_platforms_conductor_test/api/nodes_handler/platform_handlers_plugins_api_spec.rb +60 -0
- data/spec/hybrid_platforms_conductor_test/api/nodes_handler/several_platforms_spec.rb +58 -0
- data/spec/hybrid_platforms_conductor_test/api/platform_handler_spec.rb +97 -0
- data/spec/hybrid_platforms_conductor_test/api/platforms_handler_spec.rb +104 -0
- data/spec/hybrid_platforms_conductor_test/api/plugins_spec.rb +243 -0
- data/spec/hybrid_platforms_conductor_test/api/reports_handler_spec.rb +44 -0
- data/spec/hybrid_platforms_conductor_test/api/services_handler/actions_to_deploy_spec.rb +121 -0
- data/spec/hybrid_platforms_conductor_test/api/services_handler/deploy_allowed_spec.rb +142 -0
- data/spec/hybrid_platforms_conductor_test/api/services_handler/log_info_spec.rb +101 -0
- data/spec/hybrid_platforms_conductor_test/api/services_handler/package_spec.rb +388 -0
- data/spec/hybrid_platforms_conductor_test/api/services_handler/parse_deploy_output_spec.rb +274 -0
- data/spec/hybrid_platforms_conductor_test/api/services_handler/prepare_for_deploy_spec.rb +264 -0
- data/spec/hybrid_platforms_conductor_test/api/tests_runner/common_spec.rb +194 -0
- data/spec/hybrid_platforms_conductor_test/api/tests_runner/global_spec.rb +37 -0
- data/spec/hybrid_platforms_conductor_test/api/tests_runner/node_check_spec.rb +194 -0
- data/spec/hybrid_platforms_conductor_test/api/tests_runner/node_spec.rb +137 -0
- data/spec/hybrid_platforms_conductor_test/api/tests_runner/node_ssh_spec.rb +257 -0
- data/spec/hybrid_platforms_conductor_test/api/tests_runner/platform_spec.rb +110 -0
- data/spec/hybrid_platforms_conductor_test/api/tests_runner/reports_spec.rb +367 -0
- data/spec/hybrid_platforms_conductor_test/api/tests_runner/test_plugins/bitbucket_conf_spec.rb +111 -0
- data/spec/hybrid_platforms_conductor_test/api/tests_runner/test_reports_plugins/confluence_spec.rb +29 -0
- data/spec/hybrid_platforms_conductor_test/cmdb_plugins/test_cmdb.rb +166 -0
- data/spec/hybrid_platforms_conductor_test/cmdb_plugins/test_cmdb2.rb +93 -0
- data/spec/hybrid_platforms_conductor_test/cmdb_plugins/test_cmdb_others.rb +60 -0
- data/spec/hybrid_platforms_conductor_test/cmdb_plugins/test_cmdb_others2.rb +58 -0
- data/spec/hybrid_platforms_conductor_test/executables/check-node_spec.rb +35 -0
- data/spec/hybrid_platforms_conductor_test/executables/deploy_spec.rb +35 -0
- data/spec/hybrid_platforms_conductor_test/executables/get_impacted_nodes_spec.rb +158 -0
- data/spec/hybrid_platforms_conductor_test/executables/last_deploys_spec.rb +173 -0
- data/spec/hybrid_platforms_conductor_test/executables/nodes_to_deploy_spec.rb +283 -0
- data/spec/hybrid_platforms_conductor_test/executables/options/actions_executor_spec.rb +28 -0
- data/spec/hybrid_platforms_conductor_test/executables/options/cmd_runner_spec.rb +28 -0
- data/spec/hybrid_platforms_conductor_test/executables/options/common_spec.rb +67 -0
- data/spec/hybrid_platforms_conductor_test/executables/options/deployer_spec.rb +251 -0
- data/spec/hybrid_platforms_conductor_test/executables/options/nodes_handler_spec.rb +111 -0
- data/spec/hybrid_platforms_conductor_test/executables/options/nodes_selectors_spec.rb +71 -0
- data/spec/hybrid_platforms_conductor_test/executables/options/reports_handler_spec.rb +54 -0
- data/spec/hybrid_platforms_conductor_test/executables/options/tests_runner_spec.rb +139 -0
- data/spec/hybrid_platforms_conductor_test/executables/report_spec.rb +60 -0
- data/spec/hybrid_platforms_conductor_test/executables/run_spec.rb +173 -0
- data/spec/hybrid_platforms_conductor_test/executables/ssh_config_spec.rb +35 -0
- data/spec/hybrid_platforms_conductor_test/executables/test_spec.rb +41 -0
- data/spec/hybrid_platforms_conductor_test/helpers/actions_executor_helpers.rb +98 -0
- data/spec/hybrid_platforms_conductor_test/helpers/cmd_runner_helpers.rb +92 -0
- data/spec/hybrid_platforms_conductor_test/helpers/cmdb_helpers.rb +37 -0
- data/spec/hybrid_platforms_conductor_test/helpers/config_helpers.rb +20 -0
- data/spec/hybrid_platforms_conductor_test/helpers/connector_ssh_helpers.rb +130 -0
- data/spec/hybrid_platforms_conductor_test/helpers/deployer_helpers.rb +149 -0
- data/spec/hybrid_platforms_conductor_test/helpers/deployer_test_helpers.rb +812 -0
- data/spec/hybrid_platforms_conductor_test/helpers/executables_helpers.rb +96 -0
- data/spec/hybrid_platforms_conductor_test/helpers/nodes_handler_helpers.rb +20 -0
- data/spec/hybrid_platforms_conductor_test/helpers/platform_handler_helpers.rb +35 -0
- data/spec/hybrid_platforms_conductor_test/helpers/platforms_handler_helpers.rb +127 -0
- data/spec/hybrid_platforms_conductor_test/helpers/plugins_helpers.rb +48 -0
- data/spec/hybrid_platforms_conductor_test/helpers/provisioner_proxmox_helpers.rb +789 -0
- data/spec/hybrid_platforms_conductor_test/helpers/reports_handler_helpers.rb +29 -0
- data/spec/hybrid_platforms_conductor_test/helpers/services_handler_helpers.rb +20 -0
- data/spec/hybrid_platforms_conductor_test/helpers/tests_runner_helpers.rb +38 -0
- data/spec/hybrid_platforms_conductor_test/mocked_lib/my_test_gem/hpc_plugins/test_plugin_type/test_plugin_id1.rb +22 -0
- data/spec/hybrid_platforms_conductor_test/mocked_lib/my_test_gem/hpc_plugins/test_plugin_type/test_plugin_id2.rb +22 -0
- data/spec/hybrid_platforms_conductor_test/mocked_lib/my_test_gem2/sub_dir/hpc_plugins/test_plugin_type/test_plugin_id3.rb +26 -0
- data/spec/hybrid_platforms_conductor_test/mocked_lib/my_test_gem2/sub_dir/hpc_plugins/test_plugin_type2/test_plugin_id4.rb +26 -0
- data/spec/hybrid_platforms_conductor_test/platform_handler_plugins/test.rb +225 -0
- data/spec/hybrid_platforms_conductor_test/platform_handler_plugins/test2.rb +11 -0
- data/spec/hybrid_platforms_conductor_test/report_plugin.rb +35 -0
- data/spec/hybrid_platforms_conductor_test/test_action.rb +66 -0
- data/spec/hybrid_platforms_conductor_test/test_connector.rb +151 -0
- data/spec/hybrid_platforms_conductor_test/test_plugins/global.rb +30 -0
- data/spec/hybrid_platforms_conductor_test/test_plugins/node.rb +53 -0
- data/spec/hybrid_platforms_conductor_test/test_plugins/node_check.rb +47 -0
- data/spec/hybrid_platforms_conductor_test/test_plugins/node_ssh.rb +42 -0
- data/spec/hybrid_platforms_conductor_test/test_plugins/platform.rb +50 -0
- data/spec/hybrid_platforms_conductor_test/test_plugins/several_checks.rb +50 -0
- data/spec/hybrid_platforms_conductor_test/test_provisioner.rb +95 -0
- data/spec/hybrid_platforms_conductor_test/tests_report_plugin.rb +49 -0
- data/spec/spec_helper.rb +111 -0
- metadata +566 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
require 'thread'
|
|
2
|
+
|
|
3
|
+
module HybridPlatformsConductor
|
|
4
|
+
|
|
5
|
+
# Provide utilities to handle parallel threads
|
|
6
|
+
module ParallelThreads
|
|
7
|
+
|
|
8
|
+
# Iterate over a list of objects.
|
|
9
|
+
# Provide a mechanism to multithread this iteration (in such case the iterating code has to be thread-safe).
|
|
10
|
+
# In case of multithreaded run, a progress bar is being displayed.
|
|
11
|
+
#
|
|
12
|
+
# Parameters::
|
|
13
|
+
# * *list* (Array<Object>): List of objects to iterate over
|
|
14
|
+
# * *parallel* (Boolean): Iterate in a multithreaded way? [default: false]
|
|
15
|
+
# * *nbr_threads_max* (Integer or nil): Maximum number of threads to be used in case of parallel, or nil for no limit [default: nil]
|
|
16
|
+
# * *progress* (String or nil): Name of a progress bar to follow the progression, or nil for no progress bar [default: 'Progress']
|
|
17
|
+
# * Proc: The code called for each node being iterated on.
|
|
18
|
+
# * Parameters::
|
|
19
|
+
# * *element* (Object): The object
|
|
20
|
+
def for_each_element_in(list, parallel: false, nbr_threads_max: nil, progress: 'Process')
|
|
21
|
+
if parallel
|
|
22
|
+
# Threads to wait for
|
|
23
|
+
threads_to_join = []
|
|
24
|
+
# Spread elements evenly among the threads.
|
|
25
|
+
# Use a shared pool of elements to be handled by threads.
|
|
26
|
+
pools = {
|
|
27
|
+
to_process: list.dup,
|
|
28
|
+
processing: [],
|
|
29
|
+
processed: []
|
|
30
|
+
}
|
|
31
|
+
nbr_total = list.size
|
|
32
|
+
# Protect access to the pools using a mutex
|
|
33
|
+
pools_semaphore = Mutex.new
|
|
34
|
+
# Spawn the threads, each one responsible for handling its list
|
|
35
|
+
(nbr_threads_max.nil? || nbr_threads_max > nbr_total ? nbr_total : nbr_threads_max).times do
|
|
36
|
+
threads_to_join << Thread.new do
|
|
37
|
+
# As exceptions are logged anyway whatever the Thread setting is, only turn it on for debug.
|
|
38
|
+
# That will keep tests execution cleaner.
|
|
39
|
+
Thread.current.report_on_exception = log_debug?
|
|
40
|
+
begin
|
|
41
|
+
loop do
|
|
42
|
+
# Modify the list while processing it, so that reporting can be done.
|
|
43
|
+
element = nil
|
|
44
|
+
pools_semaphore.synchronize do
|
|
45
|
+
element = pools[:to_process].shift
|
|
46
|
+
pools[:processing] << element unless element.nil?
|
|
47
|
+
end
|
|
48
|
+
break if element.nil?
|
|
49
|
+
begin
|
|
50
|
+
yield element
|
|
51
|
+
ensure
|
|
52
|
+
pools_semaphore.synchronize do
|
|
53
|
+
pools[:processing].delete(element)
|
|
54
|
+
pools[:processed] << element
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
rescue
|
|
59
|
+
log_error "Unhandled exception occurred in thread #{Thread.current.object_id}: #{$!}\n#{$!.backtrace.join("\n")}"
|
|
60
|
+
raise
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
if progress
|
|
65
|
+
# Here the main thread just reports progression
|
|
66
|
+
nbr_to_process = nil
|
|
67
|
+
nbr_processing = nil
|
|
68
|
+
nbr_processed = nil
|
|
69
|
+
with_progress_bar(nbr_total, name: progress) do |progress_bar|
|
|
70
|
+
loop do
|
|
71
|
+
pools_semaphore.synchronize do
|
|
72
|
+
nbr_to_process = pools[:to_process].size
|
|
73
|
+
nbr_processing = pools[:processing].size
|
|
74
|
+
nbr_processed = pools[:processed].size
|
|
75
|
+
end
|
|
76
|
+
progress_bar.title = "Queue: #{nbr_to_process} - Processing: #{nbr_processing} - Done: #{nbr_processed} - Total: #{nbr_total}"
|
|
77
|
+
progress_bar.progress = nbr_processed
|
|
78
|
+
break if nbr_processed == nbr_total
|
|
79
|
+
sleep 0.5
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
# Wait for threads to be joined
|
|
84
|
+
threads_to_join.each do |thread|
|
|
85
|
+
thread.join
|
|
86
|
+
end
|
|
87
|
+
else
|
|
88
|
+
# Execute synchronously
|
|
89
|
+
list.each do |element|
|
|
90
|
+
yield element
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
end
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
require 'json'
|
|
2
|
+
require 'hybrid_platforms_conductor/plugin'
|
|
3
|
+
|
|
4
|
+
module HybridPlatformsConductor
|
|
5
|
+
|
|
6
|
+
# Common ancestor to any platform handler
|
|
7
|
+
class PlatformHandler < Plugin
|
|
8
|
+
|
|
9
|
+
# Make it so that we can sort lists of platforms
|
|
10
|
+
include Comparable
|
|
11
|
+
|
|
12
|
+
# Callback called when a subclass inherits this class.
|
|
13
|
+
#
|
|
14
|
+
# Parameters::
|
|
15
|
+
# * *subclass* (Class): The inheriting class
|
|
16
|
+
def self.inherited(subclass)
|
|
17
|
+
# Make sure we define automatically a helper for such a platform
|
|
18
|
+
mixin = Module.new
|
|
19
|
+
platform_type = subclass.name.split('::').last.gsub(/([a-z\d])([A-Z])/, '\1_\2').downcase.to_sym
|
|
20
|
+
mixin.define_method("#{platform_type}_platform".to_sym) do |path: nil, git: nil, branch: 'master', &platform_config_code|
|
|
21
|
+
repository_path =
|
|
22
|
+
if !path.nil?
|
|
23
|
+
path
|
|
24
|
+
elsif !git.nil?
|
|
25
|
+
# Clone in a local repository
|
|
26
|
+
local_repository_path = "#{@git_platforms_dir}/#{File.basename(git)[0..-File.extname(git).size - 1]}"
|
|
27
|
+
unless File.exist?(local_repository_path)
|
|
28
|
+
branch = "refs/heads/#{branch}" unless branch.include?('/')
|
|
29
|
+
local_ref = "refs/remotes/origin/#{branch.split('/').last}"
|
|
30
|
+
section "Cloning #{git} (#{branch} => #{local_ref}) into #{local_repository_path}" do
|
|
31
|
+
git_repo = Git.init(local_repository_path, )
|
|
32
|
+
git_repo.add_remote('origin', git).fetch(ref: "#{branch}:#{local_ref}")
|
|
33
|
+
git_repo.checkout local_ref
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
local_repository_path
|
|
37
|
+
else
|
|
38
|
+
raise 'The platform has to be defined with either a path or a git URL'
|
|
39
|
+
end
|
|
40
|
+
@platform_dirs[platform_type] = [] unless @platform_dirs.key?(platform_type)
|
|
41
|
+
@platform_dirs[platform_type] << repository_path
|
|
42
|
+
platform_config_code.call(repository_path) unless platform_config_code.nil?
|
|
43
|
+
end
|
|
44
|
+
# Register this new mixin in the Config DSL
|
|
45
|
+
extend_config_dsl_with(mixin)
|
|
46
|
+
super
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Repository path
|
|
50
|
+
# String
|
|
51
|
+
attr_reader :repository_path
|
|
52
|
+
|
|
53
|
+
# Platform type
|
|
54
|
+
# Symbol
|
|
55
|
+
attr_reader :platform_type
|
|
56
|
+
|
|
57
|
+
# Before deploying, need to set some components in case the plugins need them
|
|
58
|
+
attr_accessor :nodes_handler, :actions_executor
|
|
59
|
+
|
|
60
|
+
# Constructor
|
|
61
|
+
#
|
|
62
|
+
# Parameters::
|
|
63
|
+
# * *platform_type* (Symbol): Platform type
|
|
64
|
+
# * *repository_path* (String): Repository path
|
|
65
|
+
# * *logger* (Logger): Logger to be used [default: Logger.new(STDOUT)]
|
|
66
|
+
# * *logger_stderr* (Logger): Logger to be used for stderr [default: Logger.new(STDERR)]
|
|
67
|
+
# * *config* (Config): Config to be used. [default: Config.new]
|
|
68
|
+
# * *cmd_runner* (CmdRunner): Command executor to be used. [default: CmdRunner.new]
|
|
69
|
+
def initialize(
|
|
70
|
+
platform_type,
|
|
71
|
+
repository_path,
|
|
72
|
+
logger: Logger.new(STDOUT),
|
|
73
|
+
logger_stderr: Logger.new(STDERR),
|
|
74
|
+
config: Config.new,
|
|
75
|
+
cmd_runner: CmdRunner.new
|
|
76
|
+
)
|
|
77
|
+
super(logger: logger, logger_stderr: logger_stderr, config: config)
|
|
78
|
+
@platform_type = platform_type
|
|
79
|
+
@repository_path = repository_path
|
|
80
|
+
@cmd_runner = cmd_runner
|
|
81
|
+
self.init if self.respond_to?(:init)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Return the name of the platform
|
|
85
|
+
#
|
|
86
|
+
# Result::
|
|
87
|
+
# * String: Name of the platform
|
|
88
|
+
def name
|
|
89
|
+
info[:repo_name]
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# Get the list of impacted nodes and services from a files diff.
|
|
93
|
+
# [API] - This is the default implementation, and is meant to be overriden by Platform Handlers.
|
|
94
|
+
#
|
|
95
|
+
# Parameters::
|
|
96
|
+
# * *files_diffs* (Hash< String, Hash< Symbol, Object > >): List of diffs info, per file name having a diff. Diffs info have the following properties:
|
|
97
|
+
# * *moved_to* (String): The new file path, in case it has been moved [optional]
|
|
98
|
+
# * *diff* (String): The diff content
|
|
99
|
+
# Result::
|
|
100
|
+
# * Array<String>: The list of nodes impacted by this diff
|
|
101
|
+
# * Array<String>: The list of services impacted by this diff
|
|
102
|
+
# * Boolean: Are there some files that have a global impact (meaning all nodes are potentially impacted by this diff)?
|
|
103
|
+
def impacts_from(files_diffs)
|
|
104
|
+
# By default, consider all nodes of the platform are impacted by whatever diff.
|
|
105
|
+
[
|
|
106
|
+
[],
|
|
107
|
+
[],
|
|
108
|
+
true
|
|
109
|
+
]
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Get some information from this platform.
|
|
113
|
+
# This information identifies the code level that is currently checked out.
|
|
114
|
+
#
|
|
115
|
+
# Result::
|
|
116
|
+
# * Hash<Symbol,Object>: Description of this platform:
|
|
117
|
+
# * *repo_name* (String): The repository name
|
|
118
|
+
# * *commit* (Hash<Symbol,Object>): Information on the checked out Git commit
|
|
119
|
+
# * *id* (String): Commit ID
|
|
120
|
+
# * *ref* (String): Associated reference
|
|
121
|
+
# * *message* (String): Associated message
|
|
122
|
+
# * *date* (Time): Commit date in UTC
|
|
123
|
+
# * *author* (Hash<Symbol,Object>): Information on the author:
|
|
124
|
+
# * *name* (String): Name of the commit author
|
|
125
|
+
# * *email* (String): Email of the commit author
|
|
126
|
+
# * *status* (Hash<Symbol,Object>): Information on the checked out Git status
|
|
127
|
+
# * *changed_files* (Array<String>): List of changed files
|
|
128
|
+
# * *added_files* (Array<String>): List of added files
|
|
129
|
+
# * *deleted_files* (Array<String>): List of deleted files
|
|
130
|
+
# * *untracked_files* (Array<String>): List of untracked files
|
|
131
|
+
def info
|
|
132
|
+
# Keep info in a memory cache, so that we don't query git for nothing
|
|
133
|
+
unless defined?(@info)
|
|
134
|
+
git = nil
|
|
135
|
+
begin
|
|
136
|
+
git = Git.open(@repository_path)
|
|
137
|
+
rescue
|
|
138
|
+
log_debug "Platform #{@repository_path} is not a git repository"
|
|
139
|
+
end
|
|
140
|
+
@info =
|
|
141
|
+
if git
|
|
142
|
+
git_status = git.status
|
|
143
|
+
git_commit = git.log.first
|
|
144
|
+
{
|
|
145
|
+
repo_name: File.basename(git.remotes.first.url).gsub(/\.git$/, ''),
|
|
146
|
+
commit: {
|
|
147
|
+
id: git_commit.sha,
|
|
148
|
+
ref: git_commit.name,
|
|
149
|
+
message: git_commit.message,
|
|
150
|
+
date: git_commit.date.utc,
|
|
151
|
+
author: {
|
|
152
|
+
name: git_commit.author.name,
|
|
153
|
+
email: git_commit.author.email
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
status: {
|
|
157
|
+
changed_files: git_status.changed.keys,
|
|
158
|
+
added_files: git_status.added.keys,
|
|
159
|
+
deleted_files: git_status.deleted.keys,
|
|
160
|
+
untracked_files: git_status.untracked.keys
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
else
|
|
164
|
+
{
|
|
165
|
+
repo_name: File.basename(@repository_path)
|
|
166
|
+
}
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
@info
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
# Order relation
|
|
173
|
+
#
|
|
174
|
+
# Parameters::
|
|
175
|
+
# * *other* (Object): Other object to compare to
|
|
176
|
+
# Result::
|
|
177
|
+
# * Integer: -1, 0, or +1 depending on whether the receiver is less than, equal to, or greater than the other object
|
|
178
|
+
def <=>(other)
|
|
179
|
+
if other.is_a?(PlatformHandler)
|
|
180
|
+
name <=> other.name
|
|
181
|
+
else
|
|
182
|
+
super
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
end
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
require 'hybrid_platforms_conductor/logger_helpers'
|
|
2
|
+
require 'hybrid_platforms_conductor/platform_handler'
|
|
3
|
+
|
|
4
|
+
module HybridPlatformsConductor
|
|
5
|
+
|
|
6
|
+
# Provide an API to access information given by Platform Handlers
|
|
7
|
+
class PlatformsHandler
|
|
8
|
+
|
|
9
|
+
module ConfigDSLExtension
|
|
10
|
+
|
|
11
|
+
# List of platforms repository directories, per platform type
|
|
12
|
+
# Hash<Symbol, Array<String> >
|
|
13
|
+
attr_reader :platform_dirs
|
|
14
|
+
|
|
15
|
+
# Mixin initializer
|
|
16
|
+
def init_platforms_handler
|
|
17
|
+
@platform_dirs = {}
|
|
18
|
+
# Directory in which platforms are cloned
|
|
19
|
+
@git_platforms_dir = "#{@hybrid_platforms_dir}/cloned_platforms"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
23
|
+
Config.extend_config_dsl_with ConfigDSLExtension, :init_platforms_handler
|
|
24
|
+
|
|
25
|
+
include LoggerHelpers
|
|
26
|
+
|
|
27
|
+
# Constructor
|
|
28
|
+
#
|
|
29
|
+
# Parameters::
|
|
30
|
+
# * *logger* (Logger): Logger to be used [default: Logger.new(STDOUT)]
|
|
31
|
+
# * *logger_stderr* (Logger): Logger to be used for stderr [default: Logger.new(STDERR)]
|
|
32
|
+
# * *config* (Config): Config to be used. [default: Config.new]
|
|
33
|
+
# * *cmd_runner* (CmdRunner): Command executor to be used. [default: CmdRunner.new]
|
|
34
|
+
def initialize(
|
|
35
|
+
logger: Logger.new(STDOUT),
|
|
36
|
+
logger_stderr: Logger.new(STDERR),
|
|
37
|
+
config: Config.new,
|
|
38
|
+
cmd_runner: CmdRunner.new
|
|
39
|
+
)
|
|
40
|
+
init_loggers(logger, logger_stderr)
|
|
41
|
+
@config = config
|
|
42
|
+
@cmd_runner = cmd_runner
|
|
43
|
+
@platform_types = Plugins.new(:platform_handler, logger: @logger, logger_stderr: @logger_stderr)
|
|
44
|
+
# Keep a list of instantiated platform handlers per platform type
|
|
45
|
+
# Hash<Symbol, Array<PlatformHandler> >
|
|
46
|
+
@platform_handlers = {}
|
|
47
|
+
# Read all platforms from the config
|
|
48
|
+
@config.platform_dirs.each do |platform_type, repositories|
|
|
49
|
+
repositories.each do |repository_path|
|
|
50
|
+
platform_handler = @platform_types[platform_type].new(
|
|
51
|
+
platform_type,
|
|
52
|
+
repository_path,
|
|
53
|
+
logger: @logger,
|
|
54
|
+
logger_stderr: @logger_stderr,
|
|
55
|
+
config: @config,
|
|
56
|
+
cmd_runner: @cmd_runner
|
|
57
|
+
)
|
|
58
|
+
# Check that this platform has unique name
|
|
59
|
+
raise "Platform name #{platform_handler.name} is declared several times." if @platform_handlers.values.flatten.any? { |known_platform| known_platform.name == platform_handler.name }
|
|
60
|
+
@platform_handlers[platform_type] = [] unless @platform_handlers.key?(platform_type)
|
|
61
|
+
@platform_handlers[platform_type] << platform_handler
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# The list of registered platform handler classes, per platform type.
|
|
67
|
+
#
|
|
68
|
+
# Result::
|
|
69
|
+
# * Hash<Symbol,Class>: The list of registered platform handler classes, per platform type.
|
|
70
|
+
def platform_types
|
|
71
|
+
@platform_types.to_hash
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Get the list of known platforms
|
|
75
|
+
#
|
|
76
|
+
# Parameters::
|
|
77
|
+
# * *platform_type* (Symbol or nil): Filter only platforms of a given platform type, or nil for all platforms [default: nil]
|
|
78
|
+
# Result::
|
|
79
|
+
# * Array<PlatformHandler>: List of platform handlers
|
|
80
|
+
def known_platforms(platform_type: nil)
|
|
81
|
+
(platform_type.nil? ? @platform_handlers.keys : [platform_type]).map { |platform_type| (@platform_handlers[platform_type] || []) }.flatten
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Return the platform handler for a given platform name
|
|
85
|
+
#
|
|
86
|
+
# Parameters::
|
|
87
|
+
# * *platform_name* (String): The platform name
|
|
88
|
+
# Result::
|
|
89
|
+
# * PlatformHandler or nil: Corresponding platform handler, or nil if none
|
|
90
|
+
def platform(platform_name)
|
|
91
|
+
@platform_handlers.values.flatten.find { |known_platform| known_platform.name == platform_name }
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# Inject dependencies that can't be set at initialization time.
|
|
95
|
+
# This is due to the fact that a PlatformHandler is a single plugin handling both inventory and services from a single repository.
|
|
96
|
+
# If we split those plugins into an inventory-type plugin and service-type plugin, each part could be initialized without having cyclic dependencies.
|
|
97
|
+
# The inventory-type part does not need NodesHandler nor ActionsExecutor (as it would be used by NodesHandler).
|
|
98
|
+
# The service-type part would use NodesHandler and ActionsExecutor given to its initializer.
|
|
99
|
+
# TODO: Split this plugin type in 2 to avoid this late dependency injection.
|
|
100
|
+
#
|
|
101
|
+
# Parameters::
|
|
102
|
+
# * *nodes_handler* (NodesHandler): Nodes handler to be used. [default: NodesHandler.new]
|
|
103
|
+
# * *actions_executor* (ActionsExecutor): Actions Executor to be used. [default: ActionsExecutor.new]
|
|
104
|
+
def inject_dependencies(
|
|
105
|
+
nodes_handler: NodesHandler.new,
|
|
106
|
+
actions_executor: ActionsExecutor.new
|
|
107
|
+
)
|
|
108
|
+
@nodes_handler = nodes_handler
|
|
109
|
+
@actions_executor = actions_executor
|
|
110
|
+
@platform_handlers.values.flatten.each do |platform|
|
|
111
|
+
platform.nodes_handler = @nodes_handler
|
|
112
|
+
platform.actions_executor = @actions_executor
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
module HybridPlatformsConductor
|
|
2
|
+
|
|
3
|
+
# Base class for all plugins
|
|
4
|
+
class Plugin
|
|
5
|
+
|
|
6
|
+
include LoggerHelpers
|
|
7
|
+
|
|
8
|
+
class << self
|
|
9
|
+
|
|
10
|
+
include LoggerHelpers
|
|
11
|
+
|
|
12
|
+
# Class loggers
|
|
13
|
+
attr_accessor :logger, :logger_stderr
|
|
14
|
+
|
|
15
|
+
# Are dependencies met before using this plugin?
|
|
16
|
+
# This method can be overriden by any plugin
|
|
17
|
+
#
|
|
18
|
+
# Result::
|
|
19
|
+
# * Boolean: Are dependencies met before using this plugin?
|
|
20
|
+
def valid?
|
|
21
|
+
true
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Extend the config DSL used when parsing the hpc_config.rb file with a given Mixin.
|
|
25
|
+
# This can be used by any plugin to add plugin-specific configuration in the hpc_config.rb file.
|
|
26
|
+
#
|
|
27
|
+
# Parameters::
|
|
28
|
+
# * *mixin* (Module): Mixin to add to the Platforms DSL
|
|
29
|
+
# * *init_method* (Symbol or nil): The initializer method of this Mixin, or nil if none [default = nil]
|
|
30
|
+
def extend_config_dsl_with(mixin, init_method = nil)
|
|
31
|
+
Config.extend_config_dsl_with(mixin, init_method)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Constructor
|
|
37
|
+
#
|
|
38
|
+
# Parameters::
|
|
39
|
+
# * *logger* (Logger): Logger to be used [default: Logger.new(STDOUT)]
|
|
40
|
+
# * *logger_stderr* (Logger): Logger to be used for stderr [default: Logger.new(STDERR)]
|
|
41
|
+
# * *config* (Config): Config to be used. [default: Config.new]
|
|
42
|
+
def initialize(
|
|
43
|
+
logger: Logger.new(STDOUT),
|
|
44
|
+
logger_stderr: Logger.new(STDERR),
|
|
45
|
+
config: Config.new
|
|
46
|
+
)
|
|
47
|
+
init_loggers(logger, logger_stderr)
|
|
48
|
+
@config = config
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
end
|