morpheus-cli 5.0.0 → 5.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +1 -1
  3. data/lib/morpheus/api/api_client.rb +12 -0
  4. data/lib/morpheus/api/billing_interface.rb +1 -0
  5. data/lib/morpheus/api/deploy_interface.rb +1 -1
  6. data/lib/morpheus/api/deployments_interface.rb +20 -1
  7. data/lib/morpheus/api/forgot_password_interface.rb +17 -0
  8. data/lib/morpheus/api/instances_interface.rb +7 -0
  9. data/lib/morpheus/api/search_interface.rb +13 -0
  10. data/lib/morpheus/api/servers_interface.rb +7 -0
  11. data/lib/morpheus/api/usage_interface.rb +18 -0
  12. data/lib/morpheus/cli.rb +4 -1
  13. data/lib/morpheus/cli/cli_command.rb +26 -9
  14. data/lib/morpheus/cli/commands/standard/curl_command.rb +3 -5
  15. data/lib/morpheus/cli/commands/standard/history_command.rb +3 -1
  16. data/lib/morpheus/cli/commands/standard/man_command.rb +74 -40
  17. data/lib/morpheus/cli/deploy.rb +199 -90
  18. data/lib/morpheus/cli/deployments.rb +341 -28
  19. data/lib/morpheus/cli/deploys.rb +206 -41
  20. data/lib/morpheus/cli/error_handler.rb +7 -0
  21. data/lib/morpheus/cli/forgot_password.rb +133 -0
  22. data/lib/morpheus/cli/health_command.rb +2 -2
  23. data/lib/morpheus/cli/hosts.rb +169 -32
  24. data/lib/morpheus/cli/instances.rb +83 -32
  25. data/lib/morpheus/cli/invoices_command.rb +33 -16
  26. data/lib/morpheus/cli/logs_command.rb +9 -6
  27. data/lib/morpheus/cli/mixins/deployments_helper.rb +31 -2
  28. data/lib/morpheus/cli/mixins/print_helper.rb +0 -21
  29. data/lib/morpheus/cli/mixins/provisioning_helper.rb +24 -4
  30. data/lib/morpheus/cli/option_types.rb +266 -17
  31. data/lib/morpheus/cli/remote.rb +35 -10
  32. data/lib/morpheus/cli/reports_command.rb +99 -30
  33. data/lib/morpheus/cli/search_command.rb +182 -0
  34. data/lib/morpheus/cli/setup.rb +1 -1
  35. data/lib/morpheus/cli/shell.rb +33 -11
  36. data/lib/morpheus/cli/tasks.rb +20 -21
  37. data/lib/morpheus/cli/usage_command.rb +64 -11
  38. data/lib/morpheus/cli/version.rb +1 -1
  39. data/lib/morpheus/cli/virtual_images.rb +280 -199
  40. data/lib/morpheus/cli/whoami.rb +6 -6
  41. data/lib/morpheus/cli/workflows.rb +33 -40
  42. data/lib/morpheus/formatters.rb +22 -0
  43. data/lib/morpheus/terminal.rb +6 -2
  44. metadata +7 -2
@@ -475,8 +475,8 @@ class Morpheus::Cli::HealthCommand
475
475
  opts.footer = "List health logs. These are the logs of the morpheus appliance itself."
476
476
  end
477
477
  optparse.parse!(args)
478
- if args.count != 0
479
- raise_command_error "wrong number of arguments, expected 0 and got (#{args.count}) #{args}\n#{optparse}"
478
+ if args.count > 0
479
+ options[:phrase] = args.join(" ")
480
480
  end
481
481
  connect(options)
482
482
  begin
@@ -16,10 +16,11 @@ class Morpheus::Cli::Hosts
16
16
  include Morpheus::Cli::LogsHelper
17
17
  set_command_name :hosts
18
18
  set_command_description "View and manage hosts (servers)."
