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,103 @@
|
|
|
1
|
+
package updater_test
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"errors"
|
|
5
|
+
"time"
|
|
6
|
+
|
|
7
|
+
boshaction "bosh/agent/action"
|
|
8
|
+
boshlog "bosh/logger"
|
|
9
|
+
. "github.com/onsi/ginkgo"
|
|
10
|
+
. "github.com/onsi/gomega"
|
|
11
|
+
|
|
12
|
+
fakebpagclient "boshprovisioner/agent/client/fakes"
|
|
13
|
+
. "boshprovisioner/instance/updater"
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
var _ = Describe("Waiter", func() {
|
|
17
|
+
var (
|
|
18
|
+
sleptTimes []time.Duration
|
|
19
|
+
agentClient *fakebpagclient.FakeClient
|
|
20
|
+
waiter Waiter
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
const (
|
|
24
|
+
firstTimeGap = 5000 * time.Millisecond
|
|
25
|
+
subsequentTimeGap = 1000 * time.Millisecond
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
BeforeEach(func() {
|
|
29
|
+
sleptTimes = []time.Duration{}
|
|
30
|
+
sleepFunc := func(d time.Duration) { sleptTimes = append(sleptTimes, d) }
|
|
31
|
+
|
|
32
|
+
agentClient = &fakebpagclient.FakeClient{}
|
|
33
|
+
logger := boshlog.NewLogger(boshlog.LevelNone)
|
|
34
|
+
waiter = NewWaiter(5000, 14000, sleepFunc, agentClient, logger)
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
Describe("Wait", func() {
|
|
38
|
+
Context("when agent reports its state as 'running' after some time", func() {
|
|
39
|
+
BeforeEach(func() {
|
|
40
|
+
agentClient.GetStateStates = []boshaction.GetStateV1ApplySpec{
|
|
41
|
+
boshaction.GetStateV1ApplySpec{JobState: "not-running"},
|
|
42
|
+
boshaction.GetStateV1ApplySpec{JobState: "not-running"},
|
|
43
|
+
boshaction.GetStateV1ApplySpec{JobState: "not-running"},
|
|
44
|
+
boshaction.GetStateV1ApplySpec{JobState: "not-running"},
|
|
45
|
+
boshaction.GetStateV1ApplySpec{JobState: "not-running"}, // 4
|
|
46
|
+
boshaction.GetStateV1ApplySpec{JobState: "running"},
|
|
47
|
+
}
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
It("waits for instance to become running checking every interval", func() {
|
|
51
|
+
err := waiter.Wait()
|
|
52
|
+
Expect(err).ToNot(HaveOccurred())
|
|
53
|
+
|
|
54
|
+
Expect(sleptTimes).To(Equal([]time.Duration{
|
|
55
|
+
firstTimeGap,
|
|
56
|
+
subsequentTimeGap,
|
|
57
|
+
subsequentTimeGap,
|
|
58
|
+
subsequentTimeGap,
|
|
59
|
+
subsequentTimeGap, // 4
|
|
60
|
+
subsequentTimeGap,
|
|
61
|
+
}))
|
|
62
|
+
})
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
Context("when agent does not report its state as 'running' after some time", func() {
|
|
66
|
+
BeforeEach(func() {
|
|
67
|
+
agentClient.GetStateState = boshaction.GetStateV1ApplySpec{JobState: "not-running"}
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
It("return error after trying as many times as possible", func() {
|
|
71
|
+
err := waiter.Wait()
|
|
72
|
+
Expect(err).To(Equal(ErrNotRunning))
|
|
73
|
+
|
|
74
|
+
Expect(sleptTimes).To(Equal([]time.Duration{
|
|
75
|
+
firstTimeGap,
|
|
76
|
+
subsequentTimeGap,
|
|
77
|
+
subsequentTimeGap,
|
|
78
|
+
subsequentTimeGap,
|
|
79
|
+
subsequentTimeGap, // 4
|
|
80
|
+
subsequentTimeGap,
|
|
81
|
+
subsequentTimeGap,
|
|
82
|
+
subsequentTimeGap,
|
|
83
|
+
subsequentTimeGap, // 8
|
|
84
|
+
subsequentTimeGap,
|
|
85
|
+
}))
|
|
86
|
+
})
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
Context("when agent state cannot be retrieved", func() {
|
|
90
|
+
BeforeEach(func() {
|
|
91
|
+
agentClient.GetStateErr = errors.New("fake-get-state-err")
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
It("returns error indicated failure to retrieve state", func() {
|
|
95
|
+
err := waiter.Wait()
|
|
96
|
+
Expect(err).To(HaveOccurred())
|
|
97
|
+
Expect(err.Error()).To(ContainSubstring("fake-get-state-err"))
|
|
98
|
+
|
|
99
|
+
Expect(sleptTimes).To(Equal([]time.Duration{firstTimeGap}))
|
|
100
|
+
})
|
|
101
|
+
})
|
|
102
|
+
})
|
|
103
|
+
})
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"encoding/json"
|
|
5
|
+
|
|
6
|
+
bosherr "bosh/errors"
|
|
7
|
+
boshsys "bosh/system"
|
|
8
|
+
|
|
9
|
+
bpprov "boshprovisioner/provisioner"
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
type Config struct {
|
|
13
|
+
ManifestPath string `json:"manifest_path"`
|
|
14
|
+
|
|
15
|
+
// Assets dir is used as a temporary location to transfer files from host to guest.
|
|
16
|
+
// It will not be created since assets already must be present.
|
|
17
|
+
AssetsDir string `json:"assets_dir"`
|
|
18
|
+
|
|
19
|
+
// Repos dir is mainly used to record what was placed in the blobstore.
|
|
20
|
+
// It will be created if it does not exist.
|
|
21
|
+
ReposDir string `json:"repos_dir"`
|
|
22
|
+
|
|
23
|
+
// e.g. "https://user:password@127.0.0.1:4321/agent"
|
|
24
|
+
Mbus string `json:"mbus"`
|
|
25
|
+
|
|
26
|
+
Blobstore bpprov.BlobstoreConfig `json:"blobstore"`
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
func NewConfigFromPath(path string, fs boshsys.FileSystem) (Config, error) {
|
|
30
|
+
var config Config
|
|
31
|
+
|
|
32
|
+
bytes, err := fs.ReadFile(path)
|
|
33
|
+
if err != nil {
|
|
34
|
+
return config, bosherr.WrapError(err, "Reading config %s", path)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
err = json.Unmarshal(bytes, &config)
|
|
38
|
+
if err != nil {
|
|
39
|
+
return config, bosherr.WrapError(err, "Unmarshalling config")
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
err = config.validate()
|
|
43
|
+
if err != nil {
|
|
44
|
+
return config, bosherr.WrapError(err, "Validating config")
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return config, nil
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
func (c Config) validate() error {
|
|
51
|
+
if c.ManifestPath == "" {
|
|
52
|
+
return bosherr.New("Must provide non-empty manifest_path")
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if c.AssetsDir == "" {
|
|
56
|
+
return bosherr.New("Must provide non-empty assets_dir")
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if c.ReposDir == "" {
|
|
60
|
+
return bosherr.New("Must provide non-empty repos_dir")
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if c.Mbus == "" {
|
|
64
|
+
return bosherr.New("Must provide non-empty mbus")
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if c.Blobstore.Type != bpprov.BlobstoreConfigTypeLocal {
|
|
68
|
+
return bosherr.New("Blobstore type must be local")
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
err := c.Blobstore.Validate()
|
|
72
|
+
if err != nil {
|
|
73
|
+
return bosherr.WrapError(err, "Validating blobstore configuration")
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return nil
|
|
77
|
+
}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"flag"
|
|
5
|
+
"os"
|
|
6
|
+
|
|
7
|
+
boshblob "bosh/blobstore"
|
|
8
|
+
boshlog "bosh/logger"
|
|
9
|
+
boshsys "bosh/system"
|
|
10
|
+
boshuuid "bosh/uuid"
|
|
11
|
+
|
|
12
|
+
bpdep "boshprovisioner/deployment"
|
|
13
|
+
bpdload "boshprovisioner/downloader"
|
|
14
|
+
bpeventlog "boshprovisioner/eventlog"
|
|
15
|
+
bptplcomp "boshprovisioner/instance/templatescompiler"
|
|
16
|
+
bpinstupd "boshprovisioner/instance/updater"
|
|
17
|
+
bppkgscomp "boshprovisioner/packagescompiler"
|
|
18
|
+
bpprov "boshprovisioner/provisioner"
|
|
19
|
+
bprel "boshprovisioner/release"
|
|
20
|
+
bpreljob "boshprovisioner/release/job"
|
|
21
|
+
bptar "boshprovisioner/tar"
|
|
22
|
+
bpvm "boshprovisioner/vm"
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
const mainLogTag = "main"
|
|
26
|
+
|
|
27
|
+
var (
|
|
28
|
+
configPathOpt = flag.String("configPath", "", "Path to configuration file")
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
func main() {
|
|
32
|
+
logger, fs, runner, uuidGen := basicDeps()
|
|
33
|
+
|
|
34
|
+
defer logger.HandlePanic("Main")
|
|
35
|
+
|
|
36
|
+
flag.Parse()
|
|
37
|
+
|
|
38
|
+
config, err := NewConfigFromPath(*configPathOpt, fs)
|
|
39
|
+
if err != nil {
|
|
40
|
+
logger.Error(mainLogTag, "Loading config %s", err.Error())
|
|
41
|
+
os.Exit(1)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
localBlobstore := boshblob.NewLocalBlobstore(
|
|
45
|
+
fs,
|
|
46
|
+
uuidGen,
|
|
47
|
+
config.Blobstore.Options,
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
blobstore := boshblob.NewSHA1VerifiableBlobstore(localBlobstore)
|
|
51
|
+
|
|
52
|
+
downloader := bpdload.NewDefaultMuxDownloader(blobstore, fs, logger)
|
|
53
|
+
|
|
54
|
+
extractor := bptar.NewCmdExtractor(runner, fs, logger)
|
|
55
|
+
|
|
56
|
+
compressor := bptar.NewCmdCompressor(runner, fs, logger)
|
|
57
|
+
|
|
58
|
+
renderedArchivesCompiler := bptplcomp.NewRenderedArchivesCompiler(
|
|
59
|
+
fs,
|
|
60
|
+
runner,
|
|
61
|
+
compressor,
|
|
62
|
+
logger,
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
jobReaderFactory := bpreljob.NewReaderFactory(
|
|
66
|
+
downloader,
|
|
67
|
+
extractor,
|
|
68
|
+
fs,
|
|
69
|
+
logger,
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
err = fs.MkdirAll(config.ReposDir, os.ModeDir)
|
|
73
|
+
if err != nil {
|
|
74
|
+
logger.Error(mainLogTag, "Failed to create repos dir %s", err.Error())
|
|
75
|
+
os.Exit(1)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
reposFactory := NewReposFactory(config.ReposDir, fs, downloader, blobstore, logger)
|
|
79
|
+
|
|
80
|
+
blobstoreProvisioner := bpprov.NewBlobstoreProvisioner(
|
|
81
|
+
fs,
|
|
82
|
+
config.Blobstore,
|
|
83
|
+
logger,
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
err = blobstoreProvisioner.Provision()
|
|
87
|
+
if err != nil {
|
|
88
|
+
logger.Error(mainLogTag, "Failed to provision blobstore %s", err.Error())
|
|
89
|
+
os.Exit(1)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
templatesCompiler := bptplcomp.NewConcreteTemplatesCompiler(
|
|
93
|
+
renderedArchivesCompiler,
|
|
94
|
+
jobReaderFactory,
|
|
95
|
+
reposFactory.NewJobsRepo(),
|
|
96
|
+
reposFactory.NewTemplateToJobRepo(),
|
|
97
|
+
reposFactory.NewRuntimePackagesRepo(),
|
|
98
|
+
reposFactory.NewTemplatesRepo(),
|
|
99
|
+
blobstore,
|
|
100
|
+
logger,
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
eventLog := bpeventlog.NewLog(logger)
|
|
104
|
+
|
|
105
|
+
packagesCompilerFactory := bppkgscomp.NewConcretePackagesCompilerFactory(
|
|
106
|
+
reposFactory.NewPackagesRepo(),
|
|
107
|
+
reposFactory.NewCompiledPackagesRepo(),
|
|
108
|
+
blobstore,
|
|
109
|
+
eventLog,
|
|
110
|
+
logger,
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
updaterFactory := bpinstupd.NewUpdaterFactory(
|
|
114
|
+
templatesCompiler,
|
|
115
|
+
packagesCompilerFactory,
|
|
116
|
+
eventLog,
|
|
117
|
+
logger,
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
releaseReaderFactory := bprel.NewReaderFactory(
|
|
121
|
+
downloader,
|
|
122
|
+
extractor,
|
|
123
|
+
fs,
|
|
124
|
+
logger,
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
deploymentReaderFactory := bpdep.NewReaderFactory(fs, logger)
|
|
128
|
+
|
|
129
|
+
vmProvisionerFactory := bpvm.NewVMProvisionerFactory(
|
|
130
|
+
fs,
|
|
131
|
+
runner,
|
|
132
|
+
config.AssetsDir,
|
|
133
|
+
config.Mbus,
|
|
134
|
+
config.Blobstore.AsMap(),
|
|
135
|
+
eventLog,
|
|
136
|
+
logger,
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
vmProvisioner := vmProvisionerFactory.NewVMProvisioner()
|
|
140
|
+
|
|
141
|
+
releaseCompiler := bpprov.NewReleaseCompiler(
|
|
142
|
+
reposFactory.NewBlobstoreReleasesRepo(),
|
|
143
|
+
releaseReaderFactory,
|
|
144
|
+
packagesCompilerFactory,
|
|
145
|
+
templatesCompiler,
|
|
146
|
+
vmProvisioner,
|
|
147
|
+
eventLog,
|
|
148
|
+
logger,
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
instanceProvisioner := bpprov.NewInstanceProvisioner(
|
|
152
|
+
updaterFactory,
|
|
153
|
+
vmProvisioner,
|
|
154
|
+
logger,
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
deploymentProvisioner := bpprov.NewDeploymentProvisioner(
|
|
158
|
+
config.ManifestPath,
|
|
159
|
+
deploymentReaderFactory,
|
|
160
|
+
releaseCompiler,
|
|
161
|
+
instanceProvisioner,
|
|
162
|
+
eventLog,
|
|
163
|
+
logger,
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
err = deploymentProvisioner.Provision()
|
|
167
|
+
if err != nil {
|
|
168
|
+
logger.Error(mainLogTag, "Failed to provision deployment %s", err.Error())
|
|
169
|
+
os.Exit(1)
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
func basicDeps() (boshlog.Logger, boshsys.FileSystem, boshsys.CmdRunner, boshuuid.Generator) {
|
|
174
|
+
logger := boshlog.NewWriterLogger(boshlog.LevelDebug, os.Stderr, os.Stderr)
|
|
175
|
+
|
|
176
|
+
fs := boshsys.NewOsFileSystem(logger)
|
|
177
|
+
|
|
178
|
+
runner := boshsys.NewExecCmdRunner(logger)
|
|
179
|
+
|
|
180
|
+
uuidGen := boshuuid.NewGenerator()
|
|
181
|
+
|
|
182
|
+
return logger, fs, runner, uuidGen
|
|
183
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"path/filepath"
|
|
5
|
+
|
|
6
|
+
boshblob "bosh/blobstore"
|
|
7
|
+
boshlog "bosh/logger"
|
|
8
|
+
boshsys "bosh/system"
|
|
9
|
+
|
|
10
|
+
bpdload "boshprovisioner/downloader"
|
|
11
|
+
bpindex "boshprovisioner/index"
|
|
12
|
+
bpjobsrepo "boshprovisioner/instance/templatescompiler/jobsrepo"
|
|
13
|
+
bptplsrepo "boshprovisioner/instance/templatescompiler/templatesrepo"
|
|
14
|
+
bpcpkgsrepo "boshprovisioner/packagescompiler/compiledpackagesrepo"
|
|
15
|
+
bppkgsrepo "boshprovisioner/packagescompiler/packagesrepo"
|
|
16
|
+
bprelrepo "boshprovisioner/releasesrepo"
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
type ReposFactory struct {
|
|
20
|
+
dirPath string
|
|
21
|
+
fs boshsys.FileSystem
|
|
22
|
+
downloader bpdload.Downloader
|
|
23
|
+
blobstore boshblob.Blobstore
|
|
24
|
+
logger boshlog.Logger
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
func NewReposFactory(
|
|
28
|
+
dirPath string,
|
|
29
|
+
fs boshsys.FileSystem,
|
|
30
|
+
downloader bpdload.Downloader,
|
|
31
|
+
blobstore boshblob.Blobstore,
|
|
32
|
+
logger boshlog.Logger,
|
|
33
|
+
) ReposFactory {
|
|
34
|
+
return ReposFactory{
|
|
35
|
+
dirPath: dirPath,
|
|
36
|
+
fs: fs,
|
|
37
|
+
downloader: downloader,
|
|
38
|
+
blobstore: blobstore,
|
|
39
|
+
logger: logger,
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
func (f ReposFactory) NewBlobstoreReleasesRepo() bprelrepo.BlobstoreReleasesRepository {
|
|
44
|
+
return bprelrepo.NewBlobstoreReleasesRepository(
|
|
45
|
+
f.downloader,
|
|
46
|
+
f.blobstore,
|
|
47
|
+
f.newIndex("releases"),
|
|
48
|
+
f.logger,
|
|
49
|
+
)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
func (f ReposFactory) NewJobsRepo() bpjobsrepo.JobsRepository {
|
|
53
|
+
return bpjobsrepo.NewConcreteJobsRepository(
|
|
54
|
+
f.newIndex("jobs"),
|
|
55
|
+
f.logger,
|
|
56
|
+
)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
func (f ReposFactory) NewTemplateToJobRepo() bpjobsrepo.TemplateToJobRepository {
|
|
60
|
+
return bpjobsrepo.NewConcreteTemplateToJobRepository(
|
|
61
|
+
f.newIndex("templates_to_job"),
|
|
62
|
+
f.logger,
|
|
63
|
+
)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
func (f ReposFactory) NewRuntimePackagesRepo() bpjobsrepo.RuntimePackagesRepository {
|
|
67
|
+
return bpjobsrepo.NewConcreteRuntimePackagesRepository(
|
|
68
|
+
f.newIndex("runtime_packages"),
|
|
69
|
+
f.logger,
|
|
70
|
+
)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
func (f ReposFactory) NewTemplatesRepo() bptplsrepo.TemplatesRepository {
|
|
74
|
+
return bptplsrepo.NewConcreteTemplatesRepository(
|
|
75
|
+
f.newIndex("templates"),
|
|
76
|
+
f.logger,
|
|
77
|
+
)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
func (f ReposFactory) NewPackagesRepo() bppkgsrepo.PackagesRepository {
|
|
81
|
+
return bppkgsrepo.NewConcretePackagesRepository(
|
|
82
|
+
f.newIndex("packages"),
|
|
83
|
+
f.logger,
|
|
84
|
+
)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
func (f ReposFactory) NewCompiledPackagesRepo() bpcpkgsrepo.CompiledPackagesRepository {
|
|
88
|
+
return bpcpkgsrepo.NewConcreteCompiledPackagesRepository(
|
|
89
|
+
f.newIndex("compiled_packages"),
|
|
90
|
+
f.logger,
|
|
91
|
+
)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
func (f ReposFactory) newIndex(name string) bpindex.Index {
|
|
95
|
+
return bpindex.NewFileIndex(filepath.Join(f.dirPath, name+".json"), f.fs)
|
|
96
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
package compiledpackagesrepo
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
bprel "boshprovisioner/release"
|
|
5
|
+
)
|
|
6
|
+
|
|
7
|
+
type CompiledPackageRecord struct {
|
|
8
|
+
BlobID string
|
|
9
|
+
SHA1 string
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// CompiledPackagesRepository maintains list of compiled packages as blobs
|
|
13
|
+
// todo account for stemcell
|
|
14
|
+
type CompiledPackagesRepository interface {
|
|
15
|
+
Find(bprel.Package) (CompiledPackageRecord, bool, error)
|
|
16
|
+
Save(bprel.Package, CompiledPackageRecord) error
|
|
17
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
package compiledpackagesrepo
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
bosherr "bosh/errors"
|
|
5
|
+
boshlog "bosh/logger"
|
|
6
|
+
|
|
7
|
+
bpindex "boshprovisioner/index"
|
|
8
|
+
bprel "boshprovisioner/release"
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
type CCPRepository struct {
|
|
12
|
+
index bpindex.Index
|
|
13
|
+
logger boshlog.Logger
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
type packageToCompiledPackageKey struct {
|
|
17
|
+
PackageName string
|
|
18
|
+
PackageVersion string
|
|
19
|
+
|
|
20
|
+
// Fingerprint of a package captures its dependenices
|
|
21
|
+
PackageFingerprint string
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
func NewConcreteCompiledPackagesRepository(
|
|
25
|
+
index bpindex.Index,
|
|
26
|
+
logger boshlog.Logger,
|
|
27
|
+
) CCPRepository {
|
|
28
|
+
return CCPRepository{index: index, logger: logger}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
func (r CCPRepository) Find(pkg bprel.Package) (CompiledPackageRecord, bool, error) {
|
|
32
|
+
var record CompiledPackageRecord
|
|
33
|
+
|
|
34
|
+
err := r.index.Find(r.pkgKey(pkg), &record)
|
|
35
|
+
if err != nil {
|
|
36
|
+
if err == bpindex.ErrNotFound {
|
|
37
|
+
return record, false, nil
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return record, false, bosherr.WrapError(err, "Finding compiled package")
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return record, true, nil
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
func (r CCPRepository) Save(pkg bprel.Package, record CompiledPackageRecord) error {
|
|
47
|
+
err := r.index.Save(r.pkgKey(pkg), record)
|
|
48
|
+
if err != nil {
|
|
49
|
+
return bosherr.WrapError(err, "Saving compiled package")
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return nil
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
func (r CCPRepository) pkgKey(pkg bprel.Package) packageToCompiledPackageKey {
|
|
56
|
+
return packageToCompiledPackageKey{
|
|
57
|
+
PackageName: pkg.Name,
|
|
58
|
+
PackageVersion: pkg.Version,
|
|
59
|
+
PackageFingerprint: pkg.Fingerprint,
|
|
60
|
+
}
|
|
61
|
+
}
|