morpheus-cli 3.6.2 → 3.6.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4b96e9a323b6252c8aea83546061d49935d48d468b06c88b2aea362a04024bb4
4
- data.tar.gz: 45517a33a6c41ab8f97b4c83195cf2ba9c864aa44301eb8ede39243250f63608
3
+ metadata.gz: 9c4ff5dbc24449eb5603e8f786653d613a1e204e03c5f5071647074127c7144e
4
+ data.tar.gz: '08e8a66410060ac421d790ab7b0ace8c3e0e2d923b99080bc686efae00047ebc'
5
5
  SHA512:
6
- metadata.gz: ea362685980a7a97f65c62af61cb0ee45fae02f73684599ba7290b1c411087d70b345f9d0488550721d8e174ddd824ad43383d95f03a8c7d9fb80018362accab
7
- data.tar.gz: 9382c219bd8d7078c258c6568d034ef64c6a6b8ca496818ec84295208c3c7ff1c541e07b1801f7af4aff7507acacb81b6c155c08f3deb92f2b6b4131b71d5aa9
6
+ metadata.gz: 4da0dd9d22fe6907b5c8adf120a22650802a310eacfa3b499963e6df240eebec5d13fd8462d7497ddbaed48af27fe9069a64a806e819bd09f0a0e2402518882b
7
+ data.tar.gz: 2329a3d24c1a24e7b12c71bd8b5ae6dec2997577d89a3eb2926fef3d7e1dffa6be0f03c46be7518ece5c0e9e81cee4c9d8bc0753b434654802459df631f47241
@@ -73,12 +73,11 @@ class Morpheus::BlueprintsInterface < Morpheus::APIClient
73
73
  execute(method: :get, url: url, headers: headers)
74
74
  end
75
75
 
76
- # unused, prefer /options/instanceTypes
77
- # def list_types(options={})
78
- # url = "#{@base_url}/api/blueprints/types"
79
- # headers = { params: {}, authorization: "Bearer #{@access_token}" }
80
- # headers[:params].merge!(options)
81
- # execute(method: :get, url: url, headers: headers)
82
- # end
76
+ def list_types(options={})
77
+ url = "#{@base_url}/api/blueprints/types"
78
+ headers = { params: {}, authorization: "Bearer #{@access_token}" }
79
+ headers[:params].merge!(options)
80
+ execute(method: :get, url: url, headers: headers)
81
+ end
83
82
 
84
83
  end
@@ -110,13 +110,16 @@ class Morpheus::Cli::Apps
110
110
  # options[:cloud] = val
111
111
  # end
112
112
  opts.on('--config JSON', String, "App Config JSON") do |val|
113
- options['config'] = JSON.parse(val.to_s)
113
+ options[:config] = JSON.parse(val.to_s)
114
114
  end
115
115
  opts.on('--config-yaml YAML', String, "App Config YAML") do |val|
116
- options['config'] = YAML.load(val.to_s)
116
+ options[:config] = YAML.load(val.to_s)
117
117
  end
118
118
  opts.on('--config-file FILE', String, "App Config from a local JSON or YAML file") do |val|
119
- options['configFile'] = val.to_s
119
+ options[:config_file] = val.to_s
120
+ end
121
+ opts.on('--config-dir DIRECTORY', String, "Blueprint Config from a local directory, merging all JSON or YAML files") do |val|
122
+ options[:config_dir] = val.to_s
120
123
  end
121
124
  build_common_options(opts, options, [:options, :json, :dry_run, :quiet])
122
125
  opts.footer = "Create a new app.\n" +
@@ -140,12 +143,12 @@ class Morpheus::Cli::Apps
140
143
  end
141
144
 
142
145
  payload = {}
143
- config_payload = {}
144
- if options['config']
145
- config_payload = options['config']
146
+ if options[:config]
147
+ config_payload = options[:config]
146
148
  payload = config_payload
147
- elsif options['configFile']
148
- config_file = File.expand_path(options['configFile'])
149
+ payload.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
150
+ elsif options[:config_file]
151
+ config_file = File.expand_path(options[:config_file])
149
152
  if !File.exists?(config_file) || !File.file?(config_file)
150
153
  print_red_alert "File not found: #{config_file}"
151
154
  return false
@@ -156,9 +159,35 @@ class Morpheus::Cli::Apps
156
159
  config_payload = JSON.parse(File.read(config_file))
157
160
  end
