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,225 @@
|
|
|
1
|
+
package vm
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"fmt"
|
|
5
|
+
"regexp"
|
|
6
|
+
"strings"
|
|
7
|
+
"time"
|
|
8
|
+
|
|
9
|
+
bosherr "bosh/errors"
|
|
10
|
+
boshlog "bosh/logger"
|
|
11
|
+
boshsys "bosh/system"
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
const runitProvisionerLogTag = "RunitProvisioner"
|
|
15
|
+
|
|
16
|
+
var (
|
|
17
|
+
// Matches 'svlogd -tt /var/vcap/bosh/log'
|
|
18
|
+
runitSvlogdRegex = regexp.MustCompile(`\s*svlogd\s+\-tt\s+(.+)\s*`)
|
|
19
|
+
|
|
20
|
+
// Matches 'down: agent: 3s, normally up; run: log: (pid 15318) 7762s'
|
|
21
|
+
runitStatusDownRegex = regexp.MustCompile(`\Adown: [a-z\/]+: \d+`)
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
// RunitProvisioner installs runit via apt-get and
|
|
25
|
+
// adds specified service under runit's control.
|
|
26
|
+
type RunitProvisioner struct {
|
|
27
|
+
fs boshsys.FileSystem
|
|
28
|
+
cmds SimpleCmds
|
|
29
|
+
runner boshsys.CmdRunner
|
|
30
|
+
assetManager AssetManager
|
|
31
|
+
logger boshlog.Logger
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
func NewRunitProvisioner(
|
|
35
|
+
fs boshsys.FileSystem,
|
|
36
|
+
cmds SimpleCmds,
|
|
37
|
+
runner boshsys.CmdRunner,
|
|
38
|
+
assetManager AssetManager,
|
|
39
|
+
logger boshlog.Logger,
|
|
40
|
+
) RunitProvisioner {
|
|
41
|
+
return RunitProvisioner{
|
|
42
|
+
fs: fs,
|
|
43
|
+
cmds: cmds,
|
|
44
|
+
runner: runner,
|
|
45
|
+
assetManager: assetManager,
|
|
46
|
+
logger: logger,
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
func (p RunitProvisioner) Provision(name string) error {
|
|
51
|
+
err := p.installRunit()
|
|
52
|
+
if err != nil {
|
|
53
|
+
return bosherr.WrapError(err, "Installing runit")
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
err = p.setUpService(name)
|
|
57
|
+
if err != nil {
|
|
58
|
+
return bosherr.WrapError(err, "Setting up service")
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return nil
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
func (p RunitProvisioner) installRunit() error {
|
|
65
|
+
p.logger.Info(runitProvisionerLogTag, "Installing runit")
|
|
66
|
+
|
|
67
|
+
// todo non-bash
|
|
68
|
+
cmd := boshsys.Command{
|
|
69
|
+
Name: "bash",
|
|
70
|
+
Args: []string{
|
|
71
|
+
"-c", "apt-get -q -y -o Dpkg::Options::='--force-confdef' -o Dpkg::Options::='--force-confold' install runit",
|
|
72
|
+
},
|
|
73
|
+
Env: map[string]string{
|
|
74
|
+
"DEBIAN_FRONTEND": "noninteractive",
|
|
75
|
+
},
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
_, _, _, err := p.runner.RunComplexCommand(cmd)
|
|
79
|
+
if err != nil {
|
|
80
|
+
return err
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return nil
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
func (p RunitProvisioner) setUpService(name string) error {
|
|
87
|
+
p.logger.Info(runitProvisionerLogTag, "Setting up %s service", name)
|
|
88
|
+
|
|
89
|
+
servicePath := fmt.Sprintf("/etc/sv/%s", name)
|
|
90
|
+
enableServicePath := fmt.Sprintf("/etc/service/%s", name)
|
|
91
|
+
|
|
92
|
+
err := p.stopRunAndLog(servicePath, enableServicePath, name)
|
|
93
|
+
if err != nil {
|
|
94
|
+
return bosherr.WrapError(err, "Stopping run and log")
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
err = p.setUpRun(servicePath, name)
|
|
98
|
+
if err != nil {
|
|
99
|
+
return bosherr.WrapError(err, "Setting up run")
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
err = p.setUpLog(servicePath, name)
|
|
103
|
+
if err != nil {
|
|
104
|
+
return bosherr.WrapError(err, "Setting up log")
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
err = p.startRunAndLog(servicePath, enableServicePath, name)
|
|
108
|
+
if err != nil {
|
|
109
|
+
return bosherr.WrapError(err, "Starting run and log")
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return nil
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// setUpRun sets up script that runit will execute for the primary process
|
|
116
|
+
func (p RunitProvisioner) setUpRun(servicePath, name string) error {
|
|
117
|
+
err := p.cmds.MkdirP(servicePath)
|
|
118
|
+
if err != nil {
|
|
119
|
+
return err
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
runPath := fmt.Sprintf("%s/run", servicePath)
|
|
123
|
+
|
|
124
|
+
err = p.assetManager.Place(fmt.Sprintf("%s/%s-run", name, name), runPath)
|
|
125
|
+
if err != nil {
|
|
126
|
+
return err
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return p.cmds.ChmodX(runPath)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// setUpLog sets up logging destination for the service
|
|
133
|
+
func (p RunitProvisioner) setUpLog(servicePath, name string) error {
|
|
134
|
+
logPath := fmt.Sprintf("%s/log", servicePath)
|
|
135
|
+
|
|
136
|
+
err := p.cmds.MkdirP(logPath)
|
|
137
|
+
if err != nil {
|
|
138
|
+
return err
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
logRunPath := fmt.Sprintf("%s/run", logPath)
|
|
142
|
+
|
|
143
|
+
err = p.assetManager.Place(fmt.Sprintf("%s/%s-log", name, name), logRunPath)
|
|
144
|
+
if err != nil {
|
|
145
|
+
return err
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
err = p.cmds.ChmodX(logRunPath)
|
|
149
|
+
if err != nil {
|
|
150
|
+
return err
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
contens, err := p.fs.ReadFileString(logRunPath)
|
|
154
|
+
if err != nil {
|
|
155
|
+
return err
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// First match is the whole string
|
|
159
|
+
svlogdPaths := runitSvlogdRegex.FindStringSubmatch(contens)
|
|
160
|
+
|
|
161
|
+
// Create log file destination so that runit process can properly log
|
|
162
|
+
if len(svlogdPaths) == 2 {
|
|
163
|
+
err = p.cmds.MkdirP(svlogdPaths[1])
|
|
164
|
+
if err != nil {
|
|
165
|
+
return err
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return nil
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
func (p RunitProvisioner) stopRunAndLog(servicePath, enableServicePath, name string) error {
|
|
173
|
+
err := p.stopRunsv(name)
|
|
174
|
+
if err != nil {
|
|
175
|
+
return bosherr.WrapError(err, "Stopping service")
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
err = p.stopRunsv(fmt.Sprintf("%s/log", name))
|
|
179
|
+
if err != nil {
|
|
180
|
+
return bosherr.WrapError(err, "Stopping log service")
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
err = p.fs.RemoveAll(enableServicePath)
|
|
184
|
+
if err != nil {
|
|
185
|
+
return err
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Clear out all service state kept in supervise/ and control/ dirs
|
|
189
|
+
return p.fs.RemoveAll(servicePath)
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
func (p RunitProvisioner) startRunAndLog(servicePath, enableServicePath, name string) error {
|
|
193
|
+
// Enabling service will kick in monitoring
|
|
194
|
+
_, _, _, err := p.runner.RunCommand("ln", "-sf", servicePath, enableServicePath)
|
|
195
|
+
|
|
196
|
+
return err
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
func (p RunitProvisioner) stopRunsv(name string) error {
|
|
200
|
+
p.logger.Info(runitProvisionerLogTag, "Stopping runsv")
|
|
201
|
+
|
|
202
|
+
downStdout, _, _, err := p.runner.RunCommand("sv", "down", name)
|
|
203
|
+
if err != nil {
|
|
204
|
+
p.logger.Error(runitProvisionerLogTag, "Ignoring down error %s", err.Error())
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// If runsv configuration does not exist, service was never started
|
|
208
|
+
if strings.Contains(downStdout, "file does not exist") {
|
|
209
|
+
return nil
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
var lastStatusStdout string
|
|
213
|
+
|
|
214
|
+
for i := 0; i < 20; i++ {
|
|
215
|
+
lastStatusStdout, _, _, _ = p.runner.RunCommand("sv", "status", name)
|
|
216
|
+
|
|
217
|
+
if runitStatusDownRegex.MatchString(lastStatusStdout) {
|
|
218
|
+
return nil
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
time.Sleep(100 * time.Millisecond)
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return bosherr.New("Failed to stop runsv for %s. Output: %s", name, lastStatusStdout)
|
|
225
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
package vm
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
boshlog "bosh/logger"
|
|
5
|
+
boshsys "bosh/system"
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
type SimpleCmds struct {
|
|
9
|
+
runner boshsys.CmdRunner
|
|
10
|
+
logger boshlog.Logger
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
func NewSimpleCmds(
|
|
14
|
+
runner boshsys.CmdRunner,
|
|
15
|
+
logger boshlog.Logger,
|
|
16
|
+
) SimpleCmds {
|
|
17
|
+
return SimpleCmds{
|
|
18
|
+
runner: runner,
|
|
19
|
+
logger: logger,
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
func (r SimpleCmds) MkdirP(path string) error {
|
|
24
|
+
return r.run("mkdir", "-p", path)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
func (r SimpleCmds) ChmodX(path string) error {
|
|
28
|
+
return r.run("chmod", "+x", path)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
func (r SimpleCmds) Touch(path string) error {
|
|
32
|
+
return r.run("touch", path)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
func (r SimpleCmds) Mv(srcPath, dstPath string) error {
|
|
36
|
+
return r.run("mv", srcPath, dstPath)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
func (r SimpleCmds) Chmod(mode, path string) error {
|
|
40
|
+
return r.run("chmod", mode, path)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
func (r SimpleCmds) Chown(user, group, path string) error {
|
|
44
|
+
return r.run("chmod", user+":"+group, path)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
func (r SimpleCmds) Bash(script string) error {
|
|
48
|
+
return r.run("bash", "-c", script)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
func (r SimpleCmds) run(cmd string, args ...string) error {
|
|
52
|
+
_, _, _, err := r.runner.RunCommand(cmd, args...)
|
|
53
|
+
return err
|
|
54
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
package vm
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
bosherr "bosh/errors"
|
|
5
|
+
boshlog "bosh/logger"
|
|
6
|
+
boshsys "bosh/system"
|
|
7
|
+
|
|
8
|
+
bpeventlog "boshprovisioner/eventlog"
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
const vcapUserProvisionerLogTag = "VCAPUserProvisioner"
|
|
12
|
+
|
|
13
|
+
// VCAPUserProvisioner adds and configures vcap user.
|
|
14
|
+
type VCAPUserProvisioner struct {
|
|
15
|
+
cmds SimpleCmds
|
|
16
|
+
runner boshsys.CmdRunner
|
|
17
|
+
eventLog bpeventlog.Log
|
|
18
|
+
logger boshlog.Logger
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
func NewVCAPUserProvisioner(
|
|
22
|
+
cmds SimpleCmds,
|
|
23
|
+
runner boshsys.CmdRunner,
|
|
24
|
+
eventLog bpeventlog.Log,
|
|
25
|
+
logger boshlog.Logger,
|
|
26
|
+
) VCAPUserProvisioner {
|
|
27
|
+
return VCAPUserProvisioner{
|
|
28
|
+
cmds: cmds,
|
|
29
|
+
runner: runner,
|
|
30
|
+
eventLog: eventLog,
|
|
31
|
+
logger: logger,
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
func (p VCAPUserProvisioner) Provision() error {
|
|
36
|
+
stage := p.eventLog.BeginStage("Setting up vcap user", 2)
|
|
37
|
+
|
|
38
|
+
task := stage.BeginTask("Adding vcap user")
|
|
39
|
+
|
|
40
|
+
err := task.End(p.setUpVcapUser())
|
|
41
|
+
if err != nil {
|
|
42
|
+
return bosherr.WrapError(err, "Setting up vcap user")
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
task = stage.BeginTask("Harden permissions")
|
|
46
|
+
|
|
47
|
+
err = task.End(p.hardenPermissinons())
|
|
48
|
+
if err != nil {
|
|
49
|
+
return bosherr.WrapError(err, "Harden permissions")
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return nil
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
func (p VCAPUserProvisioner) setUpVcapUser() error {
|
|
56
|
+
p.logger.Info(vcapUserProvisionerLogTag, "Setting up vcap user")
|
|
57
|
+
|
|
58
|
+
userBash := `
|
|
59
|
+
groupadd --system admin
|
|
60
|
+
useradd -m --comment 'BOSH System User' vcap
|
|
61
|
+
|
|
62
|
+
echo "vcap:c1oudc0w" | chpasswd
|
|
63
|
+
echo "root:c1oudc0w" | chpasswd
|
|
64
|
+
|
|
65
|
+
usermod -G admin,adm,audio,cdrom,dialout,floppy,video,dip,plugdev vcap
|
|
66
|
+
usermod -s /bin/bash vcap
|
|
67
|
+
`
|
|
68
|
+
|
|
69
|
+
err := p.cmds.Bash(userBash)
|
|
70
|
+
if err != nil {
|
|
71
|
+
return err
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// todo setup vcap no-password sudo access
|
|
75
|
+
_, _, _, err = p.runner.RunCommand("usermod", "-a", "-G", "vcap", "vagrant")
|
|
76
|
+
if err != nil {
|
|
77
|
+
return err
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
envBashs := []string{
|
|
81
|
+
"echo 'export PATH=/var/vcap/bosh/bin:$PATH' >> /root/.bashrc",
|
|
82
|
+
"echo 'export PATH=/var/vcap/bosh/bin:$PATH' >> /home/vcap/.bashrc",
|
|
83
|
+
|
|
84
|
+
// Configure vcap user locale (postgres initdb fails if mismatched)
|
|
85
|
+
"echo 'LANG=en_US.UTF-8\nLC_ALL=en_US.UTF-8' > /etc/default/locale",
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
for _, bash := range envBashs {
|
|
89
|
+
err := p.cmds.Bash(bash)
|
|
90
|
+
if err != nil {
|
|
91
|
+
return err
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return nil
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
func (p VCAPUserProvisioner) hardenPermissinons() error {
|
|
99
|
+
permsBash := `
|
|
100
|
+
echo 'vcap' > /etc/cron.allow
|
|
101
|
+
echo 'vcap' > /etc/at.allow
|
|
102
|
+
|
|
103
|
+
chmod 0770 /var/lock
|
|
104
|
+
chown -h root:vcap /var/lock
|
|
105
|
+
chown -LR root:vcap /var/lock
|
|
106
|
+
|
|
107
|
+
chmod 0640 /etc/cron.allow
|
|
108
|
+
chown root:vcap /etc/cron.allow
|
|
109
|
+
|
|
110
|
+
chmod 0640 /etc/at.allow
|
|
111
|
+
chown root:vcap /etc/at.allow
|
|
112
|
+
`
|
|
113
|
+
|
|
114
|
+
err := p.cmds.Bash(permsBash)
|
|
115
|
+
if err != nil {
|
|
116
|
+
return err
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return nil
|
|
120
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
package vm
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
bpagclient "boshprovisioner/agent/client"
|
|
5
|
+
)
|
|
6
|
+
|
|
7
|
+
// VM represents already provisioned machine
|
|
8
|
+
// that can be communicated with via an AgentClient.
|
|
9
|
+
type VM struct {
|
|
10
|
+
agentClient bpagclient.Client
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
func NewVM(agentClient bpagclient.Client) VM {
|
|
14
|
+
return VM{agentClient: agentClient}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
func (vm VM) AgentClient() bpagclient.Client {
|
|
18
|
+
return vm.agentClient
|
|
19
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
package vm
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
bosherr "bosh/errors"
|
|
5
|
+
boshlog "bosh/logger"
|
|
6
|
+
|
|
7
|
+
bpdep "boshprovisioner/deployment"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
const vmProvisionerLogTag = "VMProvisioner"
|
|
11
|
+
|
|
12
|
+
// VMProvisioner installs system dependencies that
|
|
13
|
+
// are usually found on a stemcell, adds vcap user,
|
|
14
|
+
// and finally install Agent and Monit.
|
|
15
|
+
type VMProvisioner struct {
|
|
16
|
+
vcapUserProvisioner VCAPUserProvisioner
|
|
17
|
+
depsProvisioner DepsProvisioner
|
|
18
|
+
agentProvisioner AgentProvisioner
|
|
19
|
+
|
|
20
|
+
logger boshlog.Logger
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
func NewVMProvisioner(
|
|
24
|
+
vcapUserProvisioner VCAPUserProvisioner,
|
|
25
|
+
depsProvisioner DepsProvisioner,
|
|
26
|
+
agentProvisioner AgentProvisioner,
|
|
27
|
+
logger boshlog.Logger,
|
|
28
|
+
) VMProvisioner {
|
|
29
|
+
return VMProvisioner{
|
|
30
|
+
vcapUserProvisioner: vcapUserProvisioner,
|
|
31
|
+
depsProvisioner: depsProvisioner,
|
|
32
|
+
agentProvisioner: agentProvisioner,
|
|
33
|
+
|
|
34
|
+
logger: logger,
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
func (p VMProvisioner) Provision(instance bpdep.Instance) (VM, error) {
|
|
39
|
+
var vm VM
|
|
40
|
+
|
|
41
|
+
err := p.vcapUserProvisioner.Provision()
|
|
42
|
+
if err != nil {
|
|
43
|
+
return vm, bosherr.WrapError(err, "Provisioning vcap user")
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
err = p.depsProvisioner.Provision()
|
|
47
|
+
if err != nil {
|
|
48
|
+
return vm, bosherr.WrapError(err, "Provisioning dependencies")
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
agentClient, err := p.agentProvisioner.Provision(instance)
|
|
52
|
+
if err != nil {
|
|
53
|
+
return vm, bosherr.WrapError(err, "Provisioning agent")
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return NewVM(agentClient), nil
|
|
57
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
package vm
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
boshlog "bosh/logger"
|
|
5
|
+
boshsys "bosh/system"
|
|
6
|
+
|
|
7
|
+
bpeventlog "boshprovisioner/eventlog"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
type VMProvisionerFactory struct {
|
|
11
|
+
fs boshsys.FileSystem
|
|
12
|
+
runner boshsys.CmdRunner
|
|
13
|
+
|
|
14
|
+
assetsDir string
|
|
15
|
+
mbus string
|
|
16
|
+
blobstoreConfig map[string]interface{}
|
|
17
|
+
|
|
18
|
+
eventLog bpeventlog.Log
|
|
19
|
+
logger boshlog.Logger
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
func NewVMProvisionerFactory(
|
|
23
|
+
fs boshsys.FileSystem,
|
|
24
|
+
runner boshsys.CmdRunner,
|
|
25
|
+
assetsDir string,
|
|
26
|
+
mbus string,
|
|
27
|
+
blobstoreConfig map[string]interface{},
|
|
28
|
+
eventLog bpeventlog.Log,
|
|
29
|
+
logger boshlog.Logger,
|
|
30
|
+
) VMProvisionerFactory {
|
|
31
|
+
return VMProvisionerFactory{
|
|
32
|
+
fs: fs,
|
|
33
|
+
runner: runner,
|
|
34
|
+
|
|
35
|
+
assetsDir: assetsDir,
|
|
36
|
+
mbus: mbus,
|
|
37
|
+
blobstoreConfig: blobstoreConfig,
|
|
38
|
+
|
|
39
|
+
eventLog: eventLog,
|
|
40
|
+
logger: logger,
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
func (f VMProvisionerFactory) NewVMProvisioner() VMProvisioner {
|
|
45
|
+
cmds := NewSimpleCmds(f.runner, f.logger)
|
|
46
|
+
|
|
47
|
+
vcapUserProvisioner := NewVCAPUserProvisioner(
|
|
48
|
+
cmds,
|
|
49
|
+
f.runner,
|
|
50
|
+
f.eventLog,
|
|
51
|
+
f.logger,
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
assetManager := NewAssetManager(f.assetsDir, f.fs, f.runner, f.logger)
|
|
55
|
+
|
|
56
|
+
runitProvisioner := NewRunitProvisioner(
|
|
57
|
+
f.fs,
|
|
58
|
+
cmds,
|
|
59
|
+
f.runner,
|
|
60
|
+
assetManager,
|
|
61
|
+
f.logger,
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
monitProvisioner := NewMonitProvisioner(
|
|
65
|
+
cmds,
|
|
66
|
+
assetManager,
|
|
67
|
+
runitProvisioner,
|
|
68
|
+
f.logger,
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
depsProvisioner := NewDepsProvisioner(
|
|
72
|
+
f.runner,
|
|
73
|
+
f.eventLog,
|
|
74
|
+
f.logger,
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
agentProvisioner := NewAgentProvisioner(
|
|
78
|
+
f.fs,
|
|
79
|
+
cmds,
|
|
80
|
+
assetManager,
|
|
81
|
+
runitProvisioner,
|
|
82
|
+
monitProvisioner,
|
|
83
|
+
f.blobstoreConfig,
|
|
84
|
+
f.mbus,
|
|
85
|
+
f.eventLog,
|
|
86
|
+
f.logger,
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
vmProvisioner := NewVMProvisioner(
|
|
90
|
+
vcapUserProvisioner,
|
|
91
|
+
depsProvisioner,
|
|
92
|
+
agentProvisioner,
|
|
93
|
+
f.logger,
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
return vmProvisioner
|
|
97
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
require "log4r"
|
|
2
|
+
require "tempfile"
|
|
3
|
+
require "securerandom"
|
|
4
|
+
|
|
5
|
+
module VagrantPlugins
|
|
6
|
+
module VagrantBosh
|
|
7
|
+
class AssetUploader
|
|
8
|
+
def initialize(communicator, ui, assets_path)
|
|
9
|
+
@c = communicator
|
|
10
|
+
@ui = ui.for(:asset_uploader)
|
|
11
|
+
@assets_path = assets_path
|
|
12
|
+
@logger = Log4r::Logger.new("vagrant::provisioners::bosh::asset_uploader")
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def sync(dst_path)
|
|
16
|
+
@ui.timed_msg(:upload, dst_path: dst_path) do
|
|
17
|
+
upload_path(@assets_path, dst_path)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def upload_text(text, dst_path)
|
|
22
|
+
@ui.timed_msg(:upload, dst_path: dst_path) do
|
|
23
|
+
begin
|
|
24
|
+
f = Tempfile.new("asset-uploader-upload-text")
|
|
25
|
+
f.write(text)
|
|
26
|
+
f.flush
|
|
27
|
+
upload_path(f.path, dst_path)
|
|
28
|
+
ensure
|
|
29
|
+
f.close if f
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
def upload_path(src_path, dst_path)
|
|
37
|
+
dst_tmp_path = "/tmp/#{SecureRandom.hex(5)}"
|
|
38
|
+
|
|
39
|
+
@c.upload(src_path, dst_tmp_path)
|
|
40
|
+
|
|
41
|
+
if File.directory?(src_path)
|
|
42
|
+
@c.mkdir_p(dst_path) # create nested dst path
|
|
43
|
+
@c.rm_rf(dst_path)
|
|
44
|
+
@c.mv(dst_tmp_path, dst_path)
|
|
45
|
+
@c.chown("root", "root", dst_path, true)
|
|
46
|
+
else
|
|
47
|
+
@c.mv(dst_tmp_path, dst_path)
|
|
48
|
+
@c.chown("root", "root", dst_path)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
|
2
|
+
MIIC3zCCAcegAwIBAgIBADANBgkqhkiG9w0BAQUFADAzMQswCQYDVQQGEwJVUzEQ
|
|
3
|
+
MA4GA1UECgwHUGl2b3RhbDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTEzMTIwMTIy
|
|
4
|
+
MTEzMloXDTE2MTIwMTIyMTEzMlowMzELMAkGA1UEBhMCVVMxEDAOBgNVBAoMB1Bp
|
|
5
|
+
dm90YWwxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEP
|
|
6
|
+
ADCCAQoCggEBALra3YIx0O6PLcQsHAXbFzJye1M/Am3gCMcX5BTui+I7vfyMXG4w
|
|
7
|
+
FyXHLf9lWwe23ypvP4c1+LNTq7UTTZuidrnadlADgdDned0C09bOKv5Nzk466XTR
|
|
8
|
+
fNyBEyxaZzHQLa9SmDLgq1GUun8oEsxZ+uXhMq6kikRu5LBCChtVCW6LzG/FE1qm
|
|
9
|
+
jSSH6iaOwk2yQxKVqUKNPfz1PqtRgaUBjVWrh2+Wf22KzOTORouBOrSfdxep1Cjz
|
|
10
|
+
lQWt2W5l05dvf2vZTlaqDCk8PBF36FWPlwmZxRsHGACVuckl3yJ69jIaa+i+mK3k
|
|
11
|
+
cfi05ZafWeFwm21ahqzwK/kGsK1ofPHKxE8CAwEAATANBgkqhkiG9w0BAQUFAAOC
|
|
12
|
+
AQEAD1VzwtWCx32pQi5l0oFfjWqktnqfhs/Rr0ZpwacBBXHBvKuz9ENXmblt5pZu
|
|
13
|
+
JP7je+uXQD+da/oVhl0US2L0upIdMmD1utVXYHfRji5r/tIPl2SEKTrFiNZR1Wp6
|
|
14
|
+
J0nE/BW7nm41dXRBIAZR71yproaQrt1tFDFZvdfhwHGLC51L6toOhk/7S604sxbk
|
|
15
|
+
qV0tzT+VaR4hh09FEt9xGmB/3yFh329Yib8ScT94nKzSzoNoDp4Ms/smFhF4lUio
|
|
16
|
+
7SD2+b2/nt8Mcz7q58nYvZteipRrmkOFszlNF5dU31FjvRLITn0bhiOOFRD3qAou
|
|
17
|
+
cSOr1qwsAKuu6MzYNh2ubsLvfg==
|
|
18
|
+
-----END CERTIFICATE-----
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
|
2
|
+
MIIEogIBAAKCAQEAutrdgjHQ7o8txCwcBdsXMnJ7Uz8CbeAIxxfkFO6L4ju9/Ixc
|
|
3
|
+
bjAXJcct/2VbB7bfKm8/hzX4s1OrtRNNm6J2udp2UAOB0Od53QLT1s4q/k3OTjrp
|
|
4
|
+
dNF83IETLFpnMdAtr1KYMuCrUZS6fygSzFn65eEyrqSKRG7ksEIKG1UJbovMb8UT
|
|
5
|
+
WqaNJIfqJo7CTbJDEpWpQo09/PU+q1GBpQGNVauHb5Z/bYrM5M5Gi4E6tJ93F6nU
|
|
6
|
+
KPOVBa3ZbmXTl29/a9lOVqoMKTw8EXfoVY+XCZnFGwcYAJW5ySXfInr2Mhpr6L6Y
|
|
7
|
+
reRx+LTllp9Z4XCbbVqGrPAr+QawrWh88crETwIDAQABAoIBAFh3DrB5TWXku9JI
|
|
8
|
+
3+uV0uG7ec/r4QaMLxuzn/SZC/lMN6K+AXTZp9vm9UwZfIOmfPnmObmWP+0HDCBq
|
|
9
|
+
xy+MN5G+cI1pW6jALt4IXKsyaQCFbctz8Nux4t+y7JTvKDRZT4fWHuDXpcS2GaXi
|
|
10
|
+
HyRI5ZS4jfpJRH0p03PvkEFofVKsZfLAlwnx7HhPqztyc6huu7njjP6XUYbvrhOS
|
|
11
|
+
otE/wyyLyT36rQvUVLHfrco2Ib1r58sWb1hL84/5HnbxwsEelBAAGL5VGu2f0zLP
|
|
12
|
+
qxmy4XWJg9U/UKzG9gXmbcpDUn1pUcZV1rSSJ/wfbdvBSLF+dQaE6QdjGeAyrt7M
|
|
13
|
+
I7gCViECgYEA5ui1aXomHIwqbzll/qotebYNL8AOcpgRJTtzODcnzoe/5aA7yVox
|
|
14
|
+
vOFTD9rODaVRhtdC/ZHsU6rID+tx9gQdjLUEXUqS3KsPXSiwbYBPXnEtpgWz/RAu
|
|
15
|
+
qpxpMn3kfVbQgJjkfksWvlHNzLj5q4ZhZyL/WV3P9DON8vuP/hwwQLMCgYEAzyiv
|
|
16
|
+
rXx/ERnEQOpXEvPtCj04QUGCyW2o4nYIrN3OfO3PM8PnNfB8Z2LKDyuzX9qvWghg
|
|
17
|
+
z81KSNByW4OLdvrnX5natfxdu/6qAl18N+z/DFXuTgXi8nG9/2R5c3Gn5CQ5yab7
|
|
18
|
+
S4G4Pt7YwfoiqFv9j2b0DE3e5UVicGQIuWmaQ/UCgYBf61swraUXRsJ54YYU++xY
|
|
19
|
+
Gt/vbgCSacj1hnSebYsDqDB22tD7G5R9ubwfYe0mjf4H3XPekbdyKgdhVZTJdXww
|
|
20
|
+
7yEY/9lyAT0onbZsRliyCqHDzaqu/QHlrYOljdZUmrOSN/Dy5Y5VEPZEjLJqJjBf
|
|
21
|
+
/5HDNc0kzCWzQfzWui7xMQKBgGNA8ysEAz2GQul3XdDO3juRqWpaoPcxe0FFnFJ2
|
|
22
|
+
04A30JbUveqyFmjShE1QetjqRim06e2mRnksph4CoMeY31KGvKuFBsQT+BC6CdIh
|
|
23
|
+
0vFuGod3eoz+wjGjSi1tvysn0Cg1wSEkPcqhqukFl6VirdIPWc6rYKgo3klLJILx
|
|
24
|
+
feAhAoGABC0apuKQD2IZZXZtDuUI9I4AemPPh0yKvFfTJxmxQ0fTlWjqdcG5nYdh
|
|
25
|
+
tSMBlZwsd6DRlK7dWJ/WHZXuXNeOX6ehSQFmql5/XPNd7INa5My6DDPZr1chh0WJ
|
|
26
|
+
QgK94NXJDoDd1OZjpUBMPLVa8d20/RdGNW8OMolJpzEPhg0r7Ac=
|
|
27
|
+
-----END RSA PRIVATE KEY-----
|
|
Binary file
|