morpheus-cli 4.2.3 → 4.2.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 55a52bf8952a3690771d35f8914b7d0d6e38df15722637675195d5cf11aefa28
4
- data.tar.gz: f20e90f2a385cc4d1bb3e8dec5d6237e8849d0e8aee1dfe0a55dbb30a895b15a
3
+ metadata.gz: 9cb4101fbb710060028dcbfcda3ad4caeb117950e68506f804a6d0fa604c8c08
4
+ data.tar.gz: 5d12f8d57d4d4ad8b83a8f9fc731e893b6f29ae6a8b36faa0bb5cb4b904d4eb8
5
5
  SHA512:
6
- metadata.gz: '099de15a241b8b7fa06d637a44416fe2d485c986aa203bc5b937206f7901f5459e767b5395c7c5f6987e3e4885902af4de480f85973f69fa1f292ced4cbb9415'
7
- data.tar.gz: c11981e1aba213f0447379a4f30ace695b51af37a7626360acac64954e2bef8199839393953f27252f7ba92b8d04310789917509e182952c7906d9c246908572
6
+ metadata.gz: c1673ab1af718c3570d502ba4323102e58999b2c2a8c883df79c6043a84ba92c9a49fe831160cd273f5912d1624965be0dbc854a78b23105d8e2a6768cd5ec17
7
+ data.tar.gz: 644dc0ded92efb77ca3c3007c7dc0d84c3e147c6f42acb49b5635024a4ea268ba9a5887af4733589a8b6794e0f6a67432252fe9f66ff50d88e9a5b05981d96b5
data/Dockerfile CHANGED
@@ -1,5 +1,5 @@
1
1
  FROM ruby:2.5.1
2
2
 
3
- RUN gem install morpheus-cli -v 4.2.3
3
+ RUN gem install morpheus-cli -v 4.2.4
4
4
 
5
5
  ENTRYPOINT ["morpheus"]
@@ -23,7 +23,18 @@ class Morpheus::Cli::InvoicesCommand
23
23
  ref_ids = []
24
24
  optparse = Morpheus::Cli::OptionParser.new do |opts|
25
25
  opts.banner = subcommand_usage()
26
- opts.on('--type TYPE', String, "Find invoices for a Ref Type eg. ComputeSite (Group), ComputeZone (Cloud), ComputeServer (Host), Instance, Container, User") do |val|
26
+ opts.on('-a', '--all', "Display all costs, prices and raw data" ) do
27
+ options[:show_costs] = true
28
+ options[:show_prices] = true
29
+ options[:show_raw_data] = true
30
+ end
31
+ opts.on('--costs', '--costs', "Display all costs: Compute, Memory, Storage, etc." ) do
32
+ options[:show_costs] = true
33
+ end
34
+ opts.on('--prices', '--prices', "Display all costs: Compute, Memory, Storage, etc." ) do
35
+ options[:show_prices] = true
36
+ end
37
+ opts.on('--type TYPE', String, "Filter by Ref Type eg. ComputeSite (Group), ComputeZone (Cloud), ComputeServer (Host), Instance, Container, User") do |val|
27
38
  if val.to_s.downcase == 'cloud' || val.to_s.downcase == 'zone'
28
39
  params['refType'] = 'ComputeZone'
29
40
  elsif val.to_s.downcase == 'instance'
@@ -40,43 +51,40 @@ class Morpheus::Cli::InvoicesCommand
40
51
  params['refType'] = val
41
52
  end
42
53
  end
43
- opts.on('--ref-id ID', String, "Find invoices for a Ref ID") do |val|
54
+ opts.on('--id ID', String, "Filter by Ref ID") do |val|
44
55
  ref_ids << val
45
56
  end
46
- opts.on('--group ID', String, "Find invoices for a Group") do |val|
47
- # params['siteId'] = val
48
- params['refType'] = 'ComputeSite'
57
+ opts.on('--ref-id ID', String, "Filter by Ref ID") do |val|
49
58
  ref_ids << val
50
59
  end
51
- opts.on('--cloud ID', String, "Find invoices for a Cloud") do |val|
52
- # params['zoneId'] = val
53
- params['refType'] = 'ComputeZone'
54
- ref_ids << val
60
+ opts.add_hidden_option('--ref-id')
61
+ opts.on('--group ID', String, "Filter by Group") do |val|
62
+ params['siteId'] ||= []
63
+ params['siteId'] << val
55
64
  end
