morpheus-cli 5.5.1.5 → 5.5.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +1 -1
  3. data/lib/morpheus/api/api_client.rb +25 -0
  4. data/lib/morpheus/api/archive_buckets_interface.rb +1 -1
  5. data/lib/morpheus/api/body_io.rb +22 -0
  6. data/lib/morpheus/api/catalog_item_types_interface.rb +5 -1
  7. data/lib/morpheus/api/clients_interface.rb +41 -0
  8. data/lib/morpheus/api/clouds_interface.rb +21 -0
  9. data/lib/morpheus/api/instances_interface.rb +8 -1
  10. data/lib/morpheus/api/integrations_interface.rb +30 -0
  11. data/lib/morpheus/api/library_instance_types_interface.rb +15 -3
  12. data/lib/morpheus/api/network_pool_server_types_interface.rb +9 -0
  13. data/lib/morpheus/api/plugins_interface.rb +22 -0
  14. data/lib/morpheus/api/roles_interface.rb +20 -1
  15. data/lib/morpheus/api/security_package_types_interface.rb +9 -0
  16. data/lib/morpheus/api/security_packages_interface.rb +9 -0
  17. data/lib/morpheus/api/security_scans_interface.rb +9 -0
  18. data/lib/morpheus/api/servers_interface.rb +17 -17
  19. data/lib/morpheus/api/storage_providers_interface.rb +1 -1
  20. data/lib/morpheus/api/virtual_images_interface.rb +1 -23
  21. data/lib/morpheus/cli/cli_command.rb +81 -7
  22. data/lib/morpheus/cli/commands/apps.rb +28 -2
  23. data/lib/morpheus/cli/commands/archives_command.rb +2 -2
  24. data/lib/morpheus/cli/commands/blueprints_command.rb +16 -0
  25. data/lib/morpheus/cli/commands/catalog_item_types_command.rb +34 -2
  26. data/lib/morpheus/cli/commands/clients_command.rb +338 -0
  27. data/lib/morpheus/cli/commands/clouds.rb +127 -1
  28. data/lib/morpheus/cli/commands/clusters.rb +42 -12
  29. data/lib/morpheus/cli/commands/curl_command.rb +114 -135
  30. data/lib/morpheus/cli/commands/hosts.rb +108 -11
  31. data/lib/morpheus/cli/commands/instances.rb +115 -14
  32. data/lib/morpheus/cli/commands/integrations_command.rb +215 -4
  33. data/lib/morpheus/cli/commands/invoices_command.rb +20 -11
  34. data/lib/morpheus/cli/commands/jobs_command.rb +299 -190
  35. data/lib/morpheus/cli/commands/library_cluster_layouts_command.rb +16 -2
  36. data/lib/morpheus/cli/commands/library_container_scripts_command.rb +14 -0
  37. data/lib/morpheus/cli/commands/library_container_templates_command.rb +131 -48
  38. data/lib/morpheus/cli/commands/library_container_types_command.rb +17 -4
  39. data/lib/morpheus/cli/commands/library_instance_types_command.rb +85 -7
  40. data/lib/morpheus/cli/commands/library_layouts_command.rb +32 -1
  41. data/lib/morpheus/cli/commands/library_option_lists_command.rb +30 -18
  42. data/lib/morpheus/cli/commands/library_option_types_command.rb +31 -14
  43. data/lib/morpheus/cli/commands/library_spec_templates_command.rb +14 -0
  44. data/lib/morpheus/cli/commands/library_upgrades_command.rb +2 -2
  45. data/lib/morpheus/cli/commands/network_pool_server_types.rb +20 -0
  46. data/lib/morpheus/cli/commands/network_pool_servers_command.rb +55 -158
  47. data/lib/morpheus/cli/commands/network_pools_command.rb +49 -23
  48. data/lib/morpheus/cli/commands/networks_command.rb +262 -45
  49. data/lib/morpheus/cli/commands/plugins.rb +213 -0
  50. data/lib/morpheus/cli/commands/price_sets_command.rb +27 -8
  51. data/lib/morpheus/cli/commands/prices_command.rb +17 -5
  52. data/lib/morpheus/cli/commands/processes_command.rb +2 -1
  53. data/lib/morpheus/cli/commands/remote.rb +7 -10
  54. data/lib/morpheus/cli/commands/roles.rb +924 -335
  55. data/lib/morpheus/cli/commands/search_command.rb +2 -0
  56. data/lib/morpheus/cli/commands/security_groups.rb +72 -84
  57. data/lib/morpheus/cli/commands/security_package_types.rb +32 -0
  58. data/lib/morpheus/cli/commands/security_packages.rb +84 -0
  59. data/lib/morpheus/cli/commands/security_scans.rb +107 -0
  60. data/lib/morpheus/cli/commands/service_plans_command.rb +16 -14
  61. data/lib/morpheus/cli/commands/subnets_command.rb +15 -1
  62. data/lib/morpheus/cli/commands/tasks.rb +34 -1
  63. data/lib/morpheus/cli/commands/tenants_command.rb +1 -1
  64. data/lib/morpheus/cli/commands/user_settings_command.rb +11 -2
  65. data/lib/morpheus/cli/commands/users.rb +50 -9
  66. data/lib/morpheus/cli/commands/virtual_images.rb +14 -0
  67. data/lib/morpheus/cli/commands/workflows.rb +14 -0
  68. data/lib/morpheus/cli/mixins/accounts_helper.rb +6 -5
  69. data/lib/morpheus/cli/mixins/infrastructure_helper.rb +79 -0
  70. data/lib/morpheus/cli/mixins/jobs_helper.rb +4 -5
  71. data/lib/morpheus/cli/mixins/library_helper.rb +2 -0
  72. data/lib/morpheus/cli/mixins/logs_helper.rb +3 -0
  73. data/lib/morpheus/cli/mixins/monitoring_helper.rb +1 -1
  74. data/lib/morpheus/cli/mixins/print_helper.rb +29 -4
  75. data/lib/morpheus/cli/mixins/provisioning_helper.rb +38 -9
  76. data/lib/morpheus/cli/mixins/rest_command.rb +106 -8
  77. data/lib/morpheus/cli/mixins/secondary_rest_command.rb +6 -2
  78. data/lib/morpheus/cli/option_types.rb +94 -25
  79. data/lib/morpheus/cli/version.rb +1 -1
  80. data/lib/morpheus/formatters.rb +10 -1
  81. metadata +15 -2
