vagrant-bosh 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9b39c42d2c0ba1faafad24df1d60a9d0f0c5a307
4
+ data.tar.gz: a0e9d0f83323e94d562920c7b36bed3c50e3b44d
5
+ SHA512:
6
+ metadata.gz: e41b4554521cc02ef5e25b4adc3a49fd86569abcaf2ebf52e204c0230573c4138a28465e3ad99bcb41c0315637db2a220b0dcab15cfd4fd4c98ff3c84f5020b0
7
+ data.tar.gz: 896cf5defcceb1c98e6ee9825e07e2946889874884eba1be76b851edbf2359a2b2236a07f7b341bae4bec1ebfdc75d0356c79ca74b7116df80650c87705b1fbd
data/README.md CHANGED
@@ -66,6 +66,8 @@ end
66
66
 
67
67
  - `agent_configuration` (Hash, default: '{ ... }')
68
68
 
69
+ - `create_release_cmd` (String, default: `bosh -n create release --force`)
70
+
69
71
 
70
72
  ### Using BOSH provisioner to build BOSH stemcells
71
73
 
@@ -87,13 +87,13 @@ func (tc ConcreteTemplatesCompiler) Precompile(release bprel.Release) error {
87
87
  }
88
88
  }
89
89
 
90
- err = tc.tplToJobRepo.SaveForJob(release, job)
90
+ releaseJobRec, err := tc.tplToJobRepo.SaveForJob(release, job)
91
91
  if err != nil {
92
92
  return bosherr.WrapError(err, "Saving release job %s", job.Name)
93
93
  }
94
94
 
95
95
  // todo associate to release instead
96
- err = tc.runPkgsRepo.SaveAllForReleaseJob(job, allPkgs)
96
+ err = tc.runPkgsRepo.SaveAll(releaseJobRec, allPkgs)
97
97
  if err != nil {
98
98
  return bosherr.WrapError(err, "Saving release job %s", job.Name)
99
99
  }
