bosh-workspace 0.9.0.rc5 → 0.9.0.rc6
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/README.md +0 -1
- data/lib/bosh/cli/commands/prepare.rb +3 -0
- data/lib/bosh/workspace/helpers/git_credentials_helper.rb +1 -0
- data/lib/bosh/workspace/helpers/release_helper.rb +2 -2
- data/lib/bosh/workspace/release.rb +18 -7
- data/lib/bosh/workspace/schemas/releases.rb +1 -0
- data/lib/bosh/workspace/version.rb +1 -1
- data/spec/assets/symlinkreplacement-boshrelease-repo.zip +0 -0
- data/spec/commands/prepare_spec.rb +1 -1
- data/spec/helpers/git_credentials_helper_spec.rb +5 -0
- data/spec/release_spec.rb +79 -6
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3fbe620ebe35229e628a0723a0f2f920a1a73a98
|
4
|
+
data.tar.gz: 3cb1479d27acd91b94ca5c06677de889c70d03ef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: edbf6bae79436cf92a0c82569d5dc04d86370d1269d539e349f37d869fdc21814c3d25f707da2049f7816dcce2340c8536bb8691f4a8b6d40f14caaf1ba55c93
|
7
|
+
data.tar.gz: c20a99dff6248d798a6b0c0dbbe98cd53909f7354dc859ec40add67d02bf7a00579efcfea5191e168a1750e617e11a9a943abdcfc209ffda00dc8b978c690b2b
|
data/README.md
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# Bosh workspace
|
2
2
|
[](https://travis-ci.org/cloudfoundry-incubator/bosh-workspace) [](https://codeclimate.com/github/rkoster/bosh-workspace) [](https://codeclimate.com/github/rkoster/bosh-workspace) [](https://gemnasium.com/cloudfoundry-incubator/bosh-workspace) [](https://waffle.io/cloudfoundry-incubator/bosh-workspace)
|
3
3
|
|
4
|
-
|
5
4
|
This is a `bosh` cli plugin for creating reproducible and upgradable deployments.
|
6
5
|
|
7
6
|
## Getting started
|
@@ -56,6 +56,9 @@ module Bosh::Cli::Command
|
|
56
56
|
if release_uploaded?(release.name, release.version)
|
57
57
|
say "Release '#{release.name_version.make_green}' exists"
|
58
58
|
say "Skipping upload"
|
59
|
+
elsif release.url
|
60
|
+
say "Uploading '#{release.url}'"
|
61
|
+
release_remote(release.url, release.release_dir)
|
59
62
|
else
|
60
63
|
say "Uploading '#{release.name_version.make_green}'"
|
61
64
|
release_upload(release.manifest_file, release.release_dir)
|
@@ -17,6 +17,7 @@ module Bosh::Workspace
|
|
17
17
|
url = repo.remotes['origin'].url
|
18
18
|
repo.fetch('origin', REFSPEC, connection_options_for(repo, url))
|
19
19
|
commit = repo.references['refs/remotes/origin/HEAD'].resolve.target_id
|
20
|
+
repo.checkout_tree commit, strategy: :force
|
20
21
|
repo.checkout commit, strategy: :force
|
21
22
|
end
|
22
23
|
|
@@ -7,9 +7,9 @@ module Bosh::Workspace
|
|
7
7
|
remote_release && remote_release["versions"].include?(version.to_s)
|
8
8
|
end
|
9
9
|
|
10
|
-
def release_upload(
|
10
|
+
def release_upload(manifest_file_or_release_url, release_dir)
|
11
11
|
Dir.chdir(release_dir) do
|
12
|
-
release_cmd.upload(
|
12
|
+
release_cmd.upload(manifest_file_or_release_url)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
@@ -3,20 +3,22 @@ module Bosh::Workspace
|
|
3
3
|
attr_reader :name, :git_url, :repo_dir
|
4
4
|
|
5
5
|
def initialize(release, releases_dir)
|
6
|
-
@name
|
7
|
-
@ref
|
8
|
-
@path
|
6
|
+
@name = release["name"]
|
7
|
+
@ref = release["ref"]
|
8
|
+
@path = release["path"]
|
9
9
|
@spec_version = release["version"].to_s
|
10
|
-
@git_url
|
11
|
-
@repo_dir
|
10
|
+
@git_url = release["git"]
|
11
|
+
@repo_dir = File.join(releases_dir, @name)
|
12
|
+
@url = release["url"]
|
12
13
|
end
|
13
14
|
|
14
15
|
def update_repo
|
15
|
-
|
16
|
+
hash = ref || release[:commit]
|
17
|
+
update_repo_with_ref(repo, hash)
|
16
18
|
end
|
17
19
|
|
18
20
|
def update_submodule(submodule)
|
19
|
-
submodule.repository
|
21
|
+
update_repo_with_ref(submodule.repository, submodule.head_oid)
|
20
22
|
end
|
21
23
|
|
22
24
|
def required_submodules
|
@@ -54,12 +56,21 @@ module Bosh::Workspace
|
|
54
56
|
@path ? File.join(@repo_dir, @path) : @repo_dir
|
55
57
|
end
|
56
58
|
|
59
|
+
def url
|
60
|
+
@url && @url.gsub("^VERSION^", version)
|
61
|
+
end
|
62
|
+
|
57
63
|
private
|
58
64
|
|
59
65
|
def repo
|
60
66
|
@repo ||= Rugged::Repository.new(repo_dir)
|
61
67
|
end
|
62
68
|
|
69
|
+
def update_repo_with_ref(repository, ref)
|
70
|
+
repository.checkout_tree ref, strategy: :force
|
71
|
+
repository.checkout ref, strategy: :force
|
72
|
+
end
|
73
|
+
|
63
74
|
def new_style_repo
|
64
75
|
base = @path ? File.join(@path, 'releases') : 'releases'
|
65
76
|
dir = File.join(repo_dir, base, @name)
|
Binary file
|
@@ -6,7 +6,7 @@ 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
|
-
release_dir: '.releases/foo/sub', name_version: "foo/1",
|
9
|
+
release_dir: '.releases/foo/sub', name_version: "foo/1", url: nil,
|
10
10
|
manifest_file: "releases/foo-1.yml")
|
11
11
|
end
|
12
12
|
let(:stemcell) do
|
@@ -28,6 +28,7 @@ module Bosh::Workspace
|
|
28
28
|
.and_return(:commit_id)
|
29
29
|
allow(remote).to receive(:check_connection).with(:fetch, Hash)
|
30
30
|
.and_return(!auth_required, credentials_auth_valid)
|
31
|
+
allow(repo).to receive(:checkout_tree).with(:commit_id, strategy: :force)
|
31
32
|
allow(repo).to receive(:checkout).with(:commit_id, strategy: :force)
|
32
33
|
allow(GitRemoteUrl).to receive(:new).and_return(git_url)
|
33
34
|
end
|
@@ -48,6 +49,8 @@ module Bosh::Workspace
|
|
48
49
|
context "with existing repo" do
|
49
50
|
it do
|
50
51
|
expect_no_credentials
|
52
|
+
expect(repo).to receive("checkout_tree")
|
53
|
+
expect(repo).to receive("checkout")
|
51
54
|
subject
|
52
55
|
end
|
53
56
|
end
|
@@ -61,6 +64,8 @@ module Bosh::Workspace
|
|
61
64
|
context "with existing repo" do
|
62
65
|
it do
|
63
66
|
expect_no_credentials
|
67
|
+
expect(repo).to receive("checkout_tree")
|
68
|
+
expect(repo).to receive("checkout")
|
64
69
|
subject
|
65
70
|
end
|
66
71
|
end
|
data/spec/release_spec.rb
CHANGED
@@ -1,8 +1,11 @@
|
|
1
|
+
require "fileutils"
|
2
|
+
|
1
3
|
describe Bosh::Workspace::Release do
|
2
4
|
include Bosh::Workspace::GitCredentialsHelper
|
3
5
|
let(:name) { "foo" }
|
4
6
|
let(:release) { load_release(release_data) }
|
5
7
|
let(:version) { "3" }
|
8
|
+
let(:url) { "http://local.url/release" }
|
6
9
|
let(:release_data) { { "name" => name, "version" => version, "git" => repo } }
|
7
10
|
let(:releases_dir) { File.join(asset_dir("manifests-repo"), ".releases") }
|
8
11
|
let(:templates) { Dir[File.join(releases_dir, name, "templates/*.yml")].to_s }
|
@@ -13,7 +16,7 @@ describe Bosh::Workspace::Release do
|
|
13
16
|
end
|
14
17
|
end
|
15
18
|
|
16
|
-
context "
|
19
|
+
context "with new structure within 'releases' folder" do
|
17
20
|
let(:repo) { extracted_asset_dir("foo", "foo-boshrelease-repo-new-structure.zip") }
|
18
21
|
|
19
22
|
describe "#update_repo" do
|
@@ -43,8 +46,11 @@ describe Bosh::Workspace::Release do
|
|
43
46
|
end
|
44
47
|
|
45
48
|
describe "attributes" do
|
49
|
+
let(:release_data) { { "name" => name, "version" => version, "git" => repo } }
|
46
50
|
let(:version) { "12" }
|
51
|
+
|
47
52
|
subject { release }
|
53
|
+
|
48
54
|
its(:name) { should eq name }
|
49
55
|
its(:git_url) { should eq repo }
|
50
56
|
its(:repo_dir) { should match(/\/#{name}$/) }
|
@@ -55,6 +61,28 @@ describe Bosh::Workspace::Release do
|
|
55
61
|
its(:manifest_file) do
|
56
62
|
should match(/\/releases\/#{name}\/#{name}-#{version}.yml$/)
|
57
63
|
end
|
64
|
+
|
65
|
+
context ", using a local url" do
|
66
|
+
context "with a version placeholder" do
|
67
|
+
let(:url) { "http://local.url/release?^VERSION^" }
|
68
|
+
let(:version) { "12" }
|
69
|
+
let(:release_data) { { "name" => name, "version" => version, "url" => url } }
|
70
|
+
|
71
|
+
it 'replaces the version placeholder with the version number' do
|
72
|
+
expect(release.url).to eq "http://local.url/release?12"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context 'with no version placeholder' do
|
77
|
+
let(:url) { "http://local.url/release" }
|
78
|
+
let(:version) { "12" }
|
79
|
+
let(:release_data) {{ "name" => name, "version" => version, "url" => url }}
|
80
|
+
|
81
|
+
it 'returns the same url' do
|
82
|
+
expect(release.url).to eq "http://local.url/release"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
58
86
|
end
|
59
87
|
end
|
60
88
|
|
@@ -67,10 +95,10 @@ describe Bosh::Workspace::Release do
|
|
67
95
|
subject { Rugged::Repository.new(File.join(releases_dir, name)) }
|
68
96
|
context "with templates in submodules" do
|
69
97
|
before do
|
70
|
-
|
98
|
+
FileUtils.rm_rf(releases_dir)
|
71
99
|
allow_any_instance_of(Rugged::Submodule).to receive(:url).and_return(subrepo)
|
72
100
|
|
73
|
-
release = load_release("name" => name, "version" => 1, "git" => repo)
|
101
|
+
release = load_release( "name" => name, "version" => 1, "git" => repo)
|
74
102
|
release.update_repo
|
75
103
|
release.required_submodules.each do |submodule|
|
76
104
|
fetch_or_clone_repo(File.join(release.repo_dir, submodule.path), submodule.url)
|
@@ -88,10 +116,10 @@ describe Bosh::Workspace::Release do
|
|
88
116
|
end
|
89
117
|
context "with templates in submodules" do
|
90
118
|
before do
|
91
|
-
|
119
|
+
FileUtils.rm_rf(releases_dir)
|
92
120
|
allow_any_instance_of(Rugged::Submodule).to receive(:url).and_return(subrepo)
|
93
121
|
|
94
|
-
release = load_release("name" => name, "version" => 2, "git" => repo)
|
122
|
+
release = load_release( "name" => name, "version" => 2, "git" => repo)
|
95
123
|
release.update_repo
|
96
124
|
release.required_submodules.each do |submodule|
|
97
125
|
fetch_or_clone_repo(File.join(release.repo_dir, submodule.path), submodule.url)
|
@@ -110,7 +138,7 @@ describe Bosh::Workspace::Release do
|
|
110
138
|
|
111
139
|
context "from v1 to v2" do
|
112
140
|
before do
|
113
|
-
|
141
|
+
FileUtils.rm_rf(releases_dir)
|
114
142
|
allow_any_instance_of(Rugged::Submodule).to receive(:url).and_return(subrepo)
|
115
143
|
end
|
116
144
|
|
@@ -379,4 +407,49 @@ describe Bosh::Workspace::Release do
|
|
379
407
|
end
|
380
408
|
end
|
381
409
|
end
|
410
|
+
|
411
|
+
context "correct checkout behavior:" do
|
412
|
+
let(:repo) { extracted_asset_dir("foo", "foo-boshrelease-repo.zip") }
|
413
|
+
let(:release_data) { { "name" => name, "version" => version,
|
414
|
+
"git" => repo, "ref" => :fooref } }
|
415
|
+
let(:repo) { 'foo/bar' }
|
416
|
+
let(:repository) do
|
417
|
+
instance_double('Rugged::Repository', lookup: double(oid: :fooref))
|
418
|
+
end
|
419
|
+
|
420
|
+
describe "#update_repo_with_ref" do
|
421
|
+
subject { Bosh::Workspace::Release.new(release_data, releases_dir) }
|
422
|
+
|
423
|
+
before do
|
424
|
+
expect(Rugged::Repository).to receive(:new).and_return(repository)
|
425
|
+
end
|
426
|
+
|
427
|
+
it "calls checkout_tree and checkout" do
|
428
|
+
expect(repository).to receive("checkout_tree").at_least(:once)
|
429
|
+
expect(repository).to receive("checkout").at_least(:once)
|
430
|
+
subject.update_repo
|
431
|
+
end
|
432
|
+
end
|
433
|
+
end
|
434
|
+
|
435
|
+
context "given a release which moved a directory to a symlink across versions" do
|
436
|
+
let(:repo) { extracted_asset_dir("symlinkreplacement", "symlinkreplacement-boshrelease-repo.zip") }
|
437
|
+
let(:name) { "symlinkreplacement" }
|
438
|
+
|
439
|
+
describe "#update_repo" do
|
440
|
+
subject { Rugged::Repository.new(File.join(releases_dir, name)) }
|
441
|
+
context "using a previous version should work" do
|
442
|
+
before do
|
443
|
+
FileUtils.rm_rf(releases_dir)
|
444
|
+
|
445
|
+
release = load_release("name" => name, "version" => "1", "git" => repo)
|
446
|
+
release.update_repo
|
447
|
+
end
|
448
|
+
it "git state is happy" do
|
449
|
+
expect(subject.head.target.oid).to eq "d96521d1940934b1941e0f4a462d3a5e9f31c75d"
|
450
|
+
expect(subject.diff_workdir(subject.head.target.oid).size).to eq 0
|
451
|
+
end
|
452
|
+
end
|
453
|
+
end
|
454
|
+
end
|
382
455
|
end
|
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.rc6
|
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-05-
|
11
|
+
date: 2015-05-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bosh_cli
|
@@ -229,6 +229,7 @@ files:
|
|
229
229
|
- spec/assets/manifests-repo/templates/foo/bar.yml
|
230
230
|
- spec/assets/submodule-boshrelease-repo.zip
|
231
231
|
- spec/assets/supermodule-boshrelease-repo.zip
|
232
|
+
- spec/assets/symlinkreplacement-boshrelease-repo.zip
|
232
233
|
- spec/commands/deployment_patch_spec.rb
|
233
234
|
- spec/commands/prepare_spec.rb
|
234
235
|
- spec/commands/project_deployment_spec.rb
|
@@ -300,6 +301,7 @@ test_files:
|
|
300
301
|
- spec/assets/manifests-repo/templates/foo/bar.yml
|
301
302
|
- spec/assets/submodule-boshrelease-repo.zip
|
302
303
|
- spec/assets/supermodule-boshrelease-repo.zip
|
304
|
+
- spec/assets/symlinkreplacement-boshrelease-repo.zip
|
303
305
|
- spec/commands/deployment_patch_spec.rb
|
304
306
|
- spec/commands/prepare_spec.rb
|
305
307
|
- spec/commands/project_deployment_spec.rb
|