@@ -33,6 +33,12 @@ class Morpheus::Cli::LibraryClusterLayoutsCommand
33
33
  opts.on('--technology VALUE', String, "Filter by technology") do |val|
34
34
  params['provisionType'] = val
35
35
  end
36
+ opts.on('-l', '--labels LABEL', String, "Filter by labels, can match any of the values") do |val|
37
+ add_query_parameter(params, 'labels', parse_labels(val))
38
+ end
39
+ opts.on('--all-labels LABEL', String, "Filter by labels, must match all of the values") do |val|
40
+ add_query_parameter(params, 'allLabels', parse_labels(val))
41
+ end
36
42
  build_common_options(opts, options, [:list, :query, :json, :yaml, :csv, :fields, :dry_run, :remote])
37
43
  opts.footer = "List cluster layouts."
38
44
  end
@@ -77,10 +83,11 @@ class Morpheus::Cli::LibraryClusterLayoutsCommand
77
83
  name: layout['name'],
78
84
  cloud_type: layout_cloud_type(layout),
79
85
  version: layout['computeVersion'],
80
- description: layout['description']
86
+ description: layout['description'],
87
+ labels: format_list(layout['labels'], '', 3)
81
88
  }
82
89
  end
83
- print as_pretty_table(rows, [:id, :name, :cloud_type, :version, :description], options)
90
+ print as_pretty_table(rows, [:id, :name, :cloud_type, :version, :description, :labels], options)
84
91
  print_results_pagination(json_response, {:label => "node type", :n_label => "node types"})
85
92
  end
86
93
  print reset,"\n"
@@ -153,6 +160,7 @@ class Morpheus::Cli::LibraryClusterLayoutsCommand
153
160
  "Cloud Type" => lambda {|it| layout_cloud_type(it)},
154
161
  "Cluster Type" => lambda {|it| it['groupType'] ? it['groupType']['name'] : nil},
155
162
  "Technology" => lambda {|it| it['provisionType'] ? it['provisionType']['code'] : nil},
163
+ "Labels" => lambda {|it| format_list(it['labels'], '') },
156
164
  "Minimum Memory" => lambda {|it| printable_byte_size(it['memoryRequirement'])},
157
165
  "Workflow" => lambda {|it| it['taskSets'] && it['taskSets'].count > 0 ? it['taskSets'][0]['name'] : nil},
158
166
  "Description" => lambda {|it| it['description']},
@@ -220,6 +228,9 @@ class Morpheus::Cli::LibraryClusterLayoutsCommand
220
228
  opts.on('-n', '--name VALUE', String, "Name for this cluster layout") do |val|
221
229
  params['name'] = val
222
230
  end
231
+ opts.on('-l', '--labels [LIST]', String, "Labels") do |val|
232
+ params['labels'] = parse_labels(val)
233
+ end
223
234
  opts.on('-D', '--description VALUE', String, "Description") do |val|
224
235
  params['description'] = val
225
236
  end
@@ -487,6 +498,9 @@ class Morpheus::Cli::LibraryClusterLayoutsCommand
487
498
  opts.on('-n', '--name VALUE', String, "Name for this cluster layout") do |val|
488
499
  params['name'] = val
489
500
  end
501
+ opts.on('-l', '--labels [LIST]', String, "Labels") do |val|
502
+ params['labels'] = parse_labels(val)
503
+ end
490
504
  opts.on('-D', '--description VALUE', String, "Description") do |val|
491
505
  params['description'] = val
492
506
  end
@@ -21,6 +21,12 @@ class Morpheus::Cli::LibraryContainerScriptsCommand
21
21
  params = {}
22
22
  optparse = Morpheus::Cli::OptionParser.new do |opts|
23
23
  opts.banner = subcommand_usage()