158
161
  payload = config_payload
162
+ elsif options[:config_dir]
163
+ config_dir = File.expand_path(options[:config_dir])
164
+ if !Dir.exists?(config_dir) || !File.directory?(config_dir)
165
+ print_red_alert "Directory not found: #{config_dir}"
166
+ return false
167
+ end
168
+ merged_payload = {}
169
+ config_files = []
170
+ config_files += Dir["#{config_dir}/*.json"]
171
+ config_files += Dir["#{config_dir}/*.yml"]
172
+ config_files += Dir["#{config_dir}/*.yaml"]
173
+ if config_files.empty?
174
+ print_red_alert "No .json/yaml files found in config directory: #{config_dir}"
175
+ return false
176
+ end
177
+ config_files.each do |config_file|
178
+ if config_file =~ /\.ya?ml\Z/
179
+ config_payload = YAML.load_file(config_file)
180
+ else
181
+ config_payload = JSON.parse(File.read(config_file))
182
+ end
183
+ merged_payload.deep_merge!(config_payload)
184
+ end
185
+ payload = merged_payload
186
+ payload.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
159
187
  else
160
188
  # prompt for Name, Description, Group, Environment
161
189
  payload = {}
190
+ payload.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
162
191
  params = Morpheus::Cli::OptionTypes.prompt(add_app_option_types, options[:options], @api_client, options[:params])
163
192
  params = params.deep_compact! # remove nulls and blank strings
164
193
  template_id = params.delete('blueprint')
@@ -6,6 +6,7 @@ class Morpheus::Cli::BlueprintsCommand
6
6
  include Morpheus::Cli::ProvisioningHelper
7
7
  set_command_name :'blueprints'
8
8
  register_subcommands :list, :get, :add, :update, :remove
9
+ register_subcommands :'types' => :list_types
9
10
  register_subcommands :duplicate
10
11
  register_subcommands :'upload-image' => :upload_image
11
12
  register_subcommands :'update-permissions' => :update_permissions
@@ -192,16 +193,19 @@ class Morpheus::Cli::BlueprintsCommand
192
193
  optparse = Morpheus::Cli::OptionParser.new do |opts|
193
194
  opts.banner = subcommand_usage("[name] [options]")
194
195
  opts.on('--config JSON', String, "Blueprint Config JSON") do |val|
195
- options['config'] = JSON.parse(val.to_s)
196
+ options[:config] = JSON.parse(val.to_s)
196
197
  end
197
198
  opts.on('--config-yaml YAML', String, "Blueprint Config YAML") do |val|
198
- options['config'] = YAML.load(val.to_s)
199
+ options[:config] = YAML.load(val.to_s)
199
200
  end
200
201
  opts.on('--config-file FILE', String, "Blueprint Config from a local JSON or YAML file") do |val|
201
- options['configFile'] = val.to_s
202
+ options[:config_file] = val.to_s
203
+ end
204
+ opts.on('--config-dir DIRECTORY', String, "Blueprint Config from a local directory, merging all JSON or YAML files") do |val|
205
+ options[:config_dir] = val.to_s
202
206
  end
203
207
  build_option_type_options(opts, options, add_blueprint_option_types(false))
204
- build_common_options(opts, options, [:options, :json, :dry_run, :remote])
208
+ build_common_options(opts, options, [:options, :json, :dry_run, :quiet, :remote])
205
209
  opts.footer = "Create a new blueprint.\n" +
206
210
  "[name] is optional and can be passed as --name or inside the config instead."
207
211
  "[--config] or [--config-file] can be used to define the blueprint."
@@ -218,13 +222,13 @@ class Morpheus::Cli::BlueprintsCommand
218
222
  end
219
223
  connect(options)
220
224
  begin
221
- request_payload = nil
222
- config_payload = {}
223
- if options['config']
224
- config_payload = options['config']
225
- request_payload = config_payload
226
- elsif options['configFile']
227
- config_file = File.expand_path(options['configFile'])
225
+ payload = nil
226
+ if options[:config]
227
+ config_payload = options[:config]
228
+ payload = config_payload
229
+ payload.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
230
+ elsif options[:config_file]
231
+ config_file = File.expand_path(options[:config_file])
228
232
  if !File.exists?(config_file) || !File.file?(config_file)
229
233
  print_red_alert "File not found: #{config_file}"
230
234
  return false
