morpheus-cli 4.1.14 → 4.2
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.
- checksums.yaml +4 -4
- data/Dockerfile +1 -1
- data/lib/morpheus/api/api_client.rb +4 -0
- data/lib/morpheus/api/library_container_types_interface.rb +1 -1
- data/lib/morpheus/api/library_instance_types_interface.rb +7 -7
- data/lib/morpheus/api/library_layouts_interface.rb +1 -1
- data/lib/morpheus/api/network_routers_interface.rb +101 -0
- data/lib/morpheus/api/tasks_interface.rb +12 -14
- data/lib/morpheus/cli.rb +1 -0
- data/lib/morpheus/cli/apps.rb +15 -12
- data/lib/morpheus/cli/cli_command.rb +40 -2
- data/lib/morpheus/cli/clusters.rb +13 -7
- data/lib/morpheus/cli/cypher_command.rb +5 -2
- data/lib/morpheus/cli/hosts.rb +1 -1
- data/lib/morpheus/cli/instances.rb +21 -5
- data/lib/morpheus/cli/jobs_command.rb +83 -27
- data/lib/morpheus/cli/library_cluster_layouts_command.rb +12 -12
- data/lib/morpheus/cli/library_container_scripts_command.rb +52 -40
- data/lib/morpheus/cli/library_container_types_command.rb +2 -60
- data/lib/morpheus/cli/library_instance_types_command.rb +22 -1
- data/lib/morpheus/cli/library_layouts_command.rb +65 -65
- data/lib/morpheus/cli/library_option_lists_command.rb +72 -59
- data/lib/morpheus/cli/library_option_types_command.rb +30 -186
- data/lib/morpheus/cli/library_spec_templates_command.rb +39 -64
- data/lib/morpheus/cli/mixins/library_helper.rb +213 -0
- data/lib/morpheus/cli/mixins/provisioning_helper.rb +89 -37
- data/lib/morpheus/cli/mixins/whoami_helper.rb +16 -1
- data/lib/morpheus/cli/network_routers_command.rb +1281 -0
- data/lib/morpheus/cli/networks_command.rb +164 -72
- data/lib/morpheus/cli/option_types.rb +187 -73
- data/lib/morpheus/cli/price_sets_command.rb +4 -4
- data/lib/morpheus/cli/prices_command.rb +15 -15
- data/lib/morpheus/cli/remote.rb +3 -3
- data/lib/morpheus/cli/service_plans_command.rb +17 -8
- data/lib/morpheus/cli/tasks.rb +437 -169
- data/lib/morpheus/cli/version.rb +1 -1
- data/lib/morpheus/formatters.rb +8 -0
- metadata +6 -3
data/lib/morpheus/cli/hosts.rb
CHANGED
@@ -1321,7 +1321,7 @@ class Morpheus::Cli::Hosts
|
|
1321
1321
|
payload = {}
|
1322
1322
|
# i guess you must pass an option if there are editable options
|
1323
1323
|
# any option, heh
|
1324
|
-
task_types = @tasks_interface.
|
1324
|
+
task_types = @tasks_interface.list_types()
|
1325
1325
|
editable_options = []
|
1326
1326
|
workflow['taskSetTasks'].sort{|a,b| a['taskOrder'] <=> b['taskOrder']}.each do |task_set_task|
|
1327
1327
|
task_type_id = task_set_task['task']['taskType']['id']
|
@@ -54,6 +54,7 @@ class Morpheus::Cli::Instances
|
|
54
54
|
|
55
55
|
def list(args)
|
56
56
|
options = {}
|
57
|
+
params = {}
|
57
58
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
58
59
|
opts.banner = subcommand_usage()
|
59
60
|
opts.on( '-g', '--group GROUP', "Group Name or ID" ) do |val|
|
@@ -71,6 +72,10 @@ class Morpheus::Cli::Instances
|
|
71
72
|
opts.on('--details', "Display more details: memory and storage usage used / max values." ) do
|
72
73
|
options[:details] = true
|
73
74
|
end
|
75
|
+
opts.on('--status STATUS', "Filter by status i.e. provisioning,running,starting,stopping") do |val|
|
76
|
+
params['status'] ||= []
|
77
|
+
params['status'] << val
|
78
|
+
end
|
74
79
|
opts.on('--pending-removal', "Include instances pending removal.") do
|
75
80
|
options[:pendingRemoval] = true
|
76
81
|
end
|
@@ -83,7 +88,6 @@ class Morpheus::Cli::Instances
|
|
83
88
|
raise_command_error "wrong number of arguments, expected 0 and got (#{args.count}) #{args}\n#{optparse}"
|
84
89
|
end
|
85
90
|
begin
|
86
|
-
params = {}
|
87
91
|
params.merge!(parse_list_options(options))
|
88
92
|
group = options[:group] ? find_group_by_name_or_id_for_provisioning(options[:group]) : nil
|
89
93
|
if group
|
@@ -333,6 +337,12 @@ class Morpheus::Cli::Instances
|
|
333
337
|
opts.on("--workflow ID", String, "Automation: Workflow ID") do |val|
|
334
338
|
options[:workflow_id] = val
|
335
339
|
end
|
340
|
+
opts.on("--ports ARRAY", String, "Exposed Ports, JSON formatted list of objects containing name and port") do |val|
|
341
|
+
# expects format like --ports '[{"name":"web","port":8080}]'
|
342
|
+
ports_array = JSON.parse(val)
|
343
|
+
options[:ports] = ports_array
|
344
|
+
options[:options]['ports'] = ports_array
|
345
|
+
end
|
336
346
|
# opts.on('-L', "--lb", "Enable Load Balancer") do
|
337
347
|
# options[:enable_load_balancer] = true
|
338
348
|
# end
|
@@ -342,10 +352,10 @@ class Morpheus::Cli::Instances
|
|
342
352
|
opts.on("--user-group USERGROUP", String, "User Config: User Group") do |val|
|
343
353
|
options[:user_group_id] = val
|
344
354
|
end
|
345
|
-
opts.on("--shutdown-days
|
346
|
-
options[:
|
355
|
+
opts.on("--shutdown-days DAYS", Integer, "Automation: Shutdown Days") do |val|
|
356
|
+
options[:shutdown_days] = val.to_i
|
347
357
|
end
|
348
|
-
opts.on("--expire-days
|
358
|
+
opts.on("--expire-days DAYS", Integer, "Automation: Expiration Days") do |val|
|
349
359
|
options[:expire_days] = val.to_i
|
350
360
|
end
|
351
361
|
opts.on("--create-backup [on|off]", String, "Automation: Create Backups.") do |val|
|
@@ -493,6 +503,12 @@ class Morpheus::Cli::Instances
|
|
493
503
|
opts.on('--created-by ID', String, "Created By User ID") do |val|
|
494
504
|
options[:created_by_id] = val
|
495
505
|
end
|
506
|
+
# opts.on("--shutdown-days [DAYS]", Integer, "Automation: Shutdown Days") do |val|
|
507
|
+
# params['shutdownDays'] = val.to_s.empty? ? nil : val.to_i
|
508
|
+
# end
|
509
|
+
# opts.on("--expire-days DAYS", Integer, "Automation: Expiration Days") do |val|
|
510
|
+
# params['expireDays'] = val.to_s.empty? ? nil : val.to_i
|
511
|
+
# end
|
496
512
|
build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
|
497
513
|
end
|
498
514
|
optparse.parse!(args)
|
@@ -2844,7 +2860,7 @@ class Morpheus::Cli::Instances
|
|
2844
2860
|
connect(options)
|
2845
2861
|
instance = find_instance_by_name_or_id(args[0])
|
2846
2862
|
workflow = find_workflow_by_name_or_id(args[1])
|
2847
|
-
task_types = @tasks_interface.
|
2863
|
+
task_types = @tasks_interface.list_types()
|
2848
2864
|
editable_options = []
|
2849
2865
|
workflow['taskSetTasks'].sort{|a,b| a['taskOrder'] <=> b['taskOrder']}.each do |task_set_task|
|
2850
2866
|
task_type_id = task_set_task['task']['taskType']['id']
|
@@ -172,13 +172,22 @@ class Morpheus::Cli::JobsCommand
|
|
172
172
|
print_h1 title, subtitles
|
173
173
|
|
174
174
|
job = json_response['job']
|
175
|
-
|
175
|
+
schedule_name = ''
|
176
176
|
if !job['scheduleMode'].nil?
|
177
177
|
if job['scheduleMode'] == 'manual'
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
178
|
+
schedule_name = 'Manual'
|
179
|
+
elsif job['scheduleMode'].to_s.downcase == 'datetime'
|
180
|
+
schedule_name = ("Date and Time - " + (format_local_dt(job['dateTime']).to_s rescue 'n/a'))
|
181
|
+
elsif job['scheduleMode'].to_s == ''
|
182
|
+
schedule_name = 'n/a' # should not happen
|
183
|
+
else
|
184
|
+
begin
|
185
|
+
schedule = @execute_schedules_interface.get(job['scheduleMode'])['schedule']
|
186
|
+
schedule_name = schedule ? schedule['name'] : ''
|
187
|
+
rescue => ex
|
188
|
+
Morpheus::Logging::DarkPrinter.puts "Failed to load schedule name" if Morpheus::Logging.debug?
|
189
|
+
schedule_name = 'n/a'
|
190
|
+
end
|
182
191
|
end
|
183
192
|
end
|
184
193
|
|
@@ -189,7 +198,7 @@ class Morpheus::Cli::JobsCommand
|
|
189
198
|
"Job Type" => lambda {|it| it['type']['name']},
|
190
199
|
"Enabled" => lambda {|it| format_boolean(it['enabled'])},
|
191
200
|
(job['workflow'] ? 'Workflow' : 'Task') => lambda {|it| it['jobSummary']},
|
192
|
-
"Schedule" => lambda {|it|
|
201
|
+
"Schedule" => lambda {|it| schedule_name}
|
193
202
|
}
|
194
203
|
|
195
204
|
if job['targetType']
|
@@ -263,6 +272,10 @@ class Morpheus::Cli::JobsCommand
|
|
263
272
|
opts.on('-R', '--run [on|off]', String, "Can be used to run the job now.") do |val|
|
264
273
|
params['run'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
|
265
274
|
end
|
275
|
+
opts.on('--date-time DATETIME', String, "Can be used to run schedule at a specific date and time. Use UTC time in the format 2020-02-15T05:00:00Z. This sets scheduleMode to 'dateTime'.") do |val|
|
276
|
+
options[:schedule] = 'dateTime'
|
277
|
+
params['dateTime'] = val.to_s
|
278
|
+
end
|
266
279
|
build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote, :quiet])
|
267
280
|
opts.footer = "Create job."
|
268
281
|
end
|
@@ -274,9 +287,11 @@ class Morpheus::Cli::JobsCommand
|
|
274
287
|
end
|
275
288
|
|
276
289
|
begin
|
277
|
-
|
290
|
+
if options[:payload]
|
291
|
+
payload = parse_payload(options, 'job')
|
292
|
+
else
|
293
|
+
apply_options(params, options)
|
278
294
|
|
279
|
-
if !payload
|
280
295
|
# name
|
281
296
|
params['name'] = params['name'] || args[0] || name = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'name', 'type' => 'text', 'fieldLabel' => 'Job Name', 'required' => true, 'description' => 'Job Name.'}],options[:options],@api_client,{})['name']
|
282
297
|
|
@@ -290,11 +305,9 @@ class Morpheus::Cli::JobsCommand
|
|
290
305
|
|
291
306
|
# prompt task / workflow
|
292
307
|
if job_type['code'] == 'morpheus.task'
|
293
|
-
|
294
|
-
params['task'] = {'id' => task_id}
|
308
|
+
params['task'] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'task.id', 'fieldLabel' => 'Task', 'type' => 'select', 'required' => true, 'optionSource' => 'tasks'}], options[:options], @api_client, {})['task']
|
295
309
|
else
|
296
|
-
|
297
|
-
params['workflow'] = {'id' => workflow_id}
|
310
|
+
params['workflow'] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'workflow.id', 'fieldLabel' => 'Workflow', 'type' => 'select', 'required' => true, 'optionSource' => 'operationTaskSets'}], options[:options], @api_client, {})['workflow']
|
298
311
|
end
|
299
312
|
end
|
300
313
|
|
@@ -328,7 +341,7 @@ class Morpheus::Cli::JobsCommand
|
|
328
341
|
|
329
342
|
# context type
|
330
343
|
if params['targetType'].nil?
|
331
|
-
params['targetType'] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => '
|
344
|
+
params['targetType'] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'targetType', 'fieldLabel' => 'Context Type', 'type' => 'select', 'required' => true, 'selectOptions' => job_options['targetTypes'], 'defaultValue' => job_options['targetTypes'].first['name']}], options[:options], @api_client, {})['targetType']
|
332
345
|
end
|
333
346
|
|
334
347
|
# contexts
|
@@ -356,19 +369,28 @@ class Morpheus::Cli::JobsCommand
|
|
356
369
|
|
357
370
|
# schedule
|
358
371
|
if options[:schedule].nil?
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
schedule = job_options['schedules'].find {|it| it['name'] == options[:schedule] || it['value'] == options[:schedule].to_i}
|
372
|
+
options[:schedule] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'scheduleMode', 'fieldLabel' => "Schedule", 'type' => 'select', 'required' => true, 'selectOptions' => job_options['schedules'], 'defaultValue' => job_options['schedules'].first['name']}], options[:options], @api_client, {})['scheduleMode']
|
373
|
+
params['scheduleMode'] = options[:schedule]
|
374
|
+
end
|
363
375
|
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
376
|
+
if options[:schedule] == 'manual'
|
377
|
+
# cool
|
378
|
+
elsif options[:schedule].to_s.downcase == 'datetime'
|
379
|
+
# prompt for dateTime
|
380
|
+
if params['dateTime'].nil?
|
381
|
+
params['dateTime'] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'dateTime', 'fieldLabel' => "Date and Time", 'type' => 'text', 'required' => true}], options[:options], @api_client, {}, options[:no_prompt], true)['dateTime']
|
369
382
|
end
|
370
|
-
|
383
|
+
elsif options[:schedule].to_s != ''
|
384
|
+
# ok they passed a schedule name or id
|
385
|
+
schedule = job_options['schedules'].find {|it| it['name'] == options[:schedule] || it['value'] == options[:schedule].to_i}
|
386
|
+
|
387
|
+
if schedule.nil?
|
388
|
+
print_red_alert "Schedule #{options[:schedule]} not found"
|
389
|
+
exit 1
|
390
|
+
end
|
391
|
+
options[:schedule] = schedule['value']
|
371
392
|
end
|
393
|
+
params['scheduleMode'] = options[:schedule]
|
372
394
|
|
373
395
|
# custom config
|
374
396
|
if params['customConfig'].nil? && job_options['allowCustomConfig']
|
@@ -446,7 +468,11 @@ class Morpheus::Cli::JobsCommand
|
|
446
468
|
opts.on('-R', '--run [on|off]', String, "Can be used to run the job now.") do |val|
|
447
469
|
params['run'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
|
448
470
|
end
|
449
|
-
|
471
|
+
opts.on('--date-time DATETIME', String, "Can be used to run schedule at a specific date and time. Use UTC time in the format 2020-02-15T05:00:00Z. This sets scheduleMode to 'dateTime'.") do |val|
|
472
|
+
options[:schedule] = 'dateTime'
|
473
|
+
params['dateTime'] = val.to_s
|
474
|
+
end
|
475
|
+
build_common_options(opts, options, [:options, :payload, :list, :query, :json, :yaml, :csv, :fields, :dry_run, :remote])
|
450
476
|
opts.footer = "Update job.\n" +
|
451
477
|
"[job] is required. Job ID or name"
|
452
478
|
end
|
@@ -465,9 +491,11 @@ class Morpheus::Cli::JobsCommand
|
|
465
491
|
exit 1
|
466
492
|
end
|
467
493
|
|
468
|
-
|
494
|
+
if options[:payload]
|
495
|
+
payload = parse_payload(options, 'job')
|
496
|
+
else
|
497
|
+
apply_options(params, options)
|
469
498
|
|
470
|
-
if !payload
|
471
499
|
job_type_id = job['type']['id']
|
472
500
|
|
473
501
|
if !options[:task].nil?
|
@@ -507,7 +535,7 @@ class Morpheus::Cli::JobsCommand
|
|
507
535
|
end
|
508
536
|
|
509
537
|
if !options[:schedule].nil?
|
510
|
-
if options[:schedule] != 'manual'
|
538
|
+
if options[:schedule] != 'manual' && options[:schedule].to_s.downcase != 'datetime'
|
511
539
|
job_options = @jobs_interface.options(job_type_id)
|
512
540
|
schedule = job_options['schedules'].find {|it| it['name'] == options[:schedule] || it['value'] == options[:schedule].to_i}
|
513
541
|
|
@@ -519,6 +547,34 @@ class Morpheus::Cli::JobsCommand
|
|
519
547
|
end
|
520
548
|
params['scheduleMode'] = options[:schedule]
|
521
549
|
end
|
550
|
+
|
551
|
+
|
552
|
+
# schedule
|
553
|
+
if !options[:schedule].nil?
|
554
|
+
|
555
|
+
|
556
|
+
if options[:schedule] == 'manual'
|
557
|
+
# cool
|
558
|
+
elsif options[:schedule].to_s.downcase == 'datetime'
|
559
|
+
# prompt for dateTime
|
560
|
+
if params['dateTime'].nil?
|
561
|
+
raise_command_error "--date-time is required for schedule '#{options[:schedule]}'\n#{optparse}"
|
562
|
+
end
|
563
|
+
elsif options[:schedule].to_s != ''
|
564
|
+
job_options = @jobs_interface.options(job_type_id)
|
565
|
+
options[:schedule] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'schedule', 'fieldLabel' => "Schedule", 'type' => 'select', 'required' => true, 'selectOptions' => job_options['schedules'], 'defaultValue' => job_options['schedules'].first['name']}], options[:options], @api_client, {})['schedule']
|
566
|
+
params['scheduleMode'] = options[:schedule]
|
567
|
+
# ok they passed a schedule name or id
|
568
|
+
schedule = job_options['schedules'].find {|it| it['name'] == options[:schedule] || it['value'] == options[:schedule].to_i}
|
569
|
+
|
570
|
+
if schedule.nil?
|
571
|
+
print_red_alert "Schedule #{options[:schedule]} not found"
|
572
|
+
exit 1
|
573
|
+
end
|
574
|
+
options[:schedule] = schedule['value']
|
575
|
+
end
|
576
|
+
end
|
577
|
+
|
522
578
|
payload = {'job' => params}
|
523
579
|
end
|
524
580
|
|
@@ -295,17 +295,17 @@ class Morpheus::Cli::LibraryClusterLayoutsCommand
|
|
295
295
|
|
296
296
|
# prompt for options
|
297
297
|
if params['name'].nil?
|
298
|
-
params['name'] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => '
|
298
|
+
params['name'] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'name', 'type' => 'text', 'fieldLabel' => 'Name', 'required' => true}], options[:options], @api_client,{})['name']
|
299
299
|
end
|
300
300
|
|
301
301
|
# version
|
302
302
|
if params['computeVersion'].nil?
|
303
|
-
params['computeVersion'] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => '
|
303
|
+
params['computeVersion'] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'computeVersion', 'type' => 'text', 'fieldLabel' => 'Version', 'required' => true}], options[:options], @api_client,{})['computeVersion']
|
304
304
|
end
|
305
305
|
|
306
306
|
# description
|
307
307
|
if params['description'].nil?
|
308
|
-
params['description'] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => '
|
308
|
+
params['description'] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'description', 'type' => 'text', 'fieldLabel' => 'Description', 'required' => false}], options[:options], @api_client,{})['description']
|
309
309
|
end
|
310
310
|
|
311
311
|
# creatable
|
@@ -322,7 +322,7 @@ class Morpheus::Cli::LibraryClusterLayoutsCommand
|
|
322
322
|
end
|
323
323
|
else
|
324
324
|
cluster_type_options = cluster_types.collect {|type| {'name' => type['name'], 'value' => type['code']}}
|
325
|
-
cluster_type_code = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => '
|
325
|
+
cluster_type_code = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'groupType', 'type' => 'select', 'fieldLabel' => 'Cluster Type', 'required' => true, 'selectOptions' => cluster_type_options}], options[:options], @api_client,{}, nil, true)['groupType']
|
326
326
|
cluster_type = cluster_types.find {|type| type['code'] == cluster_type_code}
|
327
327
|
end
|
328
328
|
|
@@ -337,7 +337,7 @@ class Morpheus::Cli::LibraryClusterLayoutsCommand
|
|
337
337
|
end
|
338
338
|
else
|
339
339
|
provision_type_options = provision_types.collect {|type| {'name' => type['name'], 'value' => type['code']}}
|
340
|
-
provision_type_code = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => '
|
340
|
+
provision_type_code = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'provisionType', 'type' => 'select', 'fieldLabel' => 'Technology', 'required' => true, 'selectOptions' => provision_type_options}], options[:options], @api_client,{}, nil, true)['provisionType']
|
341
341
|
provision_type = provision_types.find {|type| type['code'] == provision_type_code}
|
342
342
|
end
|
343
343
|
|
@@ -345,7 +345,7 @@ class Morpheus::Cli::LibraryClusterLayoutsCommand
|
|
345
345
|
|
346
346
|
# min memory
|
347
347
|
if params['memoryRequirement'].nil?
|
348
|
-
memory = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => '
|
348
|
+
memory = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'memoryRequirement', 'type' => 'text', 'fieldLabel' => 'Minimum Memory (MB) [can use GB modifier]', 'required' => false, 'description' => 'Memory (MB)'}], options[:options], @api_client,{}, options[:no_prompt])['memoryRequirement']
|
349
349
|
|
350
350
|
if memory
|
351
351
|
bytes = parse_bytes_param(memory, 'minimum memory', 'MB')
|
@@ -363,7 +363,7 @@ class Morpheus::Cli::LibraryClusterLayoutsCommand
|
|
363
363
|
end
|
364
364
|
params['taskSets'] = [{'id' => task_set['id']}]
|
365
365
|
else
|
366
|
-
task_set_id = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => '
|
366
|
+
task_set_id = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'taskSets', 'fieldLabel' => 'Workflow', 'type' => 'select', 'required' => false, 'optionSource' => 'taskSets'}], options[:options], @api_client, {})['taskSets']
|
367
367
|
|
368
368
|
if task_set_id
|
369
369
|
params['taskSets'] = [{'id' => task_set_id.to_i}]
|
@@ -399,7 +399,7 @@ class Morpheus::Cli::LibraryClusterLayoutsCommand
|
|
399
399
|
avail_type_options = @options_types_interface.list({'max' => 1000})['optionTypes'].collect {|it| {'name' => it['name'], 'value' => it['id']}}
|
400
400
|
option_types = []
|
401
401
|
while !avail_type_options.empty? && Morpheus::Cli::OptionTypes.confirm("Add #{option_types.empty? ? '' : 'another '}option type?", {:default => false}) do
|
402
|
-
option_type_id = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => '
|
402
|
+
option_type_id = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'optionType', 'type' => 'select', 'fieldLabel' => 'Option Type', 'selectOptions' => avail_type_options, 'required' => false}],options[:options],@api_client,{}, options[:no_prompt], true)['optionType']
|
403
403
|
|
404
404
|
if option_type_id
|
405
405
|
option_types << {'id' => option_type_id.to_i}
|
@@ -437,9 +437,9 @@ class Morpheus::Cli::LibraryClusterLayoutsCommand
|
|
437
437
|
else
|
438
438
|
avail_container_types = @library_container_types_interface.list(nil, {'technology' => provision_type['code'], 'max' => 1000})['containerTypes'].collect {|it| {'name' => it['name'], 'value' => it['id']}}
|
439
439
|
while !avail_container_types.empty? && Morpheus::Cli::OptionTypes.confirm("Add #{nodes.empty? ? '' : 'another '}#{node_type} node?", {:default => false}) do
|
440
|
-
container_type_id = Morpheus::Cli::OptionTypes.prompt([{'fieldName' =>
|
441
|
-
node_count = Morpheus::Cli::OptionTypes.prompt([{'fieldName' =>
|
442
|
-
priority = Morpheus::Cli::OptionTypes.prompt([{'fieldName' =>
|
440
|
+
container_type_id = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => "#{node_type}ContainerType", 'type' => 'select', 'fieldLabel' => "#{node_type.capitalize} Node", 'selectOptions' => avail_container_types, 'required' => true}],options[:options],@api_client,{}, options[:no_prompt], true)["#{node_type}ContainerType"]
|
441
|
+
node_count = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => "#{node_type}NodeCount", 'type' => 'number', 'fieldLabel' => "#{node_type.capitalize} Node Count", 'required' => true, 'defaultValue' => 1}], options[:options], @api_client, {}, options[:no_prompt])["#{node_type}NodeCount"]
|
442
|
+
priority = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => "#{node_type}Priority", 'type' => 'number', 'fieldLabel' => "#{node_type.capitalize} Priority", 'required' => true, 'defaultValue' => priority}], options[:options], @api_client, {}, options[:no_prompt])["#{node_type}Priority"]
|
443
443
|
nodes << {'nodeCount' => node_count, 'priorityOrder' => priority, 'containerType' => {'id' => container_type_id.to_i}}
|
444
444
|
avail_container_types.reject! {|it| it['value'] == container_type_id}
|
445
445
|
end
|
@@ -863,7 +863,7 @@ class Morpheus::Cli::LibraryClusterLayoutsCommand
|
|
863
863
|
end
|
864
864
|
|
865
865
|
def prompt_evar(options)
|
866
|
-
name = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => '
|
866
|
+
name = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'name', 'type' => 'text', 'fieldLabel' => 'Variable Name', 'required' => true}], options[:options], @api_client,{})['name']
|
867
867
|
value = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'value', 'type' => 'text', 'fieldLabel' => 'Variable Value', 'required' => false}], options[:options], @api_client,{})['value']
|
868
868
|
masked = Morpheus::Cli::OptionTypes.confirm("Variable Masked?", {:default => false}) == true
|
869
869
|
export = Morpheus::Cli::OptionTypes.confirm("Variable Label?", {:default => false}) == true
|
@@ -28,7 +28,7 @@ class Morpheus::Cli::LibraryContainerScriptsCommand
|
|
28
28
|
connect(options)
|
29
29
|
if args.count > 0
|
30
30
|
print_error Morpheus::Terminal.angry_prompt
|
31
|
-
puts_error "wrong number of arguments, expected 0 and got (#{args.count}) #{args.
|
31
|
+
puts_error "wrong number of arguments, expected 0 and got (#{args.count}) #{args.join(', ')}\n#{optparse}"
|
32
32
|
return 1
|
33
33
|
end
|
34
34
|
begin
|
@@ -122,10 +122,11 @@ class Morpheus::Cli::LibraryContainerScriptsCommand
|
|
122
122
|
"Name" => lambda {|it| it['name'] },
|
123
123
|
"Type" => lambda {|it| format_container_script_type(it['scriptType']) },
|
124
124
|
"Phase" => lambda {|it| format_container_script_phase(it['scriptPhase']) },
|
125
|
+
"Run As User" => lambda {|it| it['runAsUser'] },
|
126
|
+
"Sudo" => lambda {|it| format_boolean(it['sudoUser']) },
|
125
127
|
"Owner" => lambda {|it| it['account'] ? it['account']['name'] : '' },
|
126
|
-
|
127
|
-
|
128
|
-
# "Updated" => lambda {|it| format_local_dt(it['lastUpdated']) }
|
128
|
+
"Created" => lambda {|it| format_local_dt(it['dateCreated']) },
|
129
|
+
"Updated" => lambda {|it| format_local_dt(it['lastUpdated']) }
|
129
130
|
}
|
130
131
|
print_description_list(description_cols, container_script)
|
131
132
|
|
@@ -144,22 +145,19 @@ class Morpheus::Cli::LibraryContainerScriptsCommand
|
|
144
145
|
end
|
145
146
|
|
146
147
|
def add(args)
|
148
|
+
params = {} # {'scriptType' => 'bash', 'scriptPhase' => 'provision'}
|
147
149
|
options = {}
|
148
|
-
params = {'scriptType' => 'bash', 'scriptPhase' => 'provision'}
|
149
150
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
150
151
|
opts.banner = subcommand_usage("[name]")
|
151
152
|
opts.on('--name VALUE', String, "Name") do |val|
|
152
153
|
params['name'] = val
|
153
154
|
end
|
154
|
-
opts.on('--type
|
155
|
+
opts.on('-t', '--type TYPE', "Script Type. i.e. bash, powershell. Default is bash.") do |val|
|
155
156
|
params['scriptType'] = val
|
156
157
|
end
|
157
|
-
opts.on('--phase
|
158
|
+
opts.on('--phase PHASE', String, "Script Phase. i.e. start, stop, preProvision, provision, postProvision, preDeploy, deploy, reconfigure, teardown. Default is provision.") do |val|
|
158
159
|
params['scriptPhase'] = val
|
159
|
-
end
|
160
|
-
opts.on('--category VALUE', String, "Category") do |val|
|
161
|
-
params['category'] = val
|
162
|
-
end
|
160
|
+
end
|
163
161
|
opts.on('--script TEXT', String, "Contents of the script.") do |val|
|
164
162
|
params['script'] = val
|
165
163
|
end
|
@@ -176,8 +174,14 @@ class Morpheus::Cli::LibraryContainerScriptsCommand
|
|
176
174
|
params['name'] = File.basename(full_filename)
|
177
175
|
end
|
178
176
|
end
|
179
|
-
|
180
|
-
|
177
|
+
opts.on("--sudo [on|off]", String, "Run with sudo") do |val|
|
178
|
+
params['sudoUser'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
|
179
|
+
end
|
180
|
+
opts.on("--run-as-user VALUE", String, "Run as user") do |val|
|
181
|
+
params['runAsUser'] = val
|
182
|
+
end
|
183
|
+
# opts.on("--run-as-password VALUE", String, "Run as password") do |val|
|
184
|
+
# params['runAsPassword'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
|
181
185
|
# end
|
182
186
|
build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote, :quiet])
|
183
187
|
opts.footer = "Create a new container script." + "\n" +
|
@@ -188,22 +192,27 @@ class Morpheus::Cli::LibraryContainerScriptsCommand
|
|
188
192
|
if args[0]
|
189
193
|
params['name'] = args[0]
|
190
194
|
end
|
191
|
-
if !params['name']
|
192
|
-
print_error Morpheus::Terminal.angry_prompt
|
193
|
-
puts_error "wrong number of arguments, expected 0-1 and got (#{args.count}) #{args.inspect}\n#{optparse}"
|
194
|
-
return 1
|
195
|
-
end
|
196
195
|
connect(options)
|
197
196
|
begin
|
198
|
-
# construct payload
|
199
197
|
payload = nil
|
198
|
+
arbitrary_options = options[:options] ? options[:options].reject {|k,v| k.is_a?(Symbol) } : {}
|
199
|
+
create_payload = {}
|
200
|
+
create_payload.deep_merge!(params)
|
201
|
+
create_payload.deep_merge!(arbitrary_options)
|
200
202
|
if options[:payload]
|
201
203
|
payload = options[:payload]
|
204
|
+
payload.deep_merge!({'containerScript' => create_payload}) unless create_payload.empty?
|
202
205
|
else
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
206
|
+
prompt_result = Morpheus::Cli::OptionTypes.prompt([
|
207
|
+
{'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true},
|
208
|
+
{'fieldName' => 'scriptType', 'fieldLabel' => 'Type', 'type' => 'select', 'optionSource' => 'scriptTypes', 'defaultValue' => 'bash', 'required' => true},
|
209
|
+
{'fieldName' => 'scriptPhase', 'fieldLabel' => 'Phase', 'type' => 'select', 'optionSource' => 'containerPhases', 'defaultValue' => 'provision', 'required' => true},
|
210
|
+
{'fieldName' => 'script', 'fieldLabel' => 'Script', 'type' => 'code-editor', 'required' => true},
|
211
|
+
{'fieldName' => 'runAsUser', 'fieldLabel' => 'Run As User', 'type' => 'text'},
|
212
|
+
{'fieldName' => 'sudoUser', 'fieldLabel' => 'Sudo', 'type' => 'checkbox', 'defaultValue' => false},
|
213
|
+
], params.deep_merge(options[:options] || {}), @api_client)
|
214
|
+
create_payload.deep_merge!(prompt_result)
|
215
|
+
payload = {'containerScript' => create_payload}
|
207
216
|
end
|
208
217
|
@container_scripts_interface.setopts(options)
|
209
218
|
if options[:dry_run]
|
@@ -234,21 +243,12 @@ class Morpheus::Cli::LibraryContainerScriptsCommand
|
|
234
243
|
opts.on('--name VALUE', String, "Name") do |val|
|
235
244
|
params['name'] = val
|
236
245
|
end
|
237
|
-
|
238
|
-
# params['code'] = val
|
239
|
-
# end
|
240
|
-
# opts.on('--description VALUE', String, "Description") do |val|
|
241
|
-
# params['description'] = val
|
242
|
-
# end
|
243
|
-
opts.on('--type [bash|powershell]', String, "Script Type") do |val|
|
246
|
+
opts.on('-t', '--type TYPE', "Script Type. i.e. bash, powershell. Default is bash.") do |val|
|
244
247
|
params['scriptType'] = val
|
245
248
|
end
|
246
|
-
opts.on('--phase
|
249
|
+
opts.on('--phase PHASE', String, "Script Phase. i.e. start, stop, preProvision, provision, postProvision, preDeploy, deploy, reconfigure, teardown. Default is provision.") do |val|
|
247
250
|
params['scriptPhase'] = val
|
248
|
-
end
|
249
|
-
opts.on('--category VALUE', String, "Category") do |val|
|
250
|
-
params['category'] = val
|
251
|
-
end
|
251
|
+
end
|
252
252
|
opts.on('--script TEXT', String, "Contents of the script.") do |val|
|
253
253
|
params['script'] = val
|
254
254
|
end
|
@@ -261,8 +261,14 @@ class Morpheus::Cli::LibraryContainerScriptsCommand
|
|
261
261
|
exit 1
|
262
262
|
end
|
263
263
|
end
|
264
|
-
|
265
|
-
|
264
|
+
opts.on("--sudo [on|off]", String, "Run with sudo") do |val|
|
265
|
+
params['sudoUser'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
|
266
|
+
end
|
267
|
+
opts.on("--run-as-user VALUE", String, "Run as user") do |val|
|
268
|
+
params['runAsUser'] = val
|
269
|
+
end
|
270
|
+
# opts.on("--run-as-password VALUE", String, "Run as password") do |val|
|
271
|
+
# params['runAsPassword'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
|
266
272
|
# end
|
267
273
|
build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote, :quiet])
|
268
274
|
opts.footer = "Update a container script." + "\n" +
|
@@ -271,7 +277,7 @@ class Morpheus::Cli::LibraryContainerScriptsCommand
|
|
271
277
|
optparse.parse!(args)
|
272
278
|
if args.count != 1
|
273
279
|
print_error Morpheus::Terminal.angry_prompt
|
274
|
-
puts_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args.
|
280
|
+
puts_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args.join(', ')}\n#{optparse}"
|
275
281
|
return 1
|
276
282
|
end
|
277
283
|
connect(options)
|
@@ -284,10 +290,16 @@ class Morpheus::Cli::LibraryContainerScriptsCommand
|
|
284
290
|
payload = nil
|
285
291
|
if options[:payload]
|
286
292
|
payload = options[:payload]
|
293
|
+
params.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
|
294
|
+
payload.deep_merge!({'containerScript' => params}) unless params.empty?
|
287
295
|
else
|
288
|
-
#
|
296
|
+
# update without prompting
|
289
297
|
params.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
|
290
|
-
|
298
|
+
script_payload = params
|
299
|
+
if script_payload.empty?
|
300
|
+
raise_command_error "Specify at least one option to update.\n#{optparse}"
|
301
|
+
end
|
302
|
+
payload = {'containerScript' => script_payload}
|
291
303
|
end
|
292
304
|
@container_scripts_interface.setopts(options)
|
293
305
|
if options[:dry_run]
|