Revision 0072a4af xseg/tools/vlmc.py

b/xseg/tools/vlmc.py
6 6
import os, sys, subprocess, shutil, re, argparse
7 7

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

  
14 15

  
15 16
def vlmc_list():
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
		
17
    print "name\t\t\t\tsize"
18
    try:
19
        for f in os.listdir(images):
20
            print "%s\t\t\t\t%dK" % (f, os.stat(images + f).st_size / 1024)
21

  
22
        sys.exit(0)
23
    except Exception, reason:
24
        print >> sys.stderr, reason
25
        sys.exit(-1)
26

  
27

  
26 28
def vlmc_create(name, size, snap=""):
27
	try:
28
		size *= 1024*1024
29
		
30
		old_dir = os.getcwd()
31
		os.chdir(images)
32

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

  
49
		os.chdir(old_dir)
50
		sys.exit(0)
51
	except Exception, reason:
52
		print >> sys.stderr, reason
53
		sys.exit(-1)
29
    try:
30
        size *= 1024*1024
31
        
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
            os.lseek(f, size - 1, os.SEEK_SET)
48
            os.write(f, "1")
49
            os.close(f)
50

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

  
54 57

  
55 58
def vlmc_remove(name):
56
	try:
57
		old_dir = os.getcwd()
58
		os.chdir(images)
59

  
60
		try:
61
			os.stat(name)
62
		except:
63
			print "file doesn't exist"
64
			os.chdir(old_dir)
65
			sys.exit(-1)
66
		
67
		os.unlink(images + '/' + name)
68

  
69
		os.chdir(old_dir)
70
		sys.exit(0)
71
	except Exception, reason:
72
		print >> sys.stderr, reason
73
		sys.exit(-1)
59
    try:
60
        old_dir = os.getcwd()
61
        os.chdir(images) 
62

  
63
        try:
64
            os.stat(name)
65
        except:
66
            print >> sys.stderr, "file does not exist"
67
            os.chdir(old_dir)
68
            sys.exit(-1)
69
        
70
        os.unlink(images + "/" + name)
71

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

  
74 78

  
75 79
def vlmc_map(name):
76
	try:
77
		try:
78
			r = subprocess.check_output(["ps", "-o", "command", "-C",
79
			"blockd"]).splitlines()[1:]
80
			result = [int(re.search('-p (\d+)', x).group(1)) for x in r]
81
			result.sort()
82

  
83
			prev = -1
84
			for i in result:
85
				if i - prev > 1:
86
					port = prev + 1
87
					break
88
				else:
89
					prev = i
90

  
91
			port = prev + 1
92
		except:
93
			port = 0
94
			
95
		old_dir = os.getcwd()
96
		os.chdir(images)
97
		f = open(blockd_logs + '/'  + name)
98
		r = subprocess.Popen([xseg_home + "peers/blockd", name, "-p", str(port),
99
		"-g", "xsegdev:xsegbd:128:4096:64:1024:12"], stdout=f, stderr=f)
100

  
101
		os.chdir(images)
102
		fd = os.open(xsegbd_sysfs + "add", os.O_WRONLY)
103
		os.write(fd, "%s %d:%d:128" % (name, port + 64, port))
104
		os.close(fd)
105
	except Exception, reason:
106
		print >> sys.stderr, reason
107
		sys.exit(-1)
80
    try:
81
        try:
82
            r = subprocess.check_output(["ps", "-o", "command", "-C",
83
            "blockd"]).splitlines()[1:]
84
            result = [int(re.search("-p (\d+)", x).group(1)) for x in r]
85
            result.sort()
86

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

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

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

  
108 113

  
109 114
def vlmc_unmap(device):
110
	try:
111
		for f in os.listdir(xsegbd_sysfs + "devices/"):
112
			d_id = open(xsegbd_sysfs + "devices/" + f + "/id").read().strip()
113
			name = open(xsegbd_sysfs + "devices/"+ f + "/name").read().strip()
114
			if device == device_prefix + d_id:
115
				fd = os.open(xsegbd_sysfs + "remove", os.O_WRONLY) 
116
				os.write(fd, d_id)
117
				os.close(fd)
118

  
119
				break
120
		
121
		subprocess.check_output(["pkill", "-f", "blockd " + name + " "])
122
	except Exception, reason:
123
		print >> sys.stderr, reason
124
		sys.exit(-1)
115
    try:
116
        for f in os.listdir(xsegbd_sysfs + "devices/"):
117
            d_id = open(xsegbd_sysfs + "devices/" + f + "/id").read().strip()
