bosh-workspace 0.8.5 → 0.9.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rspec +1 -2
  4. data/.ruby-gemset +1 -1
  5. data/.travis.yml +2 -0
  6. data/Guardfile +2 -2
  7. data/README.md +4 -4
  8. data/bosh-workspace.gemspec +2 -1
  9. data/lib/bosh/cli/commands/deployment_patch.rb +96 -0
  10. data/lib/bosh/cli/commands/prepare.rb +6 -4
  11. data/lib/bosh/workspace/credentials.rb +30 -0
  12. data/lib/bosh/workspace/deployment_patch.rb +90 -0
  13. data/lib/bosh/workspace/helpers/git_credentials_helper.rb +95 -0
  14. data/lib/bosh/workspace/helpers/spiff_helper.rb +1 -0
  15. data/lib/bosh/workspace/project_deployment.rb +2 -44
  16. data/lib/bosh/workspace/release.rb +20 -23
  17. data/lib/bosh/workspace/schemas/credentials.rb +27 -0
  18. data/lib/bosh/workspace/schemas/deployment_patch.rb +15 -0
  19. data/lib/bosh/workspace/schemas/project_deployment.rb +21 -0
  20. data/lib/bosh/workspace/schemas/releases.rb +16 -0
  21. data/lib/bosh/workspace/schemas/stemcells.rb +25 -0
  22. data/lib/bosh/workspace/shell.rb +67 -0
  23. data/lib/bosh/workspace/tasks/bosh_command_runner.rb +29 -0
  24. data/lib/bosh/workspace/tasks/deployment.rb +63 -0
  25. data/lib/bosh/workspace/tasks/workspace.rake +69 -0
  26. data/lib/bosh/workspace/tasks.rb +15 -0
  27. data/lib/bosh/workspace/version.rb +1 -1
  28. data/lib/bosh/workspace.rb +14 -0
  29. data/spec/assets/foo-boshrelease-repo-new-structure.zip +0 -0
  30. data/spec/assets/foo-boshrelease-repo-updated.zip +0 -0
  31. data/spec/assets/foo-boshrelease-repo.zip +0 -0
  32. data/spec/assets/foo-boshworkspace.zip +0 -0
  33. data/spec/commands/deployment_patch_spec.rb +152 -0
  34. data/spec/commands/prepare_spec.rb +5 -3
  35. data/spec/credentials_spec.rb +46 -0
  36. data/spec/deployment_patch_spec.rb +171 -0
  37. data/spec/helpers/git_credentials_helper_spec.rb +160 -0
  38. data/spec/helpers/spiff_helper_spec.rb +16 -3
  39. data/spec/project_deployment_spec.rb +52 -163
  40. data/spec/release_spec.rb +208 -80
  41. data/spec/schemas/credentials_spec.rb +28 -0
  42. data/spec/schemas/deployment_patch_spec.rb +30 -0
  43. data/spec/schemas/project_deployment_spec.rb +45 -0
  44. data/spec/schemas/releases_spec.rb +31 -0
  45. data/spec/schemas/stemcells_spec.rb +37 -0
  46. data/spec/shell_spec.rb +70 -0
  47. data/spec/spec_helper.rb +11 -5
  48. data/spec/support/shared_contexts/rake.rb +37 -0
  49. data/spec/tasks/bosh_command_runner_spec.rb +39 -0
  50. data/spec/tasks/deployment_spec.rb +80 -0
  51. data/spec/tasks/workspace_task_spec.rb +99 -0
  52. metadata +69 -7