56
- opts.on('--instance ID', String, "Find invoices for an Instance") do |val|
57
- # params['instanceId'] = val
58
- params['refType'] = 'Instance'
59
- ref_ids << val
65
+ opts.on('--cloud ID', String, "Filter by Cloud") do |val|
66
+ params['zoneId'] ||= []
67
+ params['zoneId'] << val
60
68
  end
61
- opts.on('--container ID', String, "Find invoices for a Container") do |val|
62
- # params['instanceId'] = val
63
- params['refType'] = 'Container'
64
- ref_ids << val
69
+ opts.on('--instance ID', String, "Filter by Instance") do |val|
70
+ params['instanceId'] ||= []
71
+ params['instanceId'] << val
65
72
  end
66
- opts.on('--server ID', String, "Find invoices for a Server (Host)") do |val|
67
- # params['serverId'] = val
68
- params['refType'] = 'ComputeServer'
69
- ref_ids << val
73
+ opts.on('--container ID', String, "Filter by Container") do |val|
74
+ params['containerId'] ||= []
75
+ params['containerId'] << val
70
76
  end
71
- opts.on('--user ID', String, "Find invoices for a User") do |val|
72
- # params['userId'] = val
73
- params['refType'] = 'User'
74
- ref_ids << val
77
+ opts.on('--server ID', String, "Filter by Server (Host)") do |val|
78
+ params['serverId'] ||= []
79
+ params['serverId'] << val
80
+ end
81
+ opts.on('--user ID', String, "Filter by User") do |val|
82
+ params['userId'] ||= []
83
+ params['userId'] << val
75
84
  end
76
85
  # opts.on('--cluster ID', String, "Filter by Cluster") do |val|
77
- # # params['clusterId'] = val
78
- # params['refType'] = 'ComputeServerGroup'
79
- # params['refId'] = val.to_i
86
+ # params['clusterId'] ||= []
87
+ # params['clusterId'] << val
80
88
  # end
81
89
  opts.on('--start DATE', String, "Start date in the format YYYY-MM-DD.") do |val|
82
90
  params['startDate'] = val #parse_time(val).utc.iso8601
@@ -90,12 +98,14 @@ class Morpheus::Cli::InvoicesCommand
90
98
  opts.on('--active [true|false]',String, "Filter by active.") do |val|
91
99
  params['active'] = (val.to_s != 'false' && val.to_s != 'off')
92
100
  end
101
+ opts.on('--estimate [true|false]',String, "Filter by estimate.") do |val|
102
+ params['estimate'] = (val.to_s != 'false' && val.to_s != 'off')
103
+ end
93
104
  opts.on('--tenant ID', String, "View invoices for a tenant. Default is your own account.") do |val|
94
105
  params['accountId'] = val
95
106
  end
96
107
  opts.on('--raw-data', '--raw-data', "Display Raw Data, the cost data from the cloud provider's API.") do |val|
97
108
  options[:show_raw_data] = true
98
- params['rawData'] = true
99
109
  end
100
110
  build_standard_list_options(opts, options)
101
111
  opts.footer = "List invoices."
@@ -108,6 +118,7 @@ class Morpheus::Cli::InvoicesCommand
108
118
  return 1
109
119
  end
110
120
  begin
121
+ params['rawData'] = true if options[:show_raw_data]
111
122
  params['refId'] = ref_ids unless ref_ids.empty?
112
123
  params.merge!(parse_list_options(options))
113
124
  @invoices_interface.setopts(options)
@@ -116,7 +127,7 @@ class Morpheus::Cli::InvoicesCommand
116
127
  return
117
128
  end
118
129
  json_response = @invoices_interface.list(params)
119
- render_result = render_with_format(json_response, options, 'invoice')
130
+ render_result = render_with_format(json_response, options, 'invoices')
120
131
  return 0 if render_result
121
132
  invoices = json_response['invoices']
122
133
  title = "Morpheus Invoices"
@@ -138,22 +149,62 @@ class Morpheus::Cli::InvoicesCommand
138
149
  if invoices.empty?
139
150
  print cyan,"No invoices found.",reset,"\n"
140
151
  else
