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,895 @@
1
+ require 'mtncloud/cli/cli_command'
2
+
3
+ class MtnCloud::Cli::ServicePlanCommand
4
+ include MtnCloud::Cli::CliCommand
5
+ include MtnCloud::Cli::AccountsHelper
6
+ include MtnCloud::Cli::ProvisioningHelper
7
+
8
+ set_command_name :'service-plans'
9
+
10
+ register_subcommands :list, :get, :add, :update, :activate, :deactivate, :remove
11
+ set_default_subcommand :list
12
+
13
+ def connect(opts)
14
+ @api_client = establish_remote_appliance_connection(opts)
15
+ @service_plans_interface = @api_client.service_plans
16
+ @provision_types_interface = @api_client.provision_types
17
+ @options_interface = @api_client.options
18
+ @accounts_interface = @api_client.accounts
19
+ @price_sets_interface = @api_client.price_sets
20
+ end
21
+
22
+ def handle(args)
23
+ handle_subcommand(args)
24
+ end
25
+
26
+ def list(args)
27
+ options = {}
28
+ params = {'includeZones': true}
29
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
30
+ opts.banner = subcommand_usage()
31
+ opts.on('-t', '--provision-type VALUE', String, "Filter by provision type ID or code") do |val|
32
+ options[:provisionType] = val
33
+ end
34
+ opts.on('-i', '--include-inactive [on|off]', String, "Can be used to enable / disable inactive filter. Default is on") do |val|
35
+ params['includeInactive'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
36
+ end
37
+ build_standard_list_options(opts, options)
38
+ opts.footer = "List service plans."
39
+ end
40
+ optparse.parse!(args)
41
+ #verify_args!(args:args, optparse:optparse, count:0)
42
+ connect(options)
43
+
44
+
45
+ params.merge!(parse_list_options(options))
46
+
47
+ if !options[:provisionType].nil?
48
+ type = find_provision_type(options[:provisionType])
49
+
50
+ if type.nil?
51
+ print_red_alert "Provision type #{options[:provisionType]} not found"
52
+ exit 1
53
+ end
54
+ params['provisionTypeId'] = type['id']
55
+ end
56
+
57
+ @service_plans_interface.setopts(options)
58
+ if options[:dry_run]
59
+ print_dry_run @service_plans_interface.dry.list(params)
60
+ return
61
+ end
62
+ json_response = @service_plans_interface.list(params)
63
+ plans = json_response['servicePlans']
64
+ render_response(json_response, options, 'servicePlans') do
65
+ title = "Service Plans"
66
+ subtitles = []
67
+ subtitles += parse_list_subtitles(options)
68
+ print_h1 title, subtitles
69
+
70
+ if plans.empty?
71
+ print cyan,"No service plans found.",reset,"\n"
72
+ else
73
+ rows = plans.collect do |it|
74
+ {
75
+ id: (it['active'] ? cyan : yellow) + it['id'].to_s,
76
+ name: it['name'],
77
+ type: it['provisionType'] ? it['provisionType']['name'] : '',
78
+ active: format_boolean(it['active']),
79
+ cores: it['maxCores'],
80
+ memory: format_bytes(it['maxMemory']),
81
+ clouds: it['zones'] ? truncate_string(it['zones'].collect {|it| it['name']}.join(', '), 30) : '',
82
+ visibility: (it['visibility'] || '').capitalize,
83
+ tenants: it['tenants'] || 'Global',
84
+ price_sets: (it['priceSets'] ? it['priceSets'].count : 0).to_s + cyan
85
+ }
86
+ end
87
+ columns = [
88
+ :id, :name, :type, :active, :cores, :memory, :clouds, :visibility, :tenants, {"PRICE SETS" => :price_sets}
89
+ ]
90
+ columns.delete(:active) if !params['includeInactive']
91
+ print as_pretty_table(rows, columns, options)
92
+ print_results_pagination(json_response)
93
+ end
94
+ print reset,"\n"
95
+ end
96
+ if plans.empty?
97
+ return 1, "0 plans found"
98
+ else
99
+ return 0, nil
100
+ end
101
+ end
102
+
103
+ def get(args)
104
+ options = {}
105
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
106
+ opts.banner = subcommand_usage("[plan]")
107
+ build_common_options(opts, options, [:json, :dry_run, :remote])
108
+ opts.footer = "Get details about a service plan.\n" +
109
+ "[plan] is required. Service plan ID, name or code"
110
+ end
111
+ optparse.parse!(args)
112
+ if args.count != 1
113
+ raise_command_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args}\n#{optparse}"
114
+ end
115
+ connect(options)
116
+ return _get(args[0], options)
117
+ end
118
+
119
+ def _get(plan_id, options = {})
120
+ params = {}
121
+ begin
122
+ if !(plan_id.to_s =~ /\A\d{1,}\Z/)
123
+ plan = find_service_plan(plan_id)
124
+
125
+ if !plan
126
+ print_red_alert "Service plan #{plan_id} not found"
127
+ exit 1
128
+ end
129
+ plan_id = plan['id']
130
+ end
131
+ @service_plans_interface.setopts(options)
132
+ if options[:dry_run]
133
+ print_dry_run @service_plans_interface.dry.get(plan_id)
134
+ return
135
+ end
136
+ json_response = @service_plans_interface.get(plan_id)
137
+
138
+ render_result = render_with_format(json_response, options, 'servicePlan')
139
+ return 0 if render_result
140
+
141
+ title = "Service Plan"
142
+ subtitles = []
143
+ subtitles += parse_list_subtitles(options)
144
+ print_h1 title, subtitles
145
+
146
+ service_plan = json_response['servicePlan']
147
+ print cyan
148
+ description_cols = {
149
+ "ID" => lambda {|it| it['id']},
150
+ "Name" => lambda {|it| it['name'] || (it['accountIntegration'] ? 'Pending' : 'Not Set')},
151
+ "Active" => lambda {|it| format_boolean(it['active'])},
152
+ "Visibility" => lambda {|it| (it['visibility'] || '').capitalize},
153
+ "Code" => lambda {|it| it['code']},
154
+ "Display Order" => lambda {|it| it['sortOrder']},
155
+ "Provision Type" => lambda {|it| it['provisionType'] ? it['provisionType']['name'] : ''},
156
+ "Server Type" => lambda {|it| it['serverType']},
157
+ "Storage" => lambda {|it| printable_byte_size(it, it['maxStorage'], 'storageSizeType', 'GB')}
158
+ }
159
+
160
+ provision_type = service_plan['provisionType'] || {}
161
+
162
+ description_cols['Customize Root Volume'] = lambda {|it| format_boolean(it['customMaxStorage'])} if provision_type['rootDiskCustomizable']
163
+ description_cols['Customize Extra Volumes'] = lambda {|it| format_boolean(it['customMaxDataStorage'])} if provision_type['customizeVolume']
164
+ description_cols['Add Volumes'] = lambda {|it| format_boolean(it['addVolumes'])} if provision_type['addVolumes']
165
+ description_cols['Max Disks Allowed'] = lambda {|it| it['maxDisks'] || 0} if provision_type['addVolumes']
166
+ description_cols['Memory'] = lambda {|it| printable_byte_size(it, it['maxMemory'], 'memorySizeType')}
167
+ description_cols['Custom Max Memory'] = lambda {|it| format_boolean(it['customMaxMemory'])}
168
+ description_cols['Core Count'] = lambda {|it| it['maxCores']}
169
+ description_cols['Custom Cores'] = lambda {|it| format_boolean(it['customCores'])}
170
+ description_cols['Cores Per Socket'] = lambda {|it| it['coresPerSocket']} if provision_type['hasConfigurableCpuSockets'] && service_plan['customCores']
171
+ description_cols['Custom CPU'] = lambda {|it| format_boolean(it['customCpu'])}
172
+
173
+ ranges = (service_plan['config'] ? service_plan['config']['ranges'] : nil) || {}
174
+
175
+ if (ranges['minStorage'] && ranges['minStorage'] != '') || (ranges['maxStorage'] && ranges['maxStorage'] != '')
176
+ description_cols['Custom Total Storage Range'] = lambda {|it|
177
+ get_range(
178
+ ranges['minStorage'] && ranges['minStorage'] != '' ? "#{ranges['minStorage']} #{(it['config'] && it['config']['storageSizeType'] ? it['config']['storageSizeType'] : 'GB').upcase}" : nil,
179
+ ranges['maxStorage'] && ranges['maxStorage'] != '' ? "#{ranges['maxStorage']} #{(it['config'] && it['config']['storageSizeType'] ? it['config']['storageSizeType'] : 'GB').upcase}" : nil,
180
+ )
181
+ }
182
+ end
183
+ if (ranges['minPerDiskSize'] && ranges['minPerDiskSize'] != '') || (ranges['maxPerDiskSize'] && ranges['maxPerDiskSize'] != '')
184
+ description_cols['Custom Per Disk Range'] = lambda {|it|
185
+ get_range(
186
+ ranges['minPerDiskSize'] && ranges['minPerDiskSize'] != '' ? "#{ranges['minPerDiskSize']} GB" : nil,
187
+ ranges['maxPerDiskSize'] && ranges['maxPerDiskSize'] != '' ? "#{ranges['maxPerDiskSize']} GB" : nil
188
+ )
189
+ }
190
+ end
191
+ if (ranges['minMemory'] && ranges['minMemory'] != '') || (ranges['maxMemory'] && ranges['maxMemory'] != '')
192
+ description_cols['Custom Memory Range'] = lambda {|it|
193
+ get_range(
194
+ ranges['minMemory'] && ranges['minMemory'] != '' ? printable_byte_size(it, ranges['minMemory'], 'memorySizeType') : nil,
195
+ ranges['maxMemory'] && ranges['maxMemory'] != '' ? printable_byte_size(it, ranges['maxMemory'], 'memorySizeType') : nil
196
+ )
197
+ }
198
+ end
199
+ if (ranges['minCores'] && ranges['minCores'] != '') || (ranges['maxCores'] && ranges['maxCores'] != '')
200
+ description_cols['Custom Cores Range'] = lambda {|it|
201
+ get_range(
202
+ ranges['minCores'] && ranges['minCores'] != '' ? ranges['minCores'] : nil,
203
+ ranges['maxCores'] && ranges['maxCores'] != '' ? ranges['maxCores'] : nil
204
+ )
205
+ }
206
+ end
207
+
208
+ print_description_list(description_cols, service_plan)
209
+
210
+ print_h2 "Price Sets"
211
+ price_sets = service_plan['priceSets']
212
+
213
+ if price_sets && !price_sets.empty?
214
+ rows = price_sets.collect do |it|
215
+ {
216
+ id: it['id'],
217
+ unit: (it['priceUnit'] || '').capitalize,
218
+ name: it['name']
219
+ }
220
+ end
221
+ columns = [
222
+ :id, :unit, :name
223
+ ]
224
+ print as_pretty_table(rows, columns, options)
225
+ else
226
+ print cyan,"No price sets.",reset,"\n"
227
+ end
228
+
229
+ print_permissions(service_plan['permissions'], ['plans', 'groupDefaults'])
230
+ print reset,"\n"
231
+ return 0
232
+ rescue RestClient::Exception => e
233
+ print_rest_exception(e, options)
234
+ exit 1
235
+ end
236
+ end
237
+
238
+ def add(args)
239
+ options = {}
240
+ params = {}
241
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
242
+ opts.banner = subcommand_usage()
243
+ opts.on("--name NAME", String, "Service plan name") do |val|
244
+ params['name'] = val.to_s
245
+ end
246
+ opts.on("--code CODE", String, "Service plan code, unique identifier") do |val|
247
+ params['code'] = val.to_s
248
+ end
249
+ opts.on('-t', '--provision-type [TYPE]', String, "Provision type ID or code") do |val|
250
+ options[:provisionType] = val
251
+ end
252
+ opts.on("--description [TEXT]", String, "Description") do |val|
253
+ params['description'] = val.to_s
254
+ end
255
+ opts.on('--active [on|off]', String, "Can be used to enable / disable the plan. Default is on") do |val|
256
+ params['active'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
257
+ end
258
+ opts.on('--editable [on|off]', String, "Can be used to enable / disable the editability of the service plan. Default is on") do |val|
259
+ params['editable'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
260
+ end
261
+ opts.on('--storage [AMOUNT]', String, "Storage size is required. Assumes GB unless optional modifier specified, ex: 512MB" ) do |val|
262
+ bytes = parse_bytes_param(val, '--storage', 'GB', true)
263
+ params['maxStorage'] = bytes[:bytes]
264
+ (params['config'] ||= {})['storageSizeType'] = bytes[:unit].downcase
265
+ end
266
+ opts.on('--memory [AMOUNT]', String, "Memory size is required. Assumes MB unless optional modifier specified, ex: 1GB" ) do |val|
267
+ bytes = parse_bytes_param(val, '--memory', 'MB', true)
268
+ params['maxMemory'] = bytes[:bytes]
269
+ (params['config'] ||= {})['memorySizeType'] = bytes[:unit].downcase
270
+ end
271
+ opts.on('--cores [NUMBER]', Integer, "Core count. Default is 1" ) do |val|
272
+ params['maxCores'] = val.to_i || 1
273
+ end
274
+ opts.on('--disks [NUMBER]', Integer, "Max disks allowed" ) do |val|
275
+ params['maxDisks'] = val.to_i || 1
276
+ end
277
+ opts.on('--cores-per-socket [NUMBER]', Integer, "Cores Per Socket") do |val|
278
+ params['coresPerSocket'] = val.to_i || 1
279
+ end
280
+ opts.on('--custom-cores [on|off]', String, "Can be used to enable / disable customizable cores. Default is on") do |val|
281
+ params['customCores'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
282
+ end
283
+ opts.on('--custom-cpu [on|off]', String, "Can be used to enable / disable customizable CPUs. Default is on") do |val|
284
+ params['customCpu'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
285
+ end
286
+ opts.on('--custom-storage [on|off]', String, "Can be used to enable / disable customizable storage. Default is on") do |val|
287
+ params['customMaxStorage'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
288
+ end
289
+ opts.on('--custom-volumes [on|off]', String, "Can be used to enable / disable customizable extra volumes. Default is on") do |val|
290
+ params['customMaxDataStorage'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
291
+ end
292
+ opts.on('--custom-memory [on|off]', String, "Can be used to enable / disable customizable memory. Default is on") do |val|
293
+ params['customMaxMemory'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
294
+ end
295
+ opts.on('--add-volumes [on|off]', String, "Can be used to enable / disable ability to add volumes. Default is on") do |val|
296
+ params['addVolumes'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
297
+ end
298
+ opts.on('--sort-order NUMBER', Integer, "Sort order") do |val|
299
+ params['sortOrder'] = val.to_i
300
+ end
301
+ opts.on('--price-sets [LIST]', Array, 'Price set(s), comma separated list of price set IDs') do |list|
302
+ params['priceSets'] = list.collect {|it| it.to_s.strip.empty? || !it.to_i ? nil : it.to_s.strip}.compact.uniq.collect {|it| {'id' => it.to_i}}
303
+ end
304
+ opts.on('--min-storage NUMBER', String, "Min total storage in GB.") do |val|
305
+ ((params['config'] ||= {})['ranges'] ||= {})['minStorage'] = val.to_i
306
+ end
307
+ opts.on('--max-storage NUMBER', String, "Max total storage in GB.") do |val|
308
+ ((params['config'] ||= {})['ranges'] ||= {})['maxStorage'] = val.to_i
309
+ end
310
+ opts.on('--min-per-disk-size NUMBER', String, "Min per disk size in GB.") do |val|
311
+ ((params['config'] ||= {})['ranges'] ||= {})['minPerDiskSize'] = val.to_i
312
+ end
313
+ opts.on('--max-per-disk-size NUMBER', String, "Max per disk size in GB.") do |val|
314
+ ((params['config'] ||= {})['ranges'] ||= {})['maxPerDiskSize'] = val.to_i
315
+ end
316
+ opts.on('--min-memory NUMBER', String, "Min memory. Assumes MB unless optional modifier specified, ex: 1GB") do |val|
317
+ # Memory does get converted to bytes
318
+ bytes = parse_bytes_param(val, '--min-memory', 'MB', true)
319
+ ((params['config'] ||= {})['ranges'] ||= {})['minMemory'] = bytes[:bytes]
320
+ (params['config'] ||= {})['memorySizeType'] = bytes[:unit].downcase
321
+ end
322
+ opts.on('--max-memory NUMBER', String, "Max memory. Assumes MB unless optional modifier specified, ex: 1GB") do |val|
323
+ # Memory does get converted to bytes
324
+ bytes = parse_bytes_param(val, '--max-memory', 'MB', true)
325
+ ((params['config'] ||= {})['ranges'] ||= {})['maxMemory'] = bytes[:bytes]
326
+ (params['config'] ||= {})['memorySizeType'] = bytes[:unit].downcase
327
+ end
328
+ opts.on('--min-cores NUMBER', String, "Min cores") do |val|
329
+ ((params['config'] ||= {})['ranges'] ||= {})['minCores'] = val.to_i
330
+ end
331
+ opts.on('--max-cores NUMBER', String, "Max cores") do |val|
332
+ ((params['config'] ||= {})['ranges'] ||= {})['maxCores'] = val.to_i
333
+ end
334
+ opts.on('--min-sockets NUMBER', String, "Min sockets") do |val|
335
+ ((params['config'] ||= {})['ranges'] ||= {})['minSockets'] = val.to_i
336
+ end
337
+ opts.on('--max-sockets NUMBER', String, "Max sockets") do |val|
338
+ ((params['config'] ||= {})['ranges'] ||= {})['maxSockets'] = val.to_i
339
+ end
340
+ opts.on('--min-cores-per-socket NUMBER', String, "Min cores per socket") do |val|
341
+ ((params['config'] ||= {})['ranges'] ||= {})['minCoresPerSocket'] = val.to_i
342
+ end
343
+ opts.on('--max-cores-per-socket NUMBER', String, "Max cores per socket") do |val|
344
+ ((params['config'] ||= {})['ranges'] ||= {})['maxCoresPerSocket'] = val.to_i
345
+ end
346
+ add_perms_options(opts, options, ['plans', 'groupDefaults'])
347
+ build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote, :quiet])
348
+ opts.footer = "Create service plan"
349
+ end
350
+ optparse.parse!(args)
351
+ connect(options)
352
+ if args.count != 0
353
+ raise_command_error "wrong number of arguments, expected 0 and got (#{args.count}) #{args}\n#{optparse}"
354
+ return 1
355
+ end
356
+
357
+ begin
358
+ if options[:payload]
359
+ payload = parse_payload(options, 'servicePlan')
360
+ else
361
+ apply_options(params, options)
362
+
363
+ # name
364
+ params['name'] ||= MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'name', 'type' => 'text', 'fieldLabel' => 'Service Plan Name', 'required' => true, 'description' => 'Service Plan Name.'}],options[:options],@api_client,{}, options[:no_prompt])['name']
365
+
366
+ # code
367
+ params['code'] ||= MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'code', 'type' => 'text', 'fieldLabel' => 'Service Plan Code', 'required' => true, 'defaultValue' => params['name'].gsub(/[^0-9a-z ]/i, '').gsub(' ', '.').downcase, 'description' => 'Service Plan Code.'}],options[:options],@api_client,{}, options[:no_prompt])['code']
368
+
369
+ # provision type
370
+ options[:provisionType] = options[:provisionType] || (args.count > 1 ? args[1] : nil)
371
+ provision_types = @service_plans_interface.provision_types()['provisionTypes']
372
+
373
+ if options[:provisionType].nil? && !options[:no_prompt]
374
+ provision_type_id = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'provisionType', 'type' => 'select', 'fieldLabel' => 'Provision Type', 'selectOptions' => provision_types.collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Provision Type.'}],options[:options],@api_client,{}, options[:no_prompt], true)['provisionType']
375
+
376
+ if !provision_type_id.nil?
377
+ provision_type = provision_types.find {|it| it['id'] == provision_type_id}
378
+ end
379
+ else
380
+ provision_type = provision_types.find {|it| it['name'] == options[:provisionType] || it['code'] == options[:provisionType] || it['id'] == options[:provisionType].to_i}
381
+
382
+ if provision_type.nil?
383
+ print_red_alert "Provision type #{options[:provisionType]} not found"
384
+ exit 1
385
+ end
386
+ end
387
+
388
+ params['provisionType'] = {'id' => provision_type['id']} if !provision_type.nil?
389
+
390
+ # storage is required
391
+ if params['maxStorage'].nil?
392
+ if options[:no_prompt]
393
+ print_red_alert "Storage size is required"
394
+ exit 1
395
+ end
396
+ while params['maxStorage'].nil? do
397
+ begin
398
+ bytes = parse_bytes_param(
399
+ MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'storage', 'type' => 'text', 'fieldLabel' => 'Storage (GB) [can use MB modifier]', 'required' => true, 'description' => 'Storage (GB)', 'defaultValue' => '0'}],options[:options],@api_client,{}, options[:no_prompt])['storage'],
400
+ 'storage',
401
+ 'GB',
402
+ true
403
+ )
404
+ params['maxStorage'] = bytes[:bytes]
405
+ # (params['config'] ||= {})['storageSizeType'] = bytes[:unit].downcase
406
+ rescue
407
+ print "Invalid Value... Please try again.\n"
408
+ end
409
+ end
410
+ end
411
+
412
+ # memory is required
413
+ if params['maxMemory'].nil?
414
+ if options[:no_prompt]
415
+ print_red_alert "Memory size is required"
416
+ exit 1
417
+ end
418
+ while params['maxMemory'].nil? do
419
+ begin
420
+ bytes = parse_bytes_param(
421
+ MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'memory', 'type' => 'text', 'fieldLabel' => 'Memory (MB) [can use GB modifier]', 'required' => true, 'description' => 'Memory (MB)', 'defaultValue' => '0'}],options[:options],@api_client,{}, options[:no_prompt])['memory'],
422
+ 'memory',
423
+ 'MB',
424
+ true
425
+ )
426
+ params['maxMemory'] = bytes[:bytes]
427
+ rescue
428
+ print "Invalid Value... Please try again.\n"
429
+ end
430
+ params['customMaxMemory'] = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'customMaxMemory', 'type' => 'checkbox', 'fieldLabel' => 'Custom Max Memory', 'required' => false, 'description' => 'Custom Max Memory', 'defaultValue' => false}],options[:options],@api_client,{}, options[:no_prompt])['customMaxMemory']
431
+ end
432
+ end
433
+
434
+ # add'n options
435
+ addn_options = [
436
+ {'fieldName' => 'maxCores', 'fieldLabel' => 'Core Count', 'type' => 'number', 'required' => true, 'defaultValue' => 1, 'displayOrder' => 1},
437
+ {'fieldName' => 'customCores', 'fieldLabel' => 'Custom Cores', 'type' => 'checkbox', 'defaultValue' => false, 'displayOrder' => 2},
438
+ {'fieldName' => 'coresPerSocket', 'fieldLabel' => 'Cores Per Socket', 'type' => 'number', 'required' => true, 'defaultValue' => 1, 'displayOrder' => 3},
439
+ {'fieldContext' => 'config.ranges', 'fieldGroup' => 'Custom Ranges', 'fieldName' => 'minStorage', 'fieldLabel' => 'Min Total Storage (GB)', 'type' => 'number', 'displayOrder' => 1},
440
+ {'fieldContext' => 'config.ranges', 'fieldGroup' => 'Custom Ranges', 'fieldName' => 'maxStorage', 'fieldLabel' => 'Max Total Storage (GB)', 'type' => 'number', 'displayOrder' => 2},
441
+ {'fieldContext' => 'config.ranges', 'fieldGroup' => 'Custom Ranges', 'fieldName' => 'minPerDiskSize', 'fieldLabel' => 'Min Per Disk Size (GB)', 'type' => 'number', 'displayOrder' => 3},
442
+ {'fieldContext' => 'config.ranges', 'fieldGroup' => 'Custom Ranges', 'fieldName' => 'maxPerDiskSize', 'fieldLabel' => 'Max Per Disk Size (GB)', 'type' => 'number', 'displayOrder' => 4},
443
+ {'fieldContext' => 'config.ranges', 'fieldGroup' => 'Custom Ranges', 'fieldName' => 'minMemory', 'fieldLabel' => 'Min Memory (GB)', 'type' => 'number', 'displayOrder' => 5},
444
+ {'fieldContext' => 'config.ranges', 'fieldGroup' => 'Custom Ranges', 'fieldName' => 'maxMemory', 'fieldLabel' => 'Max Memory (GB)', 'type' => 'number', 'displayOrder' => 6},
445
+ {'fieldContext' => 'config.ranges', 'fieldGroup' => 'Custom Ranges', 'fieldName' => 'minCores', 'fieldLabel' => 'Min Cores', 'type' => 'number', 'displayOrder' => 7},
446
+ {'fieldContext' => 'config.ranges', 'fieldGroup' => 'Custom Ranges', 'fieldName' => 'maxCores', 'fieldLabel' => 'Max Cores', 'type' => 'number', 'displayOrder' => 8}
447
+ ]
448
+
449
+ if provision_type['hasSocketRange']
450
+ addn_options.push({'fieldContext' => 'config.ranges', 'fieldGroup' => 'Custom Ranges', 'fieldName' => 'minSockets', 'fieldLabel' => 'Min Sockets', 'type' => 'number', 'displayOrder' => 9})
451
+ addn_options.push({'fieldContext' => 'config.ranges', 'fieldGroup' => 'Custom Ranges', 'fieldName' => 'maxSockets', 'fieldLabel' => 'Max Sockets', 'type' => 'number', 'displayOrder' => 10})
452
+ end
453
+
454
+ if provision_type['hasCoresPerSocketRange']
455
+ addn_options.push({'fieldContext' => 'config.ranges', 'fieldGroup' => 'Custom Ranges', 'fieldName' => 'minCoresPerSocket', 'fieldLabel' => 'Min Cores Per Socket', 'type' => 'number', 'displayOrder' => 11})
456
+ addn_options.push({'fieldContext' => 'config.ranges', 'fieldGroup' => 'Custom Ranges', 'fieldName' => 'maxCoresPerSocket', 'fieldLabel' => 'Max Cores Per Socket', 'type' => 'number', 'displayOrder' => 12})
457
+ end
458
+
459
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt(addn_options, options[:options], @api_client, params)
460
+ params.deep_merge!(v_prompt)
461
+
462
+ # price sets
463
+ if params['priceSets'].nil? && !options[:no_prompt]
464
+ price_sets = []
465
+ while MtnCloud::Cli::OptionTypes.confirm("Add #{price_sets.empty? ? '' : 'another '}price set?", {:default => false}) do
466
+ price_unit = prompt_price_unit(options)
467
+
468
+ avail_price_sets ||= @price_sets_interface.list({'priceUnit' => price_unit, 'max' => 10000})['priceSets'].collect {|it| {'name' => it['name'], 'value' => it['id'], 'priceUnit' => it['priceUnit']}}
469
+
470
+ if price_set_id = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'priceSet', 'type' => 'select', 'fieldLabel' => 'Price Set', 'selectOptions' => avail_price_sets, 'required' => false, 'description' => 'Select Price.'}],options[:options],@api_client,{}, options[:no_prompt], true)['priceSet']
471
+ price_set = avail_price_sets.find {|it| it['value'] == price_set_id}
472
+ price_sets << {'id' => price_set['value'], 'priceUnit' => price_set['priceUnit']}
473
+ avail_price_sets.reject! {|it| it['value'] == price_set_id}
474
+ end
475
+
476
+ if avail_price_sets.empty?
477
+ break
478
+ end
479
+ end
480
+ params['priceSets'] = price_sets if !price_sets.empty?
481
+ end
482
+
483
+ # permissions
484
+ if !options[:no_prompt]
485
+ perms = prompt_permissions(options, ['plans', 'groupDefaults'])
486
+ if perms['resourcePool'] && !perms['resourcePool']['visibility'].nil?
487
+ params['visibility'] = perms['resourcePool']['visibility']
488
+ end
489
+ perms.delete('resourcePool')
490
+ params['permissions'] = perms
491
+ end
492
+ payload = {'servicePlan' => params}
493
+ end
494
+
495
+ @service_plans_interface.setopts(options)
496
+ if options[:dry_run]
497
+ print_dry_run @service_plans_interface.dry.create(payload)
498
+ return
499
+ end
500
+ json_response = @service_plans_interface.create(payload)
501
+
502
+ if options[:json]
503
+ puts as_json(json_response, options)
504
+ elsif !options[:quiet]
505
+ if json_response['success']
506
+ print_green_success "Service plan created"
507
+ _get(json_response['id'], options)
508
+ else
509
+ print_red_alert "Error creating service plan: #{json_response['msg'] || json_response['errors']}"
510
+ end
511
+ end
512
+ return 0
513
+ rescue RestClient::Exception => e
514
+ print_rest_exception(e, options)
515
+ exit 1
516
+ end
517
+ end
518
+
519
+ def update(args)
520
+ options = {}
521
+ params = {}
522
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
523
+ opts.banner = subcommand_usage("[plan]")
524
+ opts.on("--name NAME", String, "Service plan name") do |val|
525
+ params['name'] = val.to_s
526
+ end
527
+ opts.on("--code CODE", String, "Service plan code, unique identifier") do |val|
528
+ params['code'] = val.to_s
529
+ end
530
+ opts.on('-t', "--provision-type [TYPE]", String, "Provision type ID or code") do |val|
531
+ options[:provisionType] = val
532
+ end
533
+ opts.on("--description [TEXT]", String, "Description") do |val|
534
+ params['description'] = val.to_s
535
+ end
536
+ opts.on('--active [on|off]', String, "Can be used to enable / disable the plan. Default is on") do |val|
537
+ params['active'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
538
+ end
539
+ opts.on('--storage [AMOUNT]', String, "Storage size is required. Assumes GB unless optional modifier specified, ex: 512MB" ) do |val|
540
+ bytes = parse_bytes_param(val, '--storage', 'GB', true)
541
+ params['maxStorage'] = bytes[:bytes]
542
+ (params['config'] ||= {})['storageSizeType'] = bytes[:unit].downcase
543
+ end
544
+ opts.on('--memory [AMOUNT]', String, "Memory size is required. Assumes MB unless optional modifier specified, ex: 1GB" ) do |val|
545
+ bytes = parse_bytes_param(val, '--memory', 'MB', true)
546
+ params['maxMemory'] = bytes[:bytes]
547
+ (params['config'] ||= {})['memorySizeType'] = bytes[:unit].downcase
548
+ end
549
+ opts.on('--cores [NUMBER]', Integer, "Core count. Default is 1" ) do |val|
550
+ params['maxCores'] = val.to_i || 1
551
+ end
552
+ opts.on('--disks [NUMBER]', Integer, "Max disks allowed" ) do |val|
553
+ params['maxDisks'] = val.to_i || 1
554
+ end
555
+ opts.on('--custom-cores [on|off]', String, "Can be used to enable / disable customizable cores. Default is on") do |val|
556
+ params['customCores'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
557
+ end
558
+ opts.on('--custom-cpu [on|off]', String, "Can be used to enable / disable customizable CPUs. Default is on") do |val|
559
+ params['customCpu'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
560
+ end
561
+ opts.on('--custom-storage [on|off]', String, "Can be used to enable / disable customizable storage. Default is on") do |val|
562
+ params['customMaxStorage'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
563
+ end
564
+ opts.on('--custom-volumes [on|off]', String, "Can be used to enable / disable customizable extra volumes. Default is on") do |val|
565
+ params['customMaxDataStorage'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
566
+ end
567
+ opts.on('--custom-memory [on|off]', String, "Can be used to enable / disable customizable memory. Default is on") do |val|
568
+ params['customMaxMemory'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
569
+ end
570
+ opts.on('--add-volumes [on|off]', String, "Can be used to enable / disable ability to add volumes. Default is on") do |val|
571
+ params['addVolumes'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
572
+ end
573
+ opts.on('--sort-order NUMBER', Integer, "Sort order") do |val|
574
+ params['sortOrder'] = val.to_i
575
+ end
576
+ opts.on('--price-sets [LIST]', Array, 'Price set(s), comma separated list of price set IDs') do |list|
577
+ params['priceSets'] = list.collect {|it| it.to_s.strip.empty? || !it.to_i ? nil : it.to_s.strip}.compact.uniq.collect {|it| {'id' => it.to_i}}
578
+ end
579
+ opts.on('--min-storage NUMBER', String, "Min total storage in GB.") do |val|
580
+ ((params['config'] ||= {})['ranges'] ||= {})['minStorage'] = val.to_i
581
+ end
582
+ opts.on('--max-storage NUMBER', String, "Max total storage in GB.") do |val|
583
+ ((params['config'] ||= {})['ranges'] ||= {})['maxStorage'] = val.to_i
584
+ end
585
+ opts.on('--min-per-disk-size NUMBER', String, "Min per disk size in GB.") do |val|
586
+ ((params['config'] ||= {})['ranges'] ||= {})['minPerDiskSize'] = val.to_i
587
+ end
588
+ opts.on('--max-per-disk-size NUMBER', String, "Max per disk size in GB.") do |val|
589
+ ((params['config'] ||= {})['ranges'] ||= {})['maxPerDiskSize'] = val.to_i
590
+ end
591
+ opts.on('--min-memory NUMBER', String, "Min memory. Assumes MB unless optional modifier specified, ex: 1GB") do |val|
592
+ # Memory does get converted to bytes
593
+ bytes = parse_bytes_param(val, '--min-memory', 'MB')
594
+ ((params['config'] ||= {})['ranges'] ||= {})['minMemory'] = bytes[:bytes]
595
+ (params['config'] ||= {})['memorySizeType'] = bytes[:unit].downcase
596
+ end
597
+ opts.on('--max-memory NUMBER', String, "Max memory. Assumes MB unless optional modifier specified, ex: 1GB") do |val|
598
+ # Memory does get converted to bytes
599
+ bytes = parse_bytes_param(val, '--max-memory', 'MB', true)
600
+ ((params['config'] ||= {})['ranges'] ||= {})['maxMemory'] = bytes[:bytes]
601
+ (params['config'] ||= {})['memorySizeType'] = bytes[:unit].downcase
602
+ end
603
+ opts.on('--min-cores NUMBER', String, "Min cores") do |val|
604
+ ((params['config'] ||= {})['ranges'] ||= {})['minCores'] = val.to_i
605
+ end
606
+ opts.on('--max-cores NUMBER', String, "Max cores") do |val|
607
+ ((params['config'] ||= {})['ranges'] ||= {})['maxCores'] = val.to_i
608
+ end
609
+ opts.on('--min-sockets NUMBER', String, "Min sockets") do |val|
610
+ ((params['config'] ||= {})['ranges'] ||= {})['minSockets'] = val.to_i
611
+ end
612
+ opts.on('--max-sockets NUMBER', String, "Max sockets") do |val|
613
+ ((params['config'] ||= {})['ranges'] ||= {})['maxSockets'] = val.to_i
614
+ end
615
+ opts.on('--min-cores-per-socket NUMBER', String, "Min cores per socket") do |val|
616
+ ((params['config'] ||= {})['ranges'] ||= {})['minCoresPerSocket'] = val.to_i
617
+ end
618
+ opts.on('--max-cores-per-socket NUMBER', String, "Max cores per socket") do |val|
619
+ ((params['config'] ||= {})['ranges'] ||= {})['maxCoresPerSocket'] = val.to_i
620
+ end
621
+ add_perms_options(opts, options, ['plans', 'groupDefaults'])
622
+ build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote, :quiet])
623
+ opts.footer = "Update service plan.\n[plan] is required. Service plan ID, name or code"
624
+ end
625
+ optparse.parse!(args)
626
+ connect(options)
627
+ if args.count != 1
628
+ raise_command_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args}\n#{optparse}"
629
+ return 1
630
+ end
631
+
632
+ begin
633
+ plan = find_service_plan(args[0])
634
+
635
+ if plan.nil?
636
+ print_red_alert "Service plan #{args[0]} not found"
637
+ exit 1
638
+ end
639
+
640
+ if options[:payload]
641
+ payload = parse_payload(options, 'servicePlan')
642
+ else
643
+ apply_options(params, options)
644
+
645
+ # provision type
646
+ options[:provisionType] = options[:provisionType] || (args.count > 1 ? args[1] : nil)
647
+
648
+ if !options[:provisionType].nil?
649
+ provision_types = @service_plans_interface.provision_types({max: 10000})['provisionTypes']
650
+ provision_type = provision_types.find {|it| it['name'] == options[:provisionType] || it['code'] == options[:provisionType] || it['id'] == options[:provisionType].to_i}
651
+
652
+ if provision_type.nil?
653
+ print_red_alert "Provision type #{options[:provisionType]} not found"
654
+ exit 1
655
+ end
656
+ params['provisionType'] = {'id' => provision_type['id']} if !provision_type.nil?
657
+ end
658
+
659
+ # perms
660
+ resource_perms = {}
661
+ resource_perms['all'] = true if options[:groupAccessAll]
662
+ resource_perms['sites'] = options[:groupAccessList].collect {|site_id| {'id' => site_id.to_i}} if !options[:groupAccessList].nil?
663
+
664
+ if !resource_perms.empty? || !options[:tenants].nil?
665
+ params['permissions'] = {}
666
+ params['permissions']['resourcePermissions'] = resource_perms if !resource_perms.empty?
667
+ params['permissions']['tenantPermissions'] = {'accounts' => options[:tenants]} if !options[:tenants].nil?
668
+ end
669
+
670
+ # visibility
671
+ params['visibility'] = options[:visibility] if !options[:visibility].nil?
672
+
673
+ payload = {'servicePlan' => params}
674
+ end
675
+
676
+ if payload.empty? || !payload['servicePlan'] || payload['servicePlan'].empty?
677
+ raise_command_error "Specify at least one option to update.\n#{optparse}"
678
+ # print_green_success "Nothing to update"
679
+ # return 0
680
+ end
681
+
682
+ @service_plans_interface.setopts(options)
683
+ if options[:dry_run]
684
+ print_dry_run @service_plans_interface.dry.update(plan['id'], payload)
685
+ return
686
+ end
687
+ json_response = @service_plans_interface.update(plan['id'], payload)
688
+
689
+ if options[:json]
690
+ puts as_json(json_response, options)
691
+ elsif !options[:quiet]
692
+ if json_response['success']
693
+ print_green_success "Service plan updated"
694
+ _get(plan['id'], options)
695
+ else
696
+ print_red_alert "Error updating service plan: #{json_response['msg'] || json_response['errors']}"
697
+ end
698
+ end
699
+ return 0
700
+ rescue RestClient::Exception => e
701
+ print_rest_exception(e, options)
702
+ exit 1
703
+ end
704
+ end
705
+
706
+ def activate(args)
707
+ options = {}
708
+ params = {}
709
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
710
+ opts.banner = subcommand_usage( "[plan]")
711
+ build_common_options(opts, options, [:json, :dry_run, :remote, :auto_confirm])
712
+ opts.footer = "Activate service plan.\n" +
713
+ "[plan] is required. Service plan ID, name or code"
714
+ end
715
+ optparse.parse!(args)
716
+ connect(options)
717
+ if args.count != 1
718
+ raise_command_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args}\n#{optparse}"
719
+ return 1
720
+ end
721
+
722
+ begin
723
+ plan = find_service_plan(args[0])
724
+
725
+ if !plan
726
+ print_red_alert "Service plan #{args[0]} not found"
727
+ return 1
728
+ end
729
+
730
+ # if plan['active'] == true
731
+ # print_green_success "Service plan #{plan['name']} already actived."
732
+ # return 0
733
+ # end
734
+
735
+ unless options[:yes] || ::MtnCloud::Cli::OptionTypes::confirm("Are you sure you would like to activate the service plan '#{plan['name']}'?", options)
736
+ return 9, "aborted command"
737
+ end
738
+
739
+ @service_plans_interface.setopts(options)
740
+ if options[:dry_run]
741
+ print_dry_run @service_plans_interface.dry.activate(plan['id'], params)
742
+ return
743
+ end
744
+
745
+ json_response = @service_plans_interface.activate(plan['id'], params)
746
+
747
+ if options[:json]
748
+ print JSON.pretty_generate(json_response)
749
+ print "\n"
750
+ elsif !options[:quiet]
751
+ print_green_success "Service plan #{plan['name']} activated"
752
+ end
753
+ return 0
754
+ rescue RestClient::Exception => e
755
+ print_rest_exception(e, options)
756
+ exit 1
757
+ end
758
+ end
759
+
760
+ def deactivate(args)
761
+ options = {}
762
+ params = {}
763
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
764
+ opts.banner = subcommand_usage( "[plan]")
765
+ build_common_options(opts, options, [:json, :dry_run, :remote, :auto_confirm])
766
+ opts.footer = "Deactivate service plan.\n" +
767
+ "[plan] is required. Service plan ID, name or code"
768
+ end
769
+ optparse.parse!(args)
770
+ connect(options)
771
+ if args.count != 1
772
+ raise_command_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args}\n#{optparse}"
773
+ return 1
774
+ end
775
+
776
+ begin
777
+ plan = find_service_plan(args[0])
778
+
779
+ if !plan
780
+ print_red_alert "Service plan #{args[0]} not found"
781
+ return 1
782
+ end
783
+
784
+ # if plan['active'] == false
785
+ # print_green_success "Service plan #{plan['name']} already deactivated."
786
+ # return 0
787
+ # end
788
+
789
+ unless options[:yes] || ::MtnCloud::Cli::OptionTypes::confirm("Are you sure you would like to deactivate the service plan '#{plan['name']}'?", options)
790
+ return 9, "aborted command"
791
+ end
792
+
793
+ @service_plans_interface.setopts(options)
794
+ if options[:dry_run]
795
+ print_dry_run @service_plans_interface.dry.deactivate(plan['id'], params)
796
+ return
797
+ end
798
+
799
+ json_response = @service_plans_interface.deactivate(plan['id'], params)
800
+
801
+ if options[:json]
802
+ print JSON.pretty_generate(json_response)
803
+ print "\n"
804
+ elsif !options[:quiet]
805
+ print_green_success "Service plan #{plan['name']} deactivated"
806
+ end
807
+ return 0
808
+ rescue RestClient::Exception => e
809
+ print_rest_exception(e, options)
810
+ exit 1
811
+ end
812
+ end
813
+
814
+ def remove(args)
815
+ options = {}
816
+ params = {}
817
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
818
+ opts.banner = subcommand_usage( "[plan]")
819
+ build_common_options(opts, options, [:json, :dry_run, :remote, :auto_confirm])
820
+ opts.footer = "Delete a service plan.\n" +
821
+ "[plan] is required. Service plan ID, name or code"
822
+ end
823
+ optparse.parse!(args)
824
+ connect(options)
825
+ if args.count != 1
826
+ raise_command_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args}\n#{optparse}"
827
+ return 1
828
+ end
829
+
830
+ begin
831
+ plan = find_service_plan(args[0])
832
+
833
+ if !plan
834
+ print_red_alert "Service plan #{args[0]} not found"
835
+ return 1
836
+ end
837
+
838
+ unless options[:yes] || ::MtnCloud::Cli::OptionTypes::confirm("Are you sure you would like to delete the service plan '#{plan['name']}'?", options)
839
+ return 9, "aborted command"
840
+ end
841
+
842
+ @service_plans_interface.setopts(options)
843
+ if options[:dry_run]
844
+ print_dry_run @service_plans_interface.dry.destroy(plan['id'], params)
845
+ return
846
+ end
847
+
848
+ json_response = @service_plans_interface.destroy(plan['id'], params)
849
+
850
+ if options[:json]
851
+ print JSON.pretty_generate(json_response)
852
+ print "\n"
853
+ elsif !options[:quiet]
854
+ print_green_success "Service plan #{plan['name']} deleted"
855
+ end
856
+ return 0
857
+ rescue RestClient::Exception => e
858
+ print_rest_exception(e, options)
859
+ exit 1
860
+ end
861
+ end
862
+
863
+ private
864
+
865
+ def find_service_plan(val)
866
+ (val.to_s =~ /\A\d{1,}\Z/) ? @service_plans_interface.get(val.to_i)['servicePlan'] : @service_plans_interface.list({'code' => val, 'name' => val})["servicePlans"].first
867
+ end
868
+
869
+ def find_provision_type(val)
870
+ (val.to_s =~ /\A\d{1,}\Z/) ? @provision_types_interface.get(val.to_i)['provisionType'] : @provision_types_interface.list({'name' => val})["provisionTypes"].first
871
+ end
872
+
873
+ def printable_byte_size(plan, val, config_field, default_unit = 'MB')
874
+ label = (((plan['config'] && plan['config'][config_field]) || default_unit) == 'MB' || val.to_i < 1024 * 1024 * 1024) ? 'MB' : 'GB'
875
+ val = (val.to_i || 0) / (label == 'MB' ? 1024 * 1024 : 1024 * 1024 * 1024)
876
+ "#{val} #{label}"
877
+ end
878
+
879
+ def get_range(min_val, max_val)
880
+ if min_val && max_val
881
+ "#{min_val} - #{max_val}"
882
+ elsif min_val
883
+ "> #{min_val}"
884
+ elsif max_val
885
+ "< #{max_val}"
886
+ else
887
+ ""
888
+ end
889
+ end
890
+
891
+ def prompt_price_unit(options)
892
+ price_units = ['Minute', 'Hour', 'Day', 'Month', 'Year', '2 Year', '3 Year', '4 Year', '5 Year'].collect {|it| {'name' => it, 'value' => it.downcase.delete(' ')}}
893
+ MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'priceUnit', 'type' => 'select', 'fieldLabel' => 'Price Unit', 'selectOptions' => price_units, 'required' => true, 'defaultValue' => 'hour', 'description' => 'Select Price Unit.'}],options[:options],@api_client,{})['priceUnit']
894
+ end
895
+ end