morpheus-cli 3.6.28 → 3.6.29

Sign up to get free protection for your applications and to get access to all the features.
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