bosh_cli 0.18 → 0.19
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/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
|