@@ -104,12 +104,7 @@ func (tc ConcreteTemplatesCompiler) Precompile(release bprel.Release) error {
104
104
 
105
105
  // Compile populates blobstore with rendered jobs for a given deployment instance.
106
106
  func (tc ConcreteTemplatesCompiler) Compile(job bpdep.Job, instance bpdep.Instance) error {
107
- relJobReaders, err := tc.buildJobReaders(job)
108
- if err != nil {
109
- return err
110
- }
111
-
112
- blobID, fingerprint, err := tc.compileJob(relJobReaders, instance)
107
+ blobID, fingerprint, err := tc.compileJob(job, instance)
113
108
  if err != nil {
114
109
  return err
115
110
  }
@@ -132,18 +127,18 @@ func (tc ConcreteTemplatesCompiler) Compile(job bpdep.Job, instance bpdep.Instan
132
127
  func (tc ConcreteTemplatesCompiler) FindPackages(template bpdep.Template) ([]bprel.Package, error) {
133
128
  var pkgs []bprel.Package
134
129
 
135
- job, found, err := tc.tplToJobRepo.FindByTemplate(template)
130
+ releaseJobRec, found, err := tc.tplToJobRepo.FindByTemplate(template)
136
131
  if err != nil {
137
- return pkgs, bosherr.WrapError(err, "Finding job by template %s", template.Name)
132
+ return pkgs, bosherr.WrapError(err, "Finding release job record by template %s", template.Name)
138
133
  } else if !found {
139
- return pkgs, bosherr.New("Expected to find job by template %s", template.Name)
134
+ return pkgs, bosherr.New("Expected to find release job record by template %s", template.Name)
140
135
  }
141
136
 
142
- pkgs, found, err = tc.runPkgsRepo.FindByReleaseJob(job)
137
+ pkgs, found, err = tc.runPkgsRepo.Find(releaseJobRec)
143
138
  if err != nil {
144
- return pkgs, bosherr.WrapError(err, "Finding packages by job %s", job.Name)
139
+ return pkgs, bosherr.WrapError(err, "Finding packages by release job record %v", releaseJobRec)
145
140
  } else if !found {
146
- return pkgs, bosherr.New("Expected to find packages by job %s", job.Name)
141
+ return pkgs, bosherr.New("Expected to find packages by release job record %v", releaseJobRec)
147
142
  }
148
143
 
149
144
  return pkgs, nil
@@ -167,44 +162,13 @@ func (tc ConcreteTemplatesCompiler) FindRenderedArchive(job bpdep.Job, instance
167
162
  return renderedArchiveRec, nil
168
163
  }
169
164
 
170
- type jobReader struct {
171
- relJob bprel.Job
172
- tarReader *bpreljob.TarReader
173
- }
174
-
175
- func (tc ConcreteTemplatesCompiler) buildJobReaders(job bpdep.Job) ([]jobReader, error) {
176
- var readers []jobReader
177
-
178
- for _, template := range job.Templates {
179
- relJob, found, err := tc.tplToJobRepo.FindByTemplate(template)
180
- if err != nil {
181
- return readers, bosherr.WrapError(err, "Finding dep-template -> rel-job %s", template.Name)
182
- } else if !found {
183
- return readers, bosherr.New("Expected to find dep-template -> rel-job %s", template.Name)
184
- }
185
-
186
- jobRec, found, err := tc.jobsRepo.Find(relJob)
187
- if err != nil {
188
- return readers, bosherr.WrapError(err, "Finding job source blob %s", template.Name)
189
- } else if !found {
190
- return readers, bosherr.New("Expected to find job source blob %s", template.Name)
191
- }
192
-
193
- jobURL := fmt.Sprintf("blobstore:///%s?fingerprint=%s", jobRec.BlobID, jobRec.SHA1)
194
-
195
- reader := jobReader{
196
- relJob: relJob,
197
- tarReader: tc.jobReaderFactory.NewTarReader(jobURL),
198
- }
199
-
200
- readers = append(readers, reader)
165
+ // compileJob produces and saves rendered templates archive to a blobstore.
166
+ func (tc ConcreteTemplatesCompiler) compileJob(job bpdep.Job, instance bpdep.Instance) (string, string, error) {
167
+ jobReaders, err := tc.buildJobReaders(job)
168
+ if err != nil {
169
+ return "", "", bosherr.WrapError(err, "Building job readers")
201
170
  }
202
171
 
203
- return readers, nil
204
- }
205
-
206
- // compileJob produces and saves rendered templates archive to a blobstore.
207
- func (tc ConcreteTemplatesCompiler) compileJob(jobReaders []jobReader, instance bpdep.Instance) (string, string, error) {
208
172
  var relJobs []bpreljob.Job
209
173
 
210
174
  for _, jobReader := range jobReaders {
@@ -215,7 +179,7 @@ func (tc ConcreteTemplatesCompiler) compileJob(jobReaders []jobReader, instance
215
179
 
216
180
  defer jobReader.tarReader.Close()
217
181
 
218
- err = tc.associatePackages(jobReader.relJob, relJob)
182
+ err = tc.associatePackages(jobReader.rec, relJob)
219
183
  if err != nil {
220
184
  return "", "", bosherr.WrapError(err, "Preparing runtime dep packages")
221
185
  }
@@ -238,36 +202,83 @@ func (tc ConcreteTemplatesCompiler) compileJob(jobReaders []jobReader, instance
238
202
  return blobID, fingerprint, nil
239
203
  }
240
204
 
241
- func (tc ConcreteTemplatesCompiler) associatePackages(rJob bprel.Job, relJob bpreljob.Job) error {
242
- _, found, err := tc.runPkgsRepo.FindByReleaseJob(rJob)
243
- if err != nil {
244
- return bosherr.WrapError(err, "Finding runtime deps for %s", rJob.Name)
245
- }
205
+ type jobReader struct {
206
+ rec bpjobsrepo.ReleaseJobRecord
207
+ tarReader *bpreljob.TarReader
208
+ }
246
209
 
247
- if !found {
248
- allPkgs, found, err := tc.runPkgsRepo.FindAllByReleaseJob(rJob)
210
+ func (tc ConcreteTemplatesCompiler) buildJobReaders(job bpdep.Job) ([]jobReader, error) {
211
+ var readers []jobReader
212
+
213
+ for _, template := range job.Templates {
214
+ rec, found, err := tc.tplToJobRepo.FindByTemplate(template)
249
215
  if err != nil {
250
- return bosherr.WrapError(err, "Finding rel-job -> rel-pkgs %s", rJob.Name)
216
+ return readers, bosherr.WrapError(err, "Finding dep-template -> release-job record %s", template.Name)
251
217
  } else if !found {
252
- return bosherr.New("Expected to find rel-job -> rel-pkgs %s", rJob.Name)
218
+ return readers, bosherr.New("Expected to find dep-template -> release-job record %s", template.Name)
253
219
  }
254
220
 
255
- var pkgs []bprel.Package
221
+ jobRec, found, err := tc.jobsRepo.FindByReleaseJob(rec)
222
+ if err != nil {
223
+ return readers, bosherr.WrapError(err, "Finding job source blob %s", template.Name)
224
+ } else if !found {
225
+ return readers, bosherr.New("Expected to find job source blob %s -- %s", template.Name, rec)
226
+ }
256
227
 
257
- for _, pkg := range allPkgs {
258
- for _, p := range relJob.Packages {
259
- if pkg.Name == p.Name {
260
- pkgs = append(pkgs, pkg)
261
- break
262
- }
263
- }
228
+ jobURL := fmt.Sprintf("blobstore:///%s?fingerprint=%s", jobRec.BlobID, jobRec.SHA1)
229
+
230
+ reader := jobReader{
231
+ rec: rec,
232
+ tarReader: tc.jobReaderFactory.NewTarReader(jobURL),
264
233
  }
265
234
 
266
- err = tc.runPkgsRepo.SaveForReleaseJob(rJob, pkgs)
267
- if err != nil {
268
- return bosherr.WrapError(err, "Saving job packages %s", rJob.Name)
235
+ readers = append(readers, reader)
236
+ }
237
+
238
+ return readers, nil
239
+ }
240
+
241
+ func (tc ConcreteTemplatesCompiler) associatePackages(rec bpjobsrepo.ReleaseJobRecord, relJob bpreljob.Job) error {
242
+ _, found, err := tc.runPkgsRepo.Find(rec)
243
+ if err != nil {
244
+ return bosherr.WrapError(err, "Finding runtime deps for %s", rec)
245
+ }
246
+
247
+ if found {
248
+ return nil
249
+ }
250
+
251
+ // Find all packages in the same release,
252
+ // regardless if job previously was associated with packages
253
+ allPkgs, found, err := tc.runPkgsRepo.FindAll(rec)
254
+ if err != nil {
255
+ return bosherr.WrapError(err, "Finding rel-job -> rel-pkgs %s", rec)
256
+ } else if !found {
257
+ return bosherr.New("Expected to find rel-job -> rel-pkgs %s", rec)
258
+ }
259
+
260
+ var pkgs []bprel.Package
261
+
262
+ // From all packages, select packages that are used by the job
263
+ for _, pkg := range allPkgs {
264
+ for _, p := range relJob.Packages {
265
+ if pkg.Name == p.Name {
266
+ pkgs = append(pkgs, pkg)
267
+ break
268
+ }
269
269
  }
270
270
  }
271
271
 
272
+ // Return error if at least one depedency is missing
273
+ if len(pkgs) != len(relJob.Packages) {
274
+ return bosherr.New("Expected to find all release packages")
275
+ }
276
+
277
+ // Associate those packages with a job
278
+ err = tc.runPkgsRepo.Save(rec, pkgs)
279
+ if err != nil {
280
+ return bosherr.WrapError(err, "Saving job packages %s", rec)
281
+ }
282
+
272
283
  return nil
273
284
  }
@@ -17,7 +17,8 @@ type jobToJobKey struct {
17
17
  JobName string
18
18
  JobVersion string
19
19
 
20
- // Fingerprint of a package captures its dependenices
20
+ // Fingerprint of a job captures its dependenices; however,
21
+ // that does not capture package changes in an associated release.
21
22
  JobFingerprint string
22
23
  }
23
24
 
@@ -34,28 +35,49 @@ func NewConcreteJobsRepository(
34
35
  func (r CJRepository) Find(job bprel.Job) (JobRecord, bool, error) {
35
36
  var record JobRecord
36
37
 
37
- err := r.index.Find(r.jobKey(job), &record)
38
+ err := r.index.Find(r.key(job), &record)
38
39
  if err != nil {
39
40
  if err == bpindex.ErrNotFound {
40
41
  return record, false, nil
41
42
  }
42
43
 
43
- return record, false, bosherr.WrapError(err, "Finding package record")
44
+ return record, false, bosherr.WrapError(err, "Finding job record")
45
+ }
46
+
47
+ return record, true, nil
48
+ }
49
+
50
+ func (r CJRepository) FindByReleaseJob(rec ReleaseJobRecord) (JobRecord, bool, error) {
51
+ var record JobRecord
52
+
53
+ key := jobToJobKey{
54
+ JobName: rec.JobName,
55
+ JobVersion: rec.JobVersion,
56
+ JobFingerprint: rec.JobFingerprint,
57
+ }
58
+
59
+ err := r.index.Find(key, &record)
60
+ if err != nil {
61
+ if err == bpindex.ErrNotFound {
62
+ return record, false, nil
63
+ }
64
+
65
+ return record, false, bosherr.WrapError(err, "Finding job record")
44
66
  }
45
67
 
46
68
  return record, true, nil
47
69
  }
48
70
 
49
71
  func (r CJRepository) Save(job bprel.Job, record JobRecord) error {
50
- err := r.index.Save(r.jobKey(job), record)
72
+ err := r.index.Save(r.key(job), record)
51
73
  if err != nil {
52
- return bosherr.WrapError(err, "Saving package record")
74
+ return bosherr.WrapError(err, "Saving job record")
53
75
  }
54
76
 
55
77
  return nil
56
78
  }
57
79
 
58
- func (r CJRepository) jobKey(job bprel.Job) jobToJobKey {
80
+ func (r CJRepository) key(job bprel.Job) jobToJobKey {
59
81
  return jobToJobKey{
60
82
  JobName: job.Name,
61
83
  JobVersion: job.Version,
@@ -24,6 +24,9 @@ func NewConcreteRuntimePackagesRepository(
24
24
  }
25
25
 
26
26
  type jobToPkgsKey struct {
27
+ ReleaseName string
28
+ ReleaseVersion string
29
+
27
30
  // Mostly for ease of debugging
28
31
  JobName string
29
32
  JobVersion string
@@ -35,70 +38,75 @@ type jobToPkgsKey struct {
35
38
  ContainsAllPackages bool
36
39
  }
37
40
 
38
- func (r CRPRepository) FindByReleaseJob(job bprel.Job) ([]bprel.Package, bool, error) {
41
+ func (r CRPRepository) Find(rec ReleaseJobRecord) ([]bprel.Package, bool, error) {
39
42
  var pkgs []bprel.Package
40
43
 
41
- err := r.index.Find(r.jobSpecificKey(job), &pkgs)
44
+ err := r.index.Find(r.jobSpecificKey(rec), &pkgs)
42
45
  if err != nil {
43
46
  if err == bpindex.ErrNotFound {
44
47
  return pkgs, false, nil
45
48
  }
46
49
 
47
- return pkgs, false, bosherr.WrapError(err, "Finding rel-job -> specific rel-pkgs record")
50
+ return pkgs, false, bosherr.WrapError(err, "Finding rel-job record -> specific rel-pkgs record")
48
51
  }
49
52
 
50
53
  return pkgs, true, nil
51
54
  }
52
55
 
53
- func (r CRPRepository) SaveForReleaseJob(job bprel.Job, pkgs []bprel.Package) error {
54
- err := r.index.Save(r.jobSpecificKey(job), pkgs)
56
+ func (r CRPRepository) Save(rec ReleaseJobRecord, pkgs []bprel.Package) error {
57
+ err := r.index.Save(r.jobSpecificKey(rec), pkgs)
55
58
  if err != nil {
56
- return bosherr.WrapError(err, "Saving rel-job -> specific rel-pkgs record")
59
+ return bosherr.WrapError(err, "Saving rel-job record -> specific rel-pkgs record")
57
60
  }
58
61
 
59
62
  return nil
60
63
  }
61
64
 
62
- // FindAllByReleaseJob keeps association between all possible packages for a job
63
- func (r CRPRepository) FindAllByReleaseJob(job bprel.Job) ([]bprel.Package, bool, error) {
65
+ func (r CRPRepository) FindAll(rec ReleaseJobRecord) ([]bprel.Package, bool, error) {
64
66
  var pkgs []bprel.Package
65
67
 
66
- err := r.index.Find(r.jobAllKey(job), &pkgs)
68
+ err := r.index.Find(r.jobAllKey(rec), &pkgs)
67
69
  if err != nil {
68
70
  if err == bpindex.ErrNotFound {
69
71
  return pkgs, false, nil
70
72
  }
71
73
 
72
- return pkgs, false, bosherr.WrapError(err, "Finding rel-job -> all rel-pkgs record")
74
+ return pkgs, false, bosherr.WrapError(err, "Finding rel-job record -> all rel-pkgs record")
73
75
  }
74
76
 
75
77
  return pkgs, true, nil
76
78
  }
77
79
 
78
- func (r CRPRepository) SaveAllForReleaseJob(job bprel.Job, pkgs []bprel.Package) error {
79
- err := r.index.Save(r.jobAllKey(job), pkgs)
80
+ func (r CRPRepository) SaveAll(rec ReleaseJobRecord, pkgs []bprel.Package) error {
81
+ err := r.index.Save(r.jobAllKey(rec), pkgs)
80
82
  if err != nil {
81
- return bosherr.WrapError(err, "Saving rel-job -> all rel-pkgs record")
83
+ return bosherr.WrapError(err, "Saving rel-job record -> all rel-pkgs record")
82
84
  }
83
85
 
84
86
  return nil
85
87
  }
86
88
 
87
- func (r CRPRepository) jobSpecificKey(job bprel.Job) jobToPkgsKey {
89
+ func (r CRPRepository) jobSpecificKey(rec ReleaseJobRecord) jobToPkgsKey {
88
90
  return jobToPkgsKey{
89
- JobName: job.Name,
90
- JobVersion: job.Version,
91
- JobFingerprint: job.Fingerprint,
91
+ ReleaseName: rec.ReleaseName,
92
+ ReleaseVersion: rec.ReleaseVersion,
93
+
94
+ JobName: rec.JobName,
95
+ JobVersion: rec.JobVersion,
96
+ JobFingerprint: rec.JobFingerprint,
92
97
 
93
98
  ContainsAllPackages: false,
94
99
  }
95
100
  }
96
101
 
97
- func (r CRPRepository) jobAllKey(job bprel.Job) jobToPkgsKey {
102
+ func (r CRPRepository) jobAllKey(rec ReleaseJobRecord) jobToPkgsKey {
98
103
  return jobToPkgsKey{
99
- JobName: job.Name,
100
- JobVersion: job.Version,
101
- JobFingerprint: job.Fingerprint,
104
+ ReleaseName: rec.ReleaseName,
105
+ ReleaseVersion: rec.ReleaseVersion,
106
+
107
+ JobName: rec.JobName,
108
+ JobVersion: rec.JobVersion,
109
+ JobFingerprint: rec.JobFingerprint,
102
110
 
103
111
  ContainsAllPackages: true,
104
112
  }
@@ -30,28 +30,38 @@ func NewConcreteTemplateToJobRepository(
30
30
  }
31
31
  }
32
32
 
33
- func (r CTTJRepository) FindByTemplate(template bpdep.Template) (bprel.Job, bool, error) {
34
- var job bprel.Job
33
+ func (r CTTJRepository) FindByTemplate(template bpdep.Template) (ReleaseJobRecord, bool, error) {
34
+ var rec ReleaseJobRecord
35
35
 
36
- err := r.index.Find(r.templateKey(template), &job)
36
+ err := r.index.Find(r.templateKey(template), &rec)
37
37
  if err != nil {
38
38
  if err == bpindex.ErrNotFound {
39
- return job, false, nil
39
+ return rec, false, nil
40
40
  }
41
41
 
42
- return job, false, bosherr.WrapError(err, "Finding dep-template -> rel-job record")
42
+ return rec, false, bosherr.WrapError(err, "Finding dep-template -> release-job record")
43
43
  }
44
44
 
45
- return job, true, nil
45
+ return rec, true, nil
46
46
  }
47
47
 
48
- func (r CTTJRepository) SaveForJob(release bprel.Release, job bprel.Job) error {
49
- err := r.index.Save(r.jobKey(release, job), job)
48
+ func (r CTTJRepository) SaveForJob(release bprel.Release, job bprel.Job) (ReleaseJobRecord, error) {
49
+ // todo redundant info stored in value
50
+ rec := ReleaseJobRecord{
51
+ ReleaseName: release.Name,
52
+ ReleaseVersion: release.Version,
53
+
54
+ JobName: job.Name,
55
+ JobVersion: job.Version,
56
+ JobFingerprint: job.Fingerprint,
57
+ }
58
+
59
+ err := r.index.Save(r.jobKey(release, job), rec)
50
60
  if err != nil {
51
- return bosherr.WrapError(err, "Saving dep-template -> rel-job record")
61
+ return rec, bosherr.WrapError(err, "Saving dep-template -> release-job record")
52
62
  }
53
63
 
54
- return nil
64
+ return rec, nil
55
65
  }
56
66
 
57
67
  func (r CTTJRepository) templateKey(template bpdep.Template) templateToJobKey {
@@ -1,6 +1,8 @@
1
1
  package jobsrepo
2
2
 
3
3
  import (
4
+ "fmt"
5
+
4
6
  bpdep "boshprovisioner/deployment"
5
7
  bprel "boshprovisioner/release"
6
8
  )
@@ -10,22 +12,38 @@ type JobRecord struct {
10
12
  SHA1 string
11
13
  }
12
14
 
15
+ type ReleaseJobRecord struct {
16
+ ReleaseName string
17
+ ReleaseVersion string
18
+
19
+ JobName string
20
+ JobVersion string
21
+ JobFingerprint string
22
+ }
23
+
24
+ func (r ReleaseJobRecord) String() string {
25
+ return fmt.Sprintf("job %s in release %s/%s", r.JobName, r.ReleaseName, r.ReleaseVersion)
26
+ }
27
+
13
28
  // JobsRepository maintains list of job source code as blobs
14
29
  type JobsRepository interface {
15
30
  Find(bprel.Job) (JobRecord, bool, error)
16
31
  Save(bprel.Job, JobRecord) error
32
+
33
+ FindByReleaseJob(ReleaseJobRecord) (JobRecord, bool, error)
17
34
  }
18
35
 
19
36
  type TemplateToJobRepository interface {
20
- FindByTemplate(bpdep.Template) (bprel.Job, bool, error)
21
- SaveForJob(bprel.Release, bprel.Job) error
37
+ FindByTemplate(bpdep.Template) (ReleaseJobRecord, bool, error)
38
+ SaveForJob(bprel.Release, bprel.Job) (ReleaseJobRecord, error)
22
39
  }
23
40
 
41
+ // RuntimePackagesRepository maintains list of releases' packages
24
42
  type RuntimePackagesRepository interface {
25
- FindByReleaseJob(bprel.Job) ([]bprel.Package, bool, error)
26
- SaveForReleaseJob(bprel.Job, []bprel.Package) error
43
+ Find(ReleaseJobRecord) ([]bprel.Package, bool, error)
44
+ Save(ReleaseJobRecord, []bprel.Package) error
27
45
 
28
46
  // Keeps association between all possible packages for a job
29
- FindAllByReleaseJob(bprel.Job) ([]bprel.Package, bool, error)
30
- SaveAllForReleaseJob(bprel.Job, []bprel.Package) error
47
+ FindAll(ReleaseJobRecord) ([]bprel.Package, bool, error)
48
+ SaveAll(ReleaseJobRecord, []bprel.Package) error
31
49
  }
@@ -73,18 +73,37 @@ func (r DirReader) Close() error {
73
73
 
74
74
  // populateReleaseTarPaths sets TarPath for each job/package in the release.
75
75
  func (r DirReader) populateReleaseTarPaths(release *Release) {
76
+ devBuilds := filepath.Join(r.dir, ".dev_builds")
77
+ finalBuilds := filepath.Join(r.dir, ".final_builds")
78
+
76
79
  for i, job := range release.Jobs {
77
80
  fileName := job.Fingerprint + ".tgz"
78
81
 
79
- release.Jobs[i].TarPath = filepath.Join(
80
- r.dir, ".dev_builds", "jobs", job.Name, fileName)
82
+ devPath := filepath.Join(devBuilds, "jobs", job.Name, fileName)
83
+ finalPath := filepath.Join(finalBuilds, "jobs", job.Name, fileName)
84
+
85
+ release.Jobs[i].TarPath = r.pathThatExistsOrEmpty(devPath, finalPath)
81
86
  }
82
87
 
83
88
  for _, pkg := range release.Packages {
84
89
  fileName := pkg.Fingerprint + ".tgz"
85
90
 
86
- pkg.TarPath = filepath.Join(
87
- r.dir, ".dev_builds", "packages", pkg.Name, fileName)
91
+ devPath := filepath.Join(devBuilds, "packages", pkg.Name, fileName)
92
+ finalPath := filepath.Join(finalBuilds, "packages", pkg.Name, fileName)
93
+
94
+ pkg.TarPath = r.pathThatExistsOrEmpty(devPath, finalPath)
95
+ }
96
+ }
97
+
98
+ // pathThatExists returns first path that exists on the file system.
99
+ func (r DirReader) pathThatExistsOrEmpty(firstPath, secondPath string) string {
100
+ switch {
101
+ case r.fs.FileExists(firstPath):
102
+ return firstPath
103
+ case r.fs.FileExists(secondPath):
104
+ return secondPath
105
+ default:
106
+ return ""
88
107
  }
89
108
  }
90
109
 
@@ -99,15 +99,15 @@ func (p AgentProvisioner) Provision() error {
99
99
  func (p AgentProvisioner) Configure(instance bpdep.Instance) (bpagclient.Client, error) {
100
100
  stage := p.eventLog.BeginStage("Configuring BOSH agent", 1)
101
101
 
102
- task := stage.BeginTask("Configuring infrastructure settings")
103
-
104
- err := task.End(p.placeInfSettings(instance))
102
+ err := p.placeInfSettings(instance)
105
103
  if err != nil {
106
104
  return nil, bosherr.WrapError(err, "Placing infrastructure settings")
107
105
  }
108
106
 
107
+ task := stage.BeginTask("Configuring infrastructure settings")
108
+
109
109
  agentClient, err := p.buildAgentClient()
110
- if err != nil {
110
+ if task.End(err) != nil {
111
111
  return nil, bosherr.WrapError(err, "Building agent client")
112
112
  }
113
113
 
Binary file
@@ -20,6 +20,11 @@ module VagrantPlugins
20
20
 
21
21
  attr_accessor :agent_infrastructure, :agent_platform, :agent_configuration
22
22
 
23
+ # Command to run to create a BOSH release on the host.
24
+ # BOSH release has a rake task to create a dev release
25
+ # because it creates locally versioned gems.
26
+ attr_accessor :create_release_cmd
27
+
23
28
  def initialize(*args)
24
29
  super
25
30
  @base_dir = "/opt/vagrant-bosh"
@@ -36,6 +41,8 @@ module VagrantPlugins
36
41
  @synced_releases_dir = File.join(@base_dir, "synced-releases")
37
42
 
38
43
  @full_stemcell_compatibility = !!@full_stemcell_compatibility
44
+
45
+ @create_release_cmd ||= "bosh -n create release --force"
39
46
  end
40
47
 
41
48
  def validate(machine)
@@ -16,21 +16,23 @@ module VagrantPlugins
16
16
  def sync(host_dir, guest_dir)
17
17
  # RsyncHelper uses @machine.ui internally
18
18
 
19
- # .dev_builds/ contains jobs/ and packages/ tgzs
20
- SyncedFolderRSync::RsyncHelper.rsync_single(@machine, @machine.ssh_info, {
21
- type: :rsync,
22
- hostpath: File.join(host_dir, ".dev_builds"),
23
- guestpath: File.join(guest_dir, ".dev_builds"),
24
- disabled: false,
25
- })
26
-
27
- # dev_releases/ contains dev release manifest files
28
- SyncedFolderRSync::RsyncHelper.rsync_single(@machine, @machine.ssh_info, {
29
- type: :rsync,
30
- hostpath: File.join(host_dir, "dev_releases"),
31
- guestpath: File.join(guest_dir, "dev_releases"),
32
- disabled: false,
33
- })
19
+ dir_names = [
20
+ # .dev_builds/ and .final_builds/ contain jobs/ and packages/ tgzs
21
+ ".dev_builds",
22
+ ".final_builds",
23
+
24
+ # dev_releases/ contains dev release manifest files
25
+ "dev_releases",
26
+ ]
27
+
28
+ dir_names.each do |dir_name|
29
+ SyncedFolderRSync::RsyncHelper.rsync_single(@machine, @machine.ssh_info, {
30
+ type: :rsync,
31
+ hostpath: File.join(host_dir, dir_name),
32
+ guestpath: File.join(guest_dir, dir_name),
33
+ disabled: false,
34
+ })
35
+ end
34
36
  end
35
37
  end
36
38
 
@@ -10,11 +10,12 @@ module VagrantPlugins
10
10
  # UplodableRelease represents a release
11
11
  # that *can be* synced to a guest FS location.
12
12
  class UplodableRelease
13
- def initialize(name, version, host_dir, guest_root_dir, release_uploader, ui)
13
+ def initialize(name, version, host_dir, guest_root_dir, release_uploader, create_release_cmd, ui)
14
14
  @name = name
15
15
  @version = version
16
16
  @host_dir = host_dir
17
17
  @release_uploader = release_uploader
18
+ @create_release_cmd = create_release_cmd
18
19
 
19
20
  @ui = ui.for(:deployment, :uploadable_release)
20
21
  @logger = Log4r::Logger.new("vagrant::provisioners::bosh::deployment::uploadable_release")
@@ -35,11 +36,13 @@ module VagrantPlugins
35
36
 
36
37
  def create_release
37
38
  result = @ui.timed_msg(:create_release, name: @name) do
39
+ shell = ENV["SHELL"] || "bash"
40
+
38
41
  # Without clearing out environment Vagrant ruby env will be inherited
39
42
  Vagrant::Util::Subprocess.execute(
40
- "env", "-i", "HOME=#{ENV["HOME"]}", "TERM=#{ENV["TERM"]}",
41
- "bash", "-l", "-c",
42
- "bosh create release --force",
43
+ "env", "-i", "HOME=#{ENV["HOME"]}", "TERM=#{ENV["TERM"]}",
44
+ shell, "-l", "-c",
45
+ @create_release_cmd,
43
46
  {workdir: @host_dir},
44
47
  )
45
48
  end
@@ -4,9 +4,10 @@ module VagrantPlugins
4
4
  module VagrantBosh
5
5
  module Deployment
6
6
  class UploadableReleaseFactory
7
- def initialize(guest_root_dir, release_uploader, ui)
7
+ def initialize(guest_root_dir, release_uploader, create_release_cmd, ui)
8
8
  @guest_root_dir = guest_root_dir
9
9
  @release_uploader = release_uploader
10
+ @create_release_cmd = create_release_cmd
10
11
  @ui = ui
11
12
  end
12
13
 
@@ -17,6 +18,7 @@ module VagrantPlugins
17
18
  host_dir,
18
19
  @guest_root_dir,
19
20
  @release_uploader,
21
+ @create_release_cmd,
20
22
  @ui,
21
23
  )
22
24
  end
@@ -34,6 +34,7 @@ module VagrantPlugins
34
34
  uploadable_release_factory = Deployment::UploadableReleaseFactory.new(
35
35
  config.synced_releases_dir,
36
36
  release_uploader,
37
+ config.create_release_cmd,
37
38
  machine_ui,
38
39
  )
39
40
 
@@ -1,5 +1,5 @@
1
1
  module VagrantPlugins
2
2
  module VagrantBosh
3
- VERSION = "0.0.4"
3
+ VERSION = "0.0.5"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,15 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-bosh
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
5
- prerelease:
4
+ version: 0.0.5
6
5
  platform: ruby
7
6
  authors:
8
7
  - Dmitriy Kalinin
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2014-06-30 00:00:00.000000000 Z
11
+ date: 2014-07-15 00:00:00.000000000 Z
13
12
  dependencies: []
14
13
  description: BOSH provisioner allows to provision guest VM by specifying regular BOSH
15
14
  deployment manifest.
@@ -183,27 +182,26 @@ files:
183
182
  homepage: https://github.com/cppforlife/vagrant-bosh
184
183
  licenses:
185
184
  - MIT
185
+ metadata: {}
186
186
  post_install_message:
187
187
  rdoc_options: []
188
188
  require_paths:
189
189
  - lib
190
190
  - templates
191
191
  required_ruby_version: !ruby/object:Gem::Requirement
192
- none: false
193
192
  requirements:
194
- - - ! '>='
193
+ - - '>='
195
194
  - !ruby/object:Gem::Version
196
195
  version: '0'
197
196
  required_rubygems_version: !ruby/object:Gem::Requirement
198
- none: false
199
197
  requirements:
200
- - - ! '>='
198
+ - - '>='
201
199
  - !ruby/object:Gem::Version
202
200
  version: '0'
203
201
  requirements: []
204
202
  rubyforge_project:
205
- rubygems_version: 1.8.23
203
+ rubygems_version: 2.3.0
206
204
  signing_key:
207
- specification_version: 3
205
+ specification_version: 4
208
206
  summary: Vagrant BOSH provisioner plugin.
209
207
  test_files: []