152
+ current_date = Time.now
153
+ current_period = "#{current_date.year}#{current_date.month.to_s.rjust(2, '0')}"
141
154
  columns = [
142
155
  {"INVOICE ID" => lambda {|it| it['id'] } },
143
156
  {"TYPE" => lambda {|it| format_invoice_ref_type(it) } },
144
157
  {"REF ID" => lambda {|it| it['refId'] } },
145
158
  {"REF NAME" => lambda {|it| it['refName'] } },
146
159
  #{"INTERVAL" => lambda {|it| it['interval'] } },
160
+ {"CLOUD" => lambda {|it| it['cloud'] ? it['cloud']['name'] : '' } },
147
161
  {"ACCOUNT" => lambda {|it| it['account'] ? it['account']['name'] : '' } },
148
162
  {"ACTIVE" => lambda {|it| format_boolean(it['active']) } },
163
+ #{"ESTIMATE" => lambda {|it| format_boolean(it['estimate']) } },
149
164
  {"PERIOD" => lambda {|it| format_invoice_period(it) } },
150
165
  {"START" => lambda {|it| format_date(it['startDate']) } },
151
166
  {"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']) } },
167
+
154
168
  ]
169
+ if options[:show_costs]
170
+ columns += [
171
+ {"COMPUTE" => lambda {|it| format_money(it['computeCost']) } },
172
+ # {"MEMORY" => lambda {|it| format_money(it['memoryCost']) } },
173
+ {"STORAGE" => lambda {|it| format_money(it['storageCost']) } },
174
+ {"NETWORK" => lambda {|it| format_money(it['networkCost']) } },
175
+ {"OTHER" => lambda {|it| format_money(it['extraCost']) } },
176
+ ]
177
+ end
178
+ columns += [
179
+ {"MTD" => lambda {|it| format_money(it['runningCost']) } },
180
+ {"TOTAL" => lambda {|it|
181
+ if it['period'] == current_period && it['totalCost'].to_f > 0
182
+ format_money(it['totalCost']) + " (Projected)"
183
+ else
184
+ format_money(it['totalCost'])
185
+ end
186
+ } }
187
+ ]
188
+ if options[:show_prices]
189
+ columns += [
190
+ {"COMPUTE PRICE" => lambda {|it| format_money(it['computePrice']) } },
191
+ # {"MEMORY PRICE" => lambda {|it| format_money(it['memoryPrice']) } },
192
+ {"STORAGE PRICE" => lambda {|it| format_money(it['storagePrice']) } },
193
+ {"NETWORK PRICE" => lambda {|it| format_money(it['networkPrice']) } },
194
+ {"OTHER PRICE" => lambda {|it| format_money(it['extraPrice']) } },
195
+ {"MTD PRICE" => lambda {|it| format_money(it['runningPrice']) } },
196
+ {"TOTAL PRICE" => lambda {|it|
197
+ if it['period'] == current_period && it['totalPrice'].to_f > 0
198
+ format_money(it['totalPrice']) + " (Projected)"
199
+ else
200
+ format_money(it['totalPrice'])
201
+ end
202
+ } }
203
+ ]
204
+ end
205
+
155
206
  if options[:show_raw_data]
156
- columns << {"RAW DATA" => lambda {|it| truncate_string(it['rawData'].to_s, 10) } }
207
+ columns += [{"RAW DATA" => lambda {|it| truncate_string(it['rawData'].to_s, 10) } }]
157
208
  end
158
209
  print as_pretty_table(invoices, columns, options)
159
210
  print_results_pagination(json_response, {:label => "invoice", :n_label => "invoices"})
@@ -220,26 +271,75 @@ class Morpheus::Cli::InvoicesCommand
220
271
  "Start" => lambda {|it| format_date(it['startDate']) },
221
272
  "End" => lambda {|it| it['endDate'] ? format_date(it['endDate']) : '' },
222
273
  "Estimate" => lambda {|it| format_boolean(it['estimate']) },
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']) },
239
- # "Created" => lambda {|it| format_local_dt(it['dateCreated']) },
240
- # "Updated" => lambda {|it| format_local_dt(it['lastUpdated']) }
274
+ "Created" => lambda {|it| format_local_dt(it['dateCreated']) },
275
+ "Updated" => lambda {|it| format_local_dt(it['lastUpdated']) }
241
276
  }
242
277
  print_description_list(description_cols, invoice)
