mtncloud-cli 1.0.0
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/.dockerignore +20 -0
- data/.github/pull_request_template.md +14 -0
- data/.github/workflows/ci.yml +56 -0
- data/.github/workflows/release.yml +46 -0
- data/.gitignore +25 -0
- data/CLAUDE.md +24 -0
- data/CONTRIBUTING.md +91 -0
- data/Dockerfile +19 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +23 -0
- data/README.md +187 -0
- data/Rakefile +26 -0
- data/bin/mcs +3 -0
- data/bin/mtncloud +27 -0
- data/lib/mtncloud/api/account_groups_interface.rb +48 -0
- data/lib/mtncloud/api/account_users_interface.rb +68 -0
- data/lib/mtncloud/api/accounts_interface.rb +9 -0
- data/lib/mtncloud/api/activity_interface.rb +9 -0
- data/lib/mtncloud/api/affinity_groups_interface.rb +46 -0
- data/lib/mtncloud/api/api_client.rb +1091 -0
- data/lib/mtncloud/api/appliance_settings_interface.rb +49 -0
- data/lib/mtncloud/api/approvals_interface.rb +32 -0
- data/lib/mtncloud/api/apps_interface.rb +180 -0
- data/lib/mtncloud/api/archive_buckets_interface.rb +116 -0
- data/lib/mtncloud/api/archive_files_interface.rb +173 -0
- data/lib/mtncloud/api/audit_interface.rb +9 -0
- data/lib/mtncloud/api/auth_interface.rb +58 -0
- data/lib/mtncloud/api/backup_jobs_interface.rb +13 -0
- data/lib/mtncloud/api/backup_restores_interface.rb +27 -0
- data/lib/mtncloud/api/backup_results_interface.rb +32 -0
- data/lib/mtncloud/api/backup_service_types_interface.rb +9 -0
- data/lib/mtncloud/api/backup_services_interface.rb +9 -0
- data/lib/mtncloud/api/backup_settings_interface.rb +20 -0
- data/lib/mtncloud/api/backup_types_interface.rb +9 -0
- data/lib/mtncloud/api/backups_interface.rb +21 -0
- data/lib/mtncloud/api/billing_interface.rb +34 -0
- data/lib/mtncloud/api/blueprints_interface.rb +70 -0
- data/lib/mtncloud/api/body_io.rb +22 -0
- data/lib/mtncloud/api/budgets_interface.rb +48 -0
- data/lib/mtncloud/api/catalog_item_types_interface.rb +29 -0
- data/lib/mtncloud/api/certificate_types_interface.rb +14 -0
- data/lib/mtncloud/api/certificates_interface.rb +9 -0
- data/lib/mtncloud/api/clients_interface.rb +41 -0
- data/lib/mtncloud/api/cloud_datastores_interface.rb +48 -0
- data/lib/mtncloud/api/cloud_folders_interface.rb +41 -0
- data/lib/mtncloud/api/cloud_policies_interface.rb +41 -0
- data/lib/mtncloud/api/cloud_resource_pools_interface.rb +66 -0
- data/lib/mtncloud/api/clouds_interface.rb +217 -0
- data/lib/mtncloud/api/clusters_interface.rb +471 -0
- data/lib/mtncloud/api/containers_interface.rb +145 -0
- data/lib/mtncloud/api/credential_types_interface.rb +9 -0
- data/lib/mtncloud/api/credentials_interface.rb +9 -0
- data/lib/mtncloud/api/custom_instance_types_interface.rb +99 -0
- data/lib/mtncloud/api/cypher_interface.rb +51 -0
- data/lib/mtncloud/api/dashboard_interface.rb +14 -0
- data/lib/mtncloud/api/datastores_interface.rb +21 -0
- data/lib/mtncloud/api/deploy_interface.rb +44 -0
- data/lib/mtncloud/api/deployments_interface.rb +79 -0
- data/lib/mtncloud/api/distributed_workers_interface.rb +41 -0
- data/lib/mtncloud/api/email_templates_interface.rb +53 -0
- data/lib/mtncloud/api/environments_interface.rb +48 -0
- data/lib/mtncloud/api/execute_schedules_interface.rb +71 -0
- data/lib/mtncloud/api/execution_request_interface.rb +27 -0
- data/lib/mtncloud/api/file_copy_request_interface.rb +68 -0
- data/lib/mtncloud/api/forgot_password_interface.rb +17 -0
- data/lib/mtncloud/api/group_policies_interface.rb +41 -0
- data/lib/mtncloud/api/groups_interface.rb +73 -0
- data/lib/mtncloud/api/guidance_interface.rb +44 -0
- data/lib/mtncloud/api/guidance_settings_interface.rb +17 -0
- data/lib/mtncloud/api/health_interface.rb +100 -0
- data/lib/mtncloud/api/host_vm_groups_interface.rb +37 -0
- data/lib/mtncloud/api/hub_interface.rb +25 -0
- data/lib/mtncloud/api/image_builder_boot_scripts_interface.rb +41 -0
- data/lib/mtncloud/api/image_builder_image_builds_interface.rb +73 -0
- data/lib/mtncloud/api/image_builder_interface.rb +20 -0
- data/lib/mtncloud/api/image_builder_preseed_scripts_interface.rb +41 -0
- data/lib/mtncloud/api/instance_types_interface.rb +20 -0
- data/lib/mtncloud/api/instances_interface.rb +453 -0
- data/lib/mtncloud/api/integration_types_interface.rb +14 -0
- data/lib/mtncloud/api/integrations_interface.rb +74 -0
- data/lib/mtncloud/api/invoice_line_items_interface.rb +9 -0
- data/lib/mtncloud/api/invoices_interface.rb +28 -0
- data/lib/mtncloud/api/jobs_interface.rb +83 -0
- data/lib/mtncloud/api/key_pairs_interface.rb +57 -0
- data/lib/mtncloud/api/library_cluster_layouts_interface.rb +47 -0
- data/lib/mtncloud/api/library_cluster_packages_interface.rb +60 -0
- data/lib/mtncloud/api/library_container_scripts_interface.rb +43 -0
- data/lib/mtncloud/api/library_container_templates_interface.rb +43 -0
- data/lib/mtncloud/api/library_container_types_interface.rb +59 -0
- data/lib/mtncloud/api/library_container_upgrades_interface.rb +60 -0
- data/lib/mtncloud/api/library_instance_types_interface.rb +74 -0
- data/lib/mtncloud/api/library_layouts_interface.rb +69 -0
- data/lib/mtncloud/api/library_operating_systems_interface.rb +63 -0
- data/lib/mtncloud/api/library_spec_template_types_interface.rb +43 -0
- data/lib/mtncloud/api/library_spec_templates_interface.rb +43 -0
- data/lib/mtncloud/api/license_interface.rb +30 -0
- data/lib/mtncloud/api/load_balancer_monitors_interface.rb +9 -0
- data/lib/mtncloud/api/load_balancer_pool_nodes_interface.rb +8 -0
- data/lib/mtncloud/api/load_balancer_pools_interface.rb +9 -0
- data/lib/mtncloud/api/load_balancer_pools_secondary_interface.rb +9 -0
- data/lib/mtncloud/api/load_balancer_profiles_interface.rb +9 -0
- data/lib/mtncloud/api/load_balancer_types_interface.rb +9 -0
- data/lib/mtncloud/api/load_balancer_virtual_servers_interface.rb +18 -0
- data/lib/mtncloud/api/load_balancers_interface.rb +14 -0
- data/lib/mtncloud/api/log_settings_interface.rb +44 -0
- data/lib/mtncloud/api/logs_interface.rb +37 -0
- data/lib/mtncloud/api/migrations_interface.rb +49 -0
- data/lib/mtncloud/api/monitoring_alerts_interface.rb +39 -0
- data/lib/mtncloud/api/monitoring_apps_interface.rb +69 -0
- data/lib/mtncloud/api/monitoring_checks_interface.rb +103 -0
- data/lib/mtncloud/api/monitoring_contacts_interface.rb +41 -0
- data/lib/mtncloud/api/monitoring_groups_interface.rb +77 -0
- data/lib/mtncloud/api/monitoring_incidents_interface.rb +107 -0
- data/lib/mtncloud/api/monitoring_interface.rb +35 -0
- data/lib/mtncloud/api/monitoring_settings_interface.rb +21 -0
- data/lib/mtncloud/api/network_dhcp_relays_interface.rb +36 -0
- data/lib/mtncloud/api/network_dhcp_servers_interface.rb +36 -0
- data/lib/mtncloud/api/network_domain_records_interface.rb +41 -0
- data/lib/mtncloud/api/network_domains_interface.rb +41 -0
- data/lib/mtncloud/api/network_edge_clusters_interface.rb +26 -0
- data/lib/mtncloud/api/network_floating_ips_interface.rb +40 -0
- data/lib/mtncloud/api/network_groups_interface.rb +41 -0
- data/lib/mtncloud/api/network_pool_ips_interface.rb +41 -0
- data/lib/mtncloud/api/network_pool_server_types_interface.rb +9 -0
- data/lib/mtncloud/api/network_pool_servers_interface.rb +48 -0
- data/lib/mtncloud/api/network_pools_interface.rb +41 -0
- data/lib/mtncloud/api/network_proxies_interface.rb +41 -0
- data/lib/mtncloud/api/network_routers_interface.rb +181 -0
- data/lib/mtncloud/api/network_security_server_types_interface.rb +9 -0
- data/lib/mtncloud/api/network_security_servers_interface.rb +27 -0
- data/lib/mtncloud/api/network_server_groups_interface.rb +7 -0
- data/lib/mtncloud/api/network_server_types_interface.rb +9 -0
- data/lib/mtncloud/api/network_servers_interface.rb +102 -0
- data/lib/mtncloud/api/network_services_interface.rb +63 -0
- data/lib/mtncloud/api/network_static_routes_interface.rb +36 -0
- data/lib/mtncloud/api/network_subnets_interface.rb +42 -0
- data/lib/mtncloud/api/network_types_interface.rb +20 -0
- data/lib/mtncloud/api/networks_interface.rb +48 -0
- data/lib/mtncloud/api/option_type_forms_interface.rb +9 -0
- data/lib/mtncloud/api/option_type_lists_interface.rb +53 -0
- data/lib/mtncloud/api/option_types_interface.rb +41 -0
- data/lib/mtncloud/api/options_interface.rb +17 -0
- data/lib/mtncloud/api/packages_interface.rb +112 -0
- data/lib/mtncloud/api/ping_interface.rb +22 -0
- data/lib/mtncloud/api/plugins_interface.rb +22 -0
- data/lib/mtncloud/api/policies_interface.rb +56 -0
- data/lib/mtncloud/api/power_schedules_interface.rb +71 -0
- data/lib/mtncloud/api/price_sets_interface.rb +39 -0
- data/lib/mtncloud/api/prices_interface.rb +71 -0
- data/lib/mtncloud/api/processes_interface.rb +40 -0
- data/lib/mtncloud/api/projects_interface.rb +33 -0
- data/lib/mtncloud/api/provision_types_interface.rb +24 -0
- data/lib/mtncloud/api/provisioning_license_types_interface.rb +31 -0
- data/lib/mtncloud/api/provisioning_licenses_interface.rb +60 -0
- data/lib/mtncloud/api/provisioning_settings_interface.rb +26 -0
- data/lib/mtncloud/api/read_interface.rb +24 -0
- data/lib/mtncloud/api/reports_interface.rb +70 -0
- data/lib/mtncloud/api/resource_pool_groups_interface.rb +51 -0
- data/lib/mtncloud/api/rest_interface.rb +37 -0
- data/lib/mtncloud/api/roles_interface.rb +151 -0
- data/lib/mtncloud/api/scale_thresholds_interface.rb +9 -0
- data/lib/mtncloud/api/search_interface.rb +13 -0
- data/lib/mtncloud/api/secondary_read_interface.rb +25 -0
- data/lib/mtncloud/api/secondary_rest_interface.rb +42 -0
- data/lib/mtncloud/api/security_group_rules_interface.rb +35 -0
- data/lib/mtncloud/api/security_groups_interface.rb +56 -0
- data/lib/mtncloud/api/security_package_types_interface.rb +9 -0
- data/lib/mtncloud/api/security_packages_interface.rb +9 -0
- data/lib/mtncloud/api/security_scans_interface.rb +9 -0
- data/lib/mtncloud/api/server_devices_interface.rb +30 -0
- data/lib/mtncloud/api/server_types_interface.rb +20 -0
- data/lib/mtncloud/api/servers_interface.rb +230 -0
- data/lib/mtncloud/api/service_catalog_interface.rb +89 -0
- data/lib/mtncloud/api/service_plans_interface.rb +62 -0
- data/lib/mtncloud/api/setup_interface.rb +46 -0
- data/lib/mtncloud/api/snapshots_interface.rb +19 -0
- data/lib/mtncloud/api/storage_datastores_interface.rb +44 -0
- data/lib/mtncloud/api/storage_providers_interface.rb +151 -0
- data/lib/mtncloud/api/storage_server_types_interface.rb +14 -0
- data/lib/mtncloud/api/storage_servers_interface.rb +9 -0
- data/lib/mtncloud/api/storage_volume_types_interface.rb +9 -0
- data/lib/mtncloud/api/storage_volumes_interface.rb +24 -0
- data/lib/mtncloud/api/subnet_types_interface.rb +20 -0
- data/lib/mtncloud/api/subnets_interface.rb +41 -0
- data/lib/mtncloud/api/support_bundles_interface.rb +46 -0
- data/lib/mtncloud/api/system_types_interface.rb +13 -0
- data/lib/mtncloud/api/systems_interface.rb +55 -0
- data/lib/mtncloud/api/task_sets_interface.rb +52 -0
- data/lib/mtncloud/api/tasks_interface.rb +66 -0
- data/lib/mtncloud/api/tokens_interface.rb +39 -0
- data/lib/mtncloud/api/usage_interface.rb +18 -0
- data/lib/mtncloud/api/user_groups_interface.rb +59 -0
- data/lib/mtncloud/api/user_settings_interface.rb +90 -0
- data/lib/mtncloud/api/user_sources_interface.rb +99 -0
- data/lib/mtncloud/api/users_interface.rb +33 -0
- data/lib/mtncloud/api/vdi_allocations_interface.rb +9 -0
- data/lib/mtncloud/api/vdi_apps_interface.rb +9 -0
- data/lib/mtncloud/api/vdi_gateways_interface.rb +9 -0
- data/lib/mtncloud/api/vdi_interface.rb +28 -0
- data/lib/mtncloud/api/vdi_pools_interface.rb +19 -0
- data/lib/mtncloud/api/virtual_images_interface.rb +210 -0
- data/lib/mtncloud/api/virtual_servers_interface.rb +9 -0
- data/lib/mtncloud/api/virtual_switches_interface.rb +9 -0
- data/lib/mtncloud/api/whitelabel_settings_interface.rb +57 -0
- data/lib/mtncloud/api/whoami_interface.rb +13 -0
- data/lib/mtncloud/api/wiki_interface.rb +48 -0
- data/lib/mtncloud/api.rb +12 -0
- data/lib/mtncloud/benchmarking.rb +259 -0
- data/lib/mtncloud/cli/cli_command.rb +2281 -0
- data/lib/mtncloud/cli/cli_registry.rb +337 -0
- data/lib/mtncloud/cli/commands/access_token_command.rb +201 -0
- data/lib/mtncloud/cli/commands/account_groups_command.rb +530 -0
- data/lib/mtncloud/cli/commands/activity_command.rb +149 -0
- data/lib/mtncloud/cli/commands/affinity_groups_command.rb +554 -0
- data/lib/mtncloud/cli/commands/alias_command.rb +278 -0
- data/lib/mtncloud/cli/commands/appliance_settings_command.rb +382 -0
- data/lib/mtncloud/cli/commands/approvals_command.rb +236 -0
- data/lib/mtncloud/cli/commands/apps.rb +2549 -0
- data/lib/mtncloud/cli/commands/archives_command.rb +2161 -0
- data/lib/mtncloud/cli/commands/audit.rb +188 -0
- data/lib/mtncloud/cli/commands/backup_jobs_command.rb +366 -0
- data/lib/mtncloud/cli/commands/backup_restores_command.rb +144 -0
- data/lib/mtncloud/cli/commands/backup_results_command.rb +149 -0
- data/lib/mtncloud/cli/commands/backup_services_command.rb +44 -0
- data/lib/mtncloud/cli/commands/backup_settings_command.rb +184 -0
- data/lib/mtncloud/cli/commands/backup_types_command.rb +53 -0
- data/lib/mtncloud/cli/commands/backups_command.rb +674 -0
- data/lib/mtncloud/cli/commands/benchmark_command.rb +458 -0
- data/lib/mtncloud/cli/commands/blueprints_command.rb +2297 -0
- data/lib/mtncloud/cli/commands/boot_scripts_command.rb +379 -0
- data/lib/mtncloud/cli/commands/budgets_command.rb +754 -0
- data/lib/mtncloud/cli/commands/cat_command.rb +45 -0
- data/lib/mtncloud/cli/commands/catalog_item_types_command.rb +858 -0
- data/lib/mtncloud/cli/commands/certificates_command.rb +575 -0
- data/lib/mtncloud/cli/commands/change_password_command.rb +132 -0
- data/lib/mtncloud/cli/commands/clients_command.rb +331 -0
- data/lib/mtncloud/cli/commands/cloud_datastores_command.rb +543 -0
- data/lib/mtncloud/cli/commands/cloud_folders_command.rb +512 -0
- data/lib/mtncloud/cli/commands/cloud_resource_pools_command.rb +870 -0
- data/lib/mtncloud/cli/commands/clouds.rb +2037 -0
- data/lib/mtncloud/cli/commands/clouds_types.rb +140 -0
- data/lib/mtncloud/cli/commands/cluster_types.rb +179 -0
- data/lib/mtncloud/cli/commands/clusters.rb +5855 -0
- data/lib/mtncloud/cli/commands/coloring_command.rb +82 -0
- data/lib/mtncloud/cli/commands/containers_command.rb +967 -0
- data/lib/mtncloud/cli/commands/credential_types_command.rb +36 -0
- data/lib/mtncloud/cli/commands/credentials_command.rb +124 -0
- data/lib/mtncloud/cli/commands/curl_command.rb +168 -0
- data/lib/mtncloud/cli/commands/cypher_command.rb +587 -0
- data/lib/mtncloud/cli/commands/dashboard_command.rb +300 -0
- data/lib/mtncloud/cli/commands/debug_command.rb +75 -0
- data/lib/mtncloud/cli/commands/deploy.rb +485 -0
- data/lib/mtncloud/cli/commands/deployments.rb +923 -0
- data/lib/mtncloud/cli/commands/deploys.rb +485 -0
- data/lib/mtncloud/cli/commands/distributed_workers_command.rb +282 -0
- data/lib/mtncloud/cli/commands/echo_command.rb +61 -0
- data/lib/mtncloud/cli/commands/edit_profile_command.rb +57 -0
- data/lib/mtncloud/cli/commands/edit_rc_command.rb +77 -0
- data/lib/mtncloud/cli/commands/email_templates_command.rb +373 -0
- data/lib/mtncloud/cli/commands/environments_command.rb +401 -0
- data/lib/mtncloud/cli/commands/execute_schedules_command.rb +735 -0
- data/lib/mtncloud/cli/commands/execution_request_command.rb +333 -0
- data/lib/mtncloud/cli/commands/exit_command.rb +34 -0
- data/lib/mtncloud/cli/commands/file_copy_request_command.rb +352 -0
- data/lib/mtncloud/cli/commands/forgot_password.rb +133 -0
- data/lib/mtncloud/cli/commands/get_prompt_command.rb +36 -0
- data/lib/mtncloud/cli/commands/groups.rb +818 -0
- data/lib/mtncloud/cli/commands/guidance_command.rb +529 -0
- data/lib/mtncloud/cli/commands/guidance_settings.rb +148 -0
- data/lib/mtncloud/cli/commands/health_command.rb +1046 -0
- data/lib/mtncloud/cli/commands/history_command.rb +60 -0
- data/lib/mtncloud/cli/commands/host_vm_groups_command.rb +423 -0
- data/lib/mtncloud/cli/commands/hosts.rb +2986 -0
- data/lib/mtncloud/cli/commands/hub.rb +215 -0
- data/lib/mtncloud/cli/commands/image_builder_command.rb +1197 -0
- data/lib/mtncloud/cli/commands/instance_types.rb +163 -0
- data/lib/mtncloud/cli/commands/instances.rb +5813 -0
- data/lib/mtncloud/cli/commands/integrations_command.rb +1412 -0
- data/lib/mtncloud/cli/commands/invoices_command.rb +1151 -0
- data/lib/mtncloud/cli/commands/jobs_command.rb +998 -0
- data/lib/mtncloud/cli/commands/key_pairs.rb +470 -0
- data/lib/mtncloud/cli/commands/library_cluster_layouts_command.rb +901 -0
- data/lib/mtncloud/cli/commands/library_cluster_packages_command.rb +552 -0
- data/lib/mtncloud/cli/commands/library_container_scripts_command.rb +446 -0
- data/lib/mtncloud/cli/commands/library_container_templates_command.rb +526 -0
- data/lib/mtncloud/cli/commands/library_container_types_command.rb +698 -0
- data/lib/mtncloud/cli/commands/library_forms_command.rb +625 -0
- data/lib/mtncloud/cli/commands/library_instance_types_command.rb +668 -0
- data/lib/mtncloud/cli/commands/library_layouts_command.rb +849 -0
- data/lib/mtncloud/cli/commands/library_operating_systems_command.rb +671 -0
- data/lib/mtncloud/cli/commands/library_option_lists_command.rb +503 -0
- data/lib/mtncloud/cli/commands/library_option_types_command.rb +329 -0
- data/lib/mtncloud/cli/commands/library_spec_templates_command.rb +547 -0
- data/lib/mtncloud/cli/commands/library_upgrades_command.rb +596 -0
- data/lib/mtncloud/cli/commands/license.rb +475 -0
- data/lib/mtncloud/cli/commands/load_balancer_monitors.rb +70 -0
- data/lib/mtncloud/cli/commands/load_balancer_pool_nodes.rb +87 -0
- data/lib/mtncloud/cli/commands/load_balancer_pools.rb +129 -0
- data/lib/mtncloud/cli/commands/load_balancer_profiles.rb +64 -0
- data/lib/mtncloud/cli/commands/load_balancer_types.rb +38 -0
- data/lib/mtncloud/cli/commands/load_balancer_virtual_servers.rb +147 -0
- data/lib/mtncloud/cli/commands/load_balancers.rb +189 -0
- data/lib/mtncloud/cli/commands/log_level_command.rb +54 -0
- data/lib/mtncloud/cli/commands/log_settings_command.rb +443 -0
- data/lib/mtncloud/cli/commands/login.rb +148 -0
- data/lib/mtncloud/cli/commands/logout.rb +63 -0
- data/lib/mtncloud/cli/commands/logs_command.rb +140 -0
- data/lib/mtncloud/cli/commands/man_command.rb +409 -0
- data/lib/mtncloud/cli/commands/migrations.rb +453 -0
- data/lib/mtncloud/cli/commands/monitoring_alerts_command.rb +791 -0
- data/lib/mtncloud/cli/commands/monitoring_apps_command.rb +716 -0
- data/lib/mtncloud/cli/commands/monitoring_checks_command.rb +766 -0
- data/lib/mtncloud/cli/commands/monitoring_contacts_command.rb +339 -0
- data/lib/mtncloud/cli/commands/monitoring_groups_command.rb +674 -0
- data/lib/mtncloud/cli/commands/monitoring_incidents_command.rb +835 -0
- data/lib/mtncloud/cli/commands/monitoring_settings.rb +212 -0
- data/lib/mtncloud/cli/commands/network_dhcp_relays_command.rb +375 -0
- data/lib/mtncloud/cli/commands/network_dhcp_servers_command.rb +366 -0
- data/lib/mtncloud/cli/commands/network_domains_command.rb +896 -0
- data/lib/mtncloud/cli/commands/network_edge_clusters_command.rb +288 -0
- data/lib/mtncloud/cli/commands/network_firewalls_command.rb +783 -0
- data/lib/mtncloud/cli/commands/network_floating_ips.rb +147 -0
- data/lib/mtncloud/cli/commands/network_groups_command.rb +654 -0
- data/lib/mtncloud/cli/commands/network_pool_server_types.rb +20 -0
- data/lib/mtncloud/cli/commands/network_pool_servers_command.rb +318 -0
- data/lib/mtncloud/cli/commands/network_pools_command.rb +903 -0
- data/lib/mtncloud/cli/commands/network_proxies_command.rb +578 -0
- data/lib/mtncloud/cli/commands/network_routers_command.rb +2628 -0
- data/lib/mtncloud/cli/commands/network_security_server_types.rb +20 -0
- data/lib/mtncloud/cli/commands/network_server_groups_command.rb +222 -0
- data/lib/mtncloud/cli/commands/network_server_types_command.rb +20 -0
- data/lib/mtncloud/cli/commands/network_servers_command.rb +398 -0
- data/lib/mtncloud/cli/commands/network_services_command.rb +198 -0
- data/lib/mtncloud/cli/commands/network_static_routes_command.rb +451 -0
- data/lib/mtncloud/cli/commands/network_transport_zones_command.rb +412 -0
- data/lib/mtncloud/cli/commands/networks_command.rb +1692 -0
- data/lib/mtncloud/cli/commands/open_command.rb +30 -0
- data/lib/mtncloud/cli/commands/options.rb +231 -0
- data/lib/mtncloud/cli/commands/packages_command.rb +822 -0
- data/lib/mtncloud/cli/commands/ping.rb +242 -0
- data/lib/mtncloud/cli/commands/plugins.rb +214 -0
- data/lib/mtncloud/cli/commands/policies_command.rb +990 -0
- data/lib/mtncloud/cli/commands/power_schedules_command.rb +731 -0
- data/lib/mtncloud/cli/commands/preseed_scripts_command.rb +378 -0
- data/lib/mtncloud/cli/commands/price_sets_command.rb +557 -0
- data/lib/mtncloud/cli/commands/prices_command.rb +692 -0
- data/lib/mtncloud/cli/commands/processes_command.rb +469 -0
- data/lib/mtncloud/cli/commands/projects_command.rb +537 -0
- data/lib/mtncloud/cli/commands/provisioning_licenses_command.rb +509 -0
- data/lib/mtncloud/cli/commands/provisioning_settings_command.rb +238 -0
- data/lib/mtncloud/cli/commands/recent_activity_command.rb +171 -0
- data/lib/mtncloud/cli/commands/remote.rb +1818 -0
- data/lib/mtncloud/cli/commands/reports_command.rb +724 -0
- data/lib/mtncloud/cli/commands/resource_pool_groups_command.rb +586 -0
- data/lib/mtncloud/cli/commands/rm_command.rb +14 -0
- data/lib/mtncloud/cli/commands/roles.rb +3120 -0
- data/lib/mtncloud/cli/commands/scale_thresholds.rb +103 -0
- data/lib/mtncloud/cli/commands/search_command.rb +184 -0
- data/lib/mtncloud/cli/commands/security_group_rules.rb +230 -0
- data/lib/mtncloud/cli/commands/security_groups.rb +1294 -0
- data/lib/mtncloud/cli/commands/security_package_types.rb +32 -0
- data/lib/mtncloud/cli/commands/security_packages.rb +84 -0
- data/lib/mtncloud/cli/commands/security_scans.rb +107 -0
- data/lib/mtncloud/cli/commands/self_service_command.rb +17 -0
- data/lib/mtncloud/cli/commands/server_devices_command.rb +207 -0
- data/lib/mtncloud/cli/commands/service_catalog_command.rb +1528 -0
- data/lib/mtncloud/cli/commands/service_plans_command.rb +895 -0
- data/lib/mtncloud/cli/commands/set_prompt_command.rb +51 -0
- data/lib/mtncloud/cli/commands/setup.rb +423 -0
- data/lib/mtncloud/cli/commands/shell.rb +717 -0
- data/lib/mtncloud/cli/commands/sleep_command.rb +43 -0
- data/lib/mtncloud/cli/commands/snapshots.rb +156 -0
- data/lib/mtncloud/cli/commands/source_command.rb +30 -0
- data/lib/mtncloud/cli/commands/ssl_verification_command.rb +47 -0
- data/lib/mtncloud/cli/commands/storage_datastores.rb +457 -0
- data/lib/mtncloud/cli/commands/storage_providers_command.rb +1401 -0
- data/lib/mtncloud/cli/commands/storage_server_types.rb +45 -0
- data/lib/mtncloud/cli/commands/storage_servers.rb +116 -0
- data/lib/mtncloud/cli/commands/storage_volume_types.rb +45 -0
- data/lib/mtncloud/cli/commands/storage_volumes.rb +236 -0
- data/lib/mtncloud/cli/commands/subnets_command.rb +819 -0
- data/lib/mtncloud/cli/commands/support_bundles_command.rb +606 -0
- data/lib/mtncloud/cli/commands/systems.rb +1203 -0
- data/lib/mtncloud/cli/commands/tasks.rb +1391 -0
- data/lib/mtncloud/cli/commands/tee_command.rb +14 -0
- data/lib/mtncloud/cli/commands/tenants_command.rb +315 -0
- data/lib/mtncloud/cli/commands/tokens_command.rb +391 -0
- data/lib/mtncloud/cli/commands/update_command.rb +46 -0
- data/lib/mtncloud/cli/commands/usage_command.rb +203 -0
- data/lib/mtncloud/cli/commands/user_groups_command.rb +512 -0
- data/lib/mtncloud/cli/commands/user_settings_command.rb +849 -0
- data/lib/mtncloud/cli/commands/user_sources_command.rb +1065 -0
- data/lib/mtncloud/cli/commands/users.rb +897 -0
- data/lib/mtncloud/cli/commands/vdi_allocations_command.rb +159 -0
- data/lib/mtncloud/cli/commands/vdi_apps_command.rb +317 -0
- data/lib/mtncloud/cli/commands/vdi_command.rb +359 -0
- data/lib/mtncloud/cli/commands/vdi_gateways_command.rb +290 -0
- data/lib/mtncloud/cli/commands/vdi_pools_command.rb +574 -0
- data/lib/mtncloud/cli/commands/version_command.rb +38 -0
- data/lib/mtncloud/cli/commands/view.rb +107 -0
- data/lib/mtncloud/cli/commands/virtual_images.rb +1362 -0
- data/lib/mtncloud/cli/commands/virtual_switches_command.rb +336 -0
- data/lib/mtncloud/cli/commands/whitelabel_settings_command.rb +653 -0
- data/lib/mtncloud/cli/commands/whoami.rb +323 -0
- data/lib/mtncloud/cli/commands/wiki_command.rb +448 -0
- data/lib/mtncloud/cli/commands/workflows.rb +1022 -0
- data/lib/mtncloud/cli/credentials.rb +482 -0
- data/lib/mtncloud/cli/dot_file.rb +180 -0
- data/lib/mtncloud/cli/error_handler.rb +307 -0
- data/lib/mtncloud/cli/errors.rb +53 -0
- data/lib/mtncloud/cli/expression_parser.rb +153 -0
- data/lib/mtncloud/cli/mixins/accounts_helper.rb +484 -0
- data/lib/mtncloud/cli/mixins/affinity_helper.rb +118 -0
- data/lib/mtncloud/cli/mixins/backups_helper.rb +200 -0
- data/lib/mtncloud/cli/mixins/deployments_helper.rb +163 -0
- data/lib/mtncloud/cli/mixins/execution_request_helper.rb +50 -0
- data/lib/mtncloud/cli/mixins/infrastructure_helper.rb +966 -0
- data/lib/mtncloud/cli/mixins/jobs_helper.rb +202 -0
- data/lib/mtncloud/cli/mixins/library_helper.rb +539 -0
- data/lib/mtncloud/cli/mixins/load_balancers_helper.rb +176 -0
- data/lib/mtncloud/cli/mixins/logs_helper.rb +131 -0
- data/lib/mtncloud/cli/mixins/monitoring_helper.rb +876 -0
- data/lib/mtncloud/cli/mixins/networks_helper.rb +62 -0
- data/lib/mtncloud/cli/mixins/operations_helper.rb +41 -0
- data/lib/mtncloud/cli/mixins/option_source_helper.rb +254 -0
- data/lib/mtncloud/cli/mixins/print_helper.rb +1631 -0
- data/lib/mtncloud/cli/mixins/processes_helper.rb +286 -0
- data/lib/mtncloud/cli/mixins/prompt_helper.rb +136 -0
- data/lib/mtncloud/cli/mixins/provisioning_helper.rb +2963 -0
- data/lib/mtncloud/cli/mixins/remote_helper.rb +139 -0
- data/lib/mtncloud/cli/mixins/rest_command.rb +994 -0
- data/lib/mtncloud/cli/mixins/secondary_rest_command.rb +700 -0
- data/lib/mtncloud/cli/mixins/storage_servers_helper.rb +93 -0
- data/lib/mtncloud/cli/mixins/storage_volumes_helper.rb +76 -0
- data/lib/mtncloud/cli/mixins/vdi_helper.rb +246 -0
- data/lib/mtncloud/cli/mixins/whoami_helper.rb +73 -0
- data/lib/mtncloud/cli/option_parser.rb +127 -0
- data/lib/mtncloud/cli/option_types.rb +1622 -0
- data/lib/mtncloud/cli/version.rb +6 -0
- data/lib/mtncloud/cli.rb +105 -0
- data/lib/mtncloud/currency.rb +184 -0
- data/lib/mtncloud/ext/hash.rb +109 -0
- data/lib/mtncloud/ext/nil_class.rb +5 -0
- data/lib/mtncloud/ext/rest_client.rb +37 -0
- data/lib/mtncloud/ext/string.rb +66 -0
- data/lib/mtncloud/formatters.rb +511 -0
- data/lib/mtncloud/logging.rb +185 -0
- data/lib/mtncloud/morpkg.rb +119 -0
- data/lib/mtncloud/rest_client.rb +104 -0
- data/lib/mtncloud/routes.rb +304 -0
- data/lib/mtncloud/terminal.rb +528 -0
- data/lib/mtncloud/util.rb +29 -0
- data/lib/mtncloud.rb +5 -0
- data/mtncloud-cli.gemspec +38 -0
- data/test/api/affinity_groups_interface_test.rb +43 -0
- data/test/api/clients_interface_test.rb +23 -0
- data/test/api/clouds_interface_test.rb +67 -0
- data/test/api/containers_interface_test.rb +68 -0
- data/test/api/host_vm_groups_interface_test.rb +35 -0
- data/test/api/instances_interface_test.rb +22 -0
- data/test/api/network_routers_interface_test.rb +22 -0
- data/test/api/systems_interface_test.rb +26 -0
- data/test/api/whoami_interface_test.rb +14 -0
- data/test/branding_test.rb +160 -0
- data/test/cli/access_token_test.rb +36 -0
- data/test/cli/affinity_groups_cloud_cluster_scope_test.rb +270 -0
- data/test/cli/affinity_groups_cluster_scope_test.rb +171 -0
- data/test/cli/affinity_groups_test.rb +57 -0
- data/test/cli/affinity_groups_violations_scope_test.rb +141 -0
- data/test/cli/affinity_helper_test.rb +367 -0
- data/test/cli/auth_test.rb +88 -0
- data/test/cli/backups_test.rb +212 -0
- data/test/cli/cli_test.rb +48 -0
- data/test/cli/clients_test.rb +45 -0
- data/test/cli/clusters_uuid_test.rb +146 -0
- data/test/cli/containers_test.rb +92 -0
- data/test/cli/distributed_workers_test.rb +68 -0
- data/test/cli/help_test.rb +25 -0
- data/test/cli/host_vm_groups_cluster_scope_test.rb +187 -0
- data/test/cli/host_vm_groups_test.rb +63 -0
- data/test/cli/infrastructure_helper_cluster_resolver_test.rb +250 -0
- data/test/cli/instances_test.rb +37 -0
- data/test/cli/man_test.rb +14 -0
- data/test/cli/migrations_test.rb +39 -0
- data/test/cli/network_routers_test.rb +65 -0
- data/test/cli/remote_test.rb +89 -0
- data/test/cli/roles_test.rb +47 -0
- data/test/cli/shell_test.rb +81 -0
- data/test/cli/storage_volumes_test.rb +79 -0
- data/test/cli/systems_test.rb +206 -0
- data/test/cli/version_test.rb +23 -0
- data/test/cli/view_test.rb +55 -0
- data/test/cli/whoami_test.rb +17 -0
- data/test/mtncloud_test.rb +16 -0
- data/test/test_case.rb +342 -0
- data/test/test_config.rb +137 -0
- data/test/test_data_helper.rb +97 -0
- metadata +807 -0
|
@@ -0,0 +1,966 @@
|
|
|
1
|
+
require 'mtncloud/cli/mixins/print_helper'
|
|
2
|
+
require 'mtncloud/cli/option_types'
|
|
3
|
+
require 'mtncloud/rest_client'
|
|
4
|
+
# Mixin for MtnCloud::Cli command classes
|
|
5
|
+
# Provides common methods for infrastructure management
|
|
6
|
+
module MtnCloud::Cli::InfrastructureHelper
|
|
7
|
+
|
|
8
|
+
def self.included(klass)
|
|
9
|
+
klass.send :include, MtnCloud::Cli::PrintHelper
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def groups_interface
|
|
13
|
+
# @api_client.groups
|
|
14
|
+
raise "#{self.class} has not defined @groups_interface" if @groups_interface.nil?
|
|
15
|
+
@groups_interface
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def clouds_interface
|
|
19
|
+
# @api_client.clouds
|
|
20
|
+
raise "#{self.class} has not defined @clouds_interface" if @clouds_interface.nil?
|
|
21
|
+
@clouds_interface
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def clusters_interface
|
|
25
|
+
raise "#{self.class} has not defined @clusters_interface" if @clusters_interface.nil?
|
|
26
|
+
@clusters_interface
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def networks_interface
|
|
30
|
+
# @api_client.networks
|
|
31
|
+
raise "#{self.class} has not defined @networks_interface" if @networks_interface.nil?
|
|
32
|
+
@networks_interface
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def subnets_interface
|
|
36
|
+
# @api_client.subnets
|
|
37
|
+
raise "#{self.class} has not defined @subnets_interface" if @subnets_interface.nil?
|
|
38
|
+
@subnets_interface
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def network_groups_interface
|
|
42
|
+
# @api_client.network_groups
|
|
43
|
+
raise "#{self.class} has not defined @network_groups_interface" if @network_groups_interface.nil?
|
|
44
|
+
@network_groups_interface
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def resource_pool_groups_interface
|
|
48
|
+
# @api_client.resource_pool_groups
|
|
49
|
+
raise "#{self.class} has not defined @resource_pool_groups_interface" if @resource_pool_groups_interface.nil?
|
|
50
|
+
@resource_pool_groups_interface
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def resource_pools_interface
|
|
54
|
+
# @api_client.resource_pool_groups
|
|
55
|
+
raise "#{self.class} has not defined @cloud_resource_pools_interface" if @cloud_resource_pools_interface.nil?
|
|
56
|
+
@cloud_resource_pools_interface
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def network_types_interface
|
|
60
|
+
# @api_client.network_types
|
|
61
|
+
raise "#{self.class} has not defined @network_types_interface" if @network_types_interface.nil?
|
|
62
|
+
@network_types_interface
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def subnet_types_interface
|
|
66
|
+
# @api_client.subnet_types
|
|
67
|
+
raise "#{self.class} has not defined @subnet_types_interface" if @subnet_types_interface.nil?
|
|
68
|
+
@subnet_types_interface
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def find_group_by_name_or_id(val, include_tenants=true)
|
|
72
|
+
if val.to_s =~ /\A\d{1,}\Z/
|
|
73
|
+
return find_group_by_id(val)
|
|
74
|
+
else
|
|
75
|
+
return find_group_by_name(val, include_tenants)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def find_group_by_id(id)
|
|
80
|
+
begin
|
|
81
|
+
json_response = groups_interface.get(id.to_i)
|
|
82
|
+
return json_response['group']
|
|
83
|
+
rescue RestClient::Exception => e
|
|
84
|
+
if e.response && e.response.code == 404
|
|
85
|
+
print_red_alert "Group not found by id #{id}"
|
|
86
|
+
exit 1
|
|
87
|
+
else
|
|
88
|
+
raise e
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def find_group_by_name(name, include_tenants=false)
|
|
94
|
+
params = {name: name}
|
|
95
|
+
params['includeTenants'] = true if include_tenants
|
|
96
|
+
groups = groups_interface.list(params)['groups']
|
|
97
|
+
if groups.empty?
|
|
98
|
+
print_red_alert "Group not found by name #{name}"
|
|
99
|
+
exit 1
|
|
100
|
+
elsif groups.size > 1
|
|
101
|
+
print_red_alert "Multiple groups exist with the name '#{name}'"
|
|
102
|
+
print_error "\n"
|
|
103
|
+
puts_error as_pretty_table(groups, [:id, :name], {color:red})
|
|
104
|
+
print_red_alert "Try using ID instead"
|
|
105
|
+
print_error reset,"\n"
|
|
106
|
+
exit 1
|
|
107
|
+
end
|
|
108
|
+
return groups[0]
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def find_cloud_by_name_or_id(val, include_tenants=false)
|
|
112
|
+
if val.to_s =~ /\A\d{1,}\Z/
|
|
113
|
+
return find_cloud_by_id(val)
|
|
114
|
+
else
|
|
115
|
+
return find_cloud_by_name(val, include_tenants)
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def find_cloud_by_id(id)
|
|
120
|
+
json_results = clouds_interface.get(id.to_i)
|
|
121
|
+
if json_results['zone'].empty?
|
|
122
|
+
print_red_alert "Cloud not found by id #{id}"
|
|
123
|
+
exit 1
|
|
124
|
+
end
|
|
125
|
+
cloud = json_results['zone']
|
|
126
|
+
return cloud
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def find_cloud_by_name(name, include_tenants=false)
|
|
130
|
+
params = {name: name}
|
|
131
|
+
params['includeTenants'] = true if include_tenants
|
|
132
|
+
clouds = clouds_interface.list(params)['zones']
|
|
133
|
+
if clouds.empty?
|
|
134
|
+
print_red_alert "Cloud not found by name #{name}"
|
|
135
|
+
exit 1
|
|
136
|
+
elsif clouds.size > 1
|
|
137
|
+
print_red_alert "Multiple clouds exist with the name '#{name}'"
|
|
138
|
+
print_error "\n"
|
|
139
|
+
puts_error as_pretty_table(clouds, [:id, :name], {color:red})
|
|
140
|
+
print_red_alert "Try using ID instead"
|
|
141
|
+
print_error reset,"\n"
|
|
142
|
+
exit 1
|
|
143
|
+
end
|
|
144
|
+
return clouds[0]
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def get_available_cloud_types(refresh=false, params = {})
|
|
148
|
+
if !@available_cloud_types || refresh
|
|
149
|
+
@available_cloud_types = clouds_interface.cloud_types({max:1000}.deep_merge(params))['zoneTypes']
|
|
150
|
+
end
|
|
151
|
+
return @available_cloud_types
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def cloud_type_for_name_or_id(val)
|
|
155
|
+
if val.to_s =~ /\A\d{1,}\Z/
|
|
156
|
+
return cloud_type_for_id(val)
|
|
157
|
+
else
|
|
158
|
+
return cloud_type_for_name(val)
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def cloud_type_for_id(id)
|
|
163
|
+
return get_available_cloud_types().find { |z| z['id'].to_i == id.to_i}
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def cloud_type_for_name(name)
|
|
167
|
+
types = get_available_cloud_types(true, {'name' => name})
|
|
168
|
+
return types.find { |z| z['code'].downcase == name.downcase} || types.find { |z| z['name'].downcase == name.downcase}
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
# Networks
|
|
173
|
+
|
|
174
|
+
def find_network_by_name_or_id(val, include_tenants=false)
|
|
175
|
+
if val.to_s =~ /\A\d{1,}\Z/
|
|
176
|
+
return find_network_by_id(val)
|
|
177
|
+
else
|
|
178
|
+
return find_network_by_name(val, include_tenants)
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def find_network_by_id(id)
|
|
183
|
+
begin
|
|
184
|
+
json_response = networks_interface.get(id.to_i)
|
|
185
|
+
return json_response['network']
|
|
186
|
+
rescue RestClient::Exception => e
|
|
187
|
+
if e.response && e.response.code == 404
|
|
188
|
+
print_red_alert "Network not found by id #{id}"
|
|
189
|
+
return nil
|
|
190
|
+
else
|
|
191
|
+
raise e
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
def find_network_by_name(name, include_tenants=false)
|
|
197
|
+
params = {name: name.to_s}
|
|
198
|
+
params['includeTenants'] = true if include_tenants
|
|
199
|
+
json_response = networks_interface.list(params)
|
|
200
|
+
networks = json_response['networks']
|
|
201
|
+
if networks.empty?
|
|
202
|
+
print_red_alert "Network not found by name #{name}"
|
|
203
|
+
return nil
|
|
204
|
+
elsif networks.size > 1
|
|
205
|
+
print_red_alert "#{networks.size} networks found by name #{name}"
|
|
206
|
+
rows = networks.collect do |it|
|
|
207
|
+
{id: it['id'], name: it['name']}
|
|
208
|
+
end
|
|
209
|
+
puts as_pretty_table(rows, [:id, :name], {color:red})
|
|
210
|
+
return nil
|
|
211
|
+
else
|
|
212
|
+
network = networks[0]
|
|
213
|
+
# merge in tenants map
|
|
214
|
+
if json_response['tenants'] && json_response['tenants'][network['id']]
|
|
215
|
+
network['tenants'] = json_response['tenants'][network['id']]
|
|
216
|
+
end
|
|
217
|
+
return network
|
|
218
|
+
end
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
def find_network_type_by_name_or_id(val)
|
|
222
|
+
if val.to_s =~ /\A\d{1,}\Z/
|
|
223
|
+
return find_network_type_by_id(val)
|
|
224
|
+
else
|
|
225
|
+
return find_network_type_by_name(val)
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
def find_network_type_by_id(id)
|
|
230
|
+
begin
|
|
231
|
+
json_response = network_types_interface.get(id.to_i)
|
|
232
|
+
return json_response['networkType']
|
|
233
|
+
rescue RestClient::Exception => e
|
|
234
|
+
if e.response && e.response.code == 404
|
|
235
|
+
print_red_alert "Network Type not found by id #{id}"
|
|
236
|
+
return nil
|
|
237
|
+
else
|
|
238
|
+
raise e
|
|
239
|
+
end
|
|
240
|
+
end
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
def find_network_type_by_name(name)
|
|
244
|
+
json_response = network_types_interface.list({name: name.to_s})
|
|
245
|
+
network_types = json_response['networkTypes']
|
|
246
|
+
if network_types.empty?
|
|
247
|
+
print_red_alert "Network Type not found by name #{name}"
|
|
248
|
+
return network_types
|
|
249
|
+
elsif network_types.size > 1
|
|
250
|
+
print_red_alert "#{network_types.size} network types found by name #{name}"
|
|
251
|
+
rows = network_types.collect do |it|
|
|
252
|
+
{id: it['id'], name: it['name']}
|
|
253
|
+
end
|
|
254
|
+
puts as_pretty_table(rows, [:id, :name], {color:red})
|
|
255
|
+
return nil
|
|
256
|
+
else
|
|
257
|
+
return network_types[0]
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
def find_subnet_by_name_or_id(val)
|
|
262
|
+
if val.to_s =~ /\A\d{1,}\Z/
|
|
263
|
+
return find_subnet_by_id(val)
|
|
264
|
+
else
|
|
265
|
+
return find_subnet_by_name(val)
|
|
266
|
+
end
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
def find_subnet_by_id(id)
|
|
270
|
+
begin
|
|
271
|
+
json_response = subnets_interface.get(id.to_i)
|
|
272
|
+
return json_response['subnet']
|
|
273
|
+
rescue RestClient::Exception => e
|
|
274
|
+
if e.response && e.response.code == 404
|
|
275
|
+
print_red_alert "Subnet not found by id #{id}"
|
|
276
|
+
return nil
|
|
277
|
+
else
|
|
278
|
+
raise e
|
|
279
|
+
end
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
def find_subnet_by_name(name)
|
|
284
|
+
json_response = subnets_interface.list({name: name.to_s})
|
|
285
|
+
subnets = json_response['subnets']
|
|
286
|
+
if subnets.empty?
|
|
287
|
+
print_red_alert "Subnet not found by name #{name}"
|
|
288
|
+
return nil
|
|
289
|
+
elsif subnets.size > 1
|
|
290
|
+
print_red_alert "#{subnets.size} subnets found by name #{name}"
|
|
291
|
+
rows = subnets.collect do |it|
|
|
292
|
+
{id: it['id'], name: it['name']}
|
|
293
|
+
end
|
|
294
|
+
puts as_pretty_table(rows, [:id, :name], {color:red})
|
|
295
|
+
return nil
|
|
296
|
+
else
|
|
297
|
+
return subnets[0]
|
|
298
|
+
end
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
def find_subnet_type_by_name_or_id(val)
|
|
302
|
+
if val.to_s =~ /\A\d{1,}\Z/
|
|
303
|
+
return find_subnet_type_by_id(val)
|
|
304
|
+
else
|
|
305
|
+
return find_subnet_type_by_name(val)
|
|
306
|
+
end
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
def find_subnet_type_by_id(id)
|
|
310
|
+
begin
|
|
311
|
+
json_response = subnet_types_interface.get(id.to_i)
|
|
312
|
+
return json_response['subnetType']
|
|
313
|
+
rescue RestClient::Exception => e
|
|
314
|
+
if e.response && e.response.code == 404
|
|
315
|
+
print_red_alert "Subnet Type not found by id #{id}"
|
|
316
|
+
return nil
|
|
317
|
+
else
|
|
318
|
+
raise e
|
|
319
|
+
end
|
|
320
|
+
end
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
def find_subnet_type_by_name(name)
|
|
324
|
+
json_response = subnet_types_interface.list({name: name.to_s})
|
|
325
|
+
subnet_types = json_response['subnetTypes']
|
|
326
|
+
if subnet_types.empty?
|
|
327
|
+
print_red_alert "Subnet Type not found by name #{name}"
|
|
328
|
+
return subnet_types
|
|
329
|
+
elsif subnet_types.size > 1
|
|
330
|
+
print_red_alert "#{subnet_types.size} subnet types found by name #{name}"
|
|
331
|
+
rows = subnet_types.collect do |it|
|
|
332
|
+
{id: it['id'], name: it['name']}
|
|
333
|
+
end
|
|
334
|
+
puts as_pretty_table(rows, [:id, :name], {color:red})
|
|
335
|
+
return nil
|
|
336
|
+
else
|
|
337
|
+
return subnet_types[0]
|
|
338
|
+
end
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
def find_network_group_by_name_or_id(val)
|
|
342
|
+
if val.to_s =~ /\A\d{1,}\Z/
|
|
343
|
+
return find_network_group_by_id(val)
|
|
344
|
+
else
|
|
345
|
+
return find_network_group_by_name(val)
|
|
346
|
+
end
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
def find_network_group_by_id(id)
|
|
350
|
+
begin
|
|
351
|
+
json_response = network_groups_interface.get(id.to_i)
|
|
352
|
+
return json_response['networkGroup']
|
|
353
|
+
rescue RestClient::Exception => e
|
|
354
|
+
if e.response && e.response.code == 404
|
|
355
|
+
print_red_alert "Network Group not found by id #{id}"
|
|
356
|
+
return nil
|
|
357
|
+
else
|
|
358
|
+
raise e
|
|
359
|
+
end
|
|
360
|
+
end
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
def find_network_group_by_name(name)
|
|
364
|
+
json_response = network_groups_interface.list({name: name.to_s})
|
|
365
|
+
network_groups = json_response['networkGroups']
|
|
366
|
+
if network_groups.empty?
|
|
367
|
+
print_red_alert "Network Group not found by name #{name}"
|
|
368
|
+
return nil
|
|
369
|
+
elsif network_groups.size > 1
|
|
370
|
+
print_red_alert "#{network_groups.size} network groups found by name #{name}"
|
|
371
|
+
# print_networks_table(networks, {color: red})
|
|
372
|
+
rows = network_groups.collect do |it|
|
|
373
|
+
{id: it['id'], name: it['name']}
|
|
374
|
+
end
|
|
375
|
+
puts as_pretty_table(rows, [:id, :name], {color:red})
|
|
376
|
+
return nil
|
|
377
|
+
else
|
|
378
|
+
return network_groups[0]
|
|
379
|
+
end
|
|
380
|
+
end
|
|
381
|
+
|
|
382
|
+
def find_resource_pool_by_name_or_id(val)
|
|
383
|
+
if val.to_s =~ /\A\d{1,}\Z/
|
|
384
|
+
return find_resource_pool_by_id(val)
|
|
385
|
+
else
|
|
386
|
+
return find_resource_pool_by_name(val)
|
|
387
|
+
end
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
def find_resource_pool_by_id(id)
|
|
391
|
+
begin
|
|
392
|
+
json_response = resource_pools_interface.get_without_cloud(id.to_i)
|
|
393
|
+
return json_response['resourcePool']
|
|
394
|
+
rescue RestClient::Exception => e
|
|
395
|
+
if e.response && e.response.code == 404
|
|
396
|
+
print_red_alert "Resource Pool not found by id #{id}"
|
|
397
|
+
return nil
|
|
398
|
+
else
|
|
399
|
+
raise e
|
|
400
|
+
end
|
|
401
|
+
end
|
|
402
|
+
end
|
|
403
|
+
|
|
404
|
+
def find_resource_pool_by_name(name)
|
|
405
|
+
json_response = resource_pools_interface.list_without_cloud({name: name.to_s})
|
|
406
|
+
resource_pools = json_response['resourcePools']
|
|
407
|
+
if resource_pools.empty?
|
|
408
|
+
print_red_alert "Resource Pool not found by name #{name}"
|
|
409
|
+
return nil
|
|
410
|
+
elsif resource_pools.size > 1
|
|
411
|
+
print_red_alert "#{resource_pools.size} resource pools found by name #{name}"
|
|
412
|
+
rows = resource_pools.collect do |it|
|
|
413
|
+
{id: it['id'], name: it['name']}
|
|
414
|
+
end
|
|
415
|
+
puts as_pretty_table(rows, [:id, :name], {color:red})
|
|
416
|
+
return nil
|
|
417
|
+
else
|
|
418
|
+
return resource_pools[0]
|
|
419
|
+
end
|
|
420
|
+
end
|
|
421
|
+
|
|
422
|
+
# Resolve a cloud-owned vSphere cluster: a ComputeZonePool with type='Cluster'
|
|
423
|
+
# that belongs to the given cloud. This is distinct from a MTN Cloud managed
|
|
424
|
+
# cluster (ComputeServerGroup, resolved via ClustersInterface / /api/clusters).
|
|
425
|
+
#
|
|
426
|
+
# MORPH-17279: --cloud CLOUD --cluster CLUSTER must resolve CLUSTER within
|
|
427
|
+
# CLOUD's own resource pools, not the top-level managed-cluster namespace.
|
|
428
|
+
# `cloud` is the already-resolved cloud Hash (from find_cloud_by_name_or_id).
|
|
429
|
+
def find_resource_pool_cluster_by_name_or_id(cloud, val)
|
|
430
|
+
if val.to_s =~ /\A\d{1,}\Z/
|
|
431
|
+
return find_resource_pool_cluster_by_id(cloud, val)
|
|
432
|
+
else
|
|
433
|
+
return find_resource_pool_cluster_by_name(cloud, val)
|
|
434
|
+
end
|
|
435
|
+
end
|
|
436
|
+
|
|
437
|
+
def find_resource_pool_cluster_by_id(cloud, id)
|
|
438
|
+
begin
|
|
439
|
+
# Scoped to the cloud so the server itself verifies pool ownership --
|
|
440
|
+
# ZoneResourcePoolsController#show 404s when the pool's zone does not
|
|
441
|
+
# match the requested cloud.
|
|
442
|
+
json_response = resource_pools_interface.get(cloud['id'], id.to_i)
|
|
443
|
+
rescue RestClient::Exception => e
|
|
444
|
+
if e.response && e.response.code == 404
|
|
445
|
+
print_red_alert "Cluster not found by id #{id} in cloud '#{cloud['name']}'"
|
|
446
|
+
return nil
|
|
447
|
+
else
|
|
448
|
+
raise e
|
|
449
|
+
end
|
|
450
|
+
end
|
|
451
|
+
resource_pool = json_response['resourcePool']
|
|
452
|
+
if resource_pool.nil?
|
|
453
|
+
print_red_alert "Cluster not found by id #{id} in cloud '#{cloud['name']}'"
|
|
454
|
+
return nil
|
|
455
|
+
end
|
|
456
|
+
if resource_pool['type'].to_s != 'Cluster'
|
|
457
|
+
print_red_alert "Resource pool #{id} in cloud '#{cloud['name']}' is a '#{resource_pool['type'] || 'unknown'}' resource pool, not a Cluster"
|
|
458
|
+
return nil
|
|
459
|
+
end
|
|
460
|
+
return resource_pool
|
|
461
|
+
end
|
|
462
|
+
|
|
463
|
+
def find_resource_pool_cluster_by_name(cloud, name)
|
|
464
|
+
json_response = resource_pools_interface.list(cloud['id'], {name: name.to_s, type: 'Cluster'})
|
|
465
|
+
# The cloud-scoped resource-pools endpoint returns a pool *tree*, backfilling
|
|
466
|
+
# ancestor folder pools so the hierarchy renders correctly. Ancestors do not
|
|
467
|
+
# satisfy our name/type filter, so re-filter here rather than trusting the
|
|
468
|
+
# raw result size for ambiguity detection.
|
|
469
|
+
resource_pools = (json_response['resourcePools'] || []).select do |it|
|
|
470
|
+
it['type'].to_s == 'Cluster' && (it['name'].to_s == name.to_s || it['displayName'].to_s == name.to_s)
|
|
471
|
+
end
|
|
472
|
+
if resource_pools.empty?
|
|
473
|
+
print_red_alert "Cluster not found by name '#{name}' in cloud '#{cloud['name']}'.\n" \
|
|
474
|
+
"To look up an MTN Cloud managed cluster instead, use --cluster '#{name}' without --cloud."
|
|
475
|
+
return nil
|
|
476
|
+
elsif resource_pools.size > 1
|
|
477
|
+
print_red_alert "#{resource_pools.size} clusters found by name '#{name}' in cloud '#{cloud['name']}'. Use a numeric cluster id instead."
|
|
478
|
+
rows = resource_pools.collect do |it|
|
|
479
|
+
{id: it['id'], name: it['name']}
|
|
480
|
+
end
|
|
481
|
+
puts as_pretty_table(rows, [:id, :name], {color:red})
|
|
482
|
+
return nil
|
|
483
|
+
else
|
|
484
|
+
return resource_pools[0]
|
|
485
|
+
end
|
|
486
|
+
end
|
|
487
|
+
|
|
488
|
+
def find_managed_cluster_by_name_or_id(val, report_not_found=true)
|
|
489
|
+
cluster = nil
|
|
490
|
+
if val.to_s =~ /\A\d{1,}\Z/
|
|
491
|
+
begin
|
|
492
|
+
cluster = clusters_interface.get(val.to_i)['cluster']
|
|
493
|
+
rescue RestClient::Exception => e
|
|
494
|
+
raise e unless e.response && e.response.code == 404
|
|
495
|
+
end
|
|
496
|
+
else
|
|
497
|
+
clusters = clusters_interface.list({name: val})['clusters'] || []
|
|
498
|
+
if clusters.size > 1
|
|
499
|
+
print_red_alert "#{clusters.size} managed clusters found by name '#{val}'. Use a numeric cluster id instead."
|
|
500
|
+
rows = clusters.collect {|it| {id: it['id'], name: it['name']} }
|
|
501
|
+
puts as_pretty_table(rows, [:id, :name], {color:red})
|
|
502
|
+
return nil
|
|
503
|
+
end
|
|
504
|
+
cluster = clusters[0]
|
|
505
|
+
end
|
|
506
|
+
if cluster.nil? && report_not_found
|
|
507
|
+
print_red_alert "Managed cluster not found by name or id '#{val}'.\n" \
|
|
508
|
+
"If '#{val}' is a vSphere cluster owned by a cloud, use --cloud CLOUD --cluster #{val} instead."
|
|
509
|
+
end
|
|
510
|
+
cluster
|
|
511
|
+
end
|
|
512
|
+
|
|
513
|
+
def find_cluster_list_scope_by_name_or_id(val)
|
|
514
|
+
if val.to_s =~ /\A\d{1,}\Z/
|
|
515
|
+
cluster = find_managed_cluster_by_name_or_id(val)
|
|
516
|
+
return cluster ? {type: :managed_cluster, cluster: cluster} : nil
|
|
517
|
+
end
|
|
518
|
+
|
|
519
|
+
managed_clusters = clusters_interface.list({name: val})['clusters'] || []
|
|
520
|
+
if managed_clusters.size > 1
|
|
521
|
+
print_red_alert "#{managed_clusters.size} managed clusters found by name '#{val}'. Use a numeric cluster id instead."
|
|
522
|
+
rows = managed_clusters.collect {|it| {id: it['id'], name: it['name']} }
|
|
523
|
+
puts as_pretty_table(rows, [:id, :name], {color:red})
|
|
524
|
+
return nil
|
|
525
|
+
elsif managed_clusters.size == 1
|
|
526
|
+
return {type: :managed_cluster, cluster: managed_clusters[0]}
|
|
527
|
+
end
|
|
528
|
+
|
|
529
|
+
json_response = resource_pools_interface.list_without_cloud({name: val.to_s, type: 'Cluster', max: 1000})
|
|
530
|
+
resource_pools = (json_response['resourcePools'] || []).select do |it|
|
|
531
|
+
it['type'].to_s == 'Cluster' && (it['name'].to_s == val.to_s || it['displayName'].to_s == val.to_s)
|
|
532
|
+
end
|
|
533
|
+
if resource_pools.empty?
|
|
534
|
+
print_red_alert "No managed or vSphere cluster found by name '#{val}'."
|
|
535
|
+
return nil
|
|
536
|
+
elsif resource_pools.size > 1
|
|
537
|
+
print_red_alert "#{resource_pools.size} vSphere clusters found by name '#{val}'. Use --cloud CLOUD --cluster #{val} to disambiguate."
|
|
538
|
+
rows = resource_pools.collect do |it|
|
|
539
|
+
{id: it['id'], name: it['name'], cloud: it['zone'] && it['zone']['name']}
|
|
540
|
+
end
|
|
541
|
+
puts as_pretty_table(rows, [:id, :name, :cloud], {color:red})
|
|
542
|
+
return nil
|
|
543
|
+
end
|
|
544
|
+
|
|
545
|
+
resource_pool = resource_pools[0]
|
|
546
|
+
cloud = resource_pool['zone']
|
|
547
|
+
if cloud.nil? || cloud['id'].nil?
|
|
548
|
+
print_red_alert "vSphere cluster '#{val}' does not include its owning cloud."
|
|
549
|
+
return nil
|
|
550
|
+
end
|
|
551
|
+
{type: :cloud_pool, cloud: cloud, pool: resource_pool}
|
|
552
|
+
end
|
|
553
|
+
|
|
554
|
+
def find_resource_pool_group_by_name_or_id(val)
|
|
555
|
+
if val.to_s =~ /\A\d{1,}\Z/
|
|
556
|
+
return find_resource_pool_group_by_id(val)
|
|
557
|
+
else
|
|
558
|
+
return find_resource_pool_group_by_name(val)
|
|
559
|
+
end
|
|
560
|
+
end
|
|
561
|
+
|
|
562
|
+
def find_resource_pool_group_by_id(id)
|
|
563
|
+
begin
|
|
564
|
+
json_response = resource_pool_groups_interface.get(id.to_i)
|
|
565
|
+
return json_response['resourcePoolGroup']
|
|
566
|
+
rescue RestClient::Exception => e
|
|
567
|
+
if e.response && e.response.code == 404
|
|
568
|
+
print_red_alert "Resource Pool Group not found by id #{id}"
|
|
569
|
+
return nil
|
|
570
|
+
else
|
|
571
|
+
raise e
|
|
572
|
+
end
|
|
573
|
+
end
|
|
574
|
+
end
|
|
575
|
+
|
|
576
|
+
def find_resource_pool_group_by_name(name)
|
|
577
|
+
json_response = resource_pool_groups_interface.list({name: name.to_s})
|
|
578
|
+
resource_pool_groups = json_response['resourcePoolGroups']
|
|
579
|
+
if resource_pool_groups.empty?
|
|
580
|
+
print_red_alert "Resource Pool Group not found by name #{name}"
|
|
581
|
+
return nil
|
|
582
|
+
elsif resource_pool_groups.size > 1
|
|
583
|
+
print_red_alert "#{resource_pool_groups.size} resource pool groups found by name #{name}"
|
|
584
|
+
rows = resource_pool_groups.collect do |it|
|
|
585
|
+
{id: it['id'], name: it['name']}
|
|
586
|
+
end
|
|
587
|
+
puts as_pretty_table(rows, [:id, :name], {color:red})
|
|
588
|
+
return nil
|
|
589
|
+
else
|
|
590
|
+
return resource_pool_groups[0]
|
|
591
|
+
end
|
|
592
|
+
end
|
|
593
|
+
|
|
594
|
+
def prompt_for_network(network_id, options={}, required=true, field_name='network', field_label='Network')
|
|
595
|
+
# Prompt for a Network, text input that searches by name or id
|
|
596
|
+
network = nil
|
|
597
|
+
still_prompting = true
|
|
598
|
+
while still_prompting do
|
|
599
|
+
v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => field_name, 'type' => 'text', 'fieldLabel' => field_label, 'required' => required, 'description' => 'Network name or ID.'}], network_id ? {(field_name) => network_id} : {})
|
|
600
|
+
network_id = v_prompt['network']
|
|
601
|
+
begin
|
|
602
|
+
network = find_network_by_name_or_id(network_id)
|
|
603
|
+
rescue SystemExit => cmdexit
|
|
604
|
+
end
|
|
605
|
+
if options[:no_prompt]
|
|
606
|
+
still_prompting = false
|
|
607
|
+
else
|
|
608
|
+
still_prompting = network ? false : true
|
|
609
|
+
end
|
|
610
|
+
if still_prompting
|
|
611
|
+
network_id = nil
|
|
612
|
+
end
|
|
613
|
+
end
|
|
614
|
+
return {success:!!network, network: network}
|
|
615
|
+
end
|
|
616
|
+
|
|
617
|
+
def prompt_for_networks(params, options={}, api_client=nil, api_params={})
|
|
618
|
+
# Networks
|
|
619
|
+
network_list = nil
|
|
620
|
+
network_ids = nil
|
|
621
|
+
still_prompting = true
|
|
622
|
+
if params['networks'].nil?
|
|
623
|
+
still_prompting = true
|
|
624
|
+
while still_prompting do
|
|
625
|
+
v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'networks', 'type' => 'text', 'fieldLabel' => 'Networks', 'required' => false, 'description' => 'Networks to include, comma separated list of names or IDs.'}], options[:options])
|
|
626
|
+
unless v_prompt['networks'].to_s.empty?
|
|
627
|
+
network_list = v_prompt['networks'].split(",").collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
|
|
628
|
+
end
|
|
629
|
+
network_ids = []
|
|
630
|
+
bad_ids = []
|
|
631
|
+
if network_list && network_list.size > 0
|
|
632
|
+
network_list.each do |it|
|
|
633
|
+
found_network = nil
|
|
634
|
+
begin
|
|
635
|
+
found_network = find_network_by_name_or_id(it)
|
|
636
|
+
rescue SystemExit => cmdexit
|
|
637
|
+
end
|
|
638
|
+
if found_network
|
|
639
|
+
network_ids << found_network['id']
|
|
640
|
+
else
|
|
641
|
+
bad_ids << it
|
|
642
|
+
end
|
|
643
|
+
end
|
|
644
|
+
end
|
|
645
|
+
still_prompting = bad_ids.empty? ? false : true
|
|
646
|
+
end
|
|
647
|
+
else
|
|
648
|
+
network_list = params['networks']
|
|
649
|
+
still_prompting = false
|
|
650
|
+
network_ids = []
|
|
651
|
+
bad_ids = []
|
|
652
|
+
if network_list && network_list.size > 0
|
|
653
|
+
network_list.each do |it|
|
|
654
|
+
found_network = nil
|
|
655
|
+
begin
|
|
656
|
+
found_network = find_network_by_name_or_id(it)
|
|
657
|
+
rescue SystemExit => cmdexit
|
|
658
|
+
end
|
|
659
|
+
if found_network
|
|
660
|
+
network_ids << found_network['id']
|
|
661
|
+
else
|
|
662
|
+
bad_ids << it
|
|
663
|
+
end
|
|
664
|
+
end
|
|
665
|
+
end
|
|
666
|
+
if !bad_ids.empty?
|
|
667
|
+
return {success:false, msg:"Networks not found: #{bad_ids}"}
|
|
668
|
+
end
|
|
669
|
+
end
|
|
670
|
+
return {success:true, data: network_ids}
|
|
671
|
+
end
|
|
672
|
+
|
|
673
|
+
def prompt_for_subnets(params, options={}, api_client=nil, api_params={})
|
|
674
|
+
# todo: make this a generic method now please.
|
|
675
|
+
# Subnets
|
|
676
|
+
record_list = nil
|
|
677
|
+
record_ids = nil
|
|
678
|
+
still_prompting = true
|
|
679
|
+
if params['subnets'].nil?
|
|
680
|
+
still_prompting = true
|
|
681
|
+
while still_prompting do
|
|
682
|
+
v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'subnets', 'type' => 'text', 'fieldLabel' => 'Subnets', 'required' => false, 'description' => 'Subnets to include, comma separated list of names or IDs.'}], options[:options])
|
|
683
|
+
unless v_prompt['subnets'].to_s.empty?
|
|
684
|
+
record_list = v_prompt['subnets'].split(",").collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
|
|
685
|
+
end
|
|
686
|
+
record_ids = []
|
|
687
|
+
bad_ids = []
|
|
688
|
+
if record_list && record_list.size > 0
|
|
689
|
+
record_list.each do |it|
|
|
690
|
+
found_record = nil
|
|
691
|
+
begin
|
|
692
|
+
found_record = find_subnet_by_name_or_id(it)
|
|
693
|
+
rescue SystemExit => cmdexit
|
|
694
|
+
end
|
|
695
|
+
if found_record
|
|
696
|
+
record_ids << found_record['id']
|
|
697
|
+
else
|
|
698
|
+
bad_ids << it
|
|
699
|
+
end
|
|
700
|
+
end
|
|
701
|
+
end
|
|
702
|
+
still_prompting = bad_ids.empty? ? false : true
|
|
703
|
+
end
|
|
704
|
+
else
|
|
705
|
+
record_list = params['subnets']
|
|
706
|
+
still_prompting = false
|
|
707
|
+
record_ids = []
|
|
708
|
+
bad_ids = []
|
|
709
|
+
if record_list && record_list.size > 0
|
|
710
|
+
record_list.each do |it|
|
|
711
|
+
found_subnet = nil
|
|
712
|
+
begin
|
|
713
|
+
found_subnet = find_subnet_by_name_or_id(it)
|
|
714
|
+
rescue SystemExit => cmdexit
|
|
715
|
+
end
|
|
716
|
+
if found_subnet
|
|
717
|
+
record_ids << found_subnet['id']
|
|
718
|
+
else
|
|
719
|
+
bad_ids << it
|
|
720
|
+
end
|
|
721
|
+
end
|
|
722
|
+
end
|
|
723
|
+
if !bad_ids.empty?
|
|
724
|
+
return {success:false, msg:"Subnets not found: #{bad_ids}"}
|
|
725
|
+
end
|
|
726
|
+
end
|
|
727
|
+
return {success:true, data: record_ids}
|
|
728
|
+
end
|
|
729
|
+
|
|
730
|
+
def prompt_for_pools(params, options={}, api_client=nil, api_params={})
|
|
731
|
+
# Pools
|
|
732
|
+
pool_list = nil
|
|
733
|
+
pool_ids = nil
|
|
734
|
+
still_prompting = true
|
|
735
|
+
if params['pools'].nil?
|
|
736
|
+
still_prompting = true
|
|
737
|
+
while still_prompting do
|
|
738
|
+
v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'pools', 'type' => 'text', 'fieldLabel' => 'Pools', 'required' => false, 'description' => 'Pools to include, comma separated list of names or IDs.'}], options[:options])
|
|
739
|
+
unless v_prompt['pools'].to_s.empty?
|
|
740
|
+
pool_list = v_prompt['pools'].split(",").collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
|
|
741
|
+
end
|
|
742
|
+
pool_ids = []
|
|
743
|
+
bad_ids = []
|
|
744
|
+
if pool_list && pool_list.size > 0
|
|
745
|
+
pool_list.each do |it|
|
|
746
|
+
found_pool = nil
|
|
747
|
+
begin
|
|
748
|
+
found_pool = find_resource_pool_by_name_or_id(it)
|
|
749
|
+
rescue SystemExit => cmdexit
|
|
750
|
+
end
|
|
751
|
+
if found_pool
|
|
752
|
+
pool_ids << found_pool['id']
|
|
753
|
+
else
|
|
754
|
+
bad_ids << it
|
|
755
|
+
end
|
|
756
|
+
end
|
|
757
|
+
end
|
|
758
|
+
still_prompting = bad_ids.empty? ? false : true
|
|
759
|
+
end
|
|
760
|
+
else
|
|
761
|
+
pool_list = params['pools']
|
|
762
|
+
still_prompting = false
|
|
763
|
+
pool_ids = []
|
|
764
|
+
bad_ids = []
|
|
765
|
+
if pool_list && pool_list.size > 0
|
|
766
|
+
pool_list.each do |it|
|
|
767
|
+
found_pool = nil
|
|
768
|
+
begin
|
|
769
|
+
found_pool = find_resource_pool_by_name_or_id(it)
|
|
770
|
+
rescue SystemExit => cmdexit
|
|
771
|
+
end
|
|
772
|
+
if found_pool
|
|
773
|
+
pool_ids << found_pool['id']
|
|
774
|
+
else
|
|
775
|
+
bad_ids << it
|
|
776
|
+
end
|
|
777
|
+
end
|
|
778
|
+
end
|
|
779
|
+
if !bad_ids.empty?
|
|
780
|
+
return {success:false, msg:"Pools not found: #{bad_ids}"}
|
|
781
|
+
end
|
|
782
|
+
end
|
|
783
|
+
return {success:true, data: pool_ids}
|
|
784
|
+
end
|
|
785
|
+
|
|
786
|
+
def network_pool_server_list_column_definitions(options)
|
|
787
|
+
{
|
|
788
|
+
"ID" => 'id',
|
|
789
|
+
"Name" => lambda {|it| it['name'] },
|
|
790
|
+
"Type" => lambda {|it| it['type'] ? it['type']['name'] : '' },
|
|
791
|
+
"URL" => lambda {|it| it['serviceUrl'] },
|
|
792
|
+
"Enabled" => lambda {|it| format_boolean(it['enabled']) },
|
|
793
|
+
"Status" => lambda {|it| format_network_pool_server_status(it) },
|
|
794
|
+
"Date Created" => lambda {|it| format_local_dt(it['dateCreated']) },
|
|
795
|
+
"Last Updated" => lambda {|it| format_local_dt(it['lastUpdated']) },
|
|
796
|
+
}
|
|
797
|
+
end
|
|
798
|
+
|
|
799
|
+
def network_pool_server_column_definitions(options)
|
|
800
|
+
{
|
|
801
|
+
"ID" => 'id',
|
|
802
|
+
"Name" => lambda {|it| it['name'] },
|
|
803
|
+
"Type" => lambda {|it| it['type'] ? it['type']['name'] : '' },
|
|
804
|
+
"URL" => lambda {|it| it['serviceUrl'] },
|
|
805
|
+
"App ID" => lambda {|it| it['config'] ? it['config']['appId'] : nil },
|
|
806
|
+
"Credentials" => lambda {|it| it['credential'] ? (it['credential']['type'] == 'local' ? '(Local)' : it['credential']['name']) : nil },
|
|
807
|
+
"Username" => lambda {|it| it['serviceUsername'] },
|
|
808
|
+
"Password" => lambda {|it| it['servicePassword'] },
|
|
809
|
+
"Throttle Rate" => lambda {|it| it['serviceThrottleRate'] },
|
|
810
|
+
"Disable SSL SNI" => lambda {|it| format_boolean it['ignoreSsl'] },
|
|
811
|
+
"Inventory Existing" => lambda {|it| format_boolean(it['config'] ? it['config']['inventoryExisting'] : nil) },
|
|
812
|
+
"IP Mode" => lambda {|it| it['serviceMode'] },
|
|
813
|
+
"Network Filter" => lambda {|it| it['networkFilter'] },
|
|
814
|
+
"Zone Filter" => lambda {|it| it['zoneFilter'] },
|
|
815
|
+
"Tenant Match" => lambda {|it| it['tenantMatch'] },
|
|
816
|
+
"Extra Attributes" => lambda {|it| it['config'] ? it['config']['extraAttributes'] : nil },
|
|
817
|
+
"Enabled" => lambda {|it| format_boolean(it['enabled']) },
|
|
818
|
+
"Status" => lambda {|it| format_network_pool_server_status(it) },
|
|
819
|
+
"Date Created" => lambda {|it| format_local_dt(it['dateCreated']) },
|
|
820
|
+
"Last Updated" => lambda {|it| format_local_dt(it['lastUpdated']) },
|
|
821
|
+
}
|
|
822
|
+
end
|
|
823
|
+
|
|
824
|
+
def format_network_pool_server_status(network_pool_server, return_color=cyan)
|
|
825
|
+
out = ""
|
|
826
|
+
status_string = network_pool_server['status']
|
|
827
|
+
if status_string.nil? || status_string.empty? || status_string == "unknown"
|
|
828
|
+
out << "#{white}UNKNOWN#{network_pool_server['statusMessage'] ? "#{return_color} - #{network_pool_server['statusMessage']}" : ''}#{return_color}"
|
|
829
|
+
# elsif network_pool_server['enabled'] == false
|
|
830
|
+
# out << "#{red}DISABLED#{network_pool_server['statusMessage'] ? "#{return_color} - #{network_pool_server['statusMessage']}" : ''}#{return_color}"
|
|
831
|
+
elsif status_string == 'ok'
|
|
832
|
+
out << "#{green}#{status_string.upcase}#{return_color}"
|
|
833
|
+
elsif status_string == 'error' || status_string == 'offline'
|
|
834
|
+
out << "#{red}#{status_string ? status_string.upcase : 'N/A'}#{network_pool_server['statusMessage'] ? "#{return_color} - #{network_pool_server['statusMessage']}" : ''}#{return_color}"
|
|
835
|
+
else
|
|
836
|
+
out << "#{yellow}#{status_string.upcase}#{return_color}"
|
|
837
|
+
end
|
|
838
|
+
out
|
|
839
|
+
end
|
|
840
|
+
|
|
841
|
+
def network_pool_server_type_list_column_definitions(options)
|
|
842
|
+
{
|
|
843
|
+
"ID" => 'id',
|
|
844
|
+
"Name" => 'name',
|
|
845
|
+
"Code" => 'code',
|
|
846
|
+
}
|
|
847
|
+
end
|
|
848
|
+
|
|
849
|
+
def network_pool_server_type_column_definitions(options)
|
|
850
|
+
{
|
|
851
|
+
"ID" => 'id',
|
|
852
|
+
"Name" => 'name',
|
|
853
|
+
"Code" => 'code',
|
|
854
|
+
# "Integration Code" => 'integrationCode',
|
|
855
|
+
"Description" => 'description',
|
|
856
|
+
"Enabled" => lambda {|it| format_boolean(it['enabled']) },
|
|
857
|
+
"Selectable" => lambda {|it| format_boolean(it['selectable']) },
|
|
858
|
+
"Plugin" => lambda {|it| format_boolean(it['isPlugin']) },
|
|
859
|
+
"Embedded" => lambda {|it| format_boolean(it['isEmbedded']) },
|
|
860
|
+
}
|
|
861
|
+
end
|
|
862
|
+
|
|
863
|
+
def find_network_server_type_by_name_or_id(val)
|
|
864
|
+
if val.to_s =~ /\A\d{1,}\Z/
|
|
865
|
+
return find_network_server_type_by_id(val)
|
|
866
|
+
else
|
|
867
|
+
# always find by code too
|
|
868
|
+
#return find_network_server_type_by_name(val)
|
|
869
|
+
return find_network_server_type_by_name_or_code(val)
|
|
870
|
+
end
|
|
871
|
+
end
|
|
872
|
+
|
|
873
|
+
def find_network_server_type_by_id(id)
|
|
874
|
+
begin
|
|
875
|
+
json_response = @network_server_types_interface.get(id.to_i)
|
|
876
|
+
return json_response['networkServerType']
|
|
877
|
+
rescue RestClient::Exception => e
|
|
878
|
+
if e.response && e.response.code == 404
|
|
879
|
+
print_red_alert "Network Server Type not found by id #{id}"
|
|
880
|
+
return nil
|
|
881
|
+
else
|
|
882
|
+
raise e
|
|
883
|
+
end
|
|
884
|
+
end
|
|
885
|
+
end
|
|
886
|
+
|
|
887
|
+
def find_network_server_type_by_name(name)
|
|
888
|
+
json_response = @network_server_types_interface.list({name: name.to_s})
|
|
889
|
+
network_server_types = json_response['networkServerTypes']
|
|
890
|
+
if network_server_types.empty?
|
|
891
|
+
print_red_alert "Network Server Type not found by name #{name}"
|
|
892
|
+
return nil
|
|
893
|
+
elsif network_server_types.size > 1
|
|
894
|
+
print_red_alert "#{network_server_types.size} network server types found by name #{name}"
|
|
895
|
+
# print_networks_table(networks, {color: red})
|
|
896
|
+
rows = network_server_types.collect do |it|
|
|
897
|
+
{id: it['id'], name: it['name']}
|
|
898
|
+
end
|
|
899
|
+
puts as_pretty_table(rows, [:id, :code, :name], {color:red})
|
|
900
|
+
return nil
|
|
901
|
+
else
|
|
902
|
+
return network_server_types[0]
|
|
903
|
+
end
|
|
904
|
+
end
|
|
905
|
+
|
|
906
|
+
def find_network_server_type_by_name_or_code(name)
|
|
907
|
+
json_response = @network_server_types_interface.list({phrase: name.to_s, max: 100})
|
|
908
|
+
downcase_name = name.to_s.downcase
|
|
909
|
+
network_server_types = json_response['networkServerTypes'].select { |it|
|
|
910
|
+
it['code'].to_s.downcase == downcase_name || it['name'].to_s.downcase == downcase_name
|
|
911
|
+
}
|
|
912
|
+
if network_server_types.empty?
|
|
913
|
+
print_red_alert "Network Server Type not found by name or code '#{name}'"
|
|
914
|
+
return nil
|
|
915
|
+
elsif network_server_types.size > 1
|
|
916
|
+
print_red_alert "#{network_server_types.size} network server types found with name or code '#{name}'"
|
|
917
|
+
# print_networks_table(networks, {color: red})
|
|
918
|
+
rows = network_server_types.collect do |it|
|
|
919
|
+
{id: it['id'], name: it['name']}
|
|
920
|
+
end
|
|
921
|
+
puts as_pretty_table(rows, [:id, :code, :name], {color:red})
|
|
922
|
+
return nil
|
|
923
|
+
else
|
|
924
|
+
return network_server_types[0]
|
|
925
|
+
end
|
|
926
|
+
end
|
|
927
|
+
|
|
928
|
+
def network_server_type_list_column_definitions(options)
|
|
929
|
+
{
|
|
930
|
+
"ID" => 'id',
|
|
931
|
+
"Name" => 'name',
|
|
932
|
+
"Code" => 'code',
|
|
933
|
+
"Description" => 'description',
|
|
934
|
+
"Enabled" => lambda {|it| format_boolean(it['enabled']) }
|
|
935
|
+
}
|
|
936
|
+
end
|
|
937
|
+
|
|
938
|
+
def network_server_type_column_definitions(options)
|
|
939
|
+
{
|
|
940
|
+
"ID" => 'id',
|
|
941
|
+
"Name" => 'name',
|
|
942
|
+
"Code" => 'code',
|
|
943
|
+
"Description" => 'description',
|
|
944
|
+
"Enabled" => lambda {|it| format_boolean(it['enabled']) },
|
|
945
|
+
"Selectable" => lambda {|it| format_boolean(it['selectable']) },
|
|
946
|
+
"Creatable" => lambda {|it| format_boolean(it['creatable']) },
|
|
947
|
+
"Plugin" => lambda {|it| format_boolean(it['isPlugin']) },
|
|
948
|
+
"Embedded" => lambda {|it| format_boolean(it['isEmbedded']) },
|
|
949
|
+
#"Integration Code" => lambda {|it| it['integrationCode'] },
|
|
950
|
+
"Networks" => lambda {|it| format_boolean(it['hasNetworks']) },
|
|
951
|
+
"Gateways" => lambda {|it| format_boolean(it['hasGateways']) },
|
|
952
|
+
"DHCP Servers" => lambda {|it| format_boolean(it['hasDhcpServers']) },
|
|
953
|
+
"DHCP Relays" => lambda {|it| format_boolean(it['hasDhcpRelays']) },
|
|
954
|
+
# "Route Tables" => lambda {|it| format_boolean(it['hasRouteTables']) },
|
|
955
|
+
"Routers" => lambda {|it| format_boolean(it['hasRouters']) },
|
|
956
|
+
"Switches" => lambda {|it| format_boolean(it['hasSwitches']) },
|
|
957
|
+
"Firewall" => lambda {|it| format_boolean(it['hasFirewall']) },
|
|
958
|
+
"Security Groups" => lambda {|it| format_boolean(it['hasSecurityGroups']) },
|
|
959
|
+
"Load Balancers" => lambda {|it| format_boolean(it['hasLoadBalancers']) },
|
|
960
|
+
"Floating Ips" => lambda {|it| format_boolean it['hasFloatingIps']},
|
|
961
|
+
# "Security Code" => lambda {|it| it['securityCode'] },
|
|
962
|
+
# "User Visible" => lambda {|it| format_boolean(it['userVisible']) },
|
|
963
|
+
}
|
|
964
|
+
end
|
|
965
|
+
|
|
966
|
+
end
|