forked from openshift/origin
-
Notifications
You must be signed in to change notification settings - Fork 1
/
host.go
74 lines (64 loc) · 2.21 KB
/
host.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package host
import (
"fmt"
"github.com/openshift/origin/pkg/oc/clusterup/docker/dockerhelper"
"github.com/openshift/origin/pkg/oc/clusterup/docker/errors"
"github.com/openshift/origin/pkg/oc/clusterup/docker/run"
)
const (
cmdTestNsenterMount = "nsenter --mount=/rootfs/proc/1/ns/mnt findmnt"
ensureVolumeShareCmd = `#/bin/bash
set -x
nsenter --mount=/rootfs/proc/1/ns/mnt mkdir -p %[1]s
grep -F %[1]s /rootfs/proc/1/mountinfo || nsenter --mount=/rootfs/proc/1/ns/mnt mount -o bind %[1]s %[1]s
grep -F %[1]s /rootfs/proc/1/mountinfo | grep shared || nsenter --mount=/rootfs/proc/1/ns/mnt mount --make-shared %[1]s
`
// RemoteHostOriginDir is a directory on the remote machine that runs Docker
RemoteHostOriginDir = "/var/lib/origin/cluster-up"
)
// HostHelper contains methods to help check settings on a Docker host machine
// using a privileged container
type HostHelper struct {
client dockerhelper.Interface
runHelper *run.RunHelper
image string
}
// NewHostHelper creates a new HostHelper
func NewHostHelper(dockerHelper *dockerhelper.Helper, image string) *HostHelper {
return &HostHelper{
runHelper: run.NewRunHelper(dockerHelper),
client: dockerHelper.Client(),
image: image,
}
}
// CanUseNsenterMounter returns true if the Docker host machine can execute findmnt through nsenter
func (h *HostHelper) CanUseNsenterMounter() (bool, error) {
_, rc, err := h.runner().
Image(h.image).
DiscardContainer().
Privileged().
Bind("/:/rootfs:ro").
Entrypoint("/bin/bash").
Command("-c", cmdTestNsenterMount).Run()
return err == nil && rc == 0, err
}
// EnsureVolumeUseShareMount ensures that the host Docker VM has a shared directory that can be used
// for OpenShift volumes. This is needed for Docker for Mac.
func (h *HostHelper) EnsureVolumeUseShareMount(volumesDir string) error {
cmd := fmt.Sprintf(ensureVolumeShareCmd, volumesDir)
_, rc, err := h.runner().
Image(h.image).
DiscardContainer().
HostPid().
Privileged().
Bind("/proc:/rootfs/proc:ro").
Entrypoint("/bin/bash").
Command("-c", cmd).Run()
if err != nil || rc != 0 {
return errors.NewError("cannot create volume share").WithCause(err)
}
return nil
}
func (h *HostHelper) runner() *run.Runner {
return h.runHelper.New()
}