morpheus-cli 5.3.0.3 → 5.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Dockerfile +1 -1
- data/README.md +1 -3
- data/lib/morpheus/api/api_client.rb +48 -14
- data/lib/morpheus/api/certificate_types_interface.rb +14 -0
- data/lib/morpheus/api/certificates_interface.rb +9 -0
- data/lib/morpheus/api/integration_types_interface.rb +14 -0
- data/lib/morpheus/api/integrations_interface.rb +7 -22
- data/lib/morpheus/api/network_services_interface.rb +14 -0
- data/lib/morpheus/api/read_interface.rb +23 -0
- data/lib/morpheus/api/rest_interface.rb +12 -10
- data/lib/morpheus/api/roles_interface.rb +7 -0
- data/lib/morpheus/api/servers_interface.rb +7 -0
- data/lib/morpheus/api/user_settings_interface.rb +38 -18
- data/lib/morpheus/api/vdi_allocations_interface.rb +9 -0
- data/lib/morpheus/api/vdi_apps_interface.rb +9 -0
- data/lib/morpheus/api/vdi_gateways_interface.rb +9 -0
- data/lib/morpheus/api/vdi_interface.rb +28 -0
- data/lib/morpheus/api/vdi_pools_interface.rb +19 -0
- data/lib/morpheus/cli.rb +9 -2
- data/lib/morpheus/cli/apps.rb +59 -75
- data/lib/morpheus/cli/catalog_item_types_command.rb +13 -13
- data/lib/morpheus/cli/certificates_command.rb +575 -0
- data/lib/morpheus/cli/cli_command.rb +61 -6
- data/lib/morpheus/cli/clouds.rb +1 -0
- data/lib/morpheus/cli/clusters.rb +1 -1
- data/lib/morpheus/cli/commands/standard/man_command.rb +4 -5
- data/lib/morpheus/cli/hosts.rb +245 -224
- data/lib/morpheus/cli/instances.rb +150 -167
- data/lib/morpheus/cli/integrations_command.rb +588 -41
- data/lib/morpheus/cli/login.rb +7 -0
- data/lib/morpheus/cli/mixins/print_helper.rb +33 -18
- data/lib/morpheus/cli/mixins/provisioning_helper.rb +3 -3
- data/lib/morpheus/cli/mixins/vdi_helper.rb +246 -0
- data/lib/morpheus/cli/network_routers_command.rb +22 -9
- data/lib/morpheus/cli/networks_command.rb +2 -2
- data/lib/morpheus/cli/option_types.rb +34 -33
- data/lib/morpheus/cli/remote.rb +1 -1
- data/lib/morpheus/cli/reports_command.rb +4 -1
- data/lib/morpheus/cli/roles.rb +215 -55
- data/lib/morpheus/cli/subnets_command.rb +11 -2
- data/lib/morpheus/cli/user_settings_command.rb +268 -57
- data/lib/morpheus/cli/vdi_allocations_command.rb +159 -0
- data/lib/morpheus/cli/vdi_apps_command.rb +317 -0
- data/lib/morpheus/cli/vdi_command.rb +359 -0
- data/lib/morpheus/cli/vdi_gateways_command.rb +290 -0
- data/lib/morpheus/cli/vdi_pools_command.rb +571 -0
- data/lib/morpheus/cli/version.rb +1 -1
- data/lib/morpheus/rest_client.rb +30 -0
- data/lib/morpheus/terminal.rb +15 -7
- metadata +18 -2
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'morpheus/api/api_client'
|
2
|
+
|
3
|
+
# Interface for VDI Persona that provides viewing and allocating virtual desktops (VDI pools)
|
4
|
+
class Morpheus::VdiInterface < Morpheus::APIClient
|
5
|
+
|
6
|
+
def base_path
|
7
|
+
"/api/vdi"
|
8
|
+
end
|
9
|
+
|
10
|
+
# def dashboard(params={})
|
11
|
+
# execute(method: :get, url: "#{base_path}/dashboard", params: params)
|
12
|
+
# end
|
13
|
+
|
14
|
+
def list(params={})
|
15
|
+
execute(method: :get, url: "#{base_path}", params: params)
|
16
|
+
end
|
17
|
+
|
18
|
+
def get(id, params={})
|
19
|
+
validate_id!(id)
|
20
|
+
execute(method: :get, url: "#{base_path}/#{id}", params: params)
|
21
|
+
end
|
22
|
+
|
23
|
+
def allocate(id, payload, params={})
|
24
|
+
validate_id!(id)
|
25
|
+
execute(method: :post, url: "#{base_path}/#{id}/allocate", params: params, payload: payload.to_json)
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'morpheus/api/rest_interface'
|
2
|
+
|
3
|
+
class Morpheus::VdiPoolsInterface < Morpheus::RestInterface
|
4
|
+
|
5
|
+
def base_path
|
6
|
+
"/api/vdi-pools"
|
7
|
+
end
|
8
|
+
|
9
|
+
# NOT json, multipart file upload
|
10
|
+
def update_logo(id, logo_file)
|
11
|
+
url = "#{base_path}/#{id}/update-logo"
|
12
|
+
headers = { :params => {}, :authorization => "Bearer #{@access_token}"}
|
13
|
+
payload = {}
|
14
|
+
payload[:logo] = logo_file
|
15
|
+
payload[:multipart] = true
|
16
|
+
execute(method: :post, url: url, headers: headers, payload: payload)
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
data/lib/morpheus/cli.rb
CHANGED
@@ -46,6 +46,7 @@ module Morpheus
|
|
46
46
|
# load interfaces
|
47
47
|
require 'morpheus/api/api_client.rb'
|
48
48
|
require 'morpheus/api/rest_interface.rb'
|
49
|
+
require 'morpheus/api/read_interface.rb'
|
49
50
|
Dir[File.dirname(__FILE__) + "/api/**/*.rb"].each {|file| load file }
|
50
51
|
|
51
52
|
# load mixins
|
@@ -175,9 +176,15 @@ module Morpheus
|
|
175
176
|
load 'morpheus/cli/projects_command.rb'
|
176
177
|
load 'morpheus/cli/backups_command.rb'
|
177
178
|
load 'morpheus/cli/backup_jobs_command.rb'
|
178
|
-
load 'morpheus/cli/catalog_item_types_command.rb' #
|
179
|
-
load 'morpheus/cli/service_catalog_command.rb' # catalog
|
179
|
+
load 'morpheus/cli/catalog_item_types_command.rb' # self-service
|
180
|
+
load 'morpheus/cli/service_catalog_command.rb' # catalog (Service Catalog persona)
|
180
181
|
load 'morpheus/cli/usage_command.rb'
|
182
|
+
load 'morpheus/cli/vdi_pools_command.rb'
|
183
|
+
load 'morpheus/cli/vdi_allocations_command.rb'
|
184
|
+
load 'morpheus/cli/vdi_apps_command.rb'
|
185
|
+
load 'morpheus/cli/vdi_gateways_command.rb'
|
186
|
+
load 'morpheus/cli/vdi_command.rb' # (VDI persona)
|
187
|
+
load 'morpheus/cli/certificates_command.rb' # (VDI persona)
|
181
188
|
# add new commands here...
|
182
189
|
|
183
190
|
end
|
data/lib/morpheus/cli/apps.rb
CHANGED
@@ -88,7 +88,7 @@ class Morpheus::Cli::Apps
|
|
88
88
|
opts.on('-a', '--details', "Display all details: memory and storage usage used / max values." ) do
|
89
89
|
options[:details] = true
|
90
90
|
end
|
91
|
-
|
91
|
+
build_standard_list_options(opts, options)
|
92
92
|
opts.footer = "List apps."
|
93
93
|
end
|
94
94
|
optparse.parse!(args)
|
@@ -97,64 +97,53 @@ class Morpheus::Cli::Apps
|
|
97
97
|
options[:phrase] = args.join(" ")
|
98
98
|
end
|
99
99
|
connect(options)
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
end
|
100
|
+
|
101
|
+
if options[:type]
|
102
|
+
params['type'] = [options[:type]].flatten.collect {|it| it.to_s.strip.split(",") }.flatten.collect {|it| it.to_s.strip }
|
103
|
+
end
|
104
|
+
if options[:blueprint]
|
105
|
+
blueprint_ids = [options[:blueprint]].flatten.collect {|it| it.to_s.strip.split(",") }.flatten.collect {|it| it.to_s.strip }
|
106
|
+
params['blueprintId'] = blueprint_ids.collect do |blueprint_id|
|
107
|
+
if blueprint_id.to_s =~ /\A\d{1,}\Z/
|
108
|
+
return blueprint_id
|
109
|
+
else
|
110
|
+
blueprint = find_blueprint_by_name_or_id(blueprint_id)
|
111
|
+
return 1 if blueprint.nil?
|
112
|
+
blueprint['id']
|
114
113
|
end
|
115
114
|
end
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
115
|
+
end
|
116
|
+
if options[:owner]
|
117
|
+
owner_ids = [options[:owner]].flatten.collect {|it| it.to_s.strip.split(",") }.flatten.collect {|it| it.to_s.strip }
|
118
|
+
params['ownerId'] = owner_ids.collect do |owner_id|
|
119
|
+
if owner_id.to_s =~ /\A\d{1,}\Z/
|
120
|
+
return owner_id
|
121
|
+
else
|
122
|
+
user = find_available_user_option(owner_id)
|
123
|
+
return 1 if user.nil?
|
124
|
+
user['id']
|
126
125
|
end
|
127
126
|
end
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
params['showDeleted'] = options[:showDeleted] if options.key?(:showDeleted)
|
138
|
-
params['deleted'] = options[:deleted] if options.key?(:deleted)
|
127
|
+
end
|
128
|
+
params.merge!(parse_list_options(options))
|
129
|
+
account = nil
|
130
|
+
if options[:owner]
|
131
|
+
created_by_ids = find_all_user_ids(account ? account['id'] : nil, options[:owner])
|
132
|
+
return if created_by_ids.nil?
|
133
|
+
params['createdBy'] = created_by_ids
|
134
|
+
# params['ownerId'] = created_by_ids # 4.2.1+
|
135
|
+
end
|
139
136
|
|
140
|
-
|
141
|
-
|
142
|
-
print_dry_run @apps_interface.dry.list(params)
|
143
|
-
return
|
144
|
-
end
|
137
|
+
params['showDeleted'] = options[:showDeleted] if options.key?(:showDeleted)
|
138
|
+
params['deleted'] = options[:deleted] if options.key?(:deleted)
|
145
139
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
elsif options[:csv]
|
154
|
-
puts records_as_csv(json_response['apps'], options)
|
155
|
-
return 0
|
156
|
-
end
|
157
|
-
|
140
|
+
@apps_interface.setopts(options)
|
141
|
+
if options[:dry_run]
|
142
|
+
print_dry_run @apps_interface.dry.list(params)
|
143
|
+
return
|
144
|
+
end
|
145
|
+
json_response = @apps_interface.list(params)
|
146
|
+
render_response(json_response, options, "apps") do
|
158
147
|
apps = json_response['apps']
|
159
148
|
title = "Morpheus Apps"
|
160
149
|
subtitles = []
|
@@ -167,10 +156,8 @@ class Morpheus::Cli::Apps
|
|
167
156
|
print_results_pagination(json_response)
|
168
157
|
end
|
169
158
|
print reset,"\n"
|
170
|
-
rescue RestClient::Exception => e
|
171
|
-
print_rest_exception(e, options)
|
172
|
-
exit 1
|
173
159
|
end
|
160
|
+
return 0, nil
|
174
161
|
end
|
175
162
|
|
176
163
|
def count(args)
|
@@ -645,7 +632,7 @@ class Morpheus::Cli::Apps
|
|
645
632
|
opts.on('--refresh-until STATUS', String, "Refresh until a specified status is reached.") do |val|
|
646
633
|
options[:refresh_until_status] = val.to_s.downcase
|
647
634
|
end
|
648
|
-
|
635
|
+
build_standard_get_options(opts, options)
|
649
636
|
opts.footer = "Get details about an app.\n" +
|
650
637
|
"[app] is required. This is the name or id of an app. Supports 1-N [app] arguments."
|
651
638
|
end
|
@@ -665,19 +652,19 @@ class Morpheus::Cli::Apps
|
|
665
652
|
|
666
653
|
end
|
667
654
|
|
668
|
-
def _get(
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
655
|
+
def _get(id, options={})
|
656
|
+
app = nil
|
657
|
+
if id.to_s !~ /\A\d{1,}\Z/
|
658
|
+
app = find_app_by_name_or_id(id)
|
659
|
+
id = app['id']
|
660
|
+
end
|
661
|
+
@apps_interface.setopts(options)
|
662
|
+
if options[:dry_run]
|
663
|
+
print_dry_run @apps_interface.dry.get(id)
|
664
|
+
return
|
665
|
+
end
|
666
|
+
json_response = @apps_interface.get(id.to_i)
|
667
|
+
render_response(json_response, options, 'app') do
|
681
668
|
app = json_response['app']
|
682
669
|
app_tiers = app['appTiers']
|
683
670
|
print_h1 "App Details", [], options
|
@@ -799,14 +786,11 @@ class Morpheus::Cli::Apps
|
|
799
786
|
print cyan, "Refreshing in #{options[:refresh_interval] > 1 ? options[:refresh_interval].to_i : options[:refresh_interval]} seconds"
|
800
787
|
sleep_with_dots(options[:refresh_interval])
|
801
788
|
print "\n"
|
802
|
-
_get(
|
789
|
+
_get(app['id'], options)
|
803
790
|
end
|
804
791
|
end
|
805
|
-
|
806
|
-
rescue RestClient::Exception => e
|
807
|
-
print_rest_exception(e, options)
|
808
|
-
exit 1
|
809
792
|
end
|
793
|
+
return 0, nil
|
810
794
|
end
|
811
795
|
|
812
796
|
def update(args)
|
@@ -532,22 +532,22 @@ EOT
|
|
532
532
|
|
533
533
|
def add_catalog_item_type_option_types
|
534
534
|
[
|
535
|
-
{'code' => 'catalogItemType.type', 'shorthand' => '-t', 'fieldName' => 'type', 'fieldLabel' => 'Type', 'type' => 'select', 'selectOptions' => [{'name' => 'Instance', 'value' => 'instance'}, {'name' => 'Blueprint', 'value' => 'blueprint'}, {'name' => 'Workflow', 'value' => 'workflow'}], 'defaultValue' => 'instance', 'required' => true},
|
536
|
-
{'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true},
|
537
|
-
{'fieldName' => 'description', 'fieldLabel' => 'Description', 'type' => 'text'},
|
538
|
-
{'fieldName' => 'enabled', 'fieldLabel' => 'Enabled', 'type' => 'checkbox', 'defaultValue' => true},
|
539
|
-
{'fieldName' => 'featured', 'fieldLabel' => 'Featured', 'type' => 'checkbox', 'defaultValue' => false},
|
540
|
-
{'fieldName' => 'visibility', 'fieldLabel' => 'Visibility', 'type' => 'select', 'selectOptions' => [{'name' => 'Private', 'value' => 'private'}, {'name' => 'Public', 'value' => 'public'}], 'defaultValue' => 'private', 'required' => true},
|
541
|
-
{'fieldName' => 'iconPath', 'fieldLabel' => 'Logo', 'type' => 'select', 'optionSource' => 'iconList'},
|
542
|
-
#{'fieldName' => 'optionTypes', 'fieldLabel' => 'Option Types', 'type' => 'text', 'description' => 'Option Types to include, comma separated list of names or IDs.'},
|
543
|
-
{'dependsOnCode' => 'catalogItemType.type:instance', 'fieldName' => 'config', 'fieldLabel' => 'Config', 'type' => 'code-editor', 'description' => 'JSON or YAML', 'required' => true},
|
544
|
-
{'dependsOnCode' => 'catalogItemType.type:blueprint', 'fieldName' => 'blueprint', 'fieldLabel' => 'Blueprint', 'type' => 'select', 'optionSource' => 'blueprints', 'description' => 'Choose a blueprint to apply to the catalog item.', 'required' => true, 'noParams' => true},
|
545
|
-
{'dependsOnCode' => 'catalogItemType.type:blueprint', 'fieldName' => 'appSpec', 'fieldLabel' => 'App Spec', 'type' => 'code-editor', 'description' => 'Enter a spec in the for the App, the Scribe YAML format', 'required' => true},
|
546
|
-
{'dependsOnCode' => 'catalogItemType.type:workflow', 'fieldName' => 'workflow', 'fieldLabel' => 'Workflow', 'type' => 'select', 'optionSource' => 'operationWorkflows', 'description' => 'Enter a spec in the for the App, the Scribe YAML format', 'noParams' => true},
|
535
|
+
{'code' => 'catalogItemType.type', 'shorthand' => '-t', 'fieldName' => 'type', 'fieldLabel' => 'Type', 'type' => 'select', 'selectOptions' => [{'name' => 'Instance', 'value' => 'instance'}, {'name' => 'Blueprint', 'value' => 'blueprint'}, {'name' => 'Workflow', 'value' => 'workflow'}], 'defaultValue' => 'instance', 'required' => true, 'displayOrder' => 1},
|
536
|
+
{'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true, 'displayOrder' => 2},
|
537
|
+
{'fieldName' => 'description', 'fieldLabel' => 'Description', 'type' => 'text', 'displayOrder' => 3},
|
538
|
+
{'fieldName' => 'enabled', 'fieldLabel' => 'Enabled', 'type' => 'checkbox', 'defaultValue' => true, 'displayOrder' => 4},
|
539
|
+
{'fieldName' => 'featured', 'fieldLabel' => 'Featured', 'type' => 'checkbox', 'defaultValue' => false, 'displayOrder' => 5},
|
540
|
+
{'fieldName' => 'visibility', 'fieldLabel' => 'Visibility', 'type' => 'select', 'selectOptions' => [{'name' => 'Private', 'value' => 'private'}, {'name' => 'Public', 'value' => 'public'}], 'defaultValue' => 'private', 'required' => true, 'displayOrder' => 6},
|
541
|
+
{'fieldName' => 'iconPath', 'fieldLabel' => 'Logo', 'type' => 'select', 'optionSource' => 'iconList', 'displayOrder' => 7},
|
542
|
+
#{'fieldName' => 'optionTypes', 'fieldLabel' => 'Option Types', 'type' => 'text', 'description' => 'Option Types to include, comma separated list of names or IDs.', 'displayOrder' => 8},
|
543
|
+
{'dependsOnCode' => 'catalogItemType.type:instance', 'fieldName' => 'config', 'fieldLabel' => 'Config', 'type' => 'code-editor', 'description' => 'JSON or YAML', 'required' => true, 'displayOrder' => 9},
|
544
|
+
{'dependsOnCode' => 'catalogItemType.type:blueprint', 'fieldName' => 'blueprint', 'fieldLabel' => 'Blueprint', 'type' => 'select', 'optionSource' => 'blueprints', 'description' => 'Choose a blueprint to apply to the catalog item.', 'required' => true, 'noParams' => true, 'displayOrder' => 10},
|
545
|
+
{'dependsOnCode' => 'catalogItemType.type:blueprint', 'fieldName' => 'appSpec', 'fieldLabel' => 'App Spec', 'type' => 'code-editor', 'description' => 'Enter a spec in the for the App, the Scribe YAML format', 'required' => true, 'displayOrder' => 11},
|
546
|
+
{'dependsOnCode' => 'catalogItemType.type:workflow', 'fieldName' => 'workflow', 'fieldLabel' => 'Workflow', 'type' => 'select', 'optionSource' => 'operationWorkflows', 'description' => 'Enter a spec in the for the App, the Scribe YAML format', 'noParams' => true, 'displayOrder' => 12},
|
547
547
|
{'dependsOnCode' => 'catalogItemType.type:workflow', 'fieldName' => 'context', 'fieldLabel' => 'Context Type', 'type' => 'select', 'optionSource' => lambda { |api_client, api_params|
|
548
548
|
[{'name' => "Select", 'value' => ""}, {'name' => "None", 'value' => "appliance"}, {'name' => "Instance", 'value' => "instance"}, {'name' => "Server", 'value' => "server"}]
|
549
549
|
}, 'description' => 'Context for operational workflow, determines target type', 'defaultValue' => 'Select', 'required' => false},
|
550
|
-
{'fieldName' => 'content', 'fieldLabel' => 'Content', 'type' => 'code-editor', 'description' => 'Wiki Page Content describing the catalog item'}
|
550
|
+
{'fieldName' => 'content', 'fieldLabel' => 'Content', 'type' => 'code-editor', 'description' => 'Wiki Page Content describing the catalog item', 'displayOrder' => 13}
|
551
551
|
]
|
552
552
|
end
|
553
553
|
|
@@ -0,0 +1,575 @@
|
|
1
|
+
require 'morpheus/cli/cli_command'
|
2
|
+
|
3
|
+
class Morpheus::Cli::CertificatesCommand
|
4
|
+
include Morpheus::Cli::CliCommand
|
5
|
+
|
6
|
+
set_command_name :'certificates'
|
7
|
+
set_command_description "Certificates: View and manage SSL certificates."
|
8
|
+
|
9
|
+
register_subcommands :list, :get, :add, :update, :remove
|
10
|
+
register_subcommands :list_types, :get_type
|
11
|
+
|
12
|
+
def connect(opts)
|
13
|
+
@api_client = establish_remote_appliance_connection(opts)
|
14
|
+
@certificates_interface = @api_client.certificates
|
15
|
+
@certificate_types_interface = @api_client.certificate_types
|
16
|
+
end
|
17
|
+
|
18
|
+
def handle(args)
|
19
|
+
handle_subcommand(args)
|
20
|
+
end
|
21
|
+
|
22
|
+
def list(args)
|
23
|
+
options = {}
|
24
|
+
params = {}
|
25
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
26
|
+
opts.banner = subcommand_usage("[search]")
|
27
|
+
build_standard_list_options(opts, options)
|
28
|
+
opts.footer = "List certificates."
|
29
|
+
end
|
30
|
+
optparse.parse!(args)
|
31
|
+
if args.count > 0
|
32
|
+
options[:phrase] = args.join(" ")
|
33
|
+
end
|
34
|
+
connect(options)
|
35
|
+
params.merge!(parse_list_options(options))
|
36
|
+
@certificates_interface.setopts(options)
|
37
|
+
if options[:dry_run]
|
38
|
+
print_dry_run @certificates_interface.dry.list(params)
|
39
|
+
return
|
40
|
+
end
|
41
|
+
json_response = @certificates_interface.list(params)
|
42
|
+
render_response(json_response, options, certificate_list_key) do
|
43
|
+
certificates = json_response[certificate_list_key]
|
44
|
+
print_h1 "Morpheus Certificates", parse_list_subtitles(options), options
|
45
|
+
if certificates.empty?
|
46
|
+
print cyan,"No certificates found.",reset,"\n"
|
47
|
+
else
|
48
|
+
list_columns = {
|
49
|
+
"ID" => 'id',
|
50
|
+
"Name" => 'name',
|
51
|
+
"Issued To" => lambda {|it| it['commonName'] },
|
52
|
+
"Cert Type" => lambda {|it| it['certType'] },
|
53
|
+
"Domain Name" => lambda {|it| it['domainName'] },
|
54
|
+
}.upcase_keys!
|
55
|
+
print as_pretty_table(certificates, list_columns, options)
|
56
|
+
print_results_pagination(json_response)
|
57
|
+
end
|
58
|
+
print reset,"\n"
|
59
|
+
end
|
60
|
+
return 0, nil
|
61
|
+
end
|
62
|
+
|
63
|
+
def get(args)
|
64
|
+
params = {}
|
65
|
+
options = {}
|
66
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
67
|
+
opts.banner = subcommand_usage("[certificate]")
|
68
|
+
build_standard_get_options(opts, options)
|
69
|
+
opts.footer = <<-EOT
|
70
|
+
Get details about a specific certificate.
|
71
|
+
[certificate] is required. This is the name or id of a certificate.
|
72
|
+
EOT
|
73
|
+
end
|
74
|
+
optparse.parse!(args)
|
75
|
+
verify_args!(args:args, optparse:optparse, min:1)
|
76
|
+
connect(options)
|
77
|
+
params.merge!(parse_query_options(options))
|
78
|
+
id_list = parse_id_list(args)
|
79
|
+
return run_command_for_each_arg(id_list) do |arg|
|
80
|
+
_get(arg, params, options)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def _get(id, params, options)
|
85
|
+
certificate = nil
|
86
|
+
if id.to_s !~ /\A\d{1,}\Z/
|
87
|
+
certificate = find_certificate_by_name_or_id(id)
|
88
|
+
return 1, "certificate not found for #{id}" if certificate.nil?
|
89
|
+
id = certificate['id']
|
90
|
+
end
|
91
|
+
@certificates_interface.setopts(options)
|
92
|
+
if options[:dry_run]
|
93
|
+
print_dry_run @certificates_interface.dry.get(id, params)
|
94
|
+
return
|
95
|
+
end
|
96
|
+
json_response = @certificates_interface.get(id, params)
|
97
|
+
certificate = json_response[certificate_object_key]
|
98
|
+
render_response(json_response, options, certificate_object_key) do
|
99
|
+
print_h1 "Certificate Details", [], options
|
100
|
+
print cyan
|
101
|
+
show_columns = {
|
102
|
+
"ID" => 'id',
|
103
|
+
"Name" => 'name',
|
104
|
+
"Description" => 'description',
|
105
|
+
"Issued To" => lambda {|it| it['commonName'] },
|
106
|
+
"Cert Type" => lambda {|it| it['certType'] },
|
107
|
+
"Domain Name" => lambda {|it| it['domainName'] },
|
108
|
+
"Wildcard" => lambda {|it| format_boolean(it['wildcard']) },
|
109
|
+
}
|
110
|
+
print_description_list(show_columns, certificate, options)
|
111
|
+
print reset,"\n"
|
112
|
+
end
|
113
|
+
return 0, nil
|
114
|
+
end
|
115
|
+
|
116
|
+
def add(args)
|
117
|
+
options = {}
|
118
|
+
params = {}
|
119
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
120
|
+
opts.banner = subcommand_usage("[name] -t CODE [options]")
|
121
|
+
# opts.on('-t', '--type CODE', "Certificate Type code, see `#{command_name} list-types` for available type codes") do |val|
|
122
|
+
# options[:options]['type'] = val
|
123
|
+
# end
|
124
|
+
build_option_type_options(opts, options, add_certificate_option_types)
|
125
|
+
build_option_type_options(opts, options, add_certificate_advanced_option_types)
|
126
|
+
build_standard_add_options(opts, options)
|
127
|
+
opts.footer = <<-EOT
|
128
|
+
Create a new certificate.
|
129
|
+
[name] is required. This is the name of the new certificate
|
130
|
+
Configuration options vary by certificate type.
|
131
|
+
EOT
|
132
|
+
end
|
133
|
+
optparse.parse!(args)
|
134
|
+
verify_args!(args:args, optparse:optparse, min:0, max:1)
|
135
|
+
options[:options]['name'] = args[0] if args[0]
|
136
|
+
connect(options)
|
137
|
+
payload = {}
|
138
|
+
if options[:payload]
|
139
|
+
payload = options[:payload]
|
140
|
+
payload.deep_merge!({certificate_object_key => parse_passed_options(options)})
|
141
|
+
else
|
142
|
+
payload.deep_merge!({certificate_object_key => parse_passed_options(options)})
|
143
|
+
# Type prompt first
|
144
|
+
#params['type'] = Morpheus::Cli::OptionTypes.no_prompt([{'fieldName' => 'type', 'fieldLabel' => 'Type', 'type' => 'select', 'selectOptions' => [{'name' => 'Instance', 'value' => 'instance'}, {'name' => 'Blueprint', 'value' => 'blueprint'}, {'name' => 'Workflow', 'value' => 'workflow'}], 'defaultValue' => 'instance', 'required' => true}], options[:options], @api_client, options[:params])['type']
|
145
|
+
v_prompt = Morpheus::Cli::OptionTypes.prompt(add_certificate_option_types(), options[:options], @api_client, options[:params])
|
146
|
+
params.deep_merge!(v_prompt)
|
147
|
+
advanced_config = Morpheus::Cli::OptionTypes.no_prompt(add_certificate_advanced_option_types, options[:options], @api_client, options[:params])
|
148
|
+
advanced_config.deep_compact!
|
149
|
+
params.deep_merge!(advanced_config)
|
150
|
+
|
151
|
+
# lookup type by name or code to validate it exists and to prompt for its optionTypes
|
152
|
+
# set certificate.type=code because the api expects it that way.
|
153
|
+
if params['type'].to_s.empty?
|
154
|
+
raise_command_error "missing required option: --type TYPE", args, optparse
|
155
|
+
end
|
156
|
+
certificate_type = find_certificate_type_by_name_or_code_id(params['type'])
|
157
|
+
if certificate_type.nil?
|
158
|
+
print_red_alert "certificate type not found for #{params['type']}"
|
159
|
+
return 1, "certificate type not found for #{params['type']}"
|
160
|
+
end
|
161
|
+
params['type'] = certificate_type['code']
|
162
|
+
config_option_types = certificate_type['optionTypes']
|
163
|
+
if config_option_types.nil?
|
164
|
+
config_option_types = @certificate_types_interface.option_types(certificate_type['id'])['optionTypes']
|
165
|
+
end
|
166
|
+
if config_option_types.nil?
|
167
|
+
print yellow,"No option types found for certificate type: #{certificate_type['name']} (#{certificate_type['code']})", reset, "\n"
|
168
|
+
end
|
169
|
+
if config_option_types && config_option_types.size > 0
|
170
|
+
# optionTypes do not need fieldContext: 'certificate'
|
171
|
+
config_option_types.each do |opt|
|
172
|
+
if opt['fieldContext'] == 'certificate' || opt['fieldContext'] == 'domain'
|
173
|
+
opt['fieldContext'] = nil
|
174
|
+
end
|
175
|
+
end
|
176
|
+
# reject hardcoded optionTypes
|
177
|
+
config_option_types = config_option_types.reject {|it| it['fieldName'] == 'name' || it['fieldName'] == 'description' || it['fieldName'] == 'domainName' }
|
178
|
+
config_prompt = Morpheus::Cli::OptionTypes.prompt(config_option_types, options[:options], @api_client, options[:params])
|
179
|
+
config_prompt.deep_compact!
|
180
|
+
params.deep_merge!(config_prompt)
|
181
|
+
end
|
182
|
+
# convert checkbox "on" and "off" to true and false
|
183
|
+
params.booleanize!
|
184
|
+
payload[certificate_object_key].deep_merge!(params)
|
185
|
+
end
|
186
|
+
@certificates_interface.setopts(options)
|
187
|
+
if options[:dry_run]
|
188
|
+
print_dry_run @certificates_interface.dry.create(payload)
|
189
|
+
return 0, nil
|
190
|
+
end
|
191
|
+
json_response = @certificates_interface.create(payload)
|
192
|
+
certificate = json_response[certificate_object_key]
|
193
|
+
render_response(json_response, options, certificate_object_key) do
|
194
|
+
print_green_success "Added certificate #{certificate['name']}"
|
195
|
+
return _get(certificate["id"], {}, options)
|
196
|
+
end
|
197
|
+
return 0, nil
|
198
|
+
end
|
199
|
+
|
200
|
+
def update(args)
|
201
|
+
options = {}
|
202
|
+
params = {}
|
203
|
+
payload = {}
|
204
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
205
|
+
opts.banner = subcommand_usage("[certificate] [options]")
|
206
|
+
build_option_type_options(opts, options, update_certificate_option_types)
|
207
|
+
build_option_type_options(opts, options, update_certificate_advanced_option_types)
|
208
|
+
opts.on(nil, '--no-refresh', "Skip refresh on update.") do
|
209
|
+
payload['refresh'] = 'false'
|
210
|
+
end
|
211
|
+
build_standard_update_options(opts, options)
|
212
|
+
opts.footer = <<-EOT
|
213
|
+
Update a certificate.
|
214
|
+
[certificate] is required. This is the name or id of a certificate.
|
215
|
+
EOT
|
216
|
+
end
|
217
|
+
optparse.parse!(args)
|
218
|
+
verify_args!(args:args, optparse:optparse, count:1)
|
219
|
+
connect(options)
|
220
|
+
certificate = find_certificate_by_name_or_id(args[0])
|
221
|
+
return 1 if certificate.nil?
|
222
|
+
payload = {}
|
223
|
+
if options[:payload]
|
224
|
+
payload = options[:payload]
|
225
|
+
payload.deep_merge!({certificate_object_key => parse_passed_options(options)})
|
226
|
+
else
|
227
|
+
payload.deep_merge!({certificate_object_key => parse_passed_options(options)})
|
228
|
+
# do not prompt on update
|
229
|
+
v_prompt = Morpheus::Cli::OptionTypes.no_prompt(update_certificate_option_types, options[:options], @api_client, options[:params])
|
230
|
+
v_prompt.deep_compact!
|
231
|
+
params.deep_merge!(v_prompt)
|
232
|
+
advanced_config = Morpheus::Cli::OptionTypes.no_prompt(update_certificate_advanced_option_types, options[:options], @api_client, options[:params])
|
233
|
+
advanced_config.deep_compact!
|
234
|
+
params.deep_merge!(advanced_config)
|
235
|
+
# convert checkbox "on" and "off" to true and false
|
236
|
+
params.booleanize!
|
237
|
+
payload.deep_merge!({certificate_object_key => params})
|
238
|
+
if payload[certificate_object_key].empty? # || options[:no_prompt]
|
239
|
+
raise_command_error "Specify at least one option to update.\n#{optparse}"
|
240
|
+
end
|
241
|
+
end
|
242
|
+
@certificates_interface.setopts(options)
|
243
|
+
if options[:dry_run]
|
244
|
+
print_dry_run @certificates_interface.dry.update(certificate['id'], payload)
|
245
|
+
return
|
246
|
+
end
|
247
|
+
json_response = @certificates_interface.update(certificate['id'], payload)
|
248
|
+
certificate = json_response[certificate_object_key]
|
249
|
+
render_response(json_response, options, certificate_object_key) do
|
250
|
+
print_green_success "Updated certificate #{certificate['name']}"
|
251
|
+
return _get(certificate["id"], {}, options)
|
252
|
+
end
|
253
|
+
return 0, nil
|
254
|
+
end
|
255
|
+
|
256
|
+
def remove(args)
|
257
|
+
options = {}
|
258
|
+
params = {}
|
259
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
260
|
+
opts.banner = subcommand_usage("[certificate] [options]")
|
261
|
+
build_standard_remove_options(opts, options)
|
262
|
+
opts.footer = <<-EOT
|
263
|
+
Delete a certificate.
|
264
|
+
[certificate] is required. This is the name or id of a certificate.
|
265
|
+
EOT
|
266
|
+
end
|
267
|
+
optparse.parse!(args)
|
268
|
+
verify_args!(args:args, optparse:optparse, count:1)
|
269
|
+
connect(options)
|
270
|
+
certificate = find_certificate_by_name_or_id(args[0])
|
271
|
+
return 1 if certificate.nil?
|
272
|
+
@certificates_interface.setopts(options)
|
273
|
+
if options[:dry_run]
|
274
|
+
print_dry_run @certificates_interface.dry.destroy(certificate['id'], params)
|
275
|
+
return
|
276
|
+
end
|
277
|
+
unless options[:yes] || Morpheus::Cli::OptionTypes.confirm("Are you sure you want to delete the certificate #{certificate['name']}?")
|
278
|
+
return 9, "aborted command"
|
279
|
+
end
|
280
|
+
json_response = @certificates_interface.destroy(certificate['id'], params)
|
281
|
+
render_response(json_response, options) do
|
282
|
+
print_green_success "Removed certificate #{certificate['name']}"
|
283
|
+
end
|
284
|
+
return 0, nil
|
285
|
+
end
|
286
|
+
|
287
|
+
|
288
|
+
def list_types(args)
|
289
|
+
options = {}
|
290
|
+
params = {}
|
291
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
292
|
+
opts.banner = subcommand_usage("[search]")
|
293
|
+
opts.on('--optionTypes [true|false]', String, "Include optionTypes in the response. Default is false.") do |val|
|
294
|
+
params['optionTypes'] = (val.to_s == '' || val.to_s == 'on' || val.to_s == 'true')
|
295
|
+
end
|
296
|
+
build_standard_list_options(opts, options)
|
297
|
+
opts.footer = "List certificate types."
|
298
|
+
end
|
299
|
+
optparse.parse!(args)
|
300
|
+
connect(options)
|
301
|
+
# verify_args!(args:args, optparse:optparse, count:0)
|
302
|
+
if args.count > 0
|
303
|
+
options[:phrase] = args.join(" ")
|
304
|
+
end
|
305
|
+
params.merge!(parse_list_options(options))
|
306
|
+
@certificate_types_interface.setopts(options)
|
307
|
+
if options[:dry_run]
|
308
|
+
print_dry_run @certificate_types_interface.dry.list(params)
|
309
|
+
return
|
310
|
+
end
|
311
|
+
json_response = @certificate_types_interface.list(params)
|
312
|
+
render_response(json_response, options, certificate_type_list_key) do
|
313
|
+
certificate_types = json_response[certificate_type_list_key]
|
314
|
+
print_h1 "Morpheus Certificate Types", parse_list_subtitles(options), options
|
315
|
+
if certificate_types.empty?
|
316
|
+
print cyan,"No certificate types found.",reset,"\n"
|
317
|
+
else
|
318
|
+
list_columns = certificate_type_column_definitions.upcase_keys!
|
319
|
+
print as_pretty_table(certificate_types, list_columns, options)
|
320
|
+
print_results_pagination(json_response)
|
321
|
+
end
|
322
|
+
print reset,"\n"
|
323
|
+
end
|
324
|
+
return 0, nil
|
325
|
+
end
|
326
|
+
|
327
|
+
def get_type(args)
|
328
|
+
params = {'optionTypes' => true}
|
329
|
+
options = {}
|
330
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
331
|
+
opts.banner = subcommand_usage("[type]")
|
332
|
+
opts.on('--optionTypes [true|false]', String, "Include optionTypes in the response. Default is true.") do |val|
|
333
|
+
params['optionTypes'] = (val.to_s == '' || val.to_s == 'on' || val.to_s == 'true')
|
334
|
+
end
|
335
|
+
build_standard_get_options(opts, options)
|
336
|
+
opts.footer = <<-EOT
|
337
|
+
Get details about a specific certificate type.
|
338
|
+
[type] is required. This is the name or id of a certificate type.
|
339
|
+
EOT
|
340
|
+
end
|
341
|
+
optparse.parse!(args)
|
342
|
+
verify_args!(args:args, optparse:optparse, min:1)
|
343
|
+
connect(options)
|
344
|
+
params.merge!(parse_query_options(options))
|
345
|
+
id_list = parse_id_list(args)
|
346
|
+
return run_command_for_each_arg(id_list) do |arg|
|
347
|
+
_get_type(arg, params, options)
|
348
|
+
end
|
349
|
+
end
|
350
|
+
|
351
|
+
def _get_type(id, params, options)
|
352
|
+
certificate_type = nil
|
353
|
+
if id.to_s !~ /\A\d{1,}\Z/
|
354
|
+
certificate_type = find_certificate_type_by_name_or_code(id)
|
355
|
+
return 1, "certificate type not found for name or code '#{id}'" if certificate_type.nil?
|
356
|
+
id = certificate_type['id']
|
357
|
+
end
|
358
|
+
# /api/certificate-types does not return optionTypes by default, use ?optionTypes=true
|
359
|
+
@certificate_types_interface.setopts(options)
|
360
|
+
if options[:dry_run]
|
361
|
+
print_dry_run @certificate_types_interface.dry.get(id, params)
|
362
|
+
return
|
363
|
+
end
|
364
|
+
json_response = @certificate_types_interface.get(id, params)
|
365
|
+
certificate_type = json_response[certificate_type_object_key]
|
366
|
+
render_response(json_response, options, certificate_type_object_key) do
|
367
|
+
print_h1 "Certificate Type Details", [], options
|
368
|
+
print cyan
|
369
|
+
show_columns = certificate_type_column_definitions
|
370
|
+
print_description_list(show_columns, certificate_type)
|
371
|
+
|
372
|
+
if certificate_type['optionTypes'] && certificate_type['optionTypes'].size > 0
|
373
|
+
print_h2 "Option Types"
|
374
|
+
opt_columns = [
|
375
|
+
# {"ID" => lambda {|it| it['id'] } },
|
376
|
+
{"FIELD NAME" => lambda {|it| (it['fieldContext'] && it['fieldContext'] != 'certificate') ? [it['fieldContext'], it['fieldName']].join('.') : it['fieldName'] } },
|
377
|
+
{"FIELD LABEL" => lambda {|it| it['fieldLabel'] } },
|
378
|
+
{"TYPE" => lambda {|it| it['type'] } },
|
379
|
+
{"DEFAULT" => lambda {|it| it['defaultValue'] } },
|
380
|
+
{"REQUIRED" => lambda {|it| format_boolean it['required'] } },
|
381
|
+
# {"DESCRIPTION" => lambda {|it| it['description'] }, # do it!
|
382
|
+
]
|
383
|
+
print as_pretty_table(certificate_type['optionTypes'], opt_columns)
|
384
|
+
else
|
385
|
+
# print cyan,"No option types found for this certificate type.","\n",reset
|
386
|
+
end
|
387
|
+
|
388
|
+
print reset,"\n"
|
389
|
+
end
|
390
|
+
return 0, nil
|
391
|
+
end
|
392
|
+
|
393
|
+
private
|
394
|
+
|
395
|
+
def format_certificate_type(certificate)
|
396
|
+
(certificate['certificateType']['name'] || certificate['certificateType']['code']) rescue certificate['certificateType'].to_s
|
397
|
+
end
|
398
|
+
|
399
|
+
def add_certificate_option_types
|
400
|
+
[
|
401
|
+
{'code' => 'certificate.type', 'shorthand' => '-t', 'fieldName' => 'type', 'fieldLabel' => 'Type', 'type' => 'select', 'optionSource' => lambda { |api_client, api_params|
|
402
|
+
# @certificate_types_interface.list(max:-1)[certificate_list_key].collect {|it|
|
403
|
+
get_available_certificate_types().collect {|it|
|
404
|
+
{'name' => it['code'], 'value' => it['id']}
|
405
|
+
} }, 'required' => true, 'description' => "Certificate Type code, see `#{command_name} list-types` for available type codes", 'defaultValue' => "internal"},
|
406
|
+
{'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true, 'description' => 'Name of the certificate'},
|
407
|
+
{'fieldName' => 'description', 'fieldLabel' => 'Description', 'type' => 'text', 'required' => false, 'description' => 'Description of the certificate'},
|
408
|
+
{'fieldName' => 'domainName', 'fieldLabel' => 'Domain Name', 'type' => 'text', 'required' => false, 'description' => 'Domain Name of the certificate'},
|
409
|
+
# {'fieldName' => 'enabled', 'fieldLabel' => 'Enabled', 'type' => 'checkbox', 'defaultValue' => true, 'description' => 'Can be used to disable a certificate'}
|
410
|
+
]
|
411
|
+
end
|
412
|
+
|
413
|
+
def add_certificate_advanced_option_types
|
414
|
+
[]
|
415
|
+
end
|
416
|
+
|
417
|
+
def update_certificate_option_types
|
418
|
+
list = add_certificate_option_types.collect {|it|
|
419
|
+
it.delete('required')
|
420
|
+
it.delete('defaultValue')
|
421
|
+
it
|
422
|
+
}
|
423
|
+
list = list.reject {|it| ["type"].include? it['fieldName'] }
|
424
|
+
list
|
425
|
+
end
|
426
|
+
|
427
|
+
def update_certificate_advanced_option_types
|
428
|
+
add_certificate_advanced_option_types.collect {|it|
|
429
|
+
it.delete('required')
|
430
|
+
it.delete('defaultValue')
|
431
|
+
it
|
432
|
+
}
|
433
|
+
end
|
434
|
+
|
435
|
+
def certificate_object_key
|
436
|
+
'certificate'
|
437
|
+
end
|
438
|
+
|
439
|
+
def certificate_list_key
|
440
|
+
'certificates'
|
441
|
+
end
|
442
|
+
|
443
|
+
def find_certificate_by_name_or_id(val)
|
444
|
+
if val.to_s =~ /\A\d{1,}\Z/
|
445
|
+
return find_certificate_by_id(val)
|
446
|
+
else
|
447
|
+
return find_certificate_by_name(val)
|
448
|
+
end
|
449
|
+
end
|
450
|
+
|
451
|
+
def find_certificate_by_id(id)
|
452
|
+
begin
|
453
|
+
json_response = @certificates_interface.get(id.to_i)
|
454
|
+
return json_response[certificate_object_key]
|
455
|
+
rescue RestClient::Exception => e
|
456
|
+
if e.response && e.response.code == 404
|
457
|
+
print_red_alert "certificate not found by id '#{id}'"
|
458
|
+
else
|
459
|
+
raise e
|
460
|
+
end
|
461
|
+
end
|
462
|
+
end
|
463
|
+
|
464
|
+
def find_certificate_by_name(name)
|
465
|
+
json_response = @certificates_interface.list({name: name.to_s})
|
466
|
+
certificates = json_response[certificate_list_key]
|
467
|
+
if certificates.empty?
|
468
|
+
print_red_alert "certificate not found by name '#{name}'"
|
469
|
+
return nil
|
470
|
+
elsif certificates.size > 1
|
471
|
+
print_red_alert "#{certificates.size} certificates found by name '#{name}'"
|
472
|
+
puts_error as_pretty_table(certificates, [:id, :name], {color:red})
|
473
|
+
print_red_alert "Try using ID instead"
|
474
|
+
print reset,"\n"
|
475
|
+
return nil
|
476
|
+
else
|
477
|
+
return certificates[0]
|
478
|
+
end
|
479
|
+
end
|
480
|
+
|
481
|
+
def format_certificate_status(certificate, return_color=cyan)
|
482
|
+
out = ""
|
483
|
+
status_string = certificate['status']
|
484
|
+
if status_string.nil? || status_string.empty? || status_string == "unknown"
|
485
|
+
out << "#{white}UNKNOWN#{certificate['statusMessage'] ? "#{return_color} - #{certificate['statusMessage']}" : ''}#{return_color}"
|
486
|
+
# elsif certificate['enabled'] == false
|
487
|
+
# out << "#{red}DISABLED#{certificate['statusMessage'] ? "#{return_color} - #{certificate['statusMessage']}" : ''}#{return_color}"
|
488
|
+
elsif status_string == 'ok'
|
489
|
+
out << "#{green}#{status_string.upcase}#{return_color}"
|
490
|
+
elsif status_string == 'error' || status_string == 'offline'
|
491
|
+
out << "#{red}#{status_string ? status_string.upcase : 'N/A'}#{certificate['statusMessage'] ? "#{return_color} - #{certificate['statusMessage']}" : ''}#{return_color}"
|
492
|
+
else
|
493
|
+
out << "#{yellow}#{status_string.upcase}#{return_color}"
|
494
|
+
end
|
495
|
+
out
|
496
|
+
end
|
497
|
+
|
498
|
+
|
499
|
+
def certificate_type_column_definitions()
|
500
|
+
{
|
501
|
+
"ID" => 'id',
|
502
|
+
"Code" => 'code',
|
503
|
+
"Name" => 'name',
|
504
|
+
# "Description" => 'description',
|
505
|
+
# "Enabled" => lambda {|it| format_boolean(it['enabled']) },
|
506
|
+
"Creatable" => lambda {|it| format_boolean(it['creatable']) },
|
507
|
+
}
|
508
|
+
end
|
509
|
+
|
510
|
+
def certificate_type_object_key
|
511
|
+
'certificateType'
|
512
|
+
end
|
513
|
+
|
514
|
+
def certificate_type_list_key
|
515
|
+
'certificateTypes'
|
516
|
+
end
|
517
|
+
|
518
|
+
def find_certificate_type_by_name_or_code_id(val, params={})
|
519
|
+
if val.to_s =~ /\A\d{1,}\Z/
|
520
|
+
return find_certificate_type_by_id(val, params)
|
521
|
+
else
|
522
|
+
return find_certificate_type_by_name_or_code(val)
|
523
|
+
end
|
524
|
+
end
|
525
|
+
|
526
|
+
def find_certificate_type_by_id(id, params={})
|
527
|
+
begin
|
528
|
+
json_response = @certificate_types_interface.get(id.to_i, params)
|
529
|
+
return json_response[certificate_type_object_key]
|
530
|
+
rescue RestClient::Exception => e
|
531
|
+
if e.response && e.response.code == 404
|
532
|
+
print_red_alert "certificate not found by id '#{id}'"
|
533
|
+
else
|
534
|
+
raise e
|
535
|
+
end
|
536
|
+
end
|
537
|
+
end
|
538
|
+
|
539
|
+
def find_certificate_type_by_name(name, params={})
|
540
|
+
json_response = @certificate_types_interface.list(params.merge({name: name.to_s}))
|
541
|
+
certificate_types = json_response[certificate_type_list_key]
|
542
|
+
if certificate_types.empty?
|
543
|
+
print_red_alert "certificate type not found by name '#{name}'"
|
544
|
+
return nil
|
545
|
+
elsif certificate_types.size > 1
|
546
|
+
print_red_alert "#{certificate_types.size} certificate types found by name '#{name}'"
|
547
|
+
puts_error as_pretty_table(certificate_types, [:id, :code, :name], {color:red})
|
548
|
+
print_red_alert "Try using ID instead"
|
549
|
+
print reset,"\n"
|
550
|
+
return nil
|
551
|
+
else
|
552
|
+
return certificate_types[0]
|
553
|
+
end
|
554
|
+
end
|
555
|
+
|
556
|
+
def get_available_certificate_types(refresh=false)
|
557
|
+
if !@available_certificate_types || refresh
|
558
|
+
@available_certificate_types = @certificate_types_interface.list(max:10000)[certificate_type_list_key]
|
559
|
+
end
|
560
|
+
return @available_certificate_types
|
561
|
+
end
|
562
|
+
|
563
|
+
def find_certificate_type_by_name_or_code(name)
|
564
|
+
records = get_available_certificate_types()
|
565
|
+
record = records.find { |z| z['name'].downcase == name.downcase || z['code'].downcase == name.downcase}
|
566
|
+
record = record ? record : records.find { |z| z['id'].to_s == name.to_s }
|
567
|
+
if record
|
568
|
+
return record
|
569
|
+
else
|
570
|
+
print_red_alert "certificate type not found by '#{name}'"
|
571
|
+
return nil
|
572
|
+
end
|
573
|
+
end
|
574
|
+
|
575
|
+
end
|