vagrant-bosh 0.0.3 → 0.0.4
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.
- 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() {}
|