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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7a974316196c63756eb13d118715adee4cb23a54
4
- data.tar.gz: f683bafb845d0d1f6fe837f0c99d3d9508c9d445
3
+ metadata.gz: 3c7b969ed0420ed359c4b818cc406ba9da51da12
4
+ data.tar.gz: e18975e40f8822effa0e4a38116779dd38831d3a
5
5
  SHA512:
6
- metadata.gz: 94646d03fe1942ca890a41f1e43487d6f7fedcecb6fb16605f48d6fd34abbc78d3771bf6d5cc9750066ca5a4cbd6804d25d9bb736a7b7e4d111a47c7a2168df9
7
- data.tar.gz: d88d409fdc34da7cc2b8bcf3112f89fd9e0a7871512e33a7f6f8f85f512b678a263dcd51051032bc2bdac9c437b835483d54fae58d3c703c942bc5ab8eeb2c6d
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::GitCredenialsHelper
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 GitCredenialsHelper
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.repo_dir)
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 GitCredenialsHelper
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: require_credetials_for(url) }
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 require_credetials_for(url)
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
- dir = File.join(repo_dir, "releases", @name)
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
@@ -1,5 +1,5 @@
1
1
  module Bosh
2
2
  module Manifests
3
- VERSION = "0.9.0.rc4"
3
+ VERSION = "0.9.0.rc5"
4
4
  end
5
5
  end
@@ -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
- name_version: "foo/1", manifest_file: "releases/foo-1.yml")
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 "releasewith git " do
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.repo_dir)
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 GitCredenialsHelper do
3
- class GitCredenialsHelperTester
4
- include Bosh::Workspace::GitCredenialsHelper
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
- GitCredenialsHelperTester.new(work_dir).fetch_repo(dir)
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
- GitCredenialsHelperTester.new(work_dir).fetch_or_clone_repo(dir, url)
58
+ GitCredentialsHelperTester.new(work_dir).fetch_or_clone_repo(dir, url)
59
59
  end
60
60
 
61
61
  context "with existing repo" do
@@ -1,5 +1,5 @@
1
1
  describe Bosh::Workspace::Release do
2
- include Bosh::Workspace::GitCredenialsHelper
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-11.yml/)
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) { "11" }
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) { "12" }
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) { "12" }
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.rc4
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-04-09 00:00:00.000000000 Z
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.2.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