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,6 @@
1
+ package tar
2
+
3
+ type Extractor interface {
4
+ Extract(string) (string, error)
5
+ CleanUp(string) error
6
+ }
@@ -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
+ }