@@ -0,0 +1,39 @@
1
+ module Bosh::Workspace::Tasks
2
+ describe BoshCommandRunner do
3
+ describe "#run" do
4
+ subject { BoshCommandRunner.new "example.com:25555", "foo", "bar" }
5
+ let(:shell) { instance_double("Bosh::Workspace::Shell") }
6
+
7
+ before do
8
+ allow(Bosh::Workspace::Shell).to receive(:new).and_return(shell)
9
+ end
10
+
11
+ def expect_bosh_command(cmd, options = {})
12
+ options[:output_command] = true
13
+ options[:env] = { "BOSH_USER" => "foo", "BOSH_PASSWORD" => "bar" }
14
+ cmd = "bundle exec bosh -n -t example.com:25555 #{cmd}"
15
+ expect(shell).to receive(:run).with(cmd, options)
16
+ end
17
+
18
+ it "runs" do
19
+ expect_bosh_command("foo")
20
+ subject.run "foo"
21
+ end
22
+
23
+ context "with deployment_file" do
24
+ it "runs" do
25
+ expect_bosh_command("-d .deployments/foo.yml foo")
26
+ subject.deployment_file = ".deployments/foo.yml"
27
+ subject.run "foo"
28
+ end
29
+ end
30
+
31
+ context "with options" do
32
+ it "runs" do
33
+ expect_bosh_command("foo", ignore_failures: true)
34
+ subject.run "foo", ignore_failures: true
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,80 @@
1
+ module Bosh::Workspace::Tasks
2
+ describe Deployment do
3
+ subject { Deployment.new(deployment) }
4
+ let(:deployment) do
5
+ {
6
+ "name" => "foo",
7
+ "target" => "foo:bar@example.com:25555",
8
+ "apply_patch" => "tmp/apply_foo_patch.yml",
9
+ "create_patch" => "tmp/create_foo_patch.yml",
10
+ "errands" => ["foo_errand", "bar_errand"]
11
+ }
12
+ end
13
+
14
+ describe 'validation' do
15
+ it "validates" do
16
+ expect { subject }.to_not raise_error
17
+ end
18
+
19
+ %w(name target).each do |field|
20
+ context "missing #{field}" do
21
+ before { deployment.delete field }
22
+ it { expect { subject }.to raise_error(/#{field}.*missing/i) }
23
+ end
24
+ end
25
+
26
+ %w(apply_patch create_patch errands).each do |field|
27
+ context "missing optional #{field}" do
28
+ before { deployment.delete field }
29
+ it { expect { subject }.to_not raise_error }
30
+ end
31
+ end
32
+
33
+ context "invalid name" do
34
+ before { deployment["name"] = "foo.yml" }
35
+ it { expect { subject }.to raise_error(/name.*doesn't match regexp/i) }
36
+ end
37
+ end
38
+
39
+ describe "#name" do
40
+ before do
41
+ expect(YAML).to receive(:load_file).with("deployments/foo.yml")
42
+ .and_return({ "name" => "foobar1" })
43
+ end
44
+
45
+ its(:name) { is_expected.to eq "foobar1" }
46
+ end
47
+
48
+ describe "target, username and password" do
49
+ before do
50
+ deployment["target"] = target if defined? target
51
+ end
52
+
53
+ its(:target) { is_expected.to eq "example.com:25555" }
54
+ its(:username) { is_expected.to eq "foo" }
55
+ its(:password) { is_expected.to eq "bar" }
56
+
57
+ context "default password" do
58
+ let(:target) { "foo@example.com" }
59
+ its(:target) { is_expected.to eq "example.com" }
60
+ its(:username) { is_expected.to eq "foo" }
61
+ its(:password) { is_expected.to eq "admin" }
62
+ end
63
+
64
+ context "default username" do
65
+ let(:target) { "example.com:25555" }
66
+ its(:target) { is_expected.to eq "example.com:25555" }
67
+ its(:username) { is_expected.to eq "admin" }
68
+ its(:password) { is_expected.to eq "admin" }
69
+ end
70
+ end
71
+
72
+ describe "properties" do
73
+ its(:merged_file) { is_expected.to eq ".deployments/foo.yml" }
74
+ its(:file_name) { is_expected.to eq "foo.yml" }
75
+ its(:errands) { is_expected.to eq ["foo_errand", "bar_errand"] }
76
+ its(:apply_patch) { is_expected.to eq "tmp/apply_foo_patch.yml" }
77
+ its(:create_patch) { is_expected.to eq "tmp/create_foo_patch.yml" }
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,99 @@
1
+ module Bosh::Workspace::Tasks
2
+ describe 'workspace' do
3
+ include_context "rake"
4
+
5
+ let(:cli) { instance_double("BoshCommandRunner") }
6
+ let(:deployment) do
7
+ methods = {
8
+ name: "foo-z1",
9
+ target: "example.com:25555",
10
+ username: "foo",
11
+ password: "bar",
12
+ merged_file: ".deployments/foo.yml",
13
+ apply_patch: "tmp/apply_foo_patch.yml",
14
+ create_patch: "tmp/create_foo_patch.yml",
15
+ errands: ["foo_errand", "bar_errand"]
16
+ }
17
+ instance_double("Deployment", methods)
18
+ end
19
+
20
+ before do
21
+ allow(YAML).to receive(:load_file).with("deployments.yml")
22
+ .and_return([:deployment])
23
+ allow(BoshCommandRunner).to receive(:new)
24
+ .with("example.com:25555", "foo", "bar").and_return(cli)
25
+ allow(Deployment).to receive(:new)
26
+ .with(:deployment).and_return(deployment)
27
+ end
28
+
29
+ def expect_bosh_command(cmd, options = {})
30
+ expect(cli).to receive(:run).with(cmd, options)
31
+ end
32
+
33
+ context "with deployments" do
34
+ before do
35
+ expect(cli).to receive(:deployment_file=)
36
+ .with(".deployments/foo.yml")
37
+ end
38
+
39
+ describe ':patch' do
40
+ subject { rake["workspace:patch"] }
41
+
42
+ it "runs" do
43
+ expect_bosh_command("apply deployment patch tmp/apply_foo_patch.yml")
44
+ expect_bosh_command("create deployment patch tmp/create_foo_patch.yml")
45
+ subject.invoke
46
+ end
47
+ end
48
+
49
+ describe ':deploy' do
50
+ subject { rake["workspace:deploy"] }
51
+ let(:already_invoked_tasks) { %w(workspace:target) }
52
+ let(:deploy_stdout) { "task 100" }
53
+
54
+ before do
55
+ expect_bosh_command("prepare deployment")
56
+ expect(cli).to receive(:run).with("deploy", last_number: 1)
57
+ .and_return(deploy_stdout)
58
+ end
59
+
60
+ it "runs" do
61
+ subject.invoke
62
+ end
63
+
64
+ context "with failing deploy" do
65
+ let(:deploy_stdout) { "Task 101 error" }
66
+ it "fails" do
67
+ expect { subject.invoke }.to raise_error SystemExit
68
+ end
69
+ end
70
+ end
71
+
72
+ describe ':run_errands' do
73
+ subject { rake["workspace:run_errands"] }
74
+
75
+ it "runs and executes errands" do
76
+ expect_bosh_command("run errand foo_errand")
77
+ expect_bosh_command("run errand bar_errand")
78
+ subject.invoke
79
+ end
80
+ end
81
+ end
82
+
83
+ describe ':clean' do
84
+ subject { rake["workspace:clean"] }
85
+
86
+ it "deletes all deployments" do
87
+ ENV["DESTROY_DEPLOYMENTS"] = "true"
88
+ expect_bosh_command("delete deployment foo-z1 --force", ignore_failures: true)
89
+ subject.invoke
90
+ end
91
+
92
+ it "raises error when DESTROY_DEPLOYMENTS is not set" do
93
+ expect { subject.invoke }.to raise_error /destroy_deployments/i
94
+ end
95
+
96
+ after { ENV.delete_if { |e| e =~ /DESTROY_DEPLOYMENTS/ } }
97
+ end
98
+ end
99
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bosh-workspace
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.5
4
+ version: 0.9.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ruben Koster
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-07 00:00:00.000000000 Z
11
+ date: 2015-03-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bosh_cli
@@ -67,19 +67,33 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: 1.1.0
69
69
  - !ruby/object:Gem::Dependency
70
- name: git
70
+ name: hashdiff
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ~>
74
74
  - !ruby/object:Gem::Version
75
- version: 1.2.6
75
+ version: 0.2.1
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - ~>
81
81
  - !ruby/object:Gem::Version
82
- version: 1.2.6
82
+ version: 0.2.1
83
+ - !ruby/object:Gem::Dependency
84
+ name: rugged
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: 0.22.0b5
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: 0.22.0b5
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: bundler
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -168,10 +182,14 @@ files:
168
182
  - README.md
169
183
  - Rakefile
170
184
  - bosh-workspace.gemspec
185
+ - lib/bosh/cli/commands/deployment_patch.rb
171
186
  - lib/bosh/cli/commands/prepare.rb
172
187
  - lib/bosh/cli/commands/project_deployment.rb
173
188
  - lib/bosh/workspace.rb
189
+ - lib/bosh/workspace/credentials.rb
190
+ - lib/bosh/workspace/deployment_patch.rb
174
191
  - lib/bosh/workspace/helpers/dns_helper.rb
192
+ - lib/bosh/workspace/helpers/git_credentials_helper.rb
175
193
  - lib/bosh/workspace/helpers/project_deployment_helper.rb
176
194
  - lib/bosh/workspace/helpers/release_helper.rb
177
195
  - lib/bosh/workspace/helpers/spiff_helper.rb
@@ -179,8 +197,18 @@ files:
179
197
  - lib/bosh/workspace/manifest_builder.rb
180
198
  - lib/bosh/workspace/project_deployment.rb
181
199
  - lib/bosh/workspace/release.rb
200
+ - lib/bosh/workspace/schemas/credentials.rb
201
+ - lib/bosh/workspace/schemas/deployment_patch.rb
202
+ - lib/bosh/workspace/schemas/project_deployment.rb
203
+ - lib/bosh/workspace/schemas/releases.rb
204
+ - lib/bosh/workspace/schemas/stemcells.rb
205
+ - lib/bosh/workspace/shell.rb
182
206
  - lib/bosh/workspace/stemcell.rb
183
207
  - lib/bosh/workspace/stub_file.rb
208
+ - lib/bosh/workspace/tasks.rb
209
+ - lib/bosh/workspace/tasks/bosh_command_runner.rb
210
+ - lib/bosh/workspace/tasks/deployment.rb
211
+ - lib/bosh/workspace/tasks/workspace.rake
184
212
  - lib/bosh/workspace/version.rb
185
213
  - spec/assets/bin/spiff
186
214
  - spec/assets/dns/job-properties.yml
@@ -189,14 +217,21 @@ files:
189
217
  - spec/assets/dns/networks-no-manual.yml
190
218
  - spec/assets/dns/properties.yml
191
219
  - spec/assets/empty-manifests-repo/.keep
220
+ - spec/assets/foo-boshrelease-repo-new-structure.zip
221
+ - spec/assets/foo-boshrelease-repo-updated.zip
192
222
  - spec/assets/foo-boshrelease-repo.zip
223
+ - spec/assets/foo-boshworkspace.zip
193
224
  - spec/assets/manifests-repo/.manifests/foo.yml
194
225
  - spec/assets/manifests-repo/deployments/bar.yml
195
226
  - spec/assets/manifests-repo/deployments/foo.yml
196
227
  - spec/assets/manifests-repo/templates/foo/bar.yml
228
+ - spec/commands/deployment_patch_spec.rb
197
229
  - spec/commands/prepare_spec.rb
198
230
  - spec/commands/project_deployment_spec.rb
231
+ - spec/credentials_spec.rb
232
+ - spec/deployment_patch_spec.rb
199
233
  - spec/helpers/dns_helper_spec.rb
234
+ - spec/helpers/git_credentials_helper_spec.rb
200
235
  - spec/helpers/project_deployment_helper_spec.rb
201
236
  - spec/helpers/release_helper_spec.rb
202
237
  - spec/helpers/spiff_helper_spec.rb
@@ -204,9 +239,19 @@ files:
204
239
  - spec/manifest_builder_spec.rb
205
240
  - spec/project_deployment_spec.rb
206
241
  - spec/release_spec.rb
242
+ - spec/schemas/credentials_spec.rb
243
+ - spec/schemas/deployment_patch_spec.rb
244
+ - spec/schemas/project_deployment_spec.rb
245
+ - spec/schemas/releases_spec.rb
246
+ - spec/schemas/stemcells_spec.rb
247
+ - spec/shell_spec.rb
207
248
  - spec/spec_helper.rb
208
249
  - spec/stemcell_spec.rb
209
250
  - spec/stub_file_spec.rb
251
+ - spec/support/shared_contexts/rake.rb
252
+ - spec/tasks/bosh_command_runner_spec.rb
253
+ - spec/tasks/deployment_spec.rb
254
+ - spec/tasks/workspace_task_spec.rb
210
255
  homepage: http://starkandwayne.com
211
256
  licenses:
212
257
  - MIT
@@ -222,9 +267,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
222
267
  version: 2.0.0
223
268
  required_rubygems_version: !ruby/object:Gem::Requirement
224
269
  requirements:
225
- - - '>='
270
+ - - '>'
226
271
  - !ruby/object:Gem::Version
227
- version: '0'
272
+ version: 1.3.1
228
273
  requirements: []
229
274
  rubyforge_project:
230
275
  rubygems_version: 2.2.2
@@ -239,14 +284,21 @@ test_files:
239
284
  - spec/assets/dns/networks-no-manual.yml
240
285
  - spec/assets/dns/properties.yml
241
286
  - spec/assets/empty-manifests-repo/.keep
287
+ - spec/assets/foo-boshrelease-repo-new-structure.zip
288
+ - spec/assets/foo-boshrelease-repo-updated.zip
242
289
  - spec/assets/foo-boshrelease-repo.zip
290
+ - spec/assets/foo-boshworkspace.zip
243
291
  - spec/assets/manifests-repo/.manifests/foo.yml
244
292
  - spec/assets/manifests-repo/deployments/bar.yml
245
293
  - spec/assets/manifests-repo/deployments/foo.yml
246
294
  - spec/assets/manifests-repo/templates/foo/bar.yml
295
+ - spec/commands/deployment_patch_spec.rb
247
296
  - spec/commands/prepare_spec.rb
248
297
  - spec/commands/project_deployment_spec.rb
298
+ - spec/credentials_spec.rb
299
+ - spec/deployment_patch_spec.rb
249
300
  - spec/helpers/dns_helper_spec.rb
301
+ - spec/helpers/git_credentials_helper_spec.rb
250
302
  - spec/helpers/project_deployment_helper_spec.rb
251
303
  - spec/helpers/release_helper_spec.rb
252
304
  - spec/helpers/spiff_helper_spec.rb
@@ -254,6 +306,16 @@ test_files:
254
306
  - spec/manifest_builder_spec.rb
255
307
  - spec/project_deployment_spec.rb
256
308
  - spec/release_spec.rb
309
+ - spec/schemas/credentials_spec.rb
310
+ - spec/schemas/deployment_patch_spec.rb
311
+ - spec/schemas/project_deployment_spec.rb
312
+ - spec/schemas/releases_spec.rb
313
+ - spec/schemas/stemcells_spec.rb
314
+ - spec/shell_spec.rb
257
315
  - spec/spec_helper.rb
258
316
  - spec/stemcell_spec.rb
259
317
  - spec/stub_file_spec.rb
318
+ - spec/support/shared_contexts/rake.rb
319
+ - spec/tasks/bosh_command_runner_spec.rb
320
+ - spec/tasks/deployment_spec.rb
321
+ - spec/tasks/workspace_task_spec.rb