19
- register_subcommands :list, :count, :get, :view, :stats, :add, :update, :remove, :logs, :start, :stop, :resize, :run_workflow, :make_managed, :upgrade_agent
20
- register_subcommands :'types' => :list_types
21
- register_subcommands :exec => :execution_request
22
- register_subcommands :wiki, :update_wiki
19
+ register_subcommands :list, :count, :get, :view, :stats, :add, :update, :remove, :logs, :start, :stop, :resize,
20
+ :run_workflow, :make_managed, :upgrade_agent, :snapshots,
21
+ {:'types' => :list_types},
22
+ {:exec => :execution_request},
23
+ :wiki, :update_wiki
23
24
  alias_subcommand :details, :get
24
25
  set_default_subcommand :list
25
26
 
@@ -53,9 +54,13 @@ class Morpheus::Cli::Hosts
53
54
  params = {}
54
55
  optparse = Morpheus::Cli::OptionParser.new do |opts|
55
56
  opts.banner = subcommand_usage()
56
- opts.on( '-a', '--account ACCOUNT', "Account Name or ID" ) do |val|
57
- options[:account] = val
57
+ opts.on('-a', '--all', "Display all details: memory and storage usage used / max values." ) do
58
+ options[:details] = true
59
+ end
60
+ opts.on('--details', "Display all details: alias for --all" ) do
61
+ options[:details] = true
58
62
  end
63
+ opts.add_hidden_option('--details')
59
64
  opts.on( '-g', '--group GROUP', "Group Name or ID" ) do |val|
60
65
  options[:group] = val
61
66
  end
@@ -105,16 +110,27 @@ class Morpheus::Cli::Hosts
105
110
  opts.on( '--created-by USER', "Created By User Username or ID" ) do |val|
106
111
  options[:created_by] = val
107
112
  end
113
+ opts.on( '--tenant TENANT', "Tenant Name or ID" ) do |val|
114
+ options[:account] = val
115
+ end
108
116
  opts.on('--details', "Display more details: memory and storage usage used / max values." ) do
109
117
  options[:details] = true
110
118
  end
119
+ opts.on('--tags Name=Value',String, "Filter by tags.") do |val|
120
+ val.split(",").each do |value_pair|
121
+ k,v = value_pair.strip.split("=")
122
+ options[:tags] ||= {}
123
+ options[:tags][k] ||= []
124
+ options[:tags][k] << (v || '')
125
+ end
126
+ end
111
127
  opts.on('--tag-compliant', "Displays only servers that are valid according to applied tag policies. Does not show servers that do not have tag policies." ) do
112
128
  params[:tagCompliant] = true
113
129
  end
114
130
  opts.on('--non-tag-compliant', "Displays only servers with tag compliance warnings." ) do
115
131
  params[:tagCompliant] = false
116
132
  end
117
- build_common_options(opts, options, [:list, :query, :json, :yaml, :csv, :fields, :dry_run, :remote])
133
+ build_standard_list_options(opts, options)
118
134
  opts.footer = "List hosts."
119
135
  end
120
136
  optparse.parse!(args)
@@ -163,6 +179,11 @@ class Morpheus::Cli::Hosts
163
179
  params['clusterId'] = cluster['id']
164
180
  end
165
181
  end
182
+ if options[:tags] && !options[:tags].empty?
183
+ options[:tags].each do |k,v|
184
+ params['tags.' + k] = v
185
+ end
186
+ end
166
187
 
167
188
  @servers_interface.setopts(options)
168
189
  if options[:dry_run]
@@ -194,6 +215,9 @@ class Morpheus::Cli::Hosts
194
215
  multi_tenant = json_response['multiTenant'] == true
195
216
  title = "Morpheus Hosts"
196
217
  subtitles = []
218
+ if account
219
+ subtitles << "Tenant: #{account['name']}".strip
220
+ end
197
221
  if group
198
222
  subtitles << "Group: #{group['name']}".strip
199
223
  end
@@ -244,31 +268,66 @@ class Morpheus::Cli::Hosts
244
268
  end