@@ -234,29 +238,59 @@ class Morpheus::Cli::BlueprintsCommand
234
238
  else
235
239
  config_payload = JSON.parse(File.read(config_file))
236
240
  end
237
- request_payload = config_payload
241
+ payload = config_payload
242
+ payload.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
243
+ elsif options[:config_dir]
244
+ config_dir = File.expand_path(options[:config_dir])
245
+ if !Dir.exists?(config_dir) || !File.directory?(config_dir)
246
+ print_red_alert "Directory not found: #{config_dir}"
247
+ return false
248
+ end
249
+ merged_payload = {}
250
+ config_files = []
251
+ config_files += Dir["#{config_dir}/*.json"]
252
+ config_files += Dir["#{config_dir}/*.yml"]
253
+ config_files += Dir["#{config_dir}/*.yaml"]
254
+ if config_files.empty?
255
+ print_red_alert "No .json/yaml files found in config directory: #{config_dir}"
256
+ return false
257
+ end
258
+ config_files.each do |config_file|
259
+ if config_file =~ /\.ya?ml\Z/
260
+ config_payload = YAML.load_file(config_file)
261
+ else
262
+ config_payload = JSON.parse(File.read(config_file))
263
+ end
264
+ merged_payload.deep_merge!(config_payload)
265
+ end
266
+ payload = merged_payload
267
+ payload.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
238
268
  else
269
+ payload = {}
270
+ payload.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
239
271
  params = Morpheus::Cli::OptionTypes.prompt(add_blueprint_option_types, options[:options], @api_client, options[:params])
240
- blueprint_payload = params.select {|k,v| ['name', 'description', 'category'].include?(k) }
272
+ #blueprint_payload = params.select {|k,v| ['name', 'description', 'category'].include?(k) }
241
273
  # expects no namespace, just the config
242
- request_payload = blueprint_payload
274
+ #payload = blueprint_payload
275
+ payload.deep_merge!(params)
243
276
  end
244
277
 
245
278
  if options[:dry_run]
246
- print_dry_run @blueprints_interface.dry.create(request_payload)
279
+ print_dry_run @blueprints_interface.dry.create(payload)
247
280
  return
248
281
  end
249
282
 
250
- json_response = @blueprints_interface.create(request_payload)
283
+ json_response = @blueprints_interface.create(payload)
251
284
 
252
285
  if options[:json]
253
286
  print JSON.pretty_generate(json_response)
254
287
  print "\n"
255
- else
288
+ elsif !options[:quiet]
256
289
  blueprint = json_response["blueprint"]
257
290
  print_green_success "Added blueprint #{blueprint['name']}"
258
291
  if !options[:no_prompt]
259
- if ::Morpheus::Cli::OptionTypes::confirm("Would you like to add a tier now?", options.merge({default: false}))
292
+ prompt_for_tier = options[:config].nil? && options[:config_file].nil? && options[:config_dir].nil?
293
+ if prompt_for_tier && ::Morpheus::Cli::OptionTypes::confirm("Would you like to add a tier now?", options.merge({default: false}))
260
294
  add_tier([blueprint['id']])
261
295
  while ::Morpheus::Cli::OptionTypes::confirm("Add another tier?", options.merge({default: false})) do
262
296
  add_tier([blueprint['id']])
@@ -267,7 +301,7 @@ class Morpheus::Cli::BlueprintsCommand
267
301
  end
268
302
  end
269
303
  end
270
-
304
+ return 0
271
305
  rescue RestClient::Exception => e
272
306
  print_rest_exception(e, options)
273
307
  exit 1
@@ -279,13 +313,16 @@ class Morpheus::Cli::BlueprintsCommand
279
313
  optparse = Morpheus::Cli::OptionParser.new do |opts|
280
314
  opts.banner = subcommand_usage("[id] [options]")
281
315
  opts.on('--config JSON', String, "Blueprint Config JSON") do |val|
282
- options['config'] = JSON.parse(val.to_s)
316
+ options[:config] = JSON.parse(val.to_s)
283
317
  end
284
318
  opts.on('--config-yaml YAML', String, "Blueprint Config YAML") do |val|
285
- options['config'] = YAML.load(val.to_s)
319
+ options[:config] = YAML.load(val.to_s)
286
320
  end
287
321
  opts.on('--config-file FILE', String, "Blueprint Config from a local JSON or YAML file") do |val|
