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.
Files changed (499) hide show
  1. checksums.yaml +7 -0
  2. data/.dockerignore +20 -0
  3. data/.github/pull_request_template.md +14 -0
  4. data/.github/workflows/ci.yml +56 -0
  5. data/.github/workflows/release.yml +46 -0
  6. data/.gitignore +25 -0
  7. data/CLAUDE.md +24 -0
  8. data/CONTRIBUTING.md +91 -0
  9. data/Dockerfile +19 -0
  10. data/Gemfile +4 -0
  11. data/LICENSE.txt +23 -0
  12. data/README.md +187 -0
  13. data/Rakefile +26 -0
  14. data/bin/mcs +3 -0
  15. data/bin/mtncloud +27 -0
  16. data/lib/mtncloud/api/account_groups_interface.rb +48 -0
  17. data/lib/mtncloud/api/account_users_interface.rb +68 -0
  18. data/lib/mtncloud/api/accounts_interface.rb +9 -0
  19. data/lib/mtncloud/api/activity_interface.rb +9 -0
  20. data/lib/mtncloud/api/affinity_groups_interface.rb +46 -0
  21. data/lib/mtncloud/api/api_client.rb +1091 -0
  22. data/lib/mtncloud/api/appliance_settings_interface.rb +49 -0
  23. data/lib/mtncloud/api/approvals_interface.rb +32 -0
  24. data/lib/mtncloud/api/apps_interface.rb +180 -0
  25. data/lib/mtncloud/api/archive_buckets_interface.rb +116 -0
  26. data/lib/mtncloud/api/archive_files_interface.rb +173 -0
  27. data/lib/mtncloud/api/audit_interface.rb +9 -0
  28. data/lib/mtncloud/api/auth_interface.rb +58 -0
  29. data/lib/mtncloud/api/backup_jobs_interface.rb +13 -0
  30. data/lib/mtncloud/api/backup_restores_interface.rb +27 -0
  31. data/lib/mtncloud/api/backup_results_interface.rb +32 -0
  32. data/lib/mtncloud/api/backup_service_types_interface.rb +9 -0
  33. data/lib/mtncloud/api/backup_services_interface.rb +9 -0
  34. data/lib/mtncloud/api/backup_settings_interface.rb +20 -0
  35. data/lib/mtncloud/api/backup_types_interface.rb +9 -0
  36. data/lib/mtncloud/api/backups_interface.rb +21 -0
  37. data/lib/mtncloud/api/billing_interface.rb +34 -0
  38. data/lib/mtncloud/api/blueprints_interface.rb +70 -0
  39. data/lib/mtncloud/api/body_io.rb +22 -0
  40. data/lib/mtncloud/api/budgets_interface.rb +48 -0
  41. data/lib/mtncloud/api/catalog_item_types_interface.rb +29 -0
  42. data/lib/mtncloud/api/certificate_types_interface.rb +14 -0
  43. data/lib/mtncloud/api/certificates_interface.rb +9 -0
  44. data/lib/mtncloud/api/clients_interface.rb +41 -0
  45. data/lib/mtncloud/api/cloud_datastores_interface.rb +48 -0
  46. data/lib/mtncloud/api/cloud_folders_interface.rb +41 -0
  47. data/lib/mtncloud/api/cloud_policies_interface.rb +41 -0
  48. data/lib/mtncloud/api/cloud_resource_pools_interface.rb +66 -0
  49. data/lib/mtncloud/api/clouds_interface.rb +217 -0
  50. data/lib/mtncloud/api/clusters_interface.rb +471 -0
  51. data/lib/mtncloud/api/containers_interface.rb +145 -0
  52. data/lib/mtncloud/api/credential_types_interface.rb +9 -0
  53. data/lib/mtncloud/api/credentials_interface.rb +9 -0
  54. data/lib/mtncloud/api/custom_instance_types_interface.rb +99 -0
  55. data/lib/mtncloud/api/cypher_interface.rb +51 -0
  56. data/lib/mtncloud/api/dashboard_interface.rb +14 -0
  57. data/lib/mtncloud/api/datastores_interface.rb +21 -0
  58. data/lib/mtncloud/api/deploy_interface.rb +44 -0
  59. data/lib/mtncloud/api/deployments_interface.rb +79 -0
  60. data/lib/mtncloud/api/distributed_workers_interface.rb +41 -0
  61. data/lib/mtncloud/api/email_templates_interface.rb +53 -0
  62. data/lib/mtncloud/api/environments_interface.rb +48 -0
  63. data/lib/mtncloud/api/execute_schedules_interface.rb +71 -0
  64. data/lib/mtncloud/api/execution_request_interface.rb +27 -0
  65. data/lib/mtncloud/api/file_copy_request_interface.rb +68 -0
  66. data/lib/mtncloud/api/forgot_password_interface.rb +17 -0
  67. data/lib/mtncloud/api/group_policies_interface.rb +41 -0
  68. data/lib/mtncloud/api/groups_interface.rb +73 -0
  69. data/lib/mtncloud/api/guidance_interface.rb +44 -0
  70. data/lib/mtncloud/api/guidance_settings_interface.rb +17 -0
  71. data/lib/mtncloud/api/health_interface.rb +100 -0
  72. data/lib/mtncloud/api/host_vm_groups_interface.rb +37 -0
  73. data/lib/mtncloud/api/hub_interface.rb +25 -0
  74. data/lib/mtncloud/api/image_builder_boot_scripts_interface.rb +41 -0
  75. data/lib/mtncloud/api/image_builder_image_builds_interface.rb +73 -0
  76. data/lib/mtncloud/api/image_builder_interface.rb +20 -0
  77. data/lib/mtncloud/api/image_builder_preseed_scripts_interface.rb +41 -0
  78. data/lib/mtncloud/api/instance_types_interface.rb +20 -0
  79. data/lib/mtncloud/api/instances_interface.rb +453 -0
  80. data/lib/mtncloud/api/integration_types_interface.rb +14 -0
  81. data/lib/mtncloud/api/integrations_interface.rb +74 -0
  82. data/lib/mtncloud/api/invoice_line_items_interface.rb +9 -0
  83. data/lib/mtncloud/api/invoices_interface.rb +28 -0
  84. data/lib/mtncloud/api/jobs_interface.rb +83 -0
  85. data/lib/mtncloud/api/key_pairs_interface.rb +57 -0
  86. data/lib/mtncloud/api/library_cluster_layouts_interface.rb +47 -0
  87. data/lib/mtncloud/api/library_cluster_packages_interface.rb +60 -0
  88. data/lib/mtncloud/api/library_container_scripts_interface.rb +43 -0
  89. data/lib/mtncloud/api/library_container_templates_interface.rb +43 -0
  90. data/lib/mtncloud/api/library_container_types_interface.rb +59 -0
  91. data/lib/mtncloud/api/library_container_upgrades_interface.rb +60 -0
  92. data/lib/mtncloud/api/library_instance_types_interface.rb +74 -0
  93. data/lib/mtncloud/api/library_layouts_interface.rb +69 -0
  94. data/lib/mtncloud/api/library_operating_systems_interface.rb +63 -0
  95. data/lib/mtncloud/api/library_spec_template_types_interface.rb +43 -0
  96. data/lib/mtncloud/api/library_spec_templates_interface.rb +43 -0
  97. data/lib/mtncloud/api/license_interface.rb +30 -0
  98. data/lib/mtncloud/api/load_balancer_monitors_interface.rb +9 -0
  99. data/lib/mtncloud/api/load_balancer_pool_nodes_interface.rb +8 -0
  100. data/lib/mtncloud/api/load_balancer_pools_interface.rb +9 -0
  101. data/lib/mtncloud/api/load_balancer_pools_secondary_interface.rb +9 -0
  102. data/lib/mtncloud/api/load_balancer_profiles_interface.rb +9 -0
  103. data/lib/mtncloud/api/load_balancer_types_interface.rb +9 -0
  104. data/lib/mtncloud/api/load_balancer_virtual_servers_interface.rb +18 -0
  105. data/lib/mtncloud/api/load_balancers_interface.rb +14 -0
  106. data/lib/mtncloud/api/log_settings_interface.rb +44 -0
  107. data/lib/mtncloud/api/logs_interface.rb +37 -0
  108. data/lib/mtncloud/api/migrations_interface.rb +49 -0
  109. data/lib/mtncloud/api/monitoring_alerts_interface.rb +39 -0
  110. data/lib/mtncloud/api/monitoring_apps_interface.rb +69 -0
  111. data/lib/mtncloud/api/monitoring_checks_interface.rb +103 -0
  112. data/lib/mtncloud/api/monitoring_contacts_interface.rb +41 -0
  113. data/lib/mtncloud/api/monitoring_groups_interface.rb +77 -0
  114. data/lib/mtncloud/api/monitoring_incidents_interface.rb +107 -0
  115. data/lib/mtncloud/api/monitoring_interface.rb +35 -0
  116. data/lib/mtncloud/api/monitoring_settings_interface.rb +21 -0
  117. data/lib/mtncloud/api/network_dhcp_relays_interface.rb +36 -0
  118. data/lib/mtncloud/api/network_dhcp_servers_interface.rb +36 -0
  119. data/lib/mtncloud/api/network_domain_records_interface.rb +41 -0
  120. data/lib/mtncloud/api/network_domains_interface.rb +41 -0
  121. data/lib/mtncloud/api/network_edge_clusters_interface.rb +26 -0
  122. data/lib/mtncloud/api/network_floating_ips_interface.rb +40 -0
  123. data/lib/mtncloud/api/network_groups_interface.rb +41 -0
  124. data/lib/mtncloud/api/network_pool_ips_interface.rb +41 -0
  125. data/lib/mtncloud/api/network_pool_server_types_interface.rb +9 -0
  126. data/lib/mtncloud/api/network_pool_servers_interface.rb +48 -0
  127. data/lib/mtncloud/api/network_pools_interface.rb +41 -0
  128. data/lib/mtncloud/api/network_proxies_interface.rb +41 -0
  129. data/lib/mtncloud/api/network_routers_interface.rb +181 -0
  130. data/lib/mtncloud/api/network_security_server_types_interface.rb +9 -0
  131. data/lib/mtncloud/api/network_security_servers_interface.rb +27 -0
  132. data/lib/mtncloud/api/network_server_groups_interface.rb +7 -0
  133. data/lib/mtncloud/api/network_server_types_interface.rb +9 -0
  134. data/lib/mtncloud/api/network_servers_interface.rb +102 -0
  135. data/lib/mtncloud/api/network_services_interface.rb +63 -0
  136. data/lib/mtncloud/api/network_static_routes_interface.rb +36 -0
  137. data/lib/mtncloud/api/network_subnets_interface.rb +42 -0
  138. data/lib/mtncloud/api/network_types_interface.rb +20 -0
  139. data/lib/mtncloud/api/networks_interface.rb +48 -0
  140. data/lib/mtncloud/api/option_type_forms_interface.rb +9 -0
  141. data/lib/mtncloud/api/option_type_lists_interface.rb +53 -0
  142. data/lib/mtncloud/api/option_types_interface.rb +41 -0
  143. data/lib/mtncloud/api/options_interface.rb +17 -0
  144. data/lib/mtncloud/api/packages_interface.rb +112 -0
  145. data/lib/mtncloud/api/ping_interface.rb +22 -0
  146. data/lib/mtncloud/api/plugins_interface.rb +22 -0
  147. data/lib/mtncloud/api/policies_interface.rb +56 -0
  148. data/lib/mtncloud/api/power_schedules_interface.rb +71 -0
  149. data/lib/mtncloud/api/price_sets_interface.rb +39 -0
  150. data/lib/mtncloud/api/prices_interface.rb +71 -0
  151. data/lib/mtncloud/api/processes_interface.rb +40 -0
  152. data/lib/mtncloud/api/projects_interface.rb +33 -0
  153. data/lib/mtncloud/api/provision_types_interface.rb +24 -0
  154. data/lib/mtncloud/api/provisioning_license_types_interface.rb +31 -0
  155. data/lib/mtncloud/api/provisioning_licenses_interface.rb +60 -0
  156. data/lib/mtncloud/api/provisioning_settings_interface.rb +26 -0
  157. data/lib/mtncloud/api/read_interface.rb +24 -0
  158. data/lib/mtncloud/api/reports_interface.rb +70 -0
  159. data/lib/mtncloud/api/resource_pool_groups_interface.rb +51 -0
  160. data/lib/mtncloud/api/rest_interface.rb +37 -0
  161. data/lib/mtncloud/api/roles_interface.rb +151 -0
  162. data/lib/mtncloud/api/scale_thresholds_interface.rb +9 -0
  163. data/lib/mtncloud/api/search_interface.rb +13 -0
  164. data/lib/mtncloud/api/secondary_read_interface.rb +25 -0
  165. data/lib/mtncloud/api/secondary_rest_interface.rb +42 -0
  166. data/lib/mtncloud/api/security_group_rules_interface.rb +35 -0
  167. data/lib/mtncloud/api/security_groups_interface.rb +56 -0
  168. data/lib/mtncloud/api/security_package_types_interface.rb +9 -0
  169. data/lib/mtncloud/api/security_packages_interface.rb +9 -0
  170. data/lib/mtncloud/api/security_scans_interface.rb +9 -0
  171. data/lib/mtncloud/api/server_devices_interface.rb +30 -0
  172. data/lib/mtncloud/api/server_types_interface.rb +20 -0
  173. data/lib/mtncloud/api/servers_interface.rb +230 -0
  174. data/lib/mtncloud/api/service_catalog_interface.rb +89 -0
  175. data/lib/mtncloud/api/service_plans_interface.rb +62 -0
  176. data/lib/mtncloud/api/setup_interface.rb +46 -0
  177. data/lib/mtncloud/api/snapshots_interface.rb +19 -0
  178. data/lib/mtncloud/api/storage_datastores_interface.rb +44 -0
  179. data/lib/mtncloud/api/storage_providers_interface.rb +151 -0
  180. data/lib/mtncloud/api/storage_server_types_interface.rb +14 -0
  181. data/lib/mtncloud/api/storage_servers_interface.rb +9 -0
  182. data/lib/mtncloud/api/storage_volume_types_interface.rb +9 -0
  183. data/lib/mtncloud/api/storage_volumes_interface.rb +24 -0
  184. data/lib/mtncloud/api/subnet_types_interface.rb +20 -0
  185. data/lib/mtncloud/api/subnets_interface.rb +41 -0
  186. data/lib/mtncloud/api/support_bundles_interface.rb +46 -0
  187. data/lib/mtncloud/api/system_types_interface.rb +13 -0
  188. data/lib/mtncloud/api/systems_interface.rb +55 -0
  189. data/lib/mtncloud/api/task_sets_interface.rb +52 -0
  190. data/lib/mtncloud/api/tasks_interface.rb +66 -0
  191. data/lib/mtncloud/api/tokens_interface.rb +39 -0
  192. data/lib/mtncloud/api/usage_interface.rb +18 -0
  193. data/lib/mtncloud/api/user_groups_interface.rb +59 -0
  194. data/lib/mtncloud/api/user_settings_interface.rb +90 -0
  195. data/lib/mtncloud/api/user_sources_interface.rb +99 -0
  196. data/lib/mtncloud/api/users_interface.rb +33 -0
  197. data/lib/mtncloud/api/vdi_allocations_interface.rb +9 -0
  198. data/lib/mtncloud/api/vdi_apps_interface.rb +9 -0
  199. data/lib/mtncloud/api/vdi_gateways_interface.rb +9 -0
  200. data/lib/mtncloud/api/vdi_interface.rb +28 -0
  201. data/lib/mtncloud/api/vdi_pools_interface.rb +19 -0
  202. data/lib/mtncloud/api/virtual_images_interface.rb +210 -0
  203. data/lib/mtncloud/api/virtual_servers_interface.rb +9 -0
  204. data/lib/mtncloud/api/virtual_switches_interface.rb +9 -0
  205. data/lib/mtncloud/api/whitelabel_settings_interface.rb +57 -0
  206. data/lib/mtncloud/api/whoami_interface.rb +13 -0
  207. data/lib/mtncloud/api/wiki_interface.rb +48 -0
  208. data/lib/mtncloud/api.rb +12 -0
  209. data/lib/mtncloud/benchmarking.rb +259 -0
  210. data/lib/mtncloud/cli/cli_command.rb +2281 -0
  211. data/lib/mtncloud/cli/cli_registry.rb +337 -0
  212. data/lib/mtncloud/cli/commands/access_token_command.rb +201 -0
  213. data/lib/mtncloud/cli/commands/account_groups_command.rb +530 -0
  214. data/lib/mtncloud/cli/commands/activity_command.rb +149 -0
  215. data/lib/mtncloud/cli/commands/affinity_groups_command.rb +554 -0
  216. data/lib/mtncloud/cli/commands/alias_command.rb +278 -0
  217. data/lib/mtncloud/cli/commands/appliance_settings_command.rb +382 -0
  218. data/lib/mtncloud/cli/commands/approvals_command.rb +236 -0
  219. data/lib/mtncloud/cli/commands/apps.rb +2549 -0
  220. data/lib/mtncloud/cli/commands/archives_command.rb +2161 -0
  221. data/lib/mtncloud/cli/commands/audit.rb +188 -0
  222. data/lib/mtncloud/cli/commands/backup_jobs_command.rb +366 -0
  223. data/lib/mtncloud/cli/commands/backup_restores_command.rb +144 -0
  224. data/lib/mtncloud/cli/commands/backup_results_command.rb +149 -0
  225. data/lib/mtncloud/cli/commands/backup_services_command.rb +44 -0
  226. data/lib/mtncloud/cli/commands/backup_settings_command.rb +184 -0
  227. data/lib/mtncloud/cli/commands/backup_types_command.rb +53 -0
  228. data/lib/mtncloud/cli/commands/backups_command.rb +674 -0
  229. data/lib/mtncloud/cli/commands/benchmark_command.rb +458 -0
  230. data/lib/mtncloud/cli/commands/blueprints_command.rb +2297 -0
  231. data/lib/mtncloud/cli/commands/boot_scripts_command.rb +379 -0
  232. data/lib/mtncloud/cli/commands/budgets_command.rb +754 -0
  233. data/lib/mtncloud/cli/commands/cat_command.rb +45 -0
  234. data/lib/mtncloud/cli/commands/catalog_item_types_command.rb +858 -0
  235. data/lib/mtncloud/cli/commands/certificates_command.rb +575 -0
  236. data/lib/mtncloud/cli/commands/change_password_command.rb +132 -0
  237. data/lib/mtncloud/cli/commands/clients_command.rb +331 -0
  238. data/lib/mtncloud/cli/commands/cloud_datastores_command.rb +543 -0
  239. data/lib/mtncloud/cli/commands/cloud_folders_command.rb +512 -0
  240. data/lib/mtncloud/cli/commands/cloud_resource_pools_command.rb +870 -0
  241. data/lib/mtncloud/cli/commands/clouds.rb +2037 -0
  242. data/lib/mtncloud/cli/commands/clouds_types.rb +140 -0
  243. data/lib/mtncloud/cli/commands/cluster_types.rb +179 -0
  244. data/lib/mtncloud/cli/commands/clusters.rb +5855 -0
  245. data/lib/mtncloud/cli/commands/coloring_command.rb +82 -0
  246. data/lib/mtncloud/cli/commands/containers_command.rb +967 -0
  247. data/lib/mtncloud/cli/commands/credential_types_command.rb +36 -0
  248. data/lib/mtncloud/cli/commands/credentials_command.rb +124 -0
  249. data/lib/mtncloud/cli/commands/curl_command.rb +168 -0
  250. data/lib/mtncloud/cli/commands/cypher_command.rb +587 -0
  251. data/lib/mtncloud/cli/commands/dashboard_command.rb +300 -0
  252. data/lib/mtncloud/cli/commands/debug_command.rb +75 -0
  253. data/lib/mtncloud/cli/commands/deploy.rb +485 -0
  254. data/lib/mtncloud/cli/commands/deployments.rb +923 -0
  255. data/lib/mtncloud/cli/commands/deploys.rb +485 -0
  256. data/lib/mtncloud/cli/commands/distributed_workers_command.rb +282 -0
  257. data/lib/mtncloud/cli/commands/echo_command.rb +61 -0
  258. data/lib/mtncloud/cli/commands/edit_profile_command.rb +57 -0
  259. data/lib/mtncloud/cli/commands/edit_rc_command.rb +77 -0
  260. data/lib/mtncloud/cli/commands/email_templates_command.rb +373 -0
  261. data/lib/mtncloud/cli/commands/environments_command.rb +401 -0
  262. data/lib/mtncloud/cli/commands/execute_schedules_command.rb +735 -0
  263. data/lib/mtncloud/cli/commands/execution_request_command.rb +333 -0
  264. data/lib/mtncloud/cli/commands/exit_command.rb +34 -0
  265. data/lib/mtncloud/cli/commands/file_copy_request_command.rb +352 -0
  266. data/lib/mtncloud/cli/commands/forgot_password.rb +133 -0
  267. data/lib/mtncloud/cli/commands/get_prompt_command.rb +36 -0
  268. data/lib/mtncloud/cli/commands/groups.rb +818 -0
  269. data/lib/mtncloud/cli/commands/guidance_command.rb +529 -0
  270. data/lib/mtncloud/cli/commands/guidance_settings.rb +148 -0
  271. data/lib/mtncloud/cli/commands/health_command.rb +1046 -0
  272. data/lib/mtncloud/cli/commands/history_command.rb +60 -0
  273. data/lib/mtncloud/cli/commands/host_vm_groups_command.rb +423 -0
  274. data/lib/mtncloud/cli/commands/hosts.rb +2986 -0
  275. data/lib/mtncloud/cli/commands/hub.rb +215 -0
  276. data/lib/mtncloud/cli/commands/image_builder_command.rb +1197 -0
  277. data/lib/mtncloud/cli/commands/instance_types.rb +163 -0
  278. data/lib/mtncloud/cli/commands/instances.rb +5813 -0
  279. data/lib/mtncloud/cli/commands/integrations_command.rb +1412 -0
  280. data/lib/mtncloud/cli/commands/invoices_command.rb +1151 -0
  281. data/lib/mtncloud/cli/commands/jobs_command.rb +998 -0
  282. data/lib/mtncloud/cli/commands/key_pairs.rb +470 -0
  283. data/lib/mtncloud/cli/commands/library_cluster_layouts_command.rb +901 -0
  284. data/lib/mtncloud/cli/commands/library_cluster_packages_command.rb +552 -0
  285. data/lib/mtncloud/cli/commands/library_container_scripts_command.rb +446 -0
  286. data/lib/mtncloud/cli/commands/library_container_templates_command.rb +526 -0
  287. data/lib/mtncloud/cli/commands/library_container_types_command.rb +698 -0
  288. data/lib/mtncloud/cli/commands/library_forms_command.rb +625 -0
  289. data/lib/mtncloud/cli/commands/library_instance_types_command.rb +668 -0
  290. data/lib/mtncloud/cli/commands/library_layouts_command.rb +849 -0
  291. data/lib/mtncloud/cli/commands/library_operating_systems_command.rb +671 -0
  292. data/lib/mtncloud/cli/commands/library_option_lists_command.rb +503 -0
  293. data/lib/mtncloud/cli/commands/library_option_types_command.rb +329 -0
  294. data/lib/mtncloud/cli/commands/library_spec_templates_command.rb +547 -0
  295. data/lib/mtncloud/cli/commands/library_upgrades_command.rb +596 -0
  296. data/lib/mtncloud/cli/commands/license.rb +475 -0
  297. data/lib/mtncloud/cli/commands/load_balancer_monitors.rb +70 -0
  298. data/lib/mtncloud/cli/commands/load_balancer_pool_nodes.rb +87 -0
  299. data/lib/mtncloud/cli/commands/load_balancer_pools.rb +129 -0
  300. data/lib/mtncloud/cli/commands/load_balancer_profiles.rb +64 -0
  301. data/lib/mtncloud/cli/commands/load_balancer_types.rb +38 -0
  302. data/lib/mtncloud/cli/commands/load_balancer_virtual_servers.rb +147 -0
  303. data/lib/mtncloud/cli/commands/load_balancers.rb +189 -0
  304. data/lib/mtncloud/cli/commands/log_level_command.rb +54 -0
  305. data/lib/mtncloud/cli/commands/log_settings_command.rb +443 -0
  306. data/lib/mtncloud/cli/commands/login.rb +148 -0
  307. data/lib/mtncloud/cli/commands/logout.rb +63 -0
  308. data/lib/mtncloud/cli/commands/logs_command.rb +140 -0
  309. data/lib/mtncloud/cli/commands/man_command.rb +409 -0
  310. data/lib/mtncloud/cli/commands/migrations.rb +453 -0
  311. data/lib/mtncloud/cli/commands/monitoring_alerts_command.rb +791 -0
  312. data/lib/mtncloud/cli/commands/monitoring_apps_command.rb +716 -0
  313. data/lib/mtncloud/cli/commands/monitoring_checks_command.rb +766 -0
  314. data/lib/mtncloud/cli/commands/monitoring_contacts_command.rb +339 -0
  315. data/lib/mtncloud/cli/commands/monitoring_groups_command.rb +674 -0
  316. data/lib/mtncloud/cli/commands/monitoring_incidents_command.rb +835 -0
  317. data/lib/mtncloud/cli/commands/monitoring_settings.rb +212 -0
  318. data/lib/mtncloud/cli/commands/network_dhcp_relays_command.rb +375 -0
  319. data/lib/mtncloud/cli/commands/network_dhcp_servers_command.rb +366 -0
  320. data/lib/mtncloud/cli/commands/network_domains_command.rb +896 -0
  321. data/lib/mtncloud/cli/commands/network_edge_clusters_command.rb +288 -0
  322. data/lib/mtncloud/cli/commands/network_firewalls_command.rb +783 -0
  323. data/lib/mtncloud/cli/commands/network_floating_ips.rb +147 -0
  324. data/lib/mtncloud/cli/commands/network_groups_command.rb +654 -0
  325. data/lib/mtncloud/cli/commands/network_pool_server_types.rb +20 -0
  326. data/lib/mtncloud/cli/commands/network_pool_servers_command.rb +318 -0
  327. data/lib/mtncloud/cli/commands/network_pools_command.rb +903 -0
  328. data/lib/mtncloud/cli/commands/network_proxies_command.rb +578 -0
  329. data/lib/mtncloud/cli/commands/network_routers_command.rb +2628 -0
  330. data/lib/mtncloud/cli/commands/network_security_server_types.rb +20 -0
  331. data/lib/mtncloud/cli/commands/network_server_groups_command.rb +222 -0
  332. data/lib/mtncloud/cli/commands/network_server_types_command.rb +20 -0
  333. data/lib/mtncloud/cli/commands/network_servers_command.rb +398 -0
  334. data/lib/mtncloud/cli/commands/network_services_command.rb +198 -0
  335. data/lib/mtncloud/cli/commands/network_static_routes_command.rb +451 -0
  336. data/lib/mtncloud/cli/commands/network_transport_zones_command.rb +412 -0
  337. data/lib/mtncloud/cli/commands/networks_command.rb +1692 -0
  338. data/lib/mtncloud/cli/commands/open_command.rb +30 -0
  339. data/lib/mtncloud/cli/commands/options.rb +231 -0
  340. data/lib/mtncloud/cli/commands/packages_command.rb +822 -0
  341. data/lib/mtncloud/cli/commands/ping.rb +242 -0
  342. data/lib/mtncloud/cli/commands/plugins.rb +214 -0
  343. data/lib/mtncloud/cli/commands/policies_command.rb +990 -0
  344. data/lib/mtncloud/cli/commands/power_schedules_command.rb +731 -0
  345. data/lib/mtncloud/cli/commands/preseed_scripts_command.rb +378 -0
  346. data/lib/mtncloud/cli/commands/price_sets_command.rb +557 -0
  347. data/lib/mtncloud/cli/commands/prices_command.rb +692 -0
  348. data/lib/mtncloud/cli/commands/processes_command.rb +469 -0
  349. data/lib/mtncloud/cli/commands/projects_command.rb +537 -0
  350. data/lib/mtncloud/cli/commands/provisioning_licenses_command.rb +509 -0
  351. data/lib/mtncloud/cli/commands/provisioning_settings_command.rb +238 -0
  352. data/lib/mtncloud/cli/commands/recent_activity_command.rb +171 -0
  353. data/lib/mtncloud/cli/commands/remote.rb +1818 -0
  354. data/lib/mtncloud/cli/commands/reports_command.rb +724 -0
  355. data/lib/mtncloud/cli/commands/resource_pool_groups_command.rb +586 -0
  356. data/lib/mtncloud/cli/commands/rm_command.rb +14 -0
  357. data/lib/mtncloud/cli/commands/roles.rb +3120 -0
  358. data/lib/mtncloud/cli/commands/scale_thresholds.rb +103 -0
  359. data/lib/mtncloud/cli/commands/search_command.rb +184 -0
  360. data/lib/mtncloud/cli/commands/security_group_rules.rb +230 -0
  361. data/lib/mtncloud/cli/commands/security_groups.rb +1294 -0
  362. data/lib/mtncloud/cli/commands/security_package_types.rb +32 -0
  363. data/lib/mtncloud/cli/commands/security_packages.rb +84 -0
  364. data/lib/mtncloud/cli/commands/security_scans.rb +107 -0
  365. data/lib/mtncloud/cli/commands/self_service_command.rb +17 -0
  366. data/lib/mtncloud/cli/commands/server_devices_command.rb +207 -0
  367. data/lib/mtncloud/cli/commands/service_catalog_command.rb +1528 -0
  368. data/lib/mtncloud/cli/commands/service_plans_command.rb +895 -0
  369. data/lib/mtncloud/cli/commands/set_prompt_command.rb +51 -0
  370. data/lib/mtncloud/cli/commands/setup.rb +423 -0
  371. data/lib/mtncloud/cli/commands/shell.rb +717 -0
  372. data/lib/mtncloud/cli/commands/sleep_command.rb +43 -0
  373. data/lib/mtncloud/cli/commands/snapshots.rb +156 -0
  374. data/lib/mtncloud/cli/commands/source_command.rb +30 -0
  375. data/lib/mtncloud/cli/commands/ssl_verification_command.rb +47 -0
  376. data/lib/mtncloud/cli/commands/storage_datastores.rb +457 -0
  377. data/lib/mtncloud/cli/commands/storage_providers_command.rb +1401 -0
  378. data/lib/mtncloud/cli/commands/storage_server_types.rb +45 -0
  379. data/lib/mtncloud/cli/commands/storage_servers.rb +116 -0
  380. data/lib/mtncloud/cli/commands/storage_volume_types.rb +45 -0
  381. data/lib/mtncloud/cli/commands/storage_volumes.rb +236 -0
  382. data/lib/mtncloud/cli/commands/subnets_command.rb +819 -0
  383. data/lib/mtncloud/cli/commands/support_bundles_command.rb +606 -0
  384. data/lib/mtncloud/cli/commands/systems.rb +1203 -0
  385. data/lib/mtncloud/cli/commands/tasks.rb +1391 -0
  386. data/lib/mtncloud/cli/commands/tee_command.rb +14 -0
  387. data/lib/mtncloud/cli/commands/tenants_command.rb +315 -0
  388. data/lib/mtncloud/cli/commands/tokens_command.rb +391 -0
  389. data/lib/mtncloud/cli/commands/update_command.rb +46 -0
  390. data/lib/mtncloud/cli/commands/usage_command.rb +203 -0
  391. data/lib/mtncloud/cli/commands/user_groups_command.rb +512 -0
  392. data/lib/mtncloud/cli/commands/user_settings_command.rb +849 -0
  393. data/lib/mtncloud/cli/commands/user_sources_command.rb +1065 -0
  394. data/lib/mtncloud/cli/commands/users.rb +897 -0
  395. data/lib/mtncloud/cli/commands/vdi_allocations_command.rb +159 -0
  396. data/lib/mtncloud/cli/commands/vdi_apps_command.rb +317 -0
  397. data/lib/mtncloud/cli/commands/vdi_command.rb +359 -0
  398. data/lib/mtncloud/cli/commands/vdi_gateways_command.rb +290 -0
  399. data/lib/mtncloud/cli/commands/vdi_pools_command.rb +574 -0
  400. data/lib/mtncloud/cli/commands/version_command.rb +38 -0
  401. data/lib/mtncloud/cli/commands/view.rb +107 -0
  402. data/lib/mtncloud/cli/commands/virtual_images.rb +1362 -0
  403. data/lib/mtncloud/cli/commands/virtual_switches_command.rb +336 -0
  404. data/lib/mtncloud/cli/commands/whitelabel_settings_command.rb +653 -0
  405. data/lib/mtncloud/cli/commands/whoami.rb +323 -0
  406. data/lib/mtncloud/cli/commands/wiki_command.rb +448 -0
  407. data/lib/mtncloud/cli/commands/workflows.rb +1022 -0
  408. data/lib/mtncloud/cli/credentials.rb +482 -0
  409. data/lib/mtncloud/cli/dot_file.rb +180 -0
  410. data/lib/mtncloud/cli/error_handler.rb +307 -0
  411. data/lib/mtncloud/cli/errors.rb +53 -0
  412. data/lib/mtncloud/cli/expression_parser.rb +153 -0
  413. data/lib/mtncloud/cli/mixins/accounts_helper.rb +484 -0
  414. data/lib/mtncloud/cli/mixins/affinity_helper.rb +118 -0
  415. data/lib/mtncloud/cli/mixins/backups_helper.rb +200 -0
  416. data/lib/mtncloud/cli/mixins/deployments_helper.rb +163 -0
  417. data/lib/mtncloud/cli/mixins/execution_request_helper.rb +50 -0
  418. data/lib/mtncloud/cli/mixins/infrastructure_helper.rb +966 -0
  419. data/lib/mtncloud/cli/mixins/jobs_helper.rb +202 -0
  420. data/lib/mtncloud/cli/mixins/library_helper.rb +539 -0
  421. data/lib/mtncloud/cli/mixins/load_balancers_helper.rb +176 -0
  422. data/lib/mtncloud/cli/mixins/logs_helper.rb +131 -0
  423. data/lib/mtncloud/cli/mixins/monitoring_helper.rb +876 -0
  424. data/lib/mtncloud/cli/mixins/networks_helper.rb +62 -0
  425. data/lib/mtncloud/cli/mixins/operations_helper.rb +41 -0
  426. data/lib/mtncloud/cli/mixins/option_source_helper.rb +254 -0
  427. data/lib/mtncloud/cli/mixins/print_helper.rb +1631 -0
  428. data/lib/mtncloud/cli/mixins/processes_helper.rb +286 -0
  429. data/lib/mtncloud/cli/mixins/prompt_helper.rb +136 -0
  430. data/lib/mtncloud/cli/mixins/provisioning_helper.rb +2963 -0
  431. data/lib/mtncloud/cli/mixins/remote_helper.rb +139 -0
  432. data/lib/mtncloud/cli/mixins/rest_command.rb +994 -0
  433. data/lib/mtncloud/cli/mixins/secondary_rest_command.rb +700 -0
  434. data/lib/mtncloud/cli/mixins/storage_servers_helper.rb +93 -0
  435. data/lib/mtncloud/cli/mixins/storage_volumes_helper.rb +76 -0
  436. data/lib/mtncloud/cli/mixins/vdi_helper.rb +246 -0
  437. data/lib/mtncloud/cli/mixins/whoami_helper.rb +73 -0
  438. data/lib/mtncloud/cli/option_parser.rb +127 -0
  439. data/lib/mtncloud/cli/option_types.rb +1622 -0
  440. data/lib/mtncloud/cli/version.rb +6 -0
  441. data/lib/mtncloud/cli.rb +105 -0
  442. data/lib/mtncloud/currency.rb +184 -0
  443. data/lib/mtncloud/ext/hash.rb +109 -0
  444. data/lib/mtncloud/ext/nil_class.rb +5 -0
  445. data/lib/mtncloud/ext/rest_client.rb +37 -0
  446. data/lib/mtncloud/ext/string.rb +66 -0
  447. data/lib/mtncloud/formatters.rb +511 -0
  448. data/lib/mtncloud/logging.rb +185 -0
  449. data/lib/mtncloud/morpkg.rb +119 -0
  450. data/lib/mtncloud/rest_client.rb +104 -0
  451. data/lib/mtncloud/routes.rb +304 -0
  452. data/lib/mtncloud/terminal.rb +528 -0
  453. data/lib/mtncloud/util.rb +29 -0
  454. data/lib/mtncloud.rb +5 -0
  455. data/mtncloud-cli.gemspec +38 -0
  456. data/test/api/affinity_groups_interface_test.rb +43 -0
  457. data/test/api/clients_interface_test.rb +23 -0
  458. data/test/api/clouds_interface_test.rb +67 -0
  459. data/test/api/containers_interface_test.rb +68 -0
  460. data/test/api/host_vm_groups_interface_test.rb +35 -0
  461. data/test/api/instances_interface_test.rb +22 -0
  462. data/test/api/network_routers_interface_test.rb +22 -0
  463. data/test/api/systems_interface_test.rb +26 -0
  464. data/test/api/whoami_interface_test.rb +14 -0
  465. data/test/branding_test.rb +160 -0
  466. data/test/cli/access_token_test.rb +36 -0
  467. data/test/cli/affinity_groups_cloud_cluster_scope_test.rb +270 -0
  468. data/test/cli/affinity_groups_cluster_scope_test.rb +171 -0
  469. data/test/cli/affinity_groups_test.rb +57 -0
  470. data/test/cli/affinity_groups_violations_scope_test.rb +141 -0
  471. data/test/cli/affinity_helper_test.rb +367 -0
  472. data/test/cli/auth_test.rb +88 -0
  473. data/test/cli/backups_test.rb +212 -0
  474. data/test/cli/cli_test.rb +48 -0
  475. data/test/cli/clients_test.rb +45 -0
  476. data/test/cli/clusters_uuid_test.rb +146 -0
  477. data/test/cli/containers_test.rb +92 -0
  478. data/test/cli/distributed_workers_test.rb +68 -0
  479. data/test/cli/help_test.rb +25 -0
  480. data/test/cli/host_vm_groups_cluster_scope_test.rb +187 -0
  481. data/test/cli/host_vm_groups_test.rb +63 -0
  482. data/test/cli/infrastructure_helper_cluster_resolver_test.rb +250 -0
  483. data/test/cli/instances_test.rb +37 -0
  484. data/test/cli/man_test.rb +14 -0
  485. data/test/cli/migrations_test.rb +39 -0
  486. data/test/cli/network_routers_test.rb +65 -0
  487. data/test/cli/remote_test.rb +89 -0
  488. data/test/cli/roles_test.rb +47 -0
  489. data/test/cli/shell_test.rb +81 -0
  490. data/test/cli/storage_volumes_test.rb +79 -0
  491. data/test/cli/systems_test.rb +206 -0
  492. data/test/cli/version_test.rb +23 -0
  493. data/test/cli/view_test.rb +55 -0
  494. data/test/cli/whoami_test.rb +17 -0
  495. data/test/mtncloud_test.rb +16 -0
  496. data/test/test_case.rb +342 -0
  497. data/test/test_config.rb +137 -0
  498. data/test/test_data_helper.rb +97 -0
  499. metadata +807 -0
