392260832c1d7ba912e20a1cce6639d8f8bbeddb
[archipelago] / xseg / tools / vlmc
1 #!/usr/bin/env python
2 #
3 # vlmc tool
4
5 import os, sys, subprocess, argparse
6 from subprocess import call, check_call
7
8 def vlmc_create(args):
9     name = args.name[0]
10     size = args.size << 20
11     snap = args.snap
12
13     if size == None and snap == None:
14         print >> sys.stderr, "At least one of the size/snap args must be provided"
15         sys.exit(-1)
16
17     cmd = [XSEG_HOME + "/peers/user/vlmc-xseg", "%s" % SPEC, "create", "--name", "%s" % name]
18     if snap != None:
19             cmd.extend(["--snap", "%s" % snap])
20     if size != None:
21             cmd.extend(["--size", "%s" % size])
22     cmd.extend(["-mp", "%s" % MPORT])
23     cmd.extend(["-p", "%s" % VTOOL])
24     os.environ['LD_LIBRARY_PATH'] = XSEG_HOME + "/lib:" + XSEG_HOME + "/lib/user"
25
26     try:
27         check_call(cmd, shell=False, env=os.environ);
28     except Exception:
29             sys.stderr.write("vlmc creation failed\n")
30             sys.exit(-1)
31     
32
33 def vlmc_snapshot(args):
34     # snapshot
35     return
36
37 def vlmc_list(args):
38     # list
39     return
40
41 def vlmc_remove(args):
42     name = args.name[0]
43     cmd = [XSEG_HOME + "/peers/user/vlmc-xseg", "%s" % SPEC, "remove", "--name", "%s" % name]
44     cmd.extend(["-mp", "%s" % MPORT])
45     cmd.extend(["-p", "%s" % VTOOL])
46     os.environ['LD_LIBRARY_PATH'] = XSEG_HOME + "/lib:" + XSEG_HOME + "/lib/user"
47
48     try:
49         check_call(cmd, shell=False, env=os.environ);
50     except Exception:
51             sys.stderr.write("vlmc removal failed\n")
52             sys.exit(-1)
53
54
55 def xsegbd_loaded():
56     try:
57         os.stat("/sys/bus/xsegbd")
58     except Exception, reason:
59         print >> sys.stderr, reason
60         sys.exit(-1)
61
62 def vlmc_map(args):
63     xsegbd_loaded()
64     name = args.name[0]
65     prev = 3
66     try:
67         result = [int(open(XSEGBD_SYSFS + "devices/" + f + "/srcport").read().strip()) for f in os.listdir(XSEGBD_SYSFS + "devices/")]
68         result.sort()
69
70         for p in result:
71             if p - prev > 1:
72                break
73             else:
74                prev = p
75
76         port = prev + 1
77         fd = os.open(XSEGBD_SYSFS + "add", os.O_WRONLY)
78         os.write(fd, "%s %d:%d:%d" % (name, port, VPORT, REQS))
79         os.close(fd)
80     except Exception, reason:
81         print >> sys.stderr, reason
82         sys.exit(-1)
83
84 def vlmc_unmap(args):
85     xsegbd_loaded()
86     device = args.name[0]
87     try:
88         for f in os.listdir(XSEGBD_SYSFS + "devices/"):
89             d_id = open(XSEGBD_SYSFS + "devices/" + f + "/id").read().strip()
90             name = open(XSEGBD_SYSFS + "devices/"+ f + "/target").read().strip()
91             if device == DEVICE_PREFIX + d_id:
92                 fd = os.open(XSEGBD_SYSFS + "remove", os.O_WRONLY)
93                 os.write(fd, d_id)
94                 os.close(fd)
95
96                 sys.exit(0)
97         print >> sys.stderr, "Device %s doesn't exist" % device
98         sys.exit(-1)
99     except Exception, reason:
100         print >> sys.stderr, reason
101         sys.exit(-1)
102
103 def vlmc_showmapped(args):
104     xsegbd_loaded()
105     print "id\tpool\timage\tsnap\tdevice"
106     try:
107         for f in os.listdir(XSEGBD_SYSFS + "devices/"):
108             d_id = open(XSEGBD_SYSFS + "devices/" + f + "/id").read().strip()
109             target = open(XSEGBD_SYSFS + "devices/"+ f + "/target").read().strip()
110
111             print "%s\t%s\t%s\t%s\t%s" % (d_id, '-', target, '-', DEVICE_PREFIX +
112             d_id)
113     except Exception, reason:
114         print >> sys.stderr, reason
115         sys.exit(-1)
116
117 # FIXME:
118 def vlmc_resize(args):
119     xsegbd_loaded()
120
121     name = args.name[0]
122     size = args.size[0]
123
124     try:
125
126         for f in os.listdir(XSEGBD_SYSFS + "devices/"):
127             d_id = open(XSEGBD_SYSFS + "devices/" + f + "/id").read().strip()
128             d_name = open(XSEGBD_SYSFS + "devices/"+ f + "/name").read().strip()
129             if name == d_name:
130                 fd = os.open(XSEGBD_SYSFS + "devices/" +  d_id +"/refresh", os.O_WRONLY)
131                 os.write(fd, "1")
132                 os.close(fd)
133
134         sys.exit(0)
135     except Exception, reason:
136         print >> sys.stderr, reason
137         sys.exit(-1)
138
139 def loadrc(rc):
140     #FIXME
141     try:
142         if rc == None:
143             execfile(os.path.expanduser("~/.xsegrc"), globals())
144         else:
145             execfile(rc, globals())
146     except:
147         pass
148
149 if __name__ == "__main__":
150     # parse arguments and discpatch to the correct func
151     parser = argparse.ArgumentParser(description='vlmc tool')
152     parser.add_argument('-c', '--config', type=str, nargs='?', help='config file')
153     subparsers = parser.add_subparsers()
154
155     create_parser = subparsers.add_parser('create', help='Create volume')
156     #group = create_parser.add_mutually_exclusive_group(required=True)
157     create_parser.add_argument('-s', '--size', type=int, nargs='?', help='requested size in MB for create')
158     create_parser.add_argument('--snap', type=str, nargs='?', help='create from snapshot')
159     create_parser.add_argument('-p', '--pool', type=str, nargs='?', help='for backwards compatiblity with rbd')
160     create_parser.add_argument('name', type=str, nargs=1, help='volume/device name')
161     create_parser.set_defaults(func=vlmc_create)
162
163     remove_parser = subparsers.add_parser('remove', help='Delete volume')
164     remove_parser.add_argument('name', type=str, nargs=1, help='volume/device name')
165     remove_parser.set_defaults(func=vlmc_remove)
166     remove_parser.add_argument('-p', '--pool', type=str, nargs='?', help='for backwards compatiblity with rbd')
167
168     rm_parser = subparsers.add_parser('rm', help='Delete volume')
169     rm_parser.add_argument('name', type=str, nargs=1, help='volume/device name')
170     rm_parser.set_defaults(func=vlmc_remove)
171     rm_parser.add_argument('-p', '--pool', type=str, nargs='?', help='for backwards compatiblity with rbd')
172
173     map_parser = subparsers.add_parser('map', help='Map volume')
174     map_parser.add_argument('name', type=str, nargs=1, help='volume/device name')
175     map_parser.set_defaults(func=vlmc_map)
176     map_parser.add_argument('-p', '--pool', type=str, nargs='?', help='for backwards compatiblity with rbd')
177
178     unmap_parser = subparsers.add_parser('unmap', help='Unmap volume')
179     unmap_parser.add_argument('name', type=str, nargs=1, help='volume/device name')
180     unmap_parser.set_defaults(func=vlmc_unmap)
181     unmap_parser.add_argument('-p', '--pool', type=str, nargs='?', help='for backwards compatiblity with rbd')
182
183     showmapped_parser = subparsers.add_parser('showmapped', help='Show mapped volumes')
184     showmapped_parser.set_defaults(func=vlmc_showmapped)
185     showmapped_parser.add_argument('-p', '--pool', type=str, nargs='?', help='for backwards compatiblity with rbd')
186
187     list_parser = subparsers.add_parser('list', help='List volumes')
188     list_parser.set_defaults(func=vlmc_list)
189     list_parser.add_argument('-p', '--pool', type=str, nargs='?', help='for backwards compatiblity with rbd')
190
191     ls_parser = subparsers.add_parser('ls', help='List volumes')
192     ls_parser.set_defaults(func=vlmc_list)
193     ls_parser.add_argument('-p', '--pool', type=str, nargs='?', help='for backwards compatiblity with rbd')
194
195     resize_parser = subparsers.add_parser('resize', help='Resize volume')
196     resize_parser.add_argument('-s', '--size', type=int, nargs=1, help='requested size in MB for resize')
197     resize_parser.add_argument('name', type=str, nargs=1, help='volume/device name')
198     resize_parser.set_defaults(func=vlmc_resize)
199     resize_parser.add_argument('-p', '--pool', type=str, nargs='?', help='for backwards compatiblity with rbd')
200
201     args = parser.parse_args()
202     loadrc(args.config)
203     args.func(args)