vagrant-bosh 0.0.1

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.
Files changed (147) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.gitmodules +6 -0
  4. data/Gemfile +3 -0
  5. data/LICENSE +20 -0
  6. data/README.md +73 -0
  7. data/Rakefile +2 -0
  8. data/dev/.gitignore +1 -0
  9. data/dev/Vagrantfile +30 -0
  10. data/dev/example-bosh-manifest.yml +188 -0
  11. data/dev/example-winston-manifest.yml +70 -0
  12. data/go/.gitignore +11 -0
  13. data/go/bin/build +10 -0
  14. data/go/bin/build-linux-amd64 +9 -0
  15. data/go/bin/env +13 -0
  16. data/go/bin/go +5 -0
  17. data/go/bin/golint +19 -0
  18. data/go/bin/test +37 -0
  19. data/go/src/boshprovisioner/agent/client/client_interface.go +73 -0
  20. data/go/src/boshprovisioner/agent/client/fakes/fake_client.go +81 -0
  21. data/go/src/boshprovisioner/agent/client/http_client.go +299 -0
  22. data/go/src/boshprovisioner/agent/client/http_client_envelope.go +107 -0
  23. data/go/src/boshprovisioner/deployment/deployment.go +221 -0
  24. data/go/src/boshprovisioner/deployment/instance.go +54 -0
  25. data/go/src/boshprovisioner/deployment/manifest/deployment.go +80 -0
  26. data/go/src/boshprovisioner/deployment/manifest/ips.go +23 -0
  27. data/go/src/boshprovisioner/deployment/manifest/manifest.go +143 -0
  28. data/go/src/boshprovisioner/deployment/manifest/manifest_suite_test.go +13 -0
  29. data/go/src/boshprovisioner/deployment/manifest/manifest_test.go +86 -0
  30. data/go/src/boshprovisioner/deployment/manifest/syntax_validator.go +186 -0
  31. data/go/src/boshprovisioner/deployment/manifest/watch_time.go +47 -0
  32. data/go/src/boshprovisioner/deployment/manifest_reader.go +46 -0
  33. data/go/src/boshprovisioner/deployment/reader_factory.go +25 -0
  34. data/go/src/boshprovisioner/deployment/semantic_validator.go +111 -0
  35. data/go/src/boshprovisioner/downloader/blobstore_downloader.go +55 -0
  36. data/go/src/boshprovisioner/downloader/default_mux_downloader.go +22 -0
  37. data/go/src/boshprovisioner/downloader/downloader_interface.go +6 -0
  38. data/go/src/boshprovisioner/downloader/http_downloader.go +53 -0
  39. data/go/src/boshprovisioner/downloader/local_fs_downloader.go +48 -0
  40. data/go/src/boshprovisioner/downloader/mux_downloader.go +69 -0
  41. data/go/src/boshprovisioner/eventlog/log.go +72 -0
  42. data/go/src/boshprovisioner/eventlog/stage.go +39 -0
  43. data/go/src/boshprovisioner/eventlog/task.go +58 -0
  44. data/go/src/boshprovisioner/index/file_index.go +289 -0
  45. data/go/src/boshprovisioner/index/file_index_test.go +296 -0
  46. data/go/src/boshprovisioner/index/index_interface.go +18 -0
  47. data/go/src/boshprovisioner/index/index_suite_test.go +13 -0
  48. data/go/src/boshprovisioner/instance/templatescompiler/concrete_templates_compiler.go +273 -0
  49. data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/erb_renderer.go +117 -0
  50. data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/erbrenderer_suite_test.go +13 -0
  51. data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/render_properties.go +77 -0
  52. data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/render_properties_test.go +142 -0
  53. data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/template_evaluation_context.go +85 -0
  54. data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/template_evaluation_context_rb.go +155 -0
  55. data/go/src/boshprovisioner/instance/templatescompiler/jobsrepo/concrete_jobs_repository.go +64 -0
  56. data/go/src/boshprovisioner/instance/templatescompiler/jobsrepo/concrete_runtime_packages_repository.go +105 -0
  57. data/go/src/boshprovisioner/instance/templatescompiler/jobsrepo/concrete_template_to_job_repository.go +76 -0
  58. data/go/src/boshprovisioner/instance/templatescompiler/jobsrepo/jobs_repository_interface.go +31 -0
  59. data/go/src/boshprovisioner/instance/templatescompiler/rendered_archives_compiler.go +81 -0
  60. data/go/src/boshprovisioner/instance/templatescompiler/templates_compiler_interface.go +20 -0
  61. data/go/src/boshprovisioner/instance/templatescompiler/templatesrepo/ct_repository.go +54 -0
  62. data/go/src/boshprovisioner/instance/templatescompiler/templatesrepo/templates_repository_interface.go +16 -0
  63. data/go/src/boshprovisioner/instance/updater/applier/applier.go +93 -0
  64. data/go/src/boshprovisioner/instance/updater/applier/empty_state.go +66 -0
  65. data/go/src/boshprovisioner/instance/updater/applier/job_state.go +178 -0
  66. data/go/src/boshprovisioner/instance/updater/drainer.go +72 -0
  67. data/go/src/boshprovisioner/instance/updater/preparer.go +39 -0
  68. data/go/src/boshprovisioner/instance/updater/starter.go +36 -0
  69. data/go/src/boshprovisioner/instance/updater/stopper.go +36 -0
  70. data/go/src/boshprovisioner/instance/updater/updater.go +102 -0
  71. data/go/src/boshprovisioner/instance/updater/updater_factory.go +83 -0
  72. data/go/src/boshprovisioner/instance/updater/updater_suite_test.go +13 -0
  73. data/go/src/boshprovisioner/instance/updater/waiter.go +77 -0
  74. data/go/src/boshprovisioner/instance/updater/waiter_test.go +103 -0
  75. data/go/src/boshprovisioner/main/config.go +77 -0
  76. data/go/src/boshprovisioner/main/main.go +183 -0
  77. data/go/src/boshprovisioner/main/repos_factory.go +96 -0
  78. data/go/src/boshprovisioner/packagescompiler/compiledpackagesrepo/compiled_packages_repository_interface.go +17 -0
  79. data/go/src/boshprovisioner/packagescompiler/compiledpackagesrepo/concrete_compiled_packages_repository.go +61 -0
  80. data/go/src/boshprovisioner/packagescompiler/concrete_packages_compiler.go +179 -0
  81. data/go/src/boshprovisioner/packagescompiler/concrete_packages_compiler_factory.go +48 -0
  82. data/go/src/boshprovisioner/packagescompiler/packages_compiler_interface.go +20 -0
  83. data/go/src/boshprovisioner/packagescompiler/packagesrepo/concrete_packages_repository.go +65 -0
  84. data/go/src/boshprovisioner/packagescompiler/packagesrepo/packages_repository_interface.go +16 -0
  85. data/go/src/boshprovisioner/provisioner/blobstore_config.go +65 -0
  86. data/go/src/boshprovisioner/provisioner/blobstore_provisioner.go +38 -0
  87. data/go/src/boshprovisioner/provisioner/deployment_provisioner.go +97 -0
  88. data/go/src/boshprovisioner/provisioner/instance_provisioner.go +48 -0
  89. data/go/src/boshprovisioner/provisioner/release_compiler.go +133 -0
  90. data/go/src/boshprovisioner/release/job/job.go +86 -0
  91. data/go/src/boshprovisioner/release/job/manifest/manifest.go +79 -0
  92. data/go/src/boshprovisioner/release/job/manifest/manifest_suite_test.go +13 -0
  93. data/go/src/boshprovisioner/release/job/manifest/manifest_test.go +42 -0
  94. data/go/src/boshprovisioner/release/job/manifest/syntax_validator.go +43 -0
  95. data/go/src/boshprovisioner/release/job/reader_factory.go +34 -0
  96. data/go/src/boshprovisioner/release/job/tar_reader.go +133 -0
  97. data/go/src/boshprovisioner/release/manifest/manifest.go +96 -0
  98. data/go/src/boshprovisioner/release/manifest_reader.go +29 -0
  99. data/go/src/boshprovisioner/release/reader_factory.go +34 -0
  100. data/go/src/boshprovisioner/release/release.go +144 -0
  101. data/go/src/boshprovisioner/release/release_suite_test.go +13 -0
  102. data/go/src/boshprovisioner/release/release_test.go +129 -0
  103. data/go/src/boshprovisioner/release/tar_reader.go +139 -0
  104. data/go/src/boshprovisioner/releasesrepo/blobstore_releases_repository.go +114 -0
  105. data/go/src/boshprovisioner/releasesrepo/releases_repository_interface.go +15 -0
  106. data/go/src/boshprovisioner/tar/cmd_compressor.go +68 -0
  107. data/go/src/boshprovisioner/tar/cmd_extractor.go +47 -0
  108. data/go/src/boshprovisioner/tar/compressor_interface.go +6 -0
  109. data/go/src/boshprovisioner/tar/extractor_interface.go +6 -0
  110. data/go/src/boshprovisioner/util/string_keyed.go +70 -0
  111. data/go/src/boshprovisioner/vm/agent_provisioner.go +266 -0
  112. data/go/src/boshprovisioner/vm/asset_manager.go +61 -0
  113. data/go/src/boshprovisioner/vm/deps_provisioner.go +92 -0
  114. data/go/src/boshprovisioner/vm/monit_provisioner.go +83 -0
  115. data/go/src/boshprovisioner/vm/runit_provisioner.go +225 -0
  116. data/go/src/boshprovisioner/vm/simple_cmds.go +54 -0
  117. data/go/src/boshprovisioner/vm/vcap_user_provisioner.go +120 -0
  118. data/go/src/boshprovisioner/vm/vm.go +19 -0
  119. data/go/src/boshprovisioner/vm/vm_provisioner.go +57 -0
  120. data/go/src/boshprovisioner/vm/vm_provisioner_factory.go +97 -0
  121. data/lib/vagrant-bosh/asset_uploader.rb +53 -0
  122. data/lib/vagrant-bosh/assets/agent/agent-log +5 -0
  123. data/lib/vagrant-bosh/assets/agent/agent-run +12 -0
  124. data/lib/vagrant-bosh/assets/agent/agent.cert +18 -0
  125. data/lib/vagrant-bosh/assets/agent/agent.json +9 -0
  126. data/lib/vagrant-bosh/assets/agent/agent.key +27 -0
  127. data/lib/vagrant-bosh/assets/agent/bosh-agent +0 -0
  128. data/lib/vagrant-bosh/assets/agent/bosh-agent-rc +18 -0
  129. data/lib/vagrant-bosh/assets/agent/bosh-blobstore-dav +0 -0
  130. data/lib/vagrant-bosh/assets/monit/monit +0 -0
  131. data/lib/vagrant-bosh/assets/monit/monit-log +5 -0
  132. data/lib/vagrant-bosh/assets/monit/monit-run +9 -0
  133. data/lib/vagrant-bosh/assets/monit/monitrc +8 -0
  134. data/lib/vagrant-bosh/assets/provisioner +0 -0
  135. data/lib/vagrant-bosh/bootstrapper.rb +59 -0
  136. data/lib/vagrant-bosh/communicator.rb +50 -0
  137. data/lib/vagrant-bosh/config.rb +15 -0
  138. data/lib/vagrant-bosh/errors.rb +11 -0
  139. data/lib/vagrant-bosh/plugin.rb +25 -0
  140. data/lib/vagrant-bosh/provisioner.rb +46 -0
  141. data/lib/vagrant-bosh/provisioner_tracker.rb +41 -0
  142. data/lib/vagrant-bosh/ui.rb +77 -0
  143. data/lib/vagrant-bosh/version.rb +5 -0
  144. data/lib/vagrant-bosh.rb +15 -0
  145. data/templates/locales/en.yml +15 -0
  146. data/vagrant-bosh.gemspec +20 -0
  147. metadata +191 -0
