vagrant-bosh 0.0.2 → 0.0.3
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/dev/Vagrantfile +2 -2
- data/dev/example-winston-manifest.yml +5 -8
- data/go/src/boshprovisioner/instance/instance.go +43 -0
- data/go/src/boshprovisioner/instance/instance_provisioner.go +48 -0
- data/go/src/boshprovisioner/instance/updater/updater.go +31 -36
- data/go/src/boshprovisioner/instance/updater/updater_factory.go +0 -3
- data/go/src/boshprovisioner/main/config.go +3 -0
- data/go/src/boshprovisioner/main/main.go +8 -6
- data/go/src/boshprovisioner/provisioner/deployment_provisioner.go +36 -5
- data/go/src/boshprovisioner/provisioner/release_compiler.go +2 -0
- data/go/src/boshprovisioner/vm/{agent_provisioner.go → vagrant/agent_provisioner.go} +1 -1
- data/go/src/boshprovisioner/vm/{asset_manager.go → vagrant/asset_manager.go} +0 -0
- data/go/src/boshprovisioner/vm/vagrant/deps_provisioner.go +200 -0
- data/go/src/boshprovisioner/vm/{monit_provisioner.go → vagrant/monit_provisioner.go} +3 -1
- data/go/src/boshprovisioner/vm/{runit_provisioner.go → vagrant/runit_provisioner.go} +15 -11
- data/go/src/boshprovisioner/vm/{simple_cmds.go → vagrant/simple_cmds.go} +0 -0
- data/go/src/boshprovisioner/vm/{vcap_user_provisioner.go → vagrant/vcap_user_provisioner.go} +0 -0
- data/go/src/boshprovisioner/vm/vagrant/vm.go +27 -0
- data/go/src/boshprovisioner/vm/vagrant/vm_provisioner.go +81 -0
- data/go/src/boshprovisioner/vm/{vm_provisioner_factory.go → vagrant/vm_provisioner_factory.go} +14 -7
- data/go/src/boshprovisioner/vm/vm_interface.go +26 -0
- data/lib/vagrant-bosh/assets/provisioner +0 -0
- data/lib/vagrant-bosh/bootstrapper.rb +10 -6
- data/lib/vagrant-bosh/config.rb +6 -0
- data/lib/vagrant-bosh/provisioner.rb +1 -1
- data/lib/vagrant-bosh/version.rb +1 -1
- metadata +22 -19
- checksums.yaml +0 -7
- data/go/src/boshprovisioner/instance/updater/preparer.go +0 -39
- data/go/src/boshprovisioner/provisioner/instance_provisioner.go +0 -48
- data/go/src/boshprovisioner/vm/deps_provisioner.go +0 -92
- data/go/src/boshprovisioner/vm/vm.go +0 -19
- data/go/src/boshprovisioner/vm/vm_provisioner.go +0 -57
File without changes
|
@@ -0,0 +1,200 @@
|
|
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
|
+
depsProvisionerAptGetUpdateMsg = "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
|
+
fullStemcellCompatibility bool
|
25
|
+
|
26
|
+
runner boshsys.CmdRunner
|
27
|
+
eventLog bpeventlog.Log
|
28
|
+
logger boshlog.Logger
|
29
|
+
}
|
30
|
+
|
31
|
+
func NewDepsProvisioner(
|
32
|
+
fullStemcellCompatibility bool,
|
33
|
+
runner boshsys.CmdRunner,
|
34
|
+
eventLog bpeventlog.Log,
|
35
|
+
logger boshlog.Logger,
|
36
|
+
) DepsProvisioner {
|
37
|
+
return DepsProvisioner{
|
38
|
+
fullStemcellCompatibility: fullStemcellCompatibility,
|
39
|
+
|
40
|
+
runner: runner,
|
41
|
+
eventLog: eventLog,
|
42
|
+
logger: logger,
|
43
|
+
}
|
44
|
+
}
|
45
|
+
|
46
|
+
func (p DepsProvisioner) Provision() error {
|
47
|
+
pkgNames := depsProvisionerPkgsForMinimumStemcellCompatibility
|
48
|
+
|
49
|
+
if p.fullStemcellCompatibility {
|
50
|
+
pkgNames = append(pkgNames, depsProvisionerPkgsForFullStemcellCompatibility...)
|
51
|
+
}
|
52
|
+
|
53
|
+
stage := p.eventLog.BeginStage("Installing dependencies", len(pkgNames))
|
54
|
+
|
55
|
+
installedPkgs, err := p.listInstalledPkgs()
|
56
|
+
if err != nil {
|
57
|
+
return bosherr.WrapError(err, "Listing installed packages")
|
58
|
+
}
|
59
|
+
|
60
|
+
for _, pkgName := range pkgNames {
|
61
|
+
task := stage.BeginTask(fmt.Sprintf("Package %s", pkgName))
|
62
|
+
|
63
|
+
if p.isPkgInstalled(pkgName, installedPkgs) {
|
64
|
+
p.logger.Debug(depsProvisionerLogTag, "Package %s is already installed", pkgName)
|
65
|
+
task.End(nil)
|
66
|
+
continue
|
67
|
+
}
|
68
|
+
|
69
|
+
err := task.End(p.installPkg(pkgName))
|
70
|
+
if err != nil {
|
71
|
+
return bosherr.WrapError(err, "Installing %s", pkgName)
|
72
|
+
}
|
73
|
+
}
|
74
|
+
|
75
|
+
return nil
|
76
|
+
}
|
77
|
+
|
78
|
+
func (p DepsProvisioner) installPkg(name string) error {
|
79
|
+
p.logger.Debug(depsProvisionerLogTag, "Installing package %s", name)
|
80
|
+
|
81
|
+
_, _, _, err := p.runner.RunCommand("apt-get", "-y", "install", name)
|
82
|
+
if err == nil {
|
83
|
+
return nil
|
84
|
+
}
|
85
|
+
|
86
|
+
// Avoid running 'apt-get update' since it usually takes 30sec
|
87
|
+
if strings.Contains(err.Error(), depsProvisionerAptGetUpdateMsg) {
|
88
|
+
_, _, _, err := p.runner.RunCommand("apt-get", "-y", "update")
|
89
|
+
if err != nil {
|
90
|
+
return bosherr.WrapError(err, "Updating sources")
|
91
|
+
}
|
92
|
+
|
93
|
+
// Try second time after updating
|
94
|
+
_, _, _, err = p.runner.RunCommand("apt-get", "-y", "install", name)
|
95
|
+
if err != nil {
|
96
|
+
return bosherr.WrapError(err, "Installing %s after updating", name)
|
97
|
+
}
|
98
|
+
}
|
99
|
+
|
100
|
+
return nil
|
101
|
+
}
|
102
|
+
|
103
|
+
func (p DepsProvisioner) listInstalledPkgs() ([]string, error) {
|
104
|
+
var installedPkgs []string
|
105
|
+
|
106
|
+
installedPkgStdout, _, _, err := p.runner.RunCommand("dpkg", "--get-selections")
|
107
|
+
if err != nil {
|
108
|
+
return installedPkgs, bosherr.WrapError(err, "dkpg query")
|
109
|
+
}
|
110
|
+
|
111
|
+
for _, line := range strings.Split(installedPkgStdout, "\n") {
|
112
|
+
pieces := strings.Fields(line)
|
113
|
+
|
114
|
+
// Last line is empty
|
115
|
+
if len(pieces) == 2 && pieces[1] == "install" {
|
116
|
+
installedPkgs = append(installedPkgs, pieces[0])
|
117
|
+
}
|
118
|
+
}
|
119
|
+
|
120
|
+
return installedPkgs, nil
|
121
|
+
}
|
122
|
+
|
123
|
+
func (p DepsProvisioner) isPkgInstalled(pkgName string, installedPkgs []string) bool {
|
124
|
+
for _, installedPkgName := range installedPkgs {
|
125
|
+
if pkgName == installedPkgName {
|
126
|
+
return true
|
127
|
+
}
|
128
|
+
}
|
129
|
+
|
130
|
+
return false
|
131
|
+
}
|
132
|
+
|
133
|
+
var depsProvisionerPkgsForMinimumStemcellCompatibility = []string{
|
134
|
+
// For packaging scripts in BOSH releases
|
135
|
+
"build-essential", // 16sec
|
136
|
+
"cmake", // 6sec
|
137
|
+
|
138
|
+
"libcap2-bin",
|
139
|
+
"libcap2-dev",
|
140
|
+
|
141
|
+
"libbz2-1.0", // noop on precise64 Vagrant box
|
142
|
+
"libbz2-dev", // 2sec
|
143
|
+
"libxslt1-dev", // 2sec
|
144
|
+
"libxml2-dev", // 2sec
|
145
|
+
|
146
|
+
// Used by BOSH Agent
|
147
|
+
"iputils-arping",
|
148
|
+
|
149
|
+
// For warden
|
150
|
+
"quota", // 1sec
|
151
|
+
}
|
152
|
+
|
153
|
+
// Taken from base_apt stemcell builder stage
|
154
|
+
var depsProvisionerPkgsForFullStemcellCompatibility = []string{
|
155
|
+
"libaio1",
|
156
|
+
"uuid-dev",
|
157
|
+
"nfs-common",
|
158
|
+
"zlib1g-dev",
|
159
|
+
"apparmor-utils",
|
160
|
+
"openssh-server",
|
161
|
+
|
162
|
+
"gettext",
|
163
|
+
"libreadline6-dev",
|
164
|
+
"libncurses5-dev",
|
165
|
+
|
166
|
+
"libssl-dev",
|
167
|
+
"libgcrypt-dev",
|
168
|
+
"ca-certificates",
|
169
|
+
|
170
|
+
// CURL
|
171
|
+
"libcurl3",
|
172
|
+
"libcurl3-dev",
|
173
|
+
|
174
|
+
// XML
|
175
|
+
"libxml2",
|
176
|
+
"libxml2-dev",
|
177
|
+
"libxslt1.1",
|
178
|
+
"libxslt1-dev",
|
179
|
+
|
180
|
+
"bison",
|
181
|
+
"flex",
|
182
|
+
|
183
|
+
// Utils
|
184
|
+
"bind9-host",
|
185
|
+
"dnsutils",
|
186
|
+
"zip",
|
187
|
+
"unzip",
|
188
|
+
"psmisc",
|
189
|
+
"lsof",
|
190
|
+
"strace",
|
191
|
+
"curl",
|
192
|
+
"wget",
|
193
|
+
"gdb",
|
194
|
+
"sysstat",
|
195
|
+
"rsync",
|
196
|
+
|
197
|
+
"iptables",
|
198
|
+
"tcpdump",
|
199
|
+
"traceroute",
|
200
|
+
}
|
@@ -1,6 +1,8 @@
|
|
1
1
|
package vm
|
2
2
|
|
3
3
|
import (
|
4
|
+
"time"
|
5
|
+
|
4
6
|
bosherr "bosh/errors"
|
5
7
|
boshlog "bosh/logger"
|
6
8
|
)
|
@@ -42,7 +44,7 @@ func (p MonitProvisioner) Provision() error {
|
|
42
44
|
return bosherr.WrapError(err, "Configuring monitrc")
|
43
45
|
}
|
44
46
|
|
45
|
-
err = p.runitProvisioner.Provision("monit")
|
47
|
+
err = p.runitProvisioner.Provision("monit", 1*time.Minute)
|
46
48
|
if err != nil {
|
47
49
|
return bosherr.WrapError(err, "Provisioning monit with runit")
|
48
50
|
}
|
@@ -11,7 +11,10 @@ import (
|
|
11
11
|
boshsys "bosh/system"
|
12
12
|
)
|
13
13
|
|
14
|
-
const
|
14
|
+
const (
|
15
|
+
runitProvisionerLogTag = "RunitProvisioner"
|
16
|
+
runitStopStepDuration = 1 * time.Second
|
17
|
+
)
|
15
18
|
|
16
19
|
var (
|
17
20
|
// Matches 'svlogd -tt /var/vcap/bosh/log'
|
@@ -47,13 +50,13 @@ func NewRunitProvisioner(
|
|
47
50
|
}
|
48
51
|
}
|
49
52
|
|
50
|
-
func (p RunitProvisioner) Provision(name string) error {
|
53
|
+
func (p RunitProvisioner) Provision(name string, stopTimeout time.Duration) error {
|
51
54
|
err := p.installRunit()
|
52
55
|
if err != nil {
|
53
56
|
return bosherr.WrapError(err, "Installing runit")
|
54
57
|
}
|
55
58
|
|
56
|
-
err = p.setUpService(name)
|
59
|
+
err = p.setUpService(name, stopTimeout)
|
57
60
|
if err != nil {
|
58
61
|
return bosherr.WrapError(err, "Setting up service")
|
59
62
|
}
|
@@ -83,13 +86,13 @@ func (p RunitProvisioner) installRunit() error {
|
|
83
86
|
return nil
|
84
87
|
}
|
85
88
|
|
86
|
-
func (p RunitProvisioner) setUpService(name string) error {
|
89
|
+
func (p RunitProvisioner) setUpService(name string, stopTimeout time.Duration) error {
|
87
90
|
p.logger.Info(runitProvisionerLogTag, "Setting up %s service", name)
|
88
91
|
|
89
92
|
servicePath := fmt.Sprintf("/etc/sv/%s", name)
|
90
93
|
enableServicePath := fmt.Sprintf("/etc/service/%s", name)
|
91
94
|
|
92
|
-
err := p.stopRunAndLog(servicePath, enableServicePath, name)
|
95
|
+
err := p.stopRunAndLog(servicePath, enableServicePath, name, stopTimeout)
|
93
96
|
if err != nil {
|
94
97
|
return bosherr.WrapError(err, "Stopping run and log")
|
95
98
|
}
|
@@ -169,13 +172,13 @@ func (p RunitProvisioner) setUpLog(servicePath, name string) error {
|
|
169
172
|
return nil
|
170
173
|
}
|
171
174
|
|
172
|
-
func (p RunitProvisioner) stopRunAndLog(servicePath, enableServicePath, name string) error {
|
173
|
-
err := p.stopRunsv(name)
|
175
|
+
func (p RunitProvisioner) stopRunAndLog(servicePath, enableServicePath, name string, stopTimeout time.Duration) error {
|
176
|
+
err := p.stopRunsv(name, stopTimeout)
|
174
177
|
if err != nil {
|
175
178
|
return bosherr.WrapError(err, "Stopping service")
|
176
179
|
}
|
177
180
|
|
178
|
-
err = p.stopRunsv(fmt.Sprintf("%s/log", name))
|
181
|
+
err = p.stopRunsv(fmt.Sprintf("%s/log", name), stopTimeout)
|
179
182
|
if err != nil {
|
180
183
|
return bosherr.WrapError(err, "Stopping log service")
|
181
184
|
}
|
@@ -196,7 +199,7 @@ func (p RunitProvisioner) startRunAndLog(servicePath, enableServicePath, name st
|
|
196
199
|
return err
|
197
200
|
}
|
198
201
|
|
199
|
-
func (p RunitProvisioner) stopRunsv(name string) error {
|
202
|
+
func (p RunitProvisioner) stopRunsv(name string, stopTimeout time.Duration) error {
|
200
203
|
p.logger.Info(runitProvisionerLogTag, "Stopping runsv")
|
201
204
|
|
202
205
|
downStdout, _, _, err := p.runner.RunCommand("sv", "down", name)
|
@@ -210,15 +213,16 @@ func (p RunitProvisioner) stopRunsv(name string) error {
|
|
210
213
|
}
|
211
214
|
|
212
215
|
var lastStatusStdout string
|
216
|
+
var passedDuration time.Duration
|
213
217
|
|
214
|
-
for
|
218
|
+
for ; passedDuration < stopTimeout; passedDuration += runitStopStepDuration {
|
215
219
|
lastStatusStdout, _, _, _ = p.runner.RunCommand("sv", "status", name)
|
216
220
|
|
217
221
|
if runitStatusDownRegex.MatchString(lastStatusStdout) {
|
218
222
|
return nil
|
219
223
|
}
|
220
224
|
|
221
|
-
time.Sleep(
|
225
|
+
time.Sleep(runitStopStepDuration)
|
222
226
|
}
|
223
227
|
|
224
228
|
return bosherr.New("Failed to stop runsv for %s. Output: %s", name, lastStatusStdout)
|
File without changes
|
data/go/src/boshprovisioner/vm/{vcap_user_provisioner.go → vagrant/vcap_user_provisioner.go}
RENAMED
File without changes
|
@@ -0,0 +1,27 @@
|
|
1
|
+
package vm
|
2
|
+
|
3
|
+
import (
|
4
|
+
bpagclient "boshprovisioner/agent/client"
|
5
|
+
)
|
6
|
+
|
7
|
+
// VM represents already provisioned Vagrant machine
|
8
|
+
// that can be communicated with via an AgentClient.
|
9
|
+
type VM struct {
|
10
|
+
vmProvisioner *VMProvisioner
|
11
|
+
agentClient bpagclient.Client
|
12
|
+
}
|
13
|
+
|
14
|
+
func NewVM(vmProvisioner *VMProvisioner, agentClient bpagclient.Client) VM {
|
15
|
+
return VM{
|
16
|
+
vmProvisioner: vmProvisioner,
|
17
|
+
agentClient: agentClient,
|
18
|
+
}
|
19
|
+
}
|
20
|
+
|
21
|
+
func (vm VM) AgentClient() bpagclient.Client {
|
22
|
+
return vm.agentClient
|
23
|
+
}
|
24
|
+
|
25
|
+
func (vm VM) Deprovision() error {
|
26
|
+
return vm.vmProvisioner.Deprovision(vm)
|
27
|
+
}
|
@@ -0,0 +1,81 @@
|
|
1
|
+
package vm
|
2
|
+
|
3
|
+
import (
|
4
|
+
bosherr "bosh/errors"
|
5
|
+
boshlog "bosh/logger"
|
6
|
+
|
7
|
+
bpdep "boshprovisioner/deployment"
|
8
|
+
bpvm "boshprovisioner/vm"
|
9
|
+
)
|
10
|
+
|
11
|
+
// VMProvisioner installs system dependencies that are usually
|
12
|
+
// found on a stemcell, adds vcap user and finally install Agent and Monit.
|
13
|
+
type VMProvisioner struct {
|
14
|
+
vcapUserProvisioner VCAPUserProvisioner
|
15
|
+
depsProvisioner DepsProvisioner
|
16
|
+
agentProvisioner AgentProvisioner
|
17
|
+
|
18
|
+
// Cannot provision more than 1 VM at a time until previous VM is deprovisioned.
|
19
|
+
vmProvisioned bool
|
20
|
+
|
21
|
+
// Remember if we have recently run provisioning for a VM to skip it next time
|
22
|
+
vmPreviouslyProvisioned bool
|
23
|
+
|
24
|
+
logger boshlog.Logger
|
25
|
+
}
|
26
|
+
|
27
|
+
func NewVMProvisioner(
|
28
|
+
vcapUserProvisioner VCAPUserProvisioner,
|
29
|
+
depsProvisioner DepsProvisioner,
|
30
|
+
agentProvisioner AgentProvisioner,
|
31
|
+
logger boshlog.Logger,
|
32
|
+
) *VMProvisioner {
|
33
|
+
return &VMProvisioner{
|
34
|
+
vcapUserProvisioner: vcapUserProvisioner,
|
35
|
+
depsProvisioner: depsProvisioner,
|
36
|
+
agentProvisioner: agentProvisioner,
|
37
|
+
|
38
|
+
logger: logger,
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
func (p *VMProvisioner) Provision(instance bpdep.Instance) (bpvm.VM, error) {
|
43
|
+
var vm VM
|
44
|
+
|
45
|
+
if p.vmProvisioned {
|
46
|
+
return vm, bosherr.New("Vagrant VM is already provisioned")
|
47
|
+
}
|
48
|
+
|
49
|
+
if !p.vmPreviouslyProvisioned {
|
50
|
+
err := p.vcapUserProvisioner.Provision()
|
51
|
+
if err != nil {
|
52
|
+
return vm, bosherr.WrapError(err, "Provisioning vcap user")
|
53
|
+
}
|
54
|
+
|
55
|
+
err = p.depsProvisioner.Provision()
|
56
|
+
if err != nil {
|
57
|
+
return vm, bosherr.WrapError(err, "Provisioning dependencies")
|
58
|
+
}
|
59
|
+
}
|
60
|
+
|
61
|
+
p.vmPreviouslyProvisioned = true
|
62
|
+
|
63
|
+
agentClient, err := p.agentProvisioner.Provision(instance)
|
64
|
+
if err != nil {
|
65
|
+
return vm, bosherr.WrapError(err, "Provisioning agent")
|
66
|
+
}
|
67
|
+
|
68
|
+
p.vmProvisioned = true
|
69
|
+
|
70
|
+
return NewVM(p, agentClient), nil
|
71
|
+
}
|
72
|
+
|
73
|
+
func (p *VMProvisioner) Deprovision(vm VM) error {
|
74
|
+
if !p.vmProvisioned {
|
75
|
+
return bosherr.New("Vagrant VM is not provisioned")
|
76
|
+
}
|
77
|
+
|
78
|
+
p.vmProvisioned = false
|
79
|
+
|
80
|
+
return nil
|
81
|
+
}
|
data/go/src/boshprovisioner/vm/{vm_provisioner_factory.go → vagrant/vm_provisioner_factory.go}
RENAMED
@@ -5,15 +5,18 @@ import (
|
|
5
5
|
boshsys "bosh/system"
|
6
6
|
|
7
7
|
bpeventlog "boshprovisioner/eventlog"
|
8
|
+
bpvm "boshprovisioner/vm"
|
8
9
|
)
|
9
10
|
|
10
11
|
type VMProvisionerFactory struct {
|
11
12
|
fs boshsys.FileSystem
|
12
13
|
runner boshsys.CmdRunner
|
13
14
|
|
14
|
-
assetsDir
|
15
|
-
mbus
|
16
|
-
|
15
|
+
assetsDir string
|
16
|
+
mbus string
|
17
|
+
|
18
|
+
blobstoreConfig map[string]interface{}
|
19
|
+
vmProvisionerConfig bpvm.VMProvisionerConfig
|
17
20
|
|
18
21
|
eventLog bpeventlog.Log
|
19
22
|
logger boshlog.Logger
|
@@ -25,6 +28,7 @@ func NewVMProvisionerFactory(
|
|
25
28
|
assetsDir string,
|
26
29
|
mbus string,
|
27
30
|
blobstoreConfig map[string]interface{},
|
31
|
+
vmProvisionerConfig bpvm.VMProvisionerConfig,
|
28
32
|
eventLog bpeventlog.Log,
|
29
33
|
logger boshlog.Logger,
|
30
34
|
) VMProvisionerFactory {
|
@@ -32,16 +36,18 @@ func NewVMProvisionerFactory(
|
|
32
36
|
fs: fs,
|
33
37
|
runner: runner,
|
34
38
|
|
35
|
-
assetsDir:
|
36
|
-
mbus:
|
37
|
-
|
39
|
+
assetsDir: assetsDir,
|
40
|
+
mbus: mbus,
|
41
|
+
|
42
|
+
blobstoreConfig: blobstoreConfig,
|
43
|
+
vmProvisionerConfig: vmProvisionerConfig,
|
38
44
|
|
39
45
|
eventLog: eventLog,
|
40
46
|
logger: logger,
|
41
47
|
}
|
42
48
|
}
|
43
49
|
|
44
|
-
func (f VMProvisionerFactory) NewVMProvisioner() VMProvisioner {
|
50
|
+
func (f VMProvisionerFactory) NewVMProvisioner() *VMProvisioner {
|
45
51
|
cmds := NewSimpleCmds(f.runner, f.logger)
|
46
52
|
|
47
53
|
vcapUserProvisioner := NewVCAPUserProvisioner(
|
@@ -69,6 +75,7 @@ func (f VMProvisionerFactory) NewVMProvisioner() VMProvisioner {
|
|
69
75
|
)
|
70
76
|
|
71
77
|
depsProvisioner := NewDepsProvisioner(
|
78
|
+
f.vmProvisionerConfig.FullStemcellCompatibility,
|
72
79
|
f.runner,
|
73
80
|
f.eventLog,
|
74
81
|
f.logger,
|