278
+ =begin
279
+ print_h2 "Costs"
280
+ cost_columns = {
281
+ "Compute" => lambda {|it| format_money(it['computeCost']) },
282
+ "Memory" => lambda {|it| format_money(it['memoryCost']) },
283
+ "Storage" => lambda {|it| format_money(it['storageCost']) },
284
+ "Network" => lambda {|it| format_money(it['networkCost']) },
285
+ "License" => lambda {|it| format_money(it['licenseCost']) },
286
+ "Other" => lambda {|it| format_money(it['extraCost']) },
287
+ "Running" => lambda {|it| format_money(it['runningCost']) },
288
+ "Total Cost" => lambda {|it| format_money(it['totalCost']) },
289
+ }
290
+ print as_pretty_table([invoice], cost_columns, options)
291
+
292
+ print_h2 "Prices"
293
+ price_columns = {
294
+ "Compute" => lambda {|it| format_money(it['computePrice']) },
295
+ "Memory" => lambda {|it| format_money(it['memoryPrice']) },
296
+ "Storage" => lambda {|it| format_money(it['storagePrice']) },
297
+ "Network" => lambda {|it| format_money(it['networkPrice']) },
298
+ "License" => lambda {|it| format_money(it['licensePrice']) },
299
+ "Other" => lambda {|it| format_money(it['extraPrice']) },
300
+ "Running" => lambda {|it| format_money(it['runningPrice']) },
301
+ "Total Price" => lambda {|it| format_money(it['totalPrice']) },
302
+ }
303
+ print as_pretty_table([invoice], price_columns, options)
304
+ =end
305
+
306
+ current_date = Time.now
307
+ current_period = "#{current_date.year}#{current_date.month.to_s.rjust(2, '0')}"
308
+
309
+ print "\n"
310
+ # print_h2 "Costs"
311
+ cost_rows = [
312
+ {label: 'Cost'.upcase, compute: invoice['computeCost'], memory: invoice['memoryCost'], storage: invoice['storageCost'], network: invoice['networkCost'], license: invoice['licenseCost'], extra: invoice['extraCost'], running: invoice['runningCost'], total: invoice['totalCost']},
313
+ {label: 'Price'.upcase, compute: invoice['computePrice'], memory: invoice['memoryPrice'], storage: invoice['storagePrice'], network: invoice['networkPrice'], license: invoice['licensePrice'], extra: invoice['extraPrice'], running: invoice['runningPrice'], total: invoice['totalPrice']},
314
+ ]
315
+ cost_columns = {
316
+ "" => lambda {|it| it[:label] },
317
+ "Compute".upcase => lambda {|it| format_money(it[:compute]) },
318
+ "Memory".upcase => lambda {|it| format_money(it[:memory]) },
319
+ "Storage".upcase => lambda {|it| format_money(it[:storage]) },
320
+ "Network".upcase => lambda {|it| format_money(it[:network]) },
321
+ "License".upcase => lambda {|it| format_money(it[:license]) },
322
+ "Other".upcase => lambda {|it| format_money(it[:extra]) },
323
+ "MTD" => lambda {|it| format_money(it[:running]) },
324
+ "Total".upcase => lambda {|it|
325
+ if invoice['period'] == current_period && it[:total].to_f > 0
326
+ format_money(it[:total]) + " (Projected)"
327
+ else
328
+ format_money(it[:total])
329
+ end
330
+ },
331
+ }
332
+ # remove columns that rarely have data...
333
+ if cost_rows.sum { |it| it[:memory].to_f } == 0
334
+ cost_columns.delete("Memory".upcase)
335
+ end
336
+ if cost_rows.sum { |it| it[:license].to_f } == 0
337
+ cost_columns.delete("License".upcase)
338
+ end
339
+ if cost_rows.sum { |it| it[:extra].to_f } == 0
340
+ cost_columns.delete("Other".upcase)
341
+ end
342
+ print as_pretty_table(cost_rows, cost_columns, options)
243
343
 
244
344
  if options[:show_raw_data]
245
345
  print_h2 "Raw Data"
@@ -1,6 +1,6 @@
1
1
 
2
2
  module Morpheus
3
3
  module Cli
4
- VERSION = "4.2.3"
4
+ VERSION = "4.2.4"
5
5
  end
6
6
  end
@@ -346,6 +346,9 @@ end
346
346
  def format_money(amount, currency='usd')
347
347
  if amount.to_f == 0
348
348
  return currency_sym(currency).to_s + "0"
349
+ # elsif amount.to_f < 0.01
350
+ # # return exponent notation like 3.4e-09
351
+ # return currency_sym(currency).to_s + "#{amount}"
349
352
  else
350
353
  rtn = amount.to_f.round(2).to_s
351
354
  if rtn.index('.').nil?
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.3
4
+ version: 4.2.4
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-17 00:00:00.000000000 Z
14
+ date: 2020-03-18 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: bundler