vagrant-bosh 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +24 -1
- data/dev/Vagrantfile +7 -4
- data/dev/example-winston-manifest.yml +2 -2
- data/docs/build-aws-stemcell.md +66 -0
- data/docs/release-url.md +39 -0
- data/go/src/boshprovisioner/downloader/local_fs_downloader.go +1 -1
- data/go/src/boshprovisioner/main/config.go +28 -13
- data/go/src/boshprovisioner/main/config_test.go +67 -0
- data/go/src/boshprovisioner/main/main.go +7 -7
- data/go/src/boshprovisioner/main/main_suite_test.go +13 -0
- data/go/src/boshprovisioner/main/repos_factory.go +0 -10
- data/go/src/boshprovisioner/packagescompiler/concrete_packages_compiler.go +3 -3
- data/go/src/boshprovisioner/provisioner/deployment_provisioner_interface.go +10 -0
- data/go/src/boshprovisioner/provisioner/release_compiler.go +11 -51
- data/go/src/boshprovisioner/provisioner/{deployment_provisioner.go → single_configured_vm_provisioner.go} +8 -12
- data/go/src/boshprovisioner/provisioner/single_non_configured_vm_provisioner.go +40 -0
- data/go/src/boshprovisioner/provisioner/single_vm_provisioner_factory.go +68 -0
- data/go/src/boshprovisioner/release/dir_reader.go +127 -0
- data/go/src/boshprovisioner/release/manifest/manifest.go +38 -14
- data/go/src/boshprovisioner/release/manifest/manifest_suite_test.go +13 -0
- data/go/src/boshprovisioner/release/manifest/manifest_test.go +72 -0
- data/go/src/boshprovisioner/release/manifest/syntax_validator.go +134 -0
- data/go/src/boshprovisioner/release/reader_factory.go +13 -2
- data/go/src/boshprovisioner/release/reader_interface.go +6 -0
- data/go/src/boshprovisioner/release/tar_reader.go +26 -24
- data/go/src/boshprovisioner/vm/vagrant/agent_provisioner.go +70 -40
- data/go/src/boshprovisioner/vm/vagrant/asset_manager.go +1 -1
- data/go/src/boshprovisioner/vm/vagrant/configured_vm.go +29 -0
- data/go/src/boshprovisioner/vm/vagrant/deps_provisioner.go +38 -24
- data/go/src/boshprovisioner/vm/vagrant/monit_provisioner.go +1 -1
- data/go/src/boshprovisioner/vm/vagrant/non_configured_vm.go +26 -0
- data/go/src/boshprovisioner/vm/vagrant/runit_provisioner.go +1 -1
- data/go/src/boshprovisioner/vm/vagrant/simple_cmds.go +1 -1
- data/go/src/boshprovisioner/vm/vagrant/vcap_user_provisioner.go +87 -40
- data/go/src/boshprovisioner/vm/vagrant/vm_provisioner.go +58 -20
- data/go/src/boshprovisioner/vm/vagrant/vm_provisioner_factory.go +4 -7
- data/go/src/boshprovisioner/vm/vm_interface.go +25 -6
- data/lib/vagrant-bosh/asset_uploader.rb +4 -3
- data/lib/vagrant-bosh/assets/agent/agent-run +4 -1
- data/lib/vagrant-bosh/assets/agent/bosh-agent +0 -0
- data/lib/vagrant-bosh/assets/provisioner +0 -0
- data/lib/vagrant-bosh/bootstrapper.rb +34 -21
- data/lib/vagrant-bosh/communicator.rb +1 -0
- data/lib/vagrant-bosh/config.rb +25 -1
- data/lib/vagrant-bosh/deployment/manifest.rb +79 -0
- data/lib/vagrant-bosh/deployment/manifest_factory.rb +29 -0
- data/lib/vagrant-bosh/deployment/release_uploader.rb +40 -0
- data/lib/vagrant-bosh/deployment/uploadable_release.rb +82 -0
- data/lib/vagrant-bosh/deployment/uploadable_release_factory.rb +28 -0
- data/lib/vagrant-bosh/errors.rb +1 -3
- data/lib/vagrant-bosh/provisioner.rb +24 -5
- data/lib/vagrant-bosh/ui.rb +9 -7
- data/lib/vagrant-bosh/version.rb +1 -1
- data/templates/locales/en.yml +27 -0
- metadata +22 -7
- data/go/src/boshprovisioner/release/manifest_reader.go +0 -29
- data/go/src/boshprovisioner/releasesrepo/blobstore_releases_repository.go +0 -114
- data/go/src/boshprovisioner/releasesrepo/releases_repository_interface.go +0 -15
- data/go/src/boshprovisioner/vm/vagrant/vm.go +0 -27
@@ -17,7 +17,8 @@ const tarReaderLogTag = "TarReader"
|
|
17
17
|
// TarReader reads .tgz release file and returns a Release.
|
18
18
|
// See unpacked release directory layout at the end of the file.
|
19
19
|
type TarReader struct {
|
20
|
-
|
20
|
+
url string
|
21
|
+
|
21
22
|
downloader bpdload.Downloader
|
22
23
|
extractor bptar.Extractor
|
23
24
|
fs boshsys.FileSystem
|
@@ -29,14 +30,15 @@ type TarReader struct {
|
|
29
30
|
}
|
30
31
|
|
31
32
|
func NewTarReader(
|
32
|
-
|
33
|
+
url string,
|
33
34
|
downloader bpdload.Downloader,
|
34
35
|
extractor bptar.Extractor,
|
35
36
|
fs boshsys.FileSystem,
|
36
37
|
logger boshlog.Logger,
|
37
38
|
) *TarReader {
|
38
39
|
return &TarReader{
|
39
|
-
|
40
|
+
url: url,
|
41
|
+
|
40
42
|
downloader: downloader,
|
41
43
|
extractor: extractor,
|
42
44
|
fs: fs,
|
@@ -44,61 +46,61 @@ func NewTarReader(
|
|
44
46
|
}
|
45
47
|
}
|
46
48
|
|
47
|
-
func (
|
49
|
+
func (r *TarReader) Read() (Release, error) {
|
48
50
|
var release Release
|
49
51
|
|
50
|
-
downloadPath, err :=
|
52
|
+
downloadPath, err := r.downloader.Download(r.url)
|
51
53
|
if err != nil {
|
52
54
|
return release, bosherr.WrapError(err, "Downloading release")
|
53
55
|
}
|
54
56
|
|
55
|
-
|
57
|
+
r.downloadPath = downloadPath
|
56
58
|
|
57
|
-
extractPath, err :=
|
59
|
+
extractPath, err := r.extractor.Extract(r.downloadPath)
|
58
60
|
if err != nil {
|
59
|
-
cleanUpErr :=
|
61
|
+
cleanUpErr := r.downloader.CleanUp(r.downloadPath)
|
60
62
|
if cleanUpErr != nil {
|
61
|
-
|
63
|
+
r.logger.Debug(tarReaderLogTag,
|
62
64
|
"Failed to clean up downloaded release %v", cleanUpErr)
|
63
65
|
}
|
64
66
|
|
65
67
|
return release, bosherr.WrapError(err, "Extracting release")
|
66
68
|
}
|
67
69
|
|
68
|
-
|
70
|
+
r.extractPath = extractPath
|
69
71
|
|
70
|
-
manifestPath := filepath.Join(
|
72
|
+
manifestPath := filepath.Join(r.extractPath, "release.MF")
|
71
73
|
|
72
|
-
manifest, err := bprelman.NewManifestFromPath(manifestPath,
|
74
|
+
manifest, err := bprelman.NewManifestFromPath(manifestPath, r.fs)
|
73
75
|
if err != nil {
|
74
|
-
closeErr :=
|
76
|
+
closeErr := r.Close()
|
75
77
|
if closeErr != nil {
|
76
|
-
|
78
|
+
r.logger.Debug(tarReaderLogTag,
|
77
79
|
"Failed to close release %v", closeErr)
|
78
80
|
}
|
79
81
|
|
80
82
|
return release, bosherr.WrapError(err, "Building manifest")
|
81
83
|
}
|
82
84
|
|
83
|
-
|
85
|
+
r.logger.Debug(tarReaderLogTag, "Done building manifest %#v", manifest)
|
84
86
|
|
85
87
|
release.populateFromManifest(manifest)
|
86
88
|
|
87
|
-
|
89
|
+
r.populateReleaseTarPaths(&release)
|
88
90
|
|
89
91
|
return release, nil
|
90
92
|
}
|
91
93
|
|
92
|
-
func (
|
93
|
-
dlErr :=
|
94
|
+
func (r TarReader) Close() error {
|
95
|
+
dlErr := r.downloader.CleanUp(r.downloadPath)
|
94
96
|
if dlErr != nil {
|
95
|
-
|
97
|
+
r.logger.Debug(tarReaderLogTag,
|
96
98
|
"Failed to clean up downloaded release %v", dlErr)
|
97
99
|
}
|
98
100
|
|
99
|
-
exErr :=
|
101
|
+
exErr := r.extractor.CleanUp(r.extractPath)
|
100
102
|
if exErr != nil {
|
101
|
-
|
103
|
+
r.logger.Debug(tarReaderLogTag,
|
102
104
|
"Failed to clean up extracted release %v", exErr)
|
103
105
|
}
|
104
106
|
|
@@ -110,15 +112,15 @@ func (tr TarReader) Close() error {
|
|
110
112
|
}
|
111
113
|
|
112
114
|
// populateReleaseTarPaths sets TarPath for each job/package in the release.
|
113
|
-
func (
|
115
|
+
func (r TarReader) populateReleaseTarPaths(release *Release) {
|
114
116
|
for i, job := range release.Jobs {
|
115
117
|
fileName := job.Name + ".tgz"
|
116
|
-
release.Jobs[i].TarPath = filepath.Join(
|
118
|
+
release.Jobs[i].TarPath = filepath.Join(r.extractPath, "jobs", fileName)
|
117
119
|
}
|
118
120
|
|
119
121
|
for _, pkg := range release.Packages {
|
120
122
|
fileName := pkg.Name + ".tgz"
|
121
|
-
pkg.TarPath = filepath.Join(
|
123
|
+
pkg.TarPath = filepath.Join(r.extractPath, "packages", fileName)
|
122
124
|
}
|
123
125
|
}
|
124
126
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
package
|
1
|
+
package vagrant
|
2
2
|
|
3
3
|
import (
|
4
4
|
"encoding/json"
|
@@ -13,6 +13,7 @@ import (
|
|
13
13
|
bpagclient "boshprovisioner/agent/client"
|
14
14
|
bpdep "boshprovisioner/deployment"
|
15
15
|
bpeventlog "boshprovisioner/eventlog"
|
16
|
+
bpvm "boshprovisioner/vm"
|
16
17
|
)
|
17
18
|
|
18
19
|
const agentProvisionerLogTag = "AgentProvisioner"
|
@@ -27,8 +28,8 @@ type AgentProvisioner struct {
|
|
27
28
|
runitProvisioner RunitProvisioner
|
28
29
|
monitProvisioner MonitProvisioner
|
29
30
|
|
30
|
-
blobstoreConfig
|
31
|
-
|
31
|
+
blobstoreConfig map[string]interface{}
|
32
|
+
agentProvisionerConfig bpvm.AgentProvisionerConfig
|
32
33
|
|
33
34
|
eventLog bpeventlog.Log
|
34
35
|
logger boshlog.Logger
|
@@ -41,7 +42,7 @@ func NewAgentProvisioner(
|
|
41
42
|
runitProvisioner RunitProvisioner,
|
42
43
|
monitProvisioner MonitProvisioner,
|
43
44
|
blobstoreConfig map[string]interface{},
|
44
|
-
|
45
|
+
agentProvisionerConfig bpvm.AgentProvisionerConfig,
|
45
46
|
eventLog bpeventlog.Log,
|
46
47
|
logger boshlog.Logger,
|
47
48
|
) AgentProvisioner {
|
@@ -53,43 +54,56 @@ func NewAgentProvisioner(
|
|
53
54
|
runitProvisioner: runitProvisioner,
|
54
55
|
monitProvisioner: monitProvisioner,
|
55
56
|
|
56
|
-
blobstoreConfig:
|
57
|
-
|
57
|
+
blobstoreConfig: blobstoreConfig,
|
58
|
+
agentProvisionerConfig: agentProvisionerConfig,
|
58
59
|
|
59
60
|
eventLog: eventLog,
|
60
61
|
logger: logger,
|
61
62
|
}
|
62
63
|
}
|
63
64
|
|
64
|
-
func (p AgentProvisioner) Provision(
|
65
|
-
stage := p.eventLog.BeginStage("Updating BOSH agent",
|
65
|
+
func (p AgentProvisioner) Provision() error {
|
66
|
+
stage := p.eventLog.BeginStage("Updating BOSH agent", 4)
|
66
67
|
|
67
68
|
task := stage.BeginTask("Placing binaries")
|
68
69
|
|
69
70
|
err := task.End(p.placeBinaries())
|
70
71
|
if err != nil {
|
71
|
-
return
|
72
|
+
return bosherr.WrapError(err, "Placing agent binaries")
|
72
73
|
}
|
73
74
|
|
74
|
-
task = stage.BeginTask("
|
75
|
+
task = stage.BeginTask("Placing configuration files")
|
75
76
|
|
76
|
-
err = task.End(p.
|
77
|
+
err = task.End(p.placeConfFiles())
|
77
78
|
if err != nil {
|
78
|
-
return
|
79
|
+
return bosherr.WrapError(err, "Configuring settings")
|
79
80
|
}
|
80
81
|
|
81
|
-
task = stage.BeginTask("
|
82
|
+
task = stage.BeginTask("Registering monit service")
|
82
83
|
|
83
84
|
err = task.End(p.monitProvisioner.Provision())
|
84
85
|
if err != nil {
|
85
|
-
return
|
86
|
+
return bosherr.WrapError(err, "Provisioning monit")
|
86
87
|
}
|
87
88
|
|
88
|
-
task = stage.BeginTask("
|
89
|
+
task = stage.BeginTask("Registering agent service")
|
89
90
|
|
90
91
|
err = task.End(p.runitProvisioner.Provision("agent", 10*time.Second))
|
91
92
|
if err != nil {
|
92
|
-
return
|
93
|
+
return bosherr.WrapError(err, "Provisioning agent with runit")
|
94
|
+
}
|
95
|
+
|
96
|
+
return nil
|
97
|
+
}
|
98
|
+
|
99
|
+
func (p AgentProvisioner) Configure(instance bpdep.Instance) (bpagclient.Client, error) {
|
100
|
+
stage := p.eventLog.BeginStage("Configuring BOSH agent", 1)
|
101
|
+
|
102
|
+
task := stage.BeginTask("Configuring infrastructure settings")
|
103
|
+
|
104
|
+
err := task.End(p.placeInfSettings(instance))
|
105
|
+
if err != nil {
|
106
|
+
return nil, bosherr.WrapError(err, "Placing infrastructure settings")
|
93
107
|
}
|
94
108
|
|
95
109
|
agentClient, err := p.buildAgentClient()
|
@@ -141,20 +155,53 @@ func (p AgentProvisioner) placeBinary(name, path string) error {
|
|
141
155
|
return nil
|
142
156
|
}
|
143
157
|
|
144
|
-
func (p AgentProvisioner)
|
158
|
+
func (p AgentProvisioner) placeConfFiles() error {
|
145
159
|
err := p.setUpDataDir()
|
146
160
|
if err != nil {
|
147
161
|
return bosherr.WrapError(err, "Setting up data dir")
|
148
162
|
}
|
149
163
|
|
150
|
-
|
164
|
+
fileNames := map[string]string{
|
165
|
+
"agent/agent.cert": "agent.cert", // Needed by agent HTTP handler
|
166
|
+
"agent/agent.key": "agent.key",
|
167
|
+
}
|
168
|
+
|
169
|
+
for assetName, fileName := range fileNames {
|
170
|
+
err := p.assetManager.Place(assetName, filepath.Join("/var/vcap/bosh/", fileName))
|
171
|
+
if err != nil {
|
172
|
+
return bosherr.WrapError(err, "Placing %s", fileName)
|
173
|
+
}
|
174
|
+
}
|
175
|
+
|
176
|
+
err = p.placeAgentConf()
|
151
177
|
if err != nil {
|
152
|
-
return bosherr.WrapError(err, "Placing
|
178
|
+
return bosherr.WrapError(err, "Placing agent configuration")
|
153
179
|
}
|
154
180
|
|
155
|
-
|
181
|
+
return nil
|
182
|
+
}
|
183
|
+
|
184
|
+
func (p AgentProvisioner) placeAgentConf() error {
|
185
|
+
// etc/infrastructure and etc/plaform is loaded by BOSH Agent runit script
|
186
|
+
err := p.fs.WriteFileString("/var/vcap/bosh/etc/infrastructure", p.agentProvisionerConfig.Infrastructure)
|
156
187
|
if err != nil {
|
157
|
-
return bosherr.WrapError(err, "
|
188
|
+
return bosherr.WrapError(err, "Writing agent infrastructure")
|
189
|
+
}
|
190
|
+
|
191
|
+
err = p.fs.WriteFileString("/var/vcap/bosh/etc/platform", p.agentProvisionerConfig.Platform)
|
192
|
+
if err != nil {
|
193
|
+
return bosherr.WrapError(err, "Writing agent platform")
|
194
|
+
}
|
195
|
+
|
196
|
+
// Go Agent will can unmarshal 'null' into an empty config
|
197
|
+
bytes, err := json.Marshal(p.agentProvisionerConfig.Configuration)
|
198
|
+
if err != nil {
|
199
|
+
return bosherr.WrapError(err, "Marshalling agent configuration")
|
200
|
+
}
|
201
|
+
|
202
|
+
err = p.fs.WriteFile("/var/vcap/bosh/agent.json", bytes)
|
203
|
+
if err != nil {
|
204
|
+
return bosherr.WrapError(err, "Writing agent configuration")
|
158
205
|
}
|
159
206
|
|
160
207
|
return nil
|
@@ -180,23 +227,6 @@ func (p AgentProvisioner) setUpDataDir() error {
|
|
180
227
|
return nil
|
181
228
|
}
|
182
229
|
|
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
230
|
func (p AgentProvisioner) placeInfSettings(instance bpdep.Instance) error {
|
201
231
|
type h map[string]interface{}
|
202
232
|
|
@@ -228,7 +258,7 @@ func (p AgentProvisioner) placeInfSettings(instance bpdep.Instance) error {
|
|
228
258
|
"disks": h{"persistent": h{}},
|
229
259
|
|
230
260
|
"blobstore": p.blobstoreConfig,
|
231
|
-
"mbus": p.
|
261
|
+
"mbus": p.agentProvisionerConfig.Mbus, // todo port can conflict with jobs
|
232
262
|
|
233
263
|
"env": h{},
|
234
264
|
"ntp": []string{},
|
@@ -248,7 +278,7 @@ func (p AgentProvisioner) placeInfSettings(instance bpdep.Instance) error {
|
|
248
278
|
}
|
249
279
|
|
250
280
|
func (p AgentProvisioner) buildAgentClient() (bpagclient.Client, error) {
|
251
|
-
agentClient, err := bpagclient.NewInsecureHTTPClientWithURI(p.
|
281
|
+
agentClient, err := bpagclient.NewInsecureHTTPClientWithURI(p.agentProvisionerConfig.Mbus, p.logger)
|
252
282
|
if err != nil {
|
253
283
|
return nil, bosherr.WrapError(err, "Building agent client")
|
254
284
|
}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
package vagrant
|
2
|
+
|
3
|
+
import (
|
4
|
+
bpagclient "boshprovisioner/agent/client"
|
5
|
+
)
|
6
|
+
|
7
|
+
// ConfiguredVM represents provisioned Vagrant machine
|
8
|
+
// that can be communicated with via an AgentClient.
|
9
|
+
type ConfiguredVM struct {
|
10
|
+
vmProvisioner *VMProvisioner
|
11
|
+
agentClient bpagclient.Client
|
12
|
+
}
|
13
|
+
|
14
|
+
func NewConfiguredVM(vmProvisioner *VMProvisioner, agentClient bpagclient.Client) ConfiguredVM {
|
15
|
+
return ConfiguredVM{
|
16
|
+
vmProvisioner: vmProvisioner,
|
17
|
+
agentClient: agentClient,
|
18
|
+
}
|
19
|
+
}
|
20
|
+
|
21
|
+
func (vm ConfiguredVM) AgentClient() bpagclient.Client {
|
22
|
+
return vm.agentClient
|
23
|
+
}
|
24
|
+
|
25
|
+
func (vm ConfiguredVM) Deprovision() error {
|
26
|
+
return vm.vmProvisioner.deprovision(vm)
|
27
|
+
}
|
28
|
+
|
29
|
+
func (vm ConfiguredVM) vagrantVM() {}
|
@@ -1,8 +1,9 @@
|
|
1
|
-
package
|
1
|
+
package vagrant
|
2
2
|
|
3
3
|
import (
|
4
4
|
"fmt"
|
5
5
|
"strings"
|
6
|
+
"time"
|
6
7
|
|
7
8
|
bosherr "bosh/errors"
|
8
9
|
boshlog "bosh/logger"
|
@@ -52,7 +53,7 @@ func (p DepsProvisioner) Provision() error {
|
|
52
53
|
|
53
54
|
stage := p.eventLog.BeginStage("Installing dependencies", len(pkgNames))
|
54
55
|
|
55
|
-
|
56
|
+
installedPkgNames, err := p.listInstalledPkgNames()
|
56
57
|
if err != nil {
|
57
58
|
return bosherr.WrapError(err, "Listing installed packages")
|
58
59
|
}
|
@@ -60,7 +61,7 @@ func (p DepsProvisioner) Provision() error {
|
|
60
61
|
for _, pkgName := range pkgNames {
|
61
62
|
task := stage.BeginTask(fmt.Sprintf("Package %s", pkgName))
|
62
63
|
|
63
|
-
if p.isPkgInstalled(pkgName,
|
64
|
+
if p.isPkgInstalled(pkgName, installedPkgNames) {
|
64
65
|
p.logger.Debug(depsProvisionerLogTag, "Package %s is already installed", pkgName)
|
65
66
|
task.End(nil)
|
66
67
|
continue
|
@@ -90,39 +91,50 @@ func (p DepsProvisioner) installPkg(name string) error {
|
|
90
91
|
return bosherr.WrapError(err, "Updating sources")
|
91
92
|
}
|
92
93
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
94
|
+
var lastInstallErr error
|
95
|
+
|
96
|
+
// For some reason libssl-dev was really hard to install on the first try
|
97
|
+
for i := 0; i < 3; i++ {
|
98
|
+
_, _, _, lastInstallErr = p.runner.RunCommand("apt-get", "-y", "install", name)
|
99
|
+
if lastInstallErr == nil {
|
100
|
+
return nil
|
101
|
+
}
|
102
|
+
|
103
|
+
time.Sleep(1 * time.Second)
|
97
104
|
}
|
105
|
+
|
106
|
+
return bosherr.WrapError(lastInstallErr, "Installing %s after updating", name)
|
98
107
|
}
|
99
108
|
|
100
|
-
return
|
109
|
+
return err
|
101
110
|
}
|
102
111
|
|
103
|
-
func (p DepsProvisioner)
|
104
|
-
var
|
112
|
+
func (p DepsProvisioner) listInstalledPkgNames() ([]string, error) {
|
113
|
+
var installedPkgNames []string
|
105
114
|
|
106
115
|
installedPkgStdout, _, _, err := p.runner.RunCommand("dpkg", "--get-selections")
|
107
116
|
if err != nil {
|
108
|
-
return
|
117
|
+
return nil, bosherr.WrapError(err, "dkpg query")
|
109
118
|
}
|
110
119
|
|
120
|
+
// e.g. 'zlib1g:amd64 install'
|
121
|
+
// 'util-linux install'
|
111
122
|
for _, line := range strings.Split(installedPkgStdout, "\n") {
|
112
123
|
pieces := strings.Fields(line)
|
113
124
|
|
114
125
|
// Last line is empty
|
115
126
|
if len(pieces) == 2 && pieces[1] == "install" {
|
116
|
-
|
127
|
+
pkgName := strings.Split(pieces[0], ":")[0]
|
128
|
+
installedPkgNames = append(installedPkgNames, pkgName)
|
117
129
|
}
|
118
130
|
}
|
119
131
|
|
120
|
-
return
|
132
|
+
return installedPkgNames, nil
|
121
133
|
}
|
122
134
|
|
123
135
|
func (p DepsProvisioner) isPkgInstalled(pkgName string, installedPkgs []string) bool {
|
124
136
|
for _, installedPkgName := range installedPkgs {
|
125
|
-
if
|
137
|
+
if installedPkgName == pkgName {
|
126
138
|
return true
|
127
139
|
}
|
128
140
|
}
|
@@ -131,12 +143,12 @@ func (p DepsProvisioner) isPkgInstalled(pkgName string, installedPkgs []string)
|
|
131
143
|
}
|
132
144
|
|
133
145
|
var depsProvisionerPkgsForMinimumStemcellCompatibility = []string{
|
134
|
-
//
|
146
|
+
// Most BOSH releases require it for packaging
|
135
147
|
"build-essential", // 16sec
|
136
148
|
"cmake", // 6sec
|
137
149
|
|
138
150
|
"libcap2-bin",
|
139
|
-
"
|
151
|
+
"libcap-dev",
|
140
152
|
|
141
153
|
"libbz2-1.0", // noop on precise64 Vagrant box
|
142
154
|
"libbz2-dev", // 2sec
|
@@ -148,6 +160,16 @@ var depsProvisionerPkgsForMinimumStemcellCompatibility = []string{
|
|
148
160
|
|
149
161
|
// For warden
|
150
162
|
"quota", // 1sec
|
163
|
+
|
164
|
+
// Started needing that in saucy for building BOSH
|
165
|
+
"libssl-dev",
|
166
|
+
|
167
|
+
"bison",
|
168
|
+
"flex",
|
169
|
+
|
170
|
+
"gettext",
|
171
|
+
"libreadline6-dev",
|
172
|
+
"libncurses5-dev",
|
151
173
|
}
|
152
174
|
|
153
175
|
// Taken from base_apt stemcell builder stage
|
@@ -159,11 +181,6 @@ var depsProvisionerPkgsForFullStemcellCompatibility = []string{
|
|
159
181
|
"apparmor-utils",
|
160
182
|
"openssh-server",
|
161
183
|
|
162
|
-
"gettext",
|
163
|
-
"libreadline6-dev",
|
164
|
-
"libncurses5-dev",
|
165
|
-
|
166
|
-
"libssl-dev",
|
167
184
|
"libgcrypt-dev",
|
168
185
|
"ca-certificates",
|
169
186
|
|
@@ -177,9 +194,6 @@ var depsProvisionerPkgsForFullStemcellCompatibility = []string{
|
|
177
194
|
"libxslt1.1",
|
178
195
|
"libxslt1-dev",
|
179
196
|
|
180
|
-
"bison",
|
181
|
-
"flex",
|
182
|
-
|
183
197
|
// Utils
|
184
198
|
"bind9-host",
|
185
199
|
"dnsutils",
|
@@ -0,0 +1,26 @@
|
|
1
|
+
package vagrant
|
2
|
+
|
3
|
+
import (
|
4
|
+
bpagclient "boshprovisioner/agent/client"
|
5
|
+
)
|
6
|
+
|
7
|
+
// NonConfiguredVM represents provisioned Vagrant machine
|
8
|
+
// that CANNOT be communicated with via an AgentClient.
|
9
|
+
type NonConfiguredVM struct {
|
10
|
+
vmProvisioner *VMProvisioner
|
11
|
+
}
|
12
|
+
|
13
|
+
func NewNonConfiguredVM(vmProvisioner *VMProvisioner) NonConfiguredVM {
|
14
|
+
return NonConfiguredVM{vmProvisioner: vmProvisioner}
|
15
|
+
}
|
16
|
+
|
17
|
+
func (vm NonConfiguredVM) AgentClient() bpagclient.Client {
|
18
|
+
// Programmer error
|
19
|
+
panic("Must not ask for AgentClient from a non-configured VM")
|
20
|
+
}
|
21
|
+
|
22
|
+
func (vm NonConfiguredVM) Deprovision() error {
|
23
|
+
return vm.vmProvisioner.deprovision(vm)
|
24
|
+
}
|
25
|
+
|
26
|
+
func (vm NonConfiguredVM) vagrantVM() {}
|