Pythonize archipelago tool. Also add independent peer manipulation
[archipelago] / xseg / tools / vlmc-blockd.py
1 #!/usr/bin/env python2.7
2 #
3 # vlmc tool for blockd
4
5 from vlmc_shared import *
6 import os, sys, subprocess, shutil, re, argparse
7
8 def vlmc_map(args):
9     xsegbd_loaded()
10     name = args.name[0]
11     try:
12         try:
13             r = subprocess.check_output(["ps", "-o", "command", "-C",
14             "blockd"]).splitlines()[1:]
15             result = [int(re.search('-p (\d+)', x).group(1)) for x in r]
16             result.sort()
17
18             prev = -1
19             for i in result:
20                 if i - prev > 1:
21                     port = prev + 1
22                     break
23                 else:
24                     prev = i
25
26             port = prev + 1
27         except:
28             port = 0
29             
30         old_dir = os.getcwd()
31         os.chdir(IMAGES)
32         f = os.open(BLOCKD_LOGS +  name, os.O_CREAT | os.O_WRONLY)
33         r = subprocess.Popen([XSEG_HOME + "peers/user/blockd", name, "-p", str(port),
34         "-g", SPEC, "-n", str(NR_OPS)], stdout=f, stderr=f)
35
36         os.chdir(IMAGES)
37         fd = os.open(XSEGBD_SYSFS + "add", os.O_WRONLY)
38         os.write(fd, "%s %d:%d:%d" % (name, port + 64, port, REQS))
39         os.close(fd)
40     except Exception, reason:
41         print >> sys.stderr, reason
42         sys.exit(-1)
43
44 def vlmc_unmap(args):
45     xsegbd_loaded()
46     device = args.name[0]
47     try:
48         for f in os.listdir(XSEGBD_SYSFS + "devices/"):
49             d_id = open(XSEGBD_SYSFS + "devices/" + f + "/id").read().strip()
50             name = open(XSEGBD_SYSFS + "devices/"+ f + "/target").read().strip()
51             if device == DEVICE_PREFIX + d_id:
52                 fd = os.open(XSEGBD_SYSFS + "remove", os.O_WRONLY)
53                 os.write(fd, d_id)
54                 os.close(fd)
55
56                 break
57         
58         subprocess.check_output(["pkill", "-f", "blockd " + name + " "])
59     except Exception, reason:
60         print >> sys.stderr, reason
61         sys.exit(-1)
62
63 def vlmc_showmapped(args):
64     xsegbd_loaded()
65     print "id\tpool\timage\tsnap\tdevice"
66     try:
67         for f in os.listdir(XSEGBD_SYSFS + "devices/"):
68             d_id = open(XSEGBD_SYSFS + "devices/" + f + "/id").read().strip()
69             name = open(XSEGBD_SYSFS + "devices/"+ f + "/target").read().strip()
70
71             print "%s\t%s\t%s\t%s\t%s" % (d_id, '-', name, '-', DEVICE_PREFIX +
72             d_id)
73     except Exception, reason:
74         print >> sys.stderr, reason
75         sys.exit(-1)
76
77 if __name__ == "__main__":
78     # parse arguments and discpatch to the correct func
79     parser = argparse.ArgumentParser(description='vlmc tool')
80     parser.add_argument('-c', '--config', type=str, nargs='?', help='config file')
81     subparsers = parser.add_subparsers()
82
83     create_parser = subparsers.add_parser('create', help='Create volume')
84     create_parser.add_argument('-s', '--size', type=int, nargs='?', help='requested size in MB for create')
85     create_parser.add_argument('--snap', type=str, nargs='?', help='create from snapshot')
86     create_parser.add_argument('-p', '--pool', type=str, nargs='?', help='for backwards compatiblity with rbd')
87     create_parser.add_argument('name', type=str, nargs=1, help='volume/device name')
88     create_parser.set_defaults(func=vlmc_create)
89
90     remove_parser = subparsers.add_parser('remove', help='Delete volume')
91     remove_parser.add_argument('name', type=str, nargs=1, help='volume/device name')
92     remove_parser.set_defaults(func=vlmc_remove)
93     remove_parser.add_argument('-p', '--pool', type=str, nargs='?', help='for backwards compatiblity with rbd')
94
95     rm_parser = subparsers.add_parser('rm', help='Delete volume')
96     rm_parser.add_argument('name', type=str, nargs=1, help='volume/device name')
97     rm_parser.set_defaults(func=vlmc_remove)
98     rm_parser.add_argument('-p', '--pool', type=str, nargs='?', help='for backwards compatiblity with rbd')
99
100     map_parser = subparsers.add_parser('map', help='Map volume')
101     map_parser.add_argument('name', type=str, nargs=1, help='volume/device name')
102     map_parser.set_defaults(func=vlmc_map)
103     map_parser.add_argument('-p', '--pool', type=str, nargs='?', help='for backwards compatiblity with rbd')
104
105     unmap_parser = subparsers.add_parser('unmap', help='Unmap volume')
106     unmap_parser.add_argument('name', type=str, nargs=1, help='volume/device name')
107     unmap_parser.set_defaults(func=vlmc_unmap)
108     unmap_parser.add_argument('-p', '--pool', type=str, nargs='?', help='for backwards compatiblity with rbd')
109
110     showmapped_parser = subparsers.add_parser('showmapped', help='Show mapped volumes')
111     showmapped_parser.set_defaults(func=vlmc_showmapped)
112     showmapped_parser.add_argument('-p', '--pool', type=str, nargs='?', help='for backwards compatiblity with rbd')
113
114     list_parser = subparsers.add_parser('list', help='List volumes')
115     list_parser.set_defaults(func=vlmc_list)
116     list_parser.add_argument('-p', '--pool', type=str, nargs='?', help='for backwards compatiblity with rbd')
117
118     ls_parser = subparsers.add_parser('ls', help='List volumes')
119     ls_parser.set_defaults(func=vlmc_list)
120     ls_parser.add_argument('-p', '--pool', type=str, nargs='?', help='for backwards compatiblity with rbd')
121
122     resize_parser = subparsers.add_parser('resize', help='Resize volume')
123     resize_parser.add_argument('-s', '--size', type=int, nargs=1, help='requested size in MB for resize')
124     resize_parser.add_argument('name', type=str, nargs=1, help='volume/device name')
125     resize_parser.set_defaults(func=vlmc_resize)
126     resize_parser.add_argument('-p', '--pool', type=str, nargs='?', help='for backwards compatiblity with rbd')
127
128     args = parser.parse_args()
129     loadrc(args.config)
130     args.func(args)