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