288
- options['configFile'] = val.to_s
322
+ options[:config_file] = val.to_s
323
+ end
324
+ opts.on('--config-dir DIRECTORY', String, "Blueprint Config from a local directory, merging all JSON or YAML files") do |val|
325
+ options[:config_dir] = val.to_s
289
326
  end
290
327
  build_option_type_options(opts, options, update_blueprint_option_types(false))
291
328
  build_common_options(opts, options, [:options, :json, :dry_run, :quiet, :remote])
@@ -308,13 +345,13 @@ class Morpheus::Cli::BlueprintsCommand
308
345
  blueprint = find_blueprint_by_name_or_id(args[0])
309
346
  exit 1 if blueprint.nil?
310
347
 
311
- request_payload = nil
312
- config_payload = {}
313
- if options['config']
314
- config_payload = options['config']
315
- request_payload = config_payload
316
- elsif options['configFile']
317
- config_file = options['configFile']
348
+ payload = nil
349
+ if options[:config]
350
+ config_payload = options[:config]
351
+ payload = config_payload
352
+ payload.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
353
+ elsif options[:config_file]
354
+ config_file = options[:config_file]
318
355
  if !File.exists?(config_file)
319
356
  print_red_alert "File not found: #{config_file}"
320
357
  return false
@@ -324,36 +361,44 @@ class Morpheus::Cli::BlueprintsCommand
324
361
  else
325
362
  config_payload = JSON.parse(File.read(config_file))
326
363
  end
327
- request_payload = config_payload
328
- else
329
- # update just name,description,category
330
- # preserve all other attributes of the config..
331
-
332
- #params = Morpheus::Cli::OptionTypes.prompt(update_blueprint_option_types, options[:options], @api_client, options[:params])
333
- params = options[:options] || {}
334
-
335
- if params.empty?
336
- # print_red_alert "Specify atleast one option to update"
337
- print_red_alert "Specify atleast one option to update.\nOr use --config or --config-file to replace the entire config."
338
- puts optparse
339
- exit 1
364
+ payload = config_payload
365
+ payload.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
366
+ elsif options[:config_dir]
367
+ config_dir = File.expand_path(options[:config_dir])
368
+ if !Dir.exists?(config_dir) || !File.directory?(config_dir)
369
+ print_red_alert "Directory not found: #{config_dir}"
370
+ return false
340
371
  end
341
-
342
- #puts "parsed params is : #{params.inspect}"
343
- blueprint_payload = params.select {|k,v| ['name','description','category'].include?(k) }
344
- # expects no namespace, just the config
345
- # preserve all other attributes of the config.
346
- request_payload = blueprint["config"].merge(blueprint_payload)
347
- # todo maybe: put name, description and category at the front.
348
- # request_payload = blueprint_payload.merge(blueprint["config"].merge(blueprint_payload))
372
+ merged_payload = {}
373
+ config_files = []
374
+ config_files += Dir["#{config_dir}/*.json"]
375
+ config_files += Dir["#{config_dir}/*.yml"]
376
+ config_files += Dir["#{config_dir}/*.yaml"]
377
+ if config_files.empty?
378
+ print_red_alert "No .json/yaml files found in config directory: #{config_dir}"
379
+ return false
380
+ end
381
+ config_files.each do |config_file|
382
+ if config_file =~ /\.ya?ml\Z/
383
+ config_payload = YAML.load_file(config_file)
384
+ else
385
+ config_payload = JSON.parse(File.read(config_file))
386
+ end
387
+ merged_payload.deep_merge!(config_payload)
388
+ end
389
+ payload = merged_payload
390
+ payload.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
391
+ else
392
+ payload = blueprint["config"]
393
+ payload.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
349
394
  end
350
395
 
351
396
  if options[:dry_run]
352
- print_dry_run @blueprints_interface.dry.update(blueprint['id'], request_payload)
397
+ print_dry_run @blueprints_interface.dry.update(blueprint['id'], payload)
353
398
  return
354
399
  end
355
400
 
356
- json_response = @blueprints_interface.update(blueprint['id'], request_payload)
401
+ json_response = @blueprints_interface.update(blueprint['id'], payload)
357
402
 
358
403
  if options[:json]
359
404
  print JSON.pretty_generate(json_response)
@@ -548,9 +593,9 @@ class Morpheus::Cli::BlueprintsCommand
548
593
  exit 1
549
594
  end
550
595
 
551
- request_payload = {"blueprint" => {}}
596
+ payload = {"blueprint" => {}}
552
597
  if args[1]
