vmc 0.4.0.beta.23 → 0.4.0.beta.24
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.
- data/vmc-ng/lib/vmc.rb +1 -0
- data/vmc-ng/lib/vmc/cli.rb +5 -3
- data/vmc-ng/lib/vmc/cli/app.rb +100 -97
- data/vmc-ng/lib/vmc/cli/help.rb +1 -0
- data/vmc-ng/lib/vmc/cli/service.rb +53 -26
- data/vmc-ng/lib/vmc/cli/space.rb +67 -0
- data/vmc-ng/lib/vmc/cli/start.rb +116 -71
- data/vmc-ng/lib/vmc/cli/user.rb +6 -4
- data/vmc-ng/lib/vmc/spacing.rb +45 -0
- data/vmc-ng/lib/vmc/version.rb +1 -1
- metadata +12 -10
data/vmc-ng/lib/vmc.rb
CHANGED
data/vmc-ng/lib/vmc/cli.rb
CHANGED
@@ -10,6 +10,7 @@ require "cfoundry"
|
|
10
10
|
|
11
11
|
require "vmc/constants"
|
12
12
|
require "vmc/errors"
|
13
|
+
require "vmc/spacing"
|
13
14
|
|
14
15
|
require "vmc/cli/help"
|
15
16
|
require "vmc/cli/interactive"
|
@@ -20,6 +21,7 @@ $vmc_asked_auth = false
|
|
20
21
|
module VMC
|
21
22
|
class CLI < Mothership
|
22
23
|
include VMC::Interactive
|
24
|
+
include VMC::Spacing
|
23
25
|
include Mothership::Pretty
|
24
26
|
include Mothership::Progress
|
25
27
|
|
@@ -58,7 +60,7 @@ module VMC
|
|
58
60
|
|
59
61
|
def default_action
|
60
62
|
if option(:version)
|
61
|
-
|
63
|
+
line "vmc #{VERSION}"
|
62
64
|
else
|
63
65
|
super
|
64
66
|
end
|
@@ -98,8 +100,8 @@ module VMC
|
|
98
100
|
if !$vmc_asked_auth && e.error_code == 200
|
99
101
|
$vmc_asked_auth = true
|
100
102
|
|
101
|
-
|
102
|
-
|
103
|
+
line
|
104
|
+
line c("Not authenticated! Try logging in:", :warning)
|
103
105
|
|
104
106
|
invoke :login
|
105
107
|
|
data/vmc-ng/lib/vmc/cli/app.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require "set"
|
2
|
+
|
1
3
|
require "vmc/cli"
|
2
4
|
require "vmc/detect"
|
3
5
|
|
@@ -71,17 +73,26 @@ module VMC
|
|
71
73
|
end
|
72
74
|
|
73
75
|
if apps.empty? and !quiet?
|
74
|
-
|
75
|
-
puts "No applications."
|
76
|
+
line "No applications."
|
76
77
|
return
|
77
78
|
end
|
78
79
|
|
79
|
-
|
80
|
+
line unless quiet?
|
81
|
+
|
82
|
+
spaced(apps) do |a|
|
80
83
|
display_app(a) if app_matches(a, input)
|
81
84
|
end
|
82
85
|
end
|
83
86
|
|
84
87
|
|
88
|
+
desc "Show app information"
|
89
|
+
group :apps
|
90
|
+
input :app, :argument => :required, :from_given => by_name("app"),
|
91
|
+
:desc => "App to show"
|
92
|
+
def app(input)
|
93
|
+
display_app(input[:app])
|
94
|
+
end
|
95
|
+
|
85
96
|
desc "Push an application, syncing changes if it exists"
|
86
97
|
group :apps, :manage
|
87
98
|
input(:name, :argument => true, :desc => "Application name") {
|
@@ -243,14 +254,14 @@ module VMC
|
|
243
254
|
group :apps, :manage
|
244
255
|
input :apps, :argument => :splat, :singular => :app,
|
245
256
|
:desc => "Applications to start",
|
246
|
-
:from_given =>
|
257
|
+
:from_given => by_name("app")
|
247
258
|
input :debug_mode, :aliases => "-d",
|
248
259
|
:desc => "Debug mode to start in"
|
249
260
|
def start(input)
|
250
|
-
apps = input[:apps
|
261
|
+
apps = input[:apps]
|
251
262
|
fail "No applications given." if apps.empty?
|
252
263
|
|
253
|
-
apps
|
264
|
+
spaced(apps) do |app|
|
254
265
|
app = filter(:start_app, app)
|
255
266
|
|
256
267
|
switch_mode(app, input[:debug_mode])
|
@@ -271,7 +282,7 @@ module VMC
|
|
271
282
|
check_application(app)
|
272
283
|
|
273
284
|
if app.debug_mode && !quiet?
|
274
|
-
|
285
|
+
line
|
275
286
|
invoke :instances, :app => app
|
276
287
|
end
|
277
288
|
end
|
@@ -282,12 +293,12 @@ module VMC
|
|
282
293
|
group :apps, :manage
|
283
294
|
input :apps, :argument => :splat, :singular => :app,
|
284
295
|
:desc => "Applications to start",
|
285
|
-
:from_given =>
|
296
|
+
:from_given => by_name("app")
|
286
297
|
def stop(input)
|
287
|
-
apps = input[:apps
|
298
|
+
apps = input[:apps]
|
288
299
|
fail "No applications given." if apps.empty?
|
289
300
|
|
290
|
-
apps
|
301
|
+
spaced(apps) do |app|
|
291
302
|
with_progress("Stopping #{c(app.name, :name)}") do |s|
|
292
303
|
if app.stopped?
|
293
304
|
s.skip do
|
@@ -305,14 +316,12 @@ module VMC
|
|
305
316
|
group :apps, :manage
|
306
317
|
input :apps, :argument => :splat, :singular => :app,
|
307
318
|
:desc => "Applications to start",
|
308
|
-
:from_given =>
|
319
|
+
:from_given => by_name("app")
|
309
320
|
input :debug_mode, :aliases => "-d",
|
310
321
|
:desc => "Debug mode to start in"
|
311
322
|
def restart(input)
|
312
|
-
apps
|
313
|
-
|
314
|
-
invoke :stop, :apps => input[:apps, apps]
|
315
|
-
invoke :start, :apps => input[:apps, apps],
|
323
|
+
invoke :stop, :apps => input[:apps]
|
324
|
+
invoke :start, :apps => input[:apps],
|
316
325
|
:debug_mode => input[:debug_mode]
|
317
326
|
end
|
318
327
|
|
@@ -321,7 +330,10 @@ module VMC
|
|
321
330
|
group :apps, :manage
|
322
331
|
input(:apps, :argument => :splat, :singular => :app,
|
323
332
|
:desc => "Applications to delete",
|
324
|
-
:from_given =>
|
333
|
+
:from_given => by_name("app")) {
|
334
|
+
apps = client.apps
|
335
|
+
fail "No applications." if apps.empty?
|
336
|
+
|
325
337
|
[ask("Delete which application?", :choices => apps.sort_by(&:name),
|
326
338
|
:display => proc(&:name))]
|
327
339
|
}
|
@@ -333,32 +345,23 @@ module VMC
|
|
333
345
|
input :all, :default => false,
|
334
346
|
:desc => "Delete all applications"
|
335
347
|
def delete(input)
|
348
|
+
apps = client.apps
|
349
|
+
|
336
350
|
if input[:all]
|
337
351
|
return unless input[:really, "ALL APPS", :bad]
|
338
352
|
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
apps
|
344
|
-
with_progress("Deleting #{c(a.name, :name)}") do
|
345
|
-
a.delete!
|
346
|
-
end
|
347
|
-
end
|
348
|
-
|
349
|
-
delete_orphaned_services(orphaned, input[:orphaned])
|
350
|
-
|
351
|
-
return
|
353
|
+
to_delete = apps
|
354
|
+
others = []
|
355
|
+
else
|
356
|
+
to_delete = input[:apps]
|
357
|
+
others = apps - to_delete
|
352
358
|
end
|
353
359
|
|
354
|
-
|
355
|
-
fail "No applications." if apps.empty?
|
356
|
-
|
357
|
-
to_delete = input[:apps, apps]
|
360
|
+
orphaned = find_orphaned_services(to_delete, others)
|
358
361
|
|
359
362
|
deleted = []
|
360
|
-
to_delete
|
361
|
-
really = input[:really, app.name, :name]
|
363
|
+
spaced(to_delete) do |app|
|
364
|
+
really = input[:all] || input[:really, app.name, :name]
|
362
365
|
next unless really
|
363
366
|
|
364
367
|
deleted << app
|
@@ -368,11 +371,9 @@ module VMC
|
|
368
371
|
end
|
369
372
|
end
|
370
373
|
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
input[:orphaned])
|
375
|
-
end
|
374
|
+
delete_orphaned_services(orphaned, input[:orphaned])
|
375
|
+
|
376
|
+
to_delete
|
376
377
|
end
|
377
378
|
|
378
379
|
|
@@ -380,24 +381,24 @@ module VMC
|
|
380
381
|
group :apps, :info, :hidden => true
|
381
382
|
input :apps, :argument => :splat, :singular => :app,
|
382
383
|
:desc => "Applications to start",
|
383
|
-
:from_given =>
|
384
|
+
:from_given => by_name("app")
|
384
385
|
def instances(input)
|
385
386
|
no_v2
|
386
387
|
|
387
|
-
apps = input[:apps
|
388
|
+
apps = input[:apps]
|
388
389
|
fail "No applications given." if apps.empty?
|
389
390
|
|
390
|
-
apps
|
391
|
+
spaced(apps) do |app|
|
391
392
|
instances =
|
392
393
|
with_progress("Getting instances for #{c(app.name, :name)}") do
|
393
394
|
app.instances
|
394
395
|
end
|
395
396
|
|
396
|
-
instances
|
397
|
+
spaced(instances) do |i|
|
397
398
|
if quiet?
|
398
|
-
|
399
|
+
line i.index
|
399
400
|
else
|
400
|
-
|
401
|
+
line
|
401
402
|
display_instance(i)
|
402
403
|
end
|
403
404
|
end
|
@@ -478,7 +479,7 @@ module VMC
|
|
478
479
|
end
|
479
480
|
end
|
480
481
|
|
481
|
-
instances
|
482
|
+
spaced(instances) do |i|
|
482
483
|
logs =
|
483
484
|
with_progress(
|
484
485
|
"Getting logs for #{c(app.name, :name)}" +
|
@@ -486,16 +487,16 @@ module VMC
|
|
486
487
|
i.files("logs")
|
487
488
|
end
|
488
489
|
|
489
|
-
|
490
|
+
line unless quiet?
|
490
491
|
|
491
|
-
logs
|
492
|
+
spaced(logs) do |log|
|
492
493
|
body =
|
493
494
|
with_progress("Reading " + b(log.join("/"))) do
|
494
495
|
i.file(*log)
|
495
496
|
end
|
496
497
|
|
497
|
-
|
498
|
-
|
498
|
+
lines body
|
499
|
+
line unless body.empty?
|
499
500
|
end
|
500
501
|
end
|
501
502
|
end
|
@@ -518,7 +519,7 @@ module VMC
|
|
518
519
|
app.file(*input[:path].split("/"))
|
519
520
|
end
|
520
521
|
|
521
|
-
|
522
|
+
line unless quiet?
|
522
523
|
|
523
524
|
print file
|
524
525
|
end
|
@@ -540,9 +541,9 @@ module VMC
|
|
540
541
|
app.files(*input[:path].split("/"))
|
541
542
|
end
|
542
543
|
|
543
|
-
|
544
|
+
line unless quiet?
|
544
545
|
files.each do |file|
|
545
|
-
|
546
|
+
line file.join("/")
|
546
547
|
end
|
547
548
|
end
|
548
549
|
|
@@ -551,9 +552,9 @@ module VMC
|
|
551
552
|
group :apps, :info, :hidden => true
|
552
553
|
input :apps, :argument => :splat, :singular => :app,
|
553
554
|
:desc => "Applications to start",
|
554
|
-
:from_given =>
|
555
|
+
:from_given => by_name("app")
|
555
556
|
def health(input)
|
556
|
-
apps = input[:apps
|
557
|
+
apps = input[:apps]
|
557
558
|
fail "No applications given." if apps.empty?
|
558
559
|
|
559
560
|
health =
|
@@ -561,12 +562,10 @@ module VMC
|
|
561
562
|
apps.collect { |a| [a, app_status(a)] }
|
562
563
|
end
|
563
564
|
|
564
|
-
|
565
|
-
unless quiet?
|
566
|
-
puts ""
|
567
|
-
print "#{c(app.name, :name)}: "
|
568
|
-
end
|
565
|
+
line unless quiet?
|
569
566
|
|
567
|
+
spaced(health) do |app, status|
|
568
|
+
start_line "#{c(app.name, :name)}: " unless quiet?
|
570
569
|
puts status
|
571
570
|
end
|
572
571
|
end
|
@@ -587,21 +586,23 @@ module VMC
|
|
587
586
|
app.stats
|
588
587
|
end
|
589
588
|
|
590
|
-
stats.sort_by(&:first)
|
591
|
-
|
589
|
+
spaced(stats.sort_by(&:first)) do |idx, info|
|
590
|
+
line
|
592
591
|
|
593
592
|
if info[:state] == "DOWN"
|
594
|
-
|
593
|
+
line "Instance #{c("\##{idx}", :instance)} is down."
|
595
594
|
next
|
596
595
|
end
|
597
596
|
|
598
597
|
stats = info[:stats]
|
599
598
|
usage = stats[:usage]
|
600
|
-
|
601
|
-
|
602
|
-
|
603
|
-
|
604
|
-
|
599
|
+
line "instance #{c("\##{idx}", :instance)}:"
|
600
|
+
|
601
|
+
indented do
|
602
|
+
line "cpu: #{percentage(usage[:cpu])} of #{b(stats[:cores])} cores"
|
603
|
+
line "memory: #{usage(usage[:mem] * 1024, stats[:mem_quota])}"
|
604
|
+
line "disk: #{usage(usage[:disk], stats[:disk_quota])}"
|
605
|
+
end
|
605
606
|
end
|
606
607
|
end
|
607
608
|
|
@@ -669,10 +670,10 @@ module VMC
|
|
669
670
|
app.env
|
670
671
|
end
|
671
672
|
|
672
|
-
|
673
|
+
line unless quiet?
|
673
674
|
|
674
675
|
vars.each do |name, val|
|
675
|
-
|
676
|
+
line "#{c(name, :name)}: #{val}"
|
676
677
|
end
|
677
678
|
end
|
678
679
|
|
@@ -776,30 +777,30 @@ module VMC
|
|
776
777
|
|
777
778
|
def display_app(a)
|
778
779
|
if quiet?
|
779
|
-
|
780
|
+
line a.name
|
780
781
|
return
|
781
782
|
end
|
782
783
|
|
783
|
-
puts ""
|
784
|
-
|
785
784
|
status = app_status(a)
|
786
785
|
|
787
|
-
|
786
|
+
line "#{c(a.name, :name)}: #{status}"
|
788
787
|
|
789
|
-
|
788
|
+
indented do
|
789
|
+
line "platform: #{b(a.framework.name)} on #{b(a.runtime.name)}"
|
790
790
|
|
791
|
-
|
792
|
-
|
793
|
-
|
794
|
-
puts ""
|
791
|
+
start_line "usage: #{b(human_size(a.memory * 1024 * 1024, 0))}"
|
792
|
+
print " #{c(IS_UTF8 ? "\xc3\x97" : "x", :dim)} #{b(a.total_instances)}"
|
793
|
+
print " instance#{a.total_instances == 1 ? "" : "s"}"
|
795
794
|
|
796
|
-
|
797
|
-
|
798
|
-
|
795
|
+
line
|
796
|
+
|
797
|
+
unless a.urls.empty?
|
798
|
+
line "urls: #{a.urls.collect { |u| b(u) }.join(", ")}"
|
799
|
+
end
|
799
800
|
|
800
|
-
|
801
|
-
|
802
|
-
|
801
|
+
unless a.services.empty?
|
802
|
+
line "services: #{a.services.collect { |s| b(s.name) }.join(", ")}"
|
803
|
+
end
|
803
804
|
end
|
804
805
|
end
|
805
806
|
|
@@ -848,8 +849,8 @@ module VMC
|
|
848
849
|
with_progress("Checking #{c(app.name, :name)}") do |s|
|
849
850
|
if app.debug_mode == "suspend"
|
850
851
|
s.skip do
|
851
|
-
|
852
|
-
|
852
|
+
line "Application is in suspended debugging mode."
|
853
|
+
line "It will wait for you to attach to it before starting."
|
853
854
|
end
|
854
855
|
end
|
855
856
|
|
@@ -896,22 +897,24 @@ module VMC
|
|
896
897
|
end
|
897
898
|
|
898
899
|
def display_instance(i)
|
899
|
-
|
900
|
+
start_print "instance #{c("\##{i.index}", :instance)}: "
|
900
901
|
puts "#{b(c(i.state.downcase, state_color(i.state)))} "
|
901
902
|
|
902
|
-
|
903
|
+
indented do
|
904
|
+
line "started: #{c(i.since.strftime("%F %r"), :cyan)}"
|
903
905
|
|
904
|
-
|
905
|
-
|
906
|
-
|
906
|
+
if d = i.debugger
|
907
|
+
line "debugger: port #{b(d[:port])} at #{b(d[:ip])}"
|
908
|
+
end
|
907
909
|
|
908
|
-
|
909
|
-
|
910
|
+
if c = i.console
|
911
|
+
line "console: port #{b(c[:port])} at #{b(c[:ip])}"
|
912
|
+
end
|
910
913
|
end
|
911
914
|
end
|
912
915
|
|
913
916
|
def find_orphaned_services(apps, others = [])
|
914
|
-
orphaned =
|
917
|
+
orphaned = Set.new
|
915
918
|
|
916
919
|
apps.each do |a|
|
917
920
|
a.services.each do |i|
|
@@ -927,7 +930,7 @@ module VMC
|
|
927
930
|
def delete_orphaned_services(instances, orphaned)
|
928
931
|
return if instances.empty?
|
929
932
|
|
930
|
-
|
933
|
+
line unless quiet?
|
931
934
|
|
932
935
|
instances.select { |i|
|
933
936
|
orphaned ||
|
data/vmc-ng/lib/vmc/cli/help.rb
CHANGED
@@ -30,16 +30,28 @@ module VMC
|
|
30
30
|
client.service_instances(2)
|
31
31
|
end
|
32
32
|
|
33
|
+
line unless quiet?
|
34
|
+
|
33
35
|
if instances.empty? and !quiet?
|
34
|
-
|
35
|
-
puts "No services."
|
36
|
+
line "No services."
|
36
37
|
end
|
37
38
|
|
38
|
-
instances
|
39
|
-
|
39
|
+
spaced(instances) do |i|
|
40
|
+
display_service_instance(i) if instance_matches(i, input)
|
40
41
|
end
|
41
42
|
end
|
42
43
|
|
44
|
+
|
45
|
+
desc "Show service instance information"
|
46
|
+
group :services
|
47
|
+
input :instance, :argument => :required,
|
48
|
+
:from_given => by_name("service instance", :service_instance),
|
49
|
+
:desc => "Service instance to show"
|
50
|
+
def service(input)
|
51
|
+
display_service_instance(input[:instance])
|
52
|
+
end
|
53
|
+
|
54
|
+
|
43
55
|
services_from_label = proc { |label, services|
|
44
56
|
services.select { |s| s.label == label }
|
45
57
|
}
|
@@ -89,9 +101,19 @@ module VMC
|
|
89
101
|
services.reject! { |s| s.version != input[:version] }
|
90
102
|
end
|
91
103
|
|
104
|
+
if plan = input.given(:plan)
|
105
|
+
services.reject! { |s|
|
106
|
+
if plan.is_a?(String)
|
107
|
+
s.service_plans.none? { |p| p.name == plan.upcase }
|
108
|
+
else
|
109
|
+
s.service_plans.include? plan
|
110
|
+
end
|
111
|
+
}
|
112
|
+
end
|
113
|
+
|
92
114
|
until services.size < 2
|
93
115
|
# cast to Array since it might be given as a Service with #invoke
|
94
|
-
services = Array(input[:service, services])
|
116
|
+
services = Array(input[:service, services.sort_by(&:label)])
|
95
117
|
input.forget(:service)
|
96
118
|
end
|
97
119
|
|
@@ -130,7 +152,7 @@ module VMC
|
|
130
152
|
desc "Bind a service instance to an application"
|
131
153
|
group :services, :manage
|
132
154
|
input(:instance, :argument => true,
|
133
|
-
:from_given => by_name("instance", :service_instance),
|
155
|
+
:from_given => by_name("service instance", :service_instance),
|
134
156
|
:desc => "Service to bind") { |app|
|
135
157
|
instances = client.service_instances
|
136
158
|
fail "No service instances." if instances.empty?
|
@@ -165,20 +187,20 @@ module VMC
|
|
165
187
|
desc "Unbind a service from an application"
|
166
188
|
group :services, :manage
|
167
189
|
input(:instance, :argument => true,
|
168
|
-
:from_given => find_by_name("instance"),
|
169
|
-
:desc => "Service to bind") { |
|
170
|
-
ask "Which service instance?", :choices =>
|
190
|
+
:from_given => find_by_name("service instance"),
|
191
|
+
:desc => "Service to bind") { |app|
|
192
|
+
ask "Which service instance?", :choices => app.services,
|
171
193
|
:display => proc(&:name)
|
172
194
|
}
|
173
195
|
input(:app, :argument => true,
|
174
196
|
:from_given => find_by_name("app"),
|
175
|
-
:desc => "Application to bind to") {
|
176
|
-
ask "Which application?", :choices => apps,
|
197
|
+
:desc => "Application to bind to") {
|
198
|
+
ask "Which application?", :choices => client.apps(2),
|
177
199
|
:display => proc(&:name)
|
178
200
|
}
|
179
201
|
def unbind_service(input)
|
180
|
-
app = input[:app
|
181
|
-
instance = input[:instance, app
|
202
|
+
app = input[:app]
|
203
|
+
instance = input[:instance, app]
|
182
204
|
|
183
205
|
with_progress(
|
184
206
|
"Unbinding #{c(instance.name, :name)} from #{c(app.name, :name)}") do
|
@@ -190,8 +212,11 @@ module VMC
|
|
190
212
|
desc "Delete a service"
|
191
213
|
group :services, :manage
|
192
214
|
input(:instance, :argument => true,
|
193
|
-
:from_given =>
|
194
|
-
:desc => "Service to bind") {
|
215
|
+
:from_given => by_name("service instance", :service_instance),
|
216
|
+
:desc => "Service to bind") {
|
217
|
+
instances = client.service_instances
|
218
|
+
fail "No services." if instances.empty?
|
219
|
+
|
195
220
|
ask "Which service instance?", :choices => instances,
|
196
221
|
:display => proc(&:name)
|
197
222
|
}
|
@@ -210,10 +235,7 @@ module VMC
|
|
210
235
|
return
|
211
236
|
end
|
212
237
|
|
213
|
-
|
214
|
-
fail "No services." if instances.empty?
|
215
|
-
|
216
|
-
instance = input[:instance, instances]
|
238
|
+
instance = input[:instance]
|
217
239
|
|
218
240
|
return unless input[:really, instance.name, :name]
|
219
241
|
|
@@ -259,18 +281,23 @@ module VMC
|
|
259
281
|
true
|
260
282
|
end
|
261
283
|
|
262
|
-
def
|
284
|
+
def display_service_instance(i)
|
263
285
|
if quiet?
|
264
|
-
|
286
|
+
line i.name
|
265
287
|
else
|
266
288
|
plan = i.service_plan
|
267
289
|
service = plan.service
|
268
290
|
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
291
|
+
line "#{c(i.name, :name)}: #{service.label} #{service.version}"
|
292
|
+
|
293
|
+
indented do
|
294
|
+
line "description: #{service.description}"
|
295
|
+
line "plan: #{c(plan.name, :name)}"
|
296
|
+
|
297
|
+
indented do
|
298
|
+
line "description: #{plan.description}"
|
299
|
+
end
|
300
|
+
end
|
274
301
|
end
|
275
302
|
end
|
276
303
|
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require "vmc/cli"
|
2
|
+
|
3
|
+
module VMC
|
4
|
+
class Space < CLI
|
5
|
+
def precondition
|
6
|
+
super
|
7
|
+
fail "This command is v2-only." unless v2?
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.by_name(what, obj = what)
|
11
|
+
proc { |name, *_|
|
12
|
+
client.send(:"#{obj}_by_name", name) ||
|
13
|
+
fail("Unknown #{what} '#{name}'")
|
14
|
+
}
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "Show space information"
|
18
|
+
group :spaces
|
19
|
+
input(:space, :argument => :optional, :from_given => by_name("space"),
|
20
|
+
:desc => "Space to show") {
|
21
|
+
client.current_space
|
22
|
+
}
|
23
|
+
input :full, :type => :boolean,
|
24
|
+
:desc => "Show full information for apps, service instances, etc."
|
25
|
+
def space(input)
|
26
|
+
space = input[:space]
|
27
|
+
|
28
|
+
line "name: #{c(space.name, :name)}"
|
29
|
+
line "organization: #{c(space.organization.name, :name)}"
|
30
|
+
|
31
|
+
if input[:full]
|
32
|
+
line
|
33
|
+
line "apps:"
|
34
|
+
|
35
|
+
spaced(space.apps(2)) do |a|
|
36
|
+
indented do
|
37
|
+
invoke :app, :app => a
|
38
|
+
end
|
39
|
+
end
|
40
|
+
else
|
41
|
+
line "apps: #{name_list(space.apps)}"
|
42
|
+
end
|
43
|
+
|
44
|
+
if input[:full]
|
45
|
+
line
|
46
|
+
line "services:"
|
47
|
+
spaced(space.service_instances(2)) do |i|
|
48
|
+
indented do
|
49
|
+
invoke :service, :instance => i
|
50
|
+
end
|
51
|
+
end
|
52
|
+
else
|
53
|
+
line "services: #{name_list(space.service_instances)}"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def name_list(xs)
|
60
|
+
if xs.empty?
|
61
|
+
c("none", :dim)
|
62
|
+
else
|
63
|
+
xs.collect { |x| c(x.name, :name) }.join(", ")
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
data/vmc-ng/lib/vmc/cli/start.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require "base64"
|
2
|
+
|
1
3
|
require "vmc/cli"
|
2
4
|
|
3
5
|
module VMC
|
@@ -26,10 +28,10 @@ module VMC
|
|
26
28
|
group :start
|
27
29
|
input :runtimes, :type => :boolean,
|
28
30
|
:desc => "List supported runtimes"
|
29
|
-
input :services, :type => :boolean,
|
30
|
-
:desc => "List supported services"
|
31
31
|
input :frameworks, :type => :boolean,
|
32
32
|
:desc => "List supported frameworks"
|
33
|
+
input :services, :type => :boolean,
|
34
|
+
:desc => "List supported services"
|
33
35
|
input(:all, :type => :boolean, :alias => "-a",
|
34
36
|
:desc => "Show all information")
|
35
37
|
def info(input)
|
@@ -42,13 +44,6 @@ module VMC
|
|
42
44
|
end
|
43
45
|
end
|
44
46
|
|
45
|
-
if all || input[:services]
|
46
|
-
services =
|
47
|
-
with_progress("Getting services") do
|
48
|
-
client.services
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
47
|
if all || input[:frameworks]
|
53
48
|
frameworks =
|
54
49
|
with_progress("Getting frameworks") do
|
@@ -56,63 +51,82 @@ module VMC
|
|
56
51
|
end
|
57
52
|
end
|
58
53
|
|
54
|
+
if all || input[:services]
|
55
|
+
services =
|
56
|
+
with_progress("Getting services") do
|
57
|
+
client.services
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
59
61
|
info = client.info
|
60
62
|
|
61
63
|
showing_any = runtimes || services || frameworks
|
62
64
|
|
63
65
|
unless !all && showing_any
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
66
|
+
line if showing_any
|
67
|
+
line info[:description]
|
68
|
+
line
|
69
|
+
line "target: #{b(client.target)}"
|
70
|
+
|
71
|
+
indented do
|
72
|
+
line "version: #{info[:version]}"
|
73
|
+
line "support: #{info[:support]}"
|
74
|
+
end
|
70
75
|
|
71
76
|
if user = client.current_user
|
72
|
-
|
73
|
-
|
77
|
+
line
|
78
|
+
line "user: #{b(user.email || token_data[:email] || user.guid)}"
|
74
79
|
end
|
75
80
|
end
|
76
81
|
|
77
82
|
if runtimes
|
78
83
|
unless quiet?
|
79
|
-
|
80
|
-
|
84
|
+
line
|
85
|
+
line "runtimes:"
|
81
86
|
end
|
82
87
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
+
indented do
|
89
|
+
if runtimes.empty? && !quiet?
|
90
|
+
line "#{c("none", :dim)}"
|
91
|
+
else
|
92
|
+
spaced(runtimes) do |r|
|
93
|
+
display_runtime(r)
|
94
|
+
end
|
95
|
+
end
|
88
96
|
end
|
89
97
|
end
|
90
98
|
|
91
|
-
if
|
99
|
+
if frameworks
|
92
100
|
unless quiet?
|
93
|
-
|
94
|
-
|
101
|
+
line
|
102
|
+
line "frameworks:"
|
95
103
|
end
|
96
104
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
105
|
+
indented do
|
106
|
+
if frameworks.empty? && !quiet?
|
107
|
+
line "#{c("none", :dim)}"
|
108
|
+
else
|
109
|
+
spaced(frameworks) do |f|
|
110
|
+
display_framework(f)
|
111
|
+
end
|
112
|
+
end
|
102
113
|
end
|
103
114
|
end
|
104
115
|
|
105
|
-
if
|
116
|
+
if services
|
106
117
|
unless quiet?
|
107
|
-
|
108
|
-
|
118
|
+
line
|
119
|
+
line "services:"
|
109
120
|
end
|
110
121
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
122
|
+
indented do
|
123
|
+
if services.empty? && !quiet?
|
124
|
+
line "#{c("none", :dim)}"
|
125
|
+
else
|
126
|
+
spaced(services) do |s|
|
127
|
+
display_service(s)
|
128
|
+
end
|
129
|
+
end
|
116
130
|
end
|
117
131
|
end
|
118
132
|
end
|
@@ -137,6 +151,7 @@ module VMC
|
|
137
151
|
if !input[:interactive] && !input.given?(:url) &&
|
138
152
|
!input.given?(:organization) && !input.given?(:space)
|
139
153
|
display_target
|
154
|
+
display_org_and_space unless quiet?
|
140
155
|
return
|
141
156
|
end
|
142
157
|
|
@@ -157,6 +172,9 @@ module VMC
|
|
157
172
|
select_org_and_space(input, info)
|
158
173
|
|
159
174
|
save_target_info(info)
|
175
|
+
elsif !quiet?
|
176
|
+
line
|
177
|
+
display_org_and_space
|
160
178
|
end
|
161
179
|
end
|
162
180
|
|
@@ -165,7 +183,7 @@ module VMC
|
|
165
183
|
group :start, :hidden => true
|
166
184
|
def targets(input)
|
167
185
|
targets_info.each do |target, _|
|
168
|
-
|
186
|
+
line target
|
169
187
|
# TODO: print org/space
|
170
188
|
end
|
171
189
|
end
|
@@ -189,7 +207,7 @@ module VMC
|
|
189
207
|
ask("Space", :choices => spaces, :display => proc(&:name))
|
190
208
|
}
|
191
209
|
def login(input)
|
192
|
-
|
210
|
+
show_context
|
193
211
|
|
194
212
|
credentials =
|
195
213
|
{ :username => input[:username],
|
@@ -232,7 +250,7 @@ module VMC
|
|
232
250
|
invalidate_client
|
233
251
|
|
234
252
|
if v2?
|
235
|
-
|
253
|
+
line if input[:interactive]
|
236
254
|
select_org_and_space(input, info)
|
237
255
|
save_target_info(info)
|
238
256
|
end
|
@@ -264,7 +282,7 @@ module VMC
|
|
264
282
|
input :login, :type => :boolean, :default => true,
|
265
283
|
:desc => "Automatically log in?"
|
266
284
|
def register(input)
|
267
|
-
|
285
|
+
show_context
|
268
286
|
|
269
287
|
email = input[:email]
|
270
288
|
password = input[:password]
|
@@ -287,7 +305,7 @@ module VMC
|
|
287
305
|
group :start, :hidden => true
|
288
306
|
def colors(input)
|
289
307
|
user_colors.each do |n, c|
|
290
|
-
|
308
|
+
line "#{n}: #{c(c.to_s, n)}"
|
291
309
|
end
|
292
310
|
end
|
293
311
|
|
@@ -310,30 +328,33 @@ module VMC
|
|
310
328
|
end
|
311
329
|
end
|
312
330
|
|
313
|
-
def
|
314
|
-
return if displayed_target?
|
331
|
+
def show_context
|
332
|
+
return if quiet? || displayed_target?
|
333
|
+
|
334
|
+
display_target
|
315
335
|
|
336
|
+
line
|
337
|
+
|
338
|
+
@@displayed_target = true
|
339
|
+
end
|
340
|
+
|
341
|
+
def display_target
|
316
342
|
if quiet?
|
317
343
|
puts client.target
|
318
344
|
else
|
319
|
-
|
320
|
-
display_org_and_space
|
345
|
+
line "target: #{c(client.target, :name)}"
|
321
346
|
end
|
322
|
-
|
323
|
-
puts ""
|
324
|
-
|
325
|
-
@@displayed_target = true
|
326
347
|
end
|
327
348
|
|
328
349
|
def display_org_and_space
|
329
350
|
return unless v2?
|
330
351
|
|
331
352
|
if org = client.current_organization
|
332
|
-
|
353
|
+
line "organization: #{c(org.name, :name)}"
|
333
354
|
end
|
334
355
|
|
335
356
|
if space = client.current_space
|
336
|
-
|
357
|
+
line "space: #{c(space.name, :name)}"
|
337
358
|
end
|
338
359
|
rescue CFoundry::APIError
|
339
360
|
end
|
@@ -342,14 +363,16 @@ module VMC
|
|
342
363
|
if quiet?
|
343
364
|
puts r.name
|
344
365
|
else
|
345
|
-
|
366
|
+
line "#{c(r.name, :name)}:"
|
346
367
|
|
347
|
-
|
368
|
+
indented do
|
369
|
+
line "description: #{b(r.description)}" if r.description
|
348
370
|
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
371
|
+
# TODO: probably won't have this in final version
|
372
|
+
apps = r.apps.collect { |a| c(a.name, :name) }
|
373
|
+
app_list = apps.empty? ? c("none", :dim) : apps.join(", ")
|
374
|
+
line "apps: #{app_list}"
|
375
|
+
end
|
353
376
|
end
|
354
377
|
end
|
355
378
|
|
@@ -357,10 +380,13 @@ module VMC
|
|
357
380
|
if quiet?
|
358
381
|
puts s.label
|
359
382
|
else
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
383
|
+
line "#{c(s.label, :name)}:"
|
384
|
+
|
385
|
+
indented do
|
386
|
+
line "description: #{s.description}"
|
387
|
+
line "version: #{s.version}"
|
388
|
+
line "provider: #{s.provider}"
|
389
|
+
end
|
364
390
|
end
|
365
391
|
end
|
366
392
|
|
@@ -368,12 +394,15 @@ module VMC
|
|
368
394
|
if quiet?
|
369
395
|
puts f.name
|
370
396
|
else
|
371
|
-
|
372
|
-
puts " description: #{b(f.description)}" if f.description
|
397
|
+
line "#{c(f.name, :name)}:"
|
373
398
|
|
374
|
-
|
375
|
-
|
376
|
-
|
399
|
+
indented do
|
400
|
+
line "description: #{b(f.description)}" if f.description
|
401
|
+
|
402
|
+
# TODO: probably won't show this in final version; just for show
|
403
|
+
apps = f.apps.collect { |a| c(a.name, :name) }
|
404
|
+
line "apps: #{apps.empty? ? c("none", :dim) : apps.join(", ")}"
|
405
|
+
end
|
377
406
|
end
|
378
407
|
end
|
379
408
|
|
@@ -423,7 +452,7 @@ module VMC
|
|
423
452
|
if !input[:interactive] && spaces.size == 1 && !input.given?(:space)
|
424
453
|
space = spaces.first
|
425
454
|
else
|
426
|
-
|
455
|
+
line if input[:interactive] && changed_org
|
427
456
|
space = input[:space, spaces.sort_by(&:name)]
|
428
457
|
end
|
429
458
|
|
@@ -432,5 +461,21 @@ module VMC
|
|
432
461
|
end
|
433
462
|
end
|
434
463
|
end
|
464
|
+
|
465
|
+
# grab the metadata from a token that looks like:
|
466
|
+
#
|
467
|
+
# bearer (base64 ...)
|
468
|
+
def token_data
|
469
|
+
return @token_data if @token_data
|
470
|
+
|
471
|
+
tok = Base64.decode64(client.base.token.sub(/^bearer\s+/, ""))
|
472
|
+
tok.sub!(/\{.+?\}/, "") # clear algo
|
473
|
+
@token_data = JSON.parse(tok[/\{.+?\}/], :symbolize_names => true)
|
474
|
+
|
475
|
+
# normally i don't catch'em all, but can't expect all tokens to be the
|
476
|
+
# proper format, so just silently fail as this is not critical
|
477
|
+
rescue
|
478
|
+
{}
|
479
|
+
end
|
435
480
|
end
|
436
481
|
end
|
data/vmc-ng/lib/vmc/cli/user.rb
CHANGED
@@ -10,7 +10,7 @@ module VMC
|
|
10
10
|
client.users
|
11
11
|
end
|
12
12
|
|
13
|
-
users
|
13
|
+
spaced(users) do |u|
|
14
14
|
display_user(u)
|
15
15
|
end
|
16
16
|
end
|
@@ -91,9 +91,11 @@ module VMC
|
|
91
91
|
if quiet?
|
92
92
|
puts u.email
|
93
93
|
else
|
94
|
-
|
95
|
-
|
96
|
-
|
94
|
+
line "#{c(u.email, :name)}:"
|
95
|
+
|
96
|
+
indented do
|
97
|
+
line "admin?: #{c(u.admin?, u.admin? ? :yes : :no)}"
|
98
|
+
end
|
97
99
|
end
|
98
100
|
end
|
99
101
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module VMC
|
2
|
+
module Spacing
|
3
|
+
@@indentation = 0
|
4
|
+
|
5
|
+
def indented
|
6
|
+
@@indentation += 1
|
7
|
+
yield
|
8
|
+
ensure
|
9
|
+
@@indentation -= 1
|
10
|
+
end
|
11
|
+
|
12
|
+
def line(msg = "")
|
13
|
+
return puts "" if msg.empty?
|
14
|
+
|
15
|
+
start_line(msg)
|
16
|
+
puts ""
|
17
|
+
end
|
18
|
+
|
19
|
+
def start_line(msg)
|
20
|
+
print " " * @@indentation
|
21
|
+
print msg
|
22
|
+
end
|
23
|
+
|
24
|
+
def lines(blob)
|
25
|
+
blob.each_line do |line|
|
26
|
+
start_line(line)
|
27
|
+
end
|
28
|
+
|
29
|
+
line
|
30
|
+
end
|
31
|
+
|
32
|
+
def quiet?
|
33
|
+
false
|
34
|
+
end
|
35
|
+
|
36
|
+
def spaced(vals)
|
37
|
+
num = 0
|
38
|
+
vals.each do |val|
|
39
|
+
line unless quiet? || num == 0
|
40
|
+
yield val
|
41
|
+
num += 1
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/vmc-ng/lib/vmc/version.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vmc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 62196435
|
5
5
|
prerelease: 6
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 4
|
9
9
|
- 0
|
10
10
|
- beta
|
11
|
-
-
|
12
|
-
version: 0.4.0.beta.
|
11
|
+
- 24
|
12
|
+
version: 0.4.0.beta.24
|
13
13
|
platform: ruby
|
14
14
|
authors:
|
15
15
|
- VMware
|
@@ -17,7 +17,7 @@ autorequire:
|
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
19
|
|
20
|
-
date: 2012-07-
|
20
|
+
date: 2012-07-24 00:00:00 Z
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
23
23
|
name: json_pure
|
@@ -249,12 +249,12 @@ dependencies:
|
|
249
249
|
requirements:
|
250
250
|
- - ~>
|
251
251
|
- !ruby/object:Gem::Version
|
252
|
-
hash:
|
252
|
+
hash: 5
|
253
253
|
segments:
|
254
254
|
- 0
|
255
255
|
- 3
|
256
|
-
-
|
257
|
-
version: 0.3.
|
256
|
+
- 11
|
257
|
+
version: 0.3.11
|
258
258
|
type: :runtime
|
259
259
|
version_requirements: *id014
|
260
260
|
- !ruby/object:Gem::Dependency
|
@@ -281,12 +281,12 @@ dependencies:
|
|
281
281
|
requirements:
|
282
282
|
- - ~>
|
283
283
|
- !ruby/object:Gem::Version
|
284
|
-
hash:
|
284
|
+
hash: 13
|
285
285
|
segments:
|
286
286
|
- 0
|
287
287
|
- 4
|
288
|
-
-
|
289
|
-
version: 0.4.
|
288
|
+
- 1
|
289
|
+
version: 0.4.1
|
290
290
|
type: :runtime
|
291
291
|
version_requirements: *id016
|
292
292
|
- !ruby/object:Gem::Dependency
|
@@ -374,6 +374,7 @@ files:
|
|
374
374
|
- vmc-ng/lib/vmc/cli/help.rb
|
375
375
|
- vmc-ng/lib/vmc/cli/interactive.rb
|
376
376
|
- vmc-ng/lib/vmc/cli/service.rb
|
377
|
+
- vmc-ng/lib/vmc/cli/space.rb
|
377
378
|
- vmc-ng/lib/vmc/cli/start.rb
|
378
379
|
- vmc-ng/lib/vmc/cli/user.rb
|
379
380
|
- vmc-ng/lib/vmc/cli.rb
|
@@ -381,6 +382,7 @@ files:
|
|
381
382
|
- vmc-ng/lib/vmc/detect.rb
|
382
383
|
- vmc-ng/lib/vmc/errors.rb
|
383
384
|
- vmc-ng/lib/vmc/plugin.rb
|
385
|
+
- vmc-ng/lib/vmc/spacing.rb
|
384
386
|
- vmc-ng/lib/vmc/version.rb
|
385
387
|
- vmc-ng/lib/vmc.rb
|
386
388
|
- vmc-ng/spec/app/apps_spec.rb
|