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.
Files changed (33) hide show
  1. data/dev/Vagrantfile +2 -2
  2. data/dev/example-winston-manifest.yml +5 -8
  3. data/go/src/boshprovisioner/instance/instance.go +43 -0
  4. data/go/src/boshprovisioner/instance/instance_provisioner.go +48 -0
  5. data/go/src/boshprovisioner/instance/updater/updater.go +31 -36
  6. data/go/src/boshprovisioner/instance/updater/updater_factory.go +0 -3
  7. data/go/src/boshprovisioner/main/config.go +3 -0
  8. data/go/src/boshprovisioner/main/main.go +8 -6
  9. data/go/src/boshprovisioner/provisioner/deployment_provisioner.go +36 -5
  10. data/go/src/boshprovisioner/provisioner/release_compiler.go +2 -0
  11. data/go/src/boshprovisioner/vm/{agent_provisioner.go → vagrant/agent_provisioner.go} +1 -1
  12. data/go/src/boshprovisioner/vm/{asset_manager.go → vagrant/asset_manager.go} +0 -0
  13. data/go/src/boshprovisioner/vm/vagrant/deps_provisioner.go +200 -0
  14. data/go/src/boshprovisioner/vm/{monit_provisioner.go → vagrant/monit_provisioner.go} +3 -1
  15. data/go/src/boshprovisioner/vm/{runit_provisioner.go → vagrant/runit_provisioner.go} +15 -11
  16. data/go/src/boshprovisioner/vm/{simple_cmds.go → vagrant/simple_cmds.go} +0 -0
  17. data/go/src/boshprovisioner/vm/{vcap_user_provisioner.go → vagrant/vcap_user_provisioner.go} +0 -0
  18. data/go/src/boshprovisioner/vm/vagrant/vm.go +27 -0
  19. data/go/src/boshprovisioner/vm/vagrant/vm_provisioner.go +81 -0
  20. data/go/src/boshprovisioner/vm/{vm_provisioner_factory.go → vagrant/vm_provisioner_factory.go} +14 -7
  21. data/go/src/boshprovisioner/vm/vm_interface.go +26 -0
  22. data/lib/vagrant-bosh/assets/provisioner +0 -0
  23. data/lib/vagrant-bosh/bootstrapper.rb +10 -6
  24. data/lib/vagrant-bosh/config.rb +6 -0
  25. data/lib/vagrant-bosh/provisioner.rb +1 -1
  26. data/lib/vagrant-bosh/version.rb +1 -1
  27. metadata +22 -19
  28. checksums.yaml +0 -7
  29. data/go/src/boshprovisioner/instance/updater/preparer.go +0 -39
  30. data/go/src/boshprovisioner/provisioner/instance_provisioner.go +0 -48
  31. data/go/src/boshprovisioner/vm/deps_provisioner.go +0 -92
  32. data/go/src/boshprovisioner/vm/vm.go +0 -19
  33. data/go/src/boshprovisioner/vm/vm_provisioner.go +0 -57
@@ -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 runitProvisionerLogTag = "RunitProvisioner"
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 i := 0; i < 20; i++ {
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(100 * time.Millisecond)
225
+ time.Sleep(runitStopStepDuration)
222
226
  }
223
227
 
224
228
  return bosherr.New("Failed to stop runsv for %s. Output: %s", name, lastStatusStdout)
@@ -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
+ }
@@ -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 string
15
- mbus string
16
- blobstoreConfig map[string]interface{}
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: assetsDir,
36
- mbus: mbus,
37
- blobstoreConfig: blobstoreConfig,
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,