553
- request_payload["blueprint"]["name"] = args[1]
598
+ payload["blueprint"]["name"] = args[1]
554
599
  end
555
600
 
556
601
  connect(options)
@@ -561,10 +606,10 @@ class Morpheus::Cli::BlueprintsCommand
561
606
  # exit
562
607
  # end
563
608
  if options[:dry_run]
564
- print_dry_run @blueprints_interface.dry.duplicate(blueprint['id'], request_payload)
609
+ print_dry_run @blueprints_interface.dry.duplicate(blueprint['id'], payload)
565
610
  return
566
611
  end
567
- json_response = @blueprints_interface.duplicate(blueprint['id'], request_payload)
612
+ json_response = @blueprints_interface.duplicate(blueprint['id'], payload)
568
613
 
569
614
  if options[:json]
570
615
  print JSON.pretty_generate(json_response)
@@ -713,14 +758,14 @@ class Morpheus::Cli::BlueprintsCommand
713
758
 
714
759
  # ok, make api request
715
760
  blueprint["config"]["tiers"] = tiers
716
- request_payload = {blueprint: blueprint}
761
+ payload = {blueprint: blueprint}
717
762
 
718
763
  if options[:dry_run]
719
- print_dry_run @blueprints_interface.dry.update(blueprint['id'], request_payload)
764
+ print_dry_run @blueprints_interface.dry.update(blueprint['id'], payload)
720
765
  return 0
721
766
  end
722
767
 
723
- json_response = @blueprints_interface.update(blueprint['id'], request_payload)
768
+ json_response = @blueprints_interface.update(blueprint['id'], payload)
724
769
 
725
770
  if options[:json]
726
771
  puts JSON.pretty_generate(json_response)
@@ -871,14 +916,14 @@ class Morpheus::Cli::BlueprintsCommand
871
916
 
872
917
  # ok, make api request
873
918
  blueprint["config"]["tiers"] = tiers
874
- request_payload = {blueprint: blueprint}
919
+ payload = {blueprint: blueprint}
875
920
 
876
921
  if options[:dry_run]
877
- print_dry_run @blueprints_interface.dry.update(blueprint['id'], request_payload)
922
+ print_dry_run @blueprints_interface.dry.update(blueprint['id'], payload)
878
923
  return 0
879
924
  end
880
925
 
881
- json_response = @blueprints_interface.update(blueprint['id'], request_payload)
926
+ json_response = @blueprints_interface.update(blueprint['id'], payload)
882
927
 
883
928
  if options[:json]
884
929
  puts JSON.pretty_generate(json_response)
@@ -1055,13 +1100,13 @@ class Morpheus::Cli::BlueprintsCommand
1055
1100
 
1056
1101
  # ok, make api request
1057
1102
  blueprint["config"]["tiers"] = tiers
1058
- request_payload = {blueprint: blueprint}
1103
+ payload = {blueprint: blueprint}
1059
1104
 
1060
1105
  if options[:dry_run]
1061
- print_dry_run @blueprints_interface.dry.update(blueprint['id'], request_payload)
1106
+ print_dry_run @blueprints_interface.dry.update(blueprint['id'], payload)
1062
1107
  return
1063
1108
  end
1064
- json_response = @blueprints_interface.update(blueprint['id'], request_payload)
1109
+ json_response = @blueprints_interface.update(blueprint['id'], payload)
1065
1110
 
1066
1111
  if options[:json]
1067
1112
  puts JSON.pretty_generate(json_response)
@@ -1177,13 +1222,13 @@ class Morpheus::Cli::BlueprintsCommand
1177
1222
 
1178
1223
  # ok, make api request
1179
1224
  blueprint["config"]["tiers"] = tiers
1180
- request_payload = {blueprint: blueprint}
1225
+ payload = {blueprint: blueprint}
1181
1226
 
1182
1227
  if options[:dry_run]
1183
- print_dry_run @blueprints_interface.dry.update(blueprint['id'], request_payload)
1228
+ print_dry_run @blueprints_interface.dry.update(blueprint['id'], payload)
1184
1229
  return
1185
1230
  end
1186
- json_response = @blueprints_interface.update(blueprint['id'], request_payload)
1231
+ json_response = @blueprints_interface.update(blueprint['id'], payload)
1187
1232
 
1188
1233
  if options[:json]
