bosh-workspace 0.9.0.rc5 → 0.9.0.rc6
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Build Status](https://img.shields.io/travis/cloudfoundry-incubator/bosh-workspace/master.svg?style=flat-square)](https://travis-ci.org/cloudfoundry-incubator/bosh-workspace) [![Test Coverage](https://img.shields.io/codeclimate/coverage/github/rkoster/bosh-workspace.svg?style=flat-square)](https://codeclimate.com/github/rkoster/bosh-workspace) [![Code Climate](https://img.shields.io/codeclimate/github/rkoster/bosh-workspace.svg?style=flat-square)](https://codeclimate.com/github/rkoster/bosh-workspace) [![Dependency Status](https://img.shields.io/gemnasium/cloudfoundry-incubator/bosh-workspace.svg?style=flat-square)](https://gemnasium.com/cloudfoundry-incubator/bosh-workspace) [![Stories in Ready](https://img.shields.io/badge/tracker-waffle.io-blue.svg?style=flat-square)](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
|