morpheus-cli 5.3.0 → 5.3.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (190) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +1 -1
  3. data/README.md +1 -3
  4. data/lib/morpheus/api/account_groups_interface.rb +0 -6
  5. data/lib/morpheus/api/accounts_interface.rb +1 -7
  6. data/lib/morpheus/api/api_client.rb +155 -119
  7. data/lib/morpheus/api/appliance_settings_interface.rb +6 -9
  8. data/lib/morpheus/api/approvals_interface.rb +5 -8
  9. data/lib/morpheus/api/apps_interface.rb +0 -7
  10. data/lib/morpheus/api/archive_buckets_interface.rb +9 -16
  11. data/lib/morpheus/api/archive_files_interface.rb +0 -6
  12. data/lib/morpheus/api/auth_interface.rb +4 -4
  13. data/lib/morpheus/api/backup_settings_interface.rb +5 -8
  14. data/lib/morpheus/api/blueprints_interface.rb +1 -7
  15. data/lib/morpheus/api/budgets_interface.rb +0 -6
  16. data/lib/morpheus/api/certificate_types_interface.rb +14 -0
  17. data/lib/morpheus/api/certificates_interface.rb +9 -0
  18. data/lib/morpheus/api/cloud_datastores_interface.rb +0 -6
  19. data/lib/morpheus/api/cloud_folders_interface.rb +1 -7
  20. data/lib/morpheus/api/cloud_policies_interface.rb +0 -6
  21. data/lib/morpheus/api/cloud_resource_pools_interface.rb +0 -6
  22. data/lib/morpheus/api/clouds_interface.rb +0 -6
  23. data/lib/morpheus/api/clusters_interface.rb +39 -42
  24. data/lib/morpheus/api/containers_interface.rb +0 -6
  25. data/lib/morpheus/api/custom_instance_types_interface.rb +0 -6
  26. data/lib/morpheus/api/cypher_interface.rb +0 -6
  27. data/lib/morpheus/api/datastores_interface.rb +4 -7
  28. data/lib/morpheus/api/deploy_interface.rb +1 -6
  29. data/lib/morpheus/api/environments_interface.rb +0 -6
  30. data/lib/morpheus/api/execute_schedules_interface.rb +0 -6
  31. data/lib/morpheus/api/execution_request_interface.rb +0 -6
  32. data/lib/morpheus/api/file_copy_request_interface.rb +2 -9
  33. data/lib/morpheus/api/group_policies_interface.rb +0 -6
  34. data/lib/morpheus/api/groups_interface.rb +0 -7
  35. data/lib/morpheus/api/guidance_interface.rb +9 -12
  36. data/lib/morpheus/api/health_interface.rb +0 -6
  37. data/lib/morpheus/api/image_builder_boot_scripts_interface.rb +0 -6
  38. data/lib/morpheus/api/image_builder_image_builds_interface.rb +0 -6
  39. data/lib/morpheus/api/image_builder_interface.rb +3 -9
  40. data/lib/morpheus/api/image_builder_preseed_scripts_interface.rb +0 -6
  41. data/lib/morpheus/api/instance_types_interface.rb +0 -7
  42. data/lib/morpheus/api/instances_interface.rb +8 -19
  43. data/lib/morpheus/api/integration_types_interface.rb +14 -0
  44. data/lib/morpheus/api/integrations_interface.rb +36 -21
  45. data/lib/morpheus/api/invoice_line_items_interface.rb +4 -9
  46. data/lib/morpheus/api/jobs_interface.rb +11 -14
  47. data/lib/morpheus/api/key_pairs_interface.rb +0 -6
  48. data/lib/morpheus/api/library_cluster_layouts_interface.rb +0 -6
  49. data/lib/morpheus/api/library_container_scripts_interface.rb +0 -6
  50. data/lib/morpheus/api/library_container_templates_interface.rb +0 -6
  51. data/lib/morpheus/api/library_container_types_interface.rb +0 -6
  52. data/lib/morpheus/api/library_container_upgrades_interface.rb +0 -6
  53. data/lib/morpheus/api/library_instance_types_interface.rb +0 -6
  54. data/lib/morpheus/api/library_layouts_interface.rb +0 -6
  55. data/lib/morpheus/api/library_spec_template_types_interface.rb +0 -6
  56. data/lib/morpheus/api/library_spec_templates_interface.rb +0 -6
  57. data/lib/morpheus/api/license_interface.rb +0 -6
  58. data/lib/morpheus/api/load_balancers_interface.rb +0 -6
  59. data/lib/morpheus/api/log_settings_interface.rb +9 -12
  60. data/lib/morpheus/api/logs_interface.rb +0 -6
  61. data/lib/morpheus/api/monitoring_alerts_interface.rb +0 -6
  62. data/lib/morpheus/api/monitoring_apps_interface.rb +0 -6
  63. data/lib/morpheus/api/monitoring_checks_interface.rb +0 -6
  64. data/lib/morpheus/api/monitoring_contacts_interface.rb +0 -6
  65. data/lib/morpheus/api/monitoring_groups_interface.rb +0 -6
  66. data/lib/morpheus/api/monitoring_incidents_interface.rb +0 -6
  67. data/lib/morpheus/api/monitoring_interface.rb +6 -12
  68. data/lib/morpheus/api/network_domain_records_interface.rb +0 -6
  69. data/lib/morpheus/api/network_domains_interface.rb +0 -6
  70. data/lib/morpheus/api/network_groups_interface.rb +0 -6
  71. data/lib/morpheus/api/network_pool_ips_interface.rb +0 -6
  72. data/lib/morpheus/api/network_pool_servers_interface.rb +0 -6
  73. data/lib/morpheus/api/network_pools_interface.rb +0 -6
  74. data/lib/morpheus/api/network_proxies_interface.rb +0 -6
  75. data/lib/morpheus/api/network_routers_interface.rb +0 -6
  76. data/lib/morpheus/api/network_security_servers_interface.rb +6 -9
  77. data/lib/morpheus/api/network_services_interface.rb +14 -14
  78. data/lib/morpheus/api/network_subnets_interface.rb +0 -6
  79. data/lib/morpheus/api/network_types_interface.rb +1 -7
  80. data/lib/morpheus/api/networks_interface.rb +0 -6
  81. data/lib/morpheus/api/option_type_lists_interface.rb +0 -6
  82. data/lib/morpheus/api/option_types_interface.rb +0 -6
  83. data/lib/morpheus/api/options_interface.rb +0 -6
  84. data/lib/morpheus/api/packages_interface.rb +0 -6
  85. data/lib/morpheus/api/policies_interface.rb +1 -8
  86. data/lib/morpheus/api/power_schedules_interface.rb +0 -6
  87. data/lib/morpheus/api/price_sets_interface.rb +8 -11
  88. data/lib/morpheus/api/prices_interface.rb +12 -15
  89. data/lib/morpheus/api/processes_interface.rb +0 -6
  90. data/lib/morpheus/api/provision_types_interface.rb +0 -6
  91. data/lib/morpheus/api/provisioning_license_types_interface.rb +0 -6
  92. data/lib/morpheus/api/provisioning_licenses_interface.rb +0 -6
  93. data/lib/morpheus/api/provisioning_settings_interface.rb +6 -9
  94. data/lib/morpheus/api/read_interface.rb +23 -0
  95. data/lib/morpheus/api/reports_interface.rb +0 -6
  96. data/lib/morpheus/api/rest_interface.rb +12 -10
  97. data/lib/morpheus/api/roles_interface.rb +7 -6
  98. data/lib/morpheus/api/security_group_rules_interface.rb +0 -7
  99. data/lib/morpheus/api/security_groups_interface.rb +0 -6
  100. data/lib/morpheus/api/server_types_interface.rb +0 -6
  101. data/lib/morpheus/api/servers_interface.rb +7 -6
  102. data/lib/morpheus/api/service_plans_interface.rb +11 -14
  103. data/lib/morpheus/api/storage_providers_interface.rb +9 -16
  104. data/lib/morpheus/api/subnet_types_interface.rb +1 -7
  105. data/lib/morpheus/api/subnets_interface.rb +0 -6
  106. data/lib/morpheus/api/task_sets_interface.rb +0 -6
  107. data/lib/morpheus/api/tasks_interface.rb +0 -6
  108. data/lib/morpheus/api/user_groups_interface.rb +0 -6
  109. data/lib/morpheus/api/user_settings_interface.rb +38 -18
  110. data/lib/morpheus/api/user_sources_interface.rb +0 -6
  111. data/lib/morpheus/api/users_interface.rb +0 -6
  112. data/lib/morpheus/api/vdi_allocations_interface.rb +9 -0
  113. data/lib/morpheus/api/vdi_apps_interface.rb +9 -0
  114. data/lib/morpheus/api/vdi_gateways_interface.rb +9 -0
  115. data/lib/morpheus/api/vdi_interface.rb +28 -0
  116. data/lib/morpheus/api/vdi_pools_interface.rb +19 -0
  117. data/lib/morpheus/api/virtual_images_interface.rb +0 -6
  118. data/lib/morpheus/api/whitelabel_settings_interface.rb +8 -11
  119. data/lib/morpheus/api/wiki_interface.rb +0 -6
  120. data/lib/morpheus/cli.rb +9 -2
  121. data/lib/morpheus/cli/access_token_command.rb +1 -1
  122. data/lib/morpheus/cli/account_groups_command.rb +4 -4
  123. data/lib/morpheus/cli/apps.rb +68 -84
  124. data/lib/morpheus/cli/archives_command.rb +5 -5
  125. data/lib/morpheus/cli/blueprints_command.rb +5 -5
  126. data/lib/morpheus/cli/boot_scripts_command.rb +1 -1
  127. data/lib/morpheus/cli/catalog_item_types_command.rb +13 -13
  128. data/lib/morpheus/cli/certificates_command.rb +575 -0
  129. data/lib/morpheus/cli/change_password_command.rb +4 -4
  130. data/lib/morpheus/cli/cli_command.rb +63 -7
  131. data/lib/morpheus/cli/clouds.rb +3 -2
  132. data/lib/morpheus/cli/clusters.rb +7 -4
  133. data/lib/morpheus/cli/commands/standard/history_command.rb +4 -5
  134. data/lib/morpheus/cli/commands/standard/man_command.rb +4 -5
  135. data/lib/morpheus/cli/credentials.rb +4 -11
  136. data/lib/morpheus/cli/environments_command.rb +1 -1
  137. data/lib/morpheus/cli/execute_schedules_command.rb +3 -3
  138. data/lib/morpheus/cli/hosts.rb +253 -232
  139. data/lib/morpheus/cli/image_builder_command.rb +6 -6
  140. data/lib/morpheus/cli/instance_types.rb +1 -1
  141. data/lib/morpheus/cli/instances.rb +196 -186
  142. data/lib/morpheus/cli/integrations_command.rb +1155 -42
  143. data/lib/morpheus/cli/invoices_command.rb +75 -67
  144. data/lib/morpheus/cli/key_pairs.rb +2 -2
  145. data/lib/morpheus/cli/library_container_scripts_command.rb +1 -1
  146. data/lib/morpheus/cli/library_container_templates_command.rb +1 -1
  147. data/lib/morpheus/cli/library_container_types_command.rb +6 -6
  148. data/lib/morpheus/cli/library_instance_types_command.rb +4 -4
  149. data/lib/morpheus/cli/library_layouts_command.rb +5 -5
  150. data/lib/morpheus/cli/library_option_lists_command.rb +4 -4
  151. data/lib/morpheus/cli/library_option_types_command.rb +4 -4
  152. data/lib/morpheus/cli/library_upgrades_command.rb +6 -6
  153. data/lib/morpheus/cli/license.rb +2 -2
  154. data/lib/morpheus/cli/load_balancers.rb +1 -1
  155. data/lib/morpheus/cli/login.rb +10 -1
  156. data/lib/morpheus/cli/mixins/option_source_helper.rb +15 -16
  157. data/lib/morpheus/cli/mixins/print_helper.rb +33 -18
  158. data/lib/morpheus/cli/mixins/provisioning_helper.rb +4 -4
  159. data/lib/morpheus/cli/mixins/vdi_helper.rb +246 -0
  160. data/lib/morpheus/cli/network_domains_command.rb +2 -2
  161. data/lib/morpheus/cli/network_routers_command.rb +22 -9
  162. data/lib/morpheus/cli/networks_command.rb +2 -2
  163. data/lib/morpheus/cli/option_types.rb +39 -34
  164. data/lib/morpheus/cli/policies_command.rb +0 -1
  165. data/lib/morpheus/cli/power_schedules_command.rb +3 -3
  166. data/lib/morpheus/cli/preseed_scripts_command.rb +1 -1
  167. data/lib/morpheus/cli/remote.rb +2 -2
  168. data/lib/morpheus/cli/reports_command.rb +5 -2
  169. data/lib/morpheus/cli/roles.rb +224 -64
  170. data/lib/morpheus/cli/security_group_rules.rb +1 -1
  171. data/lib/morpheus/cli/service_plans_command.rb +4 -1
  172. data/lib/morpheus/cli/setup.rb +0 -1
  173. data/lib/morpheus/cli/subnets_command.rb +11 -2
  174. data/lib/morpheus/cli/tenants_command.rb +3 -3
  175. data/lib/morpheus/cli/user_groups_command.rb +3 -3
  176. data/lib/morpheus/cli/user_settings_command.rb +268 -57
  177. data/lib/morpheus/cli/user_sources_command.rb +3 -3
  178. data/lib/morpheus/cli/users.rb +3 -3
  179. data/lib/morpheus/cli/vdi_allocations_command.rb +159 -0
  180. data/lib/morpheus/cli/vdi_apps_command.rb +317 -0
  181. data/lib/morpheus/cli/vdi_command.rb +359 -0
  182. data/lib/morpheus/cli/vdi_gateways_command.rb +290 -0
  183. data/lib/morpheus/cli/vdi_pools_command.rb +571 -0
  184. data/lib/morpheus/cli/version.rb +1 -1
  185. data/lib/morpheus/cli/virtual_images.rb +1 -1
  186. data/lib/morpheus/cli/whoami.rb +0 -15
  187. data/lib/morpheus/cli/wiki_command.rb +1 -1
  188. data/lib/morpheus/rest_client.rb +30 -0
  189. data/lib/morpheus/terminal.rb +15 -7
  190. metadata +18 -2