1189
1234
  puts JSON.pretty_generate(json_response)
@@ -1286,14 +1331,14 @@ class Morpheus::Cli::BlueprintsCommand
1286
1331
 
1287
1332
  # ok, make api request
1288
1333
  blueprint["config"]["tiers"] = tiers
1289
- request_payload = blueprint["config"]
1290
- # request_payload = {blueprint: blueprint}
1334
+ payload = blueprint["config"]
1335
+ # payload = {blueprint: blueprint}
1291
1336
 
1292
1337
  if options[:dry_run]
1293
- print_dry_run @blueprints_interface.dry.update(blueprint['id'], request_payload)
1338
+ print_dry_run @blueprints_interface.dry.update(blueprint['id'], payload)
1294
1339
  return
1295
1340
  end
1296
- json_response = @blueprints_interface.update(blueprint['id'], request_payload)
1341
+ json_response = @blueprints_interface.update(blueprint['id'], payload)
1297
1342
 
1298
1343
  if options[:json]
1299
1344
  puts JSON.pretty_generate(json_response)
@@ -1431,14 +1476,14 @@ class Morpheus::Cli::BlueprintsCommand
1431
1476
 
1432
1477
  # ok, make api request
1433
1478
  blueprint["config"]["tiers"] = tiers
1434
- request_payload = blueprint["config"]
1435
- # request_payload = {blueprint: blueprint}
1479
+ payload = blueprint["config"]
1480
+ # payload = {blueprint: blueprint}
1436
1481
 
1437
1482
  if options[:dry_run]
1438
- print_dry_run @blueprints_interface.dry.update(blueprint['id'], request_payload)
1483
+ print_dry_run @blueprints_interface.dry.update(blueprint['id'], payload)
1439
1484
  return
1440
1485
  end
1441
- json_response = @blueprints_interface.update(blueprint['id'], request_payload)
1486
+ json_response = @blueprints_interface.update(blueprint['id'], payload)
1442
1487
 
1443
1488
  if options[:json]
1444
1489
  puts JSON.pretty_generate(json_response)
@@ -1495,15 +1540,15 @@ class Morpheus::Cli::BlueprintsCommand
1495
1540
 
1496
1541
  # ok, make api request
1497
1542
  blueprint["config"]["tiers"] = tiers
1498
- request_payload = blueprint["config"]
1499
- # request_payload = {blueprint: blueprint}
1543
+ payload = blueprint["config"]
1544
+ # payload = {blueprint: blueprint}
1500
1545
 
1501
1546
  if options[:dry_run]
1502
- print_dry_run @blueprints_interface.dry.update(blueprint['id'], request_payload)
1547
+ print_dry_run @blueprints_interface.dry.update(blueprint['id'], payload)
1503
1548
  return
1504
1549
  end
1505
1550
 
1506
- json_response = @blueprints_interface.update(blueprint['id'], request_payload)
1551
+ json_response = @blueprints_interface.update(blueprint['id'], payload)
1507
1552
 
1508
1553
 
1509
1554
  if options[:json]
@@ -1594,14 +1639,14 @@ class Morpheus::Cli::BlueprintsCommand
1594
1639
 
1595
1640
  # ok, make api request
1596
1641
  blueprint["config"]["tiers"] = tiers
1597
- request_payload = blueprint["config"]
1598
- # request_payload = {blueprint: blueprint}
1642
+ payload = blueprint["config"]
1643
+ # payload = {blueprint: blueprint}
1599
1644
 
1600
1645
  if options[:dry_run]
1601
- print_dry_run @blueprints_interface.dry.update(blueprint['id'], request_payload)
1646
+ print_dry_run @blueprints_interface.dry.update(blueprint['id'], payload)
1602
1647
  return
1603
1648
  end
1604
- json_response = @blueprints_interface.update(blueprint['id'], request_payload)
1649
+ json_response = @blueprints_interface.update(blueprint['id'], payload)
1605
1650
 
1606
1651
 
1607
1652
  if options[:json]
@@ -1684,14 +1729,14 @@ class Morpheus::Cli::BlueprintsCommand
1684
1729
 
1685
1730
  # ok, make api request
1686
1731
  blueprint["config"]["tiers"] = tiers
1687
- request_payload = blueprint["config"]
1688
- # request_payload = {blueprint: blueprint}
1732
+ payload = blueprint["config"]
1733
+ # payload = {blueprint: blueprint}
1689
1734
 
