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 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