24
+ opts.on('-l', '--labels LABEL', String, "Filter by labels, can match any of the values") do |val|
25
+ add_query_parameter(params, 'labels', parse_labels(val))
26
+ end
27
+ opts.on('--all-labels LABEL', String, "Filter by labels, must match all of the values") do |val|
28
+ add_query_parameter(params, 'allLabels', parse_labels(val))
29
+ end
24
30
  build_common_options(opts, options, [:list, :query, :json, :yaml, :csv, :fields, :dry_run, :remote])
25
31
  opts.footer = "List container scripts."
26
32
  end
@@ -119,6 +125,7 @@ class Morpheus::Cli::LibraryContainerScriptsCommand
119
125
  description_cols = {
120
126
  "ID" => lambda {|it| it['id'] },
121
127
  "Name" => lambda {|it| it['name'] },
128
+ "Labels" => lambda {|it| format_list(it['labels']) rescue '' },
122
129
  "Type" => lambda {|it| format_container_script_type(it['scriptType']) },
123
130
  "Phase" => lambda {|it| format_container_script_phase(it['scriptPhase']) },
124
131
  "Run As User" => lambda {|it| it['runAsUser'] },
@@ -151,6 +158,9 @@ class Morpheus::Cli::LibraryContainerScriptsCommand
151
158
  opts.on('--name VALUE', String, "Name") do |val|
152
159
  params['name'] = val
153
160
  end
161
+ opts.on('-l', '--labels [LIST]', String, "Labels") do |val|
162
+ params['labels'] = parse_labels(val)
163
+ end
154
164
  opts.on('-t', '--type TYPE', "Script Type. i.e. bash, powershell. Default is bash.") do |val|
155
165
  params['scriptType'] = val
156
166
  end
@@ -242,6 +252,9 @@ class Morpheus::Cli::LibraryContainerScriptsCommand
242
252
  opts.on('--name VALUE', String, "Name") do |val|
243
253
  params['name'] = val
244
254
  end
255
+ opts.on('-l', '--labels [LIST]', String, "Labels") do |val|
256
+ params['labels'] = parse_labels(val)
257
+ end
245
258
  opts.on('-t', '--type TYPE', "Script Type. i.e. bash, powershell. Default is bash.") do |val|
246
259
  params['scriptType'] = val
247
260
  end
@@ -411,6 +424,7 @@ class Morpheus::Cli::LibraryContainerScriptsCommand
411
424
  columns = [
412
425
  {"ID" => lambda {|container_script| container_script['id'] } },
413
426
  {"NAME" => lambda {|container_script| container_script['name'] } },
427
+ {"LABELS" => lambda {|it| format_list(it['labels'], '', 3) rescue '' }},
414
428
  {"TYPE" => lambda {|container_script| format_container_script_type(container_script['scriptType']) } },
415
429
  {"PHASE" => lambda {|container_script| format_container_script_phase(container_script['scriptPhase']) } },
416
430
  {"OWNER" => lambda {|container_script| container_script['account'] ? container_script['account']['name'] : '' } },
@@ -22,6 +22,12 @@ class Morpheus::Cli::LibraryContainerTemplatesCommand
22
22
  params = {}
23
23
  optparse = Morpheus::Cli::OptionParser.new do |opts|
24
24
  opts.banner = subcommand_usage()
25
+ opts.on('-l', '--labels LABEL', String, "Filter by labels, can match any of the values") do |val|
26
+ add_query_parameter(params, 'labels', parse_labels(val))
27
+ end
28
+ opts.on('--all-labels LABEL', String, "Filter by labels, must match all of the values") do |val|
29
+ add_query_parameter(params, 'allLabels', parse_labels(val))
30
+ end
25
31
  build_common_options(opts, options, [:list, :json, :yaml, :csv, :fields, :dry_run, :remote])
26
32
  end
27
33
  optparse.parse!(args)
@@ -128,11 +134,13 @@ class Morpheus::Cli::LibraryContainerTemplatesCommand
128
134
  description_cols = {
129
135
  "ID" => lambda {|it| it['id'] },
130
136
  "Name" => lambda {|it| it['name'] },
137
+ "Labels" => lambda {|it| format_list(it['labels']) rescue '' },
131
138
  "File Name" => lambda {|it| it['fileName'] },
132
139
  "File Path" => lambda {|it| it['filePath'] },
133
- "Setting Category" => lambda {|it| it['settingCategory'] },
134
- "Setting Name" => lambda {|it| it['settingName'] },
135
140
  "Phase" => lambda {|it| it['templatePhase'] },
141
+ "File Owner" => lambda {|it| it['fileOwner'] },
142
+ "Setting Name" => lambda {|it| it['settingName'] },
143
+ "Setting Category" => lambda {|it| it['settingCategory'] },
136
144
  "Owner" => lambda {|it| it['account'] ? it['account']['name'] : '' },
137
145
  # "Enabled" => lambda {|it| format_boolean it['enabled'] },
138
146
  "Created" => lambda {|it| format_local_dt(it['dateCreated']) },
@@ -156,33 +164,32 @@ class Morpheus::Cli::LibraryContainerTemplatesCommand
156
164
 
157
165
  def add(args)
158
166
  options = {}
159
- params = {'templatePhase' => 'provision'}
167
+ params = {}
160
168
  optparse = Morpheus::Cli::OptionParser.new do |opts|
161
169
  opts.banner = subcommand_usage("[name]")
162
170
  opts.on('--name VALUE', String, "Name") do |val|
163
171
  params['name'] = val
164
172
  end
173
+ opts.on('-l', '--labels [LIST]', String, "Labels") do |val|
174
+ params['labels'] = parse_labels(val)
175
+ end
176
+ opts.on('--file-name VALUE', String, "File Name") do |val|
177
+ params['fileName'] = val
178
+ end
165
179
  opts.on('--fileName VALUE', String, "File Name") do |val|
166
180
  params['fileName'] = val
167
181
  end
168
- opts.on('--filePath VALUE', String, "File Path") do |val|
182
+ opts.add_hidden_option('--fileName')
183
+ opts.on('--file-path VALUE', String, "File Path") do |val|
169
184
  params['filePath'] = val
170
185
  end
171
- # opts.on('--code VALUE', String, "Code") do |val|
172
- # params['code'] = val
173
- # end
174
- # opts.on('--description VALUE', String, "Description") do |val|
175
- # params['description'] = val
176
- # end
177
- opts.on('--phase [start|stop|postProvision]', String, "Template Phase. Default is 'provision'") do |val|
178
- params['scriptPhase'] = val
186
+ opts.on('--filePath VALUE', String, "File Path") do |val|
187
+ params['filePath'] = val
179
188
  end
180
- opts.on('--category VALUE', String, "Category") do |val|
181
- params['category'] = val
189
+ opts.add_hidden_option('--filePath')
190
+ opts.on('--phase [preProvision|provision|postProvision]', String, "Template Phase. Default is 'provision'") do |val|
191
+ params['templatePhase'] = val
182
192
  end
183
- # opts.on('--enabled [on|off]', String, "Can be used to disable it") do |val|
184
- # options['enabled'] = !(val.to_s == 'off' || val.to_s == 'false')
185
- # end
186
193
  opts.on('--template TEXT', String, "Contents of the template.") do |val|
187
194
  params['template'] = val
188
195
  end
@@ -205,31 +212,51 @@ class Morpheus::Cli::LibraryContainerTemplatesCommand
205
212
  # params['filePath'] = File.dirname(full_filename)
206
213
  # end
207
214
  end
215
+ opts.on('--file-owner VALUE', String, "File Owner") do |val|
216
+ params['fileOwner'] = val
217
+ end
218
+ opts.on('--fileOwner VALUE', String, "File Owner") do |val|
219
+ params['fileOwner'] = val
220
+ end
221
+ opts.add_hidden_option('--fileOwner')
222
+ opts.on('--setting-name VALUE', String, "Setting Name") do |val|
223
+ params['settingName'] = val
224
+ end
225
+ opts.on('--settingName VALUE', String, "Setting Name") do |val|
226
+ params['settingName'] = val
227
+ end
228
+ opts.add_hidden_option('--settingName')
229
+ opts.on('--setting-category VALUE', String, "Setting Category") do |val|
230
+ params['settingCategory'] = val
231
+ end
232
+ opts.on('--settingCategory VALUE', String, "Setting Category") do |val|
233
+ params['settingCategory'] = val
234
+ end
235
+ opts.add_hidden_option('--settingCategory')
208
236
  build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote, :quiet])
209
237
  opts.footer = "Create a new file template." + "\n" +
210
238
  "[name] is required and can be passed as --name instead."
211
239
  end
212
240
  optparse.parse!(args)
213
- if args.count > 1
214
- print_error Morpheus::Terminal.angry_prompt
215
- puts_error "wrong number of arguments, expected 0-1 and got (#{args.count}) #{args.inspect}\n#{optparse}"
216
- return 1
217
- end
241
+ verify_args!(args:args, optparse:optparse, max:1)
218
242
  # support [name] as first argument
219
243
  if args[0]
220
244
  params['name'] = args[0]
221
245
  end
222
246
  connect(options)
223
247
  begin
224
- # construct payload
225
248
  payload = nil
249
+ arbitrary_options = options[:options] ? options[:options].reject {|k,v| k.is_a?(Symbol) } : {}
250
+ create_payload = {}
251
+ create_payload.deep_merge!(params)
252
+ create_payload.deep_merge!(arbitrary_options)
226
253
  if options[:payload]
227
254
  payload = options[:payload]
255
+ payload.deep_merge!({'containerTemplate' => create_payload}) unless create_payload.empty?
228
256
  else
229
- # merge -O options into normally parsed options
230
- params.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
231
- # todo: prompt?
232
- payload = {'containerTemplate' => params}
257
+ prompt_result = Morpheus::Cli::OptionTypes.prompt(add_container_template_option_types, params.deep_merge(options[:options] || {}), @api_client)
258
+ create_payload.deep_merge!(prompt_result)
259
+ payload = {'containerTemplate' => create_payload}
233
260
  end
234
261
  @container_templates_interface.setopts(options)
235
262
  if options[:dry_run]
@@ -260,25 +287,26 @@ class Morpheus::Cli::LibraryContainerTemplatesCommand
260
287
  opts.on('--name VALUE', String, "Name") do |val|
261
288
  params['name'] = val
262
289
  end
290
+ opts.on('-l', '--labels [LIST]', String, "Labels") do |val|
291
+ params['labels'] = parse_labels(val)
292
+ end
293
+ opts.on('--file-name VALUE', String, "File Name") do |val|
294
+ params['fileName'] = val
295
+ end
263
296
  opts.on('--fileName VALUE', String, "File Name") do |val|
264
297
  params['fileName'] = val
265
298
  end
299
+ opts.add_hidden_option('--fileName')
300
+ opts.on('--file-path VALUE', String, "File Path") do |val|
301
+ params['filePath'] = val
302
+ end
266
303
  opts.on('--filePath VALUE', String, "File Path") do |val|
267
304
  params['filePath'] = val
268
305
  end
269
- # opts.on('--code VALUE', String, "Code") do |val|
270
- # params['code'] = val
271
- # end
272
- # opts.on('--description VALUE', String, "Description") do |val|
273
- # params['description'] = val
274
- # end
275
- opts.on('--phase [start|stop]', String, "Template Phase") do |val|
276
- params['scriptPhase'] = val
306
+ opts.add_hidden_option('--filePath')
307
+ opts.on('--phase [preProvision|provision|postProvision]', String, "Template Phase. Default is 'provision'") do |val|
308
+ params['templatePhase'] = val
277
309
  end
278
-
279
- # opts.on('--enabled [on|off]', String, "Can be used to disable it") do |val|
280
- # options['enabled'] = !(val.to_s == 'off' || val.to_s == 'false')
281
- # end
282
310
  opts.on('--template TEXT', String, "Contents of the template.") do |val|
283
311
  params['template'] = val
284
312
  end
@@ -291,22 +319,53 @@ class Morpheus::Cli::LibraryContainerTemplatesCommand
291
319
  exit 1
292
320
  end
293
321
  end
322
+ opts.on('--file-owner VALUE', String, "File Owner") do |val|
323
+ params['fileOwner'] = val
324
+ end
325
+ opts.on('--fileOwner VALUE', String, "File Owner") do |val|
326
+ params['fileOwner'] = val
327
+ end
328
+ opts.add_hidden_option('--fileOwner')
329
+ opts.on('--setting-name VALUE', String, "Setting Name") do |val|
330
+ params['settingName'] = val
331
+ end
332
+ opts.on('--settingName VALUE', String, "Setting Name") do |val|
333
+ params['settingName'] = val
334
+ end
335
+ opts.add_hidden_option('--settingName')
336
+ opts.on('--setting-category VALUE', String, "Setting Category") do |val|
337
+ params['settingCategory'] = val
338
+ end
339
+ opts.on('--settingCategory VALUE', String, "Setting Category") do |val|
340
+ params['settingCategory'] = val
341
+ end
294
342
  build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote, :quiet])
