Skip to content

Commit ef43f65

Browse files
Mohit Guptadlorenc
Mohit Gupta
authored andcommitted
support NFS sharing with the hyperkit driver
1 parent 0af893f commit ef43f65

33 files changed

+8281
-428
lines changed

Diff for: Godeps/Godeps.json

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: cmd/minikube/cmd/start.go

+21-15
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ const (
5252
humanReadableDiskSize = "disk-size"
5353
vmDriver = "vm-driver"
5454
xhyveDiskDriver = "xhyve-disk-driver"
55+
hyperkitNFSSharesRoot = "hyperkit-nfs-shares-root"
56+
hyperkitNFSShare = "hyperkit-nfs-share"
5557
kubernetesVersion = "kubernetes-version"
5658
hostOnlyCIDR = "host-only-cidr"
5759
containerRuntime = "container-runtime"
@@ -124,21 +126,23 @@ func runStart(cmd *cobra.Command, args []string) {
124126
}
125127

126128
config := cluster.MachineConfig{
127-
MinikubeISO: viper.GetString(isoURL),
128-
Memory: viper.GetInt(memory),
129-
CPUs: viper.GetInt(cpus),
130-
DiskSize: diskSizeMB,
131-
VMDriver: viper.GetString(vmDriver),
132-
XhyveDiskDriver: viper.GetString(xhyveDiskDriver),
133-
DockerEnv: dockerEnv,
134-
DockerOpt: dockerOpt,
135-
InsecureRegistry: insecureRegistry,
136-
RegistryMirror: registryMirror,
137-
HostOnlyCIDR: viper.GetString(hostOnlyCIDR),
138-
HypervVirtualSwitch: viper.GetString(hypervVirtualSwitch),
139-
KvmNetwork: viper.GetString(kvmNetwork),
140-
Downloader: pkgutil.DefaultDownloader{},
141-
DisableDriverMounts: viper.GetBool(disableDriverMounts),
129+
MinikubeISO: viper.GetString(isoURL),
130+
Memory: viper.GetInt(memory),
131+
CPUs: viper.GetInt(cpus),
132+
DiskSize: diskSizeMB,
133+
VMDriver: viper.GetString(vmDriver),
134+
XhyveDiskDriver: viper.GetString(xhyveDiskDriver),
135+
HyperkitNFSShare: viper.GetStringSlice(hyperkitNFSShare),
136+
HyperkitNFSSharesRoot: viper.GetString(hyperkitNFSSharesRoot),
137+
DockerEnv: dockerEnv,
138+
DockerOpt: dockerOpt,
139+
InsecureRegistry: insecureRegistry,
140+
RegistryMirror: registryMirror,
141+
HostOnlyCIDR: viper.GetString(hostOnlyCIDR),
142+
HypervVirtualSwitch: viper.GetString(hypervVirtualSwitch),
143+
KvmNetwork: viper.GetString(kvmNetwork),
144+
Downloader: pkgutil.DefaultDownloader{},
145+
DisableDriverMounts: viper.GetBool(disableDriverMounts),
142146
}
143147

144148
fmt.Printf("Starting local Kubernetes %s cluster...\n", viper.GetString(kubernetesVersion))
@@ -367,6 +371,8 @@ func init() {
367371
startCmd.Flags().String(hypervVirtualSwitch, "", "The hyperv virtual switch name. Defaults to first found. (only supported with HyperV driver)")
368372
startCmd.Flags().String(kvmNetwork, "default", "The KVM network name. (only supported with KVM driver)")
369373
startCmd.Flags().String(xhyveDiskDriver, "ahci-hd", "The disk driver to use [ahci-hd|virtio-blk] (only supported with xhyve driver)")
374+
startCmd.Flags().StringSlice(hyperkitNFSShare, []string{}, "Local folders to share with Guest via NFS mounts")
375+
startCmd.Flags().String(hyperkitNFSSharesRoot, "/hyperkit-nfsshares", "Where to root the NFS Shares")
370376
startCmd.Flags().StringArrayVar(&dockerEnv, "docker-env", nil, "Environment variables to pass to the Docker daemon. (format: key=value)")
371377
startCmd.Flags().StringArrayVar(&dockerOpt, "docker-opt", nil, "Specify arbitrary flags to pass to the Docker daemon. (format: key=value)")
372378
startCmd.Flags().String(apiServerName, constants.APIServerName, "The apiserver name which is used in the generated certificate for localkube/kubernetes. This can be used if you want to make the apiserver available from outside the machine")

Diff for: pkg/drivers/hyperkit/driver.go

+67
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,17 @@ import (
2222
"encoding/json"
2323
"fmt"
2424
"os"
25+
"os/user"
26+
"path"
2527
"path/filepath"
28+
"strings"
2629
"syscall"
2730
"time"
2831

2932
"github.com/docker/machine/libmachine/drivers"
3033
"github.com/docker/machine/libmachine/log"
3134
"github.com/docker/machine/libmachine/state"
35+
nfsexports "github.com/johanneswuerbach/nfsexports"
3236
hyperkit "github.com/moby/hyperkit/go"
3337
"github.com/pborman/uuid"
3438
"github.com/pkg/errors"
@@ -53,6 +57,8 @@ type Driver struct {
5357
CPU int
5458
Memory int
5559
Cmdline string
60+
NFSShares []string
61+
NFSSharesRoot string
5662
}
5763

5864
func NewDriver(hostName, storePath string) *Driver {
@@ -207,6 +213,18 @@ func (d *Driver) Start() error {
207213
if err := commonutil.RetryAfter(30, getIP, 2*time.Second); err != nil {
208214
return fmt.Errorf("IP address never found in dhcp leases file %v", err)
209215
}
216+
217+
if len(d.NFSShares) > 0 {
218+
log.Info("Setting up NFS mounts")
219+
// takes some time here for ssh / nfsd to work properly
220+
time.Sleep(time.Second * 30)
221+
err = d.setupNFSShare()
222+
if err != nil {
223+
log.Errorf("NFS setup failed: %s", err.Error())
224+
return err
225+
}
226+
}
227+
210228
return nil
211229
}
212230

@@ -232,6 +250,55 @@ func (d *Driver) extractKernel(isoPath string) error {
232250
return nil
233251
}
234252

253+
func (d *Driver) setupNFSShare() error {
254+
user, err := user.Current()
255+
if err != nil {
256+
return err
257+
}
258+
259+
hostIP, err := GetNetAddr()
260+
if err != nil {
261+
return err
262+
}
263+
264+
mountCommands := fmt.Sprintf("#/bin/bash\\n")
265+
266+
for _, share := range d.NFSShares {
267+
if !path.IsAbs(share[:]) {
268+
share = d.ResolveStorePath(share[:])
269+
}
270+
nfsConfig := fmt.Sprintf("%s %s -alldirs -mapall=%s", share[:], d.IPAddress, user.Username)
271+
272+
if _, err := nfsexports.Add("", d.nfsExportIdentifier(share[:]), nfsConfig); err != nil {
273+
if strings.Contains(err.Error(), "conflicts with existing export") {
274+
log.Info("Conflicting NFS Share not setup and ignored:", err)
275+
continue
276+
}
277+
return err
278+
}
279+
280+
root := d.NFSSharesRoot
281+
mountCommands += fmt.Sprintf("sudo mkdir -p %s/%s\\n", root, share)
282+
mountCommands += fmt.Sprintf("sudo mount -t nfs -o noacl,async %s:%s %s/%s\\n", hostIP, share, root, share)
283+
}
284+
285+
if err := nfsexports.ReloadDaemon(); err != nil {
286+
return err
287+
}
288+
289+
writeScriptCmd := fmt.Sprintf("echo -e \"%s\" | sh", mountCommands)
290+
291+
if _, err := drivers.RunSSHCommandFromDriver(d, writeScriptCmd); err != nil {
292+
return err
293+
}
294+
295+
return nil
296+
}
297+
298+
func (d *Driver) nfsExportIdentifier(path string) string {
299+
return fmt.Sprintf("docker-machine-driver-hyperkit %s-%s", d.MachineName, path)
300+
}
301+
235302
func (d *Driver) sendSignal(s os.Signal) error {
236303
pid := d.getPid()
237304
proc, err := os.FindProcess(pid)

Diff for: pkg/drivers/hyperkit/vmnet.go

+31-1
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,38 @@ limitations under the License.
1818

1919
package hyperkit
2020

21-
import vmnet "github.com/zchee/go-vmnet"
21+
import (
22+
"fmt"
23+
"net"
24+
"os"
25+
"os/exec"
26+
"strings"
27+
28+
vmnet "github.com/zchee/go-vmnet"
29+
)
30+
31+
const (
32+
CONFIG_PLIST = "/Library/Preferences/SystemConfiguration/com.apple.vmnet"
33+
NET_ADDR_KEY = "Shared_Net_Address"
34+
)
2235

2336
func GetMACAddressFromUUID(UUID string) (string, error) {
2437
return vmnet.GetMACAddressFromUUID(UUID)
2538
}
39+
40+
func GetNetAddr() (net.IP, error) {
41+
_, err := os.Stat(CONFIG_PLIST + ".plist")
42+
if err != nil {
43+
return nil, fmt.Errorf("Does not exist %s", CONFIG_PLIST+".plist")
44+
}
45+
46+
out, err := exec.Command("defaults", "read", CONFIG_PLIST, NET_ADDR_KEY).Output()
47+
if err != nil {
48+
return nil, err
49+
}
50+
ip := net.ParseIP(strings.TrimSpace(string(out)))
51+
if ip == nil {
52+
return nil, fmt.Errorf("Could not get the network address for vmnet")
53+
}
54+
return ip, nil
55+
}

Diff for: pkg/minikube/cluster/cluster_darwin.go

+2
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ func createHyperkitHost(config MachineConfig) *hyperkit.Driver {
6969
DiskSize: config.DiskSize,
7070
Memory: config.Memory,
7171
CPU: config.CPUs,
72+
NFSShares: config.HyperkitNFSShare,
73+
NFSSharesRoot: config.HyperkitNFSSharesRoot,
7274
Cmdline: "loglevel=3 user=docker console=ttyS0 console=tty0 noembed nomodeset norestore waitusb=10 systemd.legacy_systemd_cgroup_controller=yes base host=" + cfg.GetMachineName(),
7375
}
7476
}

Diff for: pkg/minikube/cluster/types.go

+17-15
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,23 @@ import (
2323

2424
// MachineConfig contains the parameters used to start a cluster.
2525
type MachineConfig struct {
26-
MinikubeISO string
27-
Memory int
28-
CPUs int
29-
DiskSize int
30-
VMDriver string
31-
XhyveDiskDriver string // Only used by the xhyve driver
32-
DockerEnv []string // Each entry is formatted as KEY=VALUE.
33-
InsecureRegistry []string
34-
RegistryMirror []string
35-
HostOnlyCIDR string // Only used by the virtualbox driver
36-
HypervVirtualSwitch string
37-
KvmNetwork string // Only used by the KVM driver
38-
Downloader util.ISODownloader `json:"-"`
39-
DockerOpt []string // Each entry is formatted as KEY=VALUE.
40-
DisableDriverMounts bool // Only used by virtualbox and xhyve
26+
MinikubeISO string
27+
Memory int
28+
CPUs int
29+
DiskSize int
30+
VMDriver string
31+
XhyveDiskDriver string // Only used by the xhyve driver
32+
DockerEnv []string // Each entry is formatted as KEY=VALUE.
33+
InsecureRegistry []string
34+
RegistryMirror []string
35+
HostOnlyCIDR string // Only used by the virtualbox driver
36+
HypervVirtualSwitch string
37+
KvmNetwork string // Only used by the KVM driver
38+
Downloader util.ISODownloader `json:"-"`
39+
DockerOpt []string // Each entry is formatted as KEY=VALUE.
40+
DisableDriverMounts bool // Only used by virtualbox and xhyve
41+
HyperkitNFSShare []string
42+
HyperkitNFSSharesRoot string
4143
}
4244

4345
// Config contains machine and k8s config

Diff for: vendor/github.com/docker/machine/libmachine/drivers/utils.go

+2-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: vendor/github.com/pmezard/go-difflib/LICENSE

+27
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)