245
269
  row = {
246
270
  id: server['id'],
247
- tenant: server['account'] ? server['account']['name'] : server['accountId'],
248
271
  name: server['name'],
272
+ hostname: server['hostname'],
249
273
  platform: server['serverOs'] ? server['serverOs']['name'].upcase : 'N/A',
250
- cloud: server['zone'] ? server['zone']['name'] : '',
251
274
  type: server['computeServerType'] ? server['computeServerType']['name'] : 'unmanaged',
275
+ tenant: server['account'] ? server['account']['name'] : server['accountId'],
276
+ owner: server['owner'] ? server['owner']['username'] : server['owner'],
277
+ cloud: server['zone'] ? server['zone']['name'] : '',
278
+ ip: server['externalIp'],
279
+ internal_ip: server['internalIp'],
252
280
  nodes: server['containers'] ? server['containers'].size : '',
253
- status: format_server_status(server, cyan),
281
+ # status: format_server_status(server, cyan),
282
+ status: (options[:details]||options[:all_fields]) ? format_server_status(server, cyan) : format_server_status_friendly(server, cyan),
254
283
  power: format_server_power_state(server, cyan),
255
284
  cpu: cpu_usage_str + cyan,
256
285
  memory: memory_usage_str + cyan,
257
- storage: storage_usage_str + cyan
286
+ storage: storage_usage_str + cyan,
287
+ created: format_local_dt(server['dateCreated']),
288
+ updated: format_local_dt(server['lastUpdated']),
258
289
  }
259
290
  row
260
291
  }
261
- columns = [:id, :name, :type, :cloud, :nodes, :status, :power]
262
- if multi_tenant
263
- columns.insert(4, :tenant)
292
+ # columns = [:id, :name, :type, :cloud, :ip, :internal_ip, :nodes, :status, :power]
293
+ columns = {
294
+ "ID" => :id,
295
+ "Name" => :name,
296
+ "Hostname" => :hostname,
297
+ "Type" => :type,
298
+ "Owner" => :owner,
299
+ "Tenant" => :tenant,
300
+ "Cloud" => :cloud,
301
+ "IP" => :ip,
302
+ "Private IP" => :internal_ip,
303
+ "Nodes" => :nodes,
304
+ "Status" => :status,
305
+ "Power" => :power,
306
+ "CPU" => :cpu,
307
+ "Memory" => :memory,
308
+ "Storage" => :storage,
309
+ "Created" => :created,
310
+ "Updated" => :updated,
311
+ }
312
+ if options[:details] != true
313
+ columns.delete("Hostname")
314
+ columns.delete("Private IP")
315
+ columns.delete("Owner")
316
+ columns.delete("Tenant")
317
+ columns.delete("Power")
318
+ columns.delete("Created")
319
+ columns.delete("Updated")
264
320
  end
265
- columns += [:cpu, :memory, :storage]
266
- # custom pretty table columns ...
267
- if options[:include_fields]
268
- columns = options[:include_fields]
321
+ if !multi_tenant
322
+ columns.delete("Tenant")
269
323
  end
324
+ # columns += [:cpu, :memory, :storage]
325
+ # # custom pretty table columns ...
326
+ # if options[:include_fields]
327
+ # columns = options[:include_fields]
328
+ # end
270
329
  print cyan
271
- print as_pretty_table(rows, columns, options)
330
+ print as_pretty_table(rows, columns.upcase_keys!, options)
272
331
  print reset
273
332
  print_results_pagination(json_response)
274
333
  end
