bosh_cli 1.0.3 → 1.5.0.pre.1113

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.
Files changed (144) hide show
  1. data/bin/bosh +0 -9
  2. data/lib/cli.rb +69 -64
  3. data/lib/cli/backup_destination_path.rb +33 -0
  4. data/lib/cli/base_command.rb +57 -56
  5. data/lib/cli/blob_manager.rb +12 -12
  6. data/lib/cli/changeset_helper.rb +6 -7
  7. data/lib/cli/client/director.rb +724 -0
  8. data/lib/cli/command_handler.rb +6 -7
  9. data/lib/cli/commands/backup.rb +39 -0
  10. data/lib/cli/commands/biff.rb +42 -21
  11. data/lib/cli/commands/blob_management.rb +1 -1
  12. data/lib/cli/commands/cloudcheck.rb +11 -13
  13. data/lib/cli/commands/deployment.rb +53 -37
  14. data/lib/cli/commands/help.rb +3 -2
  15. data/lib/cli/commands/job_management.rb +67 -103
  16. data/lib/cli/commands/job_rename.rb +6 -8
  17. data/lib/cli/commands/log_management.rb +78 -55
  18. data/lib/cli/commands/maintenance.rb +36 -30
  19. data/lib/cli/commands/misc.rb +72 -51
  20. data/lib/cli/commands/package.rb +2 -2
  21. data/lib/cli/commands/property_management.rb +10 -12
  22. data/lib/cli/commands/release.rb +236 -133
  23. data/lib/cli/commands/snapshot.rb +93 -0
  24. data/lib/cli/commands/ssh.rb +216 -213
  25. data/lib/cli/commands/stemcell.rb +46 -34
  26. data/lib/cli/commands/task.rb +2 -2
  27. data/lib/cli/commands/user.rb +27 -3
  28. data/lib/cli/commands/vm.rb +28 -0
  29. data/lib/cli/commands/vms.rb +81 -23
  30. data/lib/cli/config.rb +6 -2
  31. data/lib/cli/core_ext.rb +31 -30
  32. data/lib/cli/deployment_helper.rb +134 -159
  33. data/lib/cli/deployment_manifest.rb +66 -0
  34. data/lib/cli/deployment_manifest_compiler.rb +0 -3
  35. data/lib/cli/event_log_renderer.rb +10 -10
  36. data/lib/cli/file_with_progress_bar.rb +52 -0
  37. data/lib/cli/job_builder.rb +1 -1
  38. data/lib/cli/job_command_args.rb +23 -0
  39. data/lib/cli/job_property_collection.rb +4 -7
  40. data/lib/cli/job_property_validator.rb +22 -12
  41. data/lib/cli/job_state.rb +54 -0
  42. data/lib/cli/line_wrap.rb +54 -0
  43. data/lib/cli/packaging_helper.rb +10 -10
  44. data/lib/cli/release.rb +18 -15
  45. data/lib/cli/release_builder.rb +9 -4
  46. data/lib/cli/release_compiler.rb +9 -9
  47. data/lib/cli/release_tarball.rb +3 -6
  48. data/lib/cli/resurrection.rb +31 -0
  49. data/lib/cli/runner.rb +56 -30
  50. data/lib/cli/stemcell.rb +25 -10
  51. data/lib/cli/task_log_renderer.rb +1 -1
  52. data/lib/cli/task_tracker.rb +10 -9
  53. data/lib/cli/validation.rb +3 -1
  54. data/lib/cli/version.rb +1 -1
  55. data/lib/cli/version_calc.rb +5 -18
  56. data/lib/cli/versions_index.rb +1 -1
  57. data/lib/cli/vm_state.rb +43 -0
  58. data/lib/cli/yaml_helper.rb +26 -35
  59. metadata +75 -208
  60. data/Rakefile +0 -56
  61. data/lib/cli/director.rb +0 -628
  62. data/spec/assets/biff/bad_gateway_config.yml +0 -28
  63. data/spec/assets/biff/good_simple_config.yml +0 -63
  64. data/spec/assets/biff/good_simple_golden_config.yml +0 -63
  65. data/spec/assets/biff/good_simple_template.erb +0 -69
  66. data/spec/assets/biff/ip_out_of_range.yml +0 -63
  67. data/spec/assets/biff/multiple_subnets_config.yml +0 -40
  68. data/spec/assets/biff/network_only_template.erb +0 -34
  69. data/spec/assets/biff/no_cc_config.yml +0 -27
  70. data/spec/assets/biff/no_range_config.yml +0 -27
  71. data/spec/assets/biff/no_subnet_config.yml +0 -16
  72. data/spec/assets/biff/ok_network_config.yml +0 -30
  73. data/spec/assets/biff/properties_template.erb +0 -6
  74. data/spec/assets/config/atmos/config/final.yml +0 -6
  75. data/spec/assets/config/atmos/config/private.yml +0 -4
  76. data/spec/assets/config/bad-providers/config/final.yml +0 -5
  77. data/spec/assets/config/bad-providers/config/private.yml +0 -4
  78. data/spec/assets/config/deprecation/config/final.yml +0 -5
  79. data/spec/assets/config/deprecation/config/private.yml +0 -2
  80. data/spec/assets/config/local/config/final.yml +0 -5
  81. data/spec/assets/config/local/config/private.yml +0 -1
  82. data/spec/assets/config/s3/config/final.yml +0 -5
  83. data/spec/assets/config/s3/config/private.yml +0 -5
  84. data/spec/assets/config/swift-hp/config/final.yml +0 -6
  85. data/spec/assets/config/swift-hp/config/private.yml +0 -7
  86. data/spec/assets/config/swift-rackspace/config/final.yml +0 -6
  87. data/spec/assets/config/swift-rackspace/config/private.yml +0 -6
  88. data/spec/assets/deployment.MF +0 -0
  89. data/spec/assets/plugins/bosh/cli/commands/echo.rb +0 -43
  90. data/spec/assets/plugins/bosh/cli/commands/ruby.rb +0 -24
  91. data/spec/assets/release/jobs/cacher.tgz +0 -0
  92. data/spec/assets/release/jobs/cacher/config/file1.conf +0 -0
  93. data/spec/assets/release/jobs/cacher/config/file2.conf +0 -0
  94. data/spec/assets/release/jobs/cacher/job.MF +0 -6
  95. data/spec/assets/release/jobs/cacher/monit +0 -1
  96. data/spec/assets/release/jobs/cleaner.tgz +0 -0
  97. data/spec/assets/release/jobs/cleaner/job.MF +0 -4
  98. data/spec/assets/release/jobs/cleaner/monit +0 -1
  99. data/spec/assets/release/jobs/sweeper.tgz +0 -0
  100. data/spec/assets/release/jobs/sweeper/config/test.conf +0 -1
  101. data/spec/assets/release/jobs/sweeper/job.MF +0 -5
  102. data/spec/assets/release/jobs/sweeper/monit +0 -1
  103. data/spec/assets/release/packages/mutator.tar.gz +0 -0
  104. data/spec/assets/release/packages/stuff.tgz +0 -0
  105. data/spec/assets/release/release.MF +0 -17
  106. data/spec/assets/release_invalid_checksum.tgz +0 -0
  107. data/spec/assets/release_invalid_jobs.tgz +0 -0
  108. data/spec/assets/release_no_name.tgz +0 -0
  109. data/spec/assets/release_no_version.tgz +0 -0
  110. data/spec/assets/stemcell/image +0 -1
  111. data/spec/assets/stemcell/stemcell.MF +0 -6
  112. data/spec/assets/stemcell_invalid_mf.tgz +0 -0
  113. data/spec/assets/stemcell_no_image.tgz +0 -0
  114. data/spec/assets/valid_release.tgz +0 -0
  115. data/spec/assets/valid_stemcell.tgz +0 -0
  116. data/spec/spec_helper.rb +0 -28
  117. data/spec/unit/base_command_spec.rb +0 -87
  118. data/spec/unit/biff_spec.rb +0 -172
  119. data/spec/unit/blob_manager_spec.rb +0 -288
  120. data/spec/unit/cache_spec.rb +0 -36
  121. data/spec/unit/cli_commands_spec.rb +0 -356
  122. data/spec/unit/config_spec.rb +0 -125
  123. data/spec/unit/core_ext_spec.rb +0 -81
  124. data/spec/unit/dependency_helper_spec.rb +0 -52
  125. data/spec/unit/deployment_manifest_compiler_spec.rb +0 -63
  126. data/spec/unit/deployment_manifest_spec.rb +0 -153
  127. data/spec/unit/director_spec.rb +0 -471
  128. data/spec/unit/director_task_spec.rb +0 -48
  129. data/spec/unit/event_log_renderer_spec.rb +0 -171
  130. data/spec/unit/hash_changeset_spec.rb +0 -73
  131. data/spec/unit/job_builder_spec.rb +0 -455
  132. data/spec/unit/job_property_collection_spec.rb +0 -111
  133. data/spec/unit/job_property_validator_spec.rb +0 -7
  134. data/spec/unit/job_rename_spec.rb +0 -200
  135. data/spec/unit/package_builder_spec.rb +0 -593
  136. data/spec/unit/release_builder_spec.rb +0 -120
  137. data/spec/unit/release_spec.rb +0 -173
  138. data/spec/unit/release_tarball_spec.rb +0 -29
  139. data/spec/unit/runner_spec.rb +0 -7
  140. data/spec/unit/ssh_spec.rb +0 -84
  141. data/spec/unit/stemcell_spec.rb +0 -17
  142. data/spec/unit/task_tracker_spec.rb +0 -131
  143. data/spec/unit/version_calc_spec.rb +0 -27
  144. data/spec/unit/versions_index_spec.rb +0 -144
