@@ -25,19 +25,21 @@ import (
25
25
"os/user"
26
26
"path"
27
27
"path/filepath"
28
+ "strconv"
28
29
"strings"
29
30
"syscall"
30
31
"time"
31
32
33
+ "regexp"
34
+
32
35
"github.com/docker/machine/libmachine/drivers"
33
36
"github.com/docker/machine/libmachine/log"
37
+ "github.com/docker/machine/libmachine/mcnutils"
34
38
"github.com/docker/machine/libmachine/state"
35
39
nfsexports "github.com/johanneswuerbach/nfsexports"
40
+ pkgdrivers "github.com/machine-drivers/docker-machine-driver-hyperkit/pkg/drivers"
36
41
hyperkit "github.com/moby/hyperkit/go"
37
42
"github.com/pkg/errors"
38
- pkgdrivers "github.com/machine-drivers/docker-machine-driver-hyperkit/pkg/drivers"
39
- "regexp"
40
- "github.com/docker/machine/libmachine/mcnutils"
41
43
)
42
44
43
45
const (
@@ -66,10 +68,12 @@ type Driver struct {
66
68
NFSShares []string
67
69
NFSSharesRoot string
68
70
UUID string
69
- BootKernel string
70
- BootInitrd string
71
- Initrd string
72
- Vmlinuz string
71
+ BootKernel string
72
+ BootInitrd string
73
+ Initrd string
74
+ Vmlinuz string
75
+ VpnKitSock string
76
+ VSockPorts []string
73
77
}
74
78
75
79
func NewDriver (hostName , storePath string ) * Driver {
@@ -103,7 +107,7 @@ func (d *Driver) Create() error {
103
107
104
108
isoPath := d .ResolveStorePath (isoFilename )
105
109
if err := d .extractKernel (isoPath ); err != nil {
106
- return err
110
+ return errors . Wrap ( err , "extracting kernel" )
107
111
}
108
112
109
113
return d .Start ()
@@ -175,25 +179,33 @@ func (d *Driver) Restart() error {
175
179
176
180
// Start a host
177
181
func (d * Driver ) Start () error {
178
- h , err := hyperkit .New ("" , "" , filepath .Join (d .StorePath , "machines" , d .MachineName ))
182
+ log .Infof ("SEBDEBUG - VpnKitSock=%s\n " , d .VpnKitSock )
183
+ h , err := hyperkit .New ("" , d .VpnKitSock , filepath .Join (d .StorePath , "machines" , d .MachineName ))
179
184
if err != nil {
180
- return err
185
+ return errors . Wrap ( err , "new-ing Hyperkit" )
181
186
}
182
187
183
188
// TODO: handle the rest of our settings.
184
189
h .Kernel = d .ResolveStorePath (d .Vmlinuz )
185
- h .Initrd = d .ResolveStorePath (d .Initrd )
190
+ h .Initrd = d .ResolveStorePath (d .Initrd )
186
191
h .VMNet = true
187
192
h .ISOImages = []string {d .ResolveStorePath (isoFilename )}
188
193
h .Console = hyperkit .ConsoleFile
189
194
h .CPUs = d .CPU
190
195
h .Memory = d .Memory
191
196
h .UUID = d .UUID
192
197
198
+ if vsockPorts , err := d .extractVSockPorts (); err != nil {
199
+ return err
200
+ } else if len (vsockPorts ) >= 1 {
201
+ h .VSock = true
202
+ h .VSockPorts = vsockPorts
203
+ }
204
+
193
205
log .Infof ("Using UUID %s" , h .UUID )
194
206
mac , err := GetMACAddressFromUUID (h .UUID )
195
207
if err != nil {
196
- return err
208
+ return errors . Wrap ( err , "getting MAC address from UUID" )
197
209
}
198
210
199
211
// Need to strip 0's
@@ -208,7 +220,7 @@ func (d *Driver) Start() error {
208
220
}
209
221
log .Infof ("Starting with cmdline: %s" , d .Cmdline )
210
222
if err := h .Start (d .Cmdline ); err != nil {
211
- return err
223
+ return errors . Wrapf ( err , "starting with cmd line: %s" , d . Cmdline )
212
224
}
213
225
214
226
getIP := func () error {
@@ -275,11 +287,11 @@ func (d *Driver) extractKernel(isoPath string) error {
275
287
return nil
276
288
})
277
289
}
278
-
279
- if d .BootKernel == "" || d .BootInitrd == "" {
290
+
291
+ if d .BootKernel == "" || d .BootInitrd == "" {
280
292
err := fmt .Errorf ("==== Can't extract Kernel and Ramdisk file ====" )
281
293
return err
282
- }
294
+ }
283
295
284
296
dest := d .ResolveStorePath (d .Vmlinuz )
285
297
log .Debugf ("Extracting %s into %s" , d .BootKernel , dest )
@@ -296,6 +308,31 @@ func (d *Driver) extractKernel(isoPath string) error {
296
308
return nil
297
309
}
298
310
311
+ // InvalidPortNumberError implements the Error interface.
312
+ // It is used when a VSockPorts port number cannot be recognised as an integer.
313
+ type InvalidPortNumberError string
314
+
315
+ // Error returns an Error for InvalidPortNumberError
316
+ func (port InvalidPortNumberError ) Error () string {
317
+ return fmt .Sprintf ("vsock port '%s' is not an integer" , string (port ))
318
+ }
319
+
320
+ func (d * Driver ) extractVSockPorts () ([]int , error ) {
321
+ vsockPorts := make ([]int , 0 , len (d .VSockPorts ))
322
+
323
+ for _ , port := range d .VSockPorts {
324
+ p , err := strconv .Atoi (port )
325
+ if err != nil {
326
+ var err InvalidPortNumberError
327
+ err = InvalidPortNumberError (port )
328
+ return nil , err
329
+ }
330
+ vsockPorts = append (vsockPorts , p )
331
+ }
332
+
333
+ return vsockPorts , nil
334
+ }
335
+
299
336
func (d * Driver ) setupNFSShare () error {
300
337
user , err := user .Current ()
301
338
if err != nil {
0 commit comments