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,511 @@
1
+ require 'time'
2
+ require 'filesize'
3
+ require 'cgi'
4
+ require 'mtncloud/currency'
5
+
6
+ DEFAULT_DATE_FORMAT = "%x"
7
+ DEFAULT_TIME_FORMAT = "%x %I:%M %p"
8
+ ALTERNATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'"
9
+
10
+ # returns an instance of Time
11
+ def parse_time(dt, format=nil)
12
+ if dt.nil? || dt == '' || dt.to_i == 0
13
+ return nil
14
+ elsif dt.is_a?(Time)
15
+ return dt
16
+ elsif dt.is_a?(String)
17
+ result = nil
18
+ err = nil
19
+
20
+ if !result
21
+ format ||= DEFAULT_TIME_FORMAT
22
+ if format
23
+ begin
24
+ result = Time.strptime(dt, format)
25
+ rescue => e
26
+ err = e
27
+ end
28
+ end
29
+ end
30
+ if !result
31
+ begin
32
+ result = Time.strptime(dt, ALTERNATE_TIME_FORMAT)
33
+ rescue => e
34
+ # err = e
35
+ end
36
+ end
37
+ if !result
38
+ begin
39
+ result = Time.strptime(dt, DEFAULT_DATE_FORMAT)
40
+ rescue => e
41
+ # err = e
42
+ end
43
+ end
44
+ if !result
45
+ begin
46
+ result = Time.parse(dt)
47
+ rescue => e
48
+ err = e
49
+ end
50
+ end
51
+ if result
52
+ return result
53
+ else
54
+ raise "unable to parse time '#{dt}'. #{err}"
55
+ end
56
+
57
+ elsif dt.is_a?(Numeric)
58
+ return Time.at(dt)
59
+ else
60
+ raise "bad argument type for parse_time() #{dt.class} #{dt.inspect}"
61
+ end
62
+ end
63
+
64
+ def format_dt(dt, options={})
65
+ dt = parse_time(dt)
66
+ return "" if dt.nil?
67
+ if options[:local]
68
+ dt = dt.getlocal
69
+ end
70
+ format = options[:format] || DEFAULT_TIME_FORMAT
71
+ return dt.strftime(format)
72
+ end
73
+
74
+ def format_local_dt(dt, options={})
75
+ format_dt(dt, {local: true}.merge(options))
76
+ end
77
+
78
+ def format_date(dt, options={})
79
+ format_dt(dt, {format: DEFAULT_DATE_FORMAT}.merge(options))
80
+ end
81
+
82
+ def format_local_date(dt, options={})
83
+ format_dt(dt, {local: true, format: DEFAULT_DATE_FORMAT}.merge(options))
84
+ end
85
+
86
+ def format_dt_as_param(dt)
87
+ dt = dt.getutc
88
+ format_dt(dt, {format: "%Y-%m-%d %X"})
89
+ end
90
+
91
+ def format_duration(start_time, end_time=nil, format="human")
92
+ if !start_time
93
+ return ""
94
+ end
95
+ start_time = parse_time(start_time)
96
+ if end_time
97
+ end_time = parse_time(end_time)
98
+ else
99
+ end_time = Time.now
100
+ end
101
+ seconds = (end_time - start_time).abs
102
+ format_duration_seconds(seconds, format)
103
+ end
104
+
105
+ def format_duration_ago(start_time, end_time=nil)
106
+ if !start_time
107
+ return ""
108
+ end
109
+ start_time = parse_time(start_time)
110
+ if end_time
111
+ end_time = parse_time(end_time)
112
+ else
113
+ end_time = Time.now
114
+ end
115
+ seconds = (end_time - start_time).abs
116
+ format_human_duration(seconds, true)
117
+ end
118
+
119
+ def format_duration_seconds(seconds, format="human")
120
+ seconds = seconds.abs
121
+ out = ""
122
+ # interval = Math.abs(interval)
123
+ if format == "human"
124
+ out = format_human_duration(seconds)
125
+ elsif format
126
+ interval_time = Time.mktime(0) + seconds
127
+ out = interval_time.strftime(format)
128
+ else
129
+ interval_time = Time.mktime(0) + seconds
130
+ out = interval_time.strftime("%H:%M:%S")
131
+ end
132
+ out
133
+ end
134
+
135
+ def format_duration_milliseconds(milliseconds, format="human", ms_threshold=1000)
136
+ out = ""
137
+ milliseconds = milliseconds.to_i.abs
138
+ if ms_threshold && ms_threshold > milliseconds
139
+ out = "#{milliseconds}ms"
140
+ else
141
+ out = format_duration_seconds((milliseconds.to_f / 1000).floor, format)
142
+ end
143
+ out
144
+ end
145
+
146
+ # returns a human readable time duration
147
+ # @param seconds - duration in seconds
148
+ def format_human_duration(seconds, show_relative=false)
149
+ out = ""
150
+ #seconds = seconds.round
151
+ days, hours, minutes = (seconds / (60*60*24)).floor, (seconds / (60*60)).floor, (seconds / (60)).floor
152
+ if days > 365
153
+ out << "#{days.floor} days"
154
+ elsif days > 61
155
+ out << "#{days.floor} days"
156
+ elsif days > 31
157
+ out << "#{days.floor} days"
158
+ elsif days > 0
159
+ if days.floor == 1
160
+ out << "1 day"
161
+ else
162
+ out << "#{days.floor} days"
163
+ end
164
+ elsif hours > 1
165
+ if hours == 1
166
+ out << "1 hour"
167
+ else
168
+ out << "#{hours.floor} hours"
169
+ end
170
+ elsif minutes > 1
171
+ if minutes == 1
172
+ out << "1 minute"
173
+ else
174
+ out << "#{minutes.floor} minutes"
175
+ end
176
+ elsif seconds > 0 && seconds < 1
177
+ ms = (seconds.to_f * 1000).to_i
178
+ out << "#{ms}ms"
179
+ else
180
+ if seconds.floor == 1
181
+ out << "1 second"
182
+ else
183
+ out << "#{seconds.floor} seconds"
184
+ end
185
+ end
186
+ if show_relative
187
+ if seconds < 1
188
+ out = "just now"
189
+ else
190
+ out << " ago"
191
+ end
192
+ end
193
+ out
194
+ end
195
+
196
+ def display_appliance(name, url)
197
+ if name.to_s == "" || name == 'remote-url'
198
+ # "#{url}"
199
+ "#{url}"
200
+ else
201
+ # "#{name} #{url}"
202
+ "[#{name}] #{url}"
203
+ end
204
+ end
205
+
206
+ def iso8601(dt)
207
+ dt.instance_of(Time) ? dt.iso8601 : "#{dt}"
208
+ end
209
+
210
+ # get_object_value returns a value within a Hash like object
211
+ # Usage: get_object_value(host, "plan.name")
212
+ def get_object_value(data, key)
213
+ value = nil
214
+ if key.is_a?(Proc)
215
+ return key.call(data)
216
+ end
217
+ key = key.to_s
218
+ if key.include?(".")
219
+ namespaces = key.split(".")
220
+ value = data
221
+ namespaces.each do |ns|
222
+ if value.respond_to?("key?")
223
+ if value.key?(ns.to_s)
224
+ value = value[ns]
225
+ elsif value.key?(ns.to_sym)
226
+ value = value[ns.to_sym]
227
+ else
228
+ value = nil
229
+ end
230
+ else
231
+ value = nil
232
+ end
233
+ end
234
+ else
235
+ # value = data.key?(key) ? data[key] : data[key.to_sym]
236
+ if data.respond_to?("key?")
237
+ if data.key?(key.to_s)
238
+ value = data[key.to_s]
239
+ elsif data.key?(key.to_sym)
240
+ value = data[key.to_sym]
241
+ end
242
+ end
243
+ end
244
+ return value
245
+ end
246
+
247
+ # filter_data filters Hash-like data to only the specified fields
248
+ # To specify fields of child objects, use a "."
249
+ # Usage: filter_data(instance, ["id", "name", "plan.name"])
250
+ def filter_data(data, include_fields=nil, exclude_fields=nil)
251
+ if !data
252
+ return data
253
+ elsif data.is_a?(Array)
254
+ new_data = data.collect { |it| filter_data(it, include_fields, exclude_fields) }
255
+ return new_data
256
+ elsif data.is_a?(Hash)
257
+ if include_fields
258
+ #new_data = data.select {|k, v| include_fields.include?(k.to_s) || include_fields.include?(k.to_sym) }
259
+ # allow extracting dot pathed fields, just like get_object_value
260
+ my_data = {}
261
+ include_fields.each do |field|
262
+ if field.nil?
263
+ next
264
+ end
265
+ field = field.to_s
266
+ if field.empty?
267
+ next
268
+ end
269
+
270
+ # supports "field as Label"
271
+ field_key = field.strip
272
+ field_label = field_key
273
+
274
+ if field.index(/\s+as\s+/)
275
+ field_key, field_label = field.split(/\s+as\s+/)
276
+ if !field_label
277
+ field_label = field_key
278
+ end
279
+ end
280
+
281
+ if field.include?(".")
282
+ #if field.index(/\s+as\s+/)
283
+ if field_label != field_key
284
+ # collapse to a value
285
+ my_data[field_label] = get_object_value(data, field_key)
286
+ else
287
+ # keep the full object structure
288
+ namespaces = field.split(".")
289
+ cur_data = data
290
+ cur_filtered_data = my_data
291
+ namespaces.each_with_index do |ns, index|
292
+ if index != namespaces.length - 1
293
+ if cur_data && cur_data.respond_to?("key?")
294
+ cur_data = cur_data.key?(ns) ? cur_data[ns] : cur_data[ns.to_sym]
295
+ else
296
+ cur_data = nil
297
+ end
298
+ cur_filtered_data[ns] ||= {}
299
+ cur_filtered_data = cur_filtered_data[ns]
300
+ else
301
+ if cur_data && cur_data.respond_to?("key?")
302
+ cur_filtered_data[ns] = cur_data.key?(ns) ? cur_data[ns] : cur_data[ns.to_sym]
303
+ else
304
+ cur_filtered_data[ns] = nil
305
+ end
306
+ end
307
+ end
308
+ end
309
+ else
310
+ #my_data[field] = data[field] || data[field.to_sym]
311
+ my_data[field_label] = data.key?(field_key) ? data[field_key] : data[field_key.to_sym]
312
+ end
313
+ end
314
+ return my_data
315
+ elsif exclude_fields
316
+ new_data = data.reject {|k, v| exclude_fields.include?(k.to_s) || exclude_fields.include?(k.to_sym) }
317
+ return new_data
318
+ end
319
+ else
320
+ return data # .clone
321
+ end
322
+ end
323
+
324
+ def format_bytes(bytes, units="B", round=nil)
325
+ out = ""
326
+ if bytes
327
+ if bytes < 1024 && units == "B"
328
+ out = "#{bytes.to_i} B"
329
+ else
330
+ out = Filesize.from("#{bytes}#{units == 'auto' ? '' : " #{units}"}").pretty.strip
331
+ out = out.split(' ')[0].to_f.round(round).to_s + ' ' + out.split(' ')[1] if round
332
+ end
333
+ end
334
+ out
335
+ end
336
+
337
+ # returns bytes in an abbreviated format
338
+ # eg. 3.1K instead of 3.10 KiB
339
+ def format_bytes_short(bytes)
340
+ out = format_bytes(bytes)
341
+ if out.include?(" ")
342
+ val, units = out.split(" ")
343
+ val = val.to_f
344
+ # round to 0 or 1 decimal point
345
+ if val % 1 == 0
346
+ val = val.round(0).to_s
347
+ else
348
+ val = val.round(1).to_s
349
+ end
350
+ # K instead of KiB
351
+ units = units[0].chr
352
+ out = "#{val}#{units}"
353
+ end
354
+ return out
355
+ end
356
+
357
+ def no_colors(str)
358
+ str.to_s.gsub(/\e\[\d+m/, "")
359
+ end
360
+
361
+
362
+ def format_number(n, opts={})
363
+ delim = opts[:delimiter] || ','
364
+ out = ""
365
+ parts = n.to_s.split(".")
366
+ whole_number = parts[0].to_s
367
+ decimal = parts[1] ? parts[1..-1].join('.') : nil
368
+ i = 0
369
+ whole_number.reverse.each_char do |c|
370
+ if c == "-"
371
+ out = "#{c}#{out}"
372
+ else
373
+ out = (i > 0 && i % 3 == 0) ? "#{c}#{delim}#{out}" : "#{c}#{out}"
374
+ end
375
+ i+= 1
376
+ end
377
+ if decimal
378
+ out << "." + decimal
379
+ end
380
+ return out
381
+ end
382
+
383
+ def format_sig_dig(n, sigdig=3, min_sigdig=nil, pad_zeros=false)
384
+ v = ""
385
+ if sigdig && sigdig > 0
386
+ # v = n.to_i.round(sigdig).to_s
387
+ v = sprintf("%.#{sigdig}f", n)
388
+ else
389
+ v = n.to_i.round().to_s
390
+ end
391
+ # if pad_zeros != true
392
+ # v = v.to_f.to_s
393
+ # end
394
+ if min_sigdig
395
+ v_parts = v.split(".")
396
+ decimal_str = v_parts[1]
397
+ if decimal_str == nil
398
+ v = v + "." + ('0' * min_sigdig)
399
+ elsif decimal_str.size < min_sigdig
400
+ v = v + ('0' * (min_sigdig - decimal_str.size))
401
+ end
402
+ end
403
+ v
404
+ end
405
+
406
+ def currency_symbol(currency)
407
+ MtnCloud::Currency.get_symbol(currency) || MtnCloud::Currency.get_symbol("USD")
408
+ end
409
+
410
+ # returns currency amount formatted like "$4,5123.00". 0.00 is formatted as "$0"
411
+ # this is not ideal
412
+ def format_currency(amount, currency='USD', opts={})
413
+ # currency '' should probably error, like money gem does
414
+ if currency.to_s.empty?
415
+ currency = 'USD'
416
+ end
417
+ currency = currency.to_s.upcase
418
+
419
+ amount = amount.to_f
420
+ if amount == 0
421
+ return currency_symbol(currency).to_s + "0"
422
+ # elsif amount.to_f < 0.01
423
+ # # return exponent notation like 3.4e-09
424
+ # return currency_symbol(currency).to_s + "#{amount}"
425
+ else
426
+ sigdig = opts[:sigdig] ? opts[:sigdig].to_i : 2 # max decimal digits
427
+ min_sigdig = opts[:min_sigdig] ? opts[:min_sigdig].to_i : (sigdig || 2) # min decimal digits
428
+ display_value = format_sig_dig(amount, sigdig, min_sigdig, opts[:pad_zeros])
429
+ display_value = format_number(display_value) # commas
430
+ rtn = currency_symbol(currency).to_s + display_value
431
+ if amount.to_i < 0
432
+ rtn = "(#{rtn})"
433
+ if opts[:minus_color]
434
+ rtn = "#{opts[:minus_color]}#{rtn}#{opts[:return_color] || cyan}"
435
+ end
436
+ end
437
+ rtn
438
+ end
439
+ end
440
+
441
+ alias :format_money :format_currency
442
+
443
+ # def format_money(amount, currency='usd', opts={})
444
+ # format_currency(amount, currency, opts)
445
+ # end
446
+
447
+ def format_list(items, conjunction="", limit=nil)
448
+ items = items ? items.clone : []
449
+ num_items = items.size
450
+ if limit
451
+ items = items.first(limit)
452
+ end
453
+ last_item = items.pop
454
+ if items.empty?
455
+ return "#{last_item}"
456
+ else
457
+ if limit && limit < num_items
458
+ items << last_item
459
+ last_item = "(#{num_items - items.size} more)"
460
+ end
461
+ return items.join(", ") + (conjunction.to_s.empty? ? ", " : " #{conjunction} ") + "#{last_item}"
462
+ end
463
+ end
464
+
465
+ def anded_list(items, limit=nil)
466
+ format_list(items, "and", limit)
467
+ end
468
+
469
+ def ored_list(items, limit=nil)
470
+ format_list(items, "or", limit)
471
+ end
472
+
473
+ def format_name_values(obj)
474
+ if obj.is_a?(Hash)
475
+ obj.collect {|k,v| "#{k}: #{v}"}.join(", ")
476
+ else
477
+ ""
478
+ end
479
+ end
480
+
481
+ def format_name_and_id(obj)
482
+ if(obj.is_a?(Array))
483
+ return "" if obj.empty? # && hide_empty
484
+ names, ids = obj.collect {|it| it['name'] rescue "" }, obj.collect {|it| it['id'] rescue "" }
485
+ "#{names.join(", ")} [#{ids.join(",")}]"
486
+ elsif(obj.is_a?(Hash))
487
+ "#{obj['name']} [#{obj['id']}]" rescue ""
488
+ else
489
+ obj.to_s
490
+ end
491
+ end
492
+
493
+ def a_or_an(v)
494
+ v.to_s =~ /^[aeiou]/i ? "an" : "a"
495
+ end
496
+
497
+ def format_ok_status(status)
498
+ color = cyan
499
+ if ['ok'].include? status
500
+ color = green
501
+ elsif ['error'].include? status
502
+ color = red
503
+ elsif ['warning'].include? status
504
+ color = yellow
505
+ end
506
+ "#{color}#{status.to_s.upcase}#{cyan}"
507
+ end
508
+
509
+ def escape_filepath(filepath)
510
+ filepath.to_s.split("/").select {|it| !it.to_s.empty? }.collect {|it| CGI::escape(it) }.join("/")
511
+ end
@@ -0,0 +1,185 @@
1
+ require 'logger'
2
+ require 'term/ansicolor'
3
+
4
+ # Provides global Logging behavior
5
+ # By default, MtnCloud::Logging.logger is set to STDOUT with level INFO
6
+ #
7
+ module MtnCloud::Logging
8
+
9
+ DEFAULT_LOG_LEVEL = ENV['DEBUG'] ? Logger::DEBUG : Logger::INFO
10
+
11
+ AUTHORIZATION_HEADER = 'Authorization'
12
+ SECRET_TOKEN_HEADERS = ['X-Morpheus-Token', 'X-Cypher-Token', 'X-Vault-Token', 'X-Morpheus-Lease']
13
+
14
+ @@log_level = DEFAULT_LOG_LEVEL
15
+ @@logger = nil
16
+
17
+ # MtnCloud::Logging::Logger looks just like a typical Logger
18
+ class Logger < ::Logger
19
+ end
20
+
21
+ # Mixin for any class that need a logger instance
22
+ module HasLogger
23
+
24
+ def logger
25
+ @logger ||= MtnCloud::Logging.logger
26
+ end
27
+
28
+ end
29
+
30
+
31
+ # global methods
32
+
33
+
34
+ # get the global logger instance
35
+ def self.logger
36
+ if !@@logger
37
+ set_logger(STDOUT, @@log_level)
38
+ end
39
+ @@logger
40
+ end
41
+
42
+ # set the global logger to another logger or filename
43
+ def self.set_logger(logdev, log_level = @@log_level)
44
+ @@logger = logdev.is_a?(Logger) ? logdev : Logger.new(logdev)
45
+ @@logger.level = log_level || DEFAULT_LOG_LEVEL
46
+ @@logger.formatter = proc do |severity, datetime, progname, msg|
47
+ "#{msg}\n"
48
+ end
49
+ @@logger
50
+ end
51
+
52
+ # set the global log level
53
+ def self.log_level
54
+ @@log_level
55
+ end
56
+
57
+ # set the global log level
58
+ def self.set_log_level(level)
59
+ @@log_level = level.to_i
60
+ if @@logger
61
+ @@logger.level = @@log_level
62
+ end
63
+ @@log_level
64
+ end
65
+
66
+ # alias for set_log_level(level)
67
+ # def self.log_level=(level)
68
+ # self.set_log_level(level)
69
+ # end
70
+
71
+ # is log level debug?
72
+ def self.debug?
73
+ # self.log_level && self.log_level <= Logger::DEBUG
74
+ self.logger.debug?
75
+ end
76
+
77
+ # whether or not to print stack traces
78
+ def self.print_stacktrace?
79
+ self.debug?
80
+ end
81
+
82
+ # mask well known secrets and password patterns
83
+ def self.scrub_message(msg)
84
+ if msg.is_a?(String)
85
+ msg = msg.clone
86
+ # looks for RestClient format (hash.inspect) and request/curl output name: value
87
+ msg.gsub!(/Authorization\"\s?\=\>\s?\"Bearer [^"]+/i, 'Authorization"=>"Bearer ************')
88
+ msg.gsub!(/Authorization\:\s?Bearer [^"']+/i, 'Authorization: Bearer ************')
89
+ # msg.gsub!(/#{AUTHORIZATION_HEADER}\"\s?\=\>\s?\"Bearer [^"]+/, "#{AUTHORIZATION_HEADER}"=>"Bearer ************")
90
+ # msg.gsub!(/#{AUTHORIZATION_HEADER}\:\s?Bearer [^"']+/, "#{AUTHORIZATION_HEADER}: Bearer ************")
91
+ SECRET_TOKEN_HEADERS.each do |header|
92
+ msg.gsub!(/#{header}\"\s?\=\>\s?\"[^"]+/, "#{header}\"=>\"************")
93
+ msg.gsub!(/#{header}\:\s?[^"']+/, "#{header}: ************")
94
+ end
95
+ msg.gsub!(/password\"\: "[^"]+/, 'password": "************') # json properties ending with password
96
+ msg.gsub!(/Password\"\: "[^"]+/, 'Password": "************') # json properties ending with Password
97
+ msg.gsub!(/password\"\s?\=\>\s?\"[^"]+/, 'password"=>"************')
98
+ msg.gsub!(/Password\"\s?\=\>\s?\"[^"]+/, 'Password"=>"************')
99
+ msg.gsub!(/password\=\"[^"]+/, 'password="************')
100
+ msg.gsub!(/Password\=\"[^"]+/, 'Password="************')
101
+ msg.gsub!(/password\=[^"'&]+/, 'password=************') # buggy, wont work with ampersand or quotes in passwords! heh
102
+ msg.gsub!(/Password\=[^"'&]+/, 'Password=************')
103
+ msg.gsub!(/passwordConfirmation\=[^" ]+/i, 'passwordConfirmation="************')
104
+ msg.gsub!(/passwordConfirmation\=[^" ]+/i, 'passwordConfirmation=************')
105
+ end
106
+ msg
107
+ end
108
+
109
+ # An IO class for printing debugging info
110
+ # This is used as a proxy for ::RestClient.log printing right now.
111
+ class DarkPrinter
112
+ include Term::ANSIColor
113
+
114
+ # [IO] to write to
115
+ attr_accessor :io
116
+
117
+ # [String] ansi color code for output. Default is dark
118
+ attr_accessor :color
119
+
120
+ # DarkPrinter with io STDOUT
121
+ def self.instance
122
+ @instance ||= self.new(STDOUT, nil, true)
123
+ end
124
+
125
+ def self.print(*messages)
126
+ instance.print(*messages)
127
+ end
128
+
129
+ def self.puts(*messages)
130
+ instance.puts(*messages)
131
+ end
132
+
133
+ def self.<<(*messages)
134
+ instance.<<(*messages)
135
+ end
136
+
137
+ def initialize(io, color=nil, is_dark=true)
138
+ @io = io # || $stdout
139
+ @color = color # || cyan
140
+ @is_dark = is_dark
141
+ end
142
+
143
+ def scrub_message(msg)
144
+ MtnCloud::Logging.scrub_message(msg)
145
+ end
146
+
147
+ def print_with_color(&block)
148
+ if Term::ANSIColor.coloring?
149
+ @io.print Term::ANSIColor.reset
150
+ @io.print @color if @color
151
+ @io.print Term::ANSIColor.dark if @is_dark
152
+ end
153
+ yield
154
+ if Term::ANSIColor.coloring?
155
+ @io.print Term::ANSIColor.reset
156
+ end
157
+ end
158
+
159
+ def print(*messages)
160
+ if @io
161
+ print_with_color do
162
+ messages.flatten.each do |msg|
163
+ @io.print scrub_message(msg)
164
+ end
165
+ end
166
+ end
167
+ end
168
+
169
+ def puts(*messages)
170
+ if @io
171
+ print_with_color do
172
+ messages.flatten.each do |msg|
173
+ @io.puts scrub_message(msg)
174
+ end
175
+ end
176
+ end
177
+ end
178
+
179
+ def <<(*messages)
180
+ print(*messages)
181
+ end
182
+
183
+ end
184
+
185
+ end