Statistics
| Branch: | Tag: | Revision:

root / xseg / tools / vlmc.py @ c89f8110

History | View | Annotate | Download (5.7 kB)

1
#!/usr/bin/env python2.7
2
#
3
# vlmc tool
4
# (blockd-only atm)
5

    
6
import os, sys, subprocess, shutil, re, argparse
7

    
8
#FIXME 
9
xseg_home="/root/archip/xseg/"
10
images="/srv/pithos/archip-data/images/"
11
xsegbd_sysfs="/sys/bus/xsegbd/"
12
device_prefix="/dev/xsegbd"
13
blockd_logs="/srv/pithos/archip-data/logs/"
14

    
15
def vlmc_list(args):
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
                
26
def vlmc_create(args):
27
        name = args.name[0]
28
        size = args.size
29
        snap = args.snap
30

    
31
        try:
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
                        size *= 1024*1024
48
                        os.lseek(f, size - 1, os.SEEK_SET)
49
                        os.write(f, "1")
50
                        os.close(f)
51

    
52
                os.chdir(old_dir)
53
                sys.exit(0)
54
        except Exception, reason:
55
                print >> sys.stderr, reason
56
                sys.exit(-1)
57

    
58
def vlmc_remove(args):
59
        name = args.name[0]
60

    
61
        try:
62
                old_dir = os.getcwd()
63
                os.chdir(images)
64

    
65
                try:
66
                        os.stat(name)
67
                except:
68
                        print "file doesn't exist"
69
                        os.chdir(old_dir)
70
                        sys.exit(-1)
71
                
72
                os.unlink(images + '/' + name)
73

    
74
                os.chdir(old_dir)
75
                sys.exit(0)
76
        except Exception, reason:
77
                print >> sys.stderr, reason
78
                sys.exit(-1)
79

    
80
def vlmc_map(args):
81
        name = args.name[0]
82
        try:
83
                try:
84
                        r = subprocess.check_output(["ps", "-o", "command", "-C",
85
                        "blockd"]).splitlines()[1:]
86
                        result = [int(re.search('-p (\d+)', x).group(1)) for x in r]
87
                        result.sort()
88

    
89
                        prev = -1
90
                        for i in result:
91
                                if i - prev > 1:
92
                                        port = prev + 1
93
                                        break
94
                                else:
95
                                        prev = i
96

    
97
                        port = prev + 1
98
                except:
99
                        port = 0
100
                        
101
                old_dir = os.getcwd()
102
                os.chdir(images)
103
                f = os.open(blockd_logs +  name, os.O_CREAT | os.O_WRONLY)
104
                r = subprocess.Popen([xseg_home + "peers/blockd", name, "-p", str(port),
105
                "-g", "xsegdev:xsegbd:128:4096:64:1024:12"], stdout=f, stderr=f)
106

    
107
                os.chdir(images)
108
                fd = os.open(xsegbd_sysfs + "add", os.O_WRONLY)
109
                os.write(fd, "%s %d:%d:128" % (name, port + 64, port))
110
                os.close(fd)
111
        except Exception, reason:
112
                print >> sys.stderr, reason
113
                sys.exit(-1)
114

    
115
def vlmc_unmap(args):
116
        device = args.name[0]
117
        try:
118
                for f in os.listdir(xsegbd_sysfs + "devices/"):
119
                        d_id = open(xsegbd_sysfs + "devices/" + f + "/id").read().strip()
120
                        name = open(xsegbd_sysfs + "devices/"+ f + "/name").read().strip()
121
                        if device == device_prefix + d_id:
122
                                fd = os.open(xsegbd_sysfs + "remove", os.O_WRONLY) 
123
                                os.write(fd, d_id)
124
                                os.close(fd)
125

    
126
                                break
127
                
128
                subprocess.check_output(["pkill", "-f", "blockd " + name + " "])
129
        except Exception, reason:
130
                print >> sys.stderr, reason
