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.
- checksums.yaml +7 -0
- data/.gitignore +12 -0
- data/.gitmodules +6 -0
- data/Gemfile +3 -0
- data/LICENSE +20 -0
- data/README.md +73 -0
- data/Rakefile +2 -0
- data/dev/.gitignore +1 -0
- data/dev/Vagrantfile +30 -0
- data/dev/example-bosh-manifest.yml +188 -0
- data/dev/example-winston-manifest.yml +70 -0
- data/go/.gitignore +11 -0
- data/go/bin/build +10 -0
- data/go/bin/build-linux-amd64 +9 -0
- data/go/bin/env +13 -0
- data/go/bin/go +5 -0
- data/go/bin/golint +19 -0
- data/go/bin/test +37 -0
- data/go/src/boshprovisioner/agent/client/client_interface.go +73 -0
- data/go/src/boshprovisioner/agent/client/fakes/fake_client.go +81 -0
- data/go/src/boshprovisioner/agent/client/http_client.go +299 -0
- data/go/src/boshprovisioner/agent/client/http_client_envelope.go +107 -0
- data/go/src/boshprovisioner/deployment/deployment.go +221 -0
- data/go/src/boshprovisioner/deployment/instance.go +54 -0
- data/go/src/boshprovisioner/deployment/manifest/deployment.go +80 -0
- data/go/src/boshprovisioner/deployment/manifest/ips.go +23 -0
- data/go/src/boshprovisioner/deployment/manifest/manifest.go +143 -0
- data/go/src/boshprovisioner/deployment/manifest/manifest_suite_test.go +13 -0
- data/go/src/boshprovisioner/deployment/manifest/manifest_test.go +86 -0
- data/go/src/boshprovisioner/deployment/manifest/syntax_validator.go +186 -0
- data/go/src/boshprovisioner/deployment/manifest/watch_time.go +47 -0
- data/go/src/boshprovisioner/deployment/manifest_reader.go +46 -0
- data/go/src/boshprovisioner/deployment/reader_factory.go +25 -0
- data/go/src/boshprovisioner/deployment/semantic_validator.go +111 -0
- data/go/src/boshprovisioner/downloader/blobstore_downloader.go +55 -0
- data/go/src/boshprovisioner/downloader/default_mux_downloader.go +22 -0
- data/go/src/boshprovisioner/downloader/downloader_interface.go +6 -0
- data/go/src/boshprovisioner/downloader/http_downloader.go +53 -0
- data/go/src/boshprovisioner/downloader/local_fs_downloader.go +48 -0
- data/go/src/boshprovisioner/downloader/mux_downloader.go +69 -0
- data/go/src/boshprovisioner/eventlog/log.go +72 -0
- data/go/src/boshprovisioner/eventlog/stage.go +39 -0
- data/go/src/boshprovisioner/eventlog/task.go +58 -0
- data/go/src/boshprovisioner/index/file_index.go +289 -0
- data/go/src/boshprovisioner/index/file_index_test.go +296 -0
- data/go/src/boshprovisioner/index/index_interface.go +18 -0
- data/go/src/boshprovisioner/index/index_suite_test.go +13 -0
- data/go/src/boshprovisioner/instance/templatescompiler/concrete_templates_compiler.go +273 -0
- data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/erb_renderer.go +117 -0
- data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/erbrenderer_suite_test.go +13 -0
- data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/render_properties.go +77 -0
- data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/render_properties_test.go +142 -0
- data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/template_evaluation_context.go +85 -0
- data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/template_evaluation_context_rb.go +155 -0
- data/go/src/boshprovisioner/instance/templatescompiler/jobsrepo/concrete_jobs_repository.go +64 -0
- data/go/src/boshprovisioner/instance/templatescompiler/jobsrepo/concrete_runtime_packages_repository.go +105 -0
- data/go/src/boshprovisioner/instance/templatescompiler/jobsrepo/concrete_template_to_job_repository.go +76 -0
- data/go/src/boshprovisioner/instance/templatescompiler/jobsrepo/jobs_repository_interface.go +31 -0
- data/go/src/boshprovisioner/instance/templatescompiler/rendered_archives_compiler.go +81 -0
- data/go/src/boshprovisioner/instance/templatescompiler/templates_compiler_interface.go +20 -0
- data/go/src/boshprovisioner/instance/templatescompiler/templatesrepo/ct_repository.go +54 -0
- data/go/src/boshprovisioner/instance/templatescompiler/templatesrepo/templates_repository_interface.go +16 -0
- data/go/src/boshprovisioner/instance/updater/applier/applier.go +93 -0
- data/go/src/boshprovisioner/instance/updater/applier/empty_state.go +66 -0
- data/go/src/boshprovisioner/instance/updater/applier/job_state.go +178 -0
- data/go/src/boshprovisioner/instance/updater/drainer.go +72 -0
- data/go/src/boshprovisioner/instance/updater/preparer.go +39 -0
- data/go/src/boshprovisioner/instance/updater/starter.go +36 -0
- data/go/src/boshprovisioner/instance/updater/stopper.go +36 -0
- data/go/src/boshprovisioner/instance/updater/updater.go +102 -0
- data/go/src/boshprovisioner/instance/updater/updater_factory.go +83 -0
- data/go/src/boshprovisioner/instance/updater/updater_suite_test.go +13 -0
- data/go/src/boshprovisioner/instance/updater/waiter.go +77 -0
- data/go/src/boshprovisioner/instance/updater/waiter_test.go +103 -0
- data/go/src/boshprovisioner/main/config.go +77 -0
- data/go/src/boshprovisioner/main/main.go +183 -0
- data/go/src/boshprovisioner/main/repos_factory.go +96 -0
- data/go/src/boshprovisioner/packagescompiler/compiledpackagesrepo/compiled_packages_repository_interface.go +17 -0
- data/go/src/boshprovisioner/packagescompiler/compiledpackagesrepo/concrete_compiled_packages_repository.go +61 -0
- data/go/src/boshprovisioner/packagescompiler/concrete_packages_compiler.go +179 -0
- data/go/src/boshprovisioner/packagescompiler/concrete_packages_compiler_factory.go +48 -0
- data/go/src/boshprovisioner/packagescompiler/packages_compiler_interface.go +20 -0
- data/go/src/boshprovisioner/packagescompiler/packagesrepo/concrete_packages_repository.go +65 -0
- data/go/src/boshprovisioner/packagescompiler/packagesrepo/packages_repository_interface.go +16 -0
- data/go/src/boshprovisioner/provisioner/blobstore_config.go +65 -0
- data/go/src/boshprovisioner/provisioner/blobstore_provisioner.go +38 -0
- data/go/src/boshprovisioner/provisioner/deployment_provisioner.go +97 -0
- data/go/src/boshprovisioner/provisioner/instance_provisioner.go +48 -0
- data/go/src/boshprovisioner/provisioner/release_compiler.go +133 -0
- data/go/src/boshprovisioner/release/job/job.go +86 -0
- data/go/src/boshprovisioner/release/job/manifest/manifest.go +79 -0
- data/go/src/boshprovisioner/release/job/manifest/manifest_suite_test.go +13 -0
- data/go/src/boshprovisioner/release/job/manifest/manifest_test.go +42 -0
- data/go/src/boshprovisioner/release/job/manifest/syntax_validator.go +43 -0
- data/go/src/boshprovisioner/release/job/reader_factory.go +34 -0
- data/go/src/boshprovisioner/release/job/tar_reader.go +133 -0
- data/go/src/boshprovisioner/release/manifest/manifest.go +96 -0
- data/go/src/boshprovisioner/release/manifest_reader.go +29 -0
- data/go/src/boshprovisioner/release/reader_factory.go +34 -0
- data/go/src/boshprovisioner/release/release.go +144 -0
- data/go/src/boshprovisioner/release/release_suite_test.go +13 -0
- data/go/src/boshprovisioner/release/release_test.go +129 -0
- data/go/src/boshprovisioner/release/tar_reader.go +139 -0
- data/go/src/boshprovisioner/releasesrepo/blobstore_releases_repository.go +114 -0
- data/go/src/boshprovisioner/releasesrepo/releases_repository_interface.go +15 -0
- data/go/src/boshprovisioner/tar/cmd_compressor.go +68 -0
- data/go/src/boshprovisioner/tar/cmd_extractor.go +47 -0
- data/go/src/boshprovisioner/tar/compressor_interface.go +6 -0
- data/go/src/boshprovisioner/tar/extractor_interface.go +6 -0
- data/go/src/boshprovisioner/util/string_keyed.go +70 -0
- data/go/src/boshprovisioner/vm/agent_provisioner.go +266 -0
- data/go/src/boshprovisioner/vm/asset_manager.go +61 -0
- data/go/src/boshprovisioner/vm/deps_provisioner.go +92 -0
- data/go/src/boshprovisioner/vm/monit_provisioner.go +83 -0
- data/go/src/boshprovisioner/vm/runit_provisioner.go +225 -0
- data/go/src/boshprovisioner/vm/simple_cmds.go +54 -0
- data/go/src/boshprovisioner/vm/vcap_user_provisioner.go +120 -0
- data/go/src/boshprovisioner/vm/vm.go +19 -0
- data/go/src/boshprovisioner/vm/vm_provisioner.go +57 -0
- data/go/src/boshprovisioner/vm/vm_provisioner_factory.go +97 -0
- data/lib/vagrant-bosh/asset_uploader.rb +53 -0
- data/lib/vagrant-bosh/assets/agent/agent-log +5 -0
- data/lib/vagrant-bosh/assets/agent/agent-run +12 -0
- data/lib/vagrant-bosh/assets/agent/agent.cert +18 -0
- data/lib/vagrant-bosh/assets/agent/agent.json +9 -0
- data/lib/vagrant-bosh/assets/agent/agent.key +27 -0
- data/lib/vagrant-bosh/assets/agent/bosh-agent +0 -0
- data/lib/vagrant-bosh/assets/agent/bosh-agent-rc +18 -0
- data/lib/vagrant-bosh/assets/agent/bosh-blobstore-dav +0 -0
- data/lib/vagrant-bosh/assets/monit/monit +0 -0
- data/lib/vagrant-bosh/assets/monit/monit-log +5 -0
- data/lib/vagrant-bosh/assets/monit/monit-run +9 -0
- data/lib/vagrant-bosh/assets/monit/monitrc +8 -0
- data/lib/vagrant-bosh/assets/provisioner +0 -0
- data/lib/vagrant-bosh/bootstrapper.rb +59 -0
- data/lib/vagrant-bosh/communicator.rb +50 -0
- data/lib/vagrant-bosh/config.rb +15 -0
- data/lib/vagrant-bosh/errors.rb +11 -0
- data/lib/vagrant-bosh/plugin.rb +25 -0
- data/lib/vagrant-bosh/provisioner.rb +46 -0
- data/lib/vagrant-bosh/provisioner_tracker.rb +41 -0
- data/lib/vagrant-bosh/ui.rb +77 -0
- data/lib/vagrant-bosh/version.rb +5 -0
- data/lib/vagrant-bosh.rb +15 -0
- data/templates/locales/en.yml +15 -0
- data/vagrant-bosh.gemspec +20 -0
- 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
|
+
}
|