morpheus-cli 4.2.3 → 4.2.4

Sign up to get free protection for your applications and to get access to all the features.
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