morpheus-cli 4.2.2 → 4.2.3
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/invoices_interface.rb +2 -2
- data/lib/morpheus/cli/cli_command.rb +10 -0
- data/lib/morpheus/cli/clouds.rb +5 -3
- data/lib/morpheus/cli/invoices_command.rb +50 -30
- data/lib/morpheus/cli/option_types.rb +8 -10
- data/lib/morpheus/cli/provisioning_licenses_command.rb +8 -4
- data/lib/morpheus/cli/version.rb +1 -1
- data/lib/morpheus/formatters.rb +3 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 55a52bf8952a3690771d35f8914b7d0d6e38df15722637675195d5cf11aefa28
|
4
|
+
data.tar.gz: f20e90f2a385cc4d1bb3e8dec5d6237e8849d0e8aee1dfe0a55dbb30a895b15a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '099de15a241b8b7fa06d637a44416fe2d485c986aa203bc5b937206f7901f5459e767b5395c7c5f6987e3e4885902af4de480f85973f69fa1f292ced4cbb9415'
|
7
|
+
data.tar.gz: c11981e1aba213f0447379a4f30ace695b51af37a7626360acac64954e2bef8199839393953f27252f7ba92b8d04310789917509e182952c7906d9c246908572
|
data/Dockerfile
CHANGED
@@ -8,10 +8,10 @@ class Morpheus::InvoicesInterface < Morpheus::APIClient
|
|
8
8
|
@expires_at = expires_at
|
9
9
|
end
|
10
10
|
|
11
|
-
def get(id)
|
11
|
+
def get(id, params={})
|
12
12
|
raise "#{self.class}.get() passed a blank id!" if id.to_s == ''
|
13
13
|
url = "#{@base_url}/api/invoices/#{id}"
|
14
|
-
headers = { params:
|
14
|
+
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
15
15
|
execute(method: :get, url: url, headers: headers)
|
16
16
|
end
|
17
17
|
|
@@ -183,11 +183,21 @@ module Morpheus
|
|
183
183
|
value_label = 'on|off' # or.. true|false
|
184
184
|
elsif option_type['type'] == 'number'
|
185
185
|
value_label = 'NUMBER'
|
186
|
+
elsif option_type['type'] == 'multiSelect'
|
187
|
+
value_label = 'LIST'
|
186
188
|
# elsif option_type['type'] == 'select'
|
187
189
|
# value_label = 'SELECT'
|
188
190
|
# elsif option['type'] == 'select'
|
189
191
|
end
|
190
192
|
opts.on("--#{full_field_name} #{value_label}", String, description) do |val|
|
193
|
+
# attempt to parse JSON, this allows blank arrays for multiSelect like --tenants []
|
194
|
+
if (val.to_s[0] == '{' && val.to_s[-1] == '}') || (val.to_s[0] == '[' && val.to_s[-1] == ']')
|
195
|
+
begin
|
196
|
+
val = JSON.parse(val)
|
197
|
+
rescue
|
198
|
+
Morpheus::Logging::DarkPrinter.puts "Failed to parse option value '#{val}' as JSON" if Morpheus::Logging.debug?
|
199
|
+
end
|
200
|
+
end
|
191
201
|
cur_namespace = custom_options
|
192
202
|
field_namespace.each do |ns|
|
193
203
|
next if ns.empty?
|
data/lib/morpheus/cli/clouds.rb
CHANGED
@@ -4,11 +4,13 @@ require 'rest_client'
|
|
4
4
|
require 'optparse'
|
5
5
|
require 'morpheus/cli/cli_command'
|
6
6
|
require 'morpheus/cli/mixins/infrastructure_helper'
|
7
|
+
require 'morpheus/cli/mixins/provisioning_helper'
|
7
8
|
require 'morpheus/cli/option_types'
|
8
9
|
|
9
10
|
class Morpheus::Cli::Clouds
|
10
11
|
include Morpheus::Cli::CliCommand
|
11
12
|
include Morpheus::Cli::InfrastructureHelper
|
13
|
+
include Morpheus::Cli::ProvisioningHelper
|
12
14
|
|
13
15
|
register_subcommands :list, :count, :get, :add, :update, :remove, :security_groups, :apply_security_groups, :types => :list_cloud_types
|
14
16
|
register_subcommands :wiki, :update_wiki
|
@@ -267,14 +269,14 @@ class Morpheus::Cli::Clouds
|
|
267
269
|
|
268
270
|
# Group
|
269
271
|
group_id = nil
|
270
|
-
group = params[:group] ?
|
272
|
+
group = params[:group] ? find_group_by_name_or_id_for_provisioning(params[:group]) : nil
|
271
273
|
if group
|
272
274
|
group_id = group["id"]
|
273
275
|
else
|
274
276
|
# print_red_alert "Group not found or specified!"
|
275
277
|
# exit 1
|
276
|
-
groups_dropdown = @groups_interface.list({})['groups'].collect {|it| {'name' => it["name"], 'value' => it["id"]} }
|
277
|
-
group_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'group', 'type' => 'select', 'fieldLabel' => 'Group', '
|
278
|
+
#groups_dropdown = @groups_interface.list({})['groups'].collect {|it| {'name' => it["name"], 'value' => it["id"]} }
|
279
|
+
group_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'group', 'type' => 'select', 'fieldLabel' => 'Group', 'optionSource' => 'groups', 'required' => true, 'description' => 'Select Group.'}],options[:options],@api_client,{})
|
278
280
|
group_id = group_prompt['group']
|
279
281
|
end
|
280
282
|
cloud_payload['groupId'] = group_id
|
@@ -93,6 +93,10 @@ class Morpheus::Cli::InvoicesCommand
|
|
93
93
|
opts.on('--tenant ID', String, "View invoices for a tenant. Default is your own account.") do |val|
|
94
94
|
params['accountId'] = val
|
95
95
|
end
|
96
|
+
opts.on('--raw-data', '--raw-data', "Display Raw Data, the cost data from the cloud provider's API.") do |val|
|
97
|
+
options[:show_raw_data] = true
|
98
|
+
params['rawData'] = true
|
99
|
+
end
|
96
100
|
build_standard_list_options(opts, options)
|
97
101
|
opts.footer = "List invoices."
|
98
102
|
end
|
@@ -134,7 +138,24 @@ class Morpheus::Cli::InvoicesCommand
|
|
134
138
|
if invoices.empty?
|
135
139
|
print cyan,"No invoices found.",reset,"\n"
|
136
140
|
else
|
137
|
-
|
141
|
+
columns = [
|
142
|
+
{"INVOICE ID" => lambda {|it| it['id'] } },
|
143
|
+
{"TYPE" => lambda {|it| format_invoice_ref_type(it) } },
|
144
|
+
{"REF ID" => lambda {|it| it['refId'] } },
|
145
|
+
{"REF NAME" => lambda {|it| it['refName'] } },
|
146
|
+
#{"INTERVAL" => lambda {|it| it['interval'] } },
|
147
|
+
{"ACCOUNT" => lambda {|it| it['account'] ? it['account']['name'] : '' } },
|
148
|
+
{"ACTIVE" => lambda {|it| format_boolean(it['active']) } },
|
149
|
+
{"PERIOD" => lambda {|it| format_invoice_period(it) } },
|
150
|
+
{"START" => lambda {|it| format_date(it['startDate']) } },
|
151
|
+
{"END" => lambda {|it| it['endDate'] ? format_date(it['endDate']) : '' } },
|
152
|
+
{"PRICE" => lambda {|it| format_money(it['totalPrice']) } },
|
153
|
+
{"COST" => lambda {|it| format_money(it['totalCost']) } },
|
154
|
+
]
|
155
|
+
if options[:show_raw_data]
|
156
|
+
columns << {"RAW DATA" => lambda {|it| truncate_string(it['rawData'].to_s, 10) } }
|
157
|
+
end
|
158
|
+
print as_pretty_table(invoices, columns, options)
|
138
159
|
print_results_pagination(json_response, {:label => "invoice", :n_label => "invoices"})
|
139
160
|
end
|
140
161
|
print reset,"\n"
|
@@ -148,6 +169,9 @@ class Morpheus::Cli::InvoicesCommand
|
|
148
169
|
options = {}
|
149
170
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
150
171
|
opts.banner = subcommand_usage("[id]")
|
172
|
+
opts.on('--raw-data', '--raw-data', "Display Raw Data, the cost data from the cloud provider's API.") do |val|
|
173
|
+
options[:show_raw_data] = true
|
174
|
+
end
|
151
175
|
build_standard_get_options(opts, options)
|
152
176
|
opts.footer = "Get details about a specific invoice."
|
153
177
|
end
|
@@ -164,14 +188,17 @@ class Morpheus::Cli::InvoicesCommand
|
|
164
188
|
end
|
165
189
|
|
166
190
|
def _get(id, options)
|
167
|
-
|
191
|
+
params = {}
|
192
|
+
if options[:show_raw_data]
|
193
|
+
params['rawData'] = true
|
194
|
+
end
|
168
195
|
begin
|
169
196
|
@invoices_interface.setopts(options)
|
170
197
|
if options[:dry_run]
|
171
|
-
print_dry_run @invoices_interface.dry.get(id)
|
198
|
+
print_dry_run @invoices_interface.dry.get(id, params)
|
172
199
|
return
|
173
200
|
end
|
174
|
-
json_response = @invoices_interface.get(id)
|
201
|
+
json_response = @invoices_interface.get(id, params)
|
175
202
|
invoice = json_response['invoice']
|
176
203
|
render_result = render_with_format(json_response, options, 'invoice')
|
177
204
|
return 0 if render_result
|
@@ -190,17 +217,31 @@ class Morpheus::Cli::InvoicesCommand
|
|
190
217
|
"Active" => lambda {|it| format_boolean(it['active']) },
|
191
218
|
"Period" => lambda {|it| format_invoice_period(it) },
|
192
219
|
#"Interval" => lambda {|it| it['interval'] },
|
193
|
-
"Start" => lambda {|it|
|
194
|
-
"End" => lambda {|it| it['endDate'] ?
|
220
|
+
"Start" => lambda {|it| format_date(it['startDate']) },
|
221
|
+
"End" => lambda {|it| it['endDate'] ? format_date(it['endDate']) : '' },
|
195
222
|
"Estimate" => lambda {|it| format_boolean(it['estimate']) },
|
196
|
-
"Price" => lambda {|it| format_money(it['
|
197
|
-
"Cost" => lambda {|it| format_money(it['
|
223
|
+
"Compute Price" => lambda {|it| format_money(it['computePrice']) },
|
224
|
+
"Compute Cost" => lambda {|it| format_money(it['computeCost']) },
|
225
|
+
"Memory Price" => lambda {|it| format_money(it['memoryPrice']) },
|
226
|
+
"Memory Cost" => lambda {|it| format_money(it['memoryCost']) },
|
227
|
+
"Storage Price" => lambda {|it| format_money(it['storagePrice']) },
|
228
|
+
"Storage Cost" => lambda {|it| format_money(it['storageCost']) },
|
229
|
+
"Network Price" => lambda {|it| format_money(it['networkPrice']) },
|
230
|
+
"Network Cost" => lambda {|it| format_money(it['networkCost']) },
|
231
|
+
"License Price" => lambda {|it| format_money(it['licensePrice']) },
|
232
|
+
"License Cost" => lambda {|it| format_money(it['licenseCost']) },
|
233
|
+
"Extra Price" => lambda {|it| format_money(it['extraPrice']) },
|
234
|
+
"Extra Cost" => lambda {|it| format_money(it['extraCost']) },
|
235
|
+
"Running Price" => lambda {|it| format_money(it['runningPrice']) },
|
236
|
+
"Running Cost" => lambda {|it| format_money(it['runningCost']) },
|
237
|
+
"Total Price" => lambda {|it| format_money(it['totalPrice']) },
|
238
|
+
"Total Cost" => lambda {|it| format_money(it['totalCost']) },
|
198
239
|
# "Created" => lambda {|it| format_local_dt(it['dateCreated']) },
|
199
240
|
# "Updated" => lambda {|it| format_local_dt(it['lastUpdated']) }
|
200
241
|
}
|
201
242
|
print_description_list(description_cols, invoice)
|
202
243
|
|
203
|
-
if
|
244
|
+
if options[:show_raw_data]
|
204
245
|
print_h2 "Raw Data"
|
205
246
|
puts invoice['rawData']
|
206
247
|
end
|
@@ -253,27 +294,6 @@ class Morpheus::Cli::InvoicesCommand
|
|
253
294
|
# end
|
254
295
|
# end
|
255
296
|
|
256
|
-
def print_invoices_table(invoices, opts={})
|
257
|
-
columns = [
|
258
|
-
{"INVOICE ID" => lambda {|it| it['id'] } },
|
259
|
-
{"TYPE" => lambda {|it| format_invoice_ref_type(it) } },
|
260
|
-
{"REF ID" => lambda {|it| it['refId'] } },
|
261
|
-
{"REF NAME" => lambda {|it| it['refName'] } },
|
262
|
-
#{"INTERVAL" => lambda {|it| it['interval'] } },
|
263
|
-
{"ACCOUNT" => lambda {|it| it['account'] ? it['account']['name'] : '' } },
|
264
|
-
{"ACTIVE" => lambda {|it| format_boolean(it['active']) } },
|
265
|
-
{"PERIOD" => lambda {|it| format_invoice_period(it) } },
|
266
|
-
{"START" => lambda {|it| format_local_dt(it['startDate']) } },
|
267
|
-
{"END" => lambda {|it| it['endDate'] ? format_local_dt(it['endDate']) : '' } },
|
268
|
-
{"PRICE" => lambda {|it| format_money(it['totalPrice']) } },
|
269
|
-
{"COST" => lambda {|it| format_money(it['totalCost']) } },
|
270
|
-
]
|
271
|
-
if opts[:include_fields]
|
272
|
-
columns = opts[:include_fields]
|
273
|
-
end
|
274
|
-
print as_pretty_table(invoices, columns, opts)
|
275
|
-
end
|
276
|
-
|
277
297
|
def format_invoice_ref_type(it)
|
278
298
|
if it['refType'] == 'ComputeZone'
|
279
299
|
"Cloud"
|
@@ -111,17 +111,15 @@ module Morpheus
|
|
111
111
|
elsif option_type['type'] == 'select'
|
112
112
|
value = select_prompt(option_type.merge({'defaultValue' => value, 'defaultInputValue' => input_value}), api_client, (api_params || {}).merge(results), true)
|
113
113
|
elsif option_type['type'] == 'multiSelect'
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
end
|
121
|
-
value = select_value_list
|
122
|
-
else
|
123
|
-
value = select_prompt(option_type.merge({'defaultValue' => value, 'defaultInputValue' => input_value}), api_client, (api_params || {}).merge(results), true)
|
114
|
+
# support value as csv like "thing1, thing2"
|
115
|
+
value_list = value.is_a?(String) ? value.parse_csv.collect {|v| v ? v.to_s.strip : v } : [value].flatten
|
116
|
+
input_value_list = input_value.is_a?(String) ? input_value.parse_csv.collect {|v| v ? v.to_s.strip : v } : [input_value].flatten
|
117
|
+
select_value_list = []
|
118
|
+
value_list.each_with_index do |v, i|
|
119
|
+
select_value_list << select_prompt(option_type.merge({'defaultValue' => v, 'defaultInputValue' => input_value_list[i]}), api_client, (api_params || {}).merge(results), true)
|
124
120
|
end
|
121
|
+
value = select_value_list
|
122
|
+
|
125
123
|
end
|
126
124
|
if options[:always_prompt] != true
|
127
125
|
value_found = true
|
@@ -4,9 +4,7 @@ class Morpheus::Cli::ProvisioningLicensesCommand
|
|
4
4
|
include Morpheus::Cli::CliCommand
|
5
5
|
set_command_name :'provisioning-licenses'
|
6
6
|
register_subcommands :list, :get, :add, :update, :remove, :reservations, :'list-types'
|
7
|
-
|
8
7
|
set_command_hidden
|
9
|
-
|
10
8
|
def connect(opts)
|
11
9
|
@api_client = establish_remote_appliance_connection(opts)
|
12
10
|
@provisioning_licenses_interface = @api_client.provisioning_licenses
|
@@ -55,11 +53,12 @@ class Morpheus::Cli::ProvisioningLicensesCommand
|
|
55
53
|
{"ID" => lambda {|license| license['id'] } },
|
56
54
|
{"NAME" => lambda {|license| license['name'] } },
|
57
55
|
{"LICENSE TYPE" => lambda {|license| license['licenseType']['name'] rescue license['licenseType'] } },
|
56
|
+
{"VERSION" => lambda {|license| license['licenseVersion'] } },
|
58
57
|
{"COPIES" => lambda {|license|
|
59
58
|
"#{license['reservationCount']}/#{license['copies']}"
|
60
59
|
} },
|
61
|
-
{"TENANTS" => lambda {|it| it['tenants'] ? it['tenants'].collect {|acnt| acnt['name']}.join(', ') : '' } },
|
62
60
|
{"VIRTUAL IMAGES" => lambda {|it| it['virtualImages'] ? it['virtualImages'].collect {|v| v['name']}.join(', ') : '' } },
|
61
|
+
{"TENANTS" => lambda {|it| it['tenants'] ? it['tenants'].collect {|acnt| acnt['name']}.join(', ') : '' } },
|
63
62
|
]
|
64
63
|
if options[:include_fields]
|
65
64
|
columns = options[:include_fields]
|
@@ -121,11 +120,16 @@ class Morpheus::Cli::ProvisioningLicensesCommand
|
|
121
120
|
{"Name" => lambda {|license| license['name'] } },
|
122
121
|
{"License Type" => lambda {|license| license['licenseType']['name'] rescue license['licenseType'] } },
|
123
122
|
{"License Key" => lambda {|license| license['licenseKey'] } },
|
123
|
+
{"Org Name" => lambda {|license| license['orgName'] } },
|
124
|
+
{"Full Name" => lambda {|license| license['fullName'] } },
|
125
|
+
{"Version" => lambda {|license| license['licenseVersion'] } },
|
126
|
+
{"Description" => lambda {|license| license['description'] } },
|
124
127
|
{"Copies" => lambda {|license|
|
125
128
|
"#{license['reservationCount']}/#{license['copies']}"
|
126
129
|
} },
|
127
|
-
{"
|
130
|
+
{"Description" => lambda {|license| license['description'] } },
|
128
131
|
{"Virtual Images" => lambda {|it| it['virtualImages'] ? it['virtualImages'].collect {|v| v['name']}.join(', ') : '' } },
|
132
|
+
{"Tenants" => lambda {|it| it['tenants'] ? it['tenants'].collect {|acnt| acnt['name']}.join(', ') : '' } },
|
129
133
|
]
|
130
134
|
print_description_list(columns, license, options)
|
131
135
|
print reset,"\n"
|
data/lib/morpheus/cli/version.rb
CHANGED
data/lib/morpheus/formatters.rb
CHANGED
@@ -2,6 +2,7 @@ require 'time'
|
|
2
2
|
require 'filesize'
|
3
3
|
require 'money'
|
4
4
|
|
5
|
+
DEFAULT_DATE_FORMAT = "%x"
|
5
6
|
DEFAULT_TIME_FORMAT = "%x %I:%M %p"
|
6
7
|
ALTERNATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'"
|
7
8
|
|
@@ -64,11 +65,11 @@ def format_local_dt(dt, options={})
|
|
64
65
|
end
|
65
66
|
|
66
67
|
def format_date(dt, options={})
|
67
|
-
format_dt(dt,
|
68
|
+
format_dt(dt, {format: DEFAULT_DATE_FORMAT}.merge(options))
|
68
69
|
end
|
69
70
|
|
70
71
|
def format_local_date(dt, options={})
|
71
|
-
format_dt(dt, {local: true, format:
|
72
|
+
format_dt(dt, {local: true, format: DEFAULT_DATE_FORMAT}.merge(options))
|
72
73
|
end
|
73
74
|
|
74
75
|
def format_dt_as_param(dt)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: morpheus-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.2.
|
4
|
+
version: 4.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Estes
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2020-03-
|
14
|
+
date: 2020-03-17 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: bundler
|