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,876 @@
1
+ require 'mtncloud/cli/mixins/print_helper'
2
+ require 'mtncloud/cli/option_types'
3
+ require 'mtncloud/rest_client'
4
+ # Mixin for MtnCloud::Cli command classes
5
+ # Provides common methods for the monitoring domain, incidents, checks, 'n such
6
+ module MtnCloud::Cli::MonitoringHelper
7
+
8
+ def self.included(klass)
9
+ klass.send :include, MtnCloud::Cli::PrintHelper
10
+ end
11
+
12
+ def monitoring_interface
13
+ # @api_client.monitoring
14
+ raise "#{self.class} has not defined @monitoring_interface" if @monitoring_interface.nil?
15
+ @monitoring_interface
16
+ end
17
+
18
+ def find_check_by_name_or_id(val)
19
+ if val.to_s =~ /\A\d{1,}\Z/
20
+ return find_check_by_id(val)
21
+ else
22
+ return find_check_by_name(val)
23
+ end
24
+ end
25
+
26
+ def find_check_by_id(id)
27
+ begin
28
+ json_response = monitoring_interface.checks.get(id.to_i)
29
+ return json_response['check']
30
+ rescue RestClient::Exception => e
31
+ if e.response && e.response.code == 404
32
+ print_red_alert "Check not found by id #{id}"
33
+ exit 1
34
+ else
35
+ raise e
36
+ end
37
+ end
38
+ end
39
+
40
+ def find_check_by_name(name)
41
+ json_results = monitoring_interface.checks.list({name: name})
42
+ if json_results['checks'].empty?
43
+ print_red_alert "Check not found by name #{name}"
44
+ exit 1
45
+ end
46
+ check = json_results['checks'][0]
47
+ return check
48
+ end
49
+
50
+ # def find_incident_by_name_or_id(val)
51
+ # if val.to_s =~ /\A\d{1,}\Z/
52
+ # return find_incident_by_id(val)
53
+ # else
54
+ # return find_incident_by_name(val)
55
+ # end
56
+ # end
57
+
58
+ def find_incident_by_id(id)
59
+ begin
60
+ json_response = monitoring_interface.incidents.get(id.to_i)
61
+ return json_response['incident']
62
+ rescue RestClient::Exception => e
63
+ if e.response && e.response.code == 404
64
+ print_red_alert "Incident not found by id #{id}"
65
+ exit 1
66
+ else
67
+ raise e
68
+ end
69
+ end
70
+ end
71
+
72
+ # def find_incident_by_name(name)
73
+ # json_results = monitoring_interface.incidents.get({name: name})
74
+ # if json_results['incidents'].empty?
75
+ # print_red_alert "Incident not found by name #{name}"
76
+ # exit 1
77
+ # end
78
+ # incident = json_results['incidents'][0]
79
+ # return incident
80
+ # end
81
+
82
+
83
+ def get_available_check_types(refresh=false)
84
+ if !@available_check_types || refresh
85
+ # @available_check_types = [{name: 'A Fake Check Type', code: 'achecktype'}]
86
+ # todo: use options api instead probably...
87
+ @available_check_types = check_types_interface.list_check_types['checkTypes']
88
+ end
89
+ return @available_check_types
90
+ end
91
+
92
+ def check_type_for_name_or_id(val)
93
+ if val.to_s =~ /\A\d{1,}\Z/
94
+ return check_type_for_id(val)
95
+ else
96
+ return check_type_for_name(val)
97
+ end
98
+ end
99
+
100
+ def check_type_for_id(id)
101
+ return get_available_check_types().find { |z| z['id'].to_i == id.to_i}
102
+ end
103
+
104
+ def check_type_for_name(name)
105
+ return get_available_check_types().find { |z| z['name'].downcase == name.downcase || z['code'].downcase == name.downcase}
106
+ end
107
+
108
+ def format_severity(severity, return_color=cyan)
109
+ out = ""
110
+ status_string = severity
111
+ if status_string == 'critical'
112
+ out << "#{red}#{status_string.upcase}#{return_color}"
113
+ elsif status_string == 'warning'
114
+ out << "#{yellow}#{status_string.upcase}#{return_color}"
115
+ elsif status_string == 'info'
116
+ out << "#{cyan}#{status_string.upcase}#{return_color}"
117
+ else
118
+ out << "#{cyan}#{status_string.to_s.upcase}#{return_color}"
119
+ end
120
+ out
121
+ end
122
+
123
+ def format_health_status(item, return_color=cyan)
124
+ out = ""
125
+ if item
126
+ attrs = {}
127
+ attrs[:unknown] = item['lastRunDate'] ? false : true
128
+ attrs[:muted] = item['createIncident'] == false
129
+ attrs[:failure] = item['lastCheckStatus'] == 'error'
130
+ attrs[:health] = item['health'] ? item['health'].to_i : 0
131
+
132
+ if attrs[:unknown]
133
+ out << "#{cyan}UNKNOWN#{return_color}"
134
+ elsif attrs[:health] >= 10
135
+ out << "#{green}HEALTHY#{return_color}"
136
+ elsif attrs[:failure]
137
+ out << "#{red}ERROR#{return_color}"
138
+ else
139
+ out << "#{yellow}CAUTION#{return_color}"
140
+ end
141
+ if attrs[:muted]
142
+ out << "#{cyan} (Muted)#{return_color}"
143
+ end
144
+ end
145
+ out
146
+ end
147
+
148
+ def format_monitoring_issue_attachment_type(issue)
149
+ if issue["app"]
150
+ "App"
151
+ elsif issue["check"]
152
+ "Check"
153
+ elsif issue["checkGroup"]
154
+ "Group"
155
+ else
156
+ "Severity Change"
157
+ end
158
+ end
159
+
160
+ def format_monitoring_incident_status(incident)
161
+ out = ""
162
+ muted = incident['inUptime'] == false
163
+ status_string = incident['status']
164
+ if status_string == 'closed'
165
+ out << "CLOSED ✓"
166
+ else
167
+ out << status_string.to_s.upcase
168
+ if muted
169
+ out << " (MUTED)"
170
+ end
171
+ end
172
+ out
173
+ end
174
+
175
+ def format_monitoring_issue_status(issue)
176
+ format_monitoring_incident_status(issue)
177
+ end
178
+
179
+
180
+
181
+ # Incidents
182
+
183
+ def print_incidents_table(incidents, opts={})
184
+ columns = [
185
+ {"ID" => lambda {|incident| incident['id'] } },
186
+ {"SEVERITY" => lambda {|incident| format_severity(incident['severity']) } },
187
+ {"NAME" => lambda {|incident| incident['displayName'] || incident['name'] || 'No Subject' } },
188
+ {"TIME" => lambda {|incident| format_local_dt(incident['startDate']) } },
189
+ {"STATUS" => lambda {|incident| format_monitoring_incident_status(incident) } },
190
+ {"DURATION" => lambda {|incident| format_duration(incident['startDate'], incident['endDate']) } }
191
+ ]
192
+ if opts[:include_fields]
193
+ columns = opts[:include_fields]
194
+ end
195
+ print as_pretty_table(incidents, columns, opts)
196
+ end
197
+
198
+ def print_incident_issues_table(history_items, opts={})
199
+ columns = [
200
+ # {"ID" => lambda {|issue| issue['id'] } },
201
+ {"SEVERITY" => lambda {|issue| format_severity(issue['severity']) } },
202
+ {"AVAILABLE" => lambda {|issue| format_boolean issue['available'] } },
203
+ {"TYPE" => lambda {|issue| issue["attachmentType"] } },
204
+ {"NAME" => lambda {|issue| issue['name'] } },
205
+ {"DATE CREATED" => lambda {|issue| format_local_dt(issue['startDate']) } }
206
+ ]
207
+ if opts[:include_fields]
208
+ columns = opts[:include_fields]
209
+ end
210
+ print as_pretty_table(history_items, columns, opts)
211
+ end
212
+
213
+ def print_incident_history_table(history_items, opts={})
214
+ columns = [
215
+ # {"ID" => lambda {|issue| issue['id'] } },
216
+ # {"SEVERITY" => lambda {|issue| format_health_status(issue) } },
217
+ {"SEVERITY" => lambda {|issue| format_severity(issue['severity']) } },
218
+ {"AVAILABLE" => lambda {|issue| format_boolean issue['available'] } },
219
+ {"TYPE" => lambda {|issue| issue["attachmentType"] } },
220
+ {"NAME" => lambda {|issue| issue['name'] } },
221
+ {"DATE CREATED" => lambda {|issue| format_local_dt(issue['startDate']) } }
222
+ ]
223
+ if opts[:include_fields]
224
+ columns = opts[:include_fields]
225
+ end
226
+ print as_pretty_table(history_items, columns, opts)
227
+ end
228
+
229
+ def print_incident_notifications_table(notifications, opts={})
230
+ columns = [
231
+ {"NAME" => lambda {|notification| notification['recipient'] ? notification['recipient']['name'] : '' } },
232
+ {"DELIVERY TYPE" => lambda {|recipient| format_recipient_method(recipient['method'] || recipient['addressTypes']) } },
233
+ {"NOTIFIED ON" => lambda {|notification| format_local_dt(notification['dateCreated']) } },
234
+ ]
235
+ if opts[:include_fields]
236
+ columns = opts[:include_fields]
237
+ end
238
+ print as_pretty_table(notifications, columns, opts)
239
+ end
240
+
241
+
242
+ # Checks
243
+
244
+ def format_monitoring_check_status(check, include_msg=false, return_color=cyan)
245
+ out = ""
246
+ unknown = check['lastRunDate'].nil?
247
+ failure = check['lastCheckStatus'] == 'error'
248
+ health = check['health']
249
+ muted = check['createIncident'] == false
250
+ status_string = check['lastCheckStatus'].to_s # null for groups, ignore?
251
+
252
+ if unknown
253
+ out << "#{white}UNKNOWN#{return_color}"
254
+ elsif failure || health == 0
255
+ if include_msg && check['lastError']
256
+ out << "#{red}ERROR - #{check['lastError']}#{return_color}"
257
+ else
258
+ out << "#{red}ERROR#{return_color}"
259
+ end
260
+ elsif health.to_i >= 10
261
+ out << "#{green}HEALTHY#{return_color}"
262
+ else
263
+ out << "#{yellow}WARNING#{return_color}"
264
+ end
265
+ if muted
266
+ out << " (MUTED)"
267
+ end
268
+ out
269
+ end
270
+
271
+ def format_monitoring_check_last_metric(check)
272
+ if check['lastMetric']
273
+ metric_name = check['checkType'] ? check['checkType']['metricName'] : nil
274
+ if metric_name
275
+ "#{check['lastMetric']} #{metric_name}"
276
+ else
277
+ "#{check['lastMetric']}"
278
+ end
279
+ else
280
+ "N/A"
281
+ end
282
+ end
283
+
284
+ def format_monitoring_check_type(check)
285
+ out = ""
286
+ if check['checkType']
287
+ if check['checkType']['code'] == 'mixedCheck' || check['checkType']['code'] == 'mixed'
288
+ out = check['checkType']["name"] || "Mixed"
289
+ else
290
+ out = check['checkType']["name"] || ""
291
+ end
292
+ end
293
+ out
294
+ end
295
+
296
+ def print_checks_table(checks, opts={})
297
+ columns = [
298
+ {"ID" => lambda {|check| check['id'] } },
299
+ {"STATUS" => lambda {|check| format_monitoring_check_status(check) } },
300
+ {"NAME" => lambda {|check| check['name'] } },
301
+ {"TIME" => lambda {|check| check['lastRunDate'] ? format_local_dt(check['lastRunDate']) : "N/A" } },
302
+ {"AVAILABILITY" => {display_method: lambda {|check| check['availability'] ? "#{check['availability'].to_f.round(3).to_s}%" : "N/A"} }, justify: "center" },
303
+ {"RESPONSE TIME" => {display_method: lambda {|check| check['lastTimer'] ? "#{check['lastTimer']}ms" : "N/A" } }, justify: "center" },
304
+ {"LAST METRIC" => {display_method: lambda {|check| format_monitoring_check_last_metric(check) } }, justify: "center" },
305
+ {"TYPE" => lambda {|check| format_monitoring_check_type(check) } },
306
+ ]
307
+ if opts[:include_fields]
308
+ columns = opts[:include_fields]
309
+ end
310
+ print as_pretty_table(checks, columns, opts)
311
+ end
312
+
313
+ def print_check_history_table(history_items, opts={})
314
+ columns = [
315
+ {"STATUS" => lambda {|issue| format_health_status(issue) } },
316
+ {"DATE CHECKED" => lambda {|issue| format_local_dt(issue['lastRunDate']) } },
317
+ # {"NAME" => lambda {|issue| issue['name'] } },
318
+ # {"AVAILABLE" => lambda {|issue| format_boolean issue['createIncident'] } },
319
+ {"RESPONSE TIME" => lambda {|issue| issue["lastTimer"] ? "#{issue['lastTimer']}ms" : "" } },
320
+ {"LAST METRIC" => lambda {|issue| issue["lastMetric"] } },
321
+ {"MESSAGE" => lambda {|issue|
322
+ # issue["lastError"].to_s.empty? ? issue["lastMessage"] : issue["lastError"]
323
+ if issue['lastCheckStatus'] == 'error'
324
+ issue["lastError"].to_s
325
+ else
326
+ issue["lastMessage"]
327
+ end
328
+ } },
329
+ ]
330
+ if opts[:include_fields]
331
+ columns = opts[:include_fields]
332
+ end
333
+ print as_pretty_table(history_items, columns, opts)
334
+ end
335
+
336
+ def print_check_group_history_table(history_items, opts={})
337
+ columns = [
338
+ {"STATUS" => lambda {|issue| format_health_status(issue) } },
339
+ {"DATE CHECKED" => lambda {|issue| format_local_dt(issue['lastRunDate']) } },
340
+ {"CHECK" => lambda {|issue| issue['name'] } },
341
+ # {"AVAILABLE" => lambda {|issue| format_boolean issue['createIncident'] } },
342
+ {"RESPONSE TIME" => lambda {|issue| issue["lastTimer"] ? "#{issue['lastTimer']}ms" : "" } },
343
+ {"LAST METRIC" => lambda {|issue| issue["lastMetric"] } },
344
+ {"MESSAGE" => lambda {|issue|
345
+ # issue["lastError"].to_s.empty? ? issue["lastMessage"] : issue["lastError"]
346
+ if issue['lastCheckStatus'] == 'error'
347
+ issue["lastError"].to_s
348
+ else
349
+ issue["lastMessage"]
350
+ end
351
+ } },
352
+ ]
353
+ if opts[:include_fields]
354
+ columns = opts[:include_fields]
355
+ end
356
+ print as_pretty_table(history_items, columns, opts)
357
+ end
358
+
359
+ def print_monitor_app_history_table(history_items, opts={})
360
+ print_check_group_history_table(history_items, opts)
361
+ end
362
+
363
+ def print_check_notifications_table(notifications, opts={})
364
+ columns = [
365
+ {"NAME" => lambda {|notification| notification['recipient'] ? notification['recipient']['name'] : '' } },
366
+ {"DELIVERY TYPE" => lambda {|notification| notification['addressTypes'].to_s } },
367
+ {"NOTIFIED ON" => lambda {|notification| format_local_dt(notification['dateCreated']) } },
368
+ # {"AVAILABLE" => lambda {|notification| format_boolean notification['available'] } },
369
+ # {"TYPE" => lambda {|notification| notification["attachmentType"] } },
370
+ # {"NAME" => lambda {|notification| notification['name'] } },
371
+ {"DATE CREATED" => lambda {|notification|
372
+ date_str = format_local_dt(notification['startDate']).to_s
373
+ if notification['pendingUtil']
374
+ "(pending) #{date_str}"
375
+ else
376
+ date_str
377
+ end
378
+ } }
379
+ ]
380
+ #event['pendingUntil']
381
+ if opts[:include_fields]
382
+ columns = opts[:include_fields]
383
+ end
384
+ print as_pretty_table(notifications, columns, opts)
385
+ end
386
+
387
+ # Monitoring Contacts
388
+
389
+ def find_contact_by_name_or_id(val)
390
+ if val.to_s =~ /\A\d{1,}\Z/
391
+ return find_contact_by_id(val)
392
+ else
393
+ return find_contact_by_name(val)
394
+ end
395
+ end
396
+
397
+ def find_contact_by_id(id)
398
+ begin
399
+ json_response = monitoring_interface.contacts.get(id.to_i)
400
+ return json_response['contact']
401
+ rescue RestClient::Exception => e
402
+ if e.response && e.response.code == 404
403
+ print_red_alert "Contact not found by id #{id}"
404
+ exit 1 # return nil
405
+ else
406
+ raise e
407
+ end
408
+ end
409
+ end
410
+
411
+ def find_contact_by_name(name)
412
+ json_results = monitoring_interface.contacts.list({name: name})
413
+ contacts = json_results["contacts"]
414
+ if contacts.empty?
415
+ print_red_alert "Contact not found by name #{name}"
416
+ exit 1 # return nil
417
+ elsif contacts.size > 1
418
+ print_red_alert "#{contacts.size} Contacts found by name #{name}"
419
+ print "\n"
420
+ puts as_pretty_table(contacts, [{"ID" => "id" }, {"NAME" => "name"}, {"EMAIL" => "emailAddress"}], {color: red})
421
+ print_red_alert "Try passing ID instead"
422
+ print reset,"\n"
423
+ exit 1 # return nil
424
+ else
425
+ return contacts[0]
426
+ end
427
+ end
428
+
429
+ # Monitoring Alerts
430
+
431
+ def find_alert_by_name_or_id(val)
432
+ if val.to_s =~ /\A\d{1,}\Z/
433
+ return find_alert_by_id(val)
434
+ else
435
+ return find_alert_by_name(val)
436
+ end
437
+ end
438
+
439
+ def find_alert_by_id(id)
440
+ begin
441
+ json_response = monitoring_interface.alerts.get(id.to_i)
442
+ return json_response['alert']
443
+ rescue RestClient::Exception => e
444
+ if e.response && e.response.code == 404
445
+ print_red_alert "Alert not found by id #{id}"
446
+ exit 1 # return nil
447
+ else
448
+ raise e
449
+ end
450
+ end
451
+ end
452
+
453
+ def find_alert_by_name(name)
454
+ json_results = monitoring_interface.alerts.list({name: name})
455
+ alerts = json_results["alerts"]
456
+ if alerts.empty?
457
+ print_red_alert "Alert not found by name #{name}"
458
+ exit 1 # return nil
459
+ elsif alerts.size > 1
460
+ print_red_alert "#{alerts.size} Alerts found by name #{name}"
461
+ print "\n"
462
+ puts as_pretty_table(alerts, [{"ID" => "id" }, {"NAME" => "name"}], {color: red})
463
+ print_red_alert "Try passing ID instead"
464
+ print reset,"\n"
465
+ exit 1 # return nil
466
+ else
467
+ return alerts[0]
468
+ end
469
+ end
470
+
471
+ # Monitoring Check Groups
472
+
473
+ def find_check_group_by_name_or_id(val)
474
+ if val.to_s =~ /\A\d{1,}\Z/
475
+ return find_check_group_by_id(val)
476
+ else
477
+ return find_check_group_by_name(val)
478
+ end
479
+ end
480
+
481
+ def find_check_group_by_id(id)
482
+ begin
483
+ json_response = monitoring_interface.groups.get(id.to_i)
484
+ return json_response['checkGroup']
485
+ rescue RestClient::Exception => e
486
+ if e.response && e.response.code == 404
487
+ print_red_alert "Check Group not found by id #{id}"
488
+ exit 1 # return nil
489
+ else
490
+ raise e
491
+ end
492
+ end
493
+ end
494
+
495
+ def find_check_group_by_name(name)
496
+ json_results = monitoring_interface.groups.list({name: name})
497
+ groups = json_results["checkGroups"]
498
+ if groups.empty?
499
+ print_red_alert "Check Group not found by name #{name}"
500
+ exit 1 # return nil
501
+ elsif groups.size > 1
502
+ print_red_alert "#{groups.size} Check Groups found by name #{name}"
503
+ print "\n"
504
+ puts as_pretty_table(groups, [{"ID" => "id" }, {"NAME" => "name"}], {color: red})
505
+ print_red_alert "Try passing ID instead"
506
+ print reset,"\n"
507
+ exit 1 # return nil
508
+ else
509
+ return groups[0]
510
+ end
511
+ end
512
+
513
+ def print_check_groups_table(check_groups, opts={})
514
+ columns = [
515
+ {"ID" => lambda {|check| check['id'] } },
516
+ {"STATUS" => lambda {|check| format_monitoring_check_status(check) } },
517
+ {"NAME" => lambda {|check| check['name'] } },
518
+ {"TIME" => lambda {|check| check['lastRunDate'] ? format_local_dt(check['lastRunDate']) : "N/A" } },
519
+ {"AVAILABILITY" => {display_method: lambda {|check| check['availability'] ? "#{check['availability'].to_f.round(3).to_s}%" : "N/A"} }, justify: "center" },
520
+ {"RESPONSE TIME" => {display_method: lambda {|check| check['lastTimer'] ? "#{check['lastTimer']}ms" : "N/A" } }, justify: "center" },
521
+ # {"LAST METRIC" => {display_method: lambda {|check| format_monitoring_check_last_metric(check) } }, justify: "center" },
522
+ {"TYPE" => lambda {|check| format_monitoring_check_type(check) } },
523
+ ]
524
+ if opts[:include_fields]
525
+ columns = opts[:include_fields]
526
+ end
527
+ print as_pretty_table(check_groups, columns, opts)
528
+ end
529
+
530
+ # Monitoring apps
531
+
532
+ def find_monitoring_app_by_name_or_id(val)
533
+ if val.to_s =~ /\A\d{1,}\Z/
534
+ return find_monitoring_app_by_id(val)
535
+ else
536
+ return find_monitoring_app_by_name(val)
537
+ end
538
+ end
539
+
540
+ def find_monitoring_app_by_id(id)
541
+ begin
542
+ json_response = monitoring_interface.apps.get(id.to_i)
543
+ return json_response['monitorApp'] || json_response['app']
544
+ rescue RestClient::Exception => e
545
+ if e.response && e.response.code == 404
546
+ print_red_alert "Monitor App not found by id #{id}"
547
+ exit 1 # return nil
548
+ else
549
+ raise e
550
+ end
551
+ end
552
+ end
553
+
554
+ def find_monitoring_app_by_name(name)
555
+ json_results = monitoring_interface.apps.list({name: name})
556
+ apps = json_results["monitorApps"] || json_results["apps"]
557
+ if apps.empty?
558
+ print_red_alert "Monitor App not found by name #{name}"
559
+ exit 1 # return nil
560
+ elsif apps.size > 1
561
+ print_red_alert "#{apps.size} apps found by name #{name}"
562
+ print "\n"
563
+ puts as_pretty_table(apps, [{"ID" => "id" }, {"NAME" => "name"}], {color: red})
564
+ print_red_alert "Try passing ID instead"
565
+ print reset,"\n"
566
+ exit 1 # return nil
567
+ else
568
+ return apps[0]
569
+ end
570
+ end
571
+
572
+ def print_monitoring_apps_table(apps, opts={})
573
+ columns = [
574
+ {"ID" => lambda {|app| app['id'] } },
575
+ {"STATUS" => lambda {|app| format_monitoring_check_status(app) } },
576
+ {"NAME" => lambda {|app| app['name'] } },
577
+ # {"DESCRIPTION" => lambda {|app| app['description'] } },
578
+ {"TIME" => lambda {|app| app['lastRunDate'] ? format_local_dt(app['lastRunDate']) : "N/A" } },
579
+ {"AVAILABILITY" => {display_method: lambda {|app| app['availability'] ? "#{app['availability'].to_f.round(3).to_s}%" : "N/A"} }, justify: "center" },
580
+ {"RESPONSE TIME" => {display_method: lambda {|app| app['lastTimer'] ? "#{app['lastTimer']}ms" : "N/A" } }, justify: "center" },
581
+ #{"LAST METRIC" => {display_method: lambda {|app| app['lastMetric'] ? "#{app['lastMetric']}" : "N/A" } }, justify: "center" },
582
+ {"CHECKS" => lambda {|app|
583
+ checks = app['checks']
584
+ checks_str = ""
585
+ if checks && checks.size > 0
586
+ checks_str = "#{checks.size} #{checks.size == 1 ? 'check' : 'checks'}"
587
+ # checks_str << " [#{checks.join(', ')}]"
588
+ end
589
+ check_groups = app['checkGroups']
590
+ check_groups_str = ""
591
+ if check_groups && check_groups.size > 0
592
+ check_groups_str = "#{check_groups.size} #{check_groups.size == 1 ? 'group' : 'groups'}"
593
+ # check_groups_str << " [#{check_groups.join(', ')}]"
594
+ end
595
+ [checks_str, check_groups_str].reject {|s| s.empty? }.join(", ")
596
+ } },
597
+
598
+ ]
599
+ if opts[:include_fields]
600
+ columns = opts[:include_fields]
601
+ end
602
+ print as_pretty_table(apps, columns, opts)
603
+ end
604
+
605
+ def available_severities
606
+ [
607
+ [name:'Critical', code:'critical', value:'critical'],
608
+ [name:'Warning', code:'warning', value:'warning'],
609
+ [name:'Info', code:'info', value:'info']
610
+ ]
611
+ end
612
+
613
+ def format_recipient_method(address_types)
614
+ address_types = address_types.to_s
615
+ alert_method_names = []
616
+ if address_types =~ /email/i
617
+ alert_method_names << "Email"
618
+ end
619
+ if address_types =~ /sms/i
620
+ alert_method_names << "SMS"
621
+ end
622
+ if address_types =~ /apn/i
623
+ alert_method_names << "APN"
624
+ end
625
+ # if alert_method_names.empty?
626
+ # alert_method_names << "None"
627
+ # end
628
+ anded_list(alert_method_names)
629
+ end
630
+
631
+ # server expects "emailAddress" or "smsAddress" or "emailAddress,smsAddress"
632
+ # todo: just use array, expect server to parse it.
633
+ def parse_recipient_method(address_types)
634
+ requested_methods = address_types.to_s
635
+ alert_methods = []
636
+ if address_types =~ /email/i
637
+ alert_methods << "emailAddress"
638
+ end
639
+ if address_types =~ /sms/i || address_types =~ /phone/i || address_types =~ /mobile/i
640
+ alert_methods << "smsAddress"
641
+ end
642
+ if address_types =~ /apn/i
643
+ alert_methods << "apns"
644
+ end
645
+ alert_methods.join(',')
646
+ end
647
+
648
+ def prompt_for_recipients(params, options={})
649
+ #todo
650
+ end
651
+
652
+ def prompt_for_check_groups(params, options={}, api_client=nil, api_params={})
653
+ # def prompt_for_check_groups(params, options={})
654
+ # Check Groups
655
+ check_group_list = nil
656
+ check_group_ids = []
657
+ still_prompting = true
658
+
659
+ if params['checkGroups'].nil?
660
+ while still_prompting
661
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'checkGroups', 'type' => 'text', 'fieldLabel' => 'Check Groups', 'required' => false, 'description' => 'Check Groups to include in this alert rule, comma separated list of names or IDs.'}], options[:options])
662
+ unless v_prompt['checkGroups'].to_s.empty?
663
+ check_group_list = v_prompt['checkGroups'].split(",").collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
664
+ end
665
+ bad_ids = []
666
+ if check_group_list && check_group_list.size > 0
667
+ check_group_list.each do |it|
668
+ found_check = nil
669
+ begin
670
+ found_check = find_check_group_by_name_or_id(it)
671
+ rescue SystemExit => cmdexit
672
+ end
673
+ if found_check
674
+ check_group_ids << found_check['id']
675
+ else
676
+ bad_ids << it
677
+ end
678
+ end
679
+ end
680
+ still_prompting = bad_ids.empty? ? false : true
681
+ end
682
+ else
683
+ check_group_list = params['checkGroups']
684
+ still_prompting = false
685
+ bad_ids = []
686
+ if check_group_list && check_group_list.size > 0
687
+ check_group_list.each do |it|
688
+ found_check = nil
689
+ begin
690
+ found_check = find_check_group_by_name_or_id(it)
691
+ rescue SystemExit => cmdexit
692
+ end
693
+ if found_check
694
+ check_group_ids << found_check['id']
695
+ else
696
+ bad_ids << it
697
+ end
698
+ end
699
+ end
700
+ if !bad_ids.empty?
701
+ return {success:false, msg:"Check Groups not found: #{bad_ids}"}
702
+ end
703
+ # return check_group_ids
704
+ # payload = {'checkGroups':check_group_ids}
705
+ # return payload
706
+ return {success:true, data: check_group_ids}
707
+ end
708
+ end
709
+
710
+ def prompt_for_checks(params, options={}, api_client=nil, api_params={})
711
+ # Checks
712
+ check_list = nil
713
+ check_ids = nil
714
+ still_prompting = true
715
+ if params['checks'].nil?
716
+ still_prompting = true
717
+ while still_prompting do
718
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'checks', 'type' => 'text', 'fieldLabel' => 'Checks', 'required' => false, 'description' => 'Checks to include, comma separated list of names or IDs.'}], options[:options])
719
+ unless v_prompt['checks'].to_s.empty?
720
+ check_list = v_prompt['checks'].split(",").collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
721
+ end
722
+ check_ids = []
723
+ bad_ids = []
724
+ if check_list && check_list.size > 0
725
+ check_list.each do |it|
726
+ found_check = nil
727
+ begin
728
+ found_check = find_check_by_name_or_id(it)
729
+ rescue SystemExit => cmdexit
730
+ end
731
+ if found_check
732
+ check_ids << found_check['id']
733
+ else
734
+ bad_ids << it
735
+ end
736
+ end
737
+ end
738
+ still_prompting = bad_ids.empty? ? false : true
739
+ end
740
+ else
741
+ check_list = params['checks']
742
+ still_prompting = false
743
+ check_ids = []
744
+ bad_ids = []
745
+ if check_list && check_list.size > 0
746
+ check_list.each do |it|
747
+ found_check = nil
748
+ begin
749
+ found_check = find_check_by_name_or_id(it)
750
+ rescue SystemExit => cmdexit
751
+ end
752
+ if found_check
753
+ check_ids << found_check['id']
754
+ else
755
+ bad_ids << it
756
+ end
757
+ end
758
+ end
759
+ if !bad_ids.empty?
760
+ return {success:false, msg:"Checks not found: #{bad_ids}"}
761
+ end
762
+ end
763
+ return {success:true, data: check_ids}
764
+ end
765
+
766
+ def prompt_for_check_groups(params, options={}, api_client=nil, api_params={})
767
+ # def prompt_for_check_groups(params, options={})
768
+ # Check Groups
769
+ check_group_list = nil
770
+ check_group_ids = nil
771
+ bad_ids = []
772
+ if params['checkGroups'].nil?
773
+ still_prompting = true
774
+ while still_prompting do
775
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'checkGroups', 'type' => 'text', 'fieldLabel' => 'Check Groups', 'required' => false, 'description' => 'Check Groups to include, comma separated list of names or IDs.'}], options[:options])
776
+ unless v_prompt['checkGroups'].to_s.empty?
777
+ check_group_list = v_prompt['checkGroups'].split(",").collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
778
+ end
779
+ check_group_ids = []
780
+ bad_ids = []
781
+ if check_group_list && check_group_list.size > 0
782
+ check_group_list.each do |it|
783
+ found_check = nil
784
+ begin
785
+ found_check = find_check_group_by_name_or_id(it)
786
+ rescue SystemExit => cmdexit
787
+ end
788
+ if found_check
789
+ check_group_ids << found_check['id']
790
+ else
791
+ bad_ids << it
792
+ end
793
+ end
794
+ end
795
+ still_prompting = bad_ids.empty? ? false : true
796
+ end
797
+ else
798
+ check_group_list = params['checkGroups']
799
+ check_group_ids = []
800
+ bad_ids = []
801
+ if check_group_list && check_group_list.size > 0
802
+ check_group_list.each do |it|
803
+ found_check = nil
804
+ begin
805
+ found_check = find_check_group_by_name_or_id(it)
806
+ rescue SystemExit => cmdexit
807
+ end
808
+ if found_check
809
+ check_group_ids << found_check['id']
810
+ else
811
+ bad_ids << it
812
+ end
813
+ end
814
+ end
815
+ if !bad_ids.empty?
816
+ return {success:false, msg:"Check Groups not found: #{bad_ids}"}
817
+ end
818
+ end
819
+ return {success:true, data: check_group_ids}
820
+ end
821
+
822
+ def prompt_for_monitor_apps(params, options={}, api_client=nil, api_params={})
823
+ # Apps
824
+
825
+ monitor_app_list = nil
826
+ monitor_app_ids = []
827
+ if params['apps'].nil?
828
+ still_prompting = true
829
+ while still_prompting
830
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'apps', 'type' => 'text', 'fieldLabel' => 'Apps', 'required' => false, 'description' => 'Monitor Apps to include, comma separated list of names or IDs.'}], options[:options])
831
+ unless v_prompt['apps'].to_s.empty?
832
+ monitor_app_list = v_prompt['apps'].split(",").collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
833
+ end
834
+ check_group_ids = []
835
+ bad_ids = []
836
+ if monitor_app_list && monitor_app_list.size > 0
837
+ monitor_app_list.each do |it|
838
+ found_monitor_app = nil
839
+ begin
840
+ found_monitor_app = find_monitoring_app_by_name_or_id(it)
841
+ rescue SystemExit => cmdexit
842
+ end
843
+ if found_monitor_app
844
+ monitor_app_ids << found_monitor_app['id']
845
+ else
846
+ bad_ids << it
847
+ end
848
+ end
849
+ end
850
+ still_prompting = bad_ids.empty? ? false : true
851
+ end
852
+ else
853
+ monitor_app_list = params['apps']
854
+ check_group_ids = []
855
+ bad_ids = []
856
+ if monitor_app_list && monitor_app_list.size > 0
857
+ monitor_app_list.each do |it|
858
+ found_monitor_app = nil
859
+ begin
860
+ found_monitor_app = find_monitoring_app_by_name_or_id(it)
861
+ rescue SystemExit => cmdexit
862
+ end
863
+ if found_monitor_app
864
+ monitor_app_ids << found_monitor_app['id']
865
+ else
866
+ bad_ids << it
867
+ end
868
+ end
869
+ end
870
+ if !bad_ids.empty?
871
+ return {success:false, msg:"Monitor Apps not found: #{bad_ids}"}
872
+ end
873
+ end
874
+ return {success:true, data: monitor_app_ids}
875
+ end
876
+ end