Statistics
| Branch: | Tag: | Revision:

root / xseg / tools / vlmc-blockd.py @ d01393c6

History | View | Annotate | Download (6.8 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="/root/logs/"
14
NR_OPS=0
15

    
16
def vlmc_list(args):
17
    print "name\t\t\t\tsize"
18
    try:
19
        for f in os.listdir(IMAGES):
20
            print "%s\t\t\t\t%dM" % (f, os.stat(IMAGES + f).st_size / 1024 / 1024)
21

    
22
        sys.exit(0)
23
    except Exception, reason:
24
        print >> sys.stderr, reason
25
        sys.exit(-1)
26
        
27
def vlmc_create(args):
28
    name = args.name[0]
29
    size = args.size
30
    snap = args.snap
31

    
32
    try:
33
        old_dir = os.getcwd()
34
        os.chdir(IMAGES)
35

    
36
        try:
37
            os.stat(name)
38
            print "file exists"
39
            os.chdir(old_dir)
40
            sys.exit(-1)
41
        except:
42
            pass
43
        
44
        if snap:
45
            shutil.copyfile(snap, name)
46
        else:
47
            f = os.open(name, os.O_CREAT | os.O_WRONLY, 0755)
48
            size *= 1024*1024
49
            os.lseek(f, size - 1, os.SEEK_SET)
50
            os.write(f, "1")
51
            os.close(f)
52

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

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

    
62
    try:
63
        old_dir = os.getcwd()
64
        os.chdir(IMAGES)
65

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

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

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

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

    
98
            port = prev + 1
99
        except:
100
            port = 0
101
            
102
        old_dir = os.getcwd()
103
        os.chdir(IMAGES)
104
        f = os.open(BLOCKD_LOGS +  name, os.O_CREAT | os.O_WRONLY)
105
        r = subprocess.Popen([XSEG_HOME + "peers/blockd", name, "-p", str(port),
106
        "-g", SPEC, "-n", NR_OPS], stdout=f, stderr=f)
107

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

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

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

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

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

    
147
if __name__ == "__main__":
148
    # parse arguments and discpatch to the correct func
149
    parser = argparse.ArgumentParser(description='vlmc tool')
150
    parser.add_argument('-c', '--config', type=str, nargs='?', help='config file')
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

    
195
    #FIXME
196
    try:
197
        if args.config == None:
198
            execfile(os.path.expanduser("~/.xsegrc"))
199
        else:
200
            execfile(args.config)
201
    except:
202
        pass
203

    
204
    args.func(args)