@@ -0,0 +1,179 @@
1
+ package packagescompiler
2
+
3
+ import (
4
+ "fmt"
5
+
6
+ boshcomp "bosh/agent/compiler"
7
+ boshblob "bosh/blobstore"
8
+ bosherr "bosh/errors"
9
+ boshlog "bosh/logger"
10
+
11
+ bragentclient "boshprovisioner/agent/client"
12
+ bpeventlog "boshprovisioner/eventlog"
13
+ bpcpkgsrepo "boshprovisioner/packagescompiler/compiledpackagesrepo"
14
+ bppkgsrepo "boshprovisioner/packagescompiler/packagesrepo"
15
+ bprel "boshprovisioner/release"
16
+ )
17
+
18
+ const concretePackagesCompilerLogTag = "ConcretePackagesCompiler"
19
+
20
+ type ConcretePackagesCompiler struct {
21
+ agentClient bragentclient.Client
22
+ packagesRepo bppkgsrepo.PackagesRepository
23
+ compiledPackagesRepo bpcpkgsrepo.CompiledPackagesRepository
24
+ blobstore boshblob.Blobstore
25
+
26
+ eventLog bpeventlog.Log
27
+ logger boshlog.Logger
28
+ }
29
+
30
+ func NewConcretePackagesCompiler(
31
+ agentClient bragentclient.Client,
32
+ packagesRepo bppkgsrepo.PackagesRepository,
33
+ compiledPackagesRepo bpcpkgsrepo.CompiledPackagesRepository,
34
+ blobstore boshblob.Blobstore,
35
+ eventLog bpeventlog.Log,
36
+ logger boshlog.Logger,
37
+ ) ConcretePackagesCompiler {
38
+ return ConcretePackagesCompiler{
39
+ agentClient: agentClient,
40
+ packagesRepo: packagesRepo,
41
+ compiledPackagesRepo: compiledPackagesRepo,
42
+ blobstore: blobstore,
43
+
44
+ eventLog: eventLog,
45
+ logger: logger,
46
+ }
47
+ }
48
+
49
+ // Compile populates blobstore with compiled packages for a given release packages.
50
+ // All packages are compiled regardless if they will be later used or not.
51
+ // Currently Compile does not account for stemcell differences.
52
+ func (pc ConcretePackagesCompiler) Compile(release bprel.Release) error {
53
+ packages := release.ResolvedPackageDependencies()
54
+
55
+ releaseDesc := fmt.Sprintf("Compiling release %s/%s", release.Name, release.Version)
56
+
57
+ stage := pc.eventLog.BeginStage(releaseDesc, len(packages))
58
+
59
+ for _, pkg := range packages {
60
+ pkgDesc := fmt.Sprintf("%s/%s", pkg.Name, pkg.Version)
61
+
62
+ task := stage.BeginTask(fmt.Sprintf("Package %s", pkgDesc))
63
+
64
+ _, found, err := pc.compiledPackagesRepo.Find(*pkg)
65
+ if err != nil {
66
+ return task.End(bosherr.WrapError(err, "Finding compiled package %s", pkg.Name))
67
+ } else if found {
68
+ task.End(nil)
69
+ continue
70
+ }
71
+
72
+ err = task.End(pc.compilePkg(*pkg))
73
+ if err != nil {
74
+ return err
75
+ }
76
+ }
77
+
78
+ return nil
79
+ }
80
+
81
+ // FindCompiledPackage returns previously compiled package for a given template.
82
+ // If such compiled package is not found, error is returned.
83
+ func (pc ConcretePackagesCompiler) FindCompiledPackage(pkg bprel.Package) (CompiledPackageRecord, error) {
84
+ var compiledPkgRec CompiledPackageRecord
85
+
86
+ rec, found, err := pc.compiledPackagesRepo.Find(pkg)
87
+ if err != nil {
88
+ return compiledPkgRec, bosherr.WrapError(err, "Finding compiled package %s", pkg.Name)
89
+ } else if !found {
90
+ return compiledPkgRec, bosherr.New("Expected to find compiled package %s", pkg.Name)
91
+ }
92
+
93
+ compiledPkgRec.SHA1 = rec.SHA1
94
+ compiledPkgRec.BlobID = rec.BlobID
95
+
96
+ return compiledPkgRec, nil
97
+ }
98
+
99
+ // compilePackage populates blobstore with a compiled package for a
100
+ // given package. Assumes that dependencies of given package have
101
+ // already been compiled and are in the blobstore.
102
+ func (pc ConcretePackagesCompiler) compilePkg(pkg bprel.Package) error {
103
+ pc.logger.Debug(concretePackagesCompilerLogTag,
104
+ "Preparing to compile package %v", pkg)
105
+
106
+ pkgRec, found, err := pc.packagesRepo.Find(pkg)
107
+ if err != nil {
108
+ return bosherr.WrapError(err, "Finding package source blob %s", pkg.Name)
109
+ }
110
+
111
+ if !found {
112
+ blobID, fingerprint, err := pc.blobstore.Create(pkg.TarPath)
113
+ if err != nil {
114
+ return bosherr.WrapError(err, "Creating package source blob %s", pkg.Name)
115
+ }
116
+
117
+ pkgRec = bppkgsrepo.PackageRecord{
118
+ BlobID: blobID,
119
+ SHA1: fingerprint,
120
+ }
121
+
122
+ err = pc.packagesRepo.Save(pkg, pkgRec)
123
+ if err != nil {
124
+ return bosherr.WrapError(err, "Saving package record %s", pkg.Name)
125
+ }
126
+ }
127
+
128
+ deps, err := pc.buildPkgDeps(pkg)
129
+ if err != nil {
130
+ return err
131
+ }
132
+
133
+ compiledPkgRes, err := pc.agentClient.CompilePackage(
134
+ pkgRec.BlobID, // source tar
135
+ pkgRec.SHA1, // source tar
136
+ pkg.Name,
137
+ pkg.Version,
138
+ deps,
139
+ )
140
+ if err != nil {
141
+ return bosherr.WrapError(err, "Compiling package %s", pkg.Name)
142
+ }
143
+
144
+ compiledPkgRec := bpcpkgsrepo.CompiledPackageRecord{
145
+ BlobID: compiledPkgRes.BlobID,
146
+ SHA1: compiledPkgRes.SHA1,
147
+ }
148
+
149
+ err = pc.compiledPackagesRepo.Save(pkg, compiledPkgRec)
150
+ if err != nil {
151
+ return bosherr.WrapError(err, "Saving compiled package %s", pkg.Name)
152
+ }
153
+
154
+ return nil
155
+ }
156
+
157
+ // buildPkgDeps prepares dependencies for agent's compile_package.
158
+ // Assumes that all package dependencies were already compiled.
159
+ func (pc ConcretePackagesCompiler) buildPkgDeps(pkg bprel.Package) (boshcomp.Dependencies, error) {
160
+ deps := boshcomp.Dependencies{}
161
+
162
+ for _, depPkg := range pkg.Dependencies {
163
+ compiledPkgRec, found, err := pc.compiledPackagesRepo.Find(*depPkg)
164
+ if err != nil {
165
+ return deps, bosherr.WrapError(err, "Finding compiled package %s", depPkg.Name)
166
+ } else if !found {
167
+ return deps, bosherr.New("Expected to find compiled package %s", depPkg.Name)
168
+ }
169
+
170
+ deps[depPkg.Name] = boshcomp.Package{
171
+ Name: depPkg.Name,
172
+ Version: depPkg.Version,
173
+ BlobstoreID: compiledPkgRec.BlobID, // compiled tar
174
+ Sha1: compiledPkgRec.SHA1, // compiled tar
175
+ }
176
+ }
177
+
178
+ return deps, nil
179
+ }
@@ -0,0 +1,48 @@
1
+ package packagescompiler
2
+
3
+ import (
4
+ boshblob "bosh/blobstore"
5
+ boshlog "bosh/logger"
6
+
7
+ bpagclient "boshprovisioner/agent/client"
8
+ bpeventlog "boshprovisioner/eventlog"
9
+ bpcpkgsrepo "boshprovisioner/packagescompiler/compiledpackagesrepo"
10
+ bppkgsrepo "boshprovisioner/packagescompiler/packagesrepo"
11
+ )
12
+
13
+ type ConcretePackagesCompilerFactory struct {
14
+ packagesRepo bppkgsrepo.PackagesRepository
15
+ compiledPackagesRepo bpcpkgsrepo.CompiledPackagesRepository
16
+ blobstore boshblob.Blobstore
17
+
18
+ eventLog bpeventlog.Log
19
+ logger boshlog.Logger
20
+ }
21
+
22
+ func NewConcretePackagesCompilerFactory(
23
+ packagesRepo bppkgsrepo.PackagesRepository,
24
+ compiledPackagesRepo bpcpkgsrepo.CompiledPackagesRepository,
25
+ blobstore boshblob.Blobstore,
26
+ eventLog bpeventlog.Log,
27
+ logger boshlog.Logger,
28
+ ) ConcretePackagesCompilerFactory {
29
+ return ConcretePackagesCompilerFactory{
30
+ packagesRepo: packagesRepo,
31
+ compiledPackagesRepo: compiledPackagesRepo,
32
+ blobstore: blobstore,
33
+
34
+ eventLog: eventLog,
35
+ logger: logger,
36
+ }
37
+ }
38
+
39
+ func (f ConcretePackagesCompilerFactory) NewCompiler(agentClient bpagclient.Client) PackagesCompiler {
40
+ return NewConcretePackagesCompiler(
41
+ agentClient,
42
+ f.packagesRepo,
43
+ f.compiledPackagesRepo,
44
+ f.blobstore,
45
+ f.eventLog,
46
+ f.logger,
47
+ )
48
+ }
@@ -0,0 +1,20 @@
1
+ package packagescompiler
2
+
3
+ import (
4
+ bprel "boshprovisioner/release"
5
+ )
6
+
7
+ type CompiledPackageRecord struct {
8
+ SHA1 string
9
+ BlobID string
10
+ }
11
+
12
+ // PackagesCompiler takes each release package and compiles it.
13
+ // Compiled packages are used as:
14
+ // (1) compile dependencies for other packages
15
+ // (2) runtime dependencies for jobs
16
+ // todo account for stemcells
17
+ type PackagesCompiler interface {
18
+ Compile(bprel.Release) error
19
+ FindCompiledPackage(bprel.Package) (CompiledPackageRecord, error)
20
+ }
@@ -0,0 +1,65 @@
1
+ package packagesrepo
2
+
3
+ import (
4
+ bosherr "bosh/errors"
5
+ boshlog "bosh/logger"
6
+
7
+ bpindex "boshprovisioner/index"
8
+ bprel "boshprovisioner/release"
9
+ )
10
+
11
+ type CPRepository struct {
12
+ index bpindex.Index
13
+ logger boshlog.Logger
14
+ }
15
+
16
+ type pkgToPkgRecKey struct {
17
+ // Mostly for ease of debugging
18
+ PackageName string
19
+ PackageVersion string
20
+
21
+ // Fingerprint of a package captures its dependenices
22
+ PackageFingerprint string
23
+ }
24
+
25
+ func NewConcretePackagesRepository(
26
+ index bpindex.Index,
27
+ logger boshlog.Logger,
28
+ ) CPRepository {
29
+ return CPRepository{
30
+ index: index,
31
+ logger: logger,
32
+ }
33
+ }
34
+
35
+ func (r CPRepository) Find(pkg bprel.Package) (PackageRecord, bool, error) {
36
+ var record PackageRecord
37
+
38
+ err := r.index.Find(r.pkgKey(pkg), &record)
39
+ if err != nil {
40
+ if err == bpindex.ErrNotFound {
41
+ return record, false, nil
42
+ }
43
+
44
+ return record, false, bosherr.WrapError(err, "Finding package record")
45
+ }
46
+
47
+ return record, true, nil
48
+ }
49
+
50
+ func (r CPRepository) Save(pkg bprel.Package, record PackageRecord) error {
51
+ err := r.index.Save(r.pkgKey(pkg), record)
52
+ if err != nil {
53
+ return bosherr.WrapError(err, "Saving package record")
54
+ }
55
+
56
+ return nil
57
+ }
58
+
59
+ func (r CPRepository) pkgKey(pkg bprel.Package) pkgToPkgRecKey {
60
+ return pkgToPkgRecKey{
61
+ PackageName: pkg.Name,
62
+ PackageVersion: pkg.Version,
63
+ PackageFingerprint: pkg.Fingerprint,
64
+ }
65
+ }
@@ -0,0 +1,16 @@
1
+ package packagesrepo
2
+
3
+ import (
4
+ bprel "boshprovisioner/release"
5
+ )
6
+
7
+ type PackageRecord struct {
8
+ BlobID string
9
+ SHA1 string
10
+ }
11
+
12
+ // PackagesRepository maintains list of package source code as blobs.
13
+ type PackagesRepository interface {
14
+ Find(bprel.Package) (PackageRecord, bool, error)
15
+ Save(bprel.Package, PackageRecord) error
16
+ }
@@ -0,0 +1,65 @@
1
+ package provisioner
2
+
3
+ import (
4
+ bosherr "bosh/errors"
5
+ )
6
+
7
+ const (
8
+ BlobstoreConfigTypeLocal = "local"
9
+ )
10
+
11
+ type BlobstoreConfig struct {
12
+ Type string `json:"provider"`
13
+ Options map[string]interface{} `json:"options"`
14
+ }
15
+
16
+ func (c BlobstoreConfig) Validate() error {
17
+ // Only local blobstore provides options[blobstore_path]
18
+ if c.Type == BlobstoreConfigTypeLocal {
19
+ _, err := c.extractLocalPath()
20
+ if err != nil {
21
+ return err
22
+ }
23
+ }
24
+
25
+ return nil
26
+ }
27
+
28
+ func (c BlobstoreConfig) LocalPath() string {
29
+ if c.Type != BlobstoreConfigTypeLocal {
30
+ return ""
31
+ }
32
+
33
+ path, err := c.extractLocalPath()
34
+ if err != nil {
35
+ return ""
36
+ }
37
+
38
+ return path
39
+ }
40
+
41
+ func (c BlobstoreConfig) extractLocalPath() (string, error) {
42
+ path, ok := c.Options["blobstore_path"]
43
+ if !ok {
44
+ return "", bosherr.New("Missing blobstore_path in options")
45
+ }
46
+
47
+ pathStr, ok := path.(string)
48
+ if !ok {
49
+ return "", bosherr.New("Must provide blobstore_path as a string")
50
+ }
51
+
52
+ if pathStr == "" {
53
+ return "", bosherr.New("Must provide non-empty blobstore_path in options")
54
+ }
55
+
56
+ return pathStr, nil
57
+ }
58
+
59
+ // AsMap is used to populate agent infrastructure configuration
60
+ func (c BlobstoreConfig) AsMap() map[string]interface{} {
61
+ return map[string]interface{}{
62
+ "provider": c.Type,
63
+ "options": c.Options,
64
+ }
65
+ }
@@ -0,0 +1,38 @@
1
+ package provisioner
2
+
3
+ import (
4
+ "os"
5
+
6
+ boshlog "bosh/logger"
7
+ boshsys "bosh/system"
8
+ )
9
+
10
+ type BlobstoreProvisioner struct {
11
+ fs boshsys.FileSystem
12
+ blobstoreConfig BlobstoreConfig
13
+ logger boshlog.Logger
14
+ }
15
+
16
+ func NewBlobstoreProvisioner(
17
+ fs boshsys.FileSystem,
18
+ blobstoreConfig BlobstoreConfig,
19
+ logger boshlog.Logger,
20
+ ) BlobstoreProvisioner {
21
+ return BlobstoreProvisioner{
22
+ fs: fs,
23
+ blobstoreConfig: blobstoreConfig,
24
+ logger: logger,
25
+ }
26
+ }
27
+
28
+ func (p BlobstoreProvisioner) Provision() error {
29
+ blobstorePath := p.blobstoreConfig.LocalPath()
30
+ if blobstorePath != "" {
31
+ err := p.fs.MkdirAll(blobstorePath, os.ModeDir)
32
+ if err != nil {
33
+ return err
34
+ }
35
+ }
36
+
37
+ return nil
38
+ }
@@ -0,0 +1,97 @@
1
+ package provisioner
2
+
3
+ import (
4
+ bosherr "bosh/errors"
5
+ boshlog "bosh/logger"
6
+
7
+ bpdep "boshprovisioner/deployment"
8
+ bpeventlog "boshprovisioner/eventlog"
9
+ )
10
+
11
+ const deploymentProvisionerLogTag = "DeploymentProvisioner"
12
+
13
+ // DeploymentProvisioner interprets deployment manifest and
14
+ // configures system just like regular BOSH VM would be configured.
15
+ type DeploymentProvisioner struct {
16
+ manifestPath string
17
+ deploymentReaderFactory bpdep.ReaderFactory
18
+
19
+ releaseCompiler ReleaseCompiler
20
+ instanceProvisioner InstanceProvisioner
21
+
22
+ eventLog bpeventlog.Log
23
+ logger boshlog.Logger
24
+ }
25
+
26
+ func NewDeploymentProvisioner(
27
+ manifestPath string,
28
+ deploymentReaderFactory bpdep.ReaderFactory,
29
+ releaseCompiler ReleaseCompiler,
30
+ instanceProvisioner InstanceProvisioner,
31
+ eventLog bpeventlog.Log,
32
+ logger boshlog.Logger,
33
+ ) DeploymentProvisioner {
34
+ return DeploymentProvisioner{
35
+ manifestPath: manifestPath,
36
+ deploymentReaderFactory: deploymentReaderFactory,
37
+
38
+ releaseCompiler: releaseCompiler,
39
+ instanceProvisioner: instanceProvisioner,
40
+
41
+ eventLog: eventLog,
42
+ logger: logger,
43
+ }
44
+ }
45
+
46
+ func (p DeploymentProvisioner) Provision() error {
47
+ stage := p.eventLog.BeginStage("Setting up instance", 2)
48
+
49
+ reader := p.deploymentReaderFactory.NewManifestReader(p.manifestPath)
50
+
51
+ task := stage.BeginTask("Reading deployment manifest")
52
+
53
+ deployment, err := reader.Read()
54
+ if task.End(err) != nil {
55
+ return bosherr.WrapError(err, "Reading deployment")
56
+ }
57
+
58
+ task = stage.BeginTask("Validating instance")
59
+
60
+ job, instance, err := p.validateInstance(deployment)
61
+ if task.End(err) != nil {
62
+ return bosherr.WrapError(err, "Validating instance")
63
+ }
64
+
65
+ err = p.releaseCompiler.Compile(deployment.CompilationInstance, deployment.Releases)
66
+ if err != nil {
67
+ return bosherr.WrapError(err, "Compiling releases")
68
+ }
69
+
70
+ err = p.instanceProvisioner.Provision(job, instance)
71
+ if err != nil {
72
+ return bosherr.WrapError(err, "Provisioning instance")
73
+ }
74
+
75
+ return nil
76
+ }
77
+
78
+ func (p DeploymentProvisioner) validateInstance(deployment bpdep.Deployment) (bpdep.Job, bpdep.Instance, error) {
79
+ p.logger.Debug(deploymentProvisionerLogTag, "Validate instance")
80
+
81
+ var job bpdep.Job
82
+ var instance bpdep.Instance
83
+
84
+ if len(deployment.Jobs) > 1 {
85
+ return job, instance, bosherr.New("Must have exactly 1 job")
86
+ }
87
+
88
+ job = deployment.Jobs[0]
89
+
90
+ if len(job.Instances) != 1 {
91
+ return job, instance, bosherr.New("Must have exactly 1 instance")
92
+ }
93
+
94
+ instance = job.Instances[0]
95
+
96
+ return job, instance, nil
97
+ }
@@ -0,0 +1,48 @@
1
+ package provisioner
2
+
3
+ import (
4
+ bosherr "bosh/errors"
5
+ boshlog "bosh/logger"
6
+
7
+ bpdep "boshprovisioner/deployment"
8
+ bpinstupd "boshprovisioner/instance/updater"
9
+ bpvm "boshprovisioner/vm"
10
+ )
11
+
12
+ const instanceProvisionerLogTag = "InstanceProvisioner"
13
+
14
+ type InstanceProvisioner struct {
15
+ instanceUpdaterFactory bpinstupd.UpdaterFactory
16
+ vmProvisioner bpvm.VMProvisioner
17
+ logger boshlog.Logger
18
+ }
19
+
20
+ func NewInstanceProvisioner(
21
+ instanceUpdaterFactory bpinstupd.UpdaterFactory,
22
+ vmProvisioner bpvm.VMProvisioner,
23
+ logger boshlog.Logger,
24
+ ) InstanceProvisioner {
25
+ return InstanceProvisioner{
26
+ instanceUpdaterFactory: instanceUpdaterFactory,
27
+ vmProvisioner: vmProvisioner,
28
+ logger: logger,
29
+ }
30
+ }
31
+
32
+ func (p InstanceProvisioner) Provision(job bpdep.Job, instance bpdep.Instance) error {
33
+ p.logger.Debug(instanceProvisionerLogTag, "Updating instance")
34
+
35
+ vm, err := p.vmProvisioner.Provision(instance)
36
+ if err != nil {
37
+ return bosherr.WrapError(err, "Provisioning agent")
38
+ }
39
+
40
+ updater := p.instanceUpdaterFactory.NewUpdater(vm.AgentClient(), job, instance)
41
+
42
+ err = updater.Update()
43
+ if err != nil {
44
+ return bosherr.WrapError(err, "Updating instance %d", instance.Index)
45
+ }
46
+
47
+ return nil
48
+ }