bosh-workspace 0.9.0.rc4 → 0.9.0.rc5
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.
- 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
|