Revision 0072a4af xseg/tools/vlmc.py
b/xseg/tools/vlmc.py | ||
---|---|---|
6 | 6 |
import os, sys, subprocess, shutil, re, argparse |
7 | 7 |
|
8 | 8 |
#FIXME |
9 |
xseg_home="/root/archip/xseg/" |
|
10 |
images="/root/images/" |
|
11 |
xsegbd_sysfs="/sys/bus/xsegbd/" |
|
12 |
device_prefix="/dev/xsegbd" |
|
13 |
blockd_logs="/root/logs/" |
|
9 |
xseg_home = "/root/archip/xseg/" |
|
10 |
images = "/root/images/" |
|
11 |
xsegbd_sysfs = "/sys/bus/xsegbd/" |
|
12 |
device_prefix = "/dev/xsegbd" |
|
13 |
blockd_logs = "/root/logs/" |
|
14 |
|
|
14 | 15 |
|
15 | 16 |
def vlmc_list(): |
16 |
print "name\t\t\t\tsize" |
|
17 |
try: |
|
18 |
for f in os.listdir(images): |
|
19 |
print "%s\t\t\t\t%dK" % (f, os.stat(images + f).st_size / 1024) |
|
20 |
|
|
21 |
sys.exit(0) |
|
22 |
except Exception, reason: |
|
23 |
print >> sys.stderr, reason |
|
24 |
sys.exit(-1) |
|
25 |
|
|
17 |
print "name\t\t\t\tsize" |
|
18 |
try: |
|
19 |
for f in os.listdir(images): |
|
20 |
print "%s\t\t\t\t%dK" % (f, os.stat(images + f).st_size / 1024) |
|
21 |
|
|
22 |
sys.exit(0) |
|
23 |
except Exception, reason: |
|
24 |
print >> sys.stderr, reason |
|
25 |
sys.exit(-1) |
|
26 |
|
|
27 |
|
|
26 | 28 |
def vlmc_create(name, size, snap=""): |
27 |
try: |
|
28 |
size *= 1024*1024 |
|
29 |
|
|
30 |
old_dir = os.getcwd() |
|
31 |
os.chdir(images) |
|
32 |
|
|
33 |
try: |
|
34 |
os.stat(name) |
|
35 |
print "file exists" |
|
36 |
os.chdir(old_dir) |
|
37 |
sys.exit(-1) |
|
38 |
except: |
|
39 |
pass |
|
40 |
|
|
41 |
if snap: |
|
42 |
shutil.copyfile(snap, name) |
|
43 |
else: |
|
44 |
f = os.open(name, os.O_CREAT | os.O_WRONLY, 0755) |
|
45 |
os.lseek(f, size - 1, os.SEEK_SET) |
|
46 |
os.write(f, "1") |
|
47 |
os.close(f) |
|
48 |
|
|
49 |
os.chdir(old_dir) |
|
50 |
sys.exit(0) |
|
51 |
except Exception, reason: |
|
52 |
print >> sys.stderr, reason |
|
53 |
sys.exit(-1) |
|
29 |
try: |
|
30 |
size *= 1024*1024 |
|
31 |
|
|
32 |
old_dir = os.getcwd() |
|
33 |
os.chdir(images) |
|
34 |
|
|
35 |
try: |
|
36 |
os.stat(name) |
|
37 |
print "file exists" |
|
38 |
os.chdir(old_dir) |
|
39 |
sys.exit(-1) |
|
40 |
except: |
|
41 |
pass |
|
42 |
|
|
43 |
if snap: |
|
44 |
shutil.copyfile(snap, name) |
|
45 |
else: |
|
46 |
f = os.open(name, os.O_CREAT | os.O_WRONLY, 0755) |
|
47 |
os.lseek(f, size - 1, os.SEEK_SET) |
|
48 |
os.write(f, "1") |
|
49 |
os.close(f) |
|
50 |
|
|
51 |
os.chdir(old_dir) |
|
52 |
sys.exit(0) |
|
53 |
except Exception, reason: |
|
54 |
print >> sys.stderr, reason |
|
55 |
sys.exit(-1) |
|
56 |
|
|
54 | 57 |
|
55 | 58 |
def vlmc_remove(name): |
56 |
try: |
|
57 |
old_dir = os.getcwd() |
|
58 |
os.chdir(images) |
|
59 |
|
|
60 |
try: |
|
61 |
os.stat(name) |
|
62 |
except: |
|
63 |
print "file doesn't exist" |
|
64 |
os.chdir(old_dir) |
|
65 |
sys.exit(-1) |
|
66 |
|
|
67 |
os.unlink(images + '/' + name) |
|
68 |
|
|
69 |
os.chdir(old_dir) |
|
70 |
sys.exit(0) |
|
71 |
except Exception, reason: |
|
72 |
print >> sys.stderr, reason |
|
73 |
sys.exit(-1) |
|
59 |
try: |
|
60 |
old_dir = os.getcwd() |
|
61 |
os.chdir(images) |
|
62 |
|
|
63 |
try: |
|
64 |
os.stat(name) |
|
65 |
except: |
|
66 |
print >> sys.stderr, "file does not exist" |
|
67 |
os.chdir(old_dir) |
|
68 |
sys.exit(-1) |
|
69 |
|
|
70 |
os.unlink(images + "/" + name) |
|
71 |
|
|
72 |
os.chdir(old_dir) |
|
73 |
sys.exit(0) |
|
74 |
except Exception, reason: |
|
75 |
print >> sys.stderr, reason |
|
76 |
sys.exit(-1) |
|
77 |
|
|
74 | 78 |
|
75 | 79 |
def vlmc_map(name): |
76 |
try: |
|
77 |
try: |
|
78 |
r = subprocess.check_output(["ps", "-o", "command", "-C", |
|
79 |
"blockd"]).splitlines()[1:] |
|
80 |
result = [int(re.search('-p (\d+)', x).group(1)) for x in r] |
|
81 |
result.sort() |
|
82 |
|
|
83 |
prev = -1 |
|
84 |
for i in result: |
|
85 |
if i - prev > 1: |
|
86 |
port = prev + 1 |
|
87 |
break |
|
88 |
else: |
|
89 |
prev = i |
|
90 |
|
|
91 |
port = prev + 1 |
|
92 |
except: |
|
93 |
port = 0 |
|
94 |
|
|
95 |
old_dir = os.getcwd() |
|
96 |
os.chdir(images) |
|
97 |
f = open(blockd_logs + '/' + name) |
|
98 |
r = subprocess.Popen([xseg_home + "peers/blockd", name, "-p", str(port), |
|
99 |
"-g", "xsegdev:xsegbd:128:4096:64:1024:12"], stdout=f, stderr=f) |
|
100 |
|
|
101 |
os.chdir(images) |
|
102 |
fd = os.open(xsegbd_sysfs + "add", os.O_WRONLY) |
|
103 |
os.write(fd, "%s %d:%d:128" % (name, port + 64, port)) |
|
104 |
os.close(fd) |
|
105 |
except Exception, reason: |
|
106 |
print >> sys.stderr, reason |
|
107 |
sys.exit(-1) |
|
80 |
try: |
|
81 |
try: |
|
82 |
r = subprocess.check_output(["ps", "-o", "command", "-C", |
|
83 |
"blockd"]).splitlines()[1:] |
|
84 |
result = [int(re.search("-p (\d+)", x).group(1)) for x in r] |
|
85 |
result.sort() |
|
86 |
|
|
87 |
prev = -1 |
|
88 |
for i in result: |
|
89 |
if i - prev > 1: |
|
90 |
port = prev + 1 |
|
91 |
break |
|
92 |
else: |
|
93 |
prev = i |
|
94 |
|
|
95 |
port = prev + 1 |
|
96 |
except: |
|
97 |
port = 0 |
|
98 |
|
|
99 |
old_dir = os.getcwd() |
|
100 |
os.chdir(images) |
|
101 |
f = open(blockd_logs + "/" + name) |
|
102 |
r = subprocess.Popen([xseg_home + "peers/blockd", name, "-p", str(port), |
|
103 |
"-g", "xsegdev:xsegbd:128:4096:64:1024:12"], stdout=f, stderr=f) |
|
104 |
|
|
105 |
os.chdir(images) |
|
106 |
fd = os.open(xsegbd_sysfs + "add", os.O_WRONLY) |
|
107 |
os.write(fd, "%s %d:%d:128" % (name, port + 64, port)) |
|
108 |
os.close(fd) |
|
109 |
except Exception, reason: |
|
110 |
print >> sys.stderr, reason |
|
111 |
sys.exit(-1) |
|
112 |
|
|
108 | 113 |
|
109 | 114 |
def vlmc_unmap(device): |
110 |
try: |
|
111 |
for f in os.listdir(xsegbd_sysfs + "devices/"): |
|
112 |
d_id = open(xsegbd_sysfs + "devices/" + f + "/id").read().strip() |
|
113 |
name = open(xsegbd_sysfs + "devices/"+ f + "/name").read().strip() |
|
114 |
if device == device_prefix + d_id: |
|
115 |
fd = os.open(xsegbd_sysfs + "remove", os.O_WRONLY) |
|
116 |
os.write(fd, d_id) |
|
117 |
os.close(fd) |
|
118 |
|
|
119 |
break |
|
120 |
|
|
121 |
subprocess.check_output(["pkill", "-f", "blockd " + name + " "]) |
|
122 |
except Exception, reason: |
|
123 |
print >> sys.stderr, reason |
|
124 |
sys.exit(-1) |
|
115 |
try: |
|
116 |
for f in os.listdir(xsegbd_sysfs + "devices/"): |
|
117 |
d_id = open(xsegbd_sysfs + "devices/" + f + "/id").read().strip() |
|
118 |
name = open(xsegbd_sysfs + "devices/"+ f + "/name").read().strip() |
|
119 |
if device == device_prefix + d_id: |
|
120 |
fd = os.open(xsegbd_sysfs + "remove", os.O_WRONLY) |
|
121 |
os.write(fd, d_id) |
|
122 |
os.close(fd) |
|
123 |
|
|
124 |
break |
|
125 |
|
|
126 |
subprocess.check_output(["pkill", "-f", "blockd " + name + " "]) |
|
127 |
except Exception, reason: |
|
128 |
print >> sys.stderr, reason |
|
129 |
sys.exit(-1) |
|
130 |
|
|
125 | 131 |
|
126 | 132 |
def vlmc_showmapped(): |
127 |
print "id\tpool\timage\tsnap\tdevice"
|
|
128 |
try:
|
|
129 |
for f in os.listdir(xsegbd_sysfs + "devices/"):
|
|
130 |
d_id = open(xsegbd_sysfs + "devices/" + f + "/id").read().strip()
|
|
131 |
name = open(xsegbd_sysfs + "devices/"+ f + "/name").read().strip()
|
|
133 |
print "id\tpool\timage\tsnap\tdevice"
|
|
134 |
try:
|
|
135 |
for f in os.listdir(xsegbd_sysfs + "devices/"):
|
|
136 |
d_id = open(xsegbd_sysfs + "devices/" + f + "/id").read().strip()
|
|
137 |
name = open(xsegbd_sysfs + "devices/"+ f + "/name").read().strip()
|
|
132 | 138 |
|
133 |
print "%s\t%s\t%s\t%s\t%s" % (d_id, '-', name, '-', device_prefix + |
|
134 |
d_id) |
|
135 |
except Exception, reason: |
|
136 |
print >> sys.stderr, reason |
|
137 |
sys.exit(-1) |
|
139 |
print "%s\t%s\t%s\t%s\t%s" % (d_id, "-", name, "-", device_prefix + |
|
140 |
d_id) |
|
141 |
except Exception, reason: |
|
142 |
print >> sys.stderr, reason |
|
143 |
sys.exit(-1) |
|
144 |
|
|
145 |
sys.exit(0) |
|
138 | 146 |
|
139 |
sys.exit(0) |
|
140 | 147 |
|
141 | 148 |
def check_no_opts(args, parser): |
142 |
if args.name == None or args.size != None or args.snap != None: |
|
143 |
parser.print_usage(file=sys.stderr) |
|
144 |
sys.exit(-1) |
|
149 |
if args.name == None or args.size != None or args.snap != None: |
|
150 |
parser.print_usage(file=sys.stderr) |
|
151 |
sys.exit(-1) |
|
152 |
|
|
145 | 153 |
|
146 | 154 |
if __name__ == "__main__": |
147 |
# parse arguments and discpatch to the correct func |
|
148 |
parser = argparse.ArgumentParser(description='vlmc tool') |
|
149 |
parser.add_argument('op', type=str, nargs='?', help='operation requested (create, remove, map, unmap, showmapped)') |
|
150 |
parser.add_argument('name', type=str, nargs='?', help='volume/device name') |
|
151 |
parser.add_argument('-s', '--size', type=int, nargs='?', help='requested size in MB for create') |
|
152 |
parser.add_argument('--snap', type=str, help='create from snapshot') |
|
153 |
parser.add_argument('-p', '--pool', type=str, help='for backwards compatiblity with rbd') |
|
154 |
args = parser.parse_args() |
|
155 |
|
|
156 |
if args.op == 'create': |
|
157 |
if args.name == None or (args.snap == None and (args.size == None or args.size <= 0)) or (args.snap != None and args.size != None): |
|
158 |
parser.print_usage(file=sys.stderr) |
|
159 |
sys.exit(-1) |
|
160 |
vlmc_create(args.name, args.size, args.snap) |
|
161 |
elif args.op == 'remove': |
|
162 |
check_no_opts(args, parser) |
|
163 |
vlmc_remove(args.name) |
|
164 |
elif args.op == 'map': |
|
165 |
check_no_opts(args, parser) |
|
166 |
vlmc_map(args.name) |
|
167 |
elif args.op == 'unmap': |
|
168 |
check_no_opts(args, parser) |
|
169 |
vlmc_unmap(args.name) |
|
170 |
elif args.op == 'showmapped': |
|
171 |
if args.name != None or args.size != None or args.snap != None: |
|
172 |
parser.print_usage(file=sys.stderr) |
|
173 |
sys.exit(-1) |
|
174 |
vlmc_showmapped() |
|
175 |
elif args.op == 'list' or args.op == 'ls': |
|
176 |
if args.name != None or args.size != None or args.snap != None: |
|
177 |
parser.print_usage(file=sys.stderr) |
|
178 |
sys.exit(-1) |
|
179 |
vlmc_list() |
|
180 |
else: |
|
181 |
parser.print_usage(file=sys.stderr) |
|
182 |
sys.exit(-1) |
|
155 |
# parse arguments and discpatch to the correct func |
|
156 |
parser = argparse.ArgumentParser(description="vlmc tool") |
|
157 |
parser.add_argument("op", type=str, nargs="?", |
|
158 |
help=("operation requested (create, remove, map," |
|
159 |
" unmap, showmapped)")) |
|
160 |
parser.add_argument("name", type=str, nargs="?", |
|
161 |
help="volume/device name") |
|
162 |
parser.add_argument("-s", "--size", type=int, nargs="?", |
|
163 |
help="requested size in MB for create") |
|
164 |
parser.add_argument("--snap", type=str, help="create from snapshot") |
|
165 |
parser.add_argument("-p", "--pool", type=str, |
|
166 |
help="for backwards compatiblity with rbd") |
|
167 |
args = parser.parse_args() |
|
168 |
|
|
169 |
if args.op == "create": |
|
170 |
if args.name == None or (args.snap == None and (args.size == None or args.size <= 0)) or (args.snap != None and args.size != None): |
|
171 |
parser.print_usage(file=sys.stderr) |
|
172 |
sys.exit(-1) |
|
173 |
vlmc_create(args.name, args.size, args.snap) |
|
174 |
elif args.op == "remove": |
|
175 |
check_no_opts(args, parser) |
|
176 |
vlmc_remove(args.name) |
|
177 |
elif args.op == "map": |
|
178 |
check_no_opts(args, parser) |
|
179 |
vlmc_map(args.name) |
|
180 |
elif args.op == "unmap": |
|
181 |
check_no_opts(args, parser) |
|
182 |
vlmc_unmap(args.name) |
|
183 |
elif args.op == "showmapped": |
|
184 |
if args.name != None or args.size != None or args.snap != None: |
|
185 |
parser.print_usage(file=sys.stderr) |
|
186 |
sys.exit(-1) |
|
187 |
vlmc_showmapped() |
|
188 |
elif args.op == "list" or args.op == "ls": |
|
189 |
if args.name != None or args.size != None or args.snap != None: |
|
190 |
parser.print_usage(file=sys.stderr) |
|
191 |
sys.exit(-1) |
|
192 |
vlmc_list() |
|
193 |
else: |
|
194 |
parser.print_usage(file=sys.stderr) |
|
195 |
sys.exit(-1) |
Also available in: Unified diff