bosh_cli 0.18 → 0.19
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/bosh +7 -4
- data/lib/cli.rb +2 -0
- data/lib/cli/commands/base.rb +1 -18
- data/lib/cli/commands/biff.rb +3 -7
- data/lib/cli/commands/cloudcheck.rb +1 -0
- data/lib/cli/commands/deployment.rb +10 -6
- data/lib/cli/commands/job_rename.rb +116 -0
- data/lib/cli/commands/stemcell.rb +3 -3
- data/lib/cli/commands/task.rb +52 -143
- data/lib/cli/commands/vms.rb +2 -2
- data/lib/cli/config.rb +1 -0
- data/lib/cli/deployment_helper.rb +62 -22
- data/lib/cli/director.rb +85 -196
- data/lib/cli/director_task.rb +4 -4
- data/lib/cli/event_log_renderer.rb +5 -1
- data/lib/cli/null_renderer.rb +19 -0
- data/lib/cli/package_builder.rb +91 -62
- data/lib/cli/packaging_helper.rb +1 -1
- data/lib/cli/release_builder.rb +47 -13
- data/lib/cli/runner.rb +21 -39
- data/lib/cli/task_log_renderer.rb +9 -0
- data/lib/cli/task_tracker.rb +168 -0
- data/lib/cli/templates/help_message.erb +1 -0
- data/lib/cli/version.rb +1 -1
- data/lib/cli/versions_index.rb +3 -3
- data/spec/unit/biff_spec.rb +5 -0
- data/spec/unit/director_spec.rb +96 -192
- data/spec/unit/job_rename_spec.rb +195 -0
- data/spec/unit/package_builder_spec.rb +188 -186
- data/spec/unit/release_builder_spec.rb +27 -9
- data/spec/unit/runner_spec.rb +0 -25
- data/spec/unit/task_tracker_spec.rb +154 -0
- metadata +11 -4
@@ -14,8 +14,8 @@ describe Bosh::Cli::ReleaseBuilder do
|
|
14
14
|
Bosh::Cli::ReleaseBuilder.new(@release, [], [])
|
15
15
|
end
|
16
16
|
|
17
|
-
it "uses version 1 if no previous releases have been created" do
|
18
|
-
new_builder.version.should == 1
|
17
|
+
it "uses version 0.1-dev if no previous releases have been created" do
|
18
|
+
new_builder.version.should == "0.1-dev"
|
19
19
|
end
|
20
20
|
|
21
21
|
it "builds a release" do
|
@@ -23,7 +23,8 @@ describe Bosh::Cli::ReleaseBuilder do
|
|
23
23
|
builder.build
|
24
24
|
|
25
25
|
expected_tarball_path = File.join(@release_dir,
|
26
|
-
"dev_releases",
|
26
|
+
"dev_releases",
|
27
|
+
"bosh_release-0.1-dev.tgz")
|
27
28
|
|
28
29
|
builder.tarball_path.should == expected_tarball_path
|
29
30
|
File.file?(expected_tarball_path).should be_true
|
@@ -34,21 +35,23 @@ describe Bosh::Cli::ReleaseBuilder do
|
|
34
35
|
builder.build
|
35
36
|
builder.build
|
36
37
|
|
37
|
-
File.file?(File.join(@release_dir, "dev_releases",
|
38
|
+
File.file?(File.join(@release_dir, "dev_releases",
|
39
|
+
"bosh_release-0.1-dev.tgz")).
|
38
40
|
should be_true
|
39
|
-
File.file?(File.join(@release_dir, "dev_releases",
|
41
|
+
File.file?(File.join(@release_dir, "dev_releases",
|
42
|
+
"bosh_release-0.2-dev.tgz")).
|
40
43
|
should be_false
|
41
44
|
end
|
42
45
|
|
43
46
|
it "has a list of jobs affected by building this release" do
|
44
47
|
job1 = mock(:job, :new_version? => true,
|
45
|
-
:packages =>
|
48
|
+
:packages => %w(bar baz), :name => "job1")
|
46
49
|
job2 = mock(:job, :new_version? => false,
|
47
|
-
:packages =>
|
50
|
+
:packages => %w(foo baz), :name => "job2")
|
48
51
|
job3 = mock(:job, :new_version? => false,
|
49
|
-
:packages =>
|
52
|
+
:packages => %w(baz zb), :name => "job3")
|
50
53
|
job4 = mock(:job, :new_version? => false,
|
51
|
-
:packages =>
|
54
|
+
:packages => %w(bar baz), :name => "job4")
|
52
55
|
|
53
56
|
package1 = mock(:package, :name => "foo", :new_version? => true)
|
54
57
|
package2 = mock(:package, :name => "bar", :new_version? => false)
|
@@ -62,4 +65,19 @@ describe Bosh::Cli::ReleaseBuilder do
|
|
62
65
|
builder.affected_jobs.should =~ [job1, job2, job3]
|
63
66
|
end
|
64
67
|
|
68
|
+
it "bumps dev version in sync with final version" do
|
69
|
+
final_index = Bosh::Cli::VersionsIndex.new(File.join(@release_dir,
|
70
|
+
"releases"))
|
71
|
+
|
72
|
+
final_index.add_version("deadbeef", { "version" => 2 }, "payload")
|
73
|
+
|
74
|
+
builder = new_builder
|
75
|
+
builder.version.should == "2.1-dev"
|
76
|
+
builder.build
|
77
|
+
|
78
|
+
final_index.add_version("deadbeef", { "version" => 7 }, "payload")
|
79
|
+
builder = new_builder
|
80
|
+
builder.version.should == "7.1-dev"
|
81
|
+
end
|
82
|
+
|
65
83
|
end
|
data/spec/unit/runner_spec.rb
CHANGED
@@ -100,31 +100,6 @@ describe Bosh::Cli::Runner do
|
|
100
100
|
test_cmd(%w(sync blobs), :blob_management, :sync)
|
101
101
|
end
|
102
102
|
|
103
|
-
it "cancels running task and quits when ctrl-c is issued " +
|
104
|
-
"and user agrees to quit" do
|
105
|
-
runner = Bosh::Cli::Runner.new(["any", "command"])
|
106
|
-
runner.runner = {}
|
107
|
-
runner.runner.stub(:task_running?).and_return(true)
|
108
|
-
runner.stub(:kill_current_task?).and_return(true)
|
109
|
-
runner.runner.should_receive(:cancel_current_task).once
|
110
|
-
lambda { runner.handle_ctrl_c }.should raise_error SystemExit
|
111
|
-
end
|
112
|
-
|
113
|
-
it "quits when ctrl-c is issued and there is no task running" do
|
114
|
-
runner = Bosh::Cli::Runner.new(["any", "command"])
|
115
|
-
runner.runner = {}
|
116
|
-
runner.runner.stub(:task_running?).and_return(false)
|
117
|
-
lambda { runner.handle_ctrl_c }.should raise_error SystemExit
|
118
|
-
end
|
119
|
-
|
120
|
-
it "doesn't quit when user issues ctrl-c but does not want to quit" do
|
121
|
-
runner = Bosh::Cli::Runner.new(["any", "command"])
|
122
|
-
runner.runner = {}
|
123
|
-
runner.runner.stub(:task_running?).and_return(true)
|
124
|
-
runner.stub(:kill_current_task?).and_return(false)
|
125
|
-
lambda { runner.handle_ctrl_c }.should_not raise_error SystemExit
|
126
|
-
end
|
127
|
-
|
128
103
|
it "loads custom plugins" do
|
129
104
|
plugin_path = spec_asset("plugins")
|
130
105
|
$:.unshift(plugin_path)
|
@@ -0,0 +1,154 @@
|
|
1
|
+
# Copyright (c) 2009-2012 VMware, Inc.
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
|
5
|
+
describe Bosh::Cli::TaskTracker do
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
@cache = mock("cache")
|
9
|
+
@director = mock("director", :uuid => "deadbeef",
|
10
|
+
:get_time_difference => 0.5)
|
11
|
+
Bosh::Cli::Config.cache = @cache
|
12
|
+
end
|
13
|
+
|
14
|
+
def make_tracker(task_id, options)
|
15
|
+
tracker = Bosh::Cli::TaskTracker.new(@director, task_id, options)
|
16
|
+
tracker.stub!(:sleep)
|
17
|
+
tracker
|
18
|
+
end
|
19
|
+
|
20
|
+
it "tracks director task event log" do
|
21
|
+
tracker = make_tracker("42", {})
|
22
|
+
@director.should_receive(:get_time_difference).and_return(0.5)
|
23
|
+
|
24
|
+
@cache.should_receive(:read).with("task/deadbeef/42/event").and_return(nil)
|
25
|
+
|
26
|
+
@director.should_receive(:get_task_state).with("42").
|
27
|
+
and_return("queued", "queued", "processing", "processing", "done")
|
28
|
+
|
29
|
+
@director.should_receive(:get_task_output).with("42", 0, "event").
|
30
|
+
and_return(["", nil], ["", nil], ["foo\nbar", 8])
|
31
|
+
|
32
|
+
@director.should_receive(:get_task_output).with("42", 8, "event").
|
33
|
+
and_return(["\nba", 12])
|
34
|
+
|
35
|
+
@director.should_receive(:get_task_output).with("42", 12, "event").
|
36
|
+
and_return(["z", 13])
|
37
|
+
|
38
|
+
@cache.should_receive(:write).
|
39
|
+
with("task/deadbeef/42/event", "foo\nbar\nbaz\n")
|
40
|
+
|
41
|
+
tracker.should_receive(:sleep).with(1).exactly(4).times
|
42
|
+
|
43
|
+
tracker.track.should == :done
|
44
|
+
end
|
45
|
+
|
46
|
+
it "used cached task result if available" do
|
47
|
+
tracker = make_tracker("42", { :log_type => "debug" })
|
48
|
+
|
49
|
+
@cache.should_receive(:read).with("task/deadbeef/42/debug").
|
50
|
+
and_return("foo\nbar\nbaz\n")
|
51
|
+
|
52
|
+
@director.should_receive(:get_task_state).with("42").and_return("cancelled")
|
53
|
+
|
54
|
+
tracker.track.should == :cancelled
|
55
|
+
end
|
56
|
+
|
57
|
+
it "uses appropriate renderer" do
|
58
|
+
renderer = mock("renderer", :duration_known? => false)
|
59
|
+
Bosh::Cli::TaskLogRenderer.should_receive(:create_for_log_type).
|
60
|
+
with("foobar").and_return(renderer)
|
61
|
+
|
62
|
+
tracker = make_tracker("42", { :log_type => "foobar" })
|
63
|
+
|
64
|
+
@cache.should_receive(:read).with("task/deadbeef/42/foobar").and_return(nil)
|
65
|
+
|
66
|
+
@director.should_receive(:get_task_state).with("42").
|
67
|
+
and_return("queued", "processing", "done")
|
68
|
+
|
69
|
+
@director.should_receive(:get_task_output).with("42", 0, "foobar").
|
70
|
+
and_return(["", nil], ["foo\nbar", 8])
|
71
|
+
|
72
|
+
@director.should_receive(:get_task_output).with("42", 8, "foobar").
|
73
|
+
and_return(["\nbaz", 12])
|
74
|
+
|
75
|
+
renderer.should_receive(:time_adjustment=).with(0.5)
|
76
|
+
renderer.should_receive(:add_output).with("foo\n").ordered
|
77
|
+
renderer.should_receive(:add_output).with("bar\n").ordered
|
78
|
+
renderer.should_receive(:add_output).with("baz\n").ordered
|
79
|
+
renderer.should_receive(:refresh).exactly(3).times
|
80
|
+
renderer.should_receive(:finish).with(:done)
|
81
|
+
|
82
|
+
tracker.should_receive(:sleep).with(1).exactly(2).times
|
83
|
+
|
84
|
+
@cache.should_receive(:write).
|
85
|
+
with("task/deadbeef/42/foobar", "foo\nbar\nbaz\n")
|
86
|
+
|
87
|
+
tracker.track.should == :done
|
88
|
+
end
|
89
|
+
|
90
|
+
it "treats error and cancelled states as finished states" do
|
91
|
+
%w(error cancelled).each do |state|
|
92
|
+
tracker = make_tracker("42", { :log_type => "foobar",
|
93
|
+
:use_cache => false })
|
94
|
+
|
95
|
+
@director.should_receive(:get_task_state).with("42").
|
96
|
+
and_return("queued", "processing", state)
|
97
|
+
|
98
|
+
@director.should_receive(:get_task_output).with("42", 0, "foobar").
|
99
|
+
and_return(["", nil], ["foo\nbar", 8])
|
100
|
+
|
101
|
+
@director.should_receive(:get_task_output).with("42", 8, "foobar").
|
102
|
+
and_return(["\nbaz", 12])
|
103
|
+
|
104
|
+
tracker.should_receive(:sleep).with(1).exactly(2).times
|
105
|
+
|
106
|
+
tracker.track.should == state.to_sym
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
it "prompts for task cancel on interrupt (if in interactive mode)" do
|
111
|
+
tracker = make_tracker("42", { :log_type => "foobar",
|
112
|
+
:use_cache => false })
|
113
|
+
|
114
|
+
tracker.stub!(:interactive?).and_return(true)
|
115
|
+
|
116
|
+
@director.should_receive(:get_task_state).with("42").and_raise(Interrupt)
|
117
|
+
@director.should_receive(:get_task_state).with("42").and_return("cancelled")
|
118
|
+
@director.should_receive(:get_task_output).with("42", 0, "foobar").
|
119
|
+
and_return(["", nil])
|
120
|
+
|
121
|
+
tracker.should_receive(:ask).and_return("yes")
|
122
|
+
@director.should_receive(:cancel_task).with("42")
|
123
|
+
|
124
|
+
tracker.track.should == :cancelled
|
125
|
+
end
|
126
|
+
|
127
|
+
it "prompts for task error log on error (if in interactive mode)" do
|
128
|
+
tracker = make_tracker("42", { :log_type => "event",
|
129
|
+
:use_cache => false })
|
130
|
+
|
131
|
+
tracker.stub!(:interactive?).and_return(true)
|
132
|
+
|
133
|
+
@director.should_receive(:get_task_state).with("42").
|
134
|
+
and_return("processing", "error")
|
135
|
+
|
136
|
+
@director.should_receive(:get_task_output).with("42", 0, "event").
|
137
|
+
and_return(["", nil])
|
138
|
+
|
139
|
+
@director.should_receive(:get_task_output).with("42", 0, "event").
|
140
|
+
and_return(["foo", 4])
|
141
|
+
|
142
|
+
tracker.should_receive(:ask).and_return("yes")
|
143
|
+
|
144
|
+
new_tracker = mock("tracker")
|
145
|
+
Bosh::Cli::TaskTracker.should_receive(:new).
|
146
|
+
with(@director, "42", { :log_type => "debug", :use_cache => false }).
|
147
|
+
and_return(new_tracker)
|
148
|
+
|
149
|
+
new_tracker.should_receive(:track).and_return(:foo)
|
150
|
+
|
151
|
+
tracker.track.should == :error
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bosh_cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.19'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-05-
|
12
|
+
date: 2012-05-25 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json_pure
|
@@ -197,6 +197,7 @@ files:
|
|
197
197
|
- lib/cli/commands/deployment.rb
|
198
198
|
- lib/cli/commands/job.rb
|
199
199
|
- lib/cli/commands/job_management.rb
|
200
|
+
- lib/cli/commands/job_rename.rb
|
200
201
|
- lib/cli/commands/log_management.rb
|
201
202
|
- lib/cli/commands/maintenance.rb
|
202
203
|
- lib/cli/commands/misc.rb
|
@@ -218,6 +219,7 @@ files:
|
|
218
219
|
- lib/cli/errors.rb
|
219
220
|
- lib/cli/event_log_renderer.rb
|
220
221
|
- lib/cli/job_builder.rb
|
222
|
+
- lib/cli/null_renderer.rb
|
221
223
|
- lib/cli/package_builder.rb
|
222
224
|
- lib/cli/packaging_helper.rb
|
223
225
|
- lib/cli/release.rb
|
@@ -227,6 +229,7 @@ files:
|
|
227
229
|
- lib/cli/runner.rb
|
228
230
|
- lib/cli/stemcell.rb
|
229
231
|
- lib/cli/task_log_renderer.rb
|
232
|
+
- lib/cli/task_tracker.rb
|
230
233
|
- lib/cli/templates/help_message.erb
|
231
234
|
- lib/cli/validation.rb
|
232
235
|
- lib/cli/version.rb
|
@@ -289,6 +292,7 @@ files:
|
|
289
292
|
- spec/unit/event_log_renderer_spec.rb
|
290
293
|
- spec/unit/hash_changeset_spec.rb
|
291
294
|
- spec/unit/job_builder_spec.rb
|
295
|
+
- spec/unit/job_rename_spec.rb
|
292
296
|
- spec/unit/package_builder_spec.rb
|
293
297
|
- spec/unit/release_builder_spec.rb
|
294
298
|
- spec/unit/release_spec.rb
|
@@ -296,6 +300,7 @@ files:
|
|
296
300
|
- spec/unit/runner_spec.rb
|
297
301
|
- spec/unit/ssh_spec.rb
|
298
302
|
- spec/unit/stemcell_spec.rb
|
303
|
+
- spec/unit/task_tracker_spec.rb
|
299
304
|
- spec/unit/version_calc_spec.rb
|
300
305
|
- spec/unit/versions_index_spec.rb
|
301
306
|
homepage: http://www.vmware.com
|
@@ -312,7 +317,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
312
317
|
version: '0'
|
313
318
|
segments:
|
314
319
|
- 0
|
315
|
-
hash:
|
320
|
+
hash: -2317006899427919460
|
316
321
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
317
322
|
none: false
|
318
323
|
requirements:
|
@@ -321,7 +326,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
321
326
|
version: '0'
|
322
327
|
segments:
|
323
328
|
- 0
|
324
|
-
hash:
|
329
|
+
hash: -2317006899427919460
|
325
330
|
requirements: []
|
326
331
|
rubyforge_project:
|
327
332
|
rubygems_version: 1.8.23
|
@@ -383,6 +388,7 @@ test_files:
|
|
383
388
|
- spec/unit/event_log_renderer_spec.rb
|
384
389
|
- spec/unit/hash_changeset_spec.rb
|
385
390
|
- spec/unit/job_builder_spec.rb
|
391
|
+
- spec/unit/job_rename_spec.rb
|
386
392
|
- spec/unit/package_builder_spec.rb
|
387
393
|
- spec/unit/release_builder_spec.rb
|
388
394
|
- spec/unit/release_spec.rb
|
@@ -390,5 +396,6 @@ test_files:
|
|
390
396
|
- spec/unit/runner_spec.rb
|
391
397
|
- spec/unit/ssh_spec.rb
|
392
398
|
- spec/unit/stemcell_spec.rb
|
399
|
+
- spec/unit/task_tracker_spec.rb
|
393
400
|
- spec/unit/version_calc_spec.rb
|
394
401
|
- spec/unit/versions_index_spec.rb
|