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,122 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# This scripts creates and destroys containers in an atomic way in a Proxmox cluster.
|
|
3
|
+
# It handles:
|
|
4
|
+
# * An intelligent resources allocation algorithm to balance usage among cluster PVE nodes.
|
|
5
|
+
# * A retry mechanism if the resources are fully reserved.
|
|
6
|
+
# * An expiration mechanism that removes expired containers before assigning new ones to protect resources.
|
|
7
|
+
# It guarantees that:
|
|
8
|
+
# * Any IP and VM ID reserved through this script will not be reserved by another concurrent process (unless the container becomes expired).
|
|
9
|
+
# * If creation is granted, creating this container will not exceed resources limits specified in the config.
|
|
10
|
+
# * The returned reserved VM ID and IP are already created.
|
|
11
|
+
|
|
12
|
+
# Usage: ./reserve_proxmox_container [options]
|
|
13
|
+
# -c, --create FILE Create a VM with the configuration stored in a given JSON file
|
|
14
|
+
# -d, --destroy FILE Destroy a VM with the configuration stored in a given JSON file
|
|
15
|
+
# -h, --help Display help and exit
|
|
16
|
+
# -m, --max-retries NBR Set the maximum number of retries to attempt (default: 240)
|
|
17
|
+
# -o, --config FILE Set the path to the file storing configuration (default: ./config.json)
|
|
18
|
+
# -w, --wait-before-retry SECS Set the number of seconds to wait between retries (default: 4)
|
|
19
|
+
|
|
20
|
+
# Result:
|
|
21
|
+
# There can be some logs but the script ends with a line containing '===== JSON =====' followed by parseable JSON.
|
|
22
|
+
# Resulting JSON has the following structure in case of success:
|
|
23
|
+
# * *pve_node* (String): Name of the pve node on which the creation has been reserved
|
|
24
|
+
# * *vm_id* (Integer): VM ID reserved
|
|
25
|
+
# * *vm_ip* (String): VM IP reserved
|
|
26
|
+
# Resulting JSON has the following structure in case of error:
|
|
27
|
+
# * *error* (String): The error message
|
|
28
|
+
|
|
29
|
+
# Uses:
|
|
30
|
+
# * A config file (given through --config option) that describes the available resources as JSON.
|
|
31
|
+
# Check ProxmoxWaiter#initialize signature for the structure's description of this file.
|
|
32
|
+
# * The environment variables:
|
|
33
|
+
# * *hpc_user_for_proxmox*: User to be used to query Proxmox API
|
|
34
|
+
# * *hpc_password_for_proxmox*: Password to be used to query Proxmox API
|
|
35
|
+
# * *hpc_realm_for_proxmox*: Realm used to connect to the Proxmox API [default = 'pam']
|
|
36
|
+
|
|
37
|
+
require 'json'
|
|
38
|
+
|
|
39
|
+
reserved_resource = nil
|
|
40
|
+
|
|
41
|
+
begin
|
|
42
|
+
|
|
43
|
+
# As this script is meant to be run in an SSH session, make sure we automatically flush stdout/stderr.
|
|
44
|
+
# Otherwise it will wait for the script completion before dumping everything, which is annoying as we want to track when it waits for hours.
|
|
45
|
+
$stdout.sync = true
|
|
46
|
+
$stderr.sync = true
|
|
47
|
+
|
|
48
|
+
require 'optparse'
|
|
49
|
+
require 'time'
|
|
50
|
+
require 'tmpdir'
|
|
51
|
+
require "#{__dir__}/proxmox_waiter"
|
|
52
|
+
|
|
53
|
+
# Define here default values
|
|
54
|
+
create_info = nil
|
|
55
|
+
destroy_info = nil
|
|
56
|
+
wait_time_before_retry_secs = 60
|
|
57
|
+
# Don't hesitate to retry for a few hours, as resources are taken by tests that can run for a few hours sometimes.
|
|
58
|
+
max_retries = 240
|
|
59
|
+
config_file = "#{__dir__}/config.json"
|
|
60
|
+
|
|
61
|
+
OptionParser.new do |opts|
|
|
62
|
+
opts.banner = "Usage: #{$0} [options]"
|
|
63
|
+
opts.on('-c', '--create FILE', 'Create a VM with the configuration stored in a given JSON file') do |file|
|
|
64
|
+
create_info = JSON.parse(File.read(file))
|
|
65
|
+
end
|
|
66
|
+
opts.on('-d', '--destroy FILE', 'Destroy a VM with the configuration stored in a given JSON file') do |file|
|
|
67
|
+
destroy_info = JSON.parse(File.read(file))
|
|
68
|
+
end
|
|
69
|
+
opts.on('-h', '--help', 'Display help and exit') do
|
|
70
|
+
puts opts
|
|
71
|
+
exit 0
|
|
72
|
+
end
|
|
73
|
+
opts.on('-m', '--max-retries NBR', "Set the maximum number of retries to attempt (default: #{max_retries})") do |nbr|
|
|
74
|
+
max_retries = Integer(nbr)
|
|
75
|
+
end
|
|
76
|
+
opts.on('-o', '--config FILE', "Set the path to the file storing configuration (default: #{config_file})") do |file|
|
|
77
|
+
config_file = file
|
|
78
|
+
end
|
|
79
|
+
opts.on('-w', '--wait-before-retry SECS', "Set the number of seconds to wait between retries (default: #{wait_time_before_retry_secs})") do |secs|
|
|
80
|
+
wait_time_before_retry_secs = Integer(secs)
|
|
81
|
+
end
|
|
82
|
+
end.parse!
|
|
83
|
+
|
|
84
|
+
raise 'Either use --create or --destroy options. Not both.' if create_info && destroy_info
|
|
85
|
+
|
|
86
|
+
proxmox_waiter = ProxmoxWaiter.new(
|
|
87
|
+
config_file,
|
|
88
|
+
ENV['hpc_user_for_proxmox'],
|
|
89
|
+
ENV['hpc_password_for_proxmox'],
|
|
90
|
+
ENV['hpc_realm_for_proxmox'] || 'pam'
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
idx_retry = 0
|
|
94
|
+
while idx_retry < max_retries
|
|
95
|
+
reserved_resource =
|
|
96
|
+
if destroy_info.nil?
|
|
97
|
+
puts "[ #{Time.now.utc.strftime('%F %T')} ] - Create #{create_info} in a Proxmox container (attempt ##{idx_retry}/#{max_retries})"
|
|
98
|
+
proxmox_waiter.create(create_info)
|
|
99
|
+
else
|
|
100
|
+
puts "[ #{Time.now.utc.strftime('%F %T')} ] - Destroy #{destroy_info} (attempt ##{idx_retry}/#{max_retries})"
|
|
101
|
+
proxmox_waiter.destroy(destroy_info)
|
|
102
|
+
end
|
|
103
|
+
if reserved_resource.is_a?(Symbol)
|
|
104
|
+
# We got an error (missing resources, IPs...).
|
|
105
|
+
# Try again.
|
|
106
|
+
puts "Could not perform the operation because of error: #{reserved_resource}. Waiting #{wait_time_before_retry_secs} seconds before trying again."
|
|
107
|
+
reserved_resource = { error: reserved_resource }
|
|
108
|
+
sleep wait_time_before_retry_secs
|
|
109
|
+
else
|
|
110
|
+
break
|
|
111
|
+
end
|
|
112
|
+
idx_retry += 1
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
rescue
|
|
116
|
+
reserved_resource = {
|
|
117
|
+
error: "Unhandled exception from reserve_proxmox_container: #{$!}\n#{$!.backtrace.join("\n")}"
|
|
118
|
+
}
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
puts '===== JSON ====='
|
|
122
|
+
puts reserved_resource.to_json
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
require 'erubis'
|
|
2
|
+
require 'hybrid_platforms_conductor/report'
|
|
3
|
+
require 'hybrid_platforms_conductor/confluence'
|
|
4
|
+
require 'hybrid_platforms_conductor/common_config_dsl/confluence'
|
|
5
|
+
|
|
6
|
+
module HybridPlatformsConductor
|
|
7
|
+
|
|
8
|
+
module HpcPlugins
|
|
9
|
+
|
|
10
|
+
module Report
|
|
11
|
+
|
|
12
|
+
# Export in the Mediawiki format
|
|
13
|
+
class Confluence < HybridPlatformsConductor::Report
|
|
14
|
+
|
|
15
|
+
self.extend_config_dsl_with CommonConfigDsl::Confluence, :init_confluence
|
|
16
|
+
|
|
17
|
+
# Give the list of supported locales by this report generator
|
|
18
|
+
# [API] - This method is mandatory.
|
|
19
|
+
#
|
|
20
|
+
# Result::
|
|
21
|
+
# * Array<Symbol>: List of supported locales
|
|
22
|
+
def self.supported_locales
|
|
23
|
+
[:en]
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Create a report for a list of nodes, in a given locale
|
|
27
|
+
# [API] - This method is mandatory.
|
|
28
|
+
#
|
|
29
|
+
# Parameters::
|
|
30
|
+
# * *nodes* (Array<String>): List of nodes
|
|
31
|
+
# * *locale_code* (Symbol): The locale code
|
|
32
|
+
def report_for(nodes, locale_code)
|
|
33
|
+
confluence_info = @config.confluence_info
|
|
34
|
+
if confluence_info
|
|
35
|
+
if confluence_info[:inventory_report_page_id]
|
|
36
|
+
@nodes = nodes
|
|
37
|
+
HybridPlatformsConductor::Confluence.with_confluence(confluence_info[:url], @logger, @logger_stderr) do |confluence|
|
|
38
|
+
confluence.update_page(confluence_info[:inventory_report_page_id], render('confluence_inventory'))
|
|
39
|
+
end
|
|
40
|
+
out "Inventory report Confluence page updated. Please visit #{confluence_info[:url]}/pages/viewpage.action?pageId=#{confluence_info[:inventory_report_page_id]}"
|
|
41
|
+
else
|
|
42
|
+
log_warn 'No inventory_report_page_id in the Confluence information defined. Ignoring the Confluence report.'
|
|
43
|
+
end
|
|
44
|
+
else
|
|
45
|
+
log_warn 'No Confluence information defined. Ignoring the Confluence report.'
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
private
|
|
50
|
+
|
|
51
|
+
TEMPLATES_PATH = File.expand_path("#{File.dirname(__FILE__)}/templates")
|
|
52
|
+
|
|
53
|
+
# Render a given ERB template into a String
|
|
54
|
+
#
|
|
55
|
+
# Parameters::
|
|
56
|
+
# * *template* (String): Template name
|
|
57
|
+
# Result::
|
|
58
|
+
# * String: Rendered template
|
|
59
|
+
def render(template)
|
|
60
|
+
Erubis::Eruby.new(File.read("#{TEMPLATES_PATH}/#{template}.html.erb")).result(binding)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
end
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
require 'hybrid_platforms_conductor/report'
|
|
2
|
+
require 'time'
|
|
3
|
+
|
|
4
|
+
module HybridPlatformsConductor
|
|
5
|
+
|
|
6
|
+
module HpcPlugins
|
|
7
|
+
|
|
8
|
+
module Report
|
|
9
|
+
|
|
10
|
+
# Export in the Mediawiki format
|
|
11
|
+
class Mediawiki < HybridPlatformsConductor::Report
|
|
12
|
+
|
|
13
|
+
TRANSLATIONS = {
|
|
14
|
+
en: {
|
|
15
|
+
alias: 'Alias',
|
|
16
|
+
comment: 'Comment',
|
|
17
|
+
daily_backup: 'Daily backup',
|
|
18
|
+
direct_deploy: 'Direct deployment',
|
|
19
|
+
encrypted_storage: 'Encrypted storage',
|
|
20
|
+
failover_ips: 'Failover IPs',
|
|
21
|
+
false: 'No',
|
|
22
|
+
fqdn: 'FQDN',
|
|
23
|
+
geom_mirror: 'GEOM mirror',
|
|
24
|
+
gui: 'GUI',
|
|
25
|
+
handled_by_chef: 'Handled by Chef',
|
|
26
|
+
hosted_on: 'Hosted on',
|
|
27
|
+
hostname: 'Hostname',
|
|
28
|
+
image: 'Image',
|
|
29
|
+
kernel: 'Kernel',
|
|
30
|
+
location: 'Location',
|
|
31
|
+
missing_chef_recipes: 'Missing Chef recipes',
|
|
32
|
+
missing_industrialization: 'Missing industrialization',
|
|
33
|
+
non_encrypted_storage: 'Non-encrypted storage',
|
|
34
|
+
openvz_specs: 'OpenVZ specifications',
|
|
35
|
+
os: 'OS',
|
|
36
|
+
xae_ip: 'XAE IP',
|
|
37
|
+
xae_location: 'XAE location',
|
|
38
|
+
xae_physical_ref: 'XAE physical reference',
|
|
39
|
+
xae_reference: 'XAE reference',
|
|
40
|
+
private_ips: 'Private IPs',
|
|
41
|
+
product: 'Product',
|
|
42
|
+
public_ips: 'Public IPs',
|
|
43
|
+
raid: 'RAID setup',
|
|
44
|
+
ripe_ips: 'RIPE IPs',
|
|
45
|
+
server_type: 'Server type',
|
|
46
|
+
'sub-product': 'Sub-Product',
|
|
47
|
+
true: 'Yes',
|
|
48
|
+
unattended_upgrades: 'Unattended upgrades',
|
|
49
|
+
veid: 'VEID',
|
|
50
|
+
vlan: 'VLAN',
|
|
51
|
+
vrack: 'VRack'
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
# Give the list of supported locales by this report generator
|
|
56
|
+
# [API] - This method is mandatory.
|
|
57
|
+
#
|
|
58
|
+
# Result::
|
|
59
|
+
# * Array<Symbol>: List of supported locales
|
|
60
|
+
def self.supported_locales
|
|
61
|
+
TRANSLATIONS.keys
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Create a report for a list of nodes, in a given locale
|
|
65
|
+
# [API] - This method is mandatory.
|
|
66
|
+
#
|
|
67
|
+
# Parameters::
|
|
68
|
+
# * *nodes* (Array<String>): List of nodes
|
|
69
|
+
# * *locale_code* (Symbol): The locale code
|
|
70
|
+
def report_for(nodes, locale_code)
|
|
71
|
+
output = ''
|
|
72
|
+
locale = TRANSLATIONS[locale_code]
|
|
73
|
+
|
|
74
|
+
output << <<~EOS
|
|
75
|
+
Back to the [[Hadoop]] / [[Impala]] / [[XAE_Network_Topology]] portal pages
|
|
76
|
+
|
|
77
|
+
This page has been generated using <code>./bin/report --format mediawiki</code> on #{Time.now.utc.strftime('%F %T')} UTC.
|
|
78
|
+
|
|
79
|
+
EOS
|
|
80
|
+
|
|
81
|
+
# Get all confs
|
|
82
|
+
# Use the translations' keys to know all properties we want to display
|
|
83
|
+
all_properties = (%i[physical_node cluster private_ips description] + locale.keys).uniq
|
|
84
|
+
@nodes_handler.prefetch_metadata_of nodes, locale.keys
|
|
85
|
+
nodes.
|
|
86
|
+
map do |node|
|
|
87
|
+
{ node: node }.merge(Hash[all_properties.map { |property| [property, @nodes_handler.metadata_of(node, property)] }])
|
|
88
|
+
end.
|
|
89
|
+
# Group them by physical / VMs
|
|
90
|
+
group_by do |node_info|
|
|
91
|
+
# Consume the info to not display it again later
|
|
92
|
+
physical_node = node_info.delete(:physical_node)
|
|
93
|
+
!physical_node.nil? && physical_node
|
|
94
|
+
end.
|
|
95
|
+
each do |physical, nodes_for_physical|
|
|
96
|
+
output << "= #{physical ? 'Physical' : 'Virtual'} nodes =\n\n"
|
|
97
|
+
# Group them by location
|
|
98
|
+
nodes_for_physical.
|
|
99
|
+
group_by do |node_info|
|
|
100
|
+
# Consume the info to not display it again later
|
|
101
|
+
cluster = node_info.delete(:cluster)
|
|
102
|
+
cluster.nil? ? '' : cluster
|
|
103
|
+
end.
|
|
104
|
+
sort.
|
|
105
|
+
each do |cluster, nodes_for_cluster|
|
|
106
|
+
output << "== #{cluster.empty? ? 'Independent nodes' : "Belonging to cluster #{cluster}"} ==\n\n"
|
|
107
|
+
# Group them by IP range (24 bits)
|
|
108
|
+
nodes_for_cluster.
|
|
109
|
+
group_by { |node_info| node_info[:private_ips].nil? || node_info[:private_ips].empty? ? [] : node_info[:private_ips].first.split('.')[0..2].map(&:to_i) }.
|
|
110
|
+
sort.
|
|
111
|
+
each do |ip_range, nodes_for_ip_range|
|
|
112
|
+
output << "=== #{ip_range.empty? ? 'No IP' : "#{ip_range.join('.')}/24"} ===\n\n"
|
|
113
|
+
nodes_for_ip_range.
|
|
114
|
+
sort_by { |node_info| node_info[:node] }.
|
|
115
|
+
each do |node_info|
|
|
116
|
+
output << "* '''#{node_info.delete(:node)}'''#{node_info[:private_ips].nil? || node_info[:private_ips].empty? ? '' : " - #{node_info[:private_ips].first}"} - #{node_info.delete(:description)}\n"
|
|
117
|
+
node_info.delete(:private_ips) if !node_info[:private_ips].nil? && node_info[:private_ips].size == 1
|
|
118
|
+
node_info.sort.each do |property, value|
|
|
119
|
+
unless value.nil?
|
|
120
|
+
raise "Missing translation of key: #{property}. Please edit TRANSLATIONS[:#{locale_code}]." unless locale.key?(property)
|
|
121
|
+
formatted_value =
|
|
122
|
+
if value.is_a?(Array)
|
|
123
|
+
"\n#{value.map { |item| "::* #{item}" }.join("\n")}"
|
|
124
|
+
elsif value.is_a?(Hash)
|
|
125
|
+
"\n#{value.map { |item, value| "::* #{item}: #{value}" }.join("\n")}"
|
|
126
|
+
elsif value.is_a?(TrueClass)
|
|
127
|
+
locale[:true]
|
|
128
|
+
elsif value.is_a?(FalseClass)
|
|
129
|
+
locale[:false]
|
|
130
|
+
else
|
|
131
|
+
value.to_str
|
|
132
|
+
end
|
|
133
|
+
output << ": #{locale[property]}: #{formatted_value}\n"
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
output << "\n\n"
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
output << <<~EOS
|
|
143
|
+
Back to the [[Hadoop]] / [[Impala]] / [[XAE_Network_Topology]] portal pages
|
|
144
|
+
|
|
145
|
+
[[Category:My Project]]
|
|
146
|
+
[[Category:Hadoop]]
|
|
147
|
+
[[Category:NoSQL]]
|
|
148
|
+
[[Category:Hosting]]
|
|
149
|
+
[[Category:XAE]]
|
|
150
|
+
[[Category:Server]]
|
|
151
|
+
[[Category:Configuration]]
|
|
152
|
+
[[Category:Chef]]
|
|
153
|
+
EOS
|
|
154
|
+
|
|
155
|
+
out output
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
end
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# This file is an example of a Reports plugin that can be used to dump information about the platforms.
|
|
2
|
+
# The MyReportPlugin example contains example of code that could be used to write a plugin for a new kind of report.
|
|
3
|
+
require 'hybrid_platforms_conductor/report'
|
|
4
|
+
|
|
5
|
+
module HybridPlatformsConductor
|
|
6
|
+
|
|
7
|
+
module HpcPlugins
|
|
8
|
+
|
|
9
|
+
module Report
|
|
10
|
+
|
|
11
|
+
# Brief description of the plugin here.
|
|
12
|
+
# The name should match the file name.
|
|
13
|
+
# It should always inherit from ReportPlugin.
|
|
14
|
+
# In all instance methods of a platform handler, the following variables are accessible:
|
|
15
|
+
# * @nodes_handler (NodesHandler): Nodes handler used to access information about the platforms
|
|
16
|
+
class MyReportPlugin < HybridPlatformsConductor::Report
|
|
17
|
+
|
|
18
|
+
# Are dependencies met before using this plugin?
|
|
19
|
+
# [API] - This method is optional
|
|
20
|
+
#
|
|
21
|
+
# Result::
|
|
22
|
+
# * Boolean: Are dependencies met before using this plugin?
|
|
23
|
+
def self.valid?
|
|
24
|
+
true
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Add a Mixin to the DSL parsing the platforms configuration file.
|
|
28
|
+
# This can be used by any plugin to add plugin-specific configuration getters and setters, accessible later from NodesHandler instances.
|
|
29
|
+
# An optional initializer can also be given.
|
|
30
|
+
# [API] - Those calls are optional
|
|
31
|
+
module MyDSLExtension
|
|
32
|
+
|
|
33
|
+
attr_accessor :my_property
|
|
34
|
+
|
|
35
|
+
# Initialize the DSL
|
|
36
|
+
def init_my_dsl_extension
|
|
37
|
+
@my_property = 42
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
end
|
|
41
|
+
self.extend_config_dsl_with MyDSLExtension, :init_my_dsl_extension
|
|
42
|
+
|
|
43
|
+
# Give the list of supported locales by this report generator
|
|
44
|
+
# [API] - This method is mandatory.
|
|
45
|
+
#
|
|
46
|
+
# Result::
|
|
47
|
+
# * Array<Symbol>: List of supported locales
|
|
48
|
+
def self.supported_locales
|
|
49
|
+
# This method has to publish the list of translations it accepts.
|
|
50
|
+
[
|
|
51
|
+
:fr,
|
|
52
|
+
:en
|
|
53
|
+
]
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Create a report for a list of nodes, in a given locale
|
|
57
|
+
# [API] - This method is mandatory.
|
|
58
|
+
#
|
|
59
|
+
# Parameters::
|
|
60
|
+
# * *nodes* (Array<String>): List of nodes
|
|
61
|
+
# * *locale_code* (Symbol): The locale code
|
|
62
|
+
def report_for(nodes, locale_code)
|
|
63
|
+
# This method simply provides a report for a given list of nodes in the desired locale.
|
|
64
|
+
# The locale will be one of the supported ones.
|
|
65
|
+
output = ''
|
|
66
|
+
case locale_code
|
|
67
|
+
when :fr
|
|
68
|
+
output << 'Un beau rapport'
|
|
69
|
+
when :en
|
|
70
|
+
output << 'A nice report'
|
|
71
|
+
end
|
|
72
|
+
@platforms_handler.known_platforms.each do |platform|
|
|
73
|
+
output << "= Report for platform #{platform.repository_path} of type #{platform.platform_type}:"
|
|
74
|
+
platform.known_nodes.each do |node|
|
|
75
|
+
output << "== Report for node #{node}:"
|
|
76
|
+
output << @nodes_handler.get_description_of node
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
out output
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require 'hybrid_platforms_conductor/report'
|
|
2
|
+
require 'terminal-table'
|
|
3
|
+
|
|
4
|
+
module HybridPlatformsConductor
|
|
5
|
+
|
|
6
|
+
module HpcPlugins
|
|
7
|
+
|
|
8
|
+
module Report
|
|
9
|
+
|
|
10
|
+
# Export on stdout
|
|
11
|
+
class Stdout < HybridPlatformsConductor::Report
|
|
12
|
+
|
|
13
|
+
# Give the list of supported locales by this report generator
|
|
14
|
+
# [API] - This method is mandatory.
|
|
15
|
+
#
|
|
16
|
+
# Result::
|
|
17
|
+
# * Array<Symbol>: List of supported locales
|
|
18
|
+
def self.supported_locales
|
|
19
|
+
[:en]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Create a report for a list of nodes, in a given locale
|
|
23
|
+
# [API] - This method is mandatory.
|
|
24
|
+
#
|
|
25
|
+
# Parameters::
|
|
26
|
+
# * *nodes* (Array<String>): List of nodes
|
|
27
|
+
# * *locale_code* (Symbol): The locale code
|
|
28
|
+
def report_for(nodes, locale_code)
|
|
29
|
+
@nodes_handler.prefetch_metadata_of nodes, %i[hostname host_ip physical image description services]
|
|
30
|
+
out(Terminal::Table.new(headings: [
|
|
31
|
+
'Node',
|
|
32
|
+
'Platform',
|
|
33
|
+
'Host name',
|
|
34
|
+
'IP',
|
|
35
|
+
'Physical?',
|
|
36
|
+
'OS',
|
|
37
|
+
'Description',
|
|
38
|
+
'Services'
|
|
39
|
+
]) do |table|
|
|
40
|
+
nodes.sort.each do |node|
|
|
41
|
+
table << [
|
|
42
|
+
node,
|
|
43
|
+
@platforms_handler.known_platforms.find { |platform| platform.known_nodes.include?(node) }&.name,
|
|
44
|
+
@nodes_handler.get_hostname_of(node),
|
|
45
|
+
@nodes_handler.get_host_ip_of(node),
|
|
46
|
+
@nodes_handler.get_physical_of(node) ? 'Yes' : 'No',
|
|
47
|
+
@nodes_handler.get_image_of(node),
|
|
48
|
+
@nodes_handler.get_description_of(node),
|
|
49
|
+
(@nodes_handler.get_services_of(node) || []).sort.join(', ')
|
|
50
|
+
]
|
|
51
|
+
end
|
|
52
|
+
end)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
end
|