morpheus-cli 5.3.0.3 → 5.3.1

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 (51) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +1 -1
  3. data/README.md +1 -3
  4. data/lib/morpheus/api/api_client.rb +48 -14
  5. data/lib/morpheus/api/certificate_types_interface.rb +14 -0
  6. data/lib/morpheus/api/certificates_interface.rb +9 -0
  7. data/lib/morpheus/api/integration_types_interface.rb +14 -0
  8. data/lib/morpheus/api/integrations_interface.rb +7 -22
  9. data/lib/morpheus/api/network_services_interface.rb +14 -0
  10. data/lib/morpheus/api/read_interface.rb +23 -0
  11. data/lib/morpheus/api/rest_interface.rb +12 -10
  12. data/lib/morpheus/api/roles_interface.rb +7 -0
  13. data/lib/morpheus/api/servers_interface.rb +7 -0
  14. data/lib/morpheus/api/user_settings_interface.rb +38 -18
  15. data/lib/morpheus/api/vdi_allocations_interface.rb +9 -0
  16. data/lib/morpheus/api/vdi_apps_interface.rb +9 -0
  17. data/lib/morpheus/api/vdi_gateways_interface.rb +9 -0
  18. data/lib/morpheus/api/vdi_interface.rb +28 -0
  19. data/lib/morpheus/api/vdi_pools_interface.rb +19 -0
  20. data/lib/morpheus/cli.rb +9 -2
  21. data/lib/morpheus/cli/apps.rb +59 -75
  22. data/lib/morpheus/cli/catalog_item_types_command.rb +13 -13
  23. data/lib/morpheus/cli/certificates_command.rb +575 -0
  24. data/lib/morpheus/cli/cli_command.rb +61 -6
  25. data/lib/morpheus/cli/clouds.rb +1 -0
  26. data/lib/morpheus/cli/clusters.rb +1 -1
  27. data/lib/morpheus/cli/commands/standard/man_command.rb +4 -5
  28. data/lib/morpheus/cli/hosts.rb +245 -224
  29. data/lib/morpheus/cli/instances.rb +150 -167
  30. data/lib/morpheus/cli/integrations_command.rb +588 -41
  31. data/lib/morpheus/cli/login.rb +7 -0
  32. data/lib/morpheus/cli/mixins/print_helper.rb +33 -18
  33. data/lib/morpheus/cli/mixins/provisioning_helper.rb +3 -3
  34. data/lib/morpheus/cli/mixins/vdi_helper.rb +246 -0
  35. data/lib/morpheus/cli/network_routers_command.rb +22 -9
  36. data/lib/morpheus/cli/networks_command.rb +2 -2
  37. data/lib/morpheus/cli/option_types.rb +34 -33
  38. data/lib/morpheus/cli/remote.rb +1 -1
  39. data/lib/morpheus/cli/reports_command.rb +4 -1
  40. data/lib/morpheus/cli/roles.rb +215 -55
  41. data/lib/morpheus/cli/subnets_command.rb +11 -2
  42. data/lib/morpheus/cli/user_settings_command.rb +268 -57
  43. data/lib/morpheus/cli/vdi_allocations_command.rb +159 -0
  44. data/lib/morpheus/cli/vdi_apps_command.rb +317 -0
  45. data/lib/morpheus/cli/vdi_command.rb +359 -0
  46. data/lib/morpheus/cli/vdi_gateways_command.rb +290 -0
  47. data/lib/morpheus/cli/vdi_pools_command.rb +571 -0
  48. data/lib/morpheus/cli/version.rb +1 -1
  49. data/lib/morpheus/rest_client.rb +30 -0
  50. data/lib/morpheus/terminal.rb +15 -7
  51. metadata +18 -2
