bosh-workspace 0.9.0 → 0.9.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +9 -0
- data/bosh-workspace.gemspec +1 -1
- data/lib/bosh/cli/commands/project_deployment.rb +3 -1
- data/lib/bosh/workspace/project_deployment.rb +1 -1
- data/lib/bosh/workspace/release.rb +14 -8
- data/lib/bosh/workspace/schemas/stemcells.rb +2 -2
- data/lib/bosh/workspace/version.rb +1 -1
- data/spec/assets/foo-bar-boshrelease-repo.zip +0 -0
- data/spec/commands/project_deployment_spec.rb +14 -0
- data/spec/project_deployment_spec.rb +2 -1
- data/spec/release_spec.rb +38 -0
- data/spec/schemas/releases_spec.rb +5 -0
- data/spec/schemas/stemcells_spec.rb +10 -0
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 607445472fd952b1af30e2c82b6f3a0cb41d428d
|
4
|
+
data.tar.gz: f0f76de3b79dce0572d2fbec1abb7639b8371cd3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4b78a7da1250d9063edf88d3be266d7de2b22a028527a85ff7db45b3d5fb0addb6dbb71a8737116c3a7c242f1151462ffb0d8370bed1877be4662eaaceb5be71
|
7
|
+
data.tar.gz: abc262a9c39cd72eefe22ed7a73bd6bf8fb2be7d99893f8f40f926278c7018488b519c5f72a7e91de79b7844db4f4b54b2662e97bbe3410d2b65859ee7acb053
|
data/README.md
CHANGED
@@ -123,6 +123,15 @@ Example `.credentials.yml` file:
|
|
123
123
|
-----END RSA PRIVATE KEY-----
|
124
124
|
```
|
125
125
|
|
126
|
+
## Install Notes
|
127
|
+
|
128
|
+
### Ubuntu
|
129
|
+
cmake and libcurl4-openssl-dev is needed for rugged install
|
130
|
+
|
131
|
+
```
|
132
|
+
sudo apt-get install cmake libcurl4-openssl-dev
|
133
|
+
```
|
134
|
+
|
126
135
|
## Experimental
|
127
136
|
### dns support
|
128
137
|
Dns support can be enabled by adding a `domain_name` property to your deployment.
|
data/bosh-workspace.gemspec
CHANGED
@@ -25,7 +25,7 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.add_runtime_dependency "semi_semantic", "~> 1.1.0"
|
26
26
|
spec.add_runtime_dependency "membrane", "~> 1.1.0"
|
27
27
|
spec.add_runtime_dependency "hashdiff", "~> 0.2.1"
|
28
|
-
spec.add_runtime_dependency "rugged", "~> 0.23.
|
28
|
+
spec.add_runtime_dependency "rugged", "~> 0.23.0b3"
|
29
29
|
|
30
30
|
spec.add_development_dependency "bundler", "~> 1.6"
|
31
31
|
spec.add_development_dependency "rspec", "~> 3.1.0"
|
@@ -7,7 +7,7 @@ module Bosh::Workspace
|
|
7
7
|
def initialize(file)
|
8
8
|
@file = file
|
9
9
|
err("Deployment file does not exist: #{file}") unless File.exist? @file
|
10
|
-
@manifest =
|
10
|
+
@manifest = Psych.load(ERB.new(File.read(@file)).result)
|
11
11
|
end
|
12
12
|
|
13
13
|
def perform_validation(options = {})
|
@@ -90,22 +90,28 @@ module Bosh::Workspace
|
|
90
90
|
# [ { version: "1", commit: ee8d52f5d, manifest: releases/foo-1.yml } ]
|
91
91
|
def final_releases
|
92
92
|
@final_releases ||= begin
|
93
|
-
final_releases =
|
93
|
+
final_releases = []
|
94
94
|
releases_tree.walk_blobs(:preorder) do |_, entry|
|
95
95
|
next if entry[:filemode] == 40960 # Skip symlinks
|
96
96
|
path = File.join(releases_dir, entry[:name])
|
97
|
-
blame = Rugged::Blame.new(repo, path)
|
98
|
-
|
97
|
+
blame = Rugged::Blame.new(repo, path).reduce { |memo, hunk|
|
98
|
+
if memo.nil? || hunk[:final_signature][:time] > memo[:final_signature][:time]
|
99
|
+
hunk
|
100
|
+
else
|
101
|
+
memo
|
102
|
+
end
|
103
|
+
}
|
99
104
|
commit_id = blame[:final_commit_id]
|
100
105
|
manifest = blame[:orig_path]
|
101
106
|
version = entry[:name][/#{@name}-(.+)\.yml/, 1]
|
102
|
-
|
103
|
-
|
104
|
-
|
107
|
+
if ! version.nil?
|
108
|
+
final_releases.push({
|
109
|
+
version: version, manifest: manifest, commit: commit_id
|
110
|
+
})
|
111
|
+
end
|
105
112
|
end
|
106
113
|
|
107
|
-
final_releases.
|
108
|
-
.map { |a| a[1] }.reject { |f| f[:manifest][/index.yml/] }
|
114
|
+
final_releases.sort! { |a, b| a[:version].to_i <=> b[:version].to_i }
|
109
115
|
end
|
110
116
|
end
|
111
117
|
|
@@ -16,9 +16,9 @@ module Bosh::Workspace
|
|
16
16
|
return if object.is_a? Integer
|
17
17
|
return if object.is_a? Float
|
18
18
|
return if object == "latest"
|
19
|
-
return if object.to_s =~ /^\d
|
19
|
+
return if object.to_s =~ /^\d+(\.\d+){1,2}$/
|
20
20
|
raise Membrane::SchemaValidationError.new(
|
21
|
-
"Should match: latest, version.patch or version. Given: #{object}")
|
21
|
+
"Should match: latest, version.patch.micropatch, version.patch or version. Given: #{object}")
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
Binary file
|
@@ -66,10 +66,12 @@ describe Bosh::Cli::Command::ProjectDeployment do
|
|
66
66
|
expect(command).to receive(:project_deployment?)
|
67
67
|
.and_return(is_project_deployment)
|
68
68
|
expect(deployment_cmd).to receive(:perform)
|
69
|
+
expect(deployment_cmd).to receive(:exit_code).and_return(exit_code)
|
69
70
|
end
|
70
71
|
|
71
72
|
context "with project deployment" do
|
72
73
|
let(:is_project_deployment) { true }
|
74
|
+
let(:exit_code) { 0 }
|
73
75
|
|
74
76
|
it "requires project deployment" do
|
75
77
|
expect(command).to receive(:require_project_deployment)
|
@@ -80,9 +82,21 @@ describe Bosh::Cli::Command::ProjectDeployment do
|
|
80
82
|
|
81
83
|
context "with normal deployment" do
|
82
84
|
let(:is_project_deployment) { false }
|
85
|
+
let(:exit_code) { 0 }
|
83
86
|
|
84
87
|
it "deploys" do
|
85
88
|
subject
|
89
|
+
expect(command.exit_code).to eq(0)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
context "with failing deployment" do
|
94
|
+
let(:is_project_deployment) { false }
|
95
|
+
let(:exit_code) { 1 }
|
96
|
+
|
97
|
+
it "reports the exit_code correctly" do
|
98
|
+
subject
|
99
|
+
expect(command.exit_code).to eq(1)
|
86
100
|
end
|
87
101
|
end
|
88
102
|
end
|
@@ -1,9 +1,10 @@
|
|
1
1
|
module Bosh::Workspace
|
2
2
|
describe ProjectDeployment do
|
3
3
|
subject { Bosh::Workspace::ProjectDeployment.new manifest_file }
|
4
|
-
let(:manifest_file) { get_tmp_file_path(manifest.to_yaml, file_name) }
|
4
|
+
let(:manifest_file) { get_tmp_file_path(ruby_code + manifest.to_yaml, file_name) }
|
5
5
|
let(:file_name) { "foo.yml" }
|
6
6
|
let(:manifest) { :manifest }
|
7
|
+
let(:ruby_code) { "<% ruby_var=42 %>" }
|
7
8
|
|
8
9
|
describe ".new" do
|
9
10
|
context "deployment file does not exist" do
|
data/spec/release_spec.rb
CHANGED
@@ -86,6 +86,44 @@ describe Bosh::Workspace::Release do
|
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
89
|
+
context "given a release with index + release v1 last touched on the same commit" do
|
90
|
+
let(:repo) { extracted_asset_dir("foo-bar", "foo-bar-boshrelease-repo.zip") }
|
91
|
+
let(:name) { "foo-bar" }
|
92
|
+
|
93
|
+
before do
|
94
|
+
FileUtils.rm_rf(releases_dir)
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "#update_repo" do
|
98
|
+
subject do
|
99
|
+
Dir[File.join(releases_dir, name, "releases/foo-bar/foo-bar*.yml")].to_s
|
100
|
+
end
|
101
|
+
|
102
|
+
context "latest version" do
|
103
|
+
before { release.update_repo }
|
104
|
+
let(:version) { "latest" }
|
105
|
+
it "checks out repo" do
|
106
|
+
expect(subject).to match(/releases\/foo-bar\/foo-bar-2.yml/)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
describe "attributes" do
|
112
|
+
let(:version) { "1" }
|
113
|
+
subject { release }
|
114
|
+
its(:name) { should eq name}
|
115
|
+
its(:git_url) { should eq repo }
|
116
|
+
its(:repo_dir) { should match(/\/#{name}$/) }
|
117
|
+
its(:manifest) { should match "releases/#{name}/#{name}-#{version}.yml$" }
|
118
|
+
its(:name_version) { should eq "#{name}/#{version}" }
|
119
|
+
its(:version) { should eq version }
|
120
|
+
its(:manifest_file) do
|
121
|
+
should match(/\/releases\/#{name}\/#{name}-#{version}.yml$/)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
|
89
127
|
context "given a release with submodule templates" do
|
90
128
|
let(:repo) { extracted_asset_dir("supermodule", "supermodule-boshrelease-repo.zip") }
|
91
129
|
let(:subrepo) { extracted_asset_dir("submodule-boshrelease", "submodule-boshrelease-repo.zip") }
|
@@ -24,6 +24,11 @@ module Bosh::Workspace::Schemas
|
|
24
24
|
it { expect { subject }.to_not raise_error }
|
25
25
|
end
|
26
26
|
|
27
|
+
context "semantic version" do
|
28
|
+
let(:releases) { release["version"] = "1.2.3"; [release] }
|
29
|
+
it { expect { subject }.to_not raise_error }
|
30
|
+
end
|
31
|
+
|
27
32
|
context "invalid version" do
|
28
33
|
let(:releases) { release["version"] = "+foo"; [release] }
|
29
34
|
it { expect { subject }.to raise_error(/version.*should match/i) }
|
@@ -23,6 +23,16 @@ module Bosh::Workspace::Schemas
|
|
23
23
|
it { expect { subject }.to_not raise_error }
|
24
24
|
end
|
25
25
|
|
26
|
+
context "patch version with multiple dots" do
|
27
|
+
let(:stemcells) { stemcell["version"] = "1.2.3"; [stemcell] }
|
28
|
+
it { expect { subject }.to_not raise_error }
|
29
|
+
end
|
30
|
+
|
31
|
+
context "fails for versions with too many dots" do
|
32
|
+
let(:stemcells) { stemcell["version"] = "1.2.3.4"; [stemcell] }
|
33
|
+
it { expect { subject }.to raise_error(/version.*should match/i) }
|
34
|
+
end
|
35
|
+
|
26
36
|
context "patch version float" do
|
27
37
|
let(:stemcells) { stemcell["version"] = 2719.1; [stemcell] }
|
28
38
|
it { expect { subject }.to_not raise_error }
|
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.1
|
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-08-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bosh_cli
|
@@ -86,14 +86,14 @@ dependencies:
|
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 0.23.
|
89
|
+
version: 0.23.0b3
|
90
90
|
type: :runtime
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: 0.23.
|
96
|
+
version: 0.23.0b3
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: bundler
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -218,6 +218,7 @@ files:
|
|
218
218
|
- spec/assets/dns/networks-no-manual.yml
|
219
219
|
- spec/assets/dns/properties.yml
|
220
220
|
- spec/assets/empty-manifests-repo/.keep
|
221
|
+
- spec/assets/foo-bar-boshrelease-repo.zip
|
221
222
|
- spec/assets/foo-boshrelease-repo-new-structure.zip
|
222
223
|
- spec/assets/foo-boshrelease-repo-subdir.zip
|
223
224
|
- spec/assets/foo-boshrelease-repo-updated.zip
|
@@ -290,6 +291,7 @@ test_files:
|
|
290
291
|
- spec/assets/dns/networks-no-manual.yml
|
291
292
|
- spec/assets/dns/properties.yml
|
292
293
|
- spec/assets/empty-manifests-repo/.keep
|
294
|
+
- spec/assets/foo-bar-boshrelease-repo.zip
|
293
295
|
- spec/assets/foo-boshrelease-repo-new-structure.zip
|
294
296
|
- spec/assets/foo-boshrelease-repo-subdir.zip
|
295
297
|
- spec/assets/foo-boshrelease-repo-updated.zip
|