295
343
  opts.footer = "Update a file template." + "\n" +
296
344
  "[name] is required. This is the name or id of a file template."
297
345
  end
298
346
  optparse.parse!(args)
299
- if args.count != 1
300
- print_error Morpheus::Terminal.angry_prompt
301
- puts_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args.inspect}\n#{optparse}"
302
- return 1
303
- end
347
+ verify_args!(args:args, optparse:optparse, count:1)
304
348
  connect(options)
305
349
  begin
306
350
  container_template = find_container_template_by_name_or_id(args[0])
307
351
  if container_template.nil?
308
352
  return 1
309
353
  end
354
+
355
+ payload = nil
356
+ arbitrary_options = options[:options] ? options[:options].reject {|k,v| k.is_a?(Symbol) } : {}
357
+ update_payload = {}
358
+ update_payload.deep_merge!(params)
359
+ update_payload.deep_merge!(arbitrary_options)
360
+ if options[:payload]
361
+ payload = options[:payload]
362
+ payload.deep_merge!({'containerTemplate' => update_payload}) unless update_payload.empty?
363
+ else
364
+ prompt_result = Morpheus::Cli::OptionTypes.no_prompt(update_container_template_option_types, params.deep_merge(options[:options] || {}), @api_client)
365
+ update_payload.deep_merge!(prompt_result)
366
+ payload = {'containerTemplate' => update_payload}
367
+ end
368
+
310
369
  # construct payload