@@ -0,0 +1,359 @@
1
+ require 'morpheus/cli/cli_command'
2
+
3
+ # CLI command for the VDI (Persona)
4
+ class Morpheus::Cli::VdiCommand
5
+ include Morpheus::Cli::CliCommand
6
+ include Morpheus::Cli::OptionSourceHelper
7
+
8
+ # set_command_name :'desktops'
9
+ set_command_name :'vdi'
10
+ set_command_description "Virtual Desktop Persona: View and allocate your own virtual desktops"
11
+
12
+ register_subcommands :list, :get, :allocate, :open
13
+
14
+ def connect(opts)
15
+ @api_client = establish_remote_appliance_connection(opts)
16
+ @vdi_interface = @api_client.vdi
17
+ end
18
+
19
+ def handle(args)
20
+ handle_subcommand(args)
21
+ end
22
+
23
+ def list(args)
24
+ options = {}
25
+ params = {}
26
+ ref_ids = []
27
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
28
+ opts.banner = subcommand_usage("[search]")
29
+ build_standard_list_options(opts, options)
30
+ opts.footer = "List available virtual desktops (VDI pool)."
31
+ end
32
+ optparse.parse!(args)
33
+ connect(options)
34
+ # verify_args!(args:args, optparse:optparse, count:0)
35
+ if args.count > 0
36
+ options[:phrase] = args.join(" ")
37
+ end
38
+ params.merge!(parse_list_options(options))
39
+ @vdi_interface.setopts(options)
40
+ if options[:dry_run]
41
+ print_dry_run @vdi_interface.dry.list(params)
42
+ return
43
+ end
44
+ json_response = @vdi_interface.list(params)
45
+ vdi_pools = json_response[vdi_desktop_list_key]
46
+ render_response(json_response, options, vdi_desktop_list_key) do
47
+ print_h1 "Morpheus Virtual Desktops", parse_list_subtitles(options), options
48
+ if vdi_pools.empty?
49
+ print cyan,"No virtual desktops found.",reset,"\n"
50
+ else
51
+ list_columns = {
52
+ # "ID" => lambda {|it| it['id'] },
53
+ "Name" => lambda {|it| it['name'] },
54
+ "Status" => lambda {|it| format_virtual_desktop_status(it) },
55
+ }
56
+ #list_columns["Config"] = lambda {|it| truncate_string(it['config'], 100) }
57
+ print as_pretty_table(vdi_pools, list_columns.upcase_keys!, options)
58
+ print_results_pagination(json_response)
59
+
60
+ end
61
+ print reset,"\n"
62
+ end
63
+ return 0, nil
64
+ end
65
+
66
+ def get(args)
67
+ params = {}
68
+ options = {}
69
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
70
+ opts.banner = subcommand_usage("[name]")
71
+ build_standard_get_options(opts, options)
72
+ opts.footer = <<-EOT
73
+ Get details about a specific virtual desktop.
74
+ [name] is required. This is the name or id of a virtual desktop (VDI pool).
75
+ EOT
76
+ end
77
+ optparse.parse!(args)
78
+ verify_args!(args:args, optparse:optparse, min:1)
79
+ connect(options)
80
+ params.merge!(parse_query_options(options))
81
+ id_list = parse_id_list(args)
82
+ return run_command_for_each_arg(id_list) do |arg|
83
+ _get(arg, params, options)
84
+ end
85
+ end
86
+
87
+ def _get(id, params, options)
88
+ vdi_pool = nil
89
+ if id.to_s !~ /\A\d{1,}\Z/
90
+ vdi_pool = find_vdi_pool_by_name(id)
91
+ return 1, "Virtual desktop not found for #{id}" if vdi_pool.nil?
92
+ id = vdi_pool['id']
93
+ end
94
+ @vdi_interface.setopts(options)
95
+ if options[:dry_run]
96
+ print_dry_run @vdi_interface.dry.get(id, params)
97
+ return
98
+ end
99
+ json_response = @vdi_interface.get(id, params)
100
+ vdi_pool = json_response[vdi_desktop_object_key]
101
+ render_response(json_response, options, vdi_desktop_object_key) do
102
+ print_h1 "Virtual Desktop Details", [], options
103
+ print cyan
104
+ show_columns = {
105
+ #"ID" => lambda {|it| it['id'] },
106
+ "Name" => lambda {|it| it['name'] },
107
+ "Status" => lambda {|it| it['status'] },
108
+ #"Allocation ID" => lambda {|it| it['allocation']['id'] rescue '' },
109
+ # todo: more allocation info can be shown here perhaps...
110
+ }
111
+ #show_columns.delete("Allocation ID") unless vdi_pool['allocation'] && vdi_pool['allocation']['id']
112
+ print as_description_list(vdi_pool, show_columns, options)
113
+ print reset,"\n"
114
+ end
115
+ return 0, nil
116
+ end
117
+
118
+ def allocate(args)
119
+ options = {}
120
+ params = {}
121
+ payload = {}
122
+ pool_id = nil
123
+
124
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
125
+ opts.banner = subcommand_usage("[desktop] [options]")
126
+ opts.on('--desktop DESKTOP', String, "Virtual Desktop Name or ID") do |val|
127
+ pool_id = val.to_s
128
+ end
129
+ build_standard_update_options(opts, options)
130
+ opts.footer = <<-EOT
131
+ Allocate a virtual desktop for use.
132
+ [desktop] is required, this is name or id of a virtual desktop (VDI Pool).
133
+ EOT
134
+ end
135
+ optparse.parse!(args)
136
+ verify_args!(args:args, optparse:optparse, min:0)
137
+ connect(options)
138
+ if args.count > 0
139
+ pool_id = args.join(" ")
140
+ end
141
+
142
+ # prompt for Virtual Desktop (VDI Pool) to allocate
143
+ vdi_pool = nil
144
+ if pool_id
145
+ vdi_pool = find_vdi_pool_by_name_or_id(pool_id)
146
+ return [1, "Virtual Desktop not found"] if vdi_pool.nil?
147
+ pool_id = vdi_pool['id']
148
+ elsif
149
+ vdi_pool_option_type = {'fieldName' => 'desktop', 'fieldLabel' => 'Virtual Desktop', 'type' => 'select', 'optionSource' => lambda { |api_client, api_params|
150
+ # @options_interface.options_for_source("vdiPools", {})['data']
151
+ @vdi_interface.list({max:10000})[vdi_desktop_list_key].collect {|it|
152
+ {'name' => it['name'], 'value' => it['id']}
153
+ } }, 'required' => true, 'description' => 'Virtual Desktop (VDI pool) name or id'}
154
+ pool_id = Morpheus::Cli::OptionTypes.prompt([vdi_pool_option_type], options[:options], @api_client, options[:params])['desktop']
155
+ vdi_pool = find_vdi_pool_by_name_or_id(pool_id.to_s)
156
+ return [1, "Virtual Desktop not found"] if vdi_pool.nil?
157
+ pool_id = vdi_pool['id']
158
+ end
159
+
160
+ payload = {}
161
+ if options[:payload]
162
+ payload = options[:payload]
163
+ end
164
+ payload.deep_merge!(parse_passed_options(options))
165
+
166
+ @vdi_interface.setopts(options)
167
+ if options[:dry_run]
168
+ print_dry_run @vdi_interface.dry.allocate(vdi_pool['id'], payload, params)
169
+ return
170
+ end
171
+ json_response = @vdi_interface.allocate(vdi_pool['id'], payload, params)
172
+ vdi_pool = json_response[vdi_desktop_object_key]
173
+ render_response(json_response, options) do
174
+ print_green_success "Allocated virtual desktop '#{vdi_pool['name']}'"
175
+ #_get([vdi_pool['id']] + (options[:remote] ? ["-r",options[:remote]] : []))
176
+ end
177
+ return 0, nil
178
+ end
179
+
180
+
181
+ def open(args)
182
+ options = {}
183
+ params = {}
184
+ payload = {}
185
+ pool_id = nil
186
+
187
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
188
+ opts.banner = subcommand_usage("[desktop] [options]")
189
+ opts.on('--desktop DESKTOP', String, "Virtual Desktop Name or ID") do |val|
190
+ pool_id = val.to_s
191
+ end
192
+ build_standard_update_options(opts, options)
193
+ opts.footer = <<-EOT
194
+ Open a virtual desktop console in your web browser.
195
+ [desktop] is required, this is name or id of a virtual desktop (VDI Pool).
196
+ EOT
197
+ end
198
+ optparse.parse!(args)
199
+ verify_args!(args:args, optparse:optparse, min:0)
200
+ connect(options)
201
+ if args.count > 0
202
+ pool_id = args.join(" ")
203
+ end
204
+
205
+ # prompt for Virtual Desktop (VDI Pool) to allocate
206
+ vdi_pool = nil
207
+ if pool_id
208
+ vdi_pool = find_vdi_pool_by_name_or_id(pool_id)
209
+ return [1, "Virtual Desktop not found"] if vdi_pool.nil?
210
+ pool_id = vdi_pool['id']
211
+ elsif
212
+ vdi_pool_option_type = {'fieldName' => 'desktop', 'fieldLabel' => 'Virtual Desktop', 'type' => 'select', 'optionSource' => lambda { |api_client, api_params|
213
+ # @options_interface.options_for_source("vdiPools", {})['data']
214
+ @vdi_interface.list({max:10000})[vdi_desktop_list_key].collect {|it|
215
+ {'name' => it['name'], 'value' => it['id']}
216
+ } }, 'required' => true, 'description' => 'Virtual Desktop (VDI pool) name or id'}
217
+ pool_id = Morpheus::Cli::OptionTypes.prompt([vdi_pool_option_type], options[:options], @api_client, options[:params])['desktop']
218
+ vdi_pool = find_vdi_pool_by_name_or_id(pool_id.to_s)
219
+ return [1, "Virtual Desktop not found"] if vdi_pool.nil?
220
+ pool_id = vdi_pool['id']
221
+ end
222
+
223
+ # find allocation ID
224
+ # if not found, prompt to allocate now before opening a link to the terminal URL
225
+ allocation_id = nil
226
+ if vdi_pool['allocation']
227
+ allocation_id = vdi_pool['allocation']['id']
228
+ # could check vdi_pool['allocation']['status']
229
+ else
230
+ puts cyan + "You are not currently allocated desktop '#{vdi_pool['name']}'" + reset
231
+ # could check vdi_pool['status'] and error if not 'available'
232
+ if !options[:no_prompt]
233
+ if ::Morpheus::Cli::OptionTypes::confirm("Would you like to allocate this desktop for use now?", options.merge({default: true}))
234
+ # allocate([vdi_pool['id']])
235
+ json_response = @vdi_interface.allocate(vdi_pool['id'], {}, {})
236
+ vdi_pool = json_response[vdi_desktop_object_key]
237
+ allocation_id = vdi_pool['allocation']['id']
238
+ end
239
+ end
240
+ end
241
+
242
+ if allocation_id.nil?
243
+ print_red_alert "You must first allocate virtual desktop '#{vdi_pool['name']}'"
244
+ print_red_alert "Try `vdi allocate \"#{vdi_pool['name']}\"`"
245
+ return 1, "No allocation"
246
+ end
247
+
248
+ link = "#{@appliance_url}/login/oauth-redirect?access_token=#{@access_token}\\&redirectUri=/vdi/terminal/#{allocation_id}"
249
+
250
+ if options[:dry_run]
251
+ puts Morpheus::Util.open_url_command(link)
252
+ return 0
253
+ end
254
+ return Morpheus::Util.open_url(link)
255
+
256
+ end
257
+
258
+ private
259
+
260
+ def vdi_desktop_object_key
261
+ # 'vdiPool'
262
+ 'desktop'
263
+ end
264
+
265
+ def vdi_desktop_list_key
266
+ # 'vdiPools'
267
+ 'desktops'
268
+ end
269
+
270
+ def find_vdi_pool_by_name_or_id(val)
271
+ if val.to_s =~ /\A\d{1,}\Z/
272
+ return find_vdi_pool_by_id(val)
273
+ else
274
+ return find_vdi_pool_by_name(val)
275
+ end
276
+ end
277
+
278
+ # this returns optionTypes and list does not..
279
+ def find_vdi_pool_by_id(id)
280
+ begin
281
+ json_response = @vdi_interface.get(id.to_i)
282
+ return json_response[vdi_desktop_object_key]
283
+ rescue RestClient::Exception => e
284
+ if e.response && e.response.code == 404
285
+ print_red_alert "Virtual Desktop not found by id '#{id}'"
286
+ else
287
+ raise e
288
+ end
289
+ end
290
+ end
291
+
292
+ def find_vdi_pool_by_name(name)
293
+ json_response = @vdi_interface.list({name: name.to_s})
294
+ vdi_pools = json_response[vdi_desktop_list_key]
295
+ if vdi_pools.empty?
296
+ print_red_alert "Virtual Desktop not found by name '#{name}'"
297
+ return nil
298
+ elsif vdi_pools.size > 1
299
+ print_red_alert "#{vdi_pools.size} virtual desktops found by name '#{name}'"
300
+ puts_error as_pretty_table(vdi_pools, [:id, :name], {color:red})
301
+ print_red_alert "Try using ID instead"
302
+ print reset,"\n"
303
+ return nil
304
+ else
305
+ return vdi_pools[0]
306
+ end
307
+ end
308
+
309
+ # def format_vdi_pool_status(vdi_pool, return_color=cyan)
310
+ # out = ""
311
+ # status_string = vdi_pool['status'].to_s.downcase
312
+ # if status_string
313
+ # if ['available'].include?(status_string)
314
+ # out << "#{green}#{status_string.upcase}"
315
+ # elsif ['unavailable'].include?(status_string)
316
+ # out << "#{red}#{status_string.upcase}"
317
+ # else
318
+ # out << "#{return_color}#{status_string.upcase}"
319
+ # end
320
+ # end
321
+ # out + return_color
322
+ # end
323
+
324
+ def format_virtual_desktop_status(vdi_pool, return_color=cyan)
325
+ out = ""
326
+ # status_string = vdi_pool['status'].to_s.downcase
327
+ # status_string = ""
328
+ # if vdi_pool['allocation']
329
+ # status_string = vdi_pool['allocation']['status'].to_s.downcase
330
+ # else
331
+ # # show pool status eg. AVAILABLE or UNAVAILABLE
332
+ # status_string = vdi_pool['status'].to_s.downcase
333
+ # end
334
+ status_string = vdi_pool['allocationStatus'].to_s.downcase
335
+ if vdi_pool['allocation'].nil?
336
+ status_string = vdi_pool['status'].to_s.downcase
337
+ # if status_string == 'available'
338
+ # status_string = 'unallocated'
339
+ # end
340
+ end
341
+
342
+ if status_string
343
+ if ['available', 'reserved'].include?(status_string)
344
+ out << "#{green}#{status_string.upcase}"
345
+ # elsif ['preparing'].include?(status_string)
346
+ # out << "#{yellow}#{status_string.upcase}"
347
+ # elsif ['reserved', 'shutdown'].include?(status_string)
348
+ # out << "#{yellow}#{status_string.upcase}"
349
+ elsif ['failed'].include?(status_string)
350
+ out << "#{red}#{status_string.upcase}"
351
+ else
352
+ out << "#{return_color}#{status_string.upcase}"
353
+ end
354
+ end
355
+ out + return_color
356
+ end
357
+
358
+
359
+ end
@@ -0,0 +1,290 @@
1
+ require 'morpheus/cli/cli_command'
2
+
3
+ # CLI command VDI Gateway management
4
+ # UI is Tools: VDI Gateways
5
+ # API is /vdi-gateways and returns vdiGateways
6
+ class Morpheus::Cli::VdiGatewaysCommand
7
+ include Morpheus::Cli::CliCommand
8
+ include Morpheus::Cli::VdiHelper
9
+ include Morpheus::Cli::OptionSourceHelper
10
+
11
+ set_command_name :'vdi-gateways'
12
+ set_command_description "View and manage VDI gateways"
13
+
14
+ register_subcommands :list, :get, :add, :update, :remove
15
+
16
+ def connect(opts)
17
+ @api_client = establish_remote_appliance_connection(opts)
18
+ @vdi_gateways_interface = @api_client.vdi_gateways
19
+ @vdi_apps_interface = @api_client.vdi_apps
20
+ @vdi_gateways_interface = @api_client.vdi_gateways
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 gateways."
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_gateways_interface.setopts(options)
44
+ if options[:dry_run]
45
+ print_dry_run @vdi_gateways_interface.dry.list(params)
46
+ return
47
+ end
48
+ json_response = @vdi_gateways_interface.list(params)
49
+ render_response(json_response, options, vdi_gateway_list_key) do
50
+ vdi_gateways = json_response[vdi_gateway_list_key]
51
+ print_h1 "Morpheus VDI Gateways", parse_list_subtitles(options), options
52
+ if vdi_gateways.empty?
53
+ print cyan,"No VDI gateways found.",reset,"\n"
54
+ else
55
+ print as_pretty_table(vdi_gateways, vdi_gateway_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("[gateway]")
68
+ build_standard_get_options(opts, options)
69
+ opts.footer = <<-EOT
70
+ Get details about a specific VDI gateway.
71
+ [gateway] is required. This is the name or id of a VDI gateway.
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_gateway = nil
86
+ if id.to_s !~ /\A\d{1,}\Z/
87
+ vdi_gateway = find_vdi_gateway_by_name(id)
88
+ return 1, "VDI gateway not found for #{id}" if vdi_gateway.nil?
89
+ id = vdi_gateway['id']
90
+ end
91
+ @vdi_gateways_interface.setopts(options)
92
+ if options[:dry_run]
93
+ print_dry_run @vdi_gateways_interface.dry.get(id, params)
94
+ return
95
+ end
96
+ json_response = @vdi_gateways_interface.get(id, params)
97
+ vdi_gateway = json_response[vdi_gateway_object_key]
98
+ config = vdi_gateway['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_gateway_object_key) do
107
+ print_h1 "VDI Gateway Details", [], options
108
+ print cyan
109
+ show_columns = vdi_gateway_column_definitions
110
+ show_columns.delete("VDI Apps") unless vdi_gateway['apps']
111
+ show_columns.delete("VDI Gateway") unless vdi_gateway['gateway']
112
+ show_columns.delete("Guest Console Jump Host") unless vdi_gateway['guestConsoleJumpHost']
113
+ show_columns.delete("Guest Console Jump Port") unless vdi_gateway['guestConsoleJumpPort']
114
+ show_columns.delete("Guest Console Jump Username") unless vdi_gateway['guestConsoleJumpUsername']
115
+ show_columns.delete("Guest Console Jump Password") unless vdi_gateway['guestConsoleJumpPassword']
116
+ show_columns.delete("Guest Console Jump Keypair") unless vdi_gateway['guestConsoleJumpKeypair']
117
+ print_description_list(show_columns, vdi_gateway)
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_gateway_option_types)
131
+ build_standard_add_options(opts, options)
132
+ opts.footer = <<-EOT
133
+ Create a new VDI gateway.
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
+ connect(options)
140
+ payload = {}
141
+ if options[:payload]
142
+ payload = options[:payload]
143
+ payload.deep_merge!({vdi_gateway_object_key => parse_passed_options(options)})
144
+ else
145
+ payload.deep_merge!({vdi_gateway_object_key => parse_passed_options(options)})
146
+ v_prompt = Morpheus::Cli::OptionTypes.prompt(add_vdi_gateway_option_types, options[:options], @api_client, options[:params])
147
+ params.deep_merge!(v_prompt)
148
+ params.booleanize!
149
+ payload[vdi_gateway_object_key].deep_merge!(params)
150
+ end
151
+ @vdi_gateways_interface.setopts(options)
152
+ if options[:dry_run]
153
+ print_dry_run @vdi_gateways_interface.dry.create(payload)
154
+ return 0, nil
155
+ end
156
+ json_response = @vdi_gateways_interface.create(payload)
157
+ vdi_gateway = json_response[vdi_gateway_object_key]
158
+ render_response(json_response, options, vdi_gateway_object_key) do
159
+ print_green_success "Added VDI gateway #{vdi_gateway['name']}"
160
+ return _get(vdi_gateway["id"], {}, options)
161
+ end
162
+ return 0, nil
163
+ end
164
+
165
+ def update(args)
166
+ options = {}
167
+ params = {}
168
+ payload = {}
169
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
170
+ opts.banner = subcommand_usage("[gateway] [options]")
171
+ build_option_type_options(opts, options, update_vdi_gateway_option_types)
172
+ build_standard_update_options(opts, options)
173
+ opts.footer = <<-EOT
174
+ Update a VDI gateway.
175
+ [gateway] is required. This is the name or id of a VDI gateway.
176
+ EOT
177
+ end
178
+ optparse.parse!(args)
179
+ verify_args!(args:args, optparse:optparse, count:1)
180
+ connect(options)
181
+ vdi_gateway = find_vdi_gateway_by_name_or_id(args[0])
182
+ return 1 if vdi_gateway.nil?
183
+ payload = {}
184
+ if options[:payload]
185
+ payload = options[:payload]
186
+ payload.deep_merge!({vdi_gateway_object_key => parse_passed_options(options)})
187
+ else
188
+ payload.deep_merge!({vdi_gateway_object_key => parse_passed_options(options)})
189
+ v_prompt = Morpheus::Cli::OptionTypes.no_prompt(update_vdi_gateway_option_types, options[:options], @api_client, options[:params])
190
+ v_prompt.deep_compact!
191
+ params.deep_merge!(v_prompt)
192
+ params.booleanize!
193
+ payload.deep_merge!({vdi_gateway_object_key => params})
194
+ if payload[vdi_gateway_object_key].empty? # || options[:no_prompt]
195
+ raise_command_error "Specify at least one option to update.\n#{optparse}"
196
+ end
197
+ end
198
+ @vdi_gateways_interface.setopts(options)
199
+ if options[:dry_run]
200
+ print_dry_run @vdi_gateways_interface.dry.update(vdi_gateway['id'], payload)
201
+ return
202
+ end
203
+ json_response = @vdi_gateways_interface.update(vdi_gateway['id'], payload)
204
+ vdi_gateway = json_response[vdi_gateway_object_key]
205
+ render_response(json_response, options, vdi_gateway_object_key) do
206
+ print_green_success "Updated VDI gateway #{vdi_gateway['name']}"
207
+ return _get(vdi_gateway["id"], {}, options)
208
+ end
209
+ return 0, nil
210
+ end
211
+
212
+ def remove(args)
213
+ options = {}
214
+ params = {}
215
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
216
+ opts.banner = subcommand_usage("[gateway] [options]")
217
+ build_standard_remove_options(opts, options)
218
+ opts.footer = <<-EOT
219
+ Delete a VDI gateway.
220
+ [gateway] is required. This is the name or id of a VDI gateway.
221
+ EOT
222
+ end
223
+ optparse.parse!(args)
224
+ verify_args!(args:args, optparse:optparse, count:1)
225
+ connect(options)
226
+ vdi_gateway = find_vdi_gateway_by_name_or_id(args[0])
227
+ return 1 if vdi_gateway.nil?
228
+ @vdi_gateways_interface.setopts(options)
229
+ if options[:dry_run]
230
+ print_dry_run @vdi_gateways_interface.dry.destroy(vdi_gateway['id'], params)
231
+ return
232
+ end
233
+ unless options[:yes] || Morpheus::Cli::OptionTypes.confirm("Are you sure you want to delete the VDI gateway #{vdi_gateway['name']}?")
234
+ return 9, "aborted command"
235
+ end
236
+ json_response = @vdi_gateways_interface.destroy(vdi_gateway['id'], params)
237
+ render_response(json_response, options) do
238
+ print_green_success "Removed VDI gateway #{vdi_gateway['name']}"
239
+ end
240
+ return 0, nil
241
+ end
242
+
243
+ private
244
+
245
+ def vdi_gateway_list_column_definitions()
246
+
247
+ {
248
+ "ID" => 'id',
249
+ "Name" => 'name',
250
+ # "Description" => 'description',
251
+ "Gateway URL" => 'gatewayUrl',
252
+ "API Key" => 'apiKey',
253
+ # "Created" => lambda {|it| format_local_dt(it['dateCreated']) },
254
+ # "Updated" => lambda {|it| format_local_dt(it['lastUpdated']) },
255
+ }
256
+ end
257
+
258
+ def vdi_gateway_column_definitions()
259
+ {
260
+ "ID" => 'id',
261
+ "Name" => 'name',
262
+ "Description" => 'description',
263
+ "Gateway URL" => 'gatewayUrl',
264
+ "API Key" => 'apiKey',
265
+ "Created" => lambda {|it| format_local_dt(it['dateCreated']) },
266
+ "Updated" => lambda {|it| format_local_dt(it['lastUpdated']) },
267
+ }
268
+ end
269
+
270
+ def add_vdi_gateway_option_types
271
+ [
272
+ {'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true, 'description' => 'Choose a unique name for the VDI Gateway'},
273
+ {'fieldName' => 'description', 'fieldLabel' => 'Description', 'type' => 'text', 'description' => 'Description'},
274
+ {'fieldName' => 'gatewayUrl', 'fieldLabel' => 'Gateway URL', 'type' => 'text', 'required' => true, 'description' => 'URL of the VDI Gateway'},
275
+ ]
276
+ end
277
+
278
+ def update_vdi_gateway_option_types
279
+ list = add_vdi_gateway_option_types.collect {|it|
280
+ it.delete('required')
281
+ it.delete('defaultValue')
282
+ it
283
+ }
284
+ list = list.reject {|it| ["type"].include? it['fieldName'] }
285
+ list
286
+ end
287
+
288
+ # finders are in VdiHelper mixin
289
+
290
+ end