1690
1735
  if options[:dry_run]
1691
- print_dry_run @blueprints_interface.dry.update(blueprint['id'], request_payload)
1736
+ print_dry_run @blueprints_interface.dry.update(blueprint['id'], payload)
1692
1737
  return
1693
1738
  end
1694
- json_response = @blueprints_interface.update(blueprint['id'], request_payload)
1739
+ json_response = @blueprints_interface.update(blueprint['id'], payload)
1695
1740
 
1696
1741
 
1697
1742
  if options[:json]
@@ -1755,6 +1800,70 @@ class Morpheus::Cli::BlueprintsCommand
1755
1800
 
1756
1801
  end
1757
1802
 
1803
+ def list_types(args)
1804
+ options = {}
1805
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
1806
+ opts.banner = subcommand_usage()
1807
+ build_common_options(opts, options, [:json, :yaml, :csv, :fields, :dry_run, :remote])
1808
+ opts.footer = "List blueprint types."
1809
+ end
1810
+ optparse.parse!(args)
1811
+ connect(options)
1812
+ begin
1813
+ params = {}
1814
+ [:phrase, :offset, :max, :sort, :direction].each do |k|
1815
+ params[k] = options[k] unless options[k].nil?
1816
+ end
1817
+ if options[:dry_run]
1818
+ print_dry_run @blueprints_interface.dry.list_types(params)
1819
+ return
1820
+ end
1821
+
1822
+ json_response = @blueprints_interface.list_types(params)
1823
+ blueprint_types = json_response['types']
1824
+
1825
+ if options[:json]
1826
+ puts as_json(json_response, options, "types")
1827
+ return 0
1828
+ elsif options[:csv]
1829
+ puts records_as_csv(json_response['types'], options)
1830
+ return 0
1831
+ elsif options[:yaml]
1832
+ puts as_yaml(json_response, options, "types")
1833
+ return 0
1834
+ end
1835
+
1836
+
1837
+ title = "Morpheus Blueprint Types"
1838
+ subtitles = []
1839
+ if params[:phrase]
1840
+ subtitles << "Search: #{params[:phrase]}".strip
1841
+ end
1842
+ print_h1 title, subtitles
1843
+ if blueprint_types.empty?
1844
+ print cyan,"No blueprint types found.",reset,"\n"
1845
+ else
1846
+ rows = blueprint_types.collect do |blueprint_type|
1847
+ {
1848
+ code: blueprint_type['code'],
1849
+ name: blueprint_type['name']
1850
+ }
1851
+ end
1852
+ columns = [:code, :name]
1853
+ print cyan
1854
+ print as_pretty_table(rows, columns, options)
1855
+ print reset
1856
+ # print_results_pagination(json_response)
1857
+ end
1858
+ print reset,"\n"
1859
+ return 0
1860
+
1861
+ rescue RestClient::Exception => e
1862
+ print_rest_exception(e, options)
1863
+ exit 1
1864
+ end
1865
+ end
1866
+
1758
1867
  private
1759
1868
 
1760
1869
 