311
370
  payload = nil
312
371
  if options[:payload]
@@ -343,10 +402,7 @@ class Morpheus::Cli::LibraryContainerTemplatesCommand
343
402
  build_common_options(opts, options, [:json, :dry_run, :quiet, :auto_confirm])
344
403
  end
345
404
  optparse.parse!(args)
346
- if args.count < 1
347
- puts optparse
348
- return 127
349
- end
405
+ verify_args!(args:args, optparse:optparse, count:1)
350
406
  connect(options)
351
407
 
352
408
  begin
@@ -427,6 +483,7 @@ class Morpheus::Cli::LibraryContainerTemplatesCommand
427
483
  columns = [
428
484
  {"ID" => lambda {|container_template| container_template['id'] } },
429
485
  {"NAME" => lambda {|container_template| container_template['name'] } },
486
+ {"LABELS" => lambda {|it| format_list(it['labels'], '', 3) rescue '' }},
430
487
  {"FILE NAME" => lambda {|container_template| container_template['fileName'] } },
431
488
  {"FILE PATH" => lambda {|container_template| container_template['filePath'] } },
432
489
  {"SETTING CATEGORY" => lambda {|container_template| container_template['settingCategory'] } },
@@ -439,5 +496,31 @@ class Morpheus::Cli::LibraryContainerTemplatesCommand
439
496
  print as_pretty_table(container_templates, columns, opts)
440
497
  end
441
498
 
499
+ def add_container_template_option_types()
500
+ [
501
+ {'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true},
502
+ {'fieldName' => 'fileName', 'fieldLabel' => 'File Name', 'type' => 'text', 'required' => true},
503
+ {'fieldName' => 'filePath', 'fieldLabel' => 'File Path', 'type' => 'text', 'required' => false},
504
+ {'fieldName' => 'templatePhase', 'fieldLabel' => 'Phase', 'type' => 'select', 'optionSource' => 'containerTemplatePhases', 'defaultValue' => 'provision', 'required' => true},
505
+ {'fieldName' => 'template', 'fieldLabel' => 'Template', 'type' => 'code-editor', 'required' => true},
506
+ {'fieldName' => 'fileOwner', 'fieldLabel' => 'File Owner', 'type' => 'text'},
507
+ {'fieldName' => 'settingName', 'fieldLabel' => 'Setting Name', 'type' => 'text'},
508
+ {'fieldName' => 'settingCategory', 'fieldLabel' => 'Setting Category', 'type' => 'text'},
509
+ ]
510
+ end
511
+
512
+ def add_container_template_advanced_option_types()
513
+ []
514
+ end
515
+
516
+ def update_container_template_option_types()
517
+ option_types = add_container_template_option_types.collect {|it| it.delete('required'); it.delete('defaultValue'); it.delete('dependsOnCode'); it }
518
+ option_types.reject! {|it| it['fieldName'] == 'type' }
519
+ option_types
520
+ end
521
+
522
+ def update_container_template_advanced_option_types()
523
+ add_container_template_advanced_option_types().collect {|it| it.delete('required'); it.delete('defaultValue'); it.delete('dependsOnCode'); it }
524
+ end
442
525
 
443
526
  end
@@ -41,6 +41,12 @@ class Morpheus::Cli::LibraryContainerTypesCommand
41
41
  opts.on('--category VALUE', String, "Filter by category") do |val|
42
42
  params['category'] = val
43
43
  end
44
+ opts.on('-l', '--labels LABEL', String, "Filter by labels, can match any of the values") do |val|
45
+ add_query_parameter(params, 'labels', parse_labels(val))
46
+ end
47
+ opts.on('--all-labels LABEL', String, "Filter by labels, must match all of the values") do |val|
48
+ add_query_parameter(params, 'allLabels', parse_labels(val))
49
+ end
44
50
  build_common_options(opts, options, [:list, :query, :json, :yaml, :csv, :fields, :dry_run, :remote])
45
51
  opts.footer = "List node types."
46
52
  end
@@ -151,6 +157,7 @@ class Morpheus::Cli::LibraryContainerTypesCommand
151
157
  "Name" => lambda {|it| it['name'] },
152
158
  "Short Name" => lambda {|it| it['shortName'] },
153
159
  "Version" => lambda {|it| it['containerVersion'] },
160
+ "Labels" => lambda {|it| format_list(it['labels'], '', 3) },
154
161
  "Technology" => lambda {|it| format_container_type_technology(it) },
155
162
  "Category" => lambda {|it| it['category'] },
156
163
  "Virtual Image" => lambda {|it|
@@ -246,6 +253,9 @@ class Morpheus::Cli::LibraryContainerTypesCommand
246
253
  opts.on('--name VALUE', String, "Name for this node type") do |val|
247
254
  params['name'] = val
248
255
  end
256
+ opts.on('-l', '--labels [LIST]', String, "Labels") do |val|
257
+ params['labels'] = parse_labels(val)
258
+ end
249
259
  opts.on('--shortName VALUE', String, "Short Name") do |val|
250
260
  params['shortName'] = val
251
261
  end
@@ -396,14 +406,14 @@ class Morpheus::Cli::LibraryContainerTypesCommand
396
406
 
397
407
  # SCRIPTS
398
408
  if script_ids
399
- params['scripts'] = script_ids.collect {|it| it.to_i }.select { |it| it != 0 }
409
+ params['scripts'] = script_ids.collect {|it| it.to_i }
400
410
  else
401
411
  # prompt
402
412
  end
403
413
 
404
414
  # FILE TEMPLATES
405
415
  if file_template_ids
406
- params['templates'] = file_template_ids.collect {|it| it.to_i }.select { |it| it != 0 }
416
+ params['templates'] = file_template_ids.collect {|it| it.to_i }
407
417
  else
408
418
  # prompt
409
419
  end
@@ -455,6 +465,9 @@ class Morpheus::Cli::LibraryContainerTypesCommand
455
465
  opts.on('--name VALUE', String, "Name for this layout") do |val|
456
466
  params['name'] = val
457
467
  end
468
+ opts.on('-l', '--labels [LIST]', String, "Labels") do |val|
469
+ params['labels'] = parse_labels(val)
470
+ end
458
471
  opts.on('--shortName VALUE', String, "Short Name") do |val|
459
472
  params['shortName'] = val
460
473
  end
@@ -547,14 +560,14 @@ class Morpheus::Cli::LibraryContainerTypesCommand
547
560
 
548
561
  # SCRIPTS
549
562
  if script_ids
550
- params['scripts'] = script_ids.collect {|it| it.to_i }.select { |it| it != 0 }
563
+ params['scripts'] = script_ids.collect {|it| it.to_i }
551
564
  else
552
565
  # prompt
553
566
  end
554
567
 
555
568
  # FILE TEMPLATES
556
569
  if file_template_ids
557
- params['templates'] = file_template_ids.collect {|it| it.to_i }.select { |it| it != 0 }
570
+ params['templates'] = file_template_ids.collect {|it| it.to_i }
558
571
  else
559
572
  # prompt
560
573
  end
@@ -6,7 +6,7 @@ class Morpheus::Cli::LibraryInstanceTypesCommand
6
6
 
7
7
  set_command_name :'library-instance-types'
8
8
  register_subcommands :list, :get, :add, :update, :remove
9
- register_subcommands({:'update-logo' => :update_logo})
9
+ register_subcommands({:'update-logo' => :update_logo,:'update-dark-logo' => :update_dark_logo})
10
10
  register_subcommands({:'toggle-featured' => :toggle_featured})
11
11
 
12
12
  def initialize()
@@ -42,6 +42,12 @@ class Morpheus::Cli::LibraryInstanceTypesCommand
42
42
  opts.on('--featured [true|false]',String, "Filter by featured.") do |val|
43
43
  params['featured'] = (val.to_s.downcase != 'false' && val.to_s.downcase != 'off')
44
44
  end
45
+ opts.on('-l', '--labels LABEL', String, "Filter by labels, can match any of the values") do |val|
46
+ add_query_parameter(params, 'labels', parse_labels(val))
47
+ end
48
+ opts.on('--all-labels LABEL', String, "Filter by labels, must match all of the values") do |val|
49
+ add_query_parameter(params, 'allLabels', parse_labels(val))
50
+ end
45
51
  build_common_options(opts, options, [:list, :query, :json, :yaml, :csv, :fields, :dry_run, :remote])
46
52
  opts.footer = "List instance types."
47
53
  end
@@ -147,6 +153,7 @@ class Morpheus::Cli::LibraryInstanceTypesCommand
147
153
  "Code" => lambda {|it| it['code'] },
148
154
  "Description" => lambda {|it| it['description'] },
149
155
  "Technology" => lambda {|it| format_instance_type_technology(it) },
156
+ "Labels" => lambda {|it| format_list(it['labels'], '') },
150
157
  "Category" => lambda {|it| it['category'].to_s.capitalize },
151
158
  # "Logo" => lambda {|it| it['logo'].to_s },
152
159
  "Visiblity" => lambda {|it| it['visibility'].to_s.capitalize },
@@ -179,6 +186,19 @@ class Morpheus::Cli::LibraryInstanceTypesCommand
179
186
  # print cyan,"No option types found for this layout.","\n",reset
180
187
  end
181
188
 
189
+ price_sets = instance_type['priceSets']
190
+ if price_sets && price_sets.size > 0
191
+ print_h2 "Price Sets"
192
+ price_set_columns = [
193
+ {"ID" => lambda {|it| it['id'] } },
194
+ {"NAME" => lambda {|it| it['name'] } },
195
+ {"PRICE UNIT" => lambda {|it| it['priceUnit'] } },
196
+ ]
197
+ print as_pretty_table(price_sets, price_set_columns)
198
+ else
199
+ # print cyan,"No price sets found for this instance type.","\n",reset
200
+ end
201
+
182
202
  instance_type_evars = instance_type['environmentVariables']
183
203
  if instance_type_evars && instance_type_evars.size > 0
184
204
  print_h2 "Environment Variables"
@@ -223,7 +243,8 @@ class Morpheus::Cli::LibraryInstanceTypesCommand
223
243
  {"TECHNOLOGY" => lambda {|layout|
224
244
  layout['provisionType'] ? layout['provisionType']['name'] : ''
225
245
  } },
226
- {"DESCRIPTION" => lambda {|layout| layout['description'] } }
246
+ {"DESCRIPTION" => lambda {|layout| layout['description'] } },
247
+ {"LABELS" => lambda {|layout| format_list(layout['labels'], '') } }
227
248
  ]
228
249
  print as_pretty_table(instance_type_layouts, layout_columns)
229
250
  else
@@ -252,6 +273,12 @@ class Morpheus::Cli::LibraryInstanceTypesCommand
252
273
  params['optionTypes'] = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
253
274
  end
254
275
  end
276
+ opts.on('-l', '--labels [LIST]', String, "Labels") do |val|
277
+ params['labels'] = parse_labels(val)
278
+ end
279
+ opts.on('--price-sets [LIST]', Array, 'Price set(s), comma separated list of price set IDs') do |list|
280
+ params['priceSets'] = list.collect {|it| it.to_s.strip.empty? || !it.to_i ? nil : it.to_s.strip}.compact.uniq.collect {|it| {'id' => it.to_i}}
281
+ end
255
282
  build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
256
283
  opts.footer = "Create a new instance type."
257
284
  end
@@ -344,6 +371,9 @@ class Morpheus::Cli::LibraryInstanceTypesCommand
344
371
  optparse = Morpheus::Cli::OptionParser.new do|opts|
345
372
  opts.banner = subcommand_usage("[name] [options]")
346
373
  build_option_type_options(opts, options, update_instance_type_option_types())
374
+ opts.on('-l', '--labels [LIST]', String, "Labels") do |val|
375
+ params['labels'] = parse_labels(val)
376
+ end
347
377
  build_common_options(opts, options, [:options, :json, :dry_run, :remote])
348
378
  opts.on('--option-types [x,y,z]', Array, "List of Option Type IDs") do |list|
349
379
  if list.nil?
@@ -352,6 +382,9 @@ class Morpheus::Cli::LibraryInstanceTypesCommand
352
382
  params['optionTypes'] = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
353
383
  end
354
384
  end
385
+ opts.on('--price-sets [LIST]', Array, 'Price set(s), comma separated list of price set IDs') do |list|
386
+ params['priceSets'] = list.collect {|it| it.to_s.strip.empty? || !it.to_i ? nil : it.to_s.strip}.compact.uniq.collect {|it| {'id' => it.to_i}}
387
+ end
355
388
  opts.footer = "Update an instance type." + "\n" +
356
389
  "[name] is required. This is the name or id of a instance type."
357
390
  end
@@ -478,10 +511,7 @@ class Morpheus::Cli::LibraryInstanceTypesCommand
478
511
  "[file] is required. This is the path of the logo file"
479
512
  end
480
513
  optparse.parse!(args)
481
- if args.count < 2
482
- puts optparse
483
- exit 1
484
- end
514
+ verify_args!(args:args, optparse:optparse, count:2)
485
515
  connect(options)
486
516
  layout_id = args[0]
487
517
  filename = args[1]
@@ -490,7 +520,7 @@ class Morpheus::Cli::LibraryInstanceTypesCommand
490
520
  exit 1 if instance_type.nil?
491
521
  logo_file = nil
492
522
  if filename == 'null'
493
- filename = 'null' # clear it
523
+ logo_file = 'null' # clear it
494
524
  else
495
525
  filename = File.expand_path(filename)
496
526
  if !File.exists?(filename)
@@ -517,6 +547,54 @@ class Morpheus::Cli::LibraryInstanceTypesCommand
517
547
  end
518
548
  end
519
549
 
550
+ def update_dark_logo(args)
551
+ options = {}
552
+ params = {}
553
+ filename = nil
554
+ optparse = Morpheus::Cli::OptionParser.new do|opts|
555
+ opts.banner = subcommand_usage("[name] [file]")
556
+ build_common_options(opts, options, [:json, :dry_run, :remote])
557
+ opts.footer = "Update the dark logo for an instance type." + "\n" +
558
+ "[name] is required. This is the name or id of a instance type." + "\n" +
559
+ "[file] is required. This is the path of the dark logo file"
560
+ end
561
+ optparse.parse!(args)
562
+ verify_args!(args:args, optparse:optparse, count:2)
563
+ connect(options)
564
+ layout_id = args[0]
565
+ filename = args[1]
566
+ begin
567
+ instance_type = find_instance_type_by_name_or_id(layout_id)
568
+ exit 1 if instance_type.nil?
569
+ dark_logo_file = nil
570
+ if filename == 'null'
571
+ dark_logo_file = 'null' # clear it
572
+ else
573
+ filename = File.expand_path(filename)
574
+ if !File.exists?(filename)
575
+ print_red_alert "File not found: #{filename}"
576
+ exit 1
577
+ end
578
+ dark_logo_file = File.new(filename, 'rb')
579
+ end
580
+ @library_instance_types_interface.setopts(options)
581
+ if options[:dry_run]
582
+ print_dry_run @library_instance_types_interface.dry.update_logo(instance_type['id'], nil, dark_logo_file)
583
+ return
584
+ end
585
+ json_response = @library_instance_types_interface.update_logo(instance_type['id'], nil, dark_logo_file)
586
+ if options[:json]
587
+ print JSON.pretty_generate(json_response), "\n"
588
+ return 0
589
+ end
590
+ print_green_success "Updated Instance Type #{instance_type['name']} dark logo"
591
+ _get(instance_type['id'], options)
592
+ rescue RestClient::Exception => e
593
+ print_rest_exception(e, options)
594
+ return 1
595
+ end
596
+ end
597
+
520
598
  def remove(args)
521
599
  options = {}
522
600
  optparse = Morpheus::Cli::OptionParser.new do|opts|