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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3c7b969ed0420ed359c4b818cc406ba9da51da12
4
- data.tar.gz: e18975e40f8822effa0e4a38116779dd38831d3a
3
+ metadata.gz: 3fbe620ebe35229e628a0723a0f2f920a1a73a98
4
+ data.tar.gz: 3cb1479d27acd91b94ca5c06677de889c70d03ef
5
5
  SHA512:
6
- metadata.gz: 3a962465f8afd6ec0d9165db2e6b2907208709b014ddd21051e82f62c3084ec0e963b5696ca56d343578521c82aa41873abf08daaf8af621174111178ae7faca
7
- data.tar.gz: d0564bb1504d5492a362a1cf548aa746afa80db5d4ee2080edef5d8db47bb84b5299a3749e3520e8868f3334b58120c8c21b0858e8d638b61ce131cbde505cad
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(manifest_file, release_dir)
10
+ def release_upload(manifest_file_or_release_url, release_dir)
11
11
  Dir.chdir(release_dir) do
12
- release_cmd.upload(manifest_file)
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 = release["name"]
7
- @ref = release["ref"]
8
- @path = release["path"]
6
+ @name = release["name"]
7
+ @ref = release["ref"]
8
+ @path = release["path"]
9
9
  @spec_version = release["version"].to_s
10
- @git_url = release["git"]
11
- @repo_dir = File.join(releases_dir, @name)
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
- repo.checkout ref || release[:commit], strategy: :force
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.checkout submodule.head_oid, strategy: :force
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)
@@ -6,6 +6,7 @@ module Bosh::Workspace
6
6
  [{
7
7
  "name" => String,
8
8
  "version" => ReleaseVersion.new,
9
+ optional("url") => String,
9
10
  optional("path") => enum(String),
10
11
  optional("ref") => enum(String),
11
12
  optional("git") => String,
@@ -1,5 +1,5 @@
1
1
  module Bosh
2
2
  module Manifests
3
- VERSION = "0.9.0.rc5"
3
+ VERSION = "0.9.0.rc6"
4
4
  end
5
5
  end
@@ -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
@@ -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 "given a release with new structure within 'releases' folder" do
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
- system("rm -rf #{releases_dir}")
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
- system("rm -rf #{releases_dir}")
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
- system("rm -rf #{releases_dir}")
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.rc5
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-26 00:00:00.000000000 Z
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