131
                sys.exit(-1)
132

    
133
def vlmc_showmapped(args):
134
        print "id\tpool\timage\tsnap\tdevice"
135
        try:
136
                for f in os.listdir(xsegbd_sysfs + "devices/"):
137
                        d_id = open(xsegbd_sysfs + "devices/" + f + "/id").read().strip()
138
                        name = open(xsegbd_sysfs + "devices/"+ f + "/name").read().strip()
139

    
140
                        print "%s\t%s\t%s\t%s\t%s" % (d_id, '-', name, '-', device_prefix +
141
                        d_id)
142
        except Exception, reason:
143
                print >> sys.stderr, reason
144
                sys.exit(-1)
145

    
146
        sys.exit(0)
147

    
148
if __name__ == "__main__":
149
        # parse arguments and discpatch to the correct func
150
        parser = argparse.ArgumentParser(description='vlmc tool')
151
        subparsers = parser.add_subparsers()
152

    
153
        create_parser = subparsers.add_parser('create', help='Create volume')
154
        group = create_parser.add_mutually_exclusive_group(required=True)
155
        group.add_argument('-s', '--size', type=int, nargs='?', help='requested size in MB for create')
156
        group.add_argument('--snap', type=str, nargs='?', help='create from snapshot')
157
        create_parser.add_argument('-p', '--pool', type=str, nargs='?', help='for backwards compatiblity with rbd')
158
        create_parser.add_argument('name', type=str, nargs=1, help='volume/device name')
159
        create_parser.set_defaults(func=vlmc_create)
160

    
161
        remove_parser = subparsers.add_parser('remove', help='Delete volume')
162
        remove_parser.add_argument('name', type=str, nargs=1, help='volume/device name')
163
        remove_parser.set_defaults(func=vlmc_remove)
164
        remove_parser.add_argument('-p', '--pool', type=str, nargs='?', help='for backwards compatiblity with rbd')
165

    
166
        rm_parser = subparsers.add_parser('rm', help='Delete volume')
167
        rm_parser.add_argument('name', type=str, nargs=1, help='volume/device name')
168
        rm_parser.set_defaults(func=vlmc_remove)
169
        rm_parser.add_argument('-p', '--pool', type=str, nargs='?', help='for backwards compatiblity with rbd')
170

    
171
        map_parser = subparsers.add_parser('map', help='Map volume')
172
        map_parser.add_argument('name', type=str, nargs=1, help='volume/device name')
173
        map_parser.set_defaults(func=vlmc_map)
174
        map_parser.add_argument('-p', '--pool', type=str, nargs='?', help='for backwards compatiblity with rbd')
175

    
176
        unmap_parser = subparsers.add_parser('unmap', help='Unmap volume')
177
        unmap_parser.add_argument('name', type=str, nargs=1, help='volume/device name')
178
        unmap_parser.set_defaults(func=vlmc_unmap)
179
        unmap_parser.add_argument('-p', '--pool', type=str, nargs='?', help='for backwards compatiblity with rbd')
180

    
181
        showmapped_parser = subparsers.add_parser('showmapped', help='Show mapped volumes')
182
        showmapped_parser.set_defaults(func=vlmc_showmapped)
183
        showmapped_parser.add_argument('-p', '--pool', type=str, nargs='?', help='for backwards compatiblity with rbd')
184

    
185
        list_parser = subparsers.add_parser('list', help='List volumes')
186
        list_parser.set_defaults(func=vlmc_list)
187
        list_parser.add_argument('-p', '--pool', type=str, nargs='?', help='for backwards compatiblity with rbd')
188

    
189
        ls_parser = subparsers.add_parser('ls', help='List volumes')
190
        ls_parser.set_defaults(func=vlmc_list)
191
        ls_parser.add_argument('-p', '--pool', type=str, nargs='?', help='for backwards compatiblity with rbd')
192

    
193
        args = parser.parse_args()        
194
        args.func(args)