morpheus-cli 3.6.28 → 3.6.29

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 (40) hide show
  1. checksums.yaml +4 -4
  2. data/lib/morpheus/api/api_client.rb +16 -0
  3. data/lib/morpheus/api/cloud_folders_interface.rb +47 -0
  4. data/lib/morpheus/api/cloud_resource_pools_interface.rb +47 -0
  5. data/lib/morpheus/api/network_types_interface.rb +26 -0
  6. data/lib/morpheus/api/reports_interface.rb +77 -0
  7. data/lib/morpheus/api/security_group_rules_interface.rb +6 -0
  8. data/lib/morpheus/api/security_groups_interface.rb +21 -15
  9. data/lib/morpheus/cli.rb +3 -0
  10. data/lib/morpheus/cli/accounts.rb +1 -1
  11. data/lib/morpheus/cli/apps.rb +2 -2
  12. data/lib/morpheus/cli/archives_command.rb +18 -18
  13. data/lib/morpheus/cli/blueprints_command.rb +1 -1
  14. data/lib/morpheus/cli/boot_scripts_command.rb +6 -6
  15. data/lib/morpheus/cli/cli_command.rb +4 -0
  16. data/lib/morpheus/cli/cloud_datastores_command.rb +58 -20
  17. data/lib/morpheus/cli/cloud_folders_command.rb +463 -0
  18. data/lib/morpheus/cli/cloud_resource_pools_command.rb +707 -0
  19. data/lib/morpheus/cli/clouds.rb +2 -0
  20. data/lib/morpheus/cli/hosts.rb +33 -8
  21. data/lib/morpheus/cli/instances.rb +79 -54
  22. data/lib/morpheus/cli/library_option_lists_command.rb +1 -1
  23. data/lib/morpheus/cli/library_option_types_command.rb +1 -1
  24. data/lib/morpheus/cli/mixins/provisioning_helper.rb +11 -2
  25. data/lib/morpheus/cli/monitoring_contacts_command.rb +1 -1
  26. data/lib/morpheus/cli/monitoring_incidents_command.rb +1 -1
  27. data/lib/morpheus/cli/network_services_command.rb +7 -3
  28. data/lib/morpheus/cli/networks_command.rb +164 -63
  29. data/lib/morpheus/cli/option_types.rb +16 -15
  30. data/lib/morpheus/cli/policies_command.rb +76 -9
  31. data/lib/morpheus/cli/preseed_scripts_command.rb +2 -2
  32. data/lib/morpheus/cli/remote.rb +26 -28
  33. data/lib/morpheus/cli/reports_command.rb +594 -0
  34. data/lib/morpheus/cli/security_group_rules.rb +5 -1
  35. data/lib/morpheus/cli/security_groups.rb +882 -45
  36. data/lib/morpheus/cli/tasks.rb +158 -23
  37. data/lib/morpheus/cli/tenants_command.rb +1 -1
  38. data/lib/morpheus/cli/users.rb +1 -1
  39. data/lib/morpheus/cli/version.rb +1 -1
  40. metadata +9 -2
@@ -128,7 +128,16 @@ class Morpheus::Cli::Tasks
128
128
  description_cols = {
129
129
  "ID" => 'id',
130
130
  "Name" => 'name',
131
+ "Code" => 'code',
131
132
  "Type" => lambda {|it| it['taskType']['name'] },
133
+ "Result Type" => 'resultType',
134
+ "Retryable" => lambda {|it|
135
+ if it['retryable']
136
+ format_boolean(it['retryable']).to_s + " Count: #{it['retryCount']}, Delay: #{it['retryDelaySeconds']}"
137
+ else
138
+ format_boolean(it['retryable'])
139
+ end
140
+ },
132
141
  }
133
142
  print_description_list(description_cols, task)
134
143
 
@@ -246,7 +255,7 @@ class Morpheus::Cli::Tasks
246
255
  rows = task_types.collect do |task_type|
247
256
  {name: task_type['name'], id: task_type['id'], code: task_type['code'], description: task_type['description']}
248
257
  end
249
- puts as_pretty_table(rows, [:id, :name, :code], {color:red})
258
+ puts as_pretty_table(rows, [:id, :name, :code], options)
250
259
  end
251
260
 
252
261
  print reset,"\n"
@@ -259,8 +268,9 @@ class Morpheus::Cli::Tasks
259
268
 
260
269
  def add(args)
261
270
  params = {}
262
- options = {}
271
+ options = {:options => {}}
263
272
  task_name = nil
273
+ task_code = nil
264
274
  task_type_name = nil
265
275
  optparse = Morpheus::Cli::OptionParser.new do |opts|
