bosh-workspace 0.8.5 → 0.9.0.rc1

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 (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