morpheus-cli 5.3.0.1 → 5.3.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/README.md +1 -3
- data/lib/morpheus/api/account_groups_interface.rb +0 -6
- data/lib/morpheus/api/accounts_interface.rb +1 -7
- data/lib/morpheus/api/api_client.rb +155 -119
- data/lib/morpheus/api/appliance_settings_interface.rb +6 -9
- data/lib/morpheus/api/approvals_interface.rb +5 -8
- data/lib/morpheus/api/apps_interface.rb +0 -7
- data/lib/morpheus/api/archive_buckets_interface.rb +9 -16
- data/lib/morpheus/api/archive_files_interface.rb +0 -6
- data/lib/morpheus/api/auth_interface.rb +4 -4
- data/lib/morpheus/api/backup_settings_interface.rb +5 -8
- data/lib/morpheus/api/blueprints_interface.rb +1 -7
- data/lib/morpheus/api/budgets_interface.rb +0 -6
- data/lib/morpheus/api/certificate_types_interface.rb +14 -0
- data/lib/morpheus/api/certificates_interface.rb +9 -0
- data/lib/morpheus/api/cloud_datastores_interface.rb +0 -6
- data/lib/morpheus/api/cloud_folders_interface.rb +1 -7
- data/lib/morpheus/api/cloud_policies_interface.rb +0 -6
- data/lib/morpheus/api/cloud_resource_pools_interface.rb +0 -6
- data/lib/morpheus/api/clouds_interface.rb +0 -6
- data/lib/morpheus/api/clusters_interface.rb +39 -42
- data/lib/morpheus/api/containers_interface.rb +0 -6
- data/lib/morpheus/api/custom_instance_types_interface.rb +0 -6
- data/lib/morpheus/api/cypher_interface.rb +0 -6
- data/lib/morpheus/api/datastores_interface.rb +4 -7
- data/lib/morpheus/api/deploy_interface.rb +1 -6
- data/lib/morpheus/api/environments_interface.rb +0 -6
- data/lib/morpheus/api/execute_schedules_interface.rb +0 -6
- data/lib/morpheus/api/execution_request_interface.rb +0 -6
- data/lib/morpheus/api/file_copy_request_interface.rb +2 -9
- data/lib/morpheus/api/group_policies_interface.rb +0 -6
- data/lib/morpheus/api/groups_interface.rb +0 -7
- data/lib/morpheus/api/guidance_interface.rb +9 -12
- data/lib/morpheus/api/health_interface.rb +0 -6
- data/lib/morpheus/api/image_builder_boot_scripts_interface.rb +0 -6
- data/lib/morpheus/api/image_builder_image_builds_interface.rb +0 -6
- data/lib/morpheus/api/image_builder_interface.rb +3 -9
- data/lib/morpheus/api/image_builder_preseed_scripts_interface.rb +0 -6
- data/lib/morpheus/api/instance_types_interface.rb +0 -7
- data/lib/morpheus/api/instances_interface.rb +8 -19
- data/lib/morpheus/api/integration_types_interface.rb +14 -0
- data/lib/morpheus/api/integrations_interface.rb +36 -21
- data/lib/morpheus/api/invoice_line_items_interface.rb +4 -9
- data/lib/morpheus/api/jobs_interface.rb +11 -14
- data/lib/morpheus/api/key_pairs_interface.rb +0 -6
- data/lib/morpheus/api/library_cluster_layouts_interface.rb +0 -6
- data/lib/morpheus/api/library_container_scripts_interface.rb +0 -6
- data/lib/morpheus/api/library_container_templates_interface.rb +0 -6
- data/lib/morpheus/api/library_container_types_interface.rb +0 -6
- data/lib/morpheus/api/library_container_upgrades_interface.rb +0 -6
- data/lib/morpheus/api/library_instance_types_interface.rb +0 -6
- data/lib/morpheus/api/library_layouts_interface.rb +0 -6
- data/lib/morpheus/api/library_spec_template_types_interface.rb +0 -6
- data/lib/morpheus/api/library_spec_templates_interface.rb +0 -6
- data/lib/morpheus/api/license_interface.rb +0 -6
- data/lib/morpheus/api/load_balancers_interface.rb +0 -6
- data/lib/morpheus/api/log_settings_interface.rb +9 -12
- data/lib/morpheus/api/logs_interface.rb +0 -6
- data/lib/morpheus/api/monitoring_alerts_interface.rb +0 -6
- data/lib/morpheus/api/monitoring_apps_interface.rb +0 -6
- data/lib/morpheus/api/monitoring_checks_interface.rb +0 -6
- data/lib/morpheus/api/monitoring_contacts_interface.rb +0 -6
- data/lib/morpheus/api/monitoring_groups_interface.rb +0 -6
- data/lib/morpheus/api/monitoring_incidents_interface.rb +0 -6
- data/lib/morpheus/api/monitoring_interface.rb +6 -12
- data/lib/morpheus/api/network_domain_records_interface.rb +0 -6
- data/lib/morpheus/api/network_domains_interface.rb +0 -6
- data/lib/morpheus/api/network_groups_interface.rb +0 -6
- data/lib/morpheus/api/network_pool_ips_interface.rb +0 -6
- data/lib/morpheus/api/network_pool_servers_interface.rb +0 -6
- data/lib/morpheus/api/network_pools_interface.rb +0 -6
- data/lib/morpheus/api/network_proxies_interface.rb +0 -6
- data/lib/morpheus/api/network_routers_interface.rb +0 -6
- data/lib/morpheus/api/network_security_servers_interface.rb +6 -9
- data/lib/morpheus/api/network_services_interface.rb +14 -14
- data/lib/morpheus/api/network_subnets_interface.rb +0 -6
- data/lib/morpheus/api/network_types_interface.rb +1 -7
- data/lib/morpheus/api/networks_interface.rb +0 -6
- data/lib/morpheus/api/option_type_lists_interface.rb +18 -12
- data/lib/morpheus/api/option_types_interface.rb +0 -6
- data/lib/morpheus/api/options_interface.rb +0 -6
- data/lib/morpheus/api/packages_interface.rb +0 -6
- data/lib/morpheus/api/policies_interface.rb +1 -8
- data/lib/morpheus/api/power_schedules_interface.rb +0 -6
- data/lib/morpheus/api/price_sets_interface.rb +8 -11
- data/lib/morpheus/api/prices_interface.rb +12 -15
- data/lib/morpheus/api/processes_interface.rb +0 -6
- data/lib/morpheus/api/provision_types_interface.rb +0 -6
- data/lib/morpheus/api/provisioning_license_types_interface.rb +0 -6
- data/lib/morpheus/api/provisioning_licenses_interface.rb +0 -6
- data/lib/morpheus/api/provisioning_settings_interface.rb +6 -9
- data/lib/morpheus/api/read_interface.rb +23 -0
- data/lib/morpheus/api/reports_interface.rb +0 -6
- data/lib/morpheus/api/rest_interface.rb +12 -10
- data/lib/morpheus/api/roles_interface.rb +7 -6
- data/lib/morpheus/api/security_group_rules_interface.rb +0 -7
- data/lib/morpheus/api/security_groups_interface.rb +0 -6
- data/lib/morpheus/api/server_types_interface.rb +0 -6
- data/lib/morpheus/api/servers_interface.rb +7 -6
- data/lib/morpheus/api/service_plans_interface.rb +11 -14
- data/lib/morpheus/api/storage_providers_interface.rb +9 -16
- data/lib/morpheus/api/subnet_types_interface.rb +1 -7
- data/lib/morpheus/api/subnets_interface.rb +0 -6
- data/lib/morpheus/api/task_sets_interface.rb +0 -6
- data/lib/morpheus/api/tasks_interface.rb +0 -6
- data/lib/morpheus/api/user_groups_interface.rb +0 -6
- data/lib/morpheus/api/user_settings_interface.rb +38 -18
- data/lib/morpheus/api/user_sources_interface.rb +0 -6
- data/lib/morpheus/api/users_interface.rb +0 -6
- 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/api/virtual_images_interface.rb +0 -6
- data/lib/morpheus/api/whitelabel_settings_interface.rb +8 -11
- data/lib/morpheus/api/wiki_interface.rb +0 -6
- data/lib/morpheus/cli.rb +9 -2
- data/lib/morpheus/cli/access_token_command.rb +1 -1
- data/lib/morpheus/cli/account_groups_command.rb +4 -4
- data/lib/morpheus/cli/apps.rb +68 -84
- data/lib/morpheus/cli/archives_command.rb +5 -5
- data/lib/morpheus/cli/blueprints_command.rb +5 -5
- data/lib/morpheus/cli/boot_scripts_command.rb +1 -1
- data/lib/morpheus/cli/catalog_item_types_command.rb +13 -13
- data/lib/morpheus/cli/certificates_command.rb +575 -0
- data/lib/morpheus/cli/change_password_command.rb +4 -4
- data/lib/morpheus/cli/cli_command.rb +63 -7
- data/lib/morpheus/cli/clouds.rb +3 -2
- data/lib/morpheus/cli/clusters.rb +3 -3
- data/lib/morpheus/cli/commands/standard/man_command.rb +4 -5
- data/lib/morpheus/cli/credentials.rb +4 -11
- data/lib/morpheus/cli/environments_command.rb +1 -1
- data/lib/morpheus/cli/execute_schedules_command.rb +3 -3
- data/lib/morpheus/cli/hosts.rb +253 -232
- data/lib/morpheus/cli/image_builder_command.rb +6 -6
- data/lib/morpheus/cli/instance_types.rb +1 -1
- data/lib/morpheus/cli/instances.rb +196 -186
- data/lib/morpheus/cli/integrations_command.rb +1155 -42
- data/lib/morpheus/cli/invoices_command.rb +75 -67
- data/lib/morpheus/cli/key_pairs.rb +2 -2
- data/lib/morpheus/cli/library_cluster_layouts_command.rb +2 -3
- data/lib/morpheus/cli/library_container_scripts_command.rb +4 -5
- data/lib/morpheus/cli/library_container_templates_command.rb +5 -1
- data/lib/morpheus/cli/library_container_types_command.rb +8 -9
- data/lib/morpheus/cli/library_instance_types_command.rb +6 -7
- data/lib/morpheus/cli/library_layouts_command.rb +9 -5
- data/lib/morpheus/cli/library_option_lists_command.rb +72 -20
- data/lib/morpheus/cli/library_option_types_command.rb +8 -4
- data/lib/morpheus/cli/library_spec_templates_command.rb +3 -4
- data/lib/morpheus/cli/library_upgrades_command.rb +6 -6
- data/lib/morpheus/cli/license.rb +2 -2
- data/lib/morpheus/cli/load_balancers.rb +1 -1
- data/lib/morpheus/cli/login.rb +10 -1
- data/lib/morpheus/cli/mixins/option_source_helper.rb +15 -16
- data/lib/morpheus/cli/mixins/print_helper.rb +33 -18
- data/lib/morpheus/cli/mixins/provisioning_helper.rb +4 -4
- data/lib/morpheus/cli/mixins/vdi_helper.rb +246 -0
- data/lib/morpheus/cli/network_domains_command.rb +2 -2
- 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 +39 -34
- data/lib/morpheus/cli/policies_command.rb +0 -1
- data/lib/morpheus/cli/power_schedules_command.rb +3 -3
- data/lib/morpheus/cli/preseed_scripts_command.rb +1 -1
- data/lib/morpheus/cli/remote.rb +2 -2
- data/lib/morpheus/cli/reports_command.rb +5 -2
- data/lib/morpheus/cli/roles.rb +224 -64
- data/lib/morpheus/cli/security_group_rules.rb +1 -1
- data/lib/morpheus/cli/setup.rb +0 -1
- data/lib/morpheus/cli/subnets_command.rb +11 -2
- data/lib/morpheus/cli/tenants_command.rb +3 -3
- data/lib/morpheus/cli/user_groups_command.rb +3 -3
- data/lib/morpheus/cli/user_settings_command.rb +268 -57
- data/lib/morpheus/cli/user_sources_command.rb +3 -3
- data/lib/morpheus/cli/users.rb +3 -3
- 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/cli/virtual_images.rb +1 -1
- data/lib/morpheus/cli/whoami.rb +0 -15
- data/lib/morpheus/cli/wiki_command.rb +1 -1
- data/lib/morpheus/rest_client.rb +30 -0
- data/lib/morpheus/terminal.rb +15 -7
- metadata +18 -2
|
@@ -30,15 +30,15 @@ class Morpheus::Cli::ImageBuilderCommand
|
|
|
30
30
|
|
|
31
31
|
def connect(opts)
|
|
32
32
|
@api_client = establish_remote_appliance_connection(opts)
|
|
33
|
-
@image_builder_interface =
|
|
33
|
+
@image_builder_interface = @api_client.image_builder
|
|
34
34
|
@image_builds_interface = @image_builder_interface.image_builds
|
|
35
35
|
@boot_scripts_interface = @image_builder_interface.boot_scripts
|
|
36
36
|
@preseed_scripts_interface = @image_builder_interface.preseed_scripts
|
|
37
|
-
@groups_interface =
|
|
38
|
-
@clouds_interface =
|
|
39
|
-
@instances_interface =
|
|
40
|
-
@instance_types_interface =
|
|
41
|
-
@options_interface =
|
|
37
|
+
@groups_interface = @api_client.groups
|
|
38
|
+
@clouds_interface = @api_client.clouds
|
|
39
|
+
@instances_interface = @api_client.instances
|
|
40
|
+
@instance_types_interface = @api_client.instance_types
|
|
41
|
+
@options_interface = @api_client.options
|
|
42
42
|
@active_group_id = Morpheus::Cli::Groups.active_groups[@appliance_name]
|
|
43
43
|
end
|
|
44
44
|
|
|
@@ -17,7 +17,7 @@ class Morpheus::Cli::InstanceTypes
|
|
|
17
17
|
|
|
18
18
|
def connect(opts)
|
|
19
19
|
@api_client = establish_remote_appliance_connection(opts)
|
|
20
|
-
@instance_types_interface =
|
|
20
|
+
@instance_types_interface = @api_client.instance_types
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
def handle(args)
|
|
@@ -84,6 +84,16 @@ class Morpheus::Cli::Instances
|
|
|
84
84
|
opts.on('--status STATUS', "Filter by status i.e. provisioning,running,starting,stopping") do |val|
|
|
85
85
|
params['status'] = (params['status'] || []) + val.to_s.split(',').collect {|s| s.strip }.select {|s| s != "" }
|
|
86
86
|
end
|
|
87
|
+
opts.on( '--type CODE', String, "Filter by Instance Type code" ) do |val|
|
|
88
|
+
# commas used in names a lot so use --plan one --plan two
|
|
89
|
+
params['instanceType'] ||= []
|
|
90
|
+
params['instanceType'] << val
|
|
91
|
+
end
|
|
92
|
+
opts.on( '--environment CODE', String, "Filter by Environment code(s)" ) do |val|
|
|
93
|
+
# commas used in names a lot so use --plan one --plan two
|
|
94
|
+
params['environment'] ||= []
|
|
95
|
+
params['environment'] << val
|
|
96
|
+
end
|
|
87
97
|
opts.on('--pending-removal', "Include instances pending removal.") do
|
|
88
98
|
options[:showDeleted] = true
|
|
89
99
|
end
|
|
@@ -120,8 +130,9 @@ class Morpheus::Cli::Instances
|
|
|
120
130
|
end
|
|
121
131
|
opts.on('-a', '--details', "Display all details: plan, stats, etc" ) do
|
|
122
132
|
options[:details] = true
|
|
133
|
+
params['details'] = true # get more data from server this way
|
|
123
134
|
end
|
|
124
|
-
|
|
135
|
+
build_standard_list_options(opts, options)
|
|
125
136
|
opts.footer = "List instances."
|
|
126
137
|
end
|
|
127
138
|
optparse.parse!(args)
|
|
@@ -130,159 +141,150 @@ class Morpheus::Cli::Instances
|
|
|
130
141
|
options[:phrase] = args.join(" ")
|
|
131
142
|
end
|
|
132
143
|
connect(options)
|
|
133
|
-
begin
|
|
134
|
-
params.merge!(parse_list_options(options))
|
|
135
|
-
group = options[:group] ? find_group_by_name_or_id_for_provisioning(options[:group]) : nil
|
|
136
|
-
if group
|
|
137
|
-
params['siteId'] = group['id']
|
|
138
|
-
end
|
|
139
144
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
end
|
|
145
|
+
params.merge!(parse_list_options(options))
|
|
146
|
+
group = options[:group] ? find_group_by_name_or_id_for_provisioning(options[:group]) : nil
|
|
147
|
+
if group
|
|
148
|
+
params['siteId'] = group['id']
|
|
149
|
+
end
|
|
146
150
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
+
# argh, this doesn't work because group_id is required for options/clouds
|
|
152
|
+
# cloud = options[:cloud] ? find_cloud_by_name_or_id_for_provisioning(group_id, options[:cloud]) : nil
|
|
153
|
+
cloud = options[:cloud] ? find_zone_by_name_or_id(nil, options[:cloud]) : nil
|
|
154
|
+
if cloud
|
|
155
|
+
params['zoneId'] = cloud['id']
|
|
156
|
+
end
|
|
151
157
|
|
|
152
|
-
|
|
153
|
-
|
|
158
|
+
host = options[:host] ? find_host_by_name_or_id(options[:host]) : options[:host]
|
|
159
|
+
if host
|
|
160
|
+
params['serverId'] = host['id']
|
|
161
|
+
end
|
|
154
162
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
163
|
+
account = nil
|
|
164
|
+
#todo: user = find_available_user_option(owner_id)
|
|
165
|
+
|
|
166
|
+
if options[:owner]
|
|
167
|
+
created_by_ids = find_all_user_ids(account ? account['id'] : nil, options[:owner])
|
|
168
|
+
return if created_by_ids.nil?
|
|
169
|
+
params['createdBy'] = created_by_ids
|
|
170
|
+
params['ownerId'] = created_by_ids # 4.2.1+
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
params['showDeleted'] = true if options[:showDeleted]
|
|
174
|
+
params['deleted'] = true if options[:deleted]
|
|
175
|
+
params['labels'] = options[:labels] if options[:labels]
|
|
176
|
+
if options[:tags]
|
|
177
|
+
options[:tags].each do |k,v|
|
|
178
|
+
params['tags.' + k] = v
|
|
160
179
|
end
|
|
180
|
+
end
|
|
161
181
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
params
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
182
|
+
@instances_interface.setopts(options)
|
|
183
|
+
if options[:dry_run]
|
|
184
|
+
print_dry_run @instances_interface.dry.list(params)
|
|
185
|
+
return 0
|
|
186
|
+
end
|
|
187
|
+
json_response = @instances_interface.list(params)
|
|
188
|
+
all_stats = json_response['stats'] || {}
|
|
189
|
+
# merge stats into each record just to be nice...
|
|
190
|
+
if options[:include_fields] || options[:all_fields]
|
|
191
|
+
if json_response['instances']
|
|
192
|
+
if all_stats
|
|
193
|
+
json_response['instances'].each do |it|
|
|
194
|
+
it['stats'] ||= all_stats[it['id'].to_s] || all_stats[it['id']]
|
|
195
|
+
end
|
|
168
196
|
end
|
|
169
197
|
end
|
|
198
|
+
end
|
|
199
|
+
render_response(json_response, options, "instances") do
|
|
200
|
+
instances = json_response['instances']
|
|
170
201
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
202
|
+
title = "Morpheus Instances"
|
|
203
|
+
subtitles = []
|
|
204
|
+
if group
|
|
205
|
+
subtitles << "Group: #{group['name']}".strip
|
|
175
206
|
end
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
207
|
+
if cloud
|
|
208
|
+
subtitles << "Cloud: #{cloud['name']}".strip
|
|
209
|
+
end
|
|
210
|
+
if host
|
|
211
|
+
subtitles << "Host: #{host['name']}".strip
|
|
212
|
+
end
|
|
213
|
+
if options[:owner]
|
|
214
|
+
subtitles << "Created By: #{options[:owner]}"
|
|
215
|
+
end
|
|
216
|
+
subtitles += parse_list_subtitles(options)
|
|
217
|
+
print_h1 title, subtitles, options
|
|
218
|
+
if instances.empty?
|
|
219
|
+
print cyan,"No instances found.",reset,"\n"
|
|
220
|
+
else
|
|
221
|
+
# print_instances_table(instances)
|
|
222
|
+
# server returns stats in a separate key stats => {"id" => {} }
|
|
223
|
+
# the id is a string right now..for some reason..
|
|
224
|
+
all_stats = json_response['stats'] || {}
|
|
225
|
+
if all_stats
|
|
226
|
+
instances.each do |it|
|
|
227
|
+
if !it['stats']
|
|
228
|
+
found_stats = all_stats[it['id'].to_s] || all_stats[it['id']]
|
|
229
|
+
it['stats'] = found_stats # || {}
|
|
190
230
|
end
|
|
191
231
|
end
|
|
192
232
|
end
|
|
193
|
-
puts records_as_csv(json_response['instances'], options)
|
|
194
|
-
else
|
|
195
|
-
instances = json_response['instances']
|
|
196
233
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
if host
|
|
206
|
-
subtitles << "Host: #{host['name']}".strip
|
|
207
|
-
end
|
|
208
|
-
if options[:owner]
|
|
209
|
-
subtitles << "Created By: #{options[:owner]}"
|
|
210
|
-
end
|
|
211
|
-
subtitles += parse_list_subtitles(options)
|
|
212
|
-
print_h1 title, subtitles, options
|
|
213
|
-
if instances.empty?
|
|
214
|
-
print cyan,"No instances found.",reset,"\n"
|
|
215
|
-
else
|
|
216
|
-
# print_instances_table(instances)
|
|
217
|
-
# server returns stats in a separate key stats => {"id" => {} }
|
|
218
|
-
# the id is a string right now..for some reason..
|
|
219
|
-
all_stats = json_response['stats'] || {}
|
|
220
|
-
if all_stats
|
|
221
|
-
instances.each do |it|
|
|
222
|
-
if !it['stats']
|
|
223
|
-
found_stats = all_stats[it['id'].to_s] || all_stats[it['id']]
|
|
224
|
-
it['stats'] = found_stats # || {}
|
|
225
|
-
end
|
|
234
|
+
rows = instances.collect {|instance|
|
|
235
|
+
stats = instance['stats']
|
|
236
|
+
cpu_usage_str = !stats ? "" : generate_usage_bar((stats['usedCpu'] || stats['cpuUsage']).to_f, 100, {max_bars: 10})
|
|
237
|
+
memory_usage_str = !stats ? "" : generate_usage_bar(stats['usedMemory'], stats['maxMemory'], {max_bars: 10})
|
|
238
|
+
storage_usage_str = !stats ? "" : generate_usage_bar(stats['usedStorage'], stats['maxStorage'], {max_bars: 10})
|
|
239
|
+
if options[:details] || options[:stats]
|
|
240
|
+
if stats['maxMemory'] && stats['maxMemory'].to_i != 0
|
|
241
|
+
memory_usage_str = memory_usage_str + cyan + format_bytes_short(stats['usedMemory']).strip.rjust(8, ' ') + " / " + format_bytes_short(stats['maxMemory']).strip
|
|
226
242
|
end
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
rows = instances.collect {|instance|
|
|
230
|
-
stats = instance['stats']
|
|
231
|
-
cpu_usage_str = !stats ? "" : generate_usage_bar((stats['usedCpu'] || stats['cpuUsage']).to_f, 100, {max_bars: 10})
|
|
232
|
-
memory_usage_str = !stats ? "" : generate_usage_bar(stats['usedMemory'], stats['maxMemory'], {max_bars: 10})
|
|
233
|
-
storage_usage_str = !stats ? "" : generate_usage_bar(stats['usedStorage'], stats['maxStorage'], {max_bars: 10})
|
|
234
|
-
if options[:details] || options[:stats]
|
|
235
|
-
if stats['maxMemory'] && stats['maxMemory'].to_i != 0
|
|
236
|
-
memory_usage_str = memory_usage_str + cyan + format_bytes_short(stats['usedMemory']).strip.rjust(8, ' ') + " / " + format_bytes_short(stats['maxMemory']).strip
|
|
237
|
-
end
|
|
238
|
-
if stats['maxStorage'] && stats['maxStorage'].to_i != 0
|
|
239
|
-
storage_usage_str = storage_usage_str + cyan + format_bytes_short(stats['usedStorage']).strip.rjust(8, ' ') + " / " + format_bytes_short(stats['maxStorage']).strip
|
|
240
|
-
end
|
|
243
|
+
if stats['maxStorage'] && stats['maxStorage'].to_i != 0
|
|
244
|
+
storage_usage_str = storage_usage_str + cyan + format_bytes_short(stats['usedStorage']).strip.rjust(8, ' ') + " / " + format_bytes_short(stats['maxStorage']).strip
|
|
241
245
|
end
|
|
242
|
-
row = {
|
|
243
|
-
id: instance['id'],
|
|
244
|
-
name: instance['name'],
|
|
245
|
-
connection: format_instance_connection_string(instance),
|
|
246
|
-
environment: instance['instanceContext'],
|
|
247
|
-
user: (instance['owner'] ? (instance['owner']['username'] || instance['owner']['id']) : (instance['createdBy'].is_a?(Hash) ? instance['createdBy']['username'] : instance['createdBy'])),
|
|
248
|
-
tenant: (instance['owner'] ? (instance['owner']['username'] || instance['owner']['id']) : (instance['createdBy'].is_a?(Hash) ? instance['createdBy']['username'] : instance['createdBy'])),
|
|
249
|
-
nodes: instance['containers'].count,
|
|
250
|
-
status: format_instance_status(instance, cyan),
|
|
251
|
-
type: instance['instanceType']['name'],
|
|
252
|
-
group: instance['group'] ? instance['group']['name'] : nil,
|
|
253
|
-
cloud: instance['cloud'] ? instance['cloud']['name'] : nil,
|
|
254
|
-
plan: instance['plan'] ? instance['plan']['name'] : '',
|
|
255
|
-
version: instance['instanceVersion'] ? instance['instanceVersion'] : '',
|
|
256
|
-
created: format_local_dt(instance['dateCreated']),
|
|
257
|
-
cpu: cpu_usage_str + cyan,
|
|
258
|
-
memory: memory_usage_str + cyan,
|
|
259
|
-
storage: storage_usage_str + cyan
|
|
260
|
-
}
|
|
261
|
-
row
|
|
262
|
-
}
|
|
263
|
-
columns = [:id, {:name => {:max_width => 50}}, :group, :cloud,
|
|
264
|
-
:type, :version, :environment,
|
|
265
|
-
{:created => {:display_name => "CREATED"}},
|
|
266
|
-
# {:tenant => {:display_name => "TENANT"}},
|
|
267
|
-
{:user => {:display_name => "OWNER", :max_width => 20}},
|
|
268
|
-
:plan,
|
|
269
|
-
:nodes, {:connection => {:max_width => 30}}, :status, :cpu, :memory, :storage]
|
|
270
|
-
# custom pretty table columns ... this is handled in as_pretty_table now(),
|
|
271
|
-
# todo: remove all these.. and try to always pass rows as the json data itself..
|
|
272
|
-
if options[:details] != true
|
|
273
|
-
columns.delete(:plan)
|
|
274
246
|
end
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
247
|
+
row = {
|
|
248
|
+
id: instance['id'],
|
|
249
|
+
name: instance['name'],
|
|
250
|
+
connection: format_instance_connection_string(instance),
|
|
251
|
+
environment: instance['instanceContext'],
|
|
252
|
+
user: (instance['owner'] ? (instance['owner']['username'] || instance['owner']['id']) : (instance['createdBy'].is_a?(Hash) ? instance['createdBy']['username'] : instance['createdBy'])),
|
|
253
|
+
tenant: (instance['owner'] ? (instance['owner']['username'] || instance['owner']['id']) : (instance['createdBy'].is_a?(Hash) ? instance['createdBy']['username'] : instance['createdBy'])),
|
|
254
|
+
nodes: instance['containers'].count,
|
|
255
|
+
status: format_instance_status(instance, cyan),
|
|
256
|
+
type: instance['instanceType']['name'],
|
|
257
|
+
group: instance['group'] ? instance['group']['name'] : nil,
|
|
258
|
+
cloud: instance['cloud'] ? instance['cloud']['name'] : nil,
|
|
259
|
+
plan: instance['plan'] ? instance['plan']['name'] : '',
|
|
260
|
+
version: instance['instanceVersion'] ? instance['instanceVersion'] : '',
|
|
261
|
+
created: format_local_dt(instance['dateCreated']),
|
|
262
|
+
cpu: cpu_usage_str + cyan,
|
|
263
|
+
memory: memory_usage_str + cyan,
|
|
264
|
+
storage: storage_usage_str + cyan
|
|
265
|
+
}
|
|
266
|
+
row
|
|
267
|
+
}
|
|
268
|
+
columns = [:id, {:name => {:max_width => 50}}, :group, :cloud,
|
|
269
|
+
:type, :version, :environment,
|
|
270
|
+
{:created => {:display_name => "CREATED"}},
|
|
271
|
+
# {:tenant => {:display_name => "TENANT"}},
|
|
272
|
+
{:user => {:display_name => "OWNER", :max_width => 20}},
|
|
273
|
+
:plan,
|
|
274
|
+
:nodes, {:connection => {:max_width => 30}}, :status, :cpu, :memory, :storage]
|
|
275
|
+
# custom pretty table columns ... this is handled in as_pretty_table now(),
|
|
276
|
+
# todo: remove all these.. and try to always pass rows as the json data itself..
|
|
277
|
+
if options[:details] != true
|
|
278
|
+
columns.delete(:plan)
|
|
279
279
|
end
|
|
280
|
-
print
|
|
280
|
+
print cyan
|
|
281
|
+
print as_pretty_table(rows, columns, options)
|
|
282
|
+
print reset
|
|
283
|
+
print_results_pagination(json_response)
|
|
281
284
|
end
|
|
282
|
-
|
|
283
|
-
print_rest_exception(e, options)
|
|
284
|
-
exit 1
|
|
285
|
+
print reset,"\n"
|
|
285
286
|
end
|
|
287
|
+
return 0, nil
|
|
286
288
|
end
|
|
287
289
|
|
|
288
290
|
def count(args)
|
|
@@ -436,7 +438,7 @@ class Morpheus::Cli::Instances
|
|
|
436
438
|
opts.on("--create-backup [on|off]", String, "Automation: Create Backups.") do |val|
|
|
437
439
|
options[:create_backup] = ['on','true','1',''].include?(val.to_s.downcase) ? 'on' : 'off'
|
|
438
440
|
end
|
|
439
|
-
opts.on("--security-groups LIST", String, "Security Groups, comma
|
|
441
|
+
opts.on("--security-groups LIST", String, "Security Groups, comma separated list of security group IDs") do |val|
|
|
440
442
|
options[:security_groups] = val.split(",").collect {|s| s.strip }.select {|s| !s.to_s.empty? }
|
|
441
443
|
end
|
|
442
444
|
opts.on('--refresh [SECONDS]', String, "Refresh until status is running,failed. Default interval is #{default_refresh_interval} seconds.") do |val|
|
|
@@ -1200,7 +1202,15 @@ class Morpheus::Cli::Instances
|
|
|
1200
1202
|
options[:details] = true
|
|
1201
1203
|
options[:include_containers] = true
|
|
1202
1204
|
options[:include_scaling] = true
|
|
1205
|
+
options[:include_costs]
|
|
1206
|
+
end
|
|
1207
|
+
opts.on(nil, '--details', "Alias for --all" ) do
|
|
1208
|
+
options[:details] = true
|
|
1209
|
+
options[:include_containers] = true
|
|
1210
|
+
options[:include_scaling] = true
|
|
1211
|
+
options[:include_costs]
|
|
1203
1212
|
end
|
|
1213
|
+
opts.add_hidden_option('--details')
|
|
1204
1214
|
opts.on( nil, '--containers', "Display Instance Containers" ) do
|
|
1205
1215
|
options[:include_containers] = true
|
|
1206
1216
|
end
|
|
@@ -1215,9 +1225,6 @@ class Morpheus::Cli::Instances
|
|
|
1215
1225
|
opts.on( nil, '--scaling', "Display Instance Scaling Settings" ) do
|
|
1216
1226
|
options[:include_scaling] = true
|
|
1217
1227
|
end
|
|
1218
|
-
opts.on( nil, '--costs', "Display Cost and Price" ) do
|
|
1219
|
-
options[:include_costs] = true
|
|
1220
|
-
end
|
|
1221
1228
|
opts.on('--refresh [SECONDS]', String, "Refresh until status is running,failed. Default interval is #{default_refresh_interval} seconds.") do |val|
|
|
1222
1229
|
options[:refresh_until_status] ||= "running,failed"
|
|
1223
1230
|
if !val.to_s.empty?
|
|
@@ -1233,7 +1240,7 @@ class Morpheus::Cli::Instances
|
|
|
1233
1240
|
# opts.on( nil, '--lb', "Display Load Balancer Details" ) do
|
|
1234
1241
|
# options[:include_lb] = true
|
|
1235
1242
|
# end
|
|
1236
|
-
|
|
1243
|
+
build_standard_get_options(opts, options)
|
|
1237
1244
|
opts.footer = "Get details about an instance.\n" +
|
|
1238
1245
|
"[instance] is required. This is the name or id of an instance. Supports 1-N [instance] arguments."
|
|
1239
1246
|
end
|
|
@@ -1249,36 +1256,29 @@ class Morpheus::Cli::Instances
|
|
|
1249
1256
|
end
|
|
1250
1257
|
end
|
|
1251
1258
|
|
|
1252
|
-
def _get(
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
puts as_yaml(json_response, options, "instance")
|
|
1274
|
-
return 0
|
|
1275
|
-
end
|
|
1276
|
-
|
|
1277
|
-
if options[:csv]
|
|
1278
|
-
puts records_as_csv([json_response['instance']], options)
|
|
1279
|
-
return 0
|
|
1280
|
-
end
|
|
1259
|
+
def _get(id, options={})
|
|
1260
|
+
params = {}
|
|
1261
|
+
params.merge!(parse_query_options(options))
|
|
1262
|
+
# Use details=true to get more details from the appliance
|
|
1263
|
+
# if options[:details] || options[:include_containers] || options[:include_scaling]
|
|
1264
|
+
if options[:details] || options[:include_containers] || options[:include_scaling]
|
|
1265
|
+
params['details'] = true
|
|
1266
|
+
end
|
|
1267
|
+
instance = nil
|
|
1268
|
+
if id.to_s !~ /\A\d{1,}\Z/
|
|
1269
|
+
instance = find_instance_by_name_or_id(id)
|
|
1270
|
+
return 1, "Instance not found by name #{id}" if instance.nil?
|
|
1271
|
+
id = instance['id']
|
|
1272
|
+
end
|
|
1273
|
+
if options[:dry_run]
|
|
1274
|
+
print_dry_run @instances_interface.dry.get(id, params)
|
|
1275
|
+
return 0, nil
|
|
1276
|
+
end
|
|
1277
|
+
@instances_interface.setopts(options)
|
|
1278
|
+
json_response = @instances_interface.get(id, params)
|
|
1279
|
+
render_response(json_response, options, "instance") do
|
|
1281
1280
|
instance = json_response['instance']
|
|
1281
|
+
pricing = instance['instancePrice']
|
|
1282
1282
|
stats = instance['stats'] || json_response['stats'] || {}
|
|
1283
1283
|
# load_balancers = json_response['loadBalancers'] || {}
|
|
1284
1284
|
# metadata tags used to be returned as metadata and are now returned as tags
|
|
@@ -1296,7 +1296,12 @@ class Morpheus::Cli::Instances
|
|
|
1296
1296
|
# containers are fetched via separate api call
|
|
1297
1297
|
containers = nil
|
|
1298
1298
|
if options[:include_containers]
|
|
1299
|
-
|
|
1299
|
+
# todo: can use instance['containerDetails'] in api 5.2.7/5.3.2
|
|
1300
|
+
if instance['containerDetails']
|
|
1301
|
+
containers = instance['containerDetails']
|
|
1302
|
+
else
|
|
1303
|
+
containers = @instances_interface.containers(instance['id'])['containers']
|
|
1304
|
+
end
|
|
1300
1305
|
end
|
|
1301
1306
|
|
|
1302
1307
|
# threshold is fetched via separate api call too
|
|
@@ -1330,8 +1335,20 @@ class Morpheus::Cli::Instances
|
|
|
1330
1335
|
"Layout" => lambda {|it| it['layout'] ? it['layout']['name'] : '' },
|
|
1331
1336
|
"Version" => lambda {|it| it['instanceVersion'] },
|
|
1332
1337
|
"Plan" => lambda {|it| it['plan'] ? it['plan']['name'] : '' },
|
|
1333
|
-
|
|
1334
|
-
|
|
1338
|
+
"Price" => lambda {|it|
|
|
1339
|
+
if pricing
|
|
1340
|
+
pricing['price'] ? format_money(pricing['price'], (pricing['currency'] || 'USD')).to_s + ' per ' + pricing['unit'].to_s : ''
|
|
1341
|
+
elsif it['hourlyPrice']
|
|
1342
|
+
format_money(it['hourlyPrice'], (it['currency'] || 'USD')).to_s + ' per hour'
|
|
1343
|
+
end
|
|
1344
|
+
},
|
|
1345
|
+
"Cost" => lambda {|it|
|
|
1346
|
+
if pricing
|
|
1347
|
+
pricing['cost'] ? format_money(pricing['cost'], (pricing['currency'] || 'USD')).to_s + ' per ' + pricing['unit'].to_s : ''
|
|
1348
|
+
elsif it['hourlyCost']
|
|
1349
|
+
format_money(it['hourlyCost'], (it['currency'] || 'USD')).to_s + ' per hour'
|
|
1350
|
+
end
|
|
1351
|
+
},
|
|
1335
1352
|
"Environment" => 'instanceContext',
|
|
1336
1353
|
"Labels" => lambda {|it| labels ? labels.join(',') : '' },
|
|
1337
1354
|
"Tags" => lambda {|it| tags ? tags.collect {|m| "#{m['name']}: #{m['value']}" }.join(', ') : '' },
|
|
@@ -1343,6 +1360,7 @@ class Morpheus::Cli::Instances
|
|
|
1343
1360
|
end
|
|
1344
1361
|
},
|
|
1345
1362
|
#"Tenant" => lambda {|it| it['tenant'] ? it['tenant']['name'] : '' },
|
|
1363
|
+
"Apps" => lambda {|it| anded_list(it['apps'] ? it['apps'].collect {|app| app['name'] } : [])},
|
|
1346
1364
|
"Date Created" => lambda {|it| format_local_dt(it['dateCreated']) },
|
|
1347
1365
|
# "Last Updated" => lambda {|it| format_local_dt(it['lastUpdated']) },
|
|
1348
1366
|
"Power Schedule" => lambda {|it| (it['powerSchedule'] && it['powerSchedule']['type']) ? it['powerSchedule']['type']['name'] : '' },
|
|
@@ -1356,12 +1374,17 @@ class Morpheus::Cli::Instances
|
|
|
1356
1374
|
}
|
|
1357
1375
|
description_cols.delete("Labels") if labels.nil? || labels.empty?
|
|
1358
1376
|
description_cols.delete("Tags") if tags.nil? || tags.empty?
|
|
1377
|
+
description_cols.delete("Apps") if instance['apps'].nil? || instance['apps'].empty?
|
|
1359
1378
|
description_cols.delete("Power Schedule") if instance['powerSchedule'].nil?
|
|
1360
1379
|
description_cols.delete("Expire Date") if instance['expireDate'].nil?
|
|
1361
1380
|
description_cols.delete("Shutdown Date") if instance['shutdownDate'].nil?
|
|
1362
1381
|
description_cols["Removal Date"] = lambda {|it| format_local_dt(it['removalDate'])} if instance['status'] == 'pendingRemoval'
|
|
1363
1382
|
description_cols.delete("Last Deployment") if instance['lastDeploy'].nil?
|
|
1364
1383
|
description_cols.delete("Locked") if instance['locked'] != true
|
|
1384
|
+
price_value = (pricing ? pricing['price'] : instance['hourlyPrice']).to_i
|
|
1385
|
+
cost_value = (pricing ? pricing['cost'] : instance['hourlyCost']).to_i
|
|
1386
|
+
description_cols.delete("Price") if price_value == 0
|
|
1387
|
+
description_cols.delete("Cost") if cost_value == 0 || cost_value == price_value
|
|
1365
1388
|
#description_cols.delete("Environment") if instance['instanceContext'].nil?
|
|
1366
1389
|
print_description_list(description_cols, instance)
|
|
1367
1390
|
|
|
@@ -1393,15 +1416,6 @@ class Morpheus::Cli::Instances
|
|
|
1393
1416
|
print_stats_usage(stats)
|
|
1394
1417
|
end
|
|
1395
1418
|
|
|
1396
|
-
if options[:include_costs]
|
|
1397
|
-
print_h2 "Instance Cost"
|
|
1398
|
-
cost_columns = {
|
|
1399
|
-
"Cost" => lambda {|it| it['hourlyCost'] ? format_money(it['hourlyCost'], (it['currency'] || 'USD'), {sigdig:15}).to_s + ' per hour' : '' },
|
|
1400
|
-
"Price" => lambda {|it| it['hourlyPrice'] ? format_money(it['hourlyPrice'], (it['currency'] || 'USD'), {sigdig:15}).to_s + ' per hour' : '' },
|
|
1401
|
-
}
|
|
1402
|
-
print_description_list(cost_columns, instance)
|
|
1403
|
-
end
|
|
1404
|
-
|
|
1405
1419
|
print reset, "\n"
|
|
1406
1420
|
|
|
1407
1421
|
# if options[:include_lb]
|
|
@@ -1491,15 +1505,11 @@ class Morpheus::Cli::Instances
|
|
|
1491
1505
|
print cyan, "Refreshing in #{options[:refresh_interval] > 1 ? options[:refresh_interval].to_i : options[:refresh_interval]} seconds"
|
|
1492
1506
|
sleep_with_dots(options[:refresh_interval])
|
|
1493
1507
|
print "\n"
|
|
1494
|
-
_get(
|
|
1508
|
+
_get(instance['id'], options)
|
|
1495
1509
|
end
|
|
1496
1510
|
end
|
|
1497
|
-
|
|
1498
|
-
return 0
|
|
1499
|
-
rescue RestClient::Exception => e
|
|
1500
|
-
print_rest_exception(e, options)
|
|
1501
|
-
exit 1
|
|
1502
1511
|
end
|
|
1512
|
+
return 0, nil
|
|
1503
1513
|
end
|
|
1504
1514
|
|
|
1505
1515
|
def list_containers(args)
|