266
276
  opts.banner = subcommand_usage("[name] -t TASK_TYPE")
@@ -270,6 +280,25 @@ class Morpheus::Cli::Tasks
270
280
  opts.on('--name NAME', String, "Task Name" ) do |val|
271
281
  task_name = val
272
282
  end
283
+ opts.on('--code CODE', String, "Task Code" ) do |val|
284
+ task_code = val
285
+ end
286
+ opts.on('--result-type VALUE', String, "Result Type" ) do |val|
287
+ options[:options] ||= {}
288
+ options[:options]['resultType'] = val
289
+ end
290
+ opts.on('--retryable [on|off]', String, "Retryable" ) do |val|
291
+ options[:options] ||= {}
292
+ options[:options]['retryable'] = val.to_s == 'on' || val.to_s == 'true' || val == '' || val.nil?
293
+ end
294
+ opts.on('--retry-count COUNT', String, "Retry Count" ) do |val|
295
+ options[:options] ||= {}
296
+ options[:options]['retryCount'] = val.to_i
297
+ end
298
+ opts.on('--retry-delay SECONDS', String, "Retry Delay Seconds" ) do |val|
299
+ options[:options] ||= {}
300
+ options[:options]['retryDelaySeconds'] = val.to_i
301
+ end
273
302
  opts.on('--file FILE', "File containing the script. This can be used instead of --O taskOptions.script" ) do |filename|
274
303
  full_filename = File.expand_path(filename)
275
304
  if File.exists?(full_filename)
@@ -282,38 +311,137 @@ class Morpheus::Cli::Tasks
282
311
  exit 1
283
312
  end
284
313
  # use the filename as the name by default.
285
- if !params['name']
314
+ if !options[:options]['name']
286
315
  options[:options] ||= {}
287
- options[:options]['taskOptions'] ||= {}
288
- options[:options]['taskOptions']['script'] = File.read(full_filename)
289
- params['name'] = File.basename(full_filename)
316
+ options[:options]['name'] = File.basename(full_filename)
290
317
  end
291
318
  end
292
319
  build_common_options(opts, options, [:options, :payload, :json, :dry_run, :quiet, :remote])
293
320
  end
294
321
  optparse.parse!(args)
322
+ if args.count > 1
323
+ raise_command_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args.join(' ')}\n#{optparse}"
324
+ end
295
325
  if args[0]
296
326
  task_name = args[0]
297
327
  end
298
-
299
- if task_name.nil? || task_type_name.nil?
300
- puts optparse
301
- exit 1
302
- end
328
+ # if task_name.nil? || task_type_name.nil?
329
+ # puts optparse
330
+ # exit 1
331
+ # end
303
332
  connect(options)
304
333
  begin
334
+ passed_options = options[:options] ? options[:options].reject {|k,v| k.is_a?(Symbol) } : {}
335
+ if passed_options['type']
336
+ task_type_name = passed_options.delete('type')
337
+ end
305
338
  payload = nil
339
+
306
340
  if options[:payload]
307
341
  payload = options[:payload]
342
+ payload.deep_merge!({'task' => passed_options}) unless passed_options.empty?
308
343
  else
309
344
  # construct payload
345
+ payload = {
346
+ "task" => {
347
+ #"name" => task_name,
348
+ #"code" => task_code,
349
+ #"taskType" {"id" => task_type['id'], "code" => task_type['code']},
350
+ #"taskOptions" => {}
351
+ }
352
+ }
353
+ payload.deep_merge!({'task' => passed_options}) unless passed_options.empty?
354
+
355
+
356
+
357
+ # Name
358
+ if task_name
359
+ payload['task']['name'] = task_name
360
+ else
361
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true, 'description' => 'Name'}], options[:options], @api_client)
362
+ payload['task']['name'] = v_prompt['name'] unless v_prompt['name'].to_s.empty?
363
+ end
364
+
365
+ # Code
366
+ if task_code
367
+ payload['task']['code'] = task_code
368
+ else
369
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'code', 'fieldLabel' => 'Code', 'type' => 'text', 'description' => 'Code'}], options[:options], @api_client)
370
+ payload['task']['code'] = v_prompt['code'] unless v_prompt['code'].to_s.empty?
371
+ end
372
+
373
+ # Task Type
374
+ @all_task_types ||= @tasks_interface.task_types({max:1000})['taskTypes']
375
+ task_types_dropdown = @all_task_types.collect {|it| {"name" => it["name"], "value" => it["code"]}}
376
+
377
+ if task_type_name
378
+ #payload['task']['taskType'] = task_code
379
+ else
380
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'type', 'fieldLabel' => 'Type', 'type' => 'select', 'selectOptions' => task_types_dropdown}], options[:options], @api_client)
381
+ task_type_name = v_prompt['type']
382
+ end
383
+
310
384
  task_type = find_task_type_by_name(task_type_name)