@@ -20,9 +20,9 @@ class Morpheus::Cli::UserSourcesCommand
20
20
 
21
21
  def connect(opts)
22
22
  @api_client = establish_remote_appliance_connection(opts)
23
- @user_sources_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).user_sources
24
- @accounts_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).accounts
25
- @users_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).users
23
+ @user_sources_interface = @api_client.user_sources
24
+ @accounts_interface = @api_client.accounts
25
+ @users_interface = @api_client.users
26
26
  end
27
27
 
28
28
  def handle(args)
@@ -22,9 +22,9 @@ class Morpheus::Cli::Users
22
22
 
23
23
  def connect(opts)
24
24
  @api_client = establish_remote_appliance_connection(opts)
25
- @users_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).users
26
- @accounts_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).accounts
27
- @roles_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).roles
25
+ @users_interface = @api_client.users
26
+ @accounts_interface = @api_client.accounts
27
+ @roles_interface = @api_client.roles
28
28
  end
29
29
 
30
30
  def handle(args)
@@ -0,0 +1,159 @@
1
+ require 'morpheus/cli/cli_command'
2
+
3
+ # CLI command VDI Allocation management
4
+ # UI is Tools: VDI Allocations
5
+ # API is /vdi-allocations and returns vdiAllocations
6
+ class Morpheus::Cli::VdiAllocationsCommand
7
+ include Morpheus::Cli::CliCommand
8
+ include Morpheus::Cli::VdiHelper
9
+ include Morpheus::Cli::OptionSourceHelper
10
+
11
+ set_command_name :'vdi-allocations'
12
+ set_command_description "View VDI allocations"
13
+
14
+ register_subcommands :list, :get
15
+
16
+ def connect(opts)
17
+ @api_client = establish_remote_appliance_connection(opts)
18
+ @vdi_pools_interface = @api_client.vdi_pools
19
+ @vdi_allocations_interface = @api_client.vdi_allocations
20
+ @option_types_interface = @api_client.option_types
21
+ end
22
+
23
+ def handle(args)
24
+ handle_subcommand(args)
25
+ end
26
+
27
+ def list(args)
28
+ options = {}
29
+ params = {}
30
+ ref_ids = []
31
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
32
+ opts.banner = subcommand_usage("[search]")
33
+ build_standard_list_options(opts, options)
34
+ opts.on('--id ID', String, "Filter by VDI Allocation ID" ) do |val|
35
+ params['id'] = parse_id_list(val)
36
+ end
37
+ opts.on('--status STATUS', String, "Filter by VDI Allocation Status" ) do |val|
38
+ params['status'] = parse_id_list(val)
39
+ end
40
+ opts.on('--pool POOL', String, "Filter by VDI Pool Name or ID" ) do |val|
41
+ options[:pool] = val
42
+ end
43
+ opts.on('-u', '--user USER', "Filter by User Username or ID" ) do |val|
44
+ options[:user] = val
45
+ end
46
+ opts.footer = "List VDI allocations."
47
+ end
48
+ optparse.parse!(args)
49
+ connect(options)
50
+ if args.count > 0
51
+ options[:phrase] = args.join(" ")
52
+ end
53
+ params.merge!(parse_list_options(options))
54
+ # --id
55
+ if options[:pool]
56
+ pool_ids = parse_id_list(options[:pool]).collect { |it|
57
+ vdi_pool = find_vdi_pool_by_name_or_id(it)
58
+ vdi_pool ? vdi_pool['id'] : nil
59
+ }
60
+ return 1 if pool_ids.include?(nil)
61
+ params['poolId'] = pool_ids
62
+ end
63
+ # --pool
64
+ if options[:pool]
65
+ pool_ids = parse_id_list(options[:pool]).collect { |it|
66
+ vdi_pool = find_vdi_pool_by_name_or_id(it)
67
+ vdi_pool ? vdi_pool['id'] : nil
68
+ }
69
+ return 1 if pool_ids.include?(nil)
70
+ params['poolId'] = pool_ids
71
+ end
72
+ # --user
73
+ if options[:user]
74
+ user_ids = parse_user_id_list(options[:user])
75
+ return 1 if user_ids.nil?
76
+ params['userId'] = user_ids
77
+ end
78
+ @vdi_allocations_interface.setopts(options)
79
+ if options[:dry_run]
80
+ print_dry_run @vdi_allocations_interface.dry.list(params)
81
+ return
82
+ end
83
+ json_response = @vdi_allocations_interface.list(params)
84
+ render_response(json_response, options, vdi_allocation_list_key) do
85
+ vdi_allocations = json_response[vdi_allocation_list_key]
86
+ print_h1 "Morpheus VDI Allocations", parse_list_subtitles(options), options
87
+ if vdi_allocations.empty?
88
+ print cyan,"No VDI allocations found.",reset,"\n"
89
+ else
90
+ list_columns = vdi_allocation_column_definitions.upcase_keys!
91
+ print as_pretty_table(vdi_allocations, list_columns, options)
92
+ print_results_pagination(json_response)
93
+ end
94
+ print reset,"\n"
95
+ end
96
+ return 0, nil
97
+ end
98
+
99
+ def get(args)
100
+ params = {}
101
+ options = {}
102
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
103
+ opts.banner = subcommand_usage("[allocation]")
104
+ build_standard_get_options(opts, options)
105
+ opts.footer = <<-EOT
106
+ Get details about a specific VDI allocation.
107
+ [allocation] is required. This is the id of a VDI allocation.
108
+ EOT
109
+ end
110
+ optparse.parse!(args)
111
+ verify_args!(args:args, optparse:optparse, min:1)
112
+ connect(options)
113
+ params.merge!(parse_query_options(options))
114
+ id_list = parse_id_list(args)
115
+ return run_command_for_each_arg(id_list) do |arg|
116
+ _get(arg, params, options)
117
+ end
118
+ end
119
+
120
+ def _get(id, params, options)
121
+ @vdi_allocations_interface.setopts(options)
122
+ if options[:dry_run]
123
+ print_dry_run @vdi_allocations_interface.dry.get(id, params)
124
+ return
125
+ end
126
+ json_response = @vdi_allocations_interface.get(id, params)
127
+ vdi_allocation = json_response[vdi_allocation_object_key]
128
+ render_response(json_response, options, vdi_allocation_object_key) do
129
+ print_h1 "VDI Allocation Details", [], options
130
+ print cyan
131
+ show_columns = vdi_allocation_column_definitions
132
+ print_description_list(show_columns, vdi_allocation)
133
+ print reset,"\n"
134
+ end
135
+ return 0, nil
136
+ end
137
+
138
+ private
139
+
140
+ def vdi_allocation_column_definitions()
141
+ {
142
+ "ID" => lambda {|it| it['id'] },
143
+ "Pool" => lambda {|it| it['pool'] ? it['pool']['name'] : nil },
144
+ "Instance" => lambda {|it| it['instance'] ? it['instance']['name'] : nil },
145
+ "User" => lambda {|it| it['user'] ? it['user']['username'] : nil },
146
+ "Status" => lambda {|it| format_vdi_allocation_status(it) },
147
+ "Created" => lambda {|it| format_local_dt it['dateCreated'] },
148
+ "Last Reserved" => lambda {|it| format_local_dt it['lastReserved'] },
149
+ "Release Date" => lambda {|it| format_local_dt it['releaseDate'] }
150
+ }
151
+ end
152
+
153
+ def vdi_allocation_list_column_definitions()
154
+ vdi_allocation_column_definitions()
155
+ end
156
+
157
+ # finders are in VdiHelper mixin
158
+
159
+ end
@@ -0,0 +1,317 @@
1
+ require 'morpheus/cli/cli_command'
2
+
3
+ # CLI command VDI App management
4
+ # UI is Tools: VDI Apps
5
+ # API is /vdi-apps and returns vdiApps
6
+ class Morpheus::Cli::VdiAppsCommand
7
+ include Morpheus::Cli::CliCommand
8
+ include Morpheus::Cli::VdiHelper
9
+ include Morpheus::Cli::OptionSourceHelper
10
+
11
+ set_command_name :'vdi-apps'
12
+ set_command_description "View and manage VDI apps"
13
+
14
+ register_subcommands :list, :get, :add, :update, :remove
15
+
16
+ def connect(opts)
17
+ @api_client = establish_remote_appliance_connection(opts)
18
+ @vdi_apps_interface = @api_client.vdi_apps
19
+ @vdi_apps_interface = @api_client.vdi_apps
20
+ @vdi_apps_interface = @api_client.vdi_apps
21
+ @option_types_interface = @api_client.option_types
22
+ end
23
+
24
+ def handle(args)
25
+ handle_subcommand(args)
26
+ end
27
+
28
+ def list(args)
29
+ options = {}
30
+ params = {}
31
+ ref_ids = []
32
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
33
+ opts.banner = subcommand_usage("[search]")
34
+ build_standard_list_options(opts, options)
35
+ opts.footer = "List VDI apps."
36
+ end
37
+ optparse.parse!(args)
38
+ connect(options)
39
+ if args.count > 0
40
+ options[:phrase] = args.join(" ")
41
+ end
42
+ params.merge!(parse_list_options(options))
43
+ @vdi_apps_interface.setopts(options)
44
+ if options[:dry_run]
45
+ print_dry_run @vdi_apps_interface.dry.list(params)
46
+ return
47
+ end
48
+ json_response = @vdi_apps_interface.list(params)
49
+ render_response(json_response, options, vdi_app_list_key) do
50
+ vdi_apps = json_response[vdi_app_list_key]
51
+ print_h1 "Morpheus VDI Apps", parse_list_subtitles(options), options
52
+ if vdi_apps.empty?
53
+ print cyan,"No VDI apps found.",reset,"\n"
54
+ else
55
+ print as_pretty_table(vdi_apps, vdi_app_list_column_definitions.upcase_keys!, options)
56
+ print_results_pagination(json_response)
57
+ end
58
+ print reset,"\n"
59
+ end
60
+ return 0, nil
61
+ end
62
+
63
+ def get(args)
64
+ params = {}
65
+ options = {}
66
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
67
+ opts.banner = subcommand_usage("[app]")
68
+ build_standard_get_options(opts, options)
69
+ opts.footer = <<-EOT
70
+ Get details about a specific VDI app.
71
+ [app] is required. This is the name or id of a VDI app.
72
+ EOT
73
+ end
74
+ optparse.parse!(args)
75
+ verify_args!(args:args, optparse:optparse, min:1)
76
+ connect(options)
77
+ params.merge!(parse_query_options(options))
78
+ id_list = parse_id_list(args)
79
+ return run_command_for_each_arg(id_list) do |arg|
80
+ _get(arg, params, options)
81
+ end
82
+ end
83
+
84
+ def _get(id, params, options)
85
+ vdi_app = nil
86
+ if id.to_s !~ /\A\d{1,}\Z/
87
+ vdi_app = find_vdi_app_by_name(id)
88
+ return 1, "VDI app not found for #{id}" if vdi_app.nil?
89
+ id = vdi_app['id']
90
+ end
91
+ @vdi_apps_interface.setopts(options)
92
+ if options[:dry_run]
93
+ print_dry_run @vdi_apps_interface.dry.get(id, params)
94
+ return
95
+ end
96
+ json_response = @vdi_apps_interface.get(id, params)
97
+ vdi_app = json_response[vdi_app_object_key]
98
+ config = vdi_app['config'] || {}
99
+ # export just the config as json or yaml (default)
100
+ if options[:show_config]
101
+ unless options[:json] || options[:yaml] || options[:csv]
102
+ options[:yaml] = true
103
+ end
104
+ return render_with_format(config, options)
105
+ end
106
+ render_response(json_response, options, vdi_app_object_key) do
107
+ print_h1 "VDI App Details", [], options
108
+ print cyan
109
+ show_columns = vdi_app_column_definitions
110
+ show_columns.delete("VDI Apps") unless vdi_app['apps']
111
+ show_columns.delete("VDI App") unless vdi_app['app']
112
+ show_columns.delete("Guest Console Jump Host") unless vdi_app['guestConsoleJumpHost']
113
+ show_columns.delete("Guest Console Jump Port") unless vdi_app['guestConsoleJumpPort']
114
+ show_columns.delete("Guest Console Jump Username") unless vdi_app['guestConsoleJumpUsername']
115
+ show_columns.delete("Guest Console Jump Password") unless vdi_app['guestConsoleJumpPassword']
116
+ show_columns.delete("Guest Console Jump Keypair") unless vdi_app['guestConsoleJumpKeypair']
117
+ print_description_list(show_columns, vdi_app)
118
+
119
+
120
+ print reset,"\n"
121
+ end
122
+ return 0, nil
123
+ end
124
+
125
+ def add(args)
126
+ options = {}
127
+ params = {}
128
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
129
+ opts.banner = subcommand_usage("[name] [options]")
130
+ build_option_type_options(opts, options, add_vdi_app_option_types)
131
+ build_standard_add_options(opts, options)
132
+ opts.footer = <<-EOT
133
+ Create a new VDI app.
134
+ EOT
135
+ end
136
+ optparse.parse!(args)
137
+ verify_args!(args:args, optparse:optparse, min:0, max:1)
138
+ options[:options]['name'] = args[0] if args[0]
139
+ if options[:options]['logo']
140
+ options[:options]['iconPath'] = 'custom'
141
+ end
142
+ connect(options)
143
+ payload = {}
144
+ if options[:payload]
145
+ payload = options[:payload]
146
+ payload.deep_merge!({vdi_app_object_key => parse_passed_options(options)})
147
+ else
148
+ payload.deep_merge!({vdi_app_object_key => parse_passed_options(options)})
149
+ v_prompt = Morpheus::Cli::OptionTypes.prompt(add_vdi_app_option_types, options[:options], @api_client, options[:params])
150
+ params.deep_merge!(v_prompt)
151
+ params.booleanize!
152
+ # logo upload requires multipart instead of json
153
+ if params['logo']
154
+ params['logo'] = File.new(File.expand_path(params['logo']), 'rb')
155
+ payload[:multipart] = true
156
+ end
157
+ payload[vdi_app_object_key].deep_merge!(params)
158
+ end
159
+ @vdi_apps_interface.setopts(options)
160
+ if options[:dry_run]
161
+ print_dry_run @vdi_apps_interface.dry.create(payload)
162
+ return 0, nil
163
+ end
164
+ json_response = @vdi_apps_interface.create(payload)
165
+ vdi_app = json_response[vdi_app_object_key]
166
+ render_response(json_response, options, vdi_app_object_key) do
167
+ print_green_success "Added VDI app #{vdi_app['name']}"
168
+ return _get(vdi_app["id"], {}, options)
169
+ end
170
+ return 0, nil
171
+ end
172
+
173
+ def update(args)
174
+ options = {}
175
+ params = {}
176
+ payload = {}
177
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
178
+ opts.banner = subcommand_usage("[app] [options]")
179
+ build_option_type_options(opts, options, update_vdi_app_option_types)
180
+ build_standard_update_options(opts, options)
181
+ opts.footer = <<-EOT
182
+ Update a VDI app.
183
+ [app] is required. This is the name or id of a VDI app.
184
+ EOT
185
+ end
186
+ optparse.parse!(args)
187
+ verify_args!(args:args, optparse:optparse, count:1)
188
+ if options[:options]['logo']
189
+ options[:options]['iconPath'] = 'custom'
190
+ end
191
+ connect(options)
192
+ vdi_app = find_vdi_app_by_name_or_id(args[0])
193
+ return 1 if vdi_app.nil?
194
+ payload = {}
195
+ if options[:payload]
196
+ payload = options[:payload]
197
+ payload.deep_merge!({vdi_app_object_key => parse_passed_options(options)})
198
+ else
199
+ payload.deep_merge!({vdi_app_object_key => parse_passed_options(options)})
200
+ v_prompt = Morpheus::Cli::OptionTypes.no_prompt(update_vdi_app_option_types, options[:options], @api_client, options[:params])
201
+ v_prompt.deep_compact!
202
+ params.deep_merge!(v_prompt)
203
+ params.booleanize!
204
+ # logo upload requires multipart instead of json
205
+ if params['logo']
206
+ params['logo'] = File.new(File.expand_path(params['logo']), 'rb')
207
+ payload[:multipart] = true
208
+ end
209
+ payload.deep_merge!({vdi_app_object_key => params})
210
+ if payload[vdi_app_object_key].empty? # || options[:no_prompt]
211
+ raise_command_error "Specify at least one option to update.\n#{optparse}"
212
+ end
213
+ end
214
+ @vdi_apps_interface.setopts(options)
215
+ if options[:dry_run]
216
+ print_dry_run @vdi_apps_interface.dry.update(vdi_app['id'], payload)
217
+ return
218
+ end
219
+ json_response = @vdi_apps_interface.update(vdi_app['id'], payload)
220
+ vdi_app = json_response[vdi_app_object_key]
221
+ render_response(json_response, options, vdi_app_object_key) do
222
+ print_green_success "Updated VDI app #{vdi_app['name']}"
223
+ return _get(vdi_app["id"], {}, options)
224
+ end
225
+ return 0, nil
226
+ end
227
+
228
+ def remove(args)
229
+ options = {}
230
+ params = {}
231
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
232
+ opts.banner = subcommand_usage("[app] [options]")
233
+ build_standard_remove_options(opts, options)
234
+ opts.footer = <<-EOT
235
+ Delete a VDI app.
236
+ [app] is required. This is the name or id of a VDI app.
237
+ EOT
238
+ end
239
+ optparse.parse!(args)
240
+ verify_args!(args:args, optparse:optparse, count:1)
241
+ connect(options)
242
+ vdi_app = find_vdi_app_by_name_or_id(args[0])
243
+ return 1 if vdi_app.nil?
244
+ @vdi_apps_interface.setopts(options)
245
+ if options[:dry_run]
246
+ print_dry_run @vdi_apps_interface.dry.destroy(vdi_app['id'], params)
247
+ return
248
+ end
249
+ unless options[:yes] || Morpheus::Cli::OptionTypes.confirm("Are you sure you want to delete the VDI app #{vdi_app['name']}?")
250
+ return 9, "aborted command"
251
+ end
252
+ json_response = @vdi_apps_interface.destroy(vdi_app['id'], params)
253
+ render_response(json_response, options) do
254
+ print_green_success "Removed VDI app #{vdi_app['name']}"
255
+ end
256
+ return 0, nil
257
+ end
258
+
259
+ private
260
+
261
+ def vdi_app_list_column_definitions()
262
+
263
+ {
264
+ "ID" => 'id',
265
+ "Name" => 'name',
266
+ # "Description" => 'description',
267
+ "Launch Prefix" => 'launchPrefix',
268
+ # "Logo" => 'logo',
269
+ # "Created" => lambda {|it| format_local_dt(it['dateCreated']) },
270
+ # "Updated" => lambda {|it| format_local_dt(it['lastUpdated']) },
271
+ }
272
+ end
273
+
274
+ def vdi_app_column_definitions()
275
+ {
276
+ "ID" => 'id',
277
+ "Name" => 'name',
278
+ "Description" => 'description',
279
+ "Launch Prefix" => 'launchPrefix',
280
+ "Logo" => 'logo',
281
+ "Created" => lambda {|it| format_local_dt(it['dateCreated']) },
282
+ "Updated" => lambda {|it| format_local_dt(it['lastUpdated']) },
283
+ }
284
+ end
285
+
286
+ def add_vdi_app_option_types
287
+ [
288
+ {'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true, 'description' => 'Choose a unique name for the VDI App'},
289
+ {'fieldName' => 'description', 'fieldLabel' => 'Description', 'type' => 'text', 'description' => 'Description'},
290
+ {'fieldName' => 'launchPrefix', 'fieldLabel' => 'Launch Prefix', 'type' => 'text', 'required' => true, 'description' => 'The RDS App Name Prefix. Note: Must start with || (i.e. ||notepad) to launch notepad'},
291
+ #{'code' => 'vdiApp.iconPath', 'fieldName' => 'iconPath', 'fieldLabel' => 'Logo', 'type' => 'select', 'optionSource' => 'iconList', 'defaultValue' => 'resource'},
292
+ # iconList does not include custom, so add it ourselves..
293
+ # only prompt for logo file if custom
294
+ {'code' => 'vdiApp.iconPath', 'fieldName' => 'iconPath', 'fieldLabel' => 'Logo', 'type' => 'select', 'optionSource' => lambda { |api_client, api_params|
295
+ dropdown = api_client.options.options_for_source("iconList")['data']
296
+ if !dropdown.find {|it| it['value'] == 'custom'}
297
+ dropdown.push({'name' => 'Custom', 'value' => 'custom'})
298
+ end
299
+ dropdown
300
+ }, 'description' => 'Logo icon path or custom if uploading a custom logo', 'defaultValue' => 'resource'},
301
+ {'dependsOnCode' => 'vdiApp.iconPath:custom', 'fieldName' => 'logo', 'fieldLabel' => 'Logo File', 'type' => 'file', 'required' => true, 'description' => 'Local filepath of image file to upload as custom icon'},
302
+ ]
303
+ end
304
+
305
+ def update_vdi_app_option_types
306
+ list = add_vdi_app_option_types.collect {|it|
307
+ it.delete('required')
308
+ it.delete('defaultValue')
309
+ it
310
+ }
311
+ list = list.reject {|it| ["type"].include? it['fieldName'] }
312
+ list
313
+ end
314
+
315
+ # finders are in VdiHelper mixin
316
+
317
+ end