@@ -463,27 +522,31 @@ class Morpheus::Cli::Hosts
463
522
  server_columns = {
464
523
  "ID" => 'id',
465
524
  "Name" => 'name',
525
+ "Hostname" => 'hostname',
466
526
  "Description" => 'description',
467
- "Account" => lambda {|it| it['account'] ? it['account']['name'] : '' },
527
+ "Owner" => lambda {|it| it['owner'] ? it['owner']['username'] : '' },
528
+ "Tenant" => lambda {|it| it['account'] ? it['account']['name'] : '' },
468
529
  #"Group" => lambda {|it| it['group'] ? it['group']['name'] : '' },
469
530
  "Cloud" => lambda {|it| it['zone'] ? it['zone']['name'] : '' },
531
+ "IP" => lambda {|it| it['externalIp'] },
532
+ "Private IP" => lambda {|it| it['internalIp'] },
470
533
  "Type" => lambda {|it| it['computeServerType'] ? it['computeServerType']['name'] : 'unmanaged' },
471
534
  "Platform" => lambda {|it| it['serverOs'] ? it['serverOs']['name'].upcase : 'N/A' },
472
535
  "Plan" => lambda {|it| it['plan'] ? it['plan']['name'] : '' },
473
536
  "Cost" => lambda {|it| it['hourlyCost'] ? format_money(it['hourlyCost'], (it['currency'] || 'USD'), {sigdig:15}).to_s + ' per hour' : '' },
474
537
  "Price" => lambda {|it| it['hourlyPrice'] ? format_money(it['hourlyPrice'], (it['currency'] || 'USD'), {sigdig:15}).to_s + ' per hour' : '' },
475
538
  "Agent" => lambda {|it| it['agentInstalled'] ? "#{server['agentVersion'] || ''} updated at #{format_local_dt(server['lastAgentUpdate'])}" : '(not installed)' },
476
- "Status" => lambda {|it| format_server_status(it) },
477
539
  "Nodes" => lambda {|it| it['containers'] ? it['containers'].size : 0 },
478
- "Power" => lambda {|it| format_server_power_state(it) },
540
+ # "Status" => lambda {|it| format_server_status(it) },
541
+ # "Power" => lambda {|it| format_server_power_state(it) },
542
+ "Status" => lambda {|it| format_server_status_friendly(it) }, # combo
479
543
  }
480
-
481
- if server['hourlyCost'].to_f == 0
482
- server_columns.delete("Cost")
483
- end
484
- if server['hourlyPrice'].to_f == 0 || server['hourlyPrice'] == server['hourlyCost']
485
- server_columns.delete("Price")
486
- end
544
+ server_columns.delete("Hostname") if server['hostname'].to_s.empty? || server['hostname'] == server['name']
545
+ server_columns.delete("IP") if server['externalIp'].to_s.empty?
546
+ server_columns.delete("Private IP") if server['internalIp'].to_s.empty?
547
+ # server_columns.delete("Tenant") if multi_tenant != true
548
+ server_columns.delete("Cost") if server['hourlyCost'].to_f == 0
549
+ server_columns.delete("Price") if server['hourlyPrice'].to_f == 0 || server['hourlyPrice'] == server['hourlyCost']
487
550
 
488
551
  print_description_list(server_columns, server)
489
552
 
@@ -1809,6 +1872,53 @@ class Morpheus::Cli::Hosts
1809
1872
  end
1810
1873
  end
1811
1874
 
1875
+ def snapshots(args)
1876
+ options = {}
1877
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
1878
+ opts.banner = subcommand_usage("[host]")
1879
+ # no pagination yet
1880
+ # build_standard_list_options(opts, options)
1881
+ build_standard_get_options(opts, options)
1882
+ end
1883
+ optparse.parse!(args)
1884
+ verify_args!(args:args, optparse:optparse, count:1)
1885
+ connect(options)
1886
+ begin
1887
+ server = find_host_by_name_or_id(args[0])
1888
+ return 1 if server.nil?
1889
+ params = {}
1890
+ @servers_interface.setopts(options)
1891
+ if options[:dry_run]
1892
+ print_dry_run @servers_interface.dry.snapshots(server['id'], params)
1893
+ return
1894
+ end
1895
+ json_response = @servers_interface.snapshots(server['id'], params)
1896
+ snapshots = json_response['snapshots']
1897
+ render_response(json_response, options, 'snapshots') do
1898
+ print_h1 "Snapshots: #{server['name']}", [], options
1899
+ if snapshots.empty?
1900
+ print cyan,"No snapshots found",reset,"\n"
1901
+ else
1902
+ snapshot_column_definitions = {
1903
+ "ID" => lambda {|it| it['id'] },
1904
+ "Name" => lambda {|it| it['name'] },
1905
+ "Description" => lambda {|it| it['snapshotType'] ? (it['snapshotType']['name'] || it['snapshotType']['code']) : '' },
1906
+ "Date Created" => lambda {|it| format_local_dt(it['snapshotCreated']) },
1907
+ "Status" => lambda {|it| format_snapshot_status(it) }
1908
+ }
1909
+ print cyan
1910
+ print as_pretty_table(snapshots, snapshot_column_definitions.upcase_keys!, options)
1911
+ print_results_pagination({size: snapshots.size, total: snapshots.size})
1912
+ end
1913
+ print reset, "\n"
1914
+ end
1915
+ return 0
1916
+ rescue RestClient::Exception => e
1917
+ print_rest_exception(e, options)
1918
+ exit 1
1919
+ end
1920
+ end
1921
+
1812
1922
  private