311
385
  if task_type.nil?
312
- puts "Task Type not found by id '#{task_type_name}'!"
386
+ print_red_alert "Task Type not found by code '#{task_type_name}'"
313
387
  return 1
314
388
  end
315
- input_options = Morpheus::Cli::OptionTypes.prompt(task_type['optionTypes'],options[:options],@api_client, options[:params])
316
- payload = {task: {name: task_name, taskOptions: input_options['taskOptions'], taskType: {code: task_type['code'], id: task_type['id']}}}
389
+
390
+ payload['task']['taskType'] = {"id" => task_type['id'], "code" => task_type['code']}
391
+
392
+
393
+ # Result Type
394
+ if task_code
395
+ payload['task']['resultType'] = task_code
396
+ else
397
+ result_types_dropdown = [{"name" => "Value", "value" => "value"}, {"name" => "Exit Code", "value" => "exitCode"}, {"name" => "Key Value", "value" => "keyValue"}, {"name" => "JSON", "value" => "json"}]
398
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'resultType', 'fieldLabel' => 'Result Type', 'type' => 'select', 'selectOptions' => result_types_dropdown}], options[:options], @api_client)
399
+ payload['task']['resultType'] = v_prompt['resultType'] unless v_prompt['resultType'].to_s.empty?
400
+ end
401
+
402
+ # Task Type Option Types
403
+
404
+ # JD: uhh some of these are missing a fieldContext?
405
+ # containerScript just points to a library script via Id now??
406
+ task_option_types = task_type['optionTypes'] || []
407
+ task_option_types.each do |it|
408
+ if it['fieldContext'].nil? || it['fieldContext'] == ''
409
+ it['fieldContext'] = 'taskOptions'
410
+ end
411
+ end
412
+ input_options = Morpheus::Cli::OptionTypes.prompt(task_option_types, options[:options],@api_client, options[:params])
413
+ payload.deep_merge!({'task' => input_options}) unless input_options.empty?
414
+
415
+
416
+
417
+ # Retryable
418
+ if options[:options]['retryable'] != nil
419
+ payload['task']['retryable'] = options[:options]['retryable']
420
+ else
421
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'retryable', 'fieldLabel' => 'Retryable', 'type' => 'checkbox', 'defaultValue' => false}], options[:options], @api_client)
422
+ payload['task']['retryable'] = ['true','on'].include?(v_prompt['retryable'].to_s) unless v_prompt['retryable'].nil?
423
+ end
424
+
425
+ if payload['task']['retryable']
426
+ # Retry Count
427
+ if options[:options]['retryCount']
428
+ payload['task']['retryCount'] = options[:options]['retryCount'].to_i
429
+ else
430
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'retryCount', 'fieldLabel' => 'Retry Count', 'type' => 'number', 'defaultValue' => 5}], options[:options], @api_client)
431
+ payload['task']['retryCount'] = v_prompt['retryCount'].to_i unless v_prompt['retryCount'].nil?
432
+ end
433
+ # Retry Delay
434
+ if options[:options]['retryDelay']
435
+ payload['task']['retryDelay'] = options[:options]['retryDelay'].to_i
436
+ else
437
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'retryDelay', 'fieldLabel' => 'Retry Delay', 'type' => 'number', 'defaultValue' => 10}], options[:options], @api_client)
438
+ payload['task']['retryDelay'] = v_prompt['retryDelay'].to_i unless v_prompt['retryDelay'].nil?
439
+ end
440
+ end
441
+
442
+
443
+
444
+
317
445
  end
318
446
  @tasks_interface.setopts(options)
319
447
  if options[:dry_run]
@@ -415,19 +543,26 @@ class Morpheus::Cli::Tasks
415
543
 
416
544
  def find_task_type_by_name(val)
417
545
  raise "find_task_type_by_name passed a bad name: #{val.inspect}" if val.to_s == ''
418
- results = @tasks_interface.task_types(val)
419
- result = nil
420
- if !results['taskTypes'].nil? && !results['taskTypes'].empty?
421
- result = results['taskTypes'][0]
422
- elsif val.to_i.to_s == val
423
- results = @tasks_interface.task_types(val.to_i)
424
- result = results['taskType']
546
+ @all_task_types ||= @tasks_interface.task_types({max:1000})['taskTypes']
547
+
548
+ if @all_task_types.nil? && !@all_task_types.empty?
549
+ print_red_alert "No task types found"
550
+ return nil
425
551
  end