118
            name = open(xsegbd_sysfs + "devices/"+ f + "/name").read().strip()
119
            if device == device_prefix + d_id:
120
                fd = os.open(xsegbd_sysfs + "remove", os.O_WRONLY) 
121
                os.write(fd, d_id)
122
                os.close(fd)
123

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

  
125 131

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

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

  
145
    sys.exit(0)
138 146

  
139
	sys.exit(0)
140 147

  
141 148
def check_no_opts(args, parser):
142
	if args.name == None or args.size != None or args.snap != None:
143
		parser.print_usage(file=sys.stderr)
144
		sys.exit(-1)
149
    if args.name == None or args.size != None or args.snap != None:
150
        parser.print_usage(file=sys.stderr)
151
        sys.exit(-1)
152

  
145 153

  
146 154
if __name__ == "__main__":
147
	# parse arguments and discpatch to the correct func
148
	parser = argparse.ArgumentParser(description='vlmc tool')
149
	parser.add_argument('op', type=str, nargs='?', help='operation requested (create, remove, map, unmap, showmapped)')
150
	parser.add_argument('name', type=str, nargs='?', help='volume/device name')
151
	parser.add_argument('-s', '--size', type=int, nargs='?', help='requested size in MB for create')
152
	parser.add_argument('--snap', type=str, help='create from snapshot')
153
	parser.add_argument('-p', '--pool', type=str, help='for backwards compatiblity with rbd')
154
	args = parser.parse_args()	
155

  
156
	if args.op == 'create':
157
		if args.name == None or (args.snap == None and (args.size == None or args.size <= 0)) or (args.snap != None and args.size != None):
158
			parser.print_usage(file=sys.stderr)
159
			sys.exit(-1)
160
		vlmc_create(args.name, args.size, args.snap)
161
	elif args.op == 'remove':
162
		check_no_opts(args, parser)
163
		vlmc_remove(args.name)
164
	elif args.op == 'map':
165
		check_no_opts(args, parser)
166
		vlmc_map(args.name)
167
	elif args.op == 'unmap':
168
		check_no_opts(args, parser)
169
		vlmc_unmap(args.name)
170
	elif args.op == 'showmapped':
171
		if args.name != None or args.size != None or args.snap != None:
172
			parser.print_usage(file=sys.stderr)
173
			sys.exit(-1)
174
		vlmc_showmapped()
175
	elif args.op == 'list' or args.op == 'ls':
176
		if args.name != None or args.size != None or args.snap != None:
177
			parser.print_usage(file=sys.stderr)
178
			sys.exit(-1)
179
		vlmc_list()
180
	else:
181
		parser.print_usage(file=sys.stderr)
182
		sys.exit(-1)
155
    # parse arguments and discpatch to the correct func
156
    parser = argparse.ArgumentParser(description="vlmc tool")
157
    parser.add_argument("op", type=str, nargs="?",
158
		        help=("operation requested (create, remove, map,"
159
		              " unmap, showmapped)"))
160
    parser.add_argument("name", type=str, nargs="?",
161
                        help="volume/device name")
162
    parser.add_argument("-s", "--size", type=int, nargs="?",
163
                        help="requested size in MB for create")
164
    parser.add_argument("--snap", type=str, help="create from snapshot")
165
    parser.add_argument("-p", "--pool", type=str,
166
                        help="for backwards compatiblity with rbd")
167
    args = parser.parse_args()    
168

  
169
    if args.op == "create":
170
        if args.name == None or (args.snap == None and (args.size == None or args.size <= 0)) or (args.snap != None and args.size != None):
171
            parser.print_usage(file=sys.stderr)
172
            sys.exit(-1)
173
        vlmc_create(args.name, args.size, args.snap)
174
    elif args.op == "remove":
175
        check_no_opts(args, parser)
176
        vlmc_remove(args.name)
177
    elif args.op == "map":
178
        check_no_opts(args, parser)
179
        vlmc_map(args.name)
180
    elif args.op == "unmap":
181
        check_no_opts(args, parser)
182
        vlmc_unmap(args.name)
183
    elif args.op == "showmapped":
184
        if args.name != None or args.size != None or args.snap != None:
185
            parser.print_usage(file=sys.stderr)
186
            sys.exit(-1)
187
        vlmc_showmapped()
188
    elif args.op == "list" or args.op == "ls":
189
        if args.name != None or args.size != None or args.snap != None:
190
            parser.print_usage(file=sys.stderr)
191
            sys.exit(-1)
192
        vlmc_list()
193
    else:
194
        parser.print_usage(file=sys.stderr)
195
        sys.exit(-1)

Also available in: Unified diff