vmc 0.4.0.beta.30 → 0.4.0.beta.31
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/cli.rb +4 -0
- data/vmc-ng/lib/vmc/cli/app.rb +6 -5
- data/vmc-ng/lib/vmc/plugin.rb +9 -4
- data/vmc-ng/lib/vmc/version.rb +1 -1
- data/vmc-ng/spec/app/push_spec.rb +16 -13
- data/vmc-ng/spec/assets/hello-sinatra/Gemfile +2 -0
- data/vmc-ng/spec/assets/hello-sinatra/main.rb +5 -0
- data/vmc-ng/spec/assets/hello-sinatra/manifest.yml +9 -0
- data/vmc-ng/spec/eventlog.rb +101 -0
- data/vmc-ng/spec/helpers.rb +101 -1
- data/vmc-ng/spec/patches.rb +45 -0
- data/vmc-ng/spec/start/target_spec.rb +10 -3
- data/vmc/README.md +5 -1
- data/vmc/lib/cli/console_helper.rb +14 -4
- metadata +8 -5
data/vmc-ng/lib/vmc/cli.rb
CHANGED
data/vmc-ng/lib/vmc/cli/app.rb
CHANGED
@@ -151,7 +151,11 @@ module VMC
|
|
151
151
|
|
152
152
|
if exists = client.app_by_name(name)
|
153
153
|
upload_app(exists, path)
|
154
|
-
|
154
|
+
|
155
|
+
if input[:restart] && exists.started?
|
156
|
+
invoke :restart, :app => exists
|
157
|
+
end
|
158
|
+
|
155
159
|
return
|
156
160
|
end
|
157
161
|
|
@@ -737,6 +741,7 @@ module VMC
|
|
737
741
|
|
738
742
|
|
739
743
|
desc "DEPRECATED. Use 'push' instead."
|
744
|
+
input :app, :argument => :optional
|
740
745
|
def update(input)
|
741
746
|
fail "The 'update' command is no longer needed; use 'push' instead."
|
742
747
|
end
|
@@ -795,10 +800,6 @@ module VMC
|
|
795
800
|
end
|
796
801
|
|
797
802
|
def upload_app(app, path)
|
798
|
-
if v2?
|
799
|
-
fail "V2 API currently does not support uploading or starting apps."
|
800
|
-
end
|
801
|
-
|
802
803
|
with_progress("Uploading #{c(app.name, :name)}") do
|
803
804
|
app.upload(path)
|
804
805
|
end
|
data/vmc-ng/lib/vmc/plugin.rb
CHANGED
@@ -10,11 +10,16 @@ module VMC
|
|
10
10
|
|
11
11
|
def self.load_all
|
12
12
|
# auto-load gems with 'vmc-plugin' in their name
|
13
|
-
|
14
|
-
|
15
|
-
Gem::Specification.find_all
|
13
|
+
matching =
|
14
|
+
if Gem::Specification.respond_to? :find_all
|
15
|
+
Gem::Specification.find_all do |s|
|
16
16
|
s.name =~ /vmc-plugin/
|
17
|
-
|
17
|
+
end
|
18
|
+
else
|
19
|
+
Gem.source_index.find_name(/vmc-plugin/)
|
20
|
+
end
|
21
|
+
|
22
|
+
enabled = Set.new(matching.collect(&:name))
|
18
23
|
|
19
24
|
# allow explicit enabling/disabling of gems via config
|
20
25
|
plugins = File.expand_path(VMC::PLUGINS_FILE)
|
data/vmc-ng/lib/vmc/version.rb
CHANGED
@@ -3,16 +3,18 @@ require "./helpers"
|
|
3
3
|
describe "App#push" do
|
4
4
|
it "pushes interactively" do
|
5
5
|
name = "app-#{random_str}"
|
6
|
-
instances = rand(3) + 1
|
7
|
-
framework =
|
8
|
-
runtime =
|
6
|
+
instances = 1 # rand(3) + 1
|
7
|
+
framework = client.framework_by_name("sinatra")
|
8
|
+
runtime = client.runtime_by_name("ruby19")
|
9
9
|
url = "#{name}.fakecloud.com"
|
10
|
-
memory = sample([64, 128, 256, 512])
|
10
|
+
memory = 256 # sample([64, 128, 256, 512])
|
11
11
|
|
12
12
|
client.app_by_name(name).should_not be
|
13
13
|
|
14
|
+
hello_sinatra = File.expand_path("../../assets/hello-sinatra", __FILE__)
|
15
|
+
|
14
16
|
begin
|
15
|
-
running(:push) do
|
17
|
+
running(:push, :path => hello_sinatra) do
|
16
18
|
asks("Name")
|
17
19
|
given(name)
|
18
20
|
has_input(:name, name)
|
@@ -37,6 +39,8 @@ describe "App#push" do
|
|
37
39
|
given("#{memory}M")
|
38
40
|
has_input(:memory, "#{memory}M")
|
39
41
|
|
42
|
+
does("Creating #{name}")
|
43
|
+
|
40
44
|
asks("Create services for application?")
|
41
45
|
given("n")
|
42
46
|
has_input(:create_instances, false)
|
@@ -44,16 +48,13 @@ describe "App#push" do
|
|
44
48
|
asks("Bind other services to application?")
|
45
49
|
given("n")
|
46
50
|
has_input(:bind_instances, false)
|
51
|
+
|
52
|
+
does("Uploading #{name}")
|
53
|
+
does("Starting #{name}")
|
47
54
|
end
|
48
|
-
rescue VMC::UserError => e
|
49
|
-
unless e.to_s == "V2 API currently does not support uploading or starting apps."
|
50
|
-
raise
|
51
|
-
end
|
52
|
-
end
|
53
55
|
|
54
|
-
|
56
|
+
app = client.app_by_name(name)
|
55
57
|
|
56
|
-
begin
|
57
58
|
app.should be
|
58
59
|
app.name.should == name
|
59
60
|
app.instances.should == instances
|
@@ -62,7 +63,9 @@ describe "App#push" do
|
|
62
63
|
#app.url.should == url # TODO v2
|
63
64
|
app.memory.should == memory
|
64
65
|
ensure
|
65
|
-
|
66
|
+
if created = client.app_by_name(name)
|
67
|
+
created.delete!
|
68
|
+
end
|
66
69
|
end
|
67
70
|
end
|
68
71
|
end
|
data/vmc-ng/spec/eventlog.rb
CHANGED
@@ -116,6 +116,26 @@ class EventLog
|
|
116
116
|
@queue << GotInput.new(name, val)
|
117
117
|
end
|
118
118
|
|
119
|
+
def raised(exception)
|
120
|
+
@queue << Raised.new(exception)
|
121
|
+
end
|
122
|
+
|
123
|
+
def did(message)
|
124
|
+
@queue << Did.new(message)
|
125
|
+
end
|
126
|
+
|
127
|
+
def skipped(message)
|
128
|
+
@queue << Skipped.new(message)
|
129
|
+
end
|
130
|
+
|
131
|
+
def failed_to(message)
|
132
|
+
@queue << FailedTo.new(message)
|
133
|
+
end
|
134
|
+
|
135
|
+
def gave_up(message)
|
136
|
+
@queue << GaveUp.new(message)
|
137
|
+
end
|
138
|
+
|
119
139
|
|
120
140
|
class Printed
|
121
141
|
attr_reader :line
|
@@ -154,4 +174,85 @@ class EventLog
|
|
154
174
|
"<GotInput #@name '#@value'>"
|
155
175
|
end
|
156
176
|
end
|
177
|
+
|
178
|
+
class Raised
|
179
|
+
attr_reader :exception
|
180
|
+
|
181
|
+
def initialize(exception)
|
182
|
+
@exception = exception
|
183
|
+
end
|
184
|
+
|
185
|
+
def to_s
|
186
|
+
"<Raised #{@exception.class} '#@exception'>"
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
class Progress
|
191
|
+
attr_reader :message
|
192
|
+
|
193
|
+
def initialize(message)
|
194
|
+
@message = message
|
195
|
+
end
|
196
|
+
|
197
|
+
def ==(other)
|
198
|
+
other.is_a?(self.class) &&
|
199
|
+
@message == other.message
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
class Did < Progress
|
204
|
+
def to_s
|
205
|
+
"<Did '#@message'>"
|
206
|
+
end
|
207
|
+
|
208
|
+
def report
|
209
|
+
"do '#@message'"
|
210
|
+
end
|
211
|
+
|
212
|
+
def report_past
|
213
|
+
"did '#@message'"
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
class Skipped < Progress
|
218
|
+
def to_s
|
219
|
+
"<Skipped '#@message'>"
|
220
|
+
end
|
221
|
+
|
222
|
+
def report
|
223
|
+
"skip '#@message'"
|
224
|
+
end
|
225
|
+
|
226
|
+
def report_past
|
227
|
+
"skipped '#@message'"
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
class FailedTo < Progress
|
232
|
+
def to_s
|
233
|
+
"<FailedTo '#@message'>"
|
234
|
+
end
|
235
|
+
|
236
|
+
def report
|
237
|
+
"fail to '#@message'"
|
238
|
+
end
|
239
|
+
|
240
|
+
def report_past
|
241
|
+
"failed to '#@message'"
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
class GaveUp < Progress
|
246
|
+
def to_s
|
247
|
+
"<GaveUp '#@message'>"
|
248
|
+
end
|
249
|
+
|
250
|
+
def report
|
251
|
+
"give up on '#@message'"
|
252
|
+
end
|
253
|
+
|
254
|
+
def report_past
|
255
|
+
"gave up on '#@message'"
|
256
|
+
end
|
257
|
+
end
|
157
258
|
end
|
data/vmc-ng/spec/helpers.rb
CHANGED
@@ -116,7 +116,7 @@ stderr:
|
|
116
116
|
EOF
|
117
117
|
end
|
118
118
|
rescue => e
|
119
|
-
|
119
|
+
$vmc_event.raised(e)
|
120
120
|
end
|
121
121
|
end
|
122
122
|
|
@@ -264,6 +264,86 @@ module VMCMatchers
|
|
264
264
|
end
|
265
265
|
|
266
266
|
|
267
|
+
class FailWith
|
268
|
+
def initialize(exception)
|
269
|
+
@expected = exception
|
270
|
+
end
|
271
|
+
|
272
|
+
def matches?(log)
|
273
|
+
@actual = log.wait_for_event(EventLog::Raised).exception
|
274
|
+
@actual.is_a?(@expected)
|
275
|
+
end
|
276
|
+
|
277
|
+
def failure_message
|
278
|
+
"expected #@expected to be raised, but got #{@actual.class}: '#@actual"
|
279
|
+
end
|
280
|
+
|
281
|
+
def negative_failure_message
|
282
|
+
"expected #@expected to NOT be raised, but it was"
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
286
|
+
def fail_with(exception)
|
287
|
+
FailWith.new(exception)
|
288
|
+
end
|
289
|
+
|
290
|
+
|
291
|
+
class ProgressExpectation
|
292
|
+
def matches?(log)
|
293
|
+
@actual = log.wait_for_event(EventLog::Progress)
|
294
|
+
@actual == @expected
|
295
|
+
end
|
296
|
+
|
297
|
+
def failure_message
|
298
|
+
"expected to #{@expected.report}, but #{@actual.report_past} instead"
|
299
|
+
end
|
300
|
+
|
301
|
+
def negative_failure_message
|
302
|
+
"expected not to #{@expected.report}"
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
class Successfully < ProgressExpectation
|
307
|
+
def initialize(message)
|
308
|
+
@expected = EventLog::Did.new(message)
|
309
|
+
end
|
310
|
+
end
|
311
|
+
|
312
|
+
class Skip < ProgressExpectation
|
313
|
+
def initialize(message)
|
314
|
+
@expected = EventLog::Skipped.new(message)
|
315
|
+
end
|
316
|
+
end
|
317
|
+
|
318
|
+
class FailTo < ProgressExpectation
|
319
|
+
def initialize(message)
|
320
|
+
@expected = EventLog::FailedTo.new(message)
|
321
|
+
end
|
322
|
+
end
|
323
|
+
|
324
|
+
class GiveUp < ProgressExpectation
|
325
|
+
def initialize(message)
|
326
|
+
@expected = EventLog::GaveUp.new(message)
|
327
|
+
end
|
328
|
+
end
|
329
|
+
|
330
|
+
def successfully(message)
|
331
|
+
Successfully.new(message)
|
332
|
+
end
|
333
|
+
|
334
|
+
def skip(message)
|
335
|
+
Skip.new(message)
|
336
|
+
end
|
337
|
+
|
338
|
+
def fail_to(message)
|
339
|
+
FailTo.new(message)
|
340
|
+
end
|
341
|
+
|
342
|
+
def give_up(message)
|
343
|
+
GiveUp.new(message)
|
344
|
+
end
|
345
|
+
|
346
|
+
|
267
347
|
def asks(what)
|
268
348
|
$vmc_event.should ask(what)
|
269
349
|
end
|
@@ -276,6 +356,10 @@ module VMCMatchers
|
|
276
356
|
$vmc_event.should have_input(name, value)
|
277
357
|
end
|
278
358
|
|
359
|
+
def raises(exception)
|
360
|
+
$vmc_event.should fail_with(exception)
|
361
|
+
end
|
362
|
+
|
279
363
|
def finish
|
280
364
|
$vmc_event.should complete
|
281
365
|
end
|
@@ -283,6 +367,22 @@ module VMCMatchers
|
|
283
367
|
def outputs(what)
|
284
368
|
$vmc_event.should output(what)
|
285
369
|
end
|
370
|
+
|
371
|
+
def does(what)
|
372
|
+
$vmc_event.should successfully(what)
|
373
|
+
end
|
374
|
+
|
375
|
+
def skips(what)
|
376
|
+
$vmc_event.should skip(what)
|
377
|
+
end
|
378
|
+
|
379
|
+
def fails_to(what)
|
380
|
+
$vmc_event.should fail_to(what)
|
381
|
+
end
|
382
|
+
|
383
|
+
def gives_up(what)
|
384
|
+
$vmc_event.should give_up(what)
|
385
|
+
end
|
286
386
|
end
|
287
387
|
|
288
388
|
RSpec.configure do |c|
|
data/vmc-ng/spec/patches.rb
CHANGED
@@ -2,6 +2,36 @@
|
|
2
2
|
$vmc_event = nil
|
3
3
|
|
4
4
|
class VMC::CLI
|
5
|
+
class ProgressEventReporter
|
6
|
+
def initialize(message, skipper)
|
7
|
+
@message = message
|
8
|
+
@skipper = skipper
|
9
|
+
@skipped = false
|
10
|
+
end
|
11
|
+
|
12
|
+
def skip(&blk)
|
13
|
+
@skipped = true
|
14
|
+
$vmc_event.skipped(@message)
|
15
|
+
@skipper.skip(&blk)
|
16
|
+
end
|
17
|
+
|
18
|
+
def fail(&blk)
|
19
|
+
@skipped = true
|
20
|
+
$vmc_event.failed_to(@message)
|
21
|
+
@skipper.fail(&blk)
|
22
|
+
end
|
23
|
+
|
24
|
+
def give_up(&blk)
|
25
|
+
@skipped = true
|
26
|
+
$vmc_event.gave_up(@message)
|
27
|
+
@skipper.give_up(&blk)
|
28
|
+
end
|
29
|
+
|
30
|
+
def skipped?
|
31
|
+
@skipped
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
5
35
|
def ask(*args)
|
6
36
|
$vmc_event.asking(*args) if $vmc_event
|
7
37
|
super
|
@@ -15,6 +45,21 @@ class VMC::CLI
|
|
15
45
|
def force?
|
16
46
|
false
|
17
47
|
end
|
48
|
+
|
49
|
+
def with_progress(msg, &blk)
|
50
|
+
super(msg) do |s|
|
51
|
+
reporter = ProgressEventReporter.new(msg, s)
|
52
|
+
|
53
|
+
res = blk.call(reporter)
|
54
|
+
|
55
|
+
$vmc_event.did(msg) unless reporter.skipped?
|
56
|
+
|
57
|
+
res
|
58
|
+
end
|
59
|
+
rescue
|
60
|
+
$vmc_event.failed_to(msg)
|
61
|
+
raise
|
62
|
+
end
|
18
63
|
end
|
19
64
|
|
20
65
|
class Mothership::Inputs
|
@@ -9,12 +9,19 @@ describe "Start#target" do
|
|
9
9
|
|
10
10
|
describe "switching target url" do
|
11
11
|
before(:all) do
|
12
|
-
|
12
|
+
tgt = File.expand_path(VMC::TARGET_FILE)
|
13
|
+
@old_target = File.read(tgt) if File.exists? tgt
|
13
14
|
end
|
14
15
|
|
15
16
|
after(:all) do
|
16
|
-
File.
|
17
|
-
|
17
|
+
tgt = File.expand_path(VMC::TARGET_FILE)
|
18
|
+
|
19
|
+
if @old_target
|
20
|
+
File.open(tgt, "w") do |io|
|
21
|
+
io.print @old_target
|
22
|
+
end
|
23
|
+
else
|
24
|
+
File.delete(tgt)
|
18
25
|
end
|
19
26
|
end
|
20
27
|
|
data/vmc/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
The VMware Cloud CLI. This is the command line interface to VMware's Application Platform
|
4
4
|
|
5
|
-
_Copyright 2010-
|
5
|
+
_Copyright 2010-2012, VMware, Inc. Licensed under the
|
6
6
|
MIT license, please see the LICENSE file. All rights reserved._
|
7
7
|
|
8
8
|
Usage: vmc [options] command [<args>] [command_options]
|
@@ -100,3 +100,7 @@ MIT license, please see the LICENSE file. All rights reserved._
|
|
100
100
|
vmc login
|
101
101
|
bundle package
|
102
102
|
vmc push
|
103
|
+
|
104
|
+
## File a Bug
|
105
|
+
|
106
|
+
To file a bug against Cloud Foundry Open Source and its components, sign up and use our bug tracking system: [http://cloudfoundry.atlassian.net](http://cloudfoundry.atlassian.net)
|
@@ -32,9 +32,20 @@ module VMC::Cli
|
|
32
32
|
|
33
33
|
def start_local_console(port, appname)
|
34
34
|
auth_info = console_credentials(appname)
|
35
|
-
|
35
|
+
banner = "Connecting to '#{appname}' console: "
|
36
|
+
display banner, false
|
37
|
+
t = Thread.new do
|
38
|
+
count = 0
|
39
|
+
while count < 90 do
|
40
|
+
display '.', false
|
41
|
+
sleep 1
|
42
|
+
count += 1
|
43
|
+
end
|
44
|
+
end
|
36
45
|
prompt = console_login(auth_info, port)
|
37
|
-
|
46
|
+
Thread.kill(t)
|
47
|
+
clear(80)
|
48
|
+
display "#{banner}#{'OK'.green}"
|
38
49
|
display "\n"
|
39
50
|
initialize_readline
|
40
51
|
run_console prompt
|
@@ -47,7 +58,7 @@ module VMC::Cli
|
|
47
58
|
@telnet_client = telnet_client(port)
|
48
59
|
prompt = nil
|
49
60
|
err_msg = "Login attempt timed out."
|
50
|
-
|
61
|
+
3.times do
|
51
62
|
begin
|
52
63
|
results = @telnet_client.login("Name"=>auth_info["username"],
|
53
64
|
"Password"=>auth_info["password"])
|
@@ -67,7 +78,6 @@ module VMC::Cli
|
|
67
78
|
sleep 5
|
68
79
|
@telnet_client = telnet_client(port)
|
69
80
|
end
|
70
|
-
display ".", false
|
71
81
|
end
|
72
82
|
unless prompt
|
73
83
|
close_console
|
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: 1290961179
|
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
|
+
- 31
|
12
|
+
version: 0.4.0.beta.31
|
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-08-
|
20
|
+
date: 2012-08-15 00:00:00 Z
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
23
23
|
name: json_pure
|
@@ -388,6 +388,9 @@ files:
|
|
388
388
|
- vmc-ng/lib/vmc.rb
|
389
389
|
- vmc-ng/spec/app/apps_spec.rb
|
390
390
|
- vmc-ng/spec/app/push_spec.rb
|
391
|
+
- vmc-ng/spec/assets/hello-sinatra/Gemfile
|
392
|
+
- vmc-ng/spec/assets/hello-sinatra/main.rb
|
393
|
+
- vmc-ng/spec/assets/hello-sinatra/manifest.yml
|
391
394
|
- vmc-ng/spec/eventlog.rb
|
392
395
|
- vmc-ng/spec/helpers.rb
|
393
396
|
- vmc-ng/spec/patches.rb
|
@@ -426,7 +429,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
426
429
|
requirements: []
|
427
430
|
|
428
431
|
rubyforge_project:
|
429
|
-
rubygems_version: 1.8.
|
432
|
+
rubygems_version: 1.8.24
|
430
433
|
signing_key:
|
431
434
|
specification_version: 3
|
432
435
|
summary: Client library and CLI that provides access to the VMware Cloud Application Platform.
|