1813
1923
 
1814
1924
  def find_host_by_id(id)
@@ -1925,11 +2035,38 @@ class Morpheus::Cli::Hosts
1925
2035
 
1926
2036
  def format_server_status(server, return_color=cyan)
1927
2037
  out = ""
1928
- status_string = server['status']
1929
- # todo: colorize, upcase?
1930
- out << status_string.to_s
2038
+ status_string = server['status'].to_s.downcase
2039
+ if status_string == 'provisioned'
2040
+ out = "#{cyan}#{status_string.upcase}#{return_color}"
2041
+ elsif status_string == 'provisioning'
2042
+ out = "#{cyan}#{status_string.upcase}#{cyan}"
2043
+ elsif status_string == 'failed' or status_string == 'error'
2044
+ out = "#{red}#{status_string.upcase}#{return_color}"
2045
+ else
2046
+ out = "#{yellow}#{status_string.upcase}#{return_color}"
2047
+ end
2048
+ out
2049
+ end
2050
+
2051
+ def format_server_status_friendly(server, return_color=cyan)
2052
+ out = ""
2053
+ status_string = server['status'].to_s.downcase
2054
+ if status_string == 'provisioned'
2055
+ # out = format_server_power_state(server, return_color)
2056
+ # make it looks like format_instance_status
2057
+ if server['powerState'] == 'on'
2058
+ out << "#{green}RUNNING#{return_color}"
2059
+ elsif server['powerState'] == 'off'
2060
+ out << "#{red}STOPPED#{return_color}"
2061
+ else
2062
+ out << "#{white}#{server['powerState'].to_s.upcase}#{return_color}"
2063
+ end
2064
+ else
2065
+ out = format_server_status(server, return_color)
2066
+ end
1931
2067
  out
1932
2068
  end
2069
+
1933
2070
 
1934
2071
  def make_managed_option_types(connected=true)
