bosh-workspace 0.9.0.rc4 → 0.9.0.rc5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/bosh/cli/commands/deployment_patch.rb +1 -1
- data/lib/bosh/cli/commands/prepare.rb +6 -2
- data/lib/bosh/workspace/helpers/git_credentials_helper.rb +4 -4
- data/lib/bosh/workspace/release.rb +55 -1
- data/lib/bosh/workspace/version.rb +1 -1
- data/spec/assets/foo-boshrelease-repo.zip +0 -0
- data/spec/assets/submodule-boshrelease-repo.zip +0 -0
- data/spec/assets/supermodule-boshrelease-repo.zip +0 -0
- data/spec/commands/prepare_spec.rb +8 -3
- data/spec/helpers/git_credentials_helper_spec.rb +6 -6
- data/spec/release_spec.rb +90 -5
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3c7b969ed0420ed359c4b818cc406ba9da51da12
|
4
|
+
data.tar.gz: e18975e40f8822effa0e4a38116779dd38831d3a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3a962465f8afd6ec0d9165db2e6b2907208709b014ddd21051e82f62c3084ec0e963b5696ca56d343578521c82aa41873abf08daaf8af621174111178ae7faca
|
7
|
+
data.tar.gz: d0564bb1504d5492a362a1cf548aa746afa80db5d4ee2080edef5d8db47bb84b5299a3749e3520e8868f3334b58120c8c21b0858e8d638b61ce131cbde505cad
|
@@ -3,7 +3,7 @@ require "bosh/workspace"
|
|
3
3
|
module Bosh::Cli::Command
|
4
4
|
class DeploymentPatch < Base
|
5
5
|
include Bosh::Workspace::ProjectDeploymentHelper
|
6
|
-
include Bosh::Workspace::
|
6
|
+
include Bosh::Workspace::GitCredentialsHelper
|
7
7
|
|
8
8
|
usage "create deployment patch"
|
9
9
|
desc "Extract patch from the current directory and optionally writes to file"
|
@@ -5,7 +5,7 @@ module Bosh::Cli::Command
|
|
5
5
|
include Bosh::Cli::Validation
|
6
6
|
include Bosh::Workspace
|
7
7
|
include ProjectDeploymentHelper
|
8
|
-
include
|
8
|
+
include GitCredentialsHelper
|
9
9
|
include ReleaseHelper
|
10
10
|
include StemcellHelper
|
11
11
|
|
@@ -30,6 +30,10 @@ module Bosh::Cli::Command
|
|
30
30
|
say "Fetching release '#{release.name.make_green}' to satisfy template references"
|
31
31
|
fetch_or_clone_repo(release.repo_dir, release.git_url)
|
32
32
|
release.update_repo
|
33
|
+
release.required_submodules.each do |submodule|
|
34
|
+
fetch_or_clone_repo(File.join(release.repo_dir, submodule.path), submodule.url)
|
35
|
+
release.update_submodule(submodule)
|
36
|
+
end
|
33
37
|
msg = "Version '#{release.version.to_s.make_green}'"
|
34
38
|
msg = "Ref '#{release.ref.make_green}'" if release.ref
|
35
39
|
say "#{msg} has been checkout into:"
|
@@ -54,7 +58,7 @@ module Bosh::Cli::Command
|
|
54
58
|
say "Skipping upload"
|
55
59
|
else
|
56
60
|
say "Uploading '#{release.name_version.make_green}'"
|
57
|
-
release_upload(release.manifest_file, release.
|
61
|
+
release_upload(release.manifest_file, release.release_dir)
|
58
62
|
end
|
59
63
|
end
|
60
64
|
|
@@ -1,9 +1,9 @@
|
|
1
1
|
module Bosh::Workspace
|
2
|
-
module
|
2
|
+
module GitCredentialsHelper
|
3
3
|
REFSPEC = ['HEAD:refs/remotes/origin/HEAD']
|
4
4
|
|
5
5
|
def fetch_or_clone_repo(dir, url)
|
6
|
-
repo = File.exist?(dir) ? open_repo(dir) : init_repo(dir, url)
|
6
|
+
repo = File.exist?(File.join(dir, '.git')) ? open_repo(dir) : init_repo(dir, url)
|
7
7
|
fetch_and_checkout(repo)
|
8
8
|
end
|
9
9
|
|
@@ -24,7 +24,7 @@ module Bosh::Workspace
|
|
24
24
|
return {} if check_connection(repo, url)
|
25
25
|
validate_url_protocol_support!(url)
|
26
26
|
|
27
|
-
options = { credentials:
|
27
|
+
options = { credentials: require_credentials_for(url) }
|
28
28
|
unless check_connection(repo, url, options)
|
29
29
|
say "Using credentials from: #{git_credentials_file}"
|
30
30
|
err "Invalid credentials for: #{url}"
|
@@ -51,7 +51,7 @@ module Bosh::Workspace
|
|
51
51
|
@git_credentials ||= Credentials.new(git_credentials_file)
|
52
52
|
end
|
53
53
|
|
54
|
-
def
|
54
|
+
def require_credentials_for(url)
|
55
55
|
unless File.exist? git_credentials_file
|
56
56
|
say("Authentication is required for: #{url}".make_red)
|
57
57
|
err("Credentials file does not exist: #{git_credentials_file}".make_red)
|
@@ -15,6 +15,21 @@ module Bosh::Workspace
|
|
15
15
|
repo.checkout ref || release[:commit], strategy: :force
|
16
16
|
end
|
17
17
|
|
18
|
+
def update_submodule(submodule)
|
19
|
+
submodule.repository.checkout submodule.head_oid, strategy: :force
|
20
|
+
end
|
21
|
+
|
22
|
+
def required_submodules
|
23
|
+
required = []
|
24
|
+
symlink_templates.each do |template|
|
25
|
+
submodule = submodule_for(template)
|
26
|
+
if submodule
|
27
|
+
required.push(submodule)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
required
|
31
|
+
end
|
32
|
+
|
18
33
|
def manifest_file
|
19
34
|
File.join(repo_dir, manifest)
|
20
35
|
end
|
@@ -35,6 +50,10 @@ module Bosh::Workspace
|
|
35
50
|
@ref && repo.lookup(@ref).oid
|
36
51
|
end
|
37
52
|
|
53
|
+
def release_dir
|
54
|
+
@path ? File.join(@repo_dir, @path) : @repo_dir
|
55
|
+
end
|
56
|
+
|
38
57
|
private
|
39
58
|
|
40
59
|
def repo
|
@@ -42,7 +61,8 @@ module Bosh::Workspace
|
|
42
61
|
end
|
43
62
|
|
44
63
|
def new_style_repo
|
45
|
-
|
64
|
+
base = @path ? File.join(@path, 'releases') : 'releases'
|
65
|
+
dir = File.join(repo_dir, base, @name)
|
46
66
|
File.directory?(dir) && !File.symlink?(dir)
|
47
67
|
end
|
48
68
|
|
@@ -61,6 +81,7 @@ module Bosh::Workspace
|
|
61
81
|
@final_releases ||= begin
|
62
82
|
final_releases = {}
|
63
83
|
releases_tree.walk_blobs(:preorder) do |_, entry|
|
84
|
+
next if entry[:filemode] == 40960 # Skip symlinks
|
64
85
|
path = File.join(releases_dir, entry[:name])
|
65
86
|
blame = Rugged::Blame.new(repo, path)[0]
|
66
87
|
time = blame[:final_signature][:time]
|
@@ -85,5 +106,38 @@ module Bosh::Workspace
|
|
85
106
|
end
|
86
107
|
release
|
87
108
|
end
|
109
|
+
|
110
|
+
def templates_dir
|
111
|
+
File.join(repo.workdir, "templates")
|
112
|
+
end
|
113
|
+
|
114
|
+
def symlink_target(file)
|
115
|
+
if File.readlink(file).start_with?("/")
|
116
|
+
return File.readlink(file)
|
117
|
+
else
|
118
|
+
return File.expand_path(File.join(File.dirname(file), File.readlink(file)))
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def submodule_for(file)
|
123
|
+
repo.submodules.each do |submodule|
|
124
|
+
if file.start_with?(File.join(repo.workdir, submodule.path))
|
125
|
+
return submodule
|
126
|
+
end
|
127
|
+
end
|
128
|
+
false
|
129
|
+
end
|
130
|
+
|
131
|
+
def symlink_templates
|
132
|
+
templates = []
|
133
|
+
if FileTest.exists?(templates_dir)
|
134
|
+
Find.find(templates_dir) do |file|
|
135
|
+
if FileTest.symlink?(file)
|
136
|
+
templates.push(symlink_target(file))
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
templates
|
141
|
+
end
|
88
142
|
end
|
89
143
|
end
|
Binary file
|
Binary file
|
Binary file
|
@@ -6,7 +6,8 @@ describe Bosh::Cli::Command::Prepare do
|
|
6
6
|
let(:release) do
|
7
7
|
instance_double("Bosh::Workspace::Release",
|
8
8
|
name: "foo", version: "1", repo_dir: ".releases/foo", git_url: "/.git",
|
9
|
-
|
9
|
+
release_dir: '.releases/foo/sub', name_version: "foo/1",
|
10
|
+
manifest_file: "releases/foo-1.yml")
|
10
11
|
end
|
11
12
|
let(:stemcell) do
|
12
13
|
instance_double("Bosh::Workspace::Stemcell",
|
@@ -25,12 +26,16 @@ describe Bosh::Cli::Command::Prepare do
|
|
25
26
|
|
26
27
|
describe "prepare_release(s/_repos)" do
|
27
28
|
let(:releases) { [release] }
|
29
|
+
let(:subrepos) { [] }
|
28
30
|
let(:stemcells) { [] }
|
29
31
|
let(:ref) { nil }
|
30
32
|
|
31
|
-
context "
|
33
|
+
context "release with git " do
|
32
34
|
before do
|
35
|
+
allow(release).to receive(:required_submodules).and_return(subrepos)
|
36
|
+
|
33
37
|
expect(release).to receive(:update_repo)
|
38
|
+
expect(release).to_not receive(:update_submodule)
|
34
39
|
expect(release).to receive(:ref).and_return(ref)
|
35
40
|
expect(command).to receive(:release_uploaded?)
|
36
41
|
.with(release.name, release.version).and_return(release_uploaded)
|
@@ -54,7 +59,7 @@ describe Bosh::Cli::Command::Prepare do
|
|
54
59
|
it "does upload the release" do
|
55
60
|
expect(release).to receive(:ref).and_return(ref)
|
56
61
|
expect(command).to receive(:release_upload)
|
57
|
-
.with(release.manifest_file, release.
|
62
|
+
.with(release.manifest_file, release.release_dir)
|
58
63
|
command.prepare
|
59
64
|
end
|
60
65
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Bosh::Workspace
|
2
|
-
describe
|
3
|
-
class
|
4
|
-
include Bosh::Workspace::
|
2
|
+
describe GitCredentialsHelper do
|
3
|
+
class GitCredentialsHelperTester
|
4
|
+
include Bosh::Workspace::GitCredentialsHelper
|
5
5
|
|
6
6
|
attr_reader :work_dir
|
7
7
|
|
@@ -20,7 +20,7 @@ module Bosh::Workspace
|
|
20
20
|
|
21
21
|
before do
|
22
22
|
allow(Rugged::Repository).to receive(:new).with(dir).and_return(repo)
|
23
|
-
allow(File).to receive(:exist?).with(dir).and_return(dir_exist)
|
23
|
+
allow(File).to receive(:exist?).with(File.join(dir, '.git')).and_return(dir_exist)
|
24
24
|
allow(repo).to receive_message_chain("remotes.[]").and_return(remote)
|
25
25
|
allow(repo).to receive_message_chain("remotes.create_anonymous")
|
26
26
|
.with(url).and_return(remote)
|
@@ -42,7 +42,7 @@ module Bosh::Workspace
|
|
42
42
|
|
43
43
|
describe "fetch_repo" do
|
44
44
|
subject do
|
45
|
-
|
45
|
+
GitCredentialsHelperTester.new(work_dir).fetch_repo(dir)
|
46
46
|
end
|
47
47
|
|
48
48
|
context "with existing repo" do
|
@@ -55,7 +55,7 @@ module Bosh::Workspace
|
|
55
55
|
|
56
56
|
describe "fetch_or_clone_repo" do
|
57
57
|
subject do
|
58
|
-
|
58
|
+
GitCredentialsHelperTester.new(work_dir).fetch_or_clone_repo(dir, url)
|
59
59
|
end
|
60
60
|
|
61
61
|
context "with existing repo" do
|
data/spec/release_spec.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
describe Bosh::Workspace::Release do
|
2
|
-
include Bosh::Workspace::
|
2
|
+
include Bosh::Workspace::GitCredentialsHelper
|
3
3
|
let(:name) { "foo" }
|
4
4
|
let(:release) { load_release(release_data) }
|
5
5
|
let(:version) { "3" }
|
@@ -48,6 +48,7 @@ describe Bosh::Workspace::Release do
|
|
48
48
|
its(:name) { should eq name }
|
49
49
|
its(:git_url) { should eq repo }
|
50
50
|
its(:repo_dir) { should match(/\/#{name}$/) }
|
51
|
+
its(:release_dir) { should match(/\/#{name}$/) }
|
51
52
|
its(:manifest) { should match "releases/#{name}/#{name}-#{version}.yml$" }
|
52
53
|
its(:name_version) { should eq "#{name}/#{version}" }
|
53
54
|
its(:version) { should eq version }
|
@@ -57,6 +58,88 @@ describe Bosh::Workspace::Release do
|
|
57
58
|
end
|
58
59
|
end
|
59
60
|
|
61
|
+
context "given a release with submodule templates" do
|
62
|
+
let(:repo) { extracted_asset_dir("supermodule", "supermodule-boshrelease-repo.zip") }
|
63
|
+
let(:subrepo) { extracted_asset_dir("submodule-boshrelease", "submodule-boshrelease-repo.zip") }
|
64
|
+
let(:name) { "supermodule" }
|
65
|
+
|
66
|
+
describe "#update_repo" do
|
67
|
+
subject { Rugged::Repository.new(File.join(releases_dir, name)) }
|
68
|
+
context "with templates in submodules" do
|
69
|
+
before do
|
70
|
+
system("rm -rf #{releases_dir}")
|
71
|
+
allow_any_instance_of(Rugged::Submodule).to receive(:url).and_return(subrepo)
|
72
|
+
|
73
|
+
release = load_release("name" => name, "version" => 1, "git" => repo)
|
74
|
+
release.update_repo
|
75
|
+
release.required_submodules.each do |submodule|
|
76
|
+
fetch_or_clone_repo(File.join(release.repo_dir, submodule.path), submodule.url)
|
77
|
+
release.update_submodule(submodule)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
it "clones + checks out required submodules" do
|
82
|
+
expect(subject.submodules["src/submodule"].workdir_oid)
|
83
|
+
.to eq "2244c436777f7c305fb81a8a6e29079c92a2ab9d"
|
84
|
+
end
|
85
|
+
it "doesn't clone/checkout extraneous submodules" do
|
86
|
+
expect(subject.submodules["src/other"].workdir_oid).to eq nil
|
87
|
+
end
|
88
|
+
end
|
89
|
+
context "with templates in submodules" do
|
90
|
+
before do
|
91
|
+
system("rm -rf #{releases_dir}")
|
92
|
+
allow_any_instance_of(Rugged::Submodule).to receive(:url).and_return(subrepo)
|
93
|
+
|
94
|
+
release = load_release("name" => name, "version" => 2, "git" => repo)
|
95
|
+
release.update_repo
|
96
|
+
release.required_submodules.each do |submodule|
|
97
|
+
fetch_or_clone_repo(File.join(release.repo_dir, submodule.path), submodule.url)
|
98
|
+
release.update_submodule(submodule)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
it "clones + checks out required submodules" do
|
103
|
+
expect(subject.submodules["src/submodule"].workdir_oid)
|
104
|
+
.to eq "95eed8c967af969d659a766b0551a75a729a7b65"
|
105
|
+
end
|
106
|
+
it "doesn't clone/checkout extraneous submodules" do
|
107
|
+
expect(subject.submodules["src/other"].workdir_oid).to eq nil
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context "from v1 to v2" do
|
112
|
+
before do
|
113
|
+
system("rm -rf #{releases_dir}")
|
114
|
+
allow_any_instance_of(Rugged::Submodule).to receive(:url).and_return(subrepo)
|
115
|
+
end
|
116
|
+
|
117
|
+
it "updates the submodules appropriately" do
|
118
|
+
release = load_release("name" => name, "version" => 1, "git" => repo)
|
119
|
+
release.update_repo
|
120
|
+
release.required_submodules.each do |submodule|
|
121
|
+
fetch_or_clone_repo(File.join(release.repo_dir, submodule.path), submodule.url)
|
122
|
+
release.update_submodule(submodule)
|
123
|
+
end
|
124
|
+
expect(subject.submodules["src/submodule"].workdir_oid)
|
125
|
+
.to eq "2244c436777f7c305fb81a8a6e29079c92a2ab9d"
|
126
|
+
expect(subject.submodules["src/other"].workdir_oid).to eq nil
|
127
|
+
|
128
|
+
# Now move to v2 on existing repo
|
129
|
+
release = load_release("name" => name, "version" => 2, "git" => repo)
|
130
|
+
release.update_repo
|
131
|
+
release.required_submodules.each do |submodule|
|
132
|
+
fetch_or_clone_repo(File.join(release.repo_dir, submodule.path), submodule.url)
|
133
|
+
release.update_submodule(submodule)
|
134
|
+
end
|
135
|
+
expect(subject.submodules["src/submodule"].workdir_oid)
|
136
|
+
.to eq "95eed8c967af969d659a766b0551a75a729a7b65"
|
137
|
+
expect(subject.submodules["src/other"].workdir_oid).to eq nil
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
60
143
|
context "given a release with deprecated structure within 'releases' folder" do
|
61
144
|
let(:repo) { extracted_asset_dir("foo", "foo-boshrelease-repo.zip") }
|
62
145
|
|
@@ -69,7 +152,7 @@ describe Bosh::Workspace::Release do
|
|
69
152
|
let(:version) { "latest" }
|
70
153
|
|
71
154
|
it "checks out repo" do
|
72
|
-
expect(subject).to match(/foo-
|
155
|
+
expect(subject).to match(/foo-12.yml/)
|
73
156
|
end
|
74
157
|
|
75
158
|
it "does not include templates from master" do
|
@@ -78,7 +161,7 @@ describe Bosh::Workspace::Release do
|
|
78
161
|
end
|
79
162
|
|
80
163
|
context "specific version" do
|
81
|
-
let(:version) { "
|
164
|
+
let(:version) { "12" }
|
82
165
|
before { release.update_repo }
|
83
166
|
|
84
167
|
it "checks out repo" do
|
@@ -121,7 +204,7 @@ describe Bosh::Workspace::Release do
|
|
121
204
|
end
|
122
205
|
|
123
206
|
context "non existing version " do
|
124
|
-
let(:version) { "
|
207
|
+
let(:version) { "13" }
|
125
208
|
|
126
209
|
it "raises an error" do
|
127
210
|
expect { release.update_repo }.
|
@@ -198,7 +281,7 @@ describe Bosh::Workspace::Release do
|
|
198
281
|
end
|
199
282
|
|
200
283
|
context "non existing version " do
|
201
|
-
let(:version) { "
|
284
|
+
let(:version) { "13" }
|
202
285
|
|
203
286
|
it "raises an error" do
|
204
287
|
expect { release.version }.
|
@@ -251,6 +334,7 @@ describe Bosh::Workspace::Release do
|
|
251
334
|
its(:name) { should eq name }
|
252
335
|
its(:git_url) { should eq repo }
|
253
336
|
its(:repo_dir) { should match(/\/#{name}$/) }
|
337
|
+
its(:release_dir) { should match(/\/#{name}$/) }
|
254
338
|
its(:manifest_file) { should match(/\/#{name}-#{version}.yml$/) }
|
255
339
|
its(:manifest) { should match "releases/#{name}-#{version}.yml$" }
|
256
340
|
its(:name_version) { should eq "#{name}/#{version}" }
|
@@ -286,6 +370,7 @@ describe Bosh::Workspace::Release do
|
|
286
370
|
its(:name) { should eq name }
|
287
371
|
its(:git_url) { should eq repo }
|
288
372
|
its(:repo_dir) { should match(/\/#{name}$/) }
|
373
|
+
its(:release_dir) { should match(/\/#{name}\/release$/) }
|
289
374
|
its(:manifest) { should match "release/releases/#{name}-#{version}.yml$" }
|
290
375
|
its(:name_version) { should eq "#{name}/#{version}" }
|
291
376
|
its(:version) { should eq version }
|
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.0.
|
4
|
+
version: 0.9.0.rc5
|
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-05-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bosh_cli
|
@@ -227,6 +227,8 @@ files:
|
|
227
227
|
- spec/assets/manifests-repo/deployments/bar.yml
|
228
228
|
- spec/assets/manifests-repo/deployments/foo.yml
|
229
229
|
- spec/assets/manifests-repo/templates/foo/bar.yml
|
230
|
+
- spec/assets/submodule-boshrelease-repo.zip
|
231
|
+
- spec/assets/supermodule-boshrelease-repo.zip
|
230
232
|
- spec/commands/deployment_patch_spec.rb
|
231
233
|
- spec/commands/prepare_spec.rb
|
232
234
|
- spec/commands/project_deployment_spec.rb
|
@@ -275,7 +277,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
275
277
|
version: 1.3.1
|
276
278
|
requirements: []
|
277
279
|
rubyforge_project:
|
278
|
-
rubygems_version: 2.
|
280
|
+
rubygems_version: 2.4.6
|
279
281
|
signing_key:
|
280
282
|
specification_version: 4
|
281
283
|
summary: Manage your bosh workspace
|
@@ -296,6 +298,8 @@ test_files:
|
|
296
298
|
- spec/assets/manifests-repo/deployments/bar.yml
|
297
299
|
- spec/assets/manifests-repo/deployments/foo.yml
|
298
300
|
- spec/assets/manifests-repo/templates/foo/bar.yml
|
301
|
+
- spec/assets/submodule-boshrelease-repo.zip
|
302
|
+
- spec/assets/supermodule-boshrelease-repo.zip
|
299
303
|
- spec/commands/deployment_patch_spec.rb
|
300
304
|
- spec/commands/prepare_spec.rb
|
301
305
|
- spec/commands/project_deployment_spec.rb
|