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,70 @@
|
|
|
1
|
+
package util
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"reflect"
|
|
5
|
+
|
|
6
|
+
bosherr "bosh/errors"
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
type stringKeyed struct{}
|
|
10
|
+
|
|
11
|
+
func NewStringKeyed() stringKeyed { return stringKeyed{} }
|
|
12
|
+
|
|
13
|
+
// convertMapToStringKeyMap converts map to string keyed map.
|
|
14
|
+
func (sk stringKeyed) ConvertMap(m map[interface{}]interface{}) (map[string]interface{}, error) {
|
|
15
|
+
result := map[string]interface{}{}
|
|
16
|
+
|
|
17
|
+
for name, val := range m {
|
|
18
|
+
nameStr, ok := name.(string)
|
|
19
|
+
if !ok {
|
|
20
|
+
return result, bosherr.New("Map contains non-string key %v", name)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
convertedVal, err := sk.ConvertInterface(val)
|
|
24
|
+
if err != nil {
|
|
25
|
+
return result, err
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
result[nameStr] = convertedVal
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return result, nil
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
func (sk stringKeyed) ConvertInterface(val interface{}) (interface{}, error) {
|
|
35
|
+
if val == nil {
|
|
36
|
+
return nil, nil
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
switch reflect.TypeOf(val).Kind() {
|
|
40
|
+
case reflect.Map:
|
|
41
|
+
valMap, ok := val.(map[interface{}]interface{})
|
|
42
|
+
if !ok {
|
|
43
|
+
return nil, bosherr.New("Converting map %v", val)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return sk.ConvertMap(valMap)
|
|
47
|
+
|
|
48
|
+
case reflect.Slice:
|
|
49
|
+
valSlice, ok := val.([]interface{})
|
|
50
|
+
if !ok {
|
|
51
|
+
return nil, bosherr.New("Converting slice %v", val)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
slice := make([]interface{}, len(valSlice))
|
|
55
|
+
|
|
56
|
+
for i, v := range valSlice {
|
|
57
|
+
convertedVal, err := sk.ConvertInterface(v)
|
|
58
|
+
if err != nil {
|
|
59
|
+
return nil, err
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
slice[i] = convertedVal
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return slice, nil
|
|
66
|
+
|
|
67
|
+
default:
|
|
68
|
+
return val, nil
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
package vm
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"encoding/json"
|
|
5
|
+
"fmt"
|
|
6
|
+
"path/filepath"
|
|
7
|
+
"time"
|
|
8
|
+
|
|
9
|
+
bosherr "bosh/errors"
|
|
10
|
+
boshlog "bosh/logger"
|
|
11
|
+
boshsys "bosh/system"
|
|
12
|
+
|
|
13
|
+
bpagclient "boshprovisioner/agent/client"
|
|
14
|
+
bpdep "boshprovisioner/deployment"
|
|
15
|
+
bpeventlog "boshprovisioner/eventlog"
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
const agentProvisionerLogTag = "AgentProvisioner"
|
|
19
|
+
|
|
20
|
+
// AgentProvisioner places BOSH Agent and Monit onto machine
|
|
21
|
+
// installing needed dependencies beforehand.
|
|
22
|
+
type AgentProvisioner struct {
|
|
23
|
+
fs boshsys.FileSystem
|
|
24
|
+
cmds SimpleCmds
|
|
25
|
+
assetManager AssetManager
|
|
26
|
+
|
|
27
|
+
runitProvisioner RunitProvisioner
|
|
28
|
+
monitProvisioner MonitProvisioner
|
|
29
|
+
|
|
30
|
+
blobstoreConfig map[string]interface{}
|
|
31
|
+
agentURL string
|
|
32
|
+
|
|
33
|
+
eventLog bpeventlog.Log
|
|
34
|
+
logger boshlog.Logger
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
func NewAgentProvisioner(
|
|
38
|
+
fs boshsys.FileSystem,
|
|
39
|
+
cmds SimpleCmds,
|
|
40
|
+
assetManager AssetManager,
|
|
41
|
+
runitProvisioner RunitProvisioner,
|
|
42
|
+
monitProvisioner MonitProvisioner,
|
|
43
|
+
blobstoreConfig map[string]interface{},
|
|
44
|
+
agentURL string,
|
|
45
|
+
eventLog bpeventlog.Log,
|
|
46
|
+
logger boshlog.Logger,
|
|
47
|
+
) AgentProvisioner {
|
|
48
|
+
return AgentProvisioner{
|
|
49
|
+
fs: fs,
|
|
50
|
+
cmds: cmds,
|
|
51
|
+
assetManager: assetManager,
|
|
52
|
+
|
|
53
|
+
runitProvisioner: runitProvisioner,
|
|
54
|
+
monitProvisioner: monitProvisioner,
|
|
55
|
+
|
|
56
|
+
blobstoreConfig: blobstoreConfig,
|
|
57
|
+
agentURL: agentURL,
|
|
58
|
+
|
|
59
|
+
eventLog: eventLog,
|
|
60
|
+
logger: logger,
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
func (p AgentProvisioner) Provision(instance bpdep.Instance) (bpagclient.Client, error) {
|
|
65
|
+
stage := p.eventLog.BeginStage("Updating BOSH agent", 5)
|
|
66
|
+
|
|
67
|
+
task := stage.BeginTask("Placing binaries")
|
|
68
|
+
|
|
69
|
+
err := task.End(p.placeBinaries())
|
|
70
|
+
if err != nil {
|
|
71
|
+
return nil, bosherr.WrapError(err, "Placing agent binaries")
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
task = stage.BeginTask("Configuring settings")
|
|
75
|
+
|
|
76
|
+
err = task.End(p.configureSettings(instance))
|
|
77
|
+
if err != nil {
|
|
78
|
+
return nil, bosherr.WrapError(err, "Configuring settings")
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
task = stage.BeginTask("Configuring monit")
|
|
82
|
+
|
|
83
|
+
err = task.End(p.monitProvisioner.Provision())
|
|
84
|
+
if err != nil {
|
|
85
|
+
return nil, bosherr.WrapError(err, "Provisioning monit")
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
task = stage.BeginTask("Starting")
|
|
89
|
+
|
|
90
|
+
err = task.End(p.runitProvisioner.Provision("agent"))
|
|
91
|
+
if err != nil {
|
|
92
|
+
return nil, bosherr.WrapError(err, "Provisioning agent with runit")
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
agentClient, err := p.buildAgentClient()
|
|
96
|
+
if err != nil {
|
|
97
|
+
return nil, bosherr.WrapError(err, "Building agent client")
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return agentClient, nil
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// placeBinaries places agent/monit binaries into /var/vcap/bosh/bin
|
|
104
|
+
func (p AgentProvisioner) placeBinaries() error {
|
|
105
|
+
binPath := "/var/vcap/bosh/bin"
|
|
106
|
+
|
|
107
|
+
// Implicitly creates /var/vcap/bosh
|
|
108
|
+
err := p.cmds.MkdirP(binPath)
|
|
109
|
+
if err != nil {
|
|
110
|
+
return err
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
binNames := map[string]string{
|
|
114
|
+
"agent/bosh-agent": "bosh-agent",
|
|
115
|
+
"agent/bosh-agent-rc": "bosh-agent-rc",
|
|
116
|
+
"agent/bosh-blobstore-dav": "bosh-blobstore-dav",
|
|
117
|
+
"monit/monit": "monit",
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
for assetName, binName := range binNames {
|
|
121
|
+
err = p.placeBinary(assetName, filepath.Join(binPath, binName))
|
|
122
|
+
if err != nil {
|
|
123
|
+
return err
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return nil
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
func (p AgentProvisioner) placeBinary(name, path string) error {
|
|
131
|
+
err := p.assetManager.Place(name, path)
|
|
132
|
+
if err != nil {
|
|
133
|
+
return bosherr.WrapError(err, "Placing %s binary", name)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
err = p.cmds.ChmodX(path)
|
|
137
|
+
if err != nil {
|
|
138
|
+
return err
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return nil
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
func (p AgentProvisioner) configureSettings(instance bpdep.Instance) error {
|
|
145
|
+
err := p.setUpDataDir()
|
|
146
|
+
if err != nil {
|
|
147
|
+
return bosherr.WrapError(err, "Setting up data dir")
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
err = p.placeConfFiles()
|
|
151
|
+
if err != nil {
|
|
152
|
+
return bosherr.WrapError(err, "Placing conf files")
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
err = p.placeInfSettings(instance)
|
|
156
|
+
if err != nil {
|
|
157
|
+
return bosherr.WrapError(err, "Placing infrastructure settings")
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return nil
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
func (p AgentProvisioner) setUpDataDir() error {
|
|
164
|
+
err := p.cmds.Bash("ln -nsf data/sys /var/vcap/sys")
|
|
165
|
+
if err != nil {
|
|
166
|
+
return err
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// todo hacky data dir
|
|
170
|
+
err = p.cmds.MkdirP("/var/vcap/data")
|
|
171
|
+
if err != nil {
|
|
172
|
+
return err
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
err = p.cmds.Chmod("777", "/var/vcap/data")
|
|
176
|
+
if err != nil {
|
|
177
|
+
return err
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
return nil
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
func (p AgentProvisioner) placeConfFiles() error {
|
|
184
|
+
fileNames := map[string]string{
|
|
185
|
+
"agent/agent.cert": "agent.cert", // Needed by agent HTTP handler
|
|
186
|
+
"agent/agent.key": "agent.key",
|
|
187
|
+
"agent/agent.json": "agent.json",
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
for assetName, fileName := range fileNames {
|
|
191
|
+
err := p.assetManager.Place(assetName, filepath.Join("/var/vcap/bosh/", fileName))
|
|
192
|
+
if err != nil {
|
|
193
|
+
return bosherr.WrapError(err, "Placing %s", fileName)
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return nil
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
func (p AgentProvisioner) placeInfSettings(instance bpdep.Instance) error {
|
|
201
|
+
type h map[string]interface{}
|
|
202
|
+
|
|
203
|
+
netSettings := map[string]h{}
|
|
204
|
+
|
|
205
|
+
for _, netAssoc := range instance.NetworkAssociations {
|
|
206
|
+
netConfig := instance.NetworkConfigurationForNetworkAssociation(netAssoc)
|
|
207
|
+
|
|
208
|
+
netSettings[netAssoc.Network.Name] = h{
|
|
209
|
+
"type": netAssoc.Network.Type,
|
|
210
|
+
"ip": netConfig.IP,
|
|
211
|
+
"netmask": netConfig.Netmask,
|
|
212
|
+
"gateway": netConfig.Gateway,
|
|
213
|
+
|
|
214
|
+
"dns_record_name": instance.DNDRecordName(netAssoc),
|
|
215
|
+
"cloud_properties": h{},
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
settings := h{
|
|
220
|
+
"agent_id": fmt.Sprintf("agent-id-%s-%d", instance.JobName, instance.Index),
|
|
221
|
+
|
|
222
|
+
"vm": h{
|
|
223
|
+
"name": fmt.Sprintf("vm-name-%s-%d", instance.JobName, instance.Index),
|
|
224
|
+
"id": fmt.Sprintf("vm-id-%s-%d", instance.JobName, instance.Index),
|
|
225
|
+
},
|
|
226
|
+
|
|
227
|
+
"networks": netSettings,
|
|
228
|
+
"disks": h{"persistent": h{}},
|
|
229
|
+
|
|
230
|
+
"blobstore": p.blobstoreConfig,
|
|
231
|
+
"mbus": p.agentURL, // todo port can conflict with jobs
|
|
232
|
+
|
|
233
|
+
"env": h{},
|
|
234
|
+
"ntp": []string{},
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
settingsJSON, err := json.Marshal(settings)
|
|
238
|
+
if err != nil {
|
|
239
|
+
return bosherr.WrapError(err, "Marshalling agent infrastructure settings")
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
err = p.fs.WriteFile("/var/vcap/bosh/warden-cpi-agent-env.json", settingsJSON)
|
|
243
|
+
if err != nil {
|
|
244
|
+
return bosherr.WrapError(err, "Writing agent infrastructure settings")
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
return nil
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
func (p AgentProvisioner) buildAgentClient() (bpagclient.Client, error) {
|
|
251
|
+
agentClient, err := bpagclient.NewInsecureHTTPClientWithURI(p.agentURL, p.logger)
|
|
252
|
+
if err != nil {
|
|
253
|
+
return nil, bosherr.WrapError(err, "Building agent client")
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
for i := 0; i < 10; i++ {
|
|
257
|
+
_, err = agentClient.Ping()
|
|
258
|
+
if err == nil {
|
|
259
|
+
return agentClient, nil
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
time.Sleep(1 * time.Second)
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
return nil, err
|
|
266
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
package vm
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"fmt"
|
|
5
|
+
"path/filepath"
|
|
6
|
+
|
|
7
|
+
bosherr "bosh/errors"
|
|
8
|
+
boshlog "bosh/logger"
|
|
9
|
+
boshsys "bosh/system"
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
type AssetManager struct {
|
|
13
|
+
rootDir string
|
|
14
|
+
fs boshsys.FileSystem
|
|
15
|
+
runner boshsys.CmdRunner
|
|
16
|
+
logger boshlog.Logger
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
func NewAssetManager(
|
|
20
|
+
rootDir string,
|
|
21
|
+
fs boshsys.FileSystem,
|
|
22
|
+
runner boshsys.CmdRunner,
|
|
23
|
+
logger boshlog.Logger,
|
|
24
|
+
) AssetManager {
|
|
25
|
+
return AssetManager{
|
|
26
|
+
rootDir: rootDir,
|
|
27
|
+
fs: fs,
|
|
28
|
+
runner: runner,
|
|
29
|
+
logger: logger,
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
func (m AssetManager) Place(name, dstPath string) error {
|
|
34
|
+
srcPath := filepath.Join(m.rootDir, name)
|
|
35
|
+
|
|
36
|
+
if !m.fs.FileExists(srcPath) {
|
|
37
|
+
return bosherr.New("Missing asset %s at %s", name, srcPath)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
tempDir, err := m.fs.TempDir("vm-AssetManager")
|
|
41
|
+
if err != nil {
|
|
42
|
+
return bosherr.WrapError(err, "Creating temp dir")
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
defer m.fs.RemoveAll(tempDir)
|
|
46
|
+
|
|
47
|
+
srcCopyPath := fmt.Sprintf("%s/copy", tempDir)
|
|
48
|
+
|
|
49
|
+
// todo fs.CopyFile leaks fds
|
|
50
|
+
_, _, _, err = m.runner.RunCommand("cp", srcPath, srcCopyPath)
|
|
51
|
+
if err != nil {
|
|
52
|
+
return bosherr.WrapError(err, "Copying asset")
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
err = m.fs.Rename(srcCopyPath, dstPath)
|
|
56
|
+
if err != nil {
|
|
57
|
+
return bosherr.WrapError(err, "Renaming asset %s to %s", name, dstPath)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return nil
|
|
61
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
package vm
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"fmt"
|
|
5
|
+
"strings"
|
|
6
|
+
|
|
7
|
+
bosherr "bosh/errors"
|
|
8
|
+
boshlog "bosh/logger"
|
|
9
|
+
boshsys "bosh/system"
|
|
10
|
+
|
|
11
|
+
bpeventlog "boshprovisioner/eventlog"
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
const (
|
|
15
|
+
depsProvisionerLogTag = "DepsProvisioner"
|
|
16
|
+
runAptGetUpdateMsg = "E: Unable to fetch some archives, maybe run apt-get update"
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
// DepsProvisioner installs basic dependencies for running
|
|
20
|
+
// packaging scripts from BOSH packages. It also installs
|
|
21
|
+
// non-captured dependencies by few common BOSH releases.
|
|
22
|
+
// (e.g. cmake, quota)
|
|
23
|
+
type DepsProvisioner struct {
|
|
24
|
+
runner boshsys.CmdRunner
|
|
25
|
+
eventLog bpeventlog.Log
|
|
26
|
+
logger boshlog.Logger
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
func NewDepsProvisioner(
|
|
30
|
+
runner boshsys.CmdRunner,
|
|
31
|
+
eventLog bpeventlog.Log,
|
|
32
|
+
logger boshlog.Logger,
|
|
33
|
+
) DepsProvisioner {
|
|
34
|
+
return DepsProvisioner{
|
|
35
|
+
runner: runner,
|
|
36
|
+
eventLog: eventLog,
|
|
37
|
+
logger: logger,
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
func (p DepsProvisioner) Provision() error {
|
|
42
|
+
pkgNames := []string{
|
|
43
|
+
// For packaging scripts in BOSH releases
|
|
44
|
+
"build-essential", // 16sec
|
|
45
|
+
"cmake", // 6sec
|
|
46
|
+
"libcap-dev", // 3sec
|
|
47
|
+
|
|
48
|
+
"libbz2-1.0", // noop on precise64 Vagrant box
|
|
49
|
+
"libbz2-dev", // 2sec
|
|
50
|
+
"libxslt-dev", // 2sec
|
|
51
|
+
"libxml2-dev", // 2sec
|
|
52
|
+
|
|
53
|
+
// For warden
|
|
54
|
+
"quota", // 1sec
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
stage := p.eventLog.BeginStage("Installing dependencies", len(pkgNames))
|
|
58
|
+
|
|
59
|
+
for _, pkgName := range pkgNames {
|
|
60
|
+
task := stage.BeginTask(fmt.Sprintf("Package %s", pkgName))
|
|
61
|
+
|
|
62
|
+
err := task.End(p.installPkg(pkgName))
|
|
63
|
+
if err != nil {
|
|
64
|
+
return bosherr.WrapError(err, "Installing %s", pkgName)
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return nil
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
func (p DepsProvisioner) installPkg(name string) error {
|
|
72
|
+
_, _, _, err := p.runner.RunCommand("apt-get", "-y", "install", name)
|
|
73
|
+
if err == nil {
|
|
74
|
+
return nil
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Avoid running 'apt-get update' since it usually takes 30sec
|
|
78
|
+
if strings.Contains(err.Error(), runAptGetUpdateMsg) {
|
|
79
|
+
_, _, _, err := p.runner.RunCommand("apt-get", "-y", "update")
|
|
80
|
+
if err != nil {
|
|
81
|
+
return bosherr.WrapError(err, "Updating sources")
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Try second time after updating
|
|
85
|
+
_, _, _, err = p.runner.RunCommand("apt-get", "-y", "install", name)
|
|
86
|
+
if err != nil {
|
|
87
|
+
return bosherr.WrapError(err, "Installing %s after updating", name)
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return nil
|
|
92
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
package vm
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
bosherr "bosh/errors"
|
|
5
|
+
boshlog "bosh/logger"
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
const monitProvisionerLogTag = "MonitProvisioner"
|
|
9
|
+
|
|
10
|
+
// MonitProvisioner installs Monit binary.
|
|
11
|
+
type MonitProvisioner struct {
|
|
12
|
+
cmds SimpleCmds
|
|
13
|
+
assetManager AssetManager
|
|
14
|
+
runitProvisioner RunitProvisioner
|
|
15
|
+
logger boshlog.Logger
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
func NewMonitProvisioner(
|
|
19
|
+
cmds SimpleCmds,
|
|
20
|
+
assetManager AssetManager,
|
|
21
|
+
runitProvisioner RunitProvisioner,
|
|
22
|
+
logger boshlog.Logger,
|
|
23
|
+
) MonitProvisioner {
|
|
24
|
+
return MonitProvisioner{
|
|
25
|
+
cmds: cmds,
|
|
26
|
+
assetManager: assetManager,
|
|
27
|
+
runitProvisioner: runitProvisioner,
|
|
28
|
+
logger: logger,
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
func (p MonitProvisioner) Provision() error {
|
|
33
|
+
path := "/var/vcap/monit"
|
|
34
|
+
|
|
35
|
+
err := p.cmds.MkdirP(path)
|
|
36
|
+
if err != nil {
|
|
37
|
+
return err
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
err = p.configureMonitrc()
|
|
41
|
+
if err != nil {
|
|
42
|
+
return bosherr.WrapError(err, "Configuring monitrc")
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
err = p.runitProvisioner.Provision("monit")
|
|
46
|
+
if err != nil {
|
|
47
|
+
return bosherr.WrapError(err, "Provisioning monit with runit")
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return nil
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
func (p MonitProvisioner) configureMonitrc() error {
|
|
54
|
+
p.logger.Info(monitProvisionerLogTag, "Configuring monitc")
|
|
55
|
+
|
|
56
|
+
err := p.cmds.MkdirP("/var/vcap/bosh/etc")
|
|
57
|
+
if err != nil {
|
|
58
|
+
return err
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
err = p.assetManager.Place("monit/monitrc", "/var/vcap/bosh/etc/monitrc")
|
|
62
|
+
if err != nil {
|
|
63
|
+
return bosherr.WrapError(err, "Placing monitrc")
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
err = p.cmds.Chmod("700", "/var/vcap/bosh/etc/monitrc")
|
|
67
|
+
if err != nil {
|
|
68
|
+
return err
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// monit refuses to start without an include file present
|
|
72
|
+
err = p.cmds.MkdirP("/var/vcap/monit")
|
|
73
|
+
if err != nil {
|
|
74
|
+
return err
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
err = p.cmds.Touch("/var/vcap/monit/empty.monitrc")
|
|
78
|
+
if err != nil {
|
|
79
|
+
return err
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return nil
|
|
83
|
+
}
|