1935
2072
  [
@@ -19,7 +19,7 @@ class Morpheus::Cli::Instances
19
19
  :history, {:'history-details' => :history_details}, {:'history-event' => :history_event_details},
20
20
  :stats, :stop, :start, :restart, :actions, :action, :suspend, :eject, :stop_service, :start_service, :restart_service,
21
21
  :backup, :backups, :resize, :clone, :envs, :setenv, :delenv,
22
- :security_groups, :apply_security_groups, :run_workflow, :import_snapshot,
22
+ :security_groups, :apply_security_groups, :run_workflow, :import_snapshot, :snapshots,
23
23
  :console, :status_check, {:containers => :list_containers},
24
24
  :scaling, {:'scaling-update' => :scaling_update},
25
25
  :wiki, :update_wiki,
@@ -92,6 +92,20 @@ class Morpheus::Cli::Instances
92
92
  opts.on('--pending-removal-only', "Only instances pending removal.") do
93
93
  options[:deleted] = true
94
94
  end
95
+ opts.on('--labels label',String, "Filter by labels (keywords).") do |val|
96
+ val.split(",").each do |k|
97
+ options[:labels] ||= []
98
+ options[:labels] << k.strip
99
+ end
100
+ end
101
+ opts.on('--tags Name=Value',String, "Filter by tags (metadata name value pairs).") do |val|
102
+ val.split(",").each do |value_pair|
103
+ k,v = value_pair.strip.split("=")
104
+ options[:tags] ||= {}
105
+ options[:tags][k] ||= []
106
+ options[:tags][k] << (v || '')
107
+ end
108
+ end
95
109
  build_common_options(opts, options, [:list, :query, :json, :yaml, :csv, :fields, :dry_run, :remote])
96
110
  opts.footer = "List instances."
97
111
  end
@@ -132,7 +146,13 @@ class Morpheus::Cli::Instances
132
146
 
133
147
  params['showDeleted'] = true if options[:showDeleted]
134
148
  params['deleted'] = true if options[:deleted]
135
-
149
+ params['labels'] = options[:labels] if options[:labels]
150
+ if options[:tags]
151
+ options[:tags].each do |k,v|
152
+ params['tags.' + k] = v
153
+ end
154
+ end
155
+
136
156
  @instances_interface.setopts(options)
137
157
  if options[:dry_run]
138
158
  print_dry_run @instances_interface.dry.list(params)
@@ -347,18 +367,16 @@ class Morpheus::Cli::Instances
347
367
  opts.on("--environment ENV", String, "Environment code") do |val|
348
368
  options[:environment] = val.to_s
349
369
  end
350
- opts.on('--metadata LIST', String, "Metadata tags in the format 'name:value, name:value'") do |val|
370
+ opts.on('--tags LIST', String, "Metadata tags in the format 'ping=pong,flash=bang'") do |val|
351
371
  options[:metadata] = val
352
372
  end
353
- opts.on('--labels LIST', String, "Labels (keywords) in the format 'foo, bar'") do |val|
354
- #options[:tags] = val
355
- options[:tags] = val.split(',').collect {|it| it.to_s.strip }.compact.uniq.join(',')
373
+ opts.on('--metadata LIST', String, "Metadata tags in the format 'ping=pong,flash=bang'") do |val|
374
+ options[:metadata] = val
356
375
  end
357
- opts.on('--tags LIST', String, "Tags") do |val|
358
- #options[:tags] = val
359
- options[:tags] = val.split(',').collect {|it| it.to_s.strip }.compact.uniq.join(',')
376
+ opts.add_hidden_option('--metadata')
377
+ opts.on('--labels LIST', String, "Labels (keywords) in the format 'foo, bar'") do |val|
378
+ options[:labels] = val.split(',').collect {|it| it.to_s.strip }.compact.uniq.join(',')
360
379
  end
361
- opts.add_hidden_option('--tags')
362
380
  opts.on("--copies NUMBER", Integer, "Number of copies to provision") do |val|
363
381
  options[:copies] = val.to_i
364
382
  end
@@ -528,18 +546,17 @@ class Morpheus::Cli::Instances
528
546
  opts.on('--group GROUP', String, "Group Name or ID") do |val|
529
547
  options[:group] = val
530
548
  end
531
- opts.on('--metadata LIST', String, "Metadata tags in the format 'name:value, name:value'") do |val|
549
+ opts.on('--tags LIST', String, "Metadata tags in the format 'ping=pong,flash=bang'") do |val|
532
550
  options[:metadata] = val
533
551
  end
534
- opts.on('--labels LIST', String, "Labels (keywords) in the format 'foo, bar'") do |val|
535
- #params['tags'] = val
536
- params['tags'] = val.split(',').collect {|it| it.to_s.strip }.compact.uniq.join(',')
552
+ opts.on('--metadata LIST', String, "Metadata tags in the format 'ping=pong,flash=bang'") do |val|
553
+ options[:metadata] = val
537
554
  end
538
- opts.on('--tags LIST', String, "Tags") do |val|
539
- #params['tags'] = val
555
+ opts.add_hidden_option('--metadata')
556
+ opts.on('--labels LIST', String, "Labels (keywords) in the format 'foo, bar'") do |val|
557
+ # todo switch this from 'tags' to 'labels'
540
558
  params['tags'] = val.split(',').collect {|it| it.to_s.strip }.compact.uniq.join(',')
541
559
  end
542
- opts.add_hidden_option('--tags')
543
560
  opts.on('--power-schedule-type ID', String, "Power Schedule Type ID") do |val|
544
561
  params['powerScheduleType'] = val == "null" ? nil : val
545
562
  end
@@ -610,6 +627,9 @@ class Morpheus::Cli::Instances
610
627
  metadata_list = options[:metadata].split(",").select {|it| !it.to_s.empty? }
611
628
  metadata_list = metadata_list.collect do |it|
612
629
  metadata_pair = it.split(":")
630
+ if metadata_pair.size == 1 && it.include?("=")
631
+ metadata_pair = it.split("=")
632
+ end
613
633
  row = {}
614
634
  row['name'] = metadata_pair[0].to_s.strip
615
635
  row['value'] = metadata_pair[1].to_s.strip
@@ -2898,6 +2918,52 @@ class Morpheus::Cli::Instances
2898
2918
  end
2899
2919
  end
2900
2920
 
2921
+ def snapshots(args)
2922
+ options = {}
2923
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
2924
+ opts.banner = subcommand_usage("[instance]")
2925
+ # no pagination yet
2926
+ # build_standard_list_options(opts, options)
2927
+ build_standard_get_options(opts, options)
2928
+ end
2929
+ optparse.parse!(args)
2930
+ verify_args!(args:args, optparse:optparse, count:1)
2931
+ connect(options)
2932
+ begin
2933
+ instance = find_instance_by_name_or_id(args[0])
2934
+ params = {}
2935
+ @instances_interface.setopts(options)
2936
+ if options[:dry_run]
2937
+ print_dry_run @instances_interface.dry.snapshots(instance['id'], params)
2938
+ return
2939
+ end
2940
+ json_response = @instances_interface.snapshots(instance['id'], params)
2941
+ snapshots = json_response['snapshots']
2942
+ render_response(json_response, options, 'snapshots') do
2943
+ print_h1 "Snapshots: #{instance['name']} (#{instance['instanceType']['name']})", [], options
2944
+ if snapshots.empty?
2945
+ print cyan,"No snapshots found",reset,"\n"
2946
+ else
2947
+ snapshot_column_definitions = {
2948
+ "ID" => lambda {|it| it['id'] },
2949
+ "Name" => lambda {|it| it['name'] },
2950
+ "Description" => lambda {|it| it['snapshotType'] ? (it['snapshotType']['name'] || it['snapshotType']['code']) : '' },
2951
+ "Date Created" => lambda {|it| format_local_dt(it['snapshotCreated']) },
2952
+ "Status" => lambda {|it| format_snapshot_status(it) }
2953
+ }
2954
+ print cyan
2955
+ print as_pretty_table(snapshots, snapshot_column_definitions.upcase_keys!, options)
2956
+ print_results_pagination({size: snapshots.size, total: snapshots.size})
2957
+ end
2958
+ print reset, "\n"
2959
+ end
2960
+ return 0
2961
+ rescue RestClient::Exception => e
2962
+ print_rest_exception(e, options)
2963
+ exit 1
2964
+ end
2965
+ end
2966
+
2901
2967
  def import_snapshot(args)
2902
2968
  options = {}
2903
2969
  query_params = {}
@@ -4024,19 +4090,4 @@ private
4024
4090
  }
4025
4091
  end
4026
4092
 
4027
- def format_app_deploy_status(status, return_color=cyan)
4028
- out = ""
4029
- s = status.to_s.downcase
4030
- if s == 'deployed'
4031
- out << "#{green}#{s.upcase}#{return_color}"
4032
- elsif s == 'open' || s == 'archived' || s == 'committed'
4033
- out << "#{cyan}#{s.upcase}#{return_color}"
4034
- elsif s == 'failed'
4035
- out << "#{red}#{s.upcase}#{return_color}"
4036
- else
4037
- out << "#{yellow}#{s.upcase}#{return_color}"
4038
- end
4039
- out
4040
- end
4041
-
4042
4093
  end