bosh-workspace 0.9.3 → 0.9.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +4 -0
- data/bosh-workspace.gemspec +0 -1
- data/lib/bosh/workspace/project_deployment.rb +23 -3
- data/lib/bosh/workspace/rspec.rb +2 -0
- data/lib/bosh/workspace/rspec/manifest_matcher.rb +19 -0
- data/lib/bosh/workspace/rspec/shared_workspace_examples.rb +46 -0
- data/lib/bosh/workspace/version.rb +1 -1
- data/spec/assets/manifests-repo/deployments/foo.yml +0 -1
- data/spec/assets/manifests-repo/stubs/foo.yml +1 -1
- data/spec/integration/shared_workspace_examples_spec.rb +45 -0
- data/spec/project_deployment_spec.rb +16 -9
- data/spec/spec_helper.rb +4 -0
- metadata +7 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3f29b754b572e4d5ed8dec967631ad55ad4c1aaf
|
4
|
+
data.tar.gz: ef6635245f5b889dce32d237cbc729d757b0e488
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f6d369889fcadf43fd158cdbeef13bceca9352acd375b6f7471f7530e9febaab0368a1689a6866ec2db504bfde8c922fe7e091503ad473c2c79a9e34293727ae
|
7
|
+
data.tar.gz: d76958a05172e80c8ee96ee84010827cfaab34d94f0b8fe36cfb6917f36f98c9cd959a9af21a0508b4a7552b8993d49948534182392bc82bc4b0c8bfc91ffcd2
|
data/.travis.yml
CHANGED
@@ -3,6 +3,10 @@ cache: bundler
|
|
3
3
|
sudo: false
|
4
4
|
rvm:
|
5
5
|
- 2.0
|
6
|
+
before_script:
|
7
|
+
- wget https://github.com/cloudfoundry-incubator/spiff/releases/download/v1.0.7/spiff_linux_amd64.zip -O /tmp/spiff.zip
|
8
|
+
- unzip /tmp/spiff.zip && mkdir bin && mv spiff bin && chmod +x bin/spiff
|
9
|
+
- export PATH=$PATH:$PWD/bin
|
6
10
|
addons:
|
7
11
|
code_climate:
|
8
12
|
repo_token:
|
data/bosh-workspace.gemspec
CHANGED
@@ -22,7 +22,6 @@ Gem::Specification.new do |spec|
|
|
22
22
|
|
23
23
|
spec.add_runtime_dependency "bosh_cli", ">= 1.2905.0"
|
24
24
|
spec.add_runtime_dependency "bosh_common", ">= 1.2905.0"
|
25
|
-
spec.add_runtime_dependency "bosh-template", ">= 1.2905.0"
|
26
25
|
spec.add_runtime_dependency "semi_semantic", "~> 1.1.0"
|
27
26
|
spec.add_runtime_dependency "membrane", "~> 1.1.0"
|
28
27
|
spec.add_runtime_dependency "hashdiff", "~> 0.2.1"
|
@@ -1,9 +1,11 @@
|
|
1
1
|
module Bosh::Workspace
|
2
2
|
class ProjectDeployment
|
3
3
|
include Bosh::Cli::Validation
|
4
|
-
attr_writer :director_uuid
|
4
|
+
attr_writer :director_uuid, :stub
|
5
5
|
attr_reader :file
|
6
6
|
|
7
|
+
STUB_WHITELIST = %w(name director_uuid meta)
|
8
|
+
|
7
9
|
def initialize(file)
|
8
10
|
@file = file
|
9
11
|
err("Deployment file does not exist: #{file}") unless File.exist?(@file)
|
@@ -33,8 +35,10 @@ module Bosh::Workspace
|
|
33
35
|
|
34
36
|
def manifest
|
35
37
|
return @manifest unless @manifest.nil?
|
36
|
-
|
37
|
-
|
38
|
+
@manifest = Psych.load(ERB.new(File.read(file)).result)
|
39
|
+
validate_stub! unless stub.empty?
|
40
|
+
@manifest = recursive_merge(@manifest, stub) unless stub.empty?
|
41
|
+
@manifest
|
38
42
|
end
|
39
43
|
|
40
44
|
def stub
|
@@ -51,6 +55,12 @@ module Bosh::Workspace
|
|
51
55
|
|
52
56
|
private
|
53
57
|
|
58
|
+
def validate_stub!
|
59
|
+
return unless stub.keys.any? { |k| !STUB_WHITELIST.include?(k) }
|
60
|
+
offending_keys = stub.keys - STUB_WHITELIST
|
61
|
+
err "Key: '#{offending_keys.first}' not allowed in stub file"
|
62
|
+
end
|
63
|
+
|
54
64
|
def file_basename
|
55
65
|
File.basename(@file)
|
56
66
|
end
|
@@ -58,5 +68,15 @@ module Bosh::Workspace
|
|
58
68
|
def file_dirname
|
59
69
|
File.dirname(@file)
|
60
70
|
end
|
71
|
+
|
72
|
+
def recursive_merge(source, target)
|
73
|
+
source.merge(target) do |_, old_value, new_value|
|
74
|
+
if old_value.class == Hash && new_value.class == Hash
|
75
|
+
recursive_merge(old_value, new_value)
|
76
|
+
else
|
77
|
+
new_value
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
61
81
|
end
|
62
82
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
RSpec::Matchers.define :match_manifest do |expected|
|
2
|
+
match do |actual|
|
3
|
+
@diff = Bosh::Cli::HashChangeset.new
|
4
|
+
@diff.add_hash(normalize_and_load_deployment_manifest(actual), :new)
|
5
|
+
@diff.add_hash(normalize_and_load_deployment_manifest(expected), :old)
|
6
|
+
!@diff.changed?
|
7
|
+
end
|
8
|
+
|
9
|
+
failure_message do |actual|
|
10
|
+
@diff.summary.join("\n")
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def normalize_and_load_deployment_manifest(manifest_file)
|
16
|
+
manifest_hash = YAML.load_file manifest_file
|
17
|
+
Bosh::Cli::DeploymentManifest.new(manifest_hash).normalize
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require "common/exec"
|
2
|
+
require "yaml"
|
3
|
+
require 'semi_semantic/version'
|
4
|
+
require 'bosh/workspace'
|
5
|
+
require 'cli'
|
6
|
+
|
7
|
+
desc = "behaves as bosh-workspace deployment"
|
8
|
+
RSpec.shared_examples desc do |deployment_file, result_file, stub_file|
|
9
|
+
let(:workdir) { File.expand_path(File.join(deployment_file, '../..')) }
|
10
|
+
let(:stub) do
|
11
|
+
result = {} unless File.exist?(stub_file)
|
12
|
+
result ||= YAML.load_file(stub_file) || {}
|
13
|
+
result.merge({'director_uuid' => '00000000-0000-0000-0000-000000000000'})
|
14
|
+
end
|
15
|
+
|
16
|
+
subject do
|
17
|
+
Bosh::Workspace::ProjectDeployment.new(deployment_file).tap do |d|
|
18
|
+
d.stub = stub
|
19
|
+
d.validate
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
it "is a valid deployment manifest" do
|
24
|
+
expect(subject.errors).to eq []
|
25
|
+
end
|
26
|
+
|
27
|
+
def merge_templates(deployment, workdir)
|
28
|
+
Bosh::Workspace::ManifestBuilder.build(deployment, workdir)
|
29
|
+
end
|
30
|
+
|
31
|
+
def prepare_templates(deployment, workdir)
|
32
|
+
releases_dir = File.join(workdir, '.releases')
|
33
|
+
callback = Bosh::Workspace::GitCredentialsProvider
|
34
|
+
.new(File.join(workdir, '.credentials.yml')).callback
|
35
|
+
|
36
|
+
deployment.releases.each do |release|
|
37
|
+
Bosh::Workspace::Release.new(release, releases_dir, callback).update_repo
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
it "successfully merges deployment templates" do
|
42
|
+
expect { prepare_templates(subject, workdir) }.to_not raise_error
|
43
|
+
expect { merge_templates(subject, workdir) }.to_not raise_error
|
44
|
+
expect(subject.merged_file).to match_manifest result_file
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'bosh/workspace/rspec'
|
2
|
+
|
3
|
+
describe "rspec shared bosh-workspace example" do
|
4
|
+
deployment = {
|
5
|
+
'name' => 'foo',
|
6
|
+
'releases' => [],
|
7
|
+
'stemcells' => [],
|
8
|
+
'templates' => [
|
9
|
+
'deployment.yml'
|
10
|
+
],
|
11
|
+
'meta' => {
|
12
|
+
'foo' => 'bar'
|
13
|
+
}
|
14
|
+
}
|
15
|
+
deployment_template = {
|
16
|
+
'director_uuid' => '(( merge ))',
|
17
|
+
'name' => '(( merge ))',
|
18
|
+
'releases' => '(( merge ))',
|
19
|
+
'jobs' => []
|
20
|
+
}
|
21
|
+
stub = { 'name' => 'bar' }
|
22
|
+
|
23
|
+
result = {
|
24
|
+
'director_uuid' => '00000000-0000-0000-0000-000000000000',
|
25
|
+
'name' => 'bar',
|
26
|
+
'releases' => [],
|
27
|
+
'jobs' => []
|
28
|
+
}
|
29
|
+
|
30
|
+
deployment_file = get_tmp_yml_file_path(deployment).tap do |d|
|
31
|
+
templates_path = File.expand_path('../../templates', d)
|
32
|
+
FileUtils.mkdir_p templates_path
|
33
|
+
IO.write(
|
34
|
+
File.join(templates_path, 'deployment.yml'),
|
35
|
+
deployment_template.to_yaml
|
36
|
+
)
|
37
|
+
end
|
38
|
+
|
39
|
+
include_examples(
|
40
|
+
"behaves as bosh-workspace deployment",
|
41
|
+
deployment_file,
|
42
|
+
get_tmp_yml_file_path(result),
|
43
|
+
get_tmp_yml_file_path(stub)
|
44
|
+
)
|
45
|
+
end
|
@@ -24,24 +24,31 @@ module Bosh::Workspace
|
|
24
24
|
end
|
25
25
|
|
26
26
|
context 'with stub file' do
|
27
|
-
let(:manifest) { { 'director_uuid' => '
|
28
|
-
let(:stub_content)
|
27
|
+
let(:manifest) { { 'director_uuid' => 'DIRECTOR_UUID' } }
|
28
|
+
let(:stub_content) do
|
29
|
+
{
|
30
|
+
'name' => 'bar',
|
31
|
+
'director_uuid' => 'foo-uuid',
|
32
|
+
'meta' => { 'foo' => 'bar' }
|
33
|
+
}.to_yaml
|
34
|
+
end
|
35
|
+
|
29
36
|
before do
|
30
37
|
allow(File).to receive(:exist?).with(stub_file).and_return(true)
|
31
38
|
allow(File).to receive(:read).with(stub_file).and_return(stub_content)
|
32
39
|
end
|
33
40
|
|
34
|
-
it '
|
35
|
-
expect(subject.manifest['director_uuid']).to eq('
|
41
|
+
it 'merges stub with manifest' do
|
42
|
+
expect(subject.manifest['director_uuid']).to eq('foo-uuid')
|
36
43
|
end
|
37
44
|
|
38
|
-
context 'with
|
39
|
-
let(:stub_content) {
|
40
|
-
|
41
|
-
|
45
|
+
context 'stub with releases' do
|
46
|
+
let(:stub_content) { { 'releases' => [] }.to_yaml }
|
47
|
+
|
48
|
+
it 'raises an error' do
|
49
|
+
expect{ subject.manifest }.to raise_error /releases.+not allowed/
|
42
50
|
end
|
43
51
|
end
|
44
|
-
|
45
52
|
end
|
46
53
|
|
47
54
|
context 'without stub file' do
|
data/spec/spec_helper.rb
CHANGED
@@ -65,6 +65,10 @@ def in_home_dir(&block)
|
|
65
65
|
FileUtils.chdir(home_file, &block)
|
66
66
|
end
|
67
67
|
|
68
|
+
def get_tmp_yml_file_path(content)
|
69
|
+
get_tmp_file_path(content.to_yaml)
|
70
|
+
end
|
71
|
+
|
68
72
|
def get_tmp_file_path(content, file_name="tmp")
|
69
73
|
tmp_file = File.open(File.join(Dir.mktmpdir, file_name), "w")
|
70
74
|
tmp_file.write(content)
|
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.9.
|
4
|
+
version: 0.9.4
|
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-
|
11
|
+
date: 2015-11-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bosh_cli
|
@@ -38,20 +38,6 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 1.2905.0
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: bosh-template
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: 1.2905.0
|
48
|
-
type: :runtime
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: 1.2905.0
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
42
|
name: semi_semantic
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -212,6 +198,9 @@ files:
|
|
212
198
|
- lib/bosh/workspace/merge_tool.rb
|
213
199
|
- lib/bosh/workspace/project_deployment.rb
|
214
200
|
- lib/bosh/workspace/release.rb
|
201
|
+
- lib/bosh/workspace/rspec.rb
|
202
|
+
- lib/bosh/workspace/rspec/manifest_matcher.rb
|
203
|
+
- lib/bosh/workspace/rspec/shared_workspace_examples.rb
|
215
204
|
- lib/bosh/workspace/schemas/credentials.rb
|
216
205
|
- lib/bosh/workspace/schemas/deployment_patch.rb
|
217
206
|
- lib/bosh/workspace/schemas/project_deployment.rb
|
@@ -258,6 +247,7 @@ files:
|
|
258
247
|
- spec/helpers/project_deployment_helper_spec.rb
|
259
248
|
- spec/helpers/release_helper_spec.rb
|
260
249
|
- spec/helpers/stemcell_helper_spec.rb
|
250
|
+
- spec/integration/shared_workspace_examples_spec.rb
|
261
251
|
- spec/manifest_builder_spec.rb
|
262
252
|
- spec/merge_tool_spec.rb
|
263
253
|
- spec/project_deployment_spec.rb
|
@@ -334,6 +324,7 @@ test_files:
|
|
334
324
|
- spec/helpers/project_deployment_helper_spec.rb
|
335
325
|
- spec/helpers/release_helper_spec.rb
|
336
326
|
- spec/helpers/stemcell_helper_spec.rb
|
327
|
+
- spec/integration/shared_workspace_examples_spec.rb
|
337
328
|
- spec/manifest_builder_spec.rb
|
338
329
|
- spec/merge_tool_spec.rb
|
339
330
|
- spec/project_deployment_spec.rb
|