@@ -0,0 +1,1692 @@
1
+ require 'mtncloud/cli/cli_command'
2
+
3
+ class MtnCloud::Cli::NetworksCommand
4
+ include MtnCloud::Cli::CliCommand
5
+ include MtnCloud::Cli::WhoamiHelper
6
+ include MtnCloud::Cli::InfrastructureHelper
7
+ include MtnCloud::Cli::ProvisioningHelper
8
+ include MtnCloud::Cli::AccountsHelper
9
+
10
+ set_command_name :networks
11
+
12
+ register_subcommands :list, :get, :add, :update, :remove
13
+ register_subcommands :'types' => :list_types
14
+ register_subcommands :'get-type' => :get_type
15
+
16
+ #register_subcommands :list_subnets, # :get_subnet, :add_subnet, :update_subnet, :remove_subnet
17
+
18
+ def initialize()
19
+ # @appliance_name, @appliance_url = MtnCloud::Cli::Remote.active_appliance
20
+ end
21
+
22
+ def connect(opts)
23
+ @api_client = establish_remote_appliance_connection(opts)
24
+ @networks_interface = @api_client.networks
25
+ @network_types_interface = @api_client.network_types
26
+ @network_services_interface = @api_client.network_services
27
+ @subnets_interface = @api_client.subnets
28
+ @subnet_types_interface = @api_client.subnet_types
29
+ @groups_interface = @api_client.groups
30
+ @clouds_interface = @api_client.clouds
31
+ @options_interface = @api_client.options
32
+ @accounts_interface = @api_client.accounts
33
+ @account_users_interface = @api_client.account_users
34
+ end
35
+
36
+ def handle(args)
37
+ handle_subcommand(args)
38
+ end
39
+
40
+ def list(args)
41
+ options = {}
42
+ params = {}
43
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
44
+ opts.banner = subcommand_usage()
45
+ opts.on( '-c', '--cloud CLOUD', "Filter by Cloud" ) do |val|
46
+ options[:cloud] = val
47
+ end
48
+ opts.on('--cidr VALUE', String, "Filter by cidr, matches beginning of value.") do |val|
49
+ params['cidr'] = val
50
+ end
51
+ opts.on('-a', '--all', "Display all data, including subnets.") do
52
+ options[:show_subnets] = true
53
+ end
54
+ opts.on('--subnets', '--subnets', "Display subnets as rows under each network found.") do
55
+ options[:show_subnets] = true
56
+ end
57
+ opts.on('-l', '--labels LABEL', String, "Filter by labels, can match any of the values") do |val|
58
+ add_query_parameter(params, 'labels', parse_labels(val))
59
+ end
60
+ opts.on('--all-labels LABEL', String, "Filter by labels, must match all of the values") do |val|
61
+ add_query_parameter(params, 'allLabels', parse_labels(val))
62
+ end
63
+ opts.on('--include-tenants','--include-tenants', "Include sub tenant networks") do
64
+ options[:include_tenants] = true
65
+ params['includeTenants'] = true
66
+ end
67
+ opts.on('--tenant TENANT', String, "Tenant Name or ID" ) do |val|
68
+ options[:tenant] = val
69
+ end
70
+ build_common_options(opts, options, [:list, :json, :yaml, :csv, :fields, :json, :dry_run, :remote])
71
+ opts.footer = "List networks."
72
+ end
73
+ optparse.parse!(args)
74
+ connect(options)
75
+ if args.count > 0
76
+ options[:phrase] = args.join(" ")
77
+ end
78
+ begin
79
+ params.merge!(parse_list_options(options))
80
+ cloud = nil
81
+ if options[:cloud]
82
+ cloud = find_cloud_by_name_or_id(options[:cloud])
83
+ return 1 if cloud.nil?
84
+ params['zoneId'] = cloud['id']
85
+ end
86
+ if options[:tenant]
87
+ if options[:tenant].to_s !~ /\A\d{1,}\Z/
88
+ account = find_account_by_name_or_id(options[:tenant])
89
+ if account.nil?
90
+ return 1, "Tenant not found by name: #{options[:tenant]}"
91
+ else
92
+ params['tenantId'] = account['id']
93
+ end
94
+ else
95
+ params['tenantId'] = options[:tenant]
96
+ end
97
+ end
98
+ @networks_interface.setopts(options)
99
+ if options[:dry_run]
100
+ print_dry_run @networks_interface.dry.list(params)
101
+ return
102
+ end
103
+ json_response = @networks_interface.list(params)
104
+ networks = json_response["networks"]
105
+ if options[:json]
106
+ puts as_json(json_response, options, "networks")
107
+ return 0
108
+ elsif options[:yaml]
109
+ puts as_yaml(json_response, options, "networks")
110
+ return 0
111
+ elsif options[:csv]
112
+ puts records_as_csv(networks, options)
113
+ return 0
114
+ end
115
+ title = "Networks"
116
+ subtitles = []
117
+ if cloud
118
+ subtitles << "Cloud: #{cloud['id']}"
119
+ end
120
+ subtitles += parse_list_subtitles(options)
121
+ print_h1 title, subtitles
122
+ if networks.empty?
123
+ print cyan,"No networks found.",reset,"\n"
124
+ else
125
+ rows = []
126
+ networks.each do |network|
127
+ row = {
128
+ id: network['id'],
129
+ name: network['displayName'] || network['name'],
130
+ labels: format_list(network['labels'], '', 3),
131
+ type: network['type'] ? network['type']['name'] : '',
132
+ group: network['group'] ? network['group']['name'] : 'Shared',
133
+ cloud: network['zone'] ? network['zone']['name'] : '',
134
+ tenant: network['owner'] ? network['owner']['name'] : '',
135
+ cidr: network['cidr'],
136
+ pool: network['pool'] ? network['pool']['name'] : '',
137
+ dhcp: network['dhcpServer'] ? 'Yes' : 'No',
138
+ subnets: (network['subnets'].size rescue 'n/a'),
139
+ visibility: network['visibility'].to_s.capitalize,
140
+ active: format_boolean(network['active']),
141
+ tenants: network['tenants'] ? network['tenants'].collect {|it| it['name'] }.uniq.join(', ') : ''
142
+ }
143
+ rows << row
144
+ if network['subnets'] && network['subnets'].size() > 0 && options[:show_subnets]
145
+ network['subnets'].each do |subnet|
146
+ subnet_row = {
147
+ id: subnet['id'],
148
+ name: " #{subnet['displayName'] || subnet['name']}",
149
+ labels: format_list(subnet['labels'], '', 3),
150
+ # type: subnet['type'] ? subnet['type']['name'] : '',
151
+ type: "Subnet",
152
+ group: network['group'] ? network['group']['name'] : 'Shared',
153
+ cloud: network['zone'] ? network['zone']['name'] : '',
154
+ tenant: network['owner'] ? network['owner']['name'] : '',
155
+ cidr: subnet['cidr'],
156
+ pool: subnet['pool'] ? subnet['pool']['name'] : '',
157
+ dhcp: subnet['dhcpServer'] ? 'Yes' : 'No',
158
+ visibility: subnet['visibility'].to_s.capitalize,
159
+ active: format_boolean(subnet['active']),
160
+ tenants: subnet['tenants'] ? subnet['tenants'].collect {|it| it['name'] }.uniq.join(', ') : ''
161
+ }
162
+ rows << subnet_row
163
+ end
164
+ end
165
+ end
166
+ columns = [:id, :name, :labels, :type, :group, :cloud, :tenant, :cidr, :pool, :dhcp, :subnets, :active, :visibility, :tenants]
167
+ if options[:include_fields]
168
+ columns = options[:include_fields]
169
+ else
170
+ if !options[:include_tenants] && !options[:tenant]
171
+ columns.delete(:tenant)
172
+ end
173
+ end
174
+ print cyan
175
+ print as_pretty_table(rows, columns, options)
176
+ print reset
177
+ print_results_pagination(json_response, {:label => "network", :n_label => "networks"})
178
+ end
179
+ print reset,"\n"
180
+ return 0
181
+ rescue RestClient::Exception => e
182
+ print_rest_exception(e, options)
183
+ exit 1
184
+ end
185
+ end
186
+
187
+ def get(args)
188
+ options = {}
189
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
190
+ opts.banner = subcommand_usage("[network]")
191
+ opts.on('--include-tenants','--include-tenants', "Include sub tenant networks when finding network by name") do
192
+ options[:include_tenants] = true
193
+ end
194
+ build_common_options(opts, options, [:json, :yaml, :csv, :fields, :dry_run, :remote])
195
+ opts.footer = "Get details about a network." + "\n" +
196
+ "[network] is required. This is the name or id of a network."
197
+ end
198
+ optparse.parse!(args)
199
+ if args.count != 1
200
+ print_error MtnCloud::Terminal.angry_prompt
201
+ puts_error "#{command_name} missing argument: [network]\n#{optparse}"
202
+ return 1
203
+ end
204
+ connect(options)
205
+ begin
206
+ @networks_interface.setopts(options)
207
+ if options[:dry_run]
208
+ if args[0].to_s =~ /\A\d{1,}\Z/
209
+ print_dry_run @networks_interface.dry.get(args[0].to_i)
210
+ else
211
+ print_dry_run @networks_interface.dry.list({name:args[0]}, options[:include_tenants])
212
+ end
213
+ return
214
+ end
215
+ network = find_network_by_name_or_id(args[0], options[:include_tenants])
216
+ return 1 if network.nil?
217
+ json_response = {'network' => network} # skip redundant request
218
+ # json_response = @networks_interface.get(network['id'])
219
+ network = json_response['network']
220
+ if options[:json]
221
+ puts as_json(json_response, options, "network")
222
+ return 0
223
+ elsif options[:yaml]
224
+ puts as_yaml(json_response, options, "network")
225
+ return 0
226
+ elsif options[:csv]
227
+ puts records_as_csv([network], options)
228
+ return 0
229
+ end
230
+ print_h1 "Network Details"
231
+ print cyan
232
+ description_cols = {
233
+ "ID" => 'id',
234
+ "Name" => lambda {|it| it['displayName'] ? it['displayName'] : it['name'] },
235
+ "Labels" => lambda {|it| format_list(it['labels']) rescue '' },
236
+ "Description" => 'description',
237
+ "Type" => lambda {|it| it['type'] ? it['type']['name'] : '' },
238
+ "Group" => lambda {|it| it['group'] ? it['group']['name'] : 'Shared' },
239
+ "Cloud" => lambda {|it| it['zone'] ? it['zone']['name'] : '' },
240
+ "Tenant" => lambda {|it| it['owner'] ? it['owner']['name'] : '' },
241
+ "IPv4 Enabled" => 'ipv4Enabled',
242
+ "IPv6 Enabled" => 'ipv6Enabled',
243
+ "CIDR" => 'cidr',
244
+ "Gateway" => 'gateway',
245
+ "Netmask" => 'netmask',
246
+ "Subnet" => 'subnetAddress',
247
+ "Primary DNS" => 'dnsPrimary',
248
+ "Secondary DNS" => 'dnsSecondary',
249
+ "IPv6 CIDR" => 'cidrIPv6',
250
+ "IPv6 Gateway" => 'gatewayIPv6',
251
+ "IPv6 Netmask" => 'netmaskIPv6',
252
+ "IPv6 Primary DNS" => 'dnsPrimaryIPv6',
253
+ "IPv6 Secondary DNS" => 'dnsSecondaryIPv6',
254
+ "Domain" => lambda {|it| it['networkDomain'] ? it['networkDomain']['name'] : '' },
255
+ "Search Domains" => lambda {|it| it['searchDomains'] },
256
+ "Pool" => lambda {|it| it['pool'] ? it['pool']['name'] : '' },
257
+ "IPv6 Pool" => lambda {|it| it['poolIPv6'] ? it['poolIPv6']['name'] : '' },
258
+ "VPC" => lambda {|it| it['zonePool'] ? it['zonePool']['name'] : '' },
259
+ "DHCP" => lambda {|it| it['dhcpServer'] ? 'Yes' : 'No' },
260
+ "IPv6 DHCP" => lambda {|it| it['dhcpServerIPv6'] ? 'Yes' : 'No' },
261
+ "Active" => lambda {|it| format_boolean(it['active']) },
262
+ "Allow IP Override" => lambda {|it| it['allowStaticOverride'] ? 'Yes' : 'No' },
263
+ "Visibility" => lambda {|it| it['visibility'].to_s.capitalize },
264
+ "Tenants" => lambda {|it| it['tenants'] ? it['tenants'].collect {|it| it['name'] }.uniq.join(', ') : '' },
265
+ }
266
+ description_cols.delete("Domain") if network['networkDomain'].nil?
267
+ description_cols.delete("Search Domains") if network['searchDomains'].to_s.empty?
268
+ print_description_list(description_cols, network)
269
+
270
+ if network["group"]
271
+ # Group Access is n/a unless network is_a? Shared (no group)
272
+ elsif network['resourcePermission'].nil?
273
+ print "\n", "No group access found", "\n"
274
+ else
275
+ print_h2 "Group Access"
276
+ rows = []
277
+ if network['resourcePermission']['all']
278
+ rows.push({"name" => 'All'})
279
+ end
280
+ if network['resourcePermission']['sites']
281
+ network['resourcePermission']['sites'].each do |site|
282
+ rows.push(site)
283
+ end
284
+ end
285
+ rows = rows.collect do |site|
286
+ {group: site['name'], default: site['default'] ? 'Yes' : ''}
287
+ end
288
+ columns = [:group, :default]
289
+ print cyan
290
+ print as_pretty_table(rows, columns)
291
+ end
292
+
293
+ # if options[:show_subnets]
294
+ # subnets data is limited, use /networks/:id/subnets to fetch it all.
295
+ subnets = network['subnets']
296
+ if subnets and subnets.size > 0
297
+ print_h2 "Subnets", options
298
+ rows = []
299
+ subnet_rows = subnets.collect { |subnet|
300
+ {
301
+ id: subnet['id'],
302
+ name: " #{subnet['displayName'] || subnet['name']}",
303
+ labels: format_list(subnet['labels'], '', 3),
304
+ # type: subnet['type'] ? subnet['type']['name'] : '',
305
+ type: "Subnet",
306
+ cloud: network['zone'] ? network['zone']['name'] : '',
307
+ cidr: subnet['cidr'],
308
+ cidrIPv6: subnet['cidrIPv6'],
309
+ pool: subnet['pool'] ? subnet['pool']['name'] : '',
310
+ dhcp: subnet['dhcpServer'] ? 'Yes' : 'No',
311
+ visibility: subnet['visibility'].to_s.capitalize,
312
+ active: format_boolean(subnet['active']),
313
+ tenants: subnet['tenants'] ? subnet['tenants'].collect {|it| it['name'] }.uniq.join(', ') : ''
314
+ }
315
+ }
316
+ columns = [:id, :name, :labels, :cidr, :cidrIPv6, :dhcp, :active, :visibility]
317
+ print cyan
318
+ print as_pretty_table(subnet_rows, columns, options)
319
+ print reset
320
+ print_results_pagination({'meta'=>{'total'=>subnet_rows.size,'size'=>subnet_rows.size}}, {:label => "subnet", :n_label => "subnets"})
321
+ end
322
+ print reset,"\n"
323
+ return 0
324
+ rescue RestClient::Exception => e
325
+ print_rest_exception(e, options)
326
+ return 1
327
+ end
328
+ end
329
+
330
+ def add(args)
331
+ options = {}
332
+ network_type_id = nil
333
+ tenants = nil
334
+ group_access_all = nil
335
+ group_access_list = nil
336
+ group_defaults_list = nil
337
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
338
+ opts.banner = subcommand_usage("-t TYPE")
339
+ opts.on( '-g', '--group GROUP', "Group Name or ID. Default is Shared." ) do |val|
340
+ options[:group] = val
341
+ end
342
+ opts.on( '-c', '--cloud CLOUD', "Cloud Name or ID" ) do |val|
343
+ options[:cloud] = val
344
+ end
345
+ opts.on('-t', '--type ID', "Network Type Name or ID") do |val|
346
+ options['type'] = val
347
+ end
348
+ opts.on('-s', '--server ID', "Network Server Name or ID") do |val|
349
+ options['server'] = val
350
+ end
351
+ opts.on('--name VALUE', String, "Name for this network") do |val|
352
+ options['name'] = val
353
+ end
354
+ opts.on('--display-name VALUE', String, "Display name for this network") do |val|
355
+ options['displayName'] = val
356
+ end
357
+ opts.on('-l', '--labels [LIST]', String, "Labels") do |val|
358
+ options['labels'] = parse_labels(val)
359
+ end
360
+ opts.on('--description VALUE', String, "Description of network") do |val|
361
+ options['description'] = val
362
+ end
363
+ opts.on('--ipv4Enabled [on|off]', String, "ipv4Enabled") do |val|
364
+ options['ipv4Enabled'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
365
+ end
366
+ opts.on('--ipv6Enabled [on|off]', String, "ipv6Enabled") do |val|
367
+ options['ipv6Enabled'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
368
+ end
369
+ opts.on('--gateway VALUE', String, "Gateway") do |val|
370
+ options['gateway'] = val
371
+ end
372
+ opts.on('--dns-primary VALUE', String, "DNS Primary") do |val|
373
+ options['dnsPrimary'] = val
374
+ end
375
+ opts.on('--dns-secondary VALUE', String, "DNS Secondary") do |val|
376
+ options['dnsSecondary'] = val
377
+ end
378
+ opts.on('--cidr VALUE', String, "CIDR") do |val|
379
+ options['cidr'] = val
380
+ end
381
+ opts.on('--gateway-ipv6 VALUE', String, "IPv6 Gateway") do |val|
382
+ options['gatewayIPv6'] = val
383
+ end
384
+ opts.on('--gatewayIPv6 VALUE', String, "IPv6 Gateway") do |val|
385
+ options['gatewayIPv6'] = val
386
+ end
387
+ opts.add_hidden_option('--gatewayIPv6')
388
+ opts.on('--dns-primary-ipv6 VALUE', String, "IPv6 DNS Primary") do |val|
389
+ options['dnsPrimaryIPv6'] = val
390
+ end
391
+ opts.on('--dns-primaryIPv6 VALUE', String, "IPv6 DNS Primary") do |val|
392
+ options['dnsPrimaryIPv6'] = val
393
+ end
394
+ opts.add_hidden_option('--dns-primaryIPv6')
395
+ opts.on('--dns-secondary-ipv6 VALUE', String, "IPv6 DNS Secondary") do |val|
396
+ options['dnsSecondaryIPv6'] = val
397
+ end
398
+ opts.on('--dns-secondaryIPv6 VALUE', String, "IPv6 DNS Secondary") do |val|
399
+ options['dnsSecondaryIPv6'] = val
400
+ end
401
+ opts.add_hidden_option('--dns-secondaryIPv6')
402
+ opts.on('--cidr-ipv6 VALUE', String, "IPv6 CIDR") do |val|
403
+ options['cidrIPv6'] = val
404
+ end
405
+ opts.on('--cidrIPv6 VALUE', String, "IPv6 CIDR") do |val|
406
+ options['cidrIPv6'] = val
407
+ end
408
+ opts.add_hidden_option('--cidrIPv6')
409
+ opts.on('--vlan-id VALUE', String, "VLAN ID") do |val|
410
+ options['vlanId'] = val.to_i
411
+ end
412
+ opts.on('--pool ID', String, "Network Pool") do |val|
413
+ options['pool'] = val.to_i
414
+ end
415
+ opts.on('--dhcp-server [on|off]', String, "DHCP Server") do |val|
416
+ options['dhcpServer'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
417
+ end
418
+ opts.on('--dhcp-serverIPv6 [on|off]', String, "IPv6 DHCP Server") do |val|
419
+ options['dhcpServerIPv6'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
420
+ end
421
+ opts.on('--dhcp-server-ipv6 [on|off]', String, "IPv6 DHCP Server") do |val|
422
+ options['dhcpServerIPv6'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
423
+ end
424
+ opts.on('--allow-ip-override [on|off]', String, "Allow IP Override") do |val|
425
+ options['allowStaticOverride'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
426
+ end
427
+ opts.on('--domain [VALUE]', String, "Network Domain ID") do |val|
428
+ options['domain'] = val
429
+ end
430
+ opts.on('--search-domains [VALUE]', String, "Search Domains") do |val|
431
+ options['searchDomains'] = val
432
+ end
433
+ # opts.on('--scan [on|off]', String, "Scan Network") do |val|
434
+ # options['scanNetwork'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
435
+ # end
436
+ opts.on('--proxy VALUE', String, "Network Proxy ID") do |val|
437
+ options['proxy'] = val
438
+ end
439
+ opts.on('--proxy-bypass [on|off]', String, "Bypass Proxy for Appliance URL") do |val|
440
+ options['applianceUrlProxyBypass'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
441
+ end
442
+ opts.on('--no-proxy LIST', String, "No Proxy Addresses") do |val|
443
+ options['noProxy'] = val
444
+ end
445
+ opts.on('--group-access-all [on|off]', String, "Toggle Access for all groups.") do |val|
446
+ group_access_all = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
447
+ end
448
+ opts.on('--group-access LIST', Array, "Group Access, comma separated list of group IDs.") do |list|
449
+ if list.size == 1 && list[0] == 'null' # hacky way to clear it
450
+ group_access_list = []
451
+ else
452
+ group_access_list = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
453
+ end
454
+ end
455
+ opts.on('--group-defaults LIST', Array, "Group Default Selection, comma separated list of group IDs") do |list|
456
+ if list.size == 1 && list[0] == 'null' # hacky way to clear it
457
+ group_defaults_list = []
458
+ else
459
+ group_defaults_list = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
460
+ end
461
+ end
462
+ opts.on('--tenants LIST', Array, "Tenant Access, comma separated list of account IDs") do |list|
463
+ if list.size == 1 && list[0] == 'null' # hacky way to clear it
464
+ options['tenants'] = []
465
+ else
466
+ options['tenants'] = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
467
+ end
468
+ end
469
+ opts.on('--accounts LIST', Array, "alias for --tenants") do |list|
470
+ if list.size == 1 && list[0] == 'null' # hacky way to clear it
471
+ options['tenants'] = []
472
+ else
473
+ options['tenants'] = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
474
+ end
475
+ end
476
+ opts.on('--visibility [private|public]', String, "Visibility") do |val|
477
+ options['visibility'] = val
478
+ end
479
+ opts.on('--active [on|off]', String, "Can be used to disable a network") do |val|
480
+ options['active'] = val.to_s == 'on' || val.to_s == 'true'
481
+ end
482
+ build_common_options(opts, options, [:options, :payload, :json, :dry_run, :quiet, :remote])
483
+ opts.footer = "Create a new network." + "\n" +
484
+ "[name] is required and can be passed as --name instead."
485
+ end
486
+ optparse.parse!(args)
487
+ if args.count > 1
488
+ print_error MtnCloud::Terminal.angry_prompt
489
+ puts_error "wrong number of arguments, expected 0-1 and got #{args.count}\n#{optparse}"
490
+ return 1
491
+ end
492
+ connect(options)
493
+ begin
494
+ # merge -O options into normally parsed options
495
+ options.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
496
+
497
+ # support [name] as first argument
498
+ if args[0]
499
+ options['name'] = args[0]
500
+ end
501
+
502
+ # construct payload
503
+ payload = nil
504
+ if options[:payload]
505
+ payload = options[:payload]
506
+
507
+ # backward compat
508
+ if payload['resourcePermissions']
509
+ payload['network'] ||= {}
510
+ payload['network']['resourcePermission'] = payload['resourcePermissions']
511
+ payload.delete('resourcePermissions')
512
+ end
513
+ if payload['network'] && payload['network']['resourcePermissions']
514
+ payload['network']['resourcePermission'] = payload['network']['resourcePermissions']
515
+ payload['network'].delete('resourcePermissions')
516
+ end
517
+ else
518
+ # prompt for network options
519
+ payload = {
520
+ 'network' => {
521
+ # 'config' => {}
522
+ }
523
+ }
524
+
525
+ # allow arbitrary -O options
526
+ payload['network'].deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
527
+
528
+ # all of these prompts pass in options instead of options[:options] so merge them here
529
+ options.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
530
+
531
+ # Name
532
+ if options['name']
533
+ payload['network']['name'] = options['name']
534
+ else
535
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true, 'description' => 'Name for this network.'}], options)
536
+ payload['network']['name'] = v_prompt['name']
537
+ end
538
+
539
+ # Display Name
540
+ if options['displayName']
541
+ payload['network']['displayName'] = options['displayName']
542
+ else
543
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'displayName', 'fieldLabel' => 'Display Name', 'type' => 'text', 'required' => false, 'description' => 'Display name for this network.'}], options)
544
+ payload['network']['displayName'] = v_prompt['displayName']
545
+ end
546
+
547
+ # Labels
548
+ if options['labels']
549
+ payload['network']['labels'] = options['labels']
550
+ end
551
+
552
+ # Description
553
+ if options['description']
554
+ payload['network']['description'] = options['description']
555
+ else
556
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'description', 'fieldLabel' => 'Description', 'type' => 'text', 'required' => false, 'description' => 'Description of network.'}], options)
557
+ payload['network']['description'] = v_prompt['description']
558
+ end
559
+
560
+ # Group
561
+ # ok, networks list needs to know if they have full or groups permission
562
+ group = nil
563
+ groups_dropdown = nil
564
+ group_is_required = true
565
+ network_perm = (current_user_permissions || []).find {|perm| perm['code'] == 'infrastructure-networks'}
566
+ if network_perm && ['full','read'].include?(network_perm['access'])
567
+ group_is_required = false
568
+ groups_dropdown = get_available_groups_with_shared
569
+ else
570
+ # they have group access, shared cannot be selected.
571
+ groups_dropdown = get_available_groups
572
+ end
573
+ if options[:group]
574
+ group_id = options[:group]
575
+ group = groups_dropdown.find {|it| it["value"].to_s == group_id.to_s || it["name"].to_s == group_id}
576
+ if group.nil?
577
+ print_red_alert "Group not found by id #{group_id}"
578
+ return 1
579
+ end
580
+ if group_id.to_s == 'shared'
581
+ group_id = nil
582
+ group = nil
583
+ end
584
+ else
585
+ group_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'group', 'type' => 'select', 'fieldLabel' => 'Group', 'selectOptions' => groups_dropdown, 'required' => group_is_required, 'description' => 'Select Group.'}],options,@api_client,{})
586
+ group_id = group_prompt['group']
587
+ if group_id.to_s == '' || group_id.to_s == 'shared'
588
+ group_id = nil
589
+ group = nil
590
+ else
591
+ group = groups_dropdown.find {|it| it["value"].to_s == group_id.to_s || it["name"].to_s == group_id}
592
+ if group.nil?
593
+ print_red_alert "Group not found by id #{group_id}"
594
+ return 1
595
+ end
596
+ end
597
+ end
598
+ if group
599
+ payload['network']['site'] = {'id' => group['id']}
600
+ else
601
+ # shared
602
+ end
603
+
604
+ # Network Type
605
+ network_type_id = nil
606
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'type', 'fieldLabel' => 'Network Type', 'type' => 'select', 'optionSource' => 'creatableNetworkTypes', 'required' => true, 'description' => 'Choose a network type.'}], options, @api_client, {accountId: current_account()['id']})
607
+ network_type_id = v_prompt['type']
608
+ if network_type_id.nil? || network_type_id.to_s.empty?
609
+ print_red_alert "Network Type not found by id '#{options['type']}'"
610
+ return 1
611
+ end
612
+ payload['network']['type'] = {'id' => network_type_id.to_i }
613
+
614
+ network_type = nil
615
+ json_response = @network_types_interface.get(network_type_id)
616
+ if json_response["networkType"]
617
+ network_type = json_response["networkType"]
618
+ else
619
+ print_red_alert "Network Type not found by id '#{network_type_id}'"
620
+ return 1
621
+ end
622
+
623
+ if network_type['hasNetworkServer']
624
+ api_params = {networkType: {id: network_type['id']}}
625
+
626
+ # Network Server
627
+ if options['server']
628
+ network_server = @options_interface.options_for_source('networkServer', api_params)['data'].find {|it|
629
+ it['name'] == options['server'] || it['value'].to_s == options['server']
630
+ }
631
+
632
+ if network_server.nil?
633
+ print_red_alert "Network Server not found by name or id '#{options['server']}' for network type '#{options['server']}'"
634
+ return 1
635
+ end
636
+ network_server_id = network_server['value']
637
+ payload['network']['networkServer'] = {'id' => network_server_id}
638
+ else
639
+ network_server_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'server', 'type' => 'select', 'fieldLabel' => 'Network Server', 'optionSource' => 'networkServer', 'required' => true, 'description' => 'Select Network Service.'}],options,@api_client,api_params)
640
+ network_server_id = network_server_prompt['server']
641
+ payload['network']['networkServer'] = {'id' => network_server_id}
642
+ end
643
+ else
644
+ # Cloud
645
+ cloud = nil
646
+ if group
647
+ if options[:cloud]
648
+ cloud_id = options[:cloud]
649
+ cloud = group["clouds"].find {|it| it["id"].to_s == cloud_id.to_s || it["name"].to_s == cloud_id}
650
+ if cloud.nil?
651
+ print_red_alert "Cloud not found by id #{cloud_id}"
652
+ return 1
653
+ end
654
+ else
655
+ api_params = {groupId:group['id']}
656
+ cloud_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'cloud', 'type' => 'select', 'fieldLabel' => 'Cloud', 'optionSource' => 'cloudsForNetworks', 'required' => true, 'description' => 'Select Cloud.'}],options,@api_client,api_params)
657
+ cloud_id = cloud_prompt['cloud']
658
+ cloud = find_cloud_by_name_or_id(cloud_id) if cloud_id
659
+ return 1 if cloud.nil?
660
+ end
661
+ else
662
+ if options[:cloud]
663
+ cloud = find_cloud_by_name_or_id(options[:cloud])
664
+ # meh, should validate cloud is in the cloudsForNetworks dropdown..
665
+ return 1 if cloud.nil?
666
+ else
667
+ api_params = {}
668
+ cloud_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'cloud', 'type' => 'select', 'fieldLabel' => 'Cloud', 'optionSource' => 'cloudsForNetworks', 'required' => true, 'description' => 'Select Cloud.'}],options,@api_client,api_params)
669
+ cloud_id = cloud_prompt['cloud']
670
+ cloud = find_cloud_by_name_or_id(cloud_id) if cloud_id
671
+ return 1 if cloud.nil?
672
+ end
673
+ end
674
+ payload['network']['zone'] = {'id' => cloud['id']}
675
+ end
676
+
677
+ if options['ipv4Enabled'].nil? && payload['network']['ipv4Enabled'].nil?
678
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'ipv4Enabled', 'fieldLabel' => 'IPv4 Enabled', 'type' => 'checkbox', 'required' => false, 'description' => '', 'defaultValue' => true}], options)
679
+ val = v_prompt['ipv4Enabled']
680
+ payload['network']['ipv4Enabled'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
681
+ else
682
+ payload['network']['ipv4Enabled'] = options['ipv4Enabled']
683
+ end
684
+
685
+ if payload['network']['ipv4Enabled']
686
+ # CIDR
687
+ if network_type['hasCidr'] && network_type['cidrEditable']
688
+ if options['cidr']
689
+ payload['network']['cidr'] = options['cidr']
690
+ else
691
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'cidr', 'fieldLabel' => network_type['code'] == 'nsxtLogicalSwitch' ? 'Gateway CIDR' : 'CIDR', 'type' => 'text', 'required' => network_type['cidrRequired'], 'description' => ''}], options)
692
+ payload['network']['cidr'] = v_prompt['cidr']
693
+ end
694
+ end
695
+
696
+ # Gateway
697
+ if network_type['gatewayEditable']
698
+ if options['gateway']
699
+ payload['network']['gateway'] = options['gateway']
700
+ else
701
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'gateway', 'fieldLabel' => 'Gateway', 'type' => 'text', 'required' => false, 'description' => ''}], options)
702
+ payload['network']['gateway'] = v_prompt['gateway']
703
+ end
704
+ end
705
+
706
+ # DNS
707
+ if network_type['dnsEditable']
708
+ if options['dnsPrimary']
709
+ payload['network']['dnsPrimary'] = options['dnsPrimary']
710
+ else
711
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'dnsPrimary', 'fieldLabel' => 'DNS Primary', 'type' => 'text', 'required' => false, 'description' => ''}], options)
712
+ payload['network']['dnsPrimary'] = v_prompt['dnsPrimary']
713
+ end
714
+
715
+ if options['dnsSecondary']
716
+ payload['network']['dnsSecondary'] = options['dnsSecondary']
717
+ else
718
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'dnsSecondary', 'fieldLabel' => 'DNS Secondary', 'type' => 'text', 'required' => false, 'description' => ''}], options)
719
+ payload['network']['dnsSecondary'] = v_prompt['dnsSecondary']
720
+ end
721
+ end
722
+ end
723
+
724
+ if options['ipv6Enabled'].nil? && payload['network']['ipv6Enabled'].nil?
725
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'ipv6Enabled', 'fieldLabel' => 'IPv6 Enabled', 'type' => 'checkbox', 'required' => false, 'description' => '', 'defaultValue' => false}], options)
726
+ val = v_prompt['ipv6Enabled']
727
+ payload['network']['ipv6Enabled'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
728
+ else
729
+ payload['network']['ipv6Enabled'] = options['ipv6Enabled']
730
+ end
731
+
732
+ if payload['network']['ipv6Enabled']
733
+ #IPv6 Options
734
+ # CIDR
735
+ if network_type['hasCidr'] && network_type['cidrEditable']
736
+ if options['cidrIPv6']
737
+ payload['network']['cidrIPv6'] = options['cidr']
738
+ else
739
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'cidrIPv6', 'fieldLabel' => 'IPv6 CIDR', 'type' => 'text', 'required' => false, 'description' => ''}], options)
740
+ payload['network']['cidrIPv6'] = v_prompt['cidrIPv6']
741
+ end
742
+ end
743
+
744
+ # Gateway
745
+ if network_type['gatewayEditable']
746
+ if options['gatewayIPv6']
747
+ payload['network']['gatewayIPv6'] = options['gatewayIPv6']
748
+ else
749
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'gatewayIPv6', 'fieldLabel' => 'IPv6 Gateway', 'type' => 'text', 'required' => false, 'description' => ''}], options)
750
+ payload['network']['gatewayIPv6'] = v_prompt['gatewayIPv6']
751
+ end
752
+ end
753
+
754
+ # DNS
755
+ if network_type['dnsEditable']
756
+ if options['dnsPrimaryIPv6']
757
+ payload['network']['dnsPrimaryIPv6'] = options['dnsPrimaryIPv6']
758
+ else
759
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'dnsPrimaryIPv6', 'fieldLabel' => 'IPv6 DNS Primary', 'type' => 'text', 'required' => false, 'description' => ''}], options)
760
+ payload['network']['dnsPrimaryIPv6'] = v_prompt['dnsPrimaryIPv6']
761
+ end
762
+
763
+ if options['dnsSecondary']
764
+ payload['network']['dnsSecondaryIPv6'] = options['dnsSecondaryIPv6']
765
+ else
766
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'dnsSecondaryIPv6', 'fieldLabel' => 'IPv6 DNS Secondary', 'type' => 'text', 'required' => false, 'description' => ''}], options)
767
+ payload['network']['dnsSecondaryIPv6'] = v_prompt['dnsSecondaryIPv6']
768
+ end
769
+ end
770
+ # DHCP Server
771
+ if network_type['dhcpServerEditable'] && payload['network']['dhcpServerIPv6'].nil?
772
+ if options['dhcpServerIPv6'] != nil
773
+ payload['network']['dhcpServerIPv6'] = options['dhcpServerIPv6']
774
+ else
775
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'dhcpServerIPv6', 'fieldLabel' => 'IPv6 DHCP Server', 'type' => 'checkbox', 'required' => false, 'description' => ''}], options)
776
+ payload['network']['dhcpServerIPv6'] = v_prompt['dhcpServerIPv6']
777
+ end
778
+ end
779
+ end
780
+
781
+
782
+ # VLAN ID
783
+ if network_type['vlanIdEditable']
784
+ if options['vlanId']
785
+ payload['network']['vlanId'] = options['vlanId']
786
+ else
787
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'vlanId', 'fieldLabel' => 'VLAN ID', 'type' => 'number', 'required' => false, 'description' => ''}], options)
788
+ payload['network']['vlanId'] = v_prompt['vlanId']
789
+ end
790
+ end
791
+
792
+ # prompt for option types
793
+ network_type_option_types = network_type['optionTypes']
794
+ if network_type_option_types && network_type_option_types.size > 0
795
+ api_params = {}
796
+ api_params['network.site.id'] = group ? group['id'] : 'shared'
797
+ api_params['network.zone.id'] = cloud['id'] if !cloud.nil?
798
+ api_params['network.type.id'] = network_type['id']
799
+ api_params['network.networkServer.id'] = network_server_id if !network_server_id.nil?
800
+ network_type_params = MtnCloud::Cli::OptionTypes.prompt(network_type_option_types,(options[:options] || {}).merge(payload),@api_client, api_params)
801
+ # network context options belong at network level and not network.network
802
+ network_context_params = network_type_params.delete('network')
803
+ payload['network'].deep_merge!(network_context_params) if network_context_params
804
+ payload['network'].deep_merge!(network_type_params)
805
+ end
806
+
807
+ # Active
808
+ if options['active'].nil? && payload['network']['active'].nil?
809
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'active', 'fieldLabel' => 'Active', 'type' => 'checkbox', 'required' => false, 'description' => '', 'defaultValue' => true}], options)
810
+ payload['network']['active'] = v_prompt['active']
811
+ else
812
+ payload['network']['active'] = options['active']
813
+ end
814
+
815
+ # DHCP Server
816
+ if network_type['dhcpServerEditable'] && payload['network']['dhcpServer'].nil?
817
+ if options['dhcpServer'] != nil
818
+ payload['network']['dhcpServer'] = options['dhcpServer']
819
+ else
820
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'dhcpServer', 'fieldLabel' => 'DHCP Server', 'type' => 'checkbox', 'required' => false, 'description' => ''}], options)
821
+ payload['network']['dhcpServer'] = v_prompt['dhcpServer']
822
+ end
823
+ end
824
+
825
+ # Allow IP Override
826
+ if payload['network']['allowStaticOverride'].nil?
827
+ if options['allowStaticOverride'] != nil
828
+ payload['network']['allowStaticOverride'] = options['allowStaticOverride']
829
+ else
830
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'allowStaticOverride', 'fieldLabel' => 'Allow IP Override', 'type' => 'checkbox', 'required' => false, 'description' => ''}], options)
831
+ payload['network']['allowStaticOverride'] = v_prompt['allowStaticOverride']
832
+ end
833
+ end
834
+
835
+ ## IPAM Options
836
+
837
+ # Network Pool
838
+ if network_type['canAssignPool'] && payload['network']['pool'].nil?
839
+ if options['pool']
840
+ payload['network']['pool'] = options['pool'].to_i
841
+ else
842
+ # todo: select dropdown
843
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'pool', 'fieldLabel' => 'Network Pool', 'type' => 'select', 'optionSource' => 'networkPools', 'required' => false, 'description' => ''}], options, @api_client, api_params)
844
+ payload['network']['pool'] = v_prompt['pool'].to_i if v_prompt['pool']
845
+ end
846
+ end
847
+
848
+ ## Advanced Options
849
+
850
+ # Network Domain
851
+ if payload['network']['networkDomain'].nil?
852
+ if options.key?('domain') && options['domain'].to_s.empty? # clear it?
853
+ payload['network']['networkDomain'] = {'id' => nil}
854
+ else
855
+ # always prompt to handle value as name instead of id...
856
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'domain', 'fieldLabel' => 'Network Domain', 'type' => 'select', 'optionSource' => 'networkDomains', 'required' => false, 'description' => ''}], options, @api_client)
857
+ payload['network']['networkDomain'] = {'id' => v_prompt['domain'].to_i} unless v_prompt['domain'].to_s.empty?
858
+ end
859
+ end
860
+
861
+ # Search Domains
862
+ if options.key?('searchDomains')
863
+ payload['network']['searchDomains'] = options['searchDomains']
864
+ else
865
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'searchDomains', 'fieldLabel' => 'Search Domains', 'type' => 'text', 'required' => false, 'description' => ''}], options)
866
+ payload['network']['searchDomains'] = v_prompt['searchDomains']
867
+ end
868
+
869
+ # Scan Network
870
+ if options['scanNetwork'] != nil
871
+ payload['network']['scanNetwork'] = options['scanNetwork']
872
+ else
873
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'scanNetwork', 'fieldLabel' => 'Scan Network', 'type' => 'checkbox', 'required' => false, 'description' => '', 'defaultValue' => false}], options)
874
+ payload['network']['scanNetwork'] = v_prompt['scanNetwork']
875
+ end
876
+
877
+ # Proxy
878
+ if options['networkProxy']
879
+ payload['network']['networkProxy'] = {'id' => options['networkProxy'].to_i}
880
+ else
881
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'networkProxy', 'fieldLabel' => 'Network Proxy', 'type' => 'select', 'optionSource' => 'networkProxies', 'required' => false, 'description' => ''}], options, @api_client)
882
+ payload['network']['networkProxy'] = {'id' => v_prompt['networkProxy'].to_i} unless v_prompt['networkProxy'].to_s.empty?
883
+ end
884
+
885
+ # ByPass Proxy for Appliance URL
886
+ if options['applianceUrlProxyBypass'] != nil
887
+ payload['network']['applianceUrlProxyBypass'] = options['applianceUrlProxyBypass']
888
+ else
889
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'applianceUrlProxyBypass', 'fieldLabel' => 'Bypass Proxy for Appliance URL', 'type' => 'checkbox', 'required' => false, 'description' => '', 'defaultValue' => true}], options)
890
+ payload['network']['applianceUrlProxyBypass'] = v_prompt['applianceUrlProxyBypass']
891
+ end
892
+
893
+ # No Proxy
894
+ if options['noProxy']
895
+ payload['network']['noProxy'] = options['noProxy']
896
+ else
897
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'noProxy', 'fieldLabel' => 'No Proxy', 'type' => 'text', 'required' => false, 'description' => 'List of ip addresses or name servers to exclude proxy traversal for. Typically locally routable servers are excluded.'}], options)
898
+ payload['network']['noProxy'] = v_prompt['noProxy']
899
+ end
900
+
901
+ # Group Access
902
+ # Group Access (default is All)
903
+ if !options[:no_prompt] && group_access_all.nil? && group_access_list.nil? && payload['resourcePermission'].nil? && payload['network']['resourcePermission'].nil?
904
+ perm_excludes = ['plans']
905
+ perm_excludes << 'tenants' if options['tenants'] || payload['tenantPermissions'] || payload['network']['tenants']
906
+ perm_excludes << 'visibility' if options['visibility'] || payload['network']['visibility']
907
+ perms = prompt_permissions(options, perm_excludes)
908
+
909
+ payload['network']['resourcePermission'] = perms['resourcePermissions']
910
+ payload['network']['tenants'] = perms['tenantPermissions']['accounts'].collect {|it| {'id': it}} if perms['tenantPermissions']
911
+ payload['network']['visibility'] = perms['resourcePool']['visibility'] if perms['resourcePool']
912
+ else
913
+ if !group_access_list.nil?
914
+ payload['network']['resourcePermission'] ||= {}
915
+ payload['network']['resourcePermission']['sites'] = group_access_list.collect do |site_id|
916
+ site = {"id" => site_id.to_i}
917
+ if group_defaults_list && group_defaults_list.include?(site_id)
918
+ site["default"] = true
919
+ end
920
+ site
921
+ end
922
+ elsif !group_access_all.nil?
923
+ payload['network']['resourcePermission'] ||= {}
924
+ payload['network']['resourcePermission']['all'] = group_access_all
925
+ else
926
+ payload['network']['resourcePermission'] ||= {}
927
+ payload['network']['resourcePermission']['all'] = true
928
+ end
929
+ end
930
+
931
+ # Tenants
932
+ if !options[:no_prompt] && options['tenants'].nil? && payload['tenantPermissions'].nil? && payload['network']['tenants'].nil?
933
+ perm_excludes = ['plans', 'groups']
934
+ perm_excludes << 'visibility' if options['visibility'] || payload['network']['visibility']
935
+ perms = prompt_permissions(options, perm_excludes)
936
+
937
+ payload['network']['tenants'] = perms['tenantPermissions']['accounts'].collect {|it| {'id': it}} if perms['tenantPermissions']
938
+ payload['network']['visibility'] = perms['resourcePool']['visibility'] if perms['resourcePool']
939
+ elsif options['tenants']
940
+ payload['network']['tenants'] = options['tenants'].collect {|it| {'id': it}}
941
+ end
942
+
943
+ # Visibility
944
+ if options['visibility'].nil? && payload['network']['visibility'].nil?
945
+ perms = prompt_permissions(options, ['plans', 'groups', 'tenants'])
946
+ payload['network']['visibility'] = perms['resourcePool'].nil? ? 'private' : perms['resourcePool']['visibility']
947
+ else
948
+ payload['network']['visibility'] = options['visibility'] || 'private'
949
+ end
950
+ end
951
+
952
+ @networks_interface.setopts(options)
953
+ if options[:dry_run]
954
+ print_dry_run @networks_interface.dry.create(payload)
955
+ return
956
+ end
957
+ json_response = @networks_interface.create(payload)
958
+ if options[:json]
959
+ print JSON.pretty_generate(json_response)
960
+ print "\n"
961
+ elsif !options[:quiet]
962
+ network = json_response['network']
963
+ print_green_success "Added network #{network['name']}"
964
+ get_args = [network['id']] + (options[:remote] ? ["-r",options[:remote]] : [])
965
+ get(get_args)
966
+ end
967
+ return 0
968
+ rescue RestClient::Exception => e
969
+ print_rest_exception(e, options)
970
+ exit 1
971
+ end
972
+ end
973
+
974
+ def update(args)
975
+ options = {}
976
+ # network_type_id = nil
977
+ tenants = nil
978
+ group_access_all = nil
979
+ group_access_list = nil
980
+ group_defaults_list = nil
981
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
982
+ opts.banner = subcommand_usage("[network] [options]")
983
+ # opts.on( '-c', '--cloud CLOUD', "Cloud Name or ID" ) do |val|
984
+ # options[:cloud] = val
985
+ # end
986
+ # opts.on('-t', '--type ID', "Network Type Name or ID") do |val|
987
+ # options['type'] = val
988
+ # end
989
+ opts.on('--name VALUE', String, "Name for this network") do |val|
990
+ options['name'] = val
991
+ end
992
+ opts.on('-l', '--labels [LIST]', String, "Labels") do |val|
993
+ options['labels'] = parse_labels(val)
994
+ end
995
+ opts.on('--description VALUE', String, "Description of network") do |val|
996
+ options['description'] = val
997
+ end
998
+ opts.on('--display-name VALUE', String, "Display name for this network") do |val|
999
+ options['displayName'] = val
1000
+ end
1001
+ opts.on('--ipv4Enabled [on|off]', String, "ipv4Enabled") do |val|
1002
+ options['ipv4Enabled'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
1003
+ end
1004
+ opts.on('--ipv6Enabled [on|off]', String, "ipv6Enabled") do |val|
1005
+ options['ipv6Enabled'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
1006
+ end
1007
+ opts.on('--gateway VALUE', String, "Gateway") do |val|
1008
+ options['gateway'] = val
1009
+ end
1010
+ opts.on('--dns-primary VALUE', String, "DNS Primary") do |val|
1011
+ options['dnsPrimary'] = val
1012
+ end
1013
+ opts.on('--dns-secondary VALUE', String, "DNS Secondary") do |val|
1014
+ options['dnsSecondary'] = val
1015
+ end
1016
+ opts.on('--cidr VALUE', String, "CIDR") do |val|
1017
+ options['cidr'] = val
1018
+ end
1019
+ opts.on('--gateway-ipv6 VALUE', String, "IPv6 Gateway") do |val|
1020
+ options['gatewayIPv6'] = val
1021
+ end
1022
+ opts.on('--gatewayIPv6 VALUE', String, "IPv6 Gateway") do |val|
1023
+ options['gatewayIPv6'] = val
1024
+ end
1025
+ opts.add_hidden_option('--gatewayIPv6')
1026
+ opts.on('--dns-primary-ipv6 VALUE', String, "IPv6 DNS Primary") do |val|
1027
+ options['dnsPrimaryIPv6'] = val
1028
+ end
1029
+ opts.on('--dns-primaryIPv6 VALUE', String, "IPv6 DNS Primary") do |val|
1030
+ options['dnsPrimaryIPv6'] = val
1031
+ end
1032
+ opts.add_hidden_option('--dns-primaryIPv6')
1033
+ opts.on('--dns-secondary-ipv6 VALUE', String, "IPv6 DNS Secondary") do |val|
1034
+ options['dnsSecondaryIPv6'] = val
1035
+ end
1036
+ opts.on('--dns-secondaryIPv6 VALUE', String, "IPv6 DNS Secondary") do |val|
1037
+ options['dnsSecondaryIPv6'] = val
1038
+ end
1039
+ opts.add_hidden_option('--dns-secondaryIPv6')
1040
+ opts.on('--cidr-ipv6 VALUE', String, "IPv6 CIDR") do |val|
1041
+ options['cidrIPv6'] = val
1042
+ end
1043
+ opts.on('--cidrIPv6 VALUE', String, "IPv6 CIDR") do |val|
1044
+ options['cidrIPv6'] = val
1045
+ end
1046
+ opts.add_hidden_option('--cidrIPv6')
1047
+ opts.on('--vlan-id VALUE', String, "VLAN ID") do |val|
1048
+ options['vlanId'] = val.to_i
1049
+ end
1050
+ opts.on('--pool ID', String, "Network Pool") do |val|
1051
+ options['pool'] = val.to_i
1052
+ end
1053
+ opts.on('--dhcp-server [on|off]', String, "DHCP Server") do |val|
1054
+ options['dhcpServer'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
1055
+ end
1056
+ opts.on('--dhcp-serverIPv6 [on|off]', String, "IPv6 DHCP Server") do |val|
1057
+ options['dhcpServerIPv6'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
1058
+ end
1059
+ opts.on('--dhcp-server-ipv6 [on|off]', String, "IPv6 DHCP Server") do |val|
1060
+ options['dhcpServerIPv6'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
1061
+ end
1062
+ opts.on('--allow-ip-override [on|off]', String, "Allow IP Override") do |val|
1063
+ options['allowStaticOverride'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
1064
+ end
1065
+ opts.on('--domain [VALUE]', String, "Network Domain ID") do |val|
1066
+ options['domain'] = val
1067
+ end
1068
+ opts.on('--search-domains [VALUE]', String, "Search Domains") do |val|
1069
+ options['searchDomains'] = val
1070
+ end
1071
+ # opts.on('--scan [on|off]', String, "Scan Network") do |val|
1072
+ # options['scanNetwork'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
1073
+ # end
1074
+ opts.on('--proxy VALUE', String, "Network Proxy ID") do |val|
1075
+ options['proxy'] = val
1076
+ end
1077
+ opts.on('--proxy-bypass [on|off]', String, "Bypass Proxy for Appliance URL") do |val|
1078
+ options['applianceUrlProxyBypass'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
1079
+ end
1080
+ opts.on('--no-proxy LIST', String, "No Proxy Addresses") do |val|
1081
+ options['noProxy'] = val
1082
+ end
1083
+ opts.on('--group-access-all [on|off]', String, "Toggle Access for all groups.") do |val|
1084
+ group_access_all = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
1085
+ end
1086
+ opts.on('--group-access LIST', Array, "Group Access, comma separated list of group IDs.") do |list|
1087
+ if list.size == 1 && list[0] == 'null' # hacky way to clear it
1088
+ group_access_list = []
1089
+ else
1090
+ group_access_list = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
1091
+ end
1092
+ end
1093
+ opts.on('--group-defaults LIST', Array, "Group Default Selection, comma separated list of group IDs") do |list|
1094
+ if list.size == 1 && list[0] == 'null' # hacky way to clear it
1095
+ group_defaults_list = []
1096
+ else
1097
+ group_defaults_list = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
1098
+ end
1099
+ end
1100
+ opts.on('--tenants LIST', Array, "Tenant Access, comma separated list of account IDs") do |list|
1101
+ if list.size == 1 && list[0] == 'null' # hacky way to clear it
1102
+ options['tenants'] = []
1103
+ else
1104
+ options['tenants'] = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
1105
+ end
1106
+ end
1107
+ opts.on('--accounts LIST', Array, "alias for --tenants") do |list|
1108
+ if list.size == 1 && list[0] == 'null' # hacky way to clear it
1109
+ options['tenants'] = []
1110
+ else
1111
+ options['tenants'] = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
1112
+ end
1113
+ end
1114
+ opts.on('--visibility [private|public]', String, "Visibility") do |val|
1115
+ options['visibility'] = val
1116
+ end
1117
+ opts.on('--active [on|off]', String, "Can be used to disable a network") do |val|
1118
+ options['active'] = val.to_s == 'on' || val.to_s == 'true'
1119
+ end
1120
+ build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
1121
+ opts.footer = "Update a network." + "\n" +
1122
+ "[network] is required. This is the id of a network."
1123
+ end
1124
+ optparse.parse!(args)
1125
+ if args.count != 1
1126
+ print_error MtnCloud::Terminal.angry_prompt
1127
+ puts_error "wrong number of arguments, expected 1 and got #{args.count}\n#{optparse}"
1128
+ return 1
1129
+ end
1130
+ connect(options)
1131
+
1132
+ begin
1133
+ network = find_network_by_name_or_id(args[0])
1134
+ return 1 if network.nil?
1135
+
1136
+ # merge -O options into normally parsed options
1137
+ options.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
1138
+
1139
+ # construct payload
1140
+ payload = nil
1141
+ if options[:payload]
1142
+ payload = options[:payload]
1143
+
1144
+ # backward compat
1145
+ if payload['resourcePermissions']
1146
+ payload['network'] ||= {}
1147
+ payload['network']['resourcePermission'] = payload['resourcePermissions']
1148
+ payload.delete('resourcePermissions')
1149
+ end
1150
+ if payload['network'] && payload['network']['resourcePermissions']
1151
+ payload['network']['resourcePermission'] = payload['network']['resourcePermissions']
1152
+ payload['network'].delete('resourcePermissions')
1153
+ end
1154
+ else
1155
+ # prompt for network options
1156
+ payload = {
1157
+ 'network' => {
1158
+ # 'config' => {}
1159
+ }
1160
+ }
1161
+
1162
+ # allow arbitrary -O options
1163
+ payload['network'].deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
1164
+
1165
+ # # Cloud
1166
+ # cloud = nil
1167
+ # if options[:cloud]
1168
+ # cloud = find_cloud_by_name_or_id(options[:cloud])
1169
+ # # meh, should validate cloud is in the cloudsForNetworks dropdown..
1170
+ # return 1 if cloud.nil?
1171
+ # else
1172
+ # # print_red_alert "Cloud not specified!"
1173
+ # # exit 1
1174
+ # cloud_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'cloud', 'type' => 'select', 'fieldLabel' => 'Cloud', 'optionSource' => 'cloudsForNetworks', 'required' => true, 'description' => 'Select Cloud.'}],options,@api_client,{})
1175
+ # cloud_id = cloud_prompt['cloud']
1176
+ # cloud = find_cloud_by_name_or_id(cloud_id) if cloud_id
1177
+ # return 1 if cloud.nil?
1178
+ # end
1179
+
1180
+ # # Network Type
1181
+ # network_type_id = nil
1182
+ # api_params = {"network.zone.id" => cloud['id']} #{network:{zone:{id: cloud['id']}}}
1183
+ # v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'type', 'fieldLabel' => 'Network Type', 'type' => 'select', 'optionSource' => 'networkTypesForCloud', 'required' => true, 'description' => 'Choose a network type.'}], options, @api_client, api_params)
1184
+ # network_type_id = v_prompt['type']
1185
+ # if network_type_id.nil? || network_type_id.to_s.empty?
1186
+ # print_red_alert "Network Type not found by id '#{options['type']}'"
1187
+ # return 1
1188
+ # end
1189
+ # payload['network']['type'] = {'id' => network_type_id.to_i }
1190
+
1191
+ # Name
1192
+ if options['name']
1193
+ payload['network']['name'] = options['name']
1194
+ else
1195
+ # v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true, 'description' => 'Name for this network.'}], options)
1196
+ # payload['network']['name'] = v_prompt['name']
1197
+ end
1198
+
1199
+ if options['displayName']
1200
+ payload['network']['displayName'] = options['displayName']
1201
+ end
1202
+
1203
+ # Labels
1204
+ if options['labels']
1205
+ payload['network']['labels'] = options['labels']
1206
+ end
1207
+
1208
+ # Description
1209
+ if options['description']
1210
+ payload['network']['description'] = options['description']
1211
+ else
1212
+ # v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'description', 'fieldLabel' => 'Description', 'type' => 'text', 'required' => false, 'description' => 'Description of network.'}], options)
1213
+ # payload['network']['description'] = v_prompt['description']
1214
+ end
1215
+
1216
+ # IP Types Enabled
1217
+ if options['ipv4Enabled'] != nil
1218
+ payload['network']['ipv4Enabled'] = options['ipv4Enabled']
1219
+ end
1220
+
1221
+ if options['ipv6Enabled'] != nil
1222
+ payload['network']['ipv6Enabled'] = options['ipv6Enabled']
1223
+ end
1224
+
1225
+ # Gateway
1226
+ if options['gateway']
1227
+ payload['network']['gateway'] = options['gateway']
1228
+ else
1229
+ # v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'gateway', 'fieldLabel' => 'Gateway', 'type' => 'text', 'required' => false, 'description' => ''}], options)
1230
+ # payload['network']['gateway'] = v_prompt['gateway']
1231
+ end
1232
+
1233
+ # DNS Primary
1234
+ if options['dnsPrimary']
1235
+ payload['network']['dnsPrimary'] = options['dnsPrimary']
1236
+ else
1237
+ # v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'dnsPrimary', 'fieldLabel' => 'DNS Primary', 'type' => 'text', 'required' => false, 'description' => ''}], options)
1238
+ # payload['network']['dnsPrimary'] = v_prompt['dnsPrimary']
1239
+ end
1240
+
1241
+ # DNS Secondary
1242
+ if options['dnsSecondary']
1243
+ payload['network']['dnsSecondary'] = options['dnsSecondary']
1244
+ else
1245
+ # v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'dnsSecondary', 'fieldLabel' => 'DNS Secondary', 'type' => 'text', 'required' => false, 'description' => ''}], options)
1246
+ # payload['network']['dnsSecondary'] = v_prompt['dnsSecondary']
1247
+ end
1248
+
1249
+ # CIDR
1250
+ if options['cidr']
1251
+ payload['network']['cidr'] = options['cidr']
1252
+ else
1253
+ # v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'cidr', 'fieldLabel' => 'CIDR', 'type' => 'text', 'required' => false, 'description' => ''}], options)
1254
+ # payload['network']['cidr'] = v_prompt['cidr']
1255
+ end
1256
+
1257
+ # IPv6 Gateway
1258
+ if options['gatewayIPv6']
1259
+ payload['network']['gatewayIPv6'] = options['gatewayIPv6']
1260
+ end
1261
+
1262
+ # IPv6 DNS Primary
1263
+ if options['dnsPrimaryIPv6']
1264
+ payload['network']['dnsPrimarIPv6y'] = options['dnsPrimaryIPv6']
1265
+ end
1266
+
1267
+ # IPv6 DNS Secondary
1268
+ if options['dnsSecondaryIPv6']
1269
+ payload['network']['dnsSecondaryIPv6'] = options['dnsSecondaryIPv6']
1270
+ end
1271
+
1272
+ # IPv6 CIDR
1273
+ if options['cidrIPv6']
1274
+ payload['network']['cidrIPv6'] = options['cidrIPv6']
1275
+ end
1276
+
1277
+ # VLAN ID
1278
+ if options['vlanId']
1279
+ payload['network']['vlanId'] = options['vlanId']
1280
+ else
1281
+ # v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'vlanId', 'fieldLabel' => 'VLAN ID', 'type' => 'number', 'required' => false, 'description' => ''}], options)
1282
+ # payload['network']['vlanId'] = v_prompt['vlanId']
1283
+ end
1284
+
1285
+ # Network Pool
1286
+ if options['pool']
1287
+ payload['network']['pool'] = options['pool'].to_i
1288
+ else
1289
+ # todo: select dropdown
1290
+ # v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'pool', 'fieldLabel' => 'Network Pool', 'type' => 'select', 'optionSource' => 'networkPools', 'required' => false, 'description' => ''}], options, @api_client, {zoneId: cloud['id']})
1291
+ # v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'pool', 'fieldLabel' => 'Network Pool', 'type' => 'text', 'required' => false, 'description' => ''}], options)
1292
+ # payload['network']['pool'] = v_prompt['pool'].to_i if v_prompt['pool']
1293
+ end
1294
+
1295
+ # DHCP Server
1296
+ if options['dhcpServer'] != nil
1297
+ payload['network']['dhcpServer'] = options['dhcpServer']
1298
+ else
1299
+ # v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'dhcpServer', 'fieldLabel' => 'DHCP Server', 'type' => 'checkbox', 'required' => false, 'description' => ''}], options)
1300
+ # payload['network']['dhcpServer'] = v_prompt['dhcpServer']
1301
+ end
1302
+
1303
+ # IPv6 DHCP Server
1304
+ if options['dhcpServerIPv6'] != nil
1305
+ payload['network']['dhcpServerIPv6'] = options['dhcpServerIPv6']
1306
+ else
1307
+ # v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'dhcpServerIPv6', 'fieldLabel' => 'IPv6 DHCP Server', 'type' => 'checkbox', 'required' => false, 'description' => ''}], options)
1308
+ # payload['network']['dhcpServerIPv6'] = v_prompt['dhcpServerIPv6']
1309
+ end
1310
+
1311
+ # Allow IP Override
1312
+ if options['allowStaticOverride'] != nil
1313
+ payload['network']['allowStaticOverride'] = options['allowStaticOverride']
1314
+ else
1315
+ # v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'allowStaticOverride', 'fieldLabel' => 'Allow IP Override', 'type' => 'checkbox', 'required' => false, 'description' => ''}], options)
1316
+ # payload['network']['allowStaticOverride'] = v_prompt['allowStaticOverride']
1317
+ end
1318
+
1319
+ # Network Domain
1320
+ if options.key?('domain')
1321
+ if options['domain'].to_s.empty? # clear it?
1322
+ payload['network']['networkDomain'] = {'id' => nil}
1323
+ else
1324
+ # always prompt to handle value as name instead of id...
1325
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'domain', 'fieldLabel' => 'Network Domain', 'type' => 'select', 'optionSource' => 'networkDomains', 'required' => false, 'description' => ''}], options, @api_client)
1326
+ payload['network']['networkDomain'] = {'id' => v_prompt['domain'].to_i} unless v_prompt['domain'].to_s.empty?
1327
+ end
1328
+ end
1329
+
1330
+ # Search Domains
1331
+ if options.key?('searchDomains')
1332
+ payload['network']['searchDomains'] = options['searchDomains']
1333
+ else
1334
+ # v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'searchDomains', 'fieldLabel' => 'Search Domains', 'type' => 'text', 'required' => false, 'description' => ''}], options)
1335
+ # payload['network']['searchDomains'] = v_prompt['searchDomains']
1336
+ end
1337
+
1338
+ # Scan Network
1339
+ if options['scanNetwork'] != nil
1340
+ payload['network']['scanNetwork'] = options['scanNetwork']
1341
+ else
1342
+ #v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'scanNetwork', 'fieldLabel' => 'Scan Network', 'type' => 'checkbox', 'required' => false, 'description' => '', 'defaultValue' => false}], options)
1343
+ #payload['network']['scanNetwork'] = v_prompt['scanNetwork']
1344
+ end
1345
+
1346
+ # Proxy
1347
+ if options['networkProxy']
1348
+ payload['network']['networkProxy'] = {'id' => options['networkProxy'].to_i}
1349
+ else
1350
+ #v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'networkProxy', 'fieldLabel' => 'Network Proxy', 'type' => 'select', 'optionSource' => 'networkProxies', 'required' => false, 'description' => ''}], options, @api_client)
1351
+ #payload['network']['networkProxy'] = {'id' => v_prompt['networkProxy'].to_i} unless v_prompt['networkProxy'].to_s.empty?
1352
+ end
1353
+
1354
+ # ByPass Proxy for Appliance URL
1355
+ if options['applianceUrlProxyBypass'] != nil
1356
+ payload['network']['applianceUrlProxyBypass'] = options['applianceUrlProxyBypass']
1357
+ else
1358
+ #v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'applianceUrlProxyBypass', 'fieldLabel' => 'Bypass Proxy for Appliance URL', 'type' => 'checkbox', 'required' => false, 'description' => '', 'defaultValue' => true}], options)
1359
+ #payload['network']['applianceUrlProxyBypass'] = v_prompt['applianceUrlProxyBypass']
1360
+ end
1361
+
1362
+ # No Proxy
1363
+ if options['noProxy']
1364
+ payload['network']['noProxy'] = options['noProxy']
1365
+ else
1366
+ #v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'noProxy', 'fieldLabel' => 'No Proxy', 'type' => 'text', 'required' => false, 'description' => 'List of ip addresses or name servers to exclude proxy traversal for. Typically locally routable servers are excluded.'}], options)
1367
+ #payload['network']['noProxy'] = v_prompt['noProxy']
1368
+ end
1369
+
1370
+ # Group Access
1371
+ if group_access_all != nil
1372
+ payload['network']['resourcePermission'] ||= {}
1373
+ payload['network']['resourcePermission']['all'] = group_access_all
1374
+ end
1375
+ if group_access_list != nil
1376
+ payload['network']['resourcePermission'] ||= {}
1377
+ payload['network']['resourcePermission']['sites'] = group_access_list.collect do |site_id|
1378
+ site = {"id" => site_id.to_i}
1379
+ if group_defaults_list && group_defaults_list.include?(site_id)
1380
+ site["default"] = true
1381
+ end
1382
+ site
1383
+ end
1384
+ end
1385
+
1386
+ # Tenants
1387
+ if options['tenants']
1388
+ payload['network']['tenants'] = {}
1389
+ payload['network']['tenants'] = options['tenants'].collect {|it| {'id': it}}
1390
+ end
1391
+
1392
+ # Active
1393
+ if options['active'] != nil
1394
+ payload['network']['active'] = options['active']
1395
+ end
1396
+
1397
+ # Visibility
1398
+ if options['visibility'] != nil
1399
+ payload['network']['visibility'] = options['visibility']
1400
+ end
1401
+
1402
+ end
1403
+ @networks_interface.setopts(options)
1404
+ if options[:dry_run]
1405
+ print_dry_run @networks_interface.dry.update(network["id"], payload)
1406
+ return
1407
+ end
1408
+ json_response = @networks_interface.update(network["id"], payload)
1409
+ if options[:json]
1410
+ puts as_json(json_response)
1411
+ else
1412
+ network = json_response['network']
1413
+ print_green_success "Updated network #{network['name']}"
1414
+ get_args = [network['id']] + (options[:remote] ? ["-r",options[:remote]] : [])
1415
+ get(get_args)
1416
+ end
1417
+ return 0
1418
+ rescue RestClient::Exception => e
1419
+ print_rest_exception(e, options)
1420
+ return 1
1421
+ end
1422
+ end
1423
+
1424
+ def remove(args)
1425
+ options = {}
1426
+ params = {}
1427
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
1428
+ opts.banner = subcommand_usage("[network]")
1429
+ build_common_options(opts, options, [:account, :auto_confirm, :json, :dry_run, :remote])
1430
+ opts.on( '-f', '--force', "Force Delete" ) do
1431
+ params[:force] = 'true'
1432
+ end
1433
+ opts.footer = "Delete a network." + "\n" +
1434
+ "[network] is required. This is the name or id of a network."
1435
+ end
1436
+ optparse.parse!(args)
1437
+
1438
+ if args.count < 1
1439
+ print_error MtnCloud::Terminal.angry_prompt
1440
+ puts_error "#{command_name} missing argument: [network]\n#{optparse}"
1441
+ return 1
1442
+ end
1443
+
1444
+ connect(options)
1445
+ begin
1446
+ network = find_network_by_name_or_id(args[0])
1447
+ return 1 if network.nil?
1448
+
1449
+ unless options[:yes] || MtnCloud::Cli::OptionTypes.confirm("Are you sure you want to delete the network: #{network['name']}?")
1450
+ return 9, "aborted command"
1451
+ end
1452
+ @networks_interface.setopts(options)
1453
+ if options[:dry_run]
1454
+ print_dry_run @networks_interface.dry.destroy(network['id'], params)
1455
+ return 0
1456
+ end
1457
+ json_response = @networks_interface.destroy(network['id'], params)
1458
+ if options[:json]
1459
+ print JSON.pretty_generate(json_response)
1460
+ print "\n"
1461
+ else
1462
+ print_green_success "Removed network #{network['name']}"
1463
+ # list([])
1464
+ end
1465
+ return 0
1466
+ rescue RestClient::Exception => e
1467
+ print_rest_exception(e, options)
1468
+ return 1
1469
+ end
1470
+ end
1471
+
1472
+ def list_types(args)
1473
+ options = {}
1474
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
1475
+ opts.banner = subcommand_usage()
1476
+ opts.on( '-c', '--cloud CLOUD', "Cloud Name or ID" ) do |val|
1477
+ options[:cloud] = val
1478
+ end
1479
+ build_common_options(opts, options, [:list, :query, :json, :yaml, :csv, :fields, :dry_run, :remote])
1480
+ opts.footer = "List network types."
1481
+ end
1482
+ optparse.parse!(args)
1483
+ connect(options)
1484
+ begin
1485
+ params = {}
1486
+ params.merge!(parse_list_options(options))
1487
+ if options[:cloud]
1488
+ #return network_types_for_cloud(options[:cloud], options)
1489
+ zone = find_zone_by_name_or_id(nil, options[:cloud])
1490
+ #params["zoneTypeId"] = zone['zoneTypeId']
1491
+ params["zoneId"] = zone['id']
1492
+ params["creatable"] = true
1493
+ end
1494
+ @network_types_interface.setopts(options)
1495
+ if options[:dry_run]
1496
+ print_dry_run @network_types_interface.dry.list(params)
1497
+ return
1498
+ end
1499
+ json_response = @network_types_interface.list(params)
1500
+
1501
+ render_result = render_with_format(json_response, options, 'networkTypes')
1502
+ return 0 if render_result
1503
+
1504
+ network_types = json_response['networkTypes']
1505
+
1506
+ title = "Network Types"
1507
+ subtitles = []
1508
+ subtitles += parse_list_subtitles(options)
1509
+ if options[:cloud]
1510
+ subtitles << "Cloud: #{options[:cloud]}"
1511
+ end
1512
+ print_h1 title, subtitles
1513
+ if network_types.empty?
1514
+ print cyan,"No network types found.",reset,"\n"
1515
+ else
1516
+ rows = network_types.collect do |network_type|
1517
+ {
1518
+ id: network_type['id'],
1519
+ code: network_type['code'],
1520
+ name: network_type['name']
1521
+ }
1522
+ end
1523
+ columns = [:id, :name, :code]
1524
+ print cyan
1525
+ print as_pretty_table(rows, columns, options)
1526
+ print reset
1527
+ print_results_pagination(json_response)
1528
+ end
1529
+ print reset,"\n"
1530
+ return 0
1531
+
1532
+ rescue RestClient::Exception => e
1533
+ print_rest_exception(e, options)
1534
+ exit 1
1535
+ end
1536
+ end
1537
+
1538
+ def get_type(args)
1539
+ options = {}
1540
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
1541
+ opts.banner = subcommand_usage("[type]")
1542
+ build_common_options(opts, options, [:list, :query, :json, :yaml, :csv, :fields, :dry_run, :remote])
1543
+ opts.footer = "Get details about a network type.\n" +
1544
+ "[type] is required. This is the id or name of a network type."
1545
+ end
1546
+ optparse.parse!(args)
1547
+ connect(options)
1548
+ begin
1549
+ params = {}
1550
+ @network_types_interface.setopts(options)
1551
+ if options[:dry_run]
1552
+ if args[0].to_s =~ /\A\d{1,}\Z/
1553
+ print_dry_run @network_types_interface.dry.get(args[0].to_i)
1554
+ else
1555
+ print_dry_run @network_types_interface.dry.list({name:args[0]})
1556
+ end
1557
+ return
1558
+ end
1559
+
1560
+ network_type = find_network_type_by_name_or_id(args[0])
1561
+ return 1 if network_type.nil?
1562
+ json_response = {'networkType' => network_type} # skip redundant request
1563
+ # json_response = @networks_interface.get(network_type['id'])
1564
+
1565
+ render_result = render_with_format(json_response, options, 'networkType')
1566
+ return 0 if render_result
1567
+
1568
+ network_type = json_response['networkType']
1569
+
1570
+ title = "Network Type"
1571
+
1572
+ print_h1 "Network Type", [], options
1573
+
1574
+ print cyan
1575
+ description_cols = {
1576
+ "ID" => 'id',
1577
+ "Name" => 'name',
1578
+ "Code" => 'code',
1579
+ "Description" => 'description',
1580
+ # lots more here
1581
+ "Createable" => lambda {|it| format_boolean(it['creatable']) },
1582
+ "Deletable" => lambda {|it| format_boolean(it['deleteable']) },
1583
+ }
1584
+ print_description_list(description_cols, network_type)
1585
+
1586
+
1587
+ option_types = network_type['optionTypes'] || []
1588
+ option_types = option_types.sort {|x,y| x['displayOrder'] <=> y['displayOrder'] }
1589
+ if !option_types.empty?
1590
+ print_h2 "Config Option Types", [], options
1591
+ option_type_cols = {
1592
+ "Name" => lambda {|it| it['fieldContext'].to_s != '' ? "#{it['fieldContext']}.#{it['fieldName']}" : it['fieldName'] },
1593
+ "Label" => lambda {|it| it['fieldLabel'] },
1594
+ "Type" => lambda {|it| it['type'] },
1595
+ }
1596
+ print cyan
1597
+ print as_pretty_table(option_types, option_type_cols)
1598
+ end
1599
+
1600
+ print reset,"\n"
1601
+ return 0
1602
+ rescue RestClient::Exception => e
1603
+ print_rest_exception(e, options)
1604
+ exit 1
1605
+ end
1606
+ end
1607
+
1608
+ def list_subnets(args)
1609
+ options = {}
1610
+ params = {}
1611
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
1612
+ opts.banner = subcommand_usage("[network]")
1613
+ build_common_options(opts, options, [:list, :json, :yaml, :csv, :fields, :dry_run, :remote])
1614
+ opts.footer = "List subnets under a network." + "\n" +
1615
+ "[network] is required. This is the name or id of a network."
1616
+ end
1617
+ optparse.parse!(args)
1618
+ if args.count != 1
1619
+ raise_command_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args}\n#{optparse}"
1620
+ end
1621
+ connect(options)
1622
+ begin
1623
+ network = find_network_by_name_or_id(args[0])
1624
+ return 1 if network.nil?
1625
+ params['networkId'] = network['id']
1626
+ params.merge!(parse_list_options(options))
1627
+ @subnets_interface.setopts(options)
1628
+ if options[:dry_run]
1629
+ print_dry_run @subnets_interface.dry.list(params)
1630
+ return
1631
+ end
1632
+ json_response = @subnets_interface.list(params)
1633
+ subnets = json_response["subnets"]
1634
+ if options[:json]
1635
+ puts as_json(json_response, options, "subnets")
1636
+ return 0
1637
+ elsif options[:yaml]
1638
+ puts as_yaml(json_response, options, "subnets")
1639
+ return 0
1640
+ elsif options[:csv]
1641
+ puts records_as_csv(subnets, options)
1642
+ return 0
1643
+ end
1644
+ title = "Subnets"
1645
+ subtitles = []
1646
+ subtitles << "Network: #{network['name']}"
1647
+ subtitles += parse_list_subtitles(options)
1648
+ print_h1 title, subtitles
1649
+
1650
+ if subnets.empty?
1651
+ print cyan,"No subnets found.",reset,"\n"
1652
+ else
1653
+ subnet_columns = {
1654
+ "ID" => 'id',
1655
+ "Name" => 'name',
1656
+ #"Description" => 'description',
1657
+ "Type" => lambda {|it| it['type']['name'] rescue it['type'] },
1658
+ "CIDR" => lambda {|it| it['cidr'] },
1659
+ "Active" => lambda {|it| format_boolean(it['active']) },
1660
+ "Visibility" => lambda {|it| it['visibility'].to_s.capitalize },
1661
+ "Tenants" => lambda {|it| it['tenants'] ? it['tenants'].collect {|it| it['name'] }.uniq.join(', ') : '' },
1662
+ }
1663
+ print cyan
1664
+ print as_pretty_table(subnets, subnet_columns)
1665
+ end
1666
+ print reset,"\n"
1667
+ return 0
1668
+
1669
+ rescue RestClient::Exception => e
1670
+ print_rest_exception(e, options)
1671
+ return 1
1672
+ end
1673
+ end
1674
+
1675
+ private
1676
+
1677
+ def get_available_groups(refresh=false)
1678
+ if !@available_groups || refresh
1679
+ option_results = @options_interface.options_for_source('groups',{})
1680
+ @available_groups = option_results['data'].collect {|it|
1681
+ {"id" => it["value"], "name" => it["name"], "value" => it["value"]}
1682
+ }
1683
+ end
1684
+ #puts "get_available_groups() rtn: #{@available_groups.inspect}"
1685
+ return @available_groups
1686
+ end
1687
+
1688
+ def get_available_groups_with_shared(refresh=false)
1689
+ [{"id" => 'shared', "name" => 'Shared', "value" => 'shared'}] + get_available_groups(refresh)
1690
+ end
1691
+
1692
+ end