author | Jesse Butler <jesse.butler@oracle.com> |
Wed, 20 Jul 2016 17:19:20 -0700 | |
changeset 6468 | af5d82385cd7 |
child 7177 | 86d14f182e82 |
permissions | -rw-r--r-- |
6468
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
1 |
#!/usr/bin/python2.7 |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
2 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
3 |
# |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
4 |
# Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
5 |
# |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
6 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
7 |
import grp |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
8 |
import os |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
9 |
from subprocess import Popen, PIPE, check_call, CalledProcessError |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
10 |
import sys |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
11 |
import traceback |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
12 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
13 |
import smf_include |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
14 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
15 |
DOCKER_EXEC="/usr/bin/docker" |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
16 |
MKDIR="/usr/bin/mkdir" |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
17 |
SVCADM="/usr/sbin/svcadm" |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
18 |
SVCCFG="/usr/sbin/svccfg" |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
19 |
SVCPROP="/usr/bin/svcprop" |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
20 |
ZFS="/usr/sbin/zfs" |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
21 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
22 |
DOCKER_SVC = 'svc:/application/docker/docker' |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
23 |
DOCKER_ROOT="/var/run/docker" |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
24 |
DOCKER_MOUNTPOINT="/var/lib/docker" |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
25 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
26 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
27 |
class SvcDockerException(Exception): |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
28 |
pass |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
29 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
30 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
31 |
class SvcDockerCmd(object): |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
32 |
def __init__(self, cmd): |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
33 |
self.cmd = cmd |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
34 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
35 |
def run(self, expect_nonzero=None): |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
36 |
p = Popen(self.cmd, stdout=PIPE, stderr=PIPE) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
37 |
output, error = p.communicate() |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
38 |
if not expect_nonzero and p.returncode != 0: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
39 |
raise SvcDockerException(error) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
40 |
return output |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
41 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
42 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
43 |
def _get_docker_prop(pname): |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
44 |
try: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
45 |
output = SvcDockerCmd([SVCPROP, '-p', pname, DOCKER_SVC]).run() |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
46 |
return output.strip('"').strip() |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
47 |
except SvcDockerException as e: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
48 |
print "Unable to retrieve property '%s': %s" % (pname, e) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
49 |
sys.exit(1) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
50 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
51 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
52 |
def _set_docker_prop(pname, pval): |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
53 |
try: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
54 |
SvcDockerCmd( |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
55 |
[SVCCFG, '-s', DOCKER_SVC, 'setprop', pname, '=', pval]).run() |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
56 |
SvcDockerCmd(cmd = [SVCADM, 'refresh', 'docker']).run() |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
57 |
except SvcDockerException as e: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
58 |
print "Unable to set property '%s', value '%s': %s" % \ |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
59 |
(pname, pval, e) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
60 |
sys.exit(1) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
61 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
62 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
63 |
def _get_root_pool(): |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
64 |
try: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
65 |
return SvcDockerCmd( |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
66 |
[ZFS, 'list', '-Ho', 'name', '/']).run().split('/')[0] |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
67 |
except SvcDockerException as e: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
68 |
print "Unable to get root pool: %s" % e |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
69 |
sys.exit(1) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
70 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
71 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
72 |
def _fsname_in_active_be(fsname): |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
73 |
try: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
74 |
root_ds = SvcDockerCmd( |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
75 |
[ZFS, 'list', '-r', '-Ho', 'name', '/']).run().split()[0] |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
76 |
return fsname.startswith(root_ds) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
77 |
except SvcDockerException as e: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
78 |
print "Unable to get active root dataset: %s" % e |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
79 |
sys.exit(1) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
80 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
81 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
82 |
def _fsname_exists(fsname): |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
83 |
try: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
84 |
SvcDockerCmd([ZFS, 'list', fsname]).run() |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
85 |
return True |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
86 |
except SvcDockerException as e: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
87 |
if "does not exist" in str(e): |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
88 |
return False |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
89 |
print "Unable to list dataset: %s" % e |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
90 |
sys.exit(1) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
91 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
92 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
93 |
def _get_mounted_dataset(): |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
94 |
if not os.path.exists(DOCKER_MOUNTPOINT): |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
95 |
return None |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
96 |
try: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
97 |
return SvcDockerCmd( |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
98 |
[ZFS, 'list', '-Ho', 'name', DOCKER_MOUNTPOINT]).run().strip() |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
99 |
except SvcDockerException as e: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
100 |
print "Unable to get mounted Docker dataset: %s" % e |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
101 |
sys.exit(1) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
102 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
103 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
104 |
def _get_dataset_mountpoint(fsname): |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
105 |
try: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
106 |
return SvcDockerCmd( |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
107 |
[ZFS, 'list', '-Ho', 'mountpoint', fsname]).run().strip() |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
108 |
except SvcDockerException as e: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
109 |
print "Unable to get mountpoint for dataset: %s" % e |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
110 |
sys.exit(1) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
111 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
112 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
113 |
def _mount_dataset(fsname): |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
114 |
try: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
115 |
return SvcDockerCmd([ZFS, 'mount', fsname]).run() |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
116 |
except SvcDockerException as e: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
117 |
print "Unable to mount Docker root: %s" % e |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
118 |
sys.exit(1) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
119 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
120 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
121 |
def _unmount_dataset(fsname): |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
122 |
try: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
123 |
return SvcDockerCmd([ZFS, 'unmount', fsname]).run() |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
124 |
except SvcDockerException as e: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
125 |
print "Unable to unmount Docker root: %s" % e |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
126 |
sys.exit(1) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
127 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
128 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
129 |
def _set_ds_props_for_varshare(fsname): |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
130 |
# If in VARSHARE (default), make sure we turn setuid/exec/xattr on |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
131 |
# (off by default in VARSHARE). |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
132 |
for prop in ['setuid', 'exec', 'xattr']: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
133 |
try: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
134 |
SvcDockerCmd([ZFS, 'set', prop + '=on', fsname]).run() |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
135 |
except SvcDockerException as e: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
136 |
print "Failed to set '%s' prop on dataset '%s': %s" % \ |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
137 |
(prop, fsname, error) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
138 |
sys.exit(1) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
139 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
140 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
141 |
def _create_docker_dir(): |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
142 |
if not os.path.exists(DOCKER_ROOT): |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
143 |
try: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
144 |
os.mkdir(DOCKER_ROOT, 0770) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
145 |
except OSError as e: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
146 |
print "Unable to create dir '%s': %s" % (DOCKER_ROOT, e) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
147 |
sys.exit(1) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
148 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
149 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
150 |
def _init_dataset(fsname): |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
151 |
if not fsname: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
152 |
# Default to 'docker' in varshare |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
153 |
fsname = os.path.join(_get_root_pool(), "VARSHARE/docker") |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
154 |
_set_docker_prop("config/fsname", fsname) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
155 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
156 |
if _fsname_in_active_be(fsname): |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
157 |
print "config/fsname cannot be child of active root dataset" |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
158 |
sys.exit(smf_include.SMF_EXIT_ERR_CONFIG) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
159 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
160 |
if _fsname_exists(fsname): |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
161 |
if _get_mounted_dataset() != fsname: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
162 |
if _get_dataset_mountpoint(fsname) != DOCKER_MOUNTPOINT: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
163 |
print "Configured dataset '%s' mountpoint must be '%s'" % \ |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
164 |
(fsname, DOCKER_MOUNTPOINT) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
165 |
sys.exit(smf_include.SMF_EXIT_ERR_CONFIG) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
166 |
_mount_dataset(fsname) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
167 |
if fsname.startswith('rpool/VARSHARE/'): |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
168 |
_set_ds_props_for_varshare(fsname) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
169 |
else: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
170 |
# Dataset doesn't exist, try and create it. This may fail if |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
171 |
# /var/lib/docker is not empty, or if another dataset is mounted there. |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
172 |
try: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
173 |
SvcDockerCmd( |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
174 |
[ZFS, 'create', '-o', 'mountpoint=' + DOCKER_MOUNTPOINT, |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
175 |
'-o', 'setuid=on', '-o', 'exec=on', '-o', 'xattr=on', |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
176 |
'-o', 'compression=on', fsname]).run() |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
177 |
except SvcDockerException as e: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
178 |
print "Failed to create dataset '%s' on %s: %s" % \ |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
179 |
(DOCKER_MOUNTPOINT, fsname, e) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
180 |
sys.exit(1) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
181 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
182 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
183 |
def start(): |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
184 |
# Setup /var/lib/docker and the root dataset |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
185 |
_create_docker_dir() |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
186 |
fsname = _get_docker_prop("config/fsname") |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
187 |
_init_dataset(fsname) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
188 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
189 |
# Setup environment variables for the daemon |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
190 |
for p in ['http_proxy', 'https_proxy']: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
191 |
v = _get_docker_prop("config/%s" % p) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
192 |
if v: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
193 |
os.putenv(p, v) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
194 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
195 |
# Set up the service command line to execut the daemon |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
196 |
dcmd = DOCKER_EXEC + ' daemon' |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
197 |
if _get_docker_prop('config/debug') == 'true': |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
198 |
dcmd += ' -D' |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
199 |
dcmd += ' --exec-root="%s"' % DOCKER_ROOT |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
200 |
dcmd += ' --graph="%s"' % DOCKER_MOUNTPOINT |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
201 |
dcmd += ' --pidfile="%s/docker.pid"' % DOCKER_ROOT |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
202 |
dcmd += ' --storage-opt zfs.fsname=' + fsname |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
203 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
204 |
smf_include.smf_subprocess(dcmd) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
205 |
sys.exit(smf_include.SMF_EXIT_OK) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
206 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
207 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
208 |
def stop(): |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
209 |
# First, kill off the SMF contract |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
210 |
try: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
211 |
check_call(["/usr/bin/pkill", "-c", sys.argv[2]]) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
212 |
except CalledProcessError as e: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
213 |
# 1 is returncode if no SMF contract processes were matched, |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
214 |
# meaning they have already terminated. |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
215 |
if e.returncode != 1: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
216 |
print "failed to kill the SMF contract: %s" % e |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
217 |
return smf_include.SMF_EXIT_ERR_FATAL |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
218 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
219 |
# Now unmount the root dataset from /var/lib/docker |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
220 |
_unmount_dataset(DOCKER_MOUNTPOINT) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
221 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
222 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
223 |
if __name__ == '__main__': |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
224 |
os.putenv('LC_ALL', 'C') |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
225 |
try: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
226 |
smf_include.smf_main() |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
227 |
except RuntimeError: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
228 |
sys.exit(smf_include.SMF_EXIT_ERR_FATAL) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
229 |
except Exception as err: |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
230 |
print 'Unknown error: %s' % err |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
231 |
|
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
232 |
traceback.print_exc(file=sys.stdout) |
af5d82385cd7
PSARC/2016/354 Docker Engine 1.10.3
Jesse Butler <jesse.butler@oracle.com>
parents:
diff
changeset
|
233 |
sys.exit(smf_include.SMF_EXIT_ERR_FATAL) |