@@ -1,120 +0,0 @@
1
- # Copyright (c) 2009-2012 VMware, Inc.
2
-
3
- require "spec_helper"
4
-
5
- describe Bosh::Cli::ReleaseBuilder do
6
-
7
- before(:each) do
8
- @release_dir = Dir.mktmpdir
9
- FileUtils.mkdir_p(File.join(@release_dir, "config"))
10
- @release = Bosh::Cli::Release.new(@release_dir)
11
- end
12
-
13
- def new_builder
14
- Bosh::Cli::ReleaseBuilder.new(@release, [], [])
15
- end
16
-
17
- it "uses version 0.1-dev if no previous releases have been created" do
18
- new_builder.version.should == "0.1-dev"
19
- end
20
-
21
- it "builds a release" do
22
- builder = new_builder
23
- builder.build
24
-
25
- expected_tarball_path = File.join(@release_dir,
26
- "dev_releases",
27
- "bosh_release-0.1-dev.tgz")
28
-
29
- builder.tarball_path.should == expected_tarball_path
30
- File.file?(expected_tarball_path).should be_true
31
- end
32
-
33
- it "doesn't build a new release if nothing has changed" do
34
- builder = new_builder
35
- builder.build
36
- builder.build
37
-
38
- File.file?(File.join(@release_dir, "dev_releases",
39
- "bosh_release-0.1-dev.tgz")).
40
- should be_true
41
- File.file?(File.join(@release_dir, "dev_releases",
42
- "bosh_release-0.2-dev.tgz")).
43
- should be_false
44
- end
45
-
46
- it "has a list of jobs affected by building this release" do
47
- job1 = mock(:job, :new_version? => true,
48
- :packages => %w(bar baz), :name => "job1")
49
- job2 = mock(:job, :new_version? => false,
50
- :packages => %w(foo baz), :name => "job2")
51
- job3 = mock(:job, :new_version? => false,
52
- :packages => %w(baz zb), :name => "job3")
53
- job4 = mock(:job, :new_version? => false,
54
- :packages => %w(bar baz), :name => "job4")
55
-
56
- package1 = mock(:package, :name => "foo", :new_version? => true)
57
- package2 = mock(:package, :name => "bar", :new_version? => false)
58
- package3 = mock(:package, :name => "baz", :new_version? => false)
59
- package4 = mock(:package, :name => "zb", :new_version? => true)
60
-
61
- builder = Bosh::Cli::ReleaseBuilder.new(@release,
62
- [package1, package2,
63
- package3, package4],
64
- [job1, job2, job3, job4])
65
- builder.affected_jobs.should =~ [job1, job2, job3]
66
- end
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",
73
- { "version" => 2 },
74
- get_tmp_file_path("payload"))
75
-
76
- builder = new_builder
77
- builder.version.should == "2.1-dev"
78
- builder.build
79
-
80
- final_index.add_version("deadbeef",
81
- { "version" => 7 },
82
- get_tmp_file_path("payload"))
83
- builder = new_builder
84
- builder.version.should == "7.1-dev"
85
- end
86
-
87
- it "has packages and jobs fingerprints in spec" do
88
- job = mock(
89
- Bosh::Cli::JobBuilder,
90
- :name => "job1",
91
- :version => "1.1",
92
- :new_version? => true,
93
- :packages => %w(foo),
94
- :fingerprint => "deadbeef",
95
- :checksum => "cafebad"
96
- )
97
-
98
- package = mock(
99
- Bosh::Cli::PackageBuilder,
100
- :name => "foo",
101
- :version => "42",
102
- :new_version? => true,
103
- :fingerprint => "deadcafe",
104
- :checksum => "baddeed",
105
- :dependencies => []
106
- )
107
-
108
- builder = Bosh::Cli::ReleaseBuilder.new(@release, [package], [job])
109
- builder.should_receive(:copy_jobs)
110
- builder.should_receive(:copy_packages)
111
-
112
- builder.build
113
-
114
- manifest = YAML.load_file(builder.manifest_path)
115
-
116
- manifest["jobs"][0]["fingerprint"].should == "deadbeef"
117
- manifest["packages"][0]["fingerprint"].should == "deadcafe"
118
- end
119
-
120
- end
@@ -1,173 +0,0 @@
1
- # Copyright (c) 2009-2012 VMware, Inc.
2
-
3
- require "spec_helper"
4
-
5
- describe Bosh::Cli::Release do
6
-
7
- before :each do
8
- @release_dir = Dir.mktmpdir
9
- FileUtils.mkdir_p(File.join(@release_dir, "config"))
10
- end
11
-
12
- def new_release(dir)
13
- Bosh::Cli::Release.new(@release_dir)
14
- end
15
-
16
- it "persists release attributes" do
17
- r = new_release(@dir)
18
-
19
- r.dev_name.should be_nil
20
- r.final_name.should be_nil
21
- r.min_cli_version.should be_nil
22
- r.latest_release_filename.should be_nil
23
-
24
- r.dev_name = "dev-release"
25
- r.final_name = "prod-release"
26
- r.min_cli_version = "0.5.2"
27
- r.latest_release_filename = "foobar"
28
- r.save_config
29
-
30
- r2 = new_release(@release_dir)
31
- r.dev_name.should == "dev-release"
32
- r.final_name.should == "prod-release"
33
- r.min_cli_version.should == "0.5.2"
34
- r.latest_release_filename.should == "foobar"
35
- end
36
-
37
- it "has attributes persisted in bosh user config" do
38
- r = new_release(@release_dir)
39
- r.dev_name = "dev-release"
40
- r.final_name = "prod-release"
41
- r.min_cli_version = "0.5.2"
42
- r.save_config
43
-
44
- FileUtils.rm_rf(File.join(@release_dir, "config", "dev.yml"))
45
-
46
- r = new_release(@release_dir)
47
- r.dev_name.should be_nil
48
- r.final_name.should == "prod-release"
49
- r.min_cli_version.should == "0.5.2"
50
- end
51
-
52
- it "has attributes persisted in public release config" do
53
- r = new_release(@release_dir)
54
- r.dev_name = "dev-release"
55
- r.final_name = "prod-release"
56
- r.min_cli_version = "0.5.2"
57
- r.save_config
58
-
59
- FileUtils.rm_rf(File.join(@release_dir, "config", "final.yml"))
60
-
61
- r = new_release(@release_dir)
62
- r.dev_name.should == "dev-release"
63
- r.final_name.should be_nil
64
- r.min_cli_version.should be_nil
65
- end
66
-
67
- describe "merging final.yml with private.yml" do
68
- it "should print a warning when it contains blobstore_secret" do
69
- r = Bosh::Cli::Release.new(spec_asset("config/deprecation"))
70
- opts = {
71
- :uid => "bosh",
72
- :secret => "bar"
73
- }
74
- Bosh::Blobstore::Client.should_receive(:create).with("atmos", opts)
75
- r.should_receive(:say)
76
-
77
- r.blobstore
78
- end
79
-
80
- it "should detect blobstore secrets for deprecated options" do
81
- r = Bosh::Cli::Release.new(spec_asset("config/deprecation"))
82
- r.has_blobstore_secret?.should be_true
83
- end
84
-
85
- it "should merge s3 secrets into options" do
86
- r = Bosh::Cli::Release.new(spec_asset("config/s3"))
87
- opts = {
88
- :bucket_name => "test",
89
- :secret_access_key => "foo",
90
- :access_key_id => "bar"
91
- }
92
- Bosh::Blobstore::Client.should_receive(:create).with("s3", opts)
93
- r.blobstore
94
- end
95
-
96
- it "should detect blobstore secrets for s3 options" do
97
- r = Bosh::Cli::Release.new(spec_asset("config/s3"))
98
- r.has_blobstore_secret?.should be_true
99
- end
100
-
101
- it "should merge atmos secrets into options" do
102
- r = Bosh::Cli::Release.new(spec_asset("config/atmos"))
103
- opts = {
104
- :uid => "bosh",
105
- :secret => "bar"
106
- }
107
- Bosh::Blobstore::Client.should_receive(:create).with("atmos", opts)
108
- r.blobstore
109
- end
110
-
111
- it "should detect blobstore secrets for atmos options" do
112
- r = Bosh::Cli::Release.new(spec_asset("config/atmos"))
113
- r.has_blobstore_secret?.should be_true
114
- end
115
-
116
- it "should merge swift (HP) secrets into options" do
117
- r = Bosh::Cli::Release.new(spec_asset("config/swift-hp"))
118
- opts = {
119
- :container_name => "test",
120
- :swift_provider => "hp",
121
- :hp => {
122
- :hp_account_id => "foo",
123
- :hp_secret_key => "bar",
124
- :hp_tenant_id => "foo"
125
- }
126
- }
127
- Bosh::Blobstore::Client.should_receive(:create).with("swift", opts)
128
- r.blobstore
129
- end
130
-
131
- it "should detect blobstore secrets for swift (HP) options" do
132
- r = Bosh::Cli::Release.new(spec_asset("config/swift-hp"))
133
- r.has_blobstore_secret?.should be_true
134
- end
135
-
136
- it "should merge swift (Rackspace) secrets into options" do
137
- r = Bosh::Cli::Release.new(spec_asset("config/swift-rackspace"))
138
- opts = {
139
- :container_name => "test",
140
- :swift_provider => "rackspace",
141
- :rackspace => {
142
- :rackspace_username => "foo",
143
- :rackspace_api_key => "bar"
144
- }
145
- }
146
- Bosh::Blobstore::Client.should_receive(:create).with("swift", opts)
147
- r.blobstore
148
- end
149
-
150
- it "should detect blobstore secrets for swift (Rackspace) options" do
151
- r = Bosh::Cli::Release.new(spec_asset("config/swift-rackspace"))
152
- r.has_blobstore_secret?.should be_true
153
- end
154
-
155
- it "should not throw an error when merging empty secrets into options" do
156
- r = Bosh::Cli::Release.new(spec_asset("config/local"))
157
- opts = {
158
- :blobstore_path => "/tmp/blobstore"
159
- }
160
- Bosh::Blobstore::Client.should_receive(:create).with("local", opts)
161
- r.blobstore
162
- end
163
-
164
- it "throws an error when blobstore providers does not match" do
165
- r = Bosh::Cli::Release.new(spec_asset("config/bad-providers"))
166
- expect {
167
- r.blobstore
168
- }.to raise_error(Bosh::Cli::CliError, "blobstore private provider " +
169
- "does not match final provider")
170
-
171
- end
172
- end
173
- end
@@ -1,29 +0,0 @@
1
- # Copyright (c) 2009-2012 VMware, Inc.
2
-
3
- require "spec_helper"
4
-
5
- describe Bosh::Cli::ReleaseTarball do
6
-
7
- describe "verifying a release" do
8
- it "verifies and reports a valid release" do
9
- tarball = Bosh::Cli::ReleaseTarball.new(spec_asset("valid_release.tgz"))
10
- tarball.should be_valid
11
- end
12
-
13
- it "verifies repacked release if appropriate option is set" do
14
- tarball = Bosh::Cli::ReleaseTarball.new(spec_asset("valid_release.tgz"))
15
- package_matches = ["86bd8b15562cde007f030a303fa64779af5fa4e7"]
16
- repacked_tarball_path = tarball.repack(package_matches)
17
-
18
- tarball.skipped.should == 1
19
-
20
- repacked_tarball = Bosh::Cli::ReleaseTarball.new(repacked_tarball_path)
21
- repacked_tarball.valid?.should be_false
22
- repacked_tarball.reset_validation
23
- repacked_tarball.valid?(:allow_sparse => true).should be_true
24
- end
25
- end
26
-
27
- # TODO: add whining on potential errors
28
-
29
- end
@@ -1,7 +0,0 @@
1
- # Copyright (c) 2009-2012 VMware, Inc.
2
-
3
- require "spec_helper"
4
-
5
- describe Bosh::Cli::Runner do
6
- pending "needs tests"
7
- end
@@ -1,84 +0,0 @@
1
- # Copyright (c) 2009-2012 VMware, Inc.
2
-
3
- require "spec_helper"
4
-
5
- describe Bosh::Cli::Command::Base do
6
- # TODO: the whole spec needs to be rewritten
7
-
8
- before :all do
9
- @public_key = File.join(Dir.mktmpdir, "public_key")
10
- File.open(@public_key, "w+") do |f|
11
- f.write("PUBLIC_KEY")
12
- end
13
- end
14
-
15
- describe Bosh::Cli::Command::Ssh do
16
- it "should get the public key" do
17
- ssh = Bosh::Cli::Command::Ssh.new
18
- ssh.add_option(:public_key, @public_key)
19
- public_key = ssh.send(:get_public_key)
20
- public_key.should == "PUBLIC_KEY"
21
- end
22
-
23
- it "should get the public key from users home directory " +
24
- "or raise exception" do
25
- ssh = Bosh::Cli::Command::Ssh.new
26
- public_key = nil
27
- begin
28
- public_key = ssh.send(:get_public_key)
29
- rescue Bosh::Cli::CliError
30
- public_key = "SOMETHING"
31
- end
32
- public_key.should_not be_nil
33
- end
34
-
35
- it "should contact director to setup ssh on the job" do
36
- mock_director = mock(Object)
37
- mock_director.stub(:setup_ssh).and_return([:done, 42])
38
-
39
- mock_director.stub(:get_task_result_log).with(42).
40
- and_return(JSON.generate(
41
- [{ "status" => "success", "ip" => "127.0.0.1" }]))
42
- mock_director.stub(:cleanup_ssh)
43
- Bosh::Cli::Director.should_receive(:new).and_return(mock_director)
44
- ssh = Bosh::Cli::Command::Ssh.new
45
- ssh.stub(:prepare_deployment_manifest).and_return("test")
46
- ssh.stub(:cleanup_ssh)
47
- ssh.stub(:get_public_key).and_return("PUBKEY")
48
- ssh.send(
49
- :setup_ssh, "dea", 0, "temp_pass") do |results, _, _|
50
- results.each do |result|
51
- result["status"].should == "success"
52
- result["ip"].should == "127.0.0.1"
53
- end
54
- end
55
- end
56
-
57
- it "should try to setup interactive shell when a job index is given" do
58
- ssh = Bosh::Cli::Command::Ssh.new
59
- @interactive_shell = false
60
- @execute_command = false
61
- ssh.stub(:setup_interactive_shell) { @interactive_shell = true }
62
- ssh.stub(:execute_command) { @execute_command = true }
63
- ssh.shell("dea", "0")
64
- @interactive_shell.should == true && @execute_command.should == false
65
- end
66
-
67
- it "should fail to setup interactive shell when a job index is not given" do
68
- ssh = Bosh::Cli::Command::Ssh.new
69
- lambda {
70
- ssh.shell("dea")
71
- }.should raise_error(Bosh::Cli::CliError)
72
- end
73
-
74
- it "should try to execute given command remotely" do
75
- ssh = Bosh::Cli::Command::Ssh.new
76
- @interactive_shell = false
77
- @execute_command = false
78
- ssh.stub(:setup_interactive_shell) { @interactive_shell = true }
79
- ssh.stub(:perform_operation) { @execute_command = true }
80
- ssh.shell("dea", "ls -l")
81
- @interactive_shell.should == false && @execute_command.should == true
82
- end
83
- end
84
- end
@@ -1,17 +0,0 @@
1
- # Copyright (c) 2009-2012 VMware, Inc.
2
-
3
- require "spec_helper"
4
-
5
- describe Bosh::Cli::Stemcell do
6
-
7
- describe "verifying a stemcell" do
8
- it "verifies and reports a valid stemcell" do
9
- sc = Bosh::Cli::Stemcell.new(spec_asset("valid_stemcell.tgz"),
10
- Bosh::Cli::Cache.new(Dir.mktmpdir))
11
- sc.should be_valid
12
- end
13
- end
14
-
15
- # TODO: add whining on potential errors
16
-
17
- end
@@ -1,131 +0,0 @@
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 "accepts alternate :renderer option" do
128
- tracker = make_tracker("42", {:renderer => "I'm a renderer"})
129
- tracker.renderer.should == "I'm a renderer"
130
- end
131
- end