vagrant-bosh 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.gitmodules +6 -0
  4. data/Gemfile +3 -0
  5. data/LICENSE +20 -0
  6. data/README.md +73 -0
  7. data/Rakefile +2 -0
  8. data/dev/.gitignore +1 -0
  9. data/dev/Vagrantfile +30 -0
  10. data/dev/example-bosh-manifest.yml +188 -0
  11. data/dev/example-winston-manifest.yml +70 -0
  12. data/go/.gitignore +11 -0
  13. data/go/bin/build +10 -0
  14. data/go/bin/build-linux-amd64 +9 -0
  15. data/go/bin/env +13 -0
  16. data/go/bin/go +5 -0
  17. data/go/bin/golint +19 -0
  18. data/go/bin/test +37 -0
  19. data/go/src/boshprovisioner/agent/client/client_interface.go +73 -0
  20. data/go/src/boshprovisioner/agent/client/fakes/fake_client.go +81 -0
  21. data/go/src/boshprovisioner/agent/client/http_client.go +299 -0
  22. data/go/src/boshprovisioner/agent/client/http_client_envelope.go +107 -0
  23. data/go/src/boshprovisioner/deployment/deployment.go +221 -0
  24. data/go/src/boshprovisioner/deployment/instance.go +54 -0
  25. data/go/src/boshprovisioner/deployment/manifest/deployment.go +80 -0
  26. data/go/src/boshprovisioner/deployment/manifest/ips.go +23 -0
  27. data/go/src/boshprovisioner/deployment/manifest/manifest.go +143 -0
  28. data/go/src/boshprovisioner/deployment/manifest/manifest_suite_test.go +13 -0
  29. data/go/src/boshprovisioner/deployment/manifest/manifest_test.go +86 -0
  30. data/go/src/boshprovisioner/deployment/manifest/syntax_validator.go +186 -0
  31. data/go/src/boshprovisioner/deployment/manifest/watch_time.go +47 -0
  32. data/go/src/boshprovisioner/deployment/manifest_reader.go +46 -0
  33. data/go/src/boshprovisioner/deployment/reader_factory.go +25 -0
  34. data/go/src/boshprovisioner/deployment/semantic_validator.go +111 -0
  35. data/go/src/boshprovisioner/downloader/blobstore_downloader.go +55 -0
  36. data/go/src/boshprovisioner/downloader/default_mux_downloader.go +22 -0
  37. data/go/src/boshprovisioner/downloader/downloader_interface.go +6 -0
  38. data/go/src/boshprovisioner/downloader/http_downloader.go +53 -0
  39. data/go/src/boshprovisioner/downloader/local_fs_downloader.go +48 -0
  40. data/go/src/boshprovisioner/downloader/mux_downloader.go +69 -0
  41. data/go/src/boshprovisioner/eventlog/log.go +72 -0
  42. data/go/src/boshprovisioner/eventlog/stage.go +39 -0
  43. data/go/src/boshprovisioner/eventlog/task.go +58 -0
  44. data/go/src/boshprovisioner/index/file_index.go +289 -0
  45. data/go/src/boshprovisioner/index/file_index_test.go +296 -0
  46. data/go/src/boshprovisioner/index/index_interface.go +18 -0
  47. data/go/src/boshprovisioner/index/index_suite_test.go +13 -0
  48. data/go/src/boshprovisioner/instance/templatescompiler/concrete_templates_compiler.go +273 -0
  49. data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/erb_renderer.go +117 -0
  50. data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/erbrenderer_suite_test.go +13 -0
  51. data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/render_properties.go +77 -0
  52. data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/render_properties_test.go +142 -0
  53. data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/template_evaluation_context.go +85 -0
  54. data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/template_evaluation_context_rb.go +155 -0
  55. data/go/src/boshprovisioner/instance/templatescompiler/jobsrepo/concrete_jobs_repository.go +64 -0
  56. data/go/src/boshprovisioner/instance/templatescompiler/jobsrepo/concrete_runtime_packages_repository.go +105 -0
  57. data/go/src/boshprovisioner/instance/templatescompiler/jobsrepo/concrete_template_to_job_repository.go +76 -0
  58. data/go/src/boshprovisioner/instance/templatescompiler/jobsrepo/jobs_repository_interface.go +31 -0
  59. data/go/src/boshprovisioner/instance/templatescompiler/rendered_archives_compiler.go +81 -0
  60. data/go/src/boshprovisioner/instance/templatescompiler/templates_compiler_interface.go +20 -0
  61. data/go/src/boshprovisioner/instance/templatescompiler/templatesrepo/ct_repository.go +54 -0
  62. data/go/src/boshprovisioner/instance/templatescompiler/templatesrepo/templates_repository_interface.go +16 -0
  63. data/go/src/boshprovisioner/instance/updater/applier/applier.go +93 -0
  64. data/go/src/boshprovisioner/instance/updater/applier/empty_state.go +66 -0
  65. data/go/src/boshprovisioner/instance/updater/applier/job_state.go +178 -0
  66. data/go/src/boshprovisioner/instance/updater/drainer.go +72 -0
  67. data/go/src/boshprovisioner/instance/updater/preparer.go +39 -0
  68. data/go/src/boshprovisioner/instance/updater/starter.go +36 -0
  69. data/go/src/boshprovisioner/instance/updater/stopper.go +36 -0
  70. data/go/src/boshprovisioner/instance/updater/updater.go +102 -0
  71. data/go/src/boshprovisioner/instance/updater/updater_factory.go +83 -0
  72. data/go/src/boshprovisioner/instance/updater/updater_suite_test.go +13 -0
  73. data/go/src/boshprovisioner/instance/updater/waiter.go +77 -0
  74. data/go/src/boshprovisioner/instance/updater/waiter_test.go +103 -0
  75. data/go/src/boshprovisioner/main/config.go +77 -0
  76. data/go/src/boshprovisioner/main/main.go +183 -0
  77. data/go/src/boshprovisioner/main/repos_factory.go +96 -0
  78. data/go/src/boshprovisioner/packagescompiler/compiledpackagesrepo/compiled_packages_repository_interface.go +17 -0
  79. data/go/src/boshprovisioner/packagescompiler/compiledpackagesrepo/concrete_compiled_packages_repository.go +61 -0
  80. data/go/src/boshprovisioner/packagescompiler/concrete_packages_compiler.go +179 -0
  81. data/go/src/boshprovisioner/packagescompiler/concrete_packages_compiler_factory.go +48 -0
  82. data/go/src/boshprovisioner/packagescompiler/packages_compiler_interface.go +20 -0
  83. data/go/src/boshprovisioner/packagescompiler/packagesrepo/concrete_packages_repository.go +65 -0
  84. data/go/src/boshprovisioner/packagescompiler/packagesrepo/packages_repository_interface.go +16 -0
  85. data/go/src/boshprovisioner/provisioner/blobstore_config.go +65 -0
  86. data/go/src/boshprovisioner/provisioner/blobstore_provisioner.go +38 -0
  87. data/go/src/boshprovisioner/provisioner/deployment_provisioner.go +97 -0
  88. data/go/src/boshprovisioner/provisioner/instance_provisioner.go +48 -0
  89. data/go/src/boshprovisioner/provisioner/release_compiler.go +133 -0
  90. data/go/src/boshprovisioner/release/job/job.go +86 -0
  91. data/go/src/boshprovisioner/release/job/manifest/manifest.go +79 -0
  92. data/go/src/boshprovisioner/release/job/manifest/manifest_suite_test.go +13 -0
  93. data/go/src/boshprovisioner/release/job/manifest/manifest_test.go +42 -0
  94. data/go/src/boshprovisioner/release/job/manifest/syntax_validator.go +43 -0
  95. data/go/src/boshprovisioner/release/job/reader_factory.go +34 -0
  96. data/go/src/boshprovisioner/release/job/tar_reader.go +133 -0
  97. data/go/src/boshprovisioner/release/manifest/manifest.go +96 -0
  98. data/go/src/boshprovisioner/release/manifest_reader.go +29 -0
  99. data/go/src/boshprovisioner/release/reader_factory.go +34 -0
  100. data/go/src/boshprovisioner/release/release.go +144 -0
  101. data/go/src/boshprovisioner/release/release_suite_test.go +13 -0
  102. data/go/src/boshprovisioner/release/release_test.go +129 -0
  103. data/go/src/boshprovisioner/release/tar_reader.go +139 -0
  104. data/go/src/boshprovisioner/releasesrepo/blobstore_releases_repository.go +114 -0
  105. data/go/src/boshprovisioner/releasesrepo/releases_repository_interface.go +15 -0
  106. data/go/src/boshprovisioner/tar/cmd_compressor.go +68 -0
  107. data/go/src/boshprovisioner/tar/cmd_extractor.go +47 -0
  108. data/go/src/boshprovisioner/tar/compressor_interface.go +6 -0
  109. data/go/src/boshprovisioner/tar/extractor_interface.go +6 -0
  110. data/go/src/boshprovisioner/util/string_keyed.go +70 -0
  111. data/go/src/boshprovisioner/vm/agent_provisioner.go +266 -0
  112. data/go/src/boshprovisioner/vm/asset_manager.go +61 -0
  113. data/go/src/boshprovisioner/vm/deps_provisioner.go +92 -0
  114. data/go/src/boshprovisioner/vm/monit_provisioner.go +83 -0
  115. data/go/src/boshprovisioner/vm/runit_provisioner.go +225 -0
  116. data/go/src/boshprovisioner/vm/simple_cmds.go +54 -0
  117. data/go/src/boshprovisioner/vm/vcap_user_provisioner.go +120 -0
  118. data/go/src/boshprovisioner/vm/vm.go +19 -0
  119. data/go/src/boshprovisioner/vm/vm_provisioner.go +57 -0
  120. data/go/src/boshprovisioner/vm/vm_provisioner_factory.go +97 -0
  121. data/lib/vagrant-bosh/asset_uploader.rb +53 -0
  122. data/lib/vagrant-bosh/assets/agent/agent-log +5 -0
  123. data/lib/vagrant-bosh/assets/agent/agent-run +12 -0
  124. data/lib/vagrant-bosh/assets/agent/agent.cert +18 -0
  125. data/lib/vagrant-bosh/assets/agent/agent.json +9 -0
  126. data/lib/vagrant-bosh/assets/agent/agent.key +27 -0
  127. data/lib/vagrant-bosh/assets/agent/bosh-agent +0 -0
  128. data/lib/vagrant-bosh/assets/agent/bosh-agent-rc +18 -0
  129. data/lib/vagrant-bosh/assets/agent/bosh-blobstore-dav +0 -0
  130. data/lib/vagrant-bosh/assets/monit/monit +0 -0
  131. data/lib/vagrant-bosh/assets/monit/monit-log +5 -0
  132. data/lib/vagrant-bosh/assets/monit/monit-run +9 -0
  133. data/lib/vagrant-bosh/assets/monit/monitrc +8 -0
  134. data/lib/vagrant-bosh/assets/provisioner +0 -0
  135. data/lib/vagrant-bosh/bootstrapper.rb +59 -0
  136. data/lib/vagrant-bosh/communicator.rb +50 -0
  137. data/lib/vagrant-bosh/config.rb +15 -0
  138. data/lib/vagrant-bosh/errors.rb +11 -0
  139. data/lib/vagrant-bosh/plugin.rb +25 -0
  140. data/lib/vagrant-bosh/provisioner.rb +46 -0
  141. data/lib/vagrant-bosh/provisioner_tracker.rb +41 -0
  142. data/lib/vagrant-bosh/ui.rb +77 -0
  143. data/lib/vagrant-bosh/version.rb +5 -0
  144. data/lib/vagrant-bosh.rb +15 -0
  145. data/templates/locales/en.yml +15 -0
  146. data/vagrant-bosh.gemspec +20 -0
  147. metadata +191 -0
@@ -0,0 +1,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,5 @@
1
+ #!/bin/bash
2
+
3
+ set -e
4
+
5
+ exec svlogd -tt /var/vcap/bosh/log
@@ -0,0 +1,12 @@
1
+ #!/bin/bash
2
+
3
+ set -e
4
+
5
+ export PATH=/var/vcap/bosh/bin:$PATH
6
+
7
+ exec 2>&1
8
+
9
+ # Get into directory with agent.{cert,key}
10
+ cd /var/vcap/bosh
11
+
12
+ exec nice -n -10 /var/vcap/bosh/bin/bosh-agent -I warden -P ubuntu -C /var/vcap/bosh/agent.json
@@ -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,9 @@
1
+ {
2
+ "Platform": {
3
+ "Linux": {
4
+ "UseDefaultTmpDir": true,
5
+ "UsePreformattedPersistentDisk": true,
6
+ "BindMountPersistentDisk": true
7
+ }
8
+ }
9
+ }
@@ -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-----