426
- if result.nil?
552
+ matching_task_types = @all_task_types.select { |it| val && (it['name'] == val || it['code'] == val || it['id'].to_s == val.to_s) }
553
+ if matching_task_types.size == 1
554
+ return matching_task_types[0]
555
+ elsif matching_task_types.size == 0
427
556
  print_red_alert "Task Type not found by '#{val}'"
557
+ else
558
+ print_red_alert "#{matching_task_types.size} task types found by name #{name}"
559
+ rows = matching_task_types.collect do |it|
560
+ {id: it['id'], name: it['name'], code: it['code']}
561
+ end
562
+ print "\n"
563
+ puts as_pretty_table(rows, [:name, :code], {color:red})
428
564
  return nil
429
565
  end
430
- return result
431
566
  end
432
567
 
433
568
  def update_task_option_types(task_type)
@@ -240,7 +240,7 @@ class Morpheus::Cli::TenantsCommand
240
240
  end
241
241
  optparse.parse!(args)
242
242
  if args.count < 1
243
- print_red_alert "Specify atleast one option to update"
243
+ print_red_alert "Specify at least one option to update"
244
244
  puts optparse
245
245
  exit 1
246
246
  end
@@ -346,7 +346,7 @@ class Morpheus::Cli::Users
346
346
  # merge -O options into normally parsed options
347
347
  params.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
348
348
  # if params.empty?
349
- # print_red_alert "Specify atleast one option to update"
349
+ # print_red_alert "Specify at least one option to update"
350
350
  # puts optparse
351
351
  # return 1
352
352
  # end
@@ -1,6 +1,6 @@
1
1
 
2
2
  module Morpheus
3
3
  module Cli
4
- VERSION = "3.6.28"
4
+ VERSION = "3.6.29"
5
5
  end
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: morpheus-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.6.28
4
+ version: 3.6.29
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Estes
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2019-04-23 00:00:00.000000000 Z
14
+ date: 2019-06-10 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: bundler
@@ -165,7 +165,9 @@ files:
165
165
  - lib/morpheus/api/auth_interface.rb
166
166
  - lib/morpheus/api/blueprints_interface.rb
167
167
  - lib/morpheus/api/cloud_datastores_interface.rb
168
+ - lib/morpheus/api/cloud_folders_interface.rb
168
169
  - lib/morpheus/api/cloud_policies_interface.rb
170
+ - lib/morpheus/api/cloud_resource_pools_interface.rb
169
171
  - lib/morpheus/api/clouds_interface.rb
170
172
  - lib/morpheus/api/containers_interface.rb
171
173
  - lib/morpheus/api/custom_instance_types_interface.rb
@@ -206,6 +208,7 @@ files:
206
208
  - lib/morpheus/api/network_pools_interface.rb
207
209
  - lib/morpheus/api/network_proxies_interface.rb
208
210
  - lib/morpheus/api/network_services_interface.rb
211
+ - lib/morpheus/api/network_types_interface.rb
209
212
  - lib/morpheus/api/networks_interface.rb
210
213
  - lib/morpheus/api/old_cypher_interface.rb
211
214
  - lib/morpheus/api/option_type_lists_interface.rb
@@ -216,6 +219,7 @@ files:
216
219
  - lib/morpheus/api/power_schedules_interface.rb
217
220
  - lib/morpheus/api/processes_interface.rb
218
221
  - lib/morpheus/api/provision_types_interface.rb
222
+ - lib/morpheus/api/reports_interface.rb
219
223
  - lib/morpheus/api/roles_interface.rb
220
224
  - lib/morpheus/api/security_group_rules_interface.rb
221
225
  - lib/morpheus/api/security_groups_interface.rb
@@ -245,6 +249,8 @@ files:
245
249
  - lib/morpheus/cli/cli_command.rb
246
250
  - lib/morpheus/cli/cli_registry.rb
247
251
  - lib/morpheus/cli/cloud_datastores_command.rb
252
+ - lib/morpheus/cli/cloud_folders_command.rb
253
+ - lib/morpheus/cli/cloud_resource_pools_command.rb
248
254
  - lib/morpheus/cli/clouds.rb
249
255
  - lib/morpheus/cli/command_error.rb
250
256
  - lib/morpheus/cli/commands/standard/alias_command.rb
@@ -329,6 +335,7 @@ files:
329
335
  - lib/morpheus/cli/processes_command.rb
330
336
  - lib/morpheus/cli/recent_activity_command.rb
331
337
  - lib/morpheus/cli/remote.rb
338
+ - lib/morpheus/cli/reports_command.rb
332
339
  - lib/morpheus/cli/roles.rb
333
340
  - lib/morpheus/cli/security_group_rules.rb
334
341
  - lib/morpheus/cli/security_groups.rb