@@ -1762,11 +1871,30 @@ class Morpheus::Cli::BlueprintsCommand
1762
1871
  [
1763
1872
  {'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true, 'displayOrder' => 1},
1764
1873
  {'fieldName' => 'description', 'fieldLabel' => 'Description', 'type' => 'text', 'required' => false, 'displayOrder' => 2},
1765
- {'fieldName' => 'category', 'fieldLabel' => 'Category', 'type' => 'text', 'required' => false, 'displayOrder' => 3},
1874
+ # skip Type for now because other types need to use --config anyhow
1875
+ #{'fieldName' => 'type', 'fieldLabel' => 'Type', 'type' => 'select', 'selectOptions' => (connected ? get_available_blueprint_types() : []), 'required' => true, 'defaultValue' => 'morpheus', 'displayOrder' => 3},
1876
+ {'fieldName' => 'category', 'fieldLabel' => 'Category', 'type' => 'text', 'required' => false, 'displayOrder' => 4},
1766
1877
  #{'fieldName' => 'group', 'fieldLabel' => 'Group', 'type' => 'select', 'selectOptions' => (connected ? get_available_groups() : []), 'required' => true}
1767
1878
  ]
1768
1879
  end
1769
1880
 
1881
+ def get_available_blueprint_types(refresh=false)
1882
+ if !@available_blueprint_types || refresh
1883
+ begin
1884
+ # results = @options_interface.options_for_source('blueprintTypes',{})
1885
+ results = @blueprints_interface.list_types({})
1886
+ @available_blueprint_types = results['types'].collect {|it|
1887
+ {"name" => (it["name"] || it["code"]), "value" => (it["code"] || it["value"])}
1888
+ }
1889
+ rescue RestClient::Exception => e
1890
+ # older version
1891
+ @available_blueprint_types = [{"name" => "Morpheus", "value" => "morpheus"}, {"name" => "Terraform", "value" => "terraform"}, {"name" => "CloudFormation", "value" => "cloudFormation"}, {"name" => "ARM template", "value" => "arm"}]
1892
+ end
1893
+ end
1894
+ #puts "get_available_blueprints() rtn: #{@available_blueprints.inspect}"
1895
+ return @available_blueprint_types
1896
+ end
1897
+
1770
1898
  def update_blueprint_option_types(connected=true)
1771
1899
  list = add_blueprint_option_types(connected)
1772
1900
  list = list.reject {|it| ["group"].include? it['fieldName'] }
@@ -1842,6 +1970,7 @@ class Morpheus::Cli::BlueprintsCommand
1842
1970
  id: blueprint['id'],
1843
1971
  name: blueprint['name'],
1844
1972
  description: blueprint['description'],
1973
+ type: blueprint['type'].kind_of?(Hash) ? blueprint['type']['name'] : blueprint['type'],
1845
1974
  category: blueprint['category'],
1846
1975
  tiers_summary: format_blueprint_tiers_summary(blueprint)
1847
1976
  }
@@ -1856,6 +1985,7 @@ class Morpheus::Cli::BlueprintsCommand
1856
1985
  :id,
1857
1986
  :name,
1858
1987
  :description,
1988
+ :type,
1859
1989
  :category,
1860
1990
  {:tiers_summary => {:display_name => "TIERS", :max_width => tiers_col_width} }
1861
1991
  ]
@@ -1931,6 +2061,7 @@ class Morpheus::Cli::BlueprintsCommand
1931
2061
  "ID" => 'id',
1932
2062
  "Name" => 'name',
1933
2063
  "Description" => 'description',
2064
+ "Type" => lambda {|it| it['type'].kind_of?(Hash) ? it['type']['name'] : it['type'] },
1934
2065
  "Category" => 'category',
1935
2066
  "Image" => lambda {|it| it['config'] ? (it['config']['image'] == '/assets/apps/template.png' ? '(default)' : it['config']['image']) : '' },
1936
2067
  "Visibility" => 'visibility'
@@ -903,7 +903,7 @@ class Morpheus::Cli::Instances
903
903
  if containers.empty?
904
904
  print yellow,"No containers found for instance.",reset,"\n"
905
905
  else
906
-
906
+ containers = containers.sort { |x,y| x['id'] <=> y['id'] }
907
907
  rows = containers.collect {|container|
908
908
  stats = container['stats']
909
909
  cpu_usage_str = !stats ? "" : generate_usage_bar((stats['usedCpu'] || stats['cpuUsage']).to_f, 100, {max_bars: 10})
@@ -1015,7 +1015,7 @@ class Morpheus::Cli::Instances
1015
1015
 
1016
1016
 
1017
1017
  containers = json_response['containers']
1018
-
1018
+ containers = containers.sort { |x,y| x['id'] <=> y['id'] }
1019
1019
  title = "Instance Containers: #{instance['name']} (#{instance['instanceType']['name']})"
1020
1020
  print_h1 title
1021
1021
  if containers.empty?
@@ -8,7 +8,7 @@ class Morpheus::Cli::LibraryPackagesCommand
8
8
  include Morpheus::Cli::LibraryHelper
9
9
 
10
10
  set_command_name :'packages'
11
- register_subcommands :list, :search, :get, :install, :update, :remove, :export
11
+ register_subcommands :list, :search, :get, :install, :update, :remove, :export, :build
12
12
  register_subcommands :'install-file' => :install_file
13
13
 
14
14
  # hide until this is released
@@ -1,6 +1,6 @@
1
1
 
2
2
  module Morpheus
3
3
  module Cli
4
- VERSION = "3.6.2"
4
+ VERSION = "3.6.3"
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.2
4
+ version: 3.6.3
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-01-17 00:00:00.000000000 Z
14
+ date: 2019-01-24 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: bundler