root / xseg / tools / archipelago / archipelago / common.py @ 6b11e79a
History | View | Annotate | Download (23.9 kB)
1 | 979bf615 | Filippos Giannakos | #!/usr/bin/env python
|
---|---|---|---|
2 | 979bf615 | Filippos Giannakos | |
3 | 979bf615 | Filippos Giannakos | # Copyright 2012 GRNET S.A. All rights reserved.
|
4 | 979bf615 | Filippos Giannakos | #
|
5 | 979bf615 | Filippos Giannakos | # Redistribution and use in source and binary forms, with or
|
6 | 979bf615 | Filippos Giannakos | # without modification, are permitted provided that the following
|
7 | 979bf615 | Filippos Giannakos | # conditions are met:
|
8 | 979bf615 | Filippos Giannakos | #
|
9 | 979bf615 | Filippos Giannakos | # 1. Redistributions of source code must retain the above
|
10 | 979bf615 | Filippos Giannakos | # copyright notice, this list of conditions and the following
|
11 | 979bf615 | Filippos Giannakos | # disclaimer.
|
12 | 979bf615 | Filippos Giannakos | # 2. Redistributions in binary form must reproduce the above
|
13 | 979bf615 | Filippos Giannakos | # copyright notice, this list of conditions and the following
|
14 | 979bf615 | Filippos Giannakos | # disclaimer in the documentation and/or other materials
|
15 | 979bf615 | Filippos Giannakos | # provided with the distribution.
|
16 | 979bf615 | Filippos Giannakos | #
|
17 | 979bf615 | Filippos Giannakos | # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
|
18 | 979bf615 | Filippos Giannakos | # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
19 | 979bf615 | Filippos Giannakos | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
20 | 979bf615 | Filippos Giannakos | # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
|
21 | 979bf615 | Filippos Giannakos | # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
22 | 979bf615 | Filippos Giannakos | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
23 | 979bf615 | Filippos Giannakos | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
24 | 979bf615 | Filippos Giannakos | # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
25 | 979bf615 | Filippos Giannakos | # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
26 | 979bf615 | Filippos Giannakos | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
27 | 979bf615 | Filippos Giannakos | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
28 | 979bf615 | Filippos Giannakos | # POSSIBILITY OF SUCH DAMAGE.
|
29 | 979bf615 | Filippos Giannakos | #
|
30 | 979bf615 | Filippos Giannakos | # The views and conclusions contained in the software and
|
31 | 979bf615 | Filippos Giannakos | # documentation are those of the authors and should not be
|
32 | 979bf615 | Filippos Giannakos | # interpreted as representing official policies, either expressed
|
33 | 979bf615 | Filippos Giannakos | # or implied, of GRNET S.A.
|
34 | 979bf615 | Filippos Giannakos | #
|
35 | 979bf615 | Filippos Giannakos | |
36 | 979bf615 | Filippos Giannakos | |
37 | 979bf615 | Filippos Giannakos | from xseg.xseg_api import * |
38 | 979bf615 | Filippos Giannakos | from xseg.xprotocol import * |
39 | 979bf615 | Filippos Giannakos | from ctypes import CFUNCTYPE, cast, c_void_p, addressof, string_at, memmove, \ |
40 | 1075ead7 | Filippos Giannakos | create_string_buffer, pointer, sizeof, POINTER, byref |
41 | 1075ead7 | Filippos Giannakos | |
42 | 979bf615 | Filippos Giannakos | cb_null_ptrtype = CFUNCTYPE(None, uint32_t)
|
43 | 979bf615 | Filippos Giannakos | |
44 | 1075ead7 | Filippos Giannakos | import os |
45 | 1075ead7 | Filippos Giannakos | import sys |
46 | 1075ead7 | Filippos Giannakos | import time |
47 | 1075ead7 | Filippos Giannakos | import psutil |
48 | 1075ead7 | Filippos Giannakos | import errno |
49 | 1075ead7 | Filippos Giannakos | from subprocess import check_call |
50 | 979bf615 | Filippos Giannakos | from collections import namedtuple |
51 | 979bf615 | Filippos Giannakos | |
52 | 979bf615 | Filippos Giannakos | #archipelago peer roles. Order matters!
|
53 | 979bf615 | Filippos Giannakos | roles = ['blockerb', 'blockerm', 'mapperd', 'vlmcd'] |
54 | 979bf615 | Filippos Giannakos | Peer = namedtuple('Peer', ['executable', 'opts', 'role']) |
55 | 979bf615 | Filippos Giannakos | |
56 | 979bf615 | Filippos Giannakos | peers = dict()
|
57 | 979bf615 | Filippos Giannakos | xsegbd_args = [] |
58 | 979bf615 | Filippos Giannakos | modules = ['xseg', 'segdev', 'xseg_posix', 'xseg_pthread', 'xseg_segdev'] |
59 | 979bf615 | Filippos Giannakos | xsegbd = 'xsegbd'
|
60 | 979bf615 | Filippos Giannakos | |
61 | 1075ead7 | Filippos Giannakos | DEFAULTS = '/etc/default/archipelago'
|
62 | 979bf615 | Filippos Giannakos | |
63 | 979bf615 | Filippos Giannakos | #system defaults
|
64 | 1075ead7 | Filippos Giannakos | ARCHIP_PREFIX = 'archip_'
|
65 | 1075ead7 | Filippos Giannakos | LOG_SUFFIX = '.log'
|
66 | 1075ead7 | Filippos Giannakos | PID_SUFFIX = '.pid'
|
67 | 1075ead7 | Filippos Giannakos | PIDFILE_PATH = "/var/run/archipelago"
|
68 | 1075ead7 | Filippos Giannakos | VLMC_LOCK_FILE = 'vlmc.lock'
|
69 | 1075ead7 | Filippos Giannakos | LOGS_PATH = "/var/log/archipelago"
|
70 | 1075ead7 | Filippos Giannakos | LOCK_PATH = "/var/lock"
|
71 | 1075ead7 | Filippos Giannakos | DEVICE_PREFIX = "/dev/xsegbd"
|
72 | 1075ead7 | Filippos Giannakos | XSEGBD_SYSFS = "/sys/bus/xsegbd/"
|
73 | 1075ead7 | Filippos Giannakos | |
74 | 1075ead7 | Filippos Giannakos | CHARDEV_NAME = "/dev/segdev"
|
75 | 1075ead7 | Filippos Giannakos | CHARDEV_MAJOR = 60
|
76 | 1075ead7 | Filippos Giannakos | CHARDEV_MINOR = 0
|
77 | 1075ead7 | Filippos Giannakos | |
78 | 1075ead7 | Filippos Giannakos | REQS = 512
|
79 | 1075ead7 | Filippos Giannakos | |
80 | 6b11e79a | Filippos Giannakos | FILE_BLOCKER = 'archip-pfiled'
|
81 | 6b11e79a | Filippos Giannakos | RADOS_BLOCKER = 'archip-sosd'
|
82 | 6b11e79a | Filippos Giannakos | MAPPER = 'archip-mapperd'
|
83 | 6b11e79a | Filippos Giannakos | VLMC = 'archip-vlmcd'
|
84 | 1075ead7 | Filippos Giannakos | BLOCKER = ''
|
85 | 979bf615 | Filippos Giannakos | |
86 | 979bf615 | Filippos Giannakos | available_storage = {'files': FILE_BLOCKER, 'rados': RADOS_BLOCKER} |
87 | 979bf615 | Filippos Giannakos | |
88 | 979bf615 | Filippos Giannakos | |
89 | 7bac0881 | Filippos Giannakos | config = { |
90 | 1075ead7 | Filippos Giannakos | 'CEPH_CONF_FILE': '/etc/ceph/ceph.conf', |
91 | 1075ead7 | Filippos Giannakos | 'XSEGBD_START': 0, |
92 | 1075ead7 | Filippos Giannakos | 'XSEGBD_END': 499, |
93 | 1075ead7 | Filippos Giannakos | 'VPORT_START': 500, |
94 | 1075ead7 | Filippos Giannakos | 'VPORT_END': 999, |
95 | 1075ead7 | Filippos Giannakos | 'BPORT': 1000, |
96 | 1075ead7 | Filippos Giannakos | 'MPORT': 1001, |
97 | 1075ead7 | Filippos Giannakos | 'MBPORT': 1002, |
98 | 1075ead7 | Filippos Giannakos | 'VTOOL': 1003, |
99 | 1075ead7 | Filippos Giannakos | #RESERVED 1023
|
100 | 1075ead7 | Filippos Giannakos | #default config
|
101 | 1075ead7 | Filippos Giannakos | 'SPEC': "segdev:xsegbd:1024:5120:12", |
102 | 1075ead7 | Filippos Giannakos | 'NR_OPS_BLOCKERB': "", |
103 | 1075ead7 | Filippos Giannakos | 'NR_OPS_BLOCKERM': "", |
104 | 1075ead7 | Filippos Giannakos | 'NR_OPS_VLMC': "", |
105 | 1075ead7 | Filippos Giannakos | 'NR_OPS_MAPPER': "", |
106 | 1075ead7 | Filippos Giannakos | #'VERBOSITY_BLOCKERB': "",
|
107 | 1075ead7 | Filippos Giannakos | #'VERBOSITY_BLOCKERM': "",
|
108 | 1075ead7 | Filippos Giannakos | #'VERBOSITY_MAPPER': "",
|
109 | 1075ead7 | Filippos Giannakos | #'VERBOSITY_VLMC': "",
|
110 | 1075ead7 | Filippos Giannakos | #mt-pfiled specific options,
|
111 | 1075ead7 | Filippos Giannakos | 'FILED_IMAGES': "", |
112 | 1075ead7 | Filippos Giannakos | 'FILED_MAPS': "", |
113 | 1075ead7 | Filippos Giannakos | 'PITHOS': "", |
114 | 1075ead7 | Filippos Giannakos | 'PITHOSMAPS': "", |
115 | 1075ead7 | Filippos Giannakos | #mt-sosd specific options,
|
116 | 1075ead7 | Filippos Giannakos | 'RADOS_POOL_MAPS': "", |
117 | 1075ead7 | Filippos Giannakos | 'RADOS_POOL_BLOCKS': "" |
118 | 7bac0881 | Filippos Giannakos | } |
119 | 979bf615 | Filippos Giannakos | |
120 | 979bf615 | Filippos Giannakos | FIRST_COLUMN_WIDTH = 23
|
121 | 979bf615 | Filippos Giannakos | SECOND_COLUMN_WIDTH = 23
|
122 | 979bf615 | Filippos Giannakos | |
123 | 1075ead7 | Filippos Giannakos | |
124 | 979bf615 | Filippos Giannakos | def green(s): |
125 | 979bf615 | Filippos Giannakos | return '\x1b[32m' + str(s) + '\x1b[0m' |
126 | 979bf615 | Filippos Giannakos | |
127 | 1075ead7 | Filippos Giannakos | |
128 | 979bf615 | Filippos Giannakos | def red(s): |
129 | 979bf615 | Filippos Giannakos | return '\x1b[31m' + str(s) + '\x1b[0m' |
130 | 979bf615 | Filippos Giannakos | |
131 | 1075ead7 | Filippos Giannakos | |
132 | 979bf615 | Filippos Giannakos | def yellow(s): |
133 | 979bf615 | Filippos Giannakos | return '\x1b[33m' + str(s) + '\x1b[0m' |
134 | 979bf615 | Filippos Giannakos | |
135 | 1075ead7 | Filippos Giannakos | |
136 | 979bf615 | Filippos Giannakos | def pretty_print(cid, status): |
137 | 979bf615 | Filippos Giannakos | sys.stdout.write(cid.ljust(FIRST_COLUMN_WIDTH)) |
138 | 979bf615 | Filippos Giannakos | sys.stdout.write(status.ljust(SECOND_COLUMN_WIDTH)) |
139 | 979bf615 | Filippos Giannakos | sys.stdout.write('\n')
|
140 | 979bf615 | Filippos Giannakos | return
|
141 | 979bf615 | Filippos Giannakos | |
142 | 1075ead7 | Filippos Giannakos | |
143 | 979bf615 | Filippos Giannakos | class Error(Exception): |
144 | 979bf615 | Filippos Giannakos | def __init__(self, msg): |
145 | 979bf615 | Filippos Giannakos | self.msg = msg
|
146 | 979bf615 | Filippos Giannakos | |
147 | 979bf615 | Filippos Giannakos | def __str__(self): |
148 | 979bf615 | Filippos Giannakos | return self.msg |
149 | 979bf615 | Filippos Giannakos | |
150 | 1075ead7 | Filippos Giannakos | |
151 | 979bf615 | Filippos Giannakos | def check_conf(): |
152 | 979bf615 | Filippos Giannakos | def isExec(file_path): |
153 | 979bf615 | Filippos Giannakos | return os.path.isfile(file_path) and os.access(file_path, os.X_OK) |
154 | 979bf615 | Filippos Giannakos | |
155 | 979bf615 | Filippos Giannakos | def validExec(program): |
156 | 979bf615 | Filippos Giannakos | for path in os.environ["PATH"].split(os.pathsep): |
157 | 979bf615 | Filippos Giannakos | exe_file = os.path.join(path, program) |
158 | 979bf615 | Filippos Giannakos | if isExec(exe_file):
|
159 | 979bf615 | Filippos Giannakos | return True |
160 | 979bf615 | Filippos Giannakos | return False |
161 | 979bf615 | Filippos Giannakos | |
162 | 979bf615 | Filippos Giannakos | def validPort(port, limit, name): |
163 | 979bf615 | Filippos Giannakos | try:
|
164 | 979bf615 | Filippos Giannakos | if int(port) >= limit: |
165 | 979bf615 | Filippos Giannakos | print red(str(port) + " >= " + limit) |
166 | 979bf615 | Filippos Giannakos | return False |
167 | 979bf615 | Filippos Giannakos | except:
|
168 | 979bf615 | Filippos Giannakos | print red("Invalid port "+name+" : " + str(port)) |
169 | 979bf615 | Filippos Giannakos | return False |
170 | 979bf615 | Filippos Giannakos | |
171 | 979bf615 | Filippos Giannakos | return True |
172 | 979bf615 | Filippos Giannakos | |
173 | 979bf615 | Filippos Giannakos | if not LOGS_PATH: |
174 | 979bf615 | Filippos Giannakos | print red("LOGS_PATH is not set") |
175 | 979bf615 | Filippos Giannakos | return False |
176 | 979bf615 | Filippos Giannakos | if not PIDFILE_PATH: |
177 | 979bf615 | Filippos Giannakos | print red("PIDFILE_PATH is not set") |
178 | 979bf615 | Filippos Giannakos | return False |
179 | 979bf615 | Filippos Giannakos | |
180 | 979bf615 | Filippos Giannakos | try:
|
181 | 979bf615 | Filippos Giannakos | if not os.path.isdir(str(LOGS_PATH)): |
182 | 979bf615 | Filippos Giannakos | print red("LOGS_PATH "+str(LOGS_PATH)+" does not exist") |
183 | 979bf615 | Filippos Giannakos | return False |
184 | 979bf615 | Filippos Giannakos | except:
|
185 | 979bf615 | Filippos Giannakos | print red("LOGS_PATH doesn't exist or is not a directory") |
186 | 979bf615 | Filippos Giannakos | return False |
187 | 979bf615 | Filippos Giannakos | |
188 | 979bf615 | Filippos Giannakos | try:
|
189 | 979bf615 | Filippos Giannakos | os.makedirs(str(PIDFILE_PATH))
|
190 | 979bf615 | Filippos Giannakos | except OSError as e: |
191 | 979bf615 | Filippos Giannakos | if e.errno == errno.EEXIST:
|
192 | 979bf615 | Filippos Giannakos | if os.path.isdir(str(PIDFILE_PATH)): |
193 | 979bf615 | Filippos Giannakos | pass
|
194 | 979bf615 | Filippos Giannakos | else:
|
195 | 979bf615 | Filippos Giannakos | print red(str(PIDFILE_PATH) + " is not a directory") |
196 | 979bf615 | Filippos Giannakos | return False |
197 | 979bf615 | Filippos Giannakos | else:
|
198 | 979bf615 | Filippos Giannakos | print red("Cannot create " + str(PIDFILE_PATH)) |
199 | 979bf615 | Filippos Giannakos | return False |
200 | 979bf615 | Filippos Giannakos | except:
|
201 | 979bf615 | Filippos Giannakos | print red("PIDFILE_PATH is not set") |
202 | 979bf615 | Filippos Giannakos | return False |
203 | 979bf615 | Filippos Giannakos | |
204 | 7bac0881 | Filippos Giannakos | splitted_spec = str(config['SPEC']).split(':') |
205 | 979bf615 | Filippos Giannakos | if len(splitted_spec) < 5: |
206 | 979bf615 | Filippos Giannakos | print red("Invalid spec") |
207 | 979bf615 | Filippos Giannakos | return False |
208 | 979bf615 | Filippos Giannakos | |
209 | 1075ead7 | Filippos Giannakos | xseg_type = splitted_spec[0]
|
210 | 1075ead7 | Filippos Giannakos | xseg_name = splitted_spec[1]
|
211 | 1075ead7 | Filippos Giannakos | xseg_ports = int(splitted_spec[2]) |
212 | 1075ead7 | Filippos Giannakos | xseg_heapsize = int(splitted_spec[3]) |
213 | 1075ead7 | Filippos Giannakos | xseg_align = int(splitted_spec[4]) |
214 | 979bf615 | Filippos Giannakos | |
215 | 979bf615 | Filippos Giannakos | if xseg_type != "segdev": |
216 | 979bf615 | Filippos Giannakos | print red("Segment type not segdev") |
217 | 979bf615 | Filippos Giannakos | return False |
218 | 979bf615 | Filippos Giannakos | if xseg_name != "xsegbd": |
219 | 979bf615 | Filippos Giannakos | print red("Segment name not equal xsegbd") |
220 | 979bf615 | Filippos Giannakos | return False |
221 | 979bf615 | Filippos Giannakos | if xseg_align != 12: |
222 | 979bf615 | Filippos Giannakos | print red("Wrong alignemt") |
223 | 979bf615 | Filippos Giannakos | return False |
224 | 979bf615 | Filippos Giannakos | |
225 | 7bac0881 | Filippos Giannakos | for v in [config['VERBOSITY_BLOCKERB'], |
226 | 7bac0881 | Filippos Giannakos | config['VERBOSITY_BLOCKERM'],
|
227 | 7bac0881 | Filippos Giannakos | config['VERBOSITY_MAPPER'],
|
228 | 7bac0881 | Filippos Giannakos | config['VERBOSITY_VLMC']
|
229 | 7bac0881 | Filippos Giannakos | ]: |
230 | 1075ead7 | Filippos Giannakos | if v is None: |
231 | 1075ead7 | Filippos Giannakos | print red("Verbosity missing") |
232 | 1075ead7 | Filippos Giannakos | try:
|
233 | 1075ead7 | Filippos Giannakos | if (int(v) > 3 or int(v) < 0): |
234 | 1075ead7 | Filippos Giannakos | print red("Invalid verbosity " + str(v)) |
235 | 1075ead7 | Filippos Giannakos | return False |
236 | 1075ead7 | Filippos Giannakos | except:
|
237 | 1075ead7 | Filippos Giannakos | print red("Invalid verbosity " + str(v)) |
238 | 1075ead7 | Filippos Giannakos | return False |
239 | 979bf615 | Filippos Giannakos | |
240 | 7bac0881 | Filippos Giannakos | for n in [config['NR_OPS_BLOCKERB'], |
241 | 7bac0881 | Filippos Giannakos | config['NR_OPS_BLOCKERM'],
|
242 | 7bac0881 | Filippos Giannakos | config['NR_OPS_VLMC'],
|
243 | 7bac0881 | Filippos Giannakos | config['NR_OPS_MAPPER']
|
244 | 1075ead7 | Filippos Giannakos | ]: |
245 | 1075ead7 | Filippos Giannakos | if n is None: |
246 | 1075ead7 | Filippos Giannakos | print red("Nr ops missing") |
247 | 1075ead7 | Filippos Giannakos | try:
|
248 | 1075ead7 | Filippos Giannakos | if (int(n) <= 0): |
249 | 1075ead7 | Filippos Giannakos | print red("Invalid nr_ops " + str(n)) |
250 | 1075ead7 | Filippos Giannakos | return False |
251 | 1075ead7 | Filippos Giannakos | except:
|
252 | 1075ead7 | Filippos Giannakos | print red("Invalid nr_ops " + str(n)) |
253 | 1075ead7 | Filippos Giannakos | return False |
254 | 979bf615 | Filippos Giannakos | |
255 | 7bac0881 | Filippos Giannakos | if not validPort(config['VTOOL'], xseg_ports, "VTOOL"): |
256 | 979bf615 | Filippos Giannakos | return False |
257 | 7bac0881 | Filippos Giannakos | if not validPort(config['MPORT'], xseg_ports, "MPORT"): |
258 | 979bf615 | Filippos Giannakos | return False |
259 | 7bac0881 | Filippos Giannakos | if not validPort(config['BPORT'], xseg_ports, "BPORT"): |
260 | 979bf615 | Filippos Giannakos | return False |
261 | 7bac0881 | Filippos Giannakos | if not validPort(config['MBPORT'], xseg_ports, "MBPORT"): |
262 | 979bf615 | Filippos Giannakos | return False |
263 | 7bac0881 | Filippos Giannakos | if not validPort(config['VPORT_START'], xseg_ports, "VPORT_START"): |
264 | 979bf615 | Filippos Giannakos | return False |
265 | 7bac0881 | Filippos Giannakos | if not validPort(config['VPORT_END'], xseg_ports, "VPORT_END"): |
266 | 979bf615 | Filippos Giannakos | return False |
267 | 7bac0881 | Filippos Giannakos | if not validPort(config['XSEGBD_START'], xseg_ports, "XSEGBD_START"): |
268 | 979bf615 | Filippos Giannakos | return False |
269 | 7bac0881 | Filippos Giannakos | if not validPort(config['XSEGBD_END'], xseg_ports, "XSEGBD_END"): |
270 | 979bf615 | Filippos Giannakos | return False |
271 | 979bf615 | Filippos Giannakos | |
272 | 7bac0881 | Filippos Giannakos | if not config['XSEGBD_START'] < config['XSEGBD_END']: |
273 | 979bf615 | Filippos Giannakos | print red("XSEGBD_START should be less than XSEGBD_END") |
274 | 979bf615 | Filippos Giannakos | return False |
275 | 7bac0881 | Filippos Giannakos | if not config['VPORT_START'] < config['VPORT_END']: |
276 | 979bf615 | Filippos Giannakos | print red("VPORT_START should be less than VPORT_END") |
277 | 979bf615 | Filippos Giannakos | return False |
278 | 979bf615 | Filippos Giannakos | #TODO check than no other port is set in the above ranges
|
279 | 979bf615 | Filippos Giannakos | |
280 | 979bf615 | Filippos Giannakos | global BLOCKER
|
281 | 979bf615 | Filippos Giannakos | try:
|
282 | 7bac0881 | Filippos Giannakos | BLOCKER = available_storage[str(config['STORAGE'])] |
283 | 979bf615 | Filippos Giannakos | except:
|
284 | 7bac0881 | Filippos Giannakos | print red("Invalid storage " + str(config['STORAGE'])) |
285 | 979bf615 | Filippos Giannakos | print "Available storage: \"" + ', "'.join(available_storage) + "\"" |
286 | 979bf615 | Filippos Giannakos | return False |
287 | 979bf615 | Filippos Giannakos | |
288 | 1075ead7 | Filippos Giannakos | if config['STORAGE'] == "files": |
289 | 1075ead7 | Filippos Giannakos | if config['FILED_IMAGES'] and not \ |
290 | 1075ead7 | Filippos Giannakos | os.path.isdir(str(config['FILED_IMAGES'])): |
291 | 1075ead7 | Filippos Giannakos | print red("FILED_IMAGES invalid") |
292 | 1075ead7 | Filippos Giannakos | return False |
293 | 1075ead7 | Filippos Giannakos | if config['FILED_MAPS'] and not \ |
294 | 1075ead7 | Filippos Giannakos | os.path.isdir(str(config['FILED_MAPS'])): |
295 | 1075ead7 | Filippos Giannakos | print red("FILED_PATH invalid") |
296 | 1075ead7 | Filippos Giannakos | return False |
297 | 7bac0881 | Filippos Giannakos | if config['PITHOS'] and not os.path.isdir(str(config['PITHOS'])): |
298 | 1075ead7 | Filippos Giannakos | print red("PITHOS invalid ") |
299 | 1075ead7 | Filippos Giannakos | return False |
300 | 1075ead7 | Filippos Giannakos | if config['PITHOSMAPS'] and not \ |
301 | 1075ead7 | Filippos Giannakos | os.path.isdir(str(config['PITHOSMAPS'])): |
302 | 1075ead7 | Filippos Giannakos | print red("PITHOSMAPS invalid") |
303 | 1075ead7 | Filippos Giannakos | return False |
304 | 1075ead7 | Filippos Giannakos | elif config['STORAGE'] == "RADOS": |
305 | 979bf615 | Filippos Giannakos | #TODO use rados.py to check for pool existance
|
306 | 979bf615 | Filippos Giannakos | pass
|
307 | 979bf615 | Filippos Giannakos | |
308 | 979bf615 | Filippos Giannakos | for p in [BLOCKER, MAPPER, VLMC]: |
309 | 979bf615 | Filippos Giannakos | if not validExec(p): |
310 | 979bf615 | Filippos Giannakos | print red(p + "is not a valid executable") |
311 | 979bf615 | Filippos Giannakos | return False |
312 | 979bf615 | Filippos Giannakos | |
313 | 979bf615 | Filippos Giannakos | return True |
314 | 979bf615 | Filippos Giannakos | |
315 | 1075ead7 | Filippos Giannakos | |
316 | 979bf615 | Filippos Giannakos | def construct_peers(): |
317 | 979bf615 | Filippos Giannakos | #these must be in sync with roles
|
318 | 979bf615 | Filippos Giannakos | executables = dict()
|
319 | 979bf615 | Filippos Giannakos | config_opts = dict()
|
320 | 979bf615 | Filippos Giannakos | executables['blockerb'] = BLOCKER
|
321 | 979bf615 | Filippos Giannakos | executables['blockerm'] = BLOCKER
|
322 | 979bf615 | Filippos Giannakos | executables['mapperd'] = MAPPER
|
323 | 979bf615 | Filippos Giannakos | executables['vlmcd'] = VLMC
|
324 | 979bf615 | Filippos Giannakos | |
325 | 979bf615 | Filippos Giannakos | if BLOCKER == "pfiled": |
326 | 979bf615 | Filippos Giannakos | config_opts['blockerb'] = [
|
327 | 1075ead7 | Filippos Giannakos | "-p", str(config['BPORT']), "-g", |
328 | 1075ead7 | Filippos Giannakos | str(config['SPEC']).encode(), "-n", |
329 | 1075ead7 | Filippos Giannakos | str(config['NR_OPS_BLOCKERB']), |
330 | 1075ead7 | Filippos Giannakos | str(config['PITHOS']), str(config['FILED_IMAGES']), "-d", |
331 | 1075ead7 | Filippos Giannakos | "-f", os.path.join(PIDFILE_PATH, "blockerb" + PID_SUFFIX) |
332 | 1075ead7 | Filippos Giannakos | ] |
333 | 979bf615 | Filippos Giannakos | config_opts['blockerm'] = [
|
334 | 1075ead7 | Filippos Giannakos | "-p", str(config['MBPORT']), "-g", |
335 | 1075ead7 | Filippos Giannakos | str(config['SPEC']).encode(), "-n", |
336 | 1075ead7 | Filippos Giannakos | str(config['NR_OPS_BLOCKERM']), |
337 | 1075ead7 | Filippos Giannakos | str(config['PITHOSMAPS']), str(config['FILED_MAPS']), "-d", |
338 | 1075ead7 | Filippos Giannakos | "-f", os.path.join(PIDFILE_PATH, "blockerm" + PID_SUFFIX) |
339 | 1075ead7 | Filippos Giannakos | ] |
340 | 6b11e79a | Filippos Giannakos | elif BLOCKER == "archip-sosd": |
341 | 979bf615 | Filippos Giannakos | config_opts['blockerb'] = [
|
342 | 1075ead7 | Filippos Giannakos | "-p", str(config['BPORT']), "-g", |
343 | 1075ead7 | Filippos Giannakos | str(config['SPEC']).encode(), "-n", |
344 | 1075ead7 | Filippos Giannakos | str(config['NR_OPS_BLOCKERB']), |
345 | 1075ead7 | Filippos Giannakos | "--pool", str(config['RADOS_POOL_BLOCKS']), "-v", |
346 | 1075ead7 | Filippos Giannakos | str(config['VERBOSITY_BLOCKERB']), |
347 | 1075ead7 | Filippos Giannakos | "-d",
|
348 | 1075ead7 | Filippos Giannakos | "--pidfile", os.path.join(PIDFILE_PATH, "blockerb" + PID_SUFFIX), |
349 | 1075ead7 | Filippos Giannakos | "-l", os.path.join(str(LOGS_PATH), "blockerb" + LOG_SUFFIX), |
350 | 1075ead7 | Filippos Giannakos | "-t", "3" |
351 | 1075ead7 | Filippos Giannakos | ] |
352 | 979bf615 | Filippos Giannakos | config_opts['blockerm'] = [
|
353 | 1075ead7 | Filippos Giannakos | "-p", str(config['MBPORT']), "-g", |
354 | 1075ead7 | Filippos Giannakos | str(config['SPEC']).encode(), "-n", |
355 | 1075ead7 | Filippos Giannakos | str(config['NR_OPS_BLOCKERM']), |
356 | 1075ead7 | Filippos Giannakos | "--pool", str(config['RADOS_POOL_MAPS']), "-v", |
357 | 1075ead7 | Filippos Giannakos | str(config['VERBOSITY_BLOCKERM']), |
358 | 1075ead7 | Filippos Giannakos | "-d",
|
359 | 1075ead7 | Filippos Giannakos | "--pidfile", os.path.join(PIDFILE_PATH, "blockerm" + PID_SUFFIX), |
360 | 1075ead7 | Filippos Giannakos | "-l", os.path.join(str(LOGS_PATH), "blockerm" + LOG_SUFFIX), |
361 | 1075ead7 | Filippos Giannakos | "-t", "3" |
362 | 1075ead7 | Filippos Giannakos | ] |
363 | 6b11e79a | Filippos Giannakos | elif BLOCKER == "archip-pfiled": |
364 | 979bf615 | Filippos Giannakos | config_opts['blockerb'] = [
|
365 | 1075ead7 | Filippos Giannakos | "-p", str(config['BPORT']), "-g", |
366 | 1075ead7 | Filippos Giannakos | str(config['SPEC']).encode(), "-n", |
367 | 1075ead7 | Filippos Giannakos | str(config['NR_OPS_BLOCKERB']), |
368 | 1075ead7 | Filippos Giannakos | "--pithos", str(config['PITHOS']), "--archip", |
369 | 1075ead7 | Filippos Giannakos | str(config['FILED_IMAGES']), |
370 | 1075ead7 | Filippos Giannakos | "-v", str(config['VERBOSITY_BLOCKERB']), |
371 | 1075ead7 | Filippos Giannakos | "-d",
|
372 | 1075ead7 | Filippos Giannakos | "--pidfile", os.path.join(PIDFILE_PATH, "blockerb" + PID_SUFFIX), |
373 | 1075ead7 | Filippos Giannakos | "-l", os.path.join(str(LOGS_PATH), "blockerb" + LOG_SUFFIX), |
374 | 1075ead7 | Filippos Giannakos | "-t", str(config['NR_OPS_BLOCKERB']), "--prefix", ARCHIP_PREFIX |
375 | 1075ead7 | Filippos Giannakos | ] |
376 | 979bf615 | Filippos Giannakos | config_opts['blockerm'] = [
|
377 | 1075ead7 | Filippos Giannakos | "-p", str(config['MBPORT']), "-g", |
378 | 1075ead7 | Filippos Giannakos | str(config['SPEC']).encode(), "-n", |
379 | 1075ead7 | Filippos Giannakos | str(config['NR_OPS_BLOCKERM']), |
380 | 1075ead7 | Filippos Giannakos | "--pithos", str(config['PITHOSMAPS']), "--archip", |
381 | 1075ead7 | Filippos Giannakos | str(config['FILED_MAPS']), |
382 | 1075ead7 | Filippos Giannakos | "-v", str(config['VERBOSITY_BLOCKERM']), |
383 | 1075ead7 | Filippos Giannakos | "-d",
|
384 | 1075ead7 | Filippos Giannakos | "--pidfile", os.path.join(PIDFILE_PATH, "blockerm" + PID_SUFFIX), |
385 | 1075ead7 | Filippos Giannakos | "-l", os.path.join(str(LOGS_PATH), "blockerm" + LOG_SUFFIX), |
386 | 1075ead7 | Filippos Giannakos | "-t", str(config['NR_OPS_BLOCKERM']), "--prefix", ARCHIP_PREFIX |
387 | 1075ead7 | Filippos Giannakos | ] |
388 | 979bf615 | Filippos Giannakos | else:
|
389 | 979bf615 | Filippos Giannakos | sys.exit(-1)
|
390 | 979bf615 | Filippos Giannakos | |
391 | 979bf615 | Filippos Giannakos | config_opts['mapperd'] = [
|
392 | 1075ead7 | Filippos Giannakos | "-t", "1", "-p", str(config['MPORT']), "-mbp", |
393 | 1075ead7 | Filippos Giannakos | str(config['MBPORT']), |
394 | 1075ead7 | Filippos Giannakos | "-g", str(config['SPEC']).encode(), "-n", |
395 | 1075ead7 | Filippos Giannakos | str(config['NR_OPS_MAPPER']), "-bp", str(config['BPORT']), |
396 | 1075ead7 | Filippos Giannakos | "--pidfile", os.path.join(PIDFILE_PATH, "mapperd" + PID_SUFFIX), |
397 | 1075ead7 | Filippos Giannakos | "-v", str(config['VERBOSITY_MAPPER']), "-d", |
398 | 1075ead7 | Filippos Giannakos | "-l", os.path.join(str(LOGS_PATH), "mapperd" + LOG_SUFFIX) |
399 | 1075ead7 | Filippos Giannakos | ] |
400 | 979bf615 | Filippos Giannakos | config_opts['vlmcd'] = [
|
401 | 1075ead7 | Filippos Giannakos | "-t", "1", "-sp", str(config['VPORT_START']), "-ep", |
402 | 1075ead7 | Filippos Giannakos | str(config['VPORT_END']), |
403 | 1075ead7 | Filippos Giannakos | "-g", str(config['SPEC']).encode(), "-n", |
404 | 1075ead7 | Filippos Giannakos | str(config['NR_OPS_VLMC']), "-bp", str(config['BPORT']), |
405 | 1075ead7 | Filippos Giannakos | "-mp", str(config['MPORT']), "-d", "-v", |
406 | 1075ead7 | Filippos Giannakos | str(config['VERBOSITY_VLMC']), |
407 | 1075ead7 | Filippos Giannakos | "--pidfile", os.path.join(PIDFILE_PATH, "vlmcd" + PID_SUFFIX), |
408 | 1075ead7 | Filippos Giannakos | "-l", os.path.join(str(LOGS_PATH), "vlmcd" + LOG_SUFFIX) |
409 | 1075ead7 | Filippos Giannakos | ] |
410 | 979bf615 | Filippos Giannakos | |
411 | 979bf615 | Filippos Giannakos | for r in roles: |
412 | 1075ead7 | Filippos Giannakos | peers[r] = Peer(executable=executables[r], opts=config_opts[r], |
413 | 1075ead7 | Filippos Giannakos | role=r) |
414 | 979bf615 | Filippos Giannakos | |
415 | 979bf615 | Filippos Giannakos | return peers
|
416 | 979bf615 | Filippos Giannakos | |
417 | 979bf615 | Filippos Giannakos | |
418 | 979bf615 | Filippos Giannakos | def exclusive(fn): |
419 | d05e921b | Filippos Giannakos | def exclusive_args(**kwargs): |
420 | 979bf615 | Filippos Giannakos | if not os.path.exists(LOCK_PATH): |
421 | 979bf615 | Filippos Giannakos | try:
|
422 | 979bf615 | Filippos Giannakos | os.mkdir(LOCK_PATH) |
423 | 979bf615 | Filippos Giannakos | except OSError, (err, reason): |
424 | 979bf615 | Filippos Giannakos | print >> sys.stderr, reason
|
425 | 979bf615 | Filippos Giannakos | if not os.path.isdir(LOCK_PATH): |
426 | 979bf615 | Filippos Giannakos | sys.stderr.write("Locking error: ")
|
427 | 979bf615 | Filippos Giannakos | print >> sys.stderr, LOCK_PATH + " is not a directory" |
428 | 1075ead7 | Filippos Giannakos | return -1 |
429 | 979bf615 | Filippos Giannakos | lock_file = os.path.join(LOCK_PATH, VLMC_LOCK_FILE) |
430 | 979bf615 | Filippos Giannakos | while True: |
431 | 979bf615 | Filippos Giannakos | try:
|
432 | 1075ead7 | Filippos Giannakos | fd = os.open(lock_file, os.O_CREAT | os.O_EXCL | os.O_WRONLY) |
433 | 1075ead7 | Filippos Giannakos | break
|
434 | 979bf615 | Filippos Giannakos | except OSError, (err, reason): |
435 | 979bf615 | Filippos Giannakos | print >> sys.stderr, reason
|
436 | 979bf615 | Filippos Giannakos | if err == errno.EEXIST:
|
437 | 979bf615 | Filippos Giannakos | time.sleep(0.2)
|
438 | 979bf615 | Filippos Giannakos | else:
|
439 | 979bf615 | Filippos Giannakos | raise OSError(err, lock_file + ' ' + reason) |
440 | 979bf615 | Filippos Giannakos | try:
|
441 | d05e921b | Filippos Giannakos | r = fn(**kwargs) |
442 | 979bf615 | Filippos Giannakos | finally:
|
443 | 979bf615 | Filippos Giannakos | os.close(fd) |
444 | 979bf615 | Filippos Giannakos | os.unlink(lock_file) |
445 | 979bf615 | Filippos Giannakos | return r
|
446 | 979bf615 | Filippos Giannakos | |
447 | 979bf615 | Filippos Giannakos | return exclusive_args
|
448 | 979bf615 | Filippos Giannakos | |
449 | 1075ead7 | Filippos Giannakos | |
450 | 979bf615 | Filippos Giannakos | def loadrc(rc): |
451 | 979bf615 | Filippos Giannakos | try:
|
452 | 1075ead7 | Filippos Giannakos | if rc is None: |
453 | 7bac0881 | Filippos Giannakos | execfile(os.path.expanduser(DEFAULTS), config)
|
454 | 979bf615 | Filippos Giannakos | else:
|
455 | 7bac0881 | Filippos Giannakos | execfile(rc, config)
|
456 | 979bf615 | Filippos Giannakos | except:
|
457 | 979bf615 | Filippos Giannakos | raise Error("Cannot read config file") |
458 | 979bf615 | Filippos Giannakos | |
459 | 979bf615 | Filippos Giannakos | if not check_conf(): |
460 | 979bf615 | Filippos Giannakos | raise Error("Invalid conf file") |
461 | 979bf615 | Filippos Giannakos | |
462 | 1075ead7 | Filippos Giannakos | |
463 | 979bf615 | Filippos Giannakos | def loaded_modules(): |
464 | 979bf615 | Filippos Giannakos | lines = open("/proc/modules").read().split("\n") |
465 | 979bf615 | Filippos Giannakos | modules = [f.split(" ")[0] for f in lines] |
466 | 979bf615 | Filippos Giannakos | return modules
|
467 | 979bf615 | Filippos Giannakos | |
468 | 1075ead7 | Filippos Giannakos | |
469 | 979bf615 | Filippos Giannakos | def loaded_module(name): |
470 | 979bf615 | Filippos Giannakos | return name in loaded_modules() |
471 | 979bf615 | Filippos Giannakos | |
472 | 1075ead7 | Filippos Giannakos | |
473 | 979bf615 | Filippos Giannakos | def load_module(name, args): |
474 | 979bf615 | Filippos Giannakos | s = "Loading %s " % name
|
475 | 979bf615 | Filippos Giannakos | sys.stdout.write(s.ljust(FIRST_COLUMN_WIDTH)) |
476 | 979bf615 | Filippos Giannakos | modules = loaded_modules() |
477 | 979bf615 | Filippos Giannakos | if name in modules: |
478 | 979bf615 | Filippos Giannakos | sys.stdout.write(yellow("Already loaded".ljust(SECOND_COLUMN_WIDTH)))
|
479 | 979bf615 | Filippos Giannakos | sys.stdout.write("\n")
|
480 | 979bf615 | Filippos Giannakos | return
|
481 | 979bf615 | Filippos Giannakos | cmd = ["modprobe", "%s" % name] |
482 | 979bf615 | Filippos Giannakos | if args:
|
483 | 979bf615 | Filippos Giannakos | for arg in args: |
484 | 979bf615 | Filippos Giannakos | cmd.extend(["%s=%s" % (arg)])
|
485 | 979bf615 | Filippos Giannakos | try:
|
486 | 1075ead7 | Filippos Giannakos | check_call(cmd, shell=False)
|
487 | 979bf615 | Filippos Giannakos | except Exception: |
488 | 979bf615 | Filippos Giannakos | sys.stdout.write(red("FAILED".ljust(SECOND_COLUMN_WIDTH)))
|
489 | 979bf615 | Filippos Giannakos | sys.stdout.write("\n")
|
490 | 1075ead7 | Filippos Giannakos | raise Error("Cannot load module %s. Check system logs" % name) |
491 | 979bf615 | Filippos Giannakos | sys.stdout.write(green("OK".ljust(SECOND_COLUMN_WIDTH)))
|
492 | 979bf615 | Filippos Giannakos | sys.stdout.write("\n")
|
493 | 979bf615 | Filippos Giannakos | |
494 | 1075ead7 | Filippos Giannakos | |
495 | 979bf615 | Filippos Giannakos | def unload_module(name): |
496 | 979bf615 | Filippos Giannakos | s = "Unloading %s " % name
|
497 | 979bf615 | Filippos Giannakos | sys.stdout.write(s.ljust(FIRST_COLUMN_WIDTH)) |
498 | 979bf615 | Filippos Giannakos | modules = loaded_modules() |
499 | 979bf615 | Filippos Giannakos | if name not in modules: |
500 | 979bf615 | Filippos Giannakos | sys.stdout.write(yellow("Not loaded".ljust(SECOND_COLUMN_WIDTH)))
|
501 | 979bf615 | Filippos Giannakos | sys.stdout.write("\n")
|
502 | 979bf615 | Filippos Giannakos | return
|
503 | 979bf615 | Filippos Giannakos | cmd = ["modprobe -r %s" % name]
|
504 | 979bf615 | Filippos Giannakos | try:
|
505 | 1075ead7 | Filippos Giannakos | check_call(cmd, shell=True)
|
506 | 979bf615 | Filippos Giannakos | except Exception: |
507 | 979bf615 | Filippos Giannakos | sys.stdout.write(red("FAILED".ljust(SECOND_COLUMN_WIDTH)))
|
508 | 979bf615 | Filippos Giannakos | sys.stdout.write("\n")
|
509 | 1075ead7 | Filippos Giannakos | raise Error("Cannot unload module %s. Check system logs" % name) |
510 | 979bf615 | Filippos Giannakos | sys.stdout.write(green("OK".ljust(SECOND_COLUMN_WIDTH)))
|
511 | 979bf615 | Filippos Giannakos | sys.stdout.write("\n")
|
512 | 979bf615 | Filippos Giannakos | |
513 | 979bf615 | Filippos Giannakos | xseg_initialized = False
|
514 | 979bf615 | Filippos Giannakos | |
515 | 1075ead7 | Filippos Giannakos | |
516 | 979bf615 | Filippos Giannakos | def initialize_xseg(): |
517 | 979bf615 | Filippos Giannakos | global xseg_initialized
|
518 | b45a87cb | Filippos Giannakos | if not xseg_initialized: |
519 | b45a87cb | Filippos Giannakos | xseg_initialize() |
520 | b45a87cb | Filippos Giannakos | xseg_initialized = True
|
521 | 979bf615 | Filippos Giannakos | |
522 | 1075ead7 | Filippos Giannakos | |
523 | 979bf615 | Filippos Giannakos | def create_segment(): |
524 | 979bf615 | Filippos Giannakos | #fixme blocking....
|
525 | 979bf615 | Filippos Giannakos | initialize_xseg() |
526 | 979bf615 | Filippos Giannakos | xconf = xseg_config() |
527 | 7bac0881 | Filippos Giannakos | xseg_parse_spec(str(config['SPEC']), xconf) |
528 | 979bf615 | Filippos Giannakos | r = xseg_create(xconf) |
529 | 979bf615 | Filippos Giannakos | if r < 0: |
530 | 979bf615 | Filippos Giannakos | raise Error("Cannot create segment") |
531 | 979bf615 | Filippos Giannakos | |
532 | 1075ead7 | Filippos Giannakos | |
533 | 979bf615 | Filippos Giannakos | def destroy_segment(): |
534 | 979bf615 | Filippos Giannakos | #fixme blocking....
|
535 | 979bf615 | Filippos Giannakos | try:
|
536 | 979bf615 | Filippos Giannakos | initialize_xseg() |
537 | 979bf615 | Filippos Giannakos | xconf = xseg_config() |
538 | 7bac0881 | Filippos Giannakos | xseg_parse_spec(str(config['SPEC']), xconf) |
539 | 1075ead7 | Filippos Giannakos | xseg = xseg_join(xconf.type, xconf.name, "posix",
|
540 | 1075ead7 | Filippos Giannakos | cast(0, cb_null_ptrtype))
|
541 | 979bf615 | Filippos Giannakos | if not xseg: |
542 | 979bf615 | Filippos Giannakos | raise Error("Cannot join segment") |
543 | 979bf615 | Filippos Giannakos | xseg_leave(xseg) |
544 | 979bf615 | Filippos Giannakos | xseg_destroy(xseg) |
545 | 1075ead7 | Filippos Giannakos | except Exception: |
546 | 979bf615 | Filippos Giannakos | raise Error("Cannot destroy segment") |
547 | 979bf615 | Filippos Giannakos | |
548 | 1075ead7 | Filippos Giannakos | |
549 | 1075ead7 | Filippos Giannakos | def check_running(name, pid=None): |
550 | 979bf615 | Filippos Giannakos | for p in psutil.process_iter(): |
551 | b62308c0 | Filippos Giannakos | if p.name[0:len(name)] == name: |
552 | 979bf615 | Filippos Giannakos | if pid:
|
553 | 979bf615 | Filippos Giannakos | if pid == p.pid:
|
554 | 979bf615 | Filippos Giannakos | return pid
|
555 | 979bf615 | Filippos Giannakos | else:
|
556 | 979bf615 | Filippos Giannakos | return pid
|
557 | 979bf615 | Filippos Giannakos | return None |
558 | 979bf615 | Filippos Giannakos | |
559 | 1075ead7 | Filippos Giannakos | |
560 | 979bf615 | Filippos Giannakos | def check_pidfile(name): |
561 | 979bf615 | Filippos Giannakos | pidfile = os.path.join(PIDFILE_PATH, name + PID_SUFFIX) |
562 | 979bf615 | Filippos Giannakos | pf = None
|
563 | 979bf615 | Filippos Giannakos | try:
|
564 | 979bf615 | Filippos Giannakos | pf = open(pidfile, "r") |
565 | 979bf615 | Filippos Giannakos | pid = int(pf.read())
|
566 | 979bf615 | Filippos Giannakos | pf.close() |
567 | 979bf615 | Filippos Giannakos | except:
|
568 | 979bf615 | Filippos Giannakos | if pf:
|
569 | 979bf615 | Filippos Giannakos | pf.close() |
570 | 1075ead7 | Filippos Giannakos | return -1 |
571 | 979bf615 | Filippos Giannakos | |
572 | 979bf615 | Filippos Giannakos | return pid
|
573 | 979bf615 | Filippos Giannakos | |
574 | 979bf615 | Filippos Giannakos | |
575 | 979bf615 | Filippos Giannakos | class Xseg_ctx(object): |
576 | 979bf615 | Filippos Giannakos | ctx = None
|
577 | 979bf615 | Filippos Giannakos | port = None
|
578 | 979bf615 | Filippos Giannakos | portno = None
|
579 | 979bf615 | Filippos Giannakos | |
580 | 979bf615 | Filippos Giannakos | def __init__(self, spec, portno): |
581 | 979bf615 | Filippos Giannakos | initialize_xseg() |
582 | 979bf615 | Filippos Giannakos | xconf = xseg_config() |
583 | b45a87cb | Filippos Giannakos | xseg_parse_spec(create_string_buffer(spec), xconf) |
584 | 1075ead7 | Filippos Giannakos | ctx = xseg_join(xconf.type, xconf.name, "posix",
|
585 | 1075ead7 | Filippos Giannakos | cast(0, cb_null_ptrtype))
|
586 | 979bf615 | Filippos Giannakos | if not ctx: |
587 | 979bf615 | Filippos Giannakos | raise Error("Cannot join segment") |
588 | 979bf615 | Filippos Giannakos | port = xseg_bind_port(ctx, portno, c_void_p(0))
|
589 | 979bf615 | Filippos Giannakos | if not port: |
590 | 979bf615 | Filippos Giannakos | raise Error("Cannot bind to port") |
591 | 979bf615 | Filippos Giannakos | xseg_init_local_signal(ctx, portno) |
592 | 979bf615 | Filippos Giannakos | self.ctx = ctx
|
593 | 979bf615 | Filippos Giannakos | self.port = port
|
594 | 979bf615 | Filippos Giannakos | self.portno = portno
|
595 | 979bf615 | Filippos Giannakos | |
596 | 979bf615 | Filippos Giannakos | def __del__(self): |
597 | 979bf615 | Filippos Giannakos | return
|
598 | 979bf615 | Filippos Giannakos | |
599 | 979bf615 | Filippos Giannakos | def __enter__(self): |
600 | 979bf615 | Filippos Giannakos | if not self.ctx: |
601 | 979bf615 | Filippos Giannakos | raise Error("No segment") |
602 | 979bf615 | Filippos Giannakos | return self |
603 | 979bf615 | Filippos Giannakos | |
604 | 979bf615 | Filippos Giannakos | def __exit__(self, type_, value, traceback): |
605 | 979bf615 | Filippos Giannakos | self.shutdown()
|
606 | 979bf615 | Filippos Giannakos | return False |
607 | 979bf615 | Filippos Giannakos | |
608 | 979bf615 | Filippos Giannakos | def shutdown(self): |
609 | 979bf615 | Filippos Giannakos | if self.ctx: |
610 | 979bf615 | Filippos Giannakos | xseg_quit_local_signal(self.ctx, self.portno) |
611 | 979bf615 | Filippos Giannakos | xseg_leave(self.ctx)
|
612 | 979bf615 | Filippos Giannakos | self.ctx = None |
613 | 979bf615 | Filippos Giannakos | |
614 | 1075ead7 | Filippos Giannakos | |
615 | 979bf615 | Filippos Giannakos | class Request(object): |
616 | 979bf615 | Filippos Giannakos | xseg_ctx = None
|
617 | 979bf615 | Filippos Giannakos | req = None
|
618 | 979bf615 | Filippos Giannakos | |
619 | 979bf615 | Filippos Giannakos | def __init__(self, xseg_ctx, dst_portno, targetlen, datalen): |
620 | 979bf615 | Filippos Giannakos | ctx = xseg_ctx.ctx |
621 | 979bf615 | Filippos Giannakos | if not ctx: |
622 | 979bf615 | Filippos Giannakos | raise Error("No context") |
623 | 979bf615 | Filippos Giannakos | req = xseg_get_request(ctx, xseg_ctx.portno, dst_portno, X_ALLOC) |
624 | 979bf615 | Filippos Giannakos | if not req: |
625 | 979bf615 | Filippos Giannakos | raise Error("Cannot get request") |
626 | 979bf615 | Filippos Giannakos | r = xseg_prep_request(ctx, req, targetlen, datalen) |
627 | 979bf615 | Filippos Giannakos | if r < 0: |
628 | 979bf615 | Filippos Giannakos | xseg_put_request(ctx, req, xseg_ctx.portno) |
629 | 979bf615 | Filippos Giannakos | raise Error("Cannot prepare request") |
630 | 979bf615 | Filippos Giannakos | # print hex(addressof(req.contents))
|
631 | 979bf615 | Filippos Giannakos | self.req = req
|
632 | 979bf615 | Filippos Giannakos | self.xseg_ctx = xseg_ctx
|
633 | 979bf615 | Filippos Giannakos | return
|
634 | 979bf615 | Filippos Giannakos | |
635 | 979bf615 | Filippos Giannakos | def __del__(self): |
636 | 979bf615 | Filippos Giannakos | if self.req: |
637 | 979bf615 | Filippos Giannakos | if xq_count(byref(self.req.contents.path)) == 0: |
638 | 1075ead7 | Filippos Giannakos | xseg_put_request(self.xseg_ctx.ctx, self.req, |
639 | 1075ead7 | Filippos Giannakos | self.xseg_ctx.portno)
|
640 | 979bf615 | Filippos Giannakos | self.req = None |
641 | 979bf615 | Filippos Giannakos | return False |
642 | 979bf615 | Filippos Giannakos | |
643 | 979bf615 | Filippos Giannakos | def __enter__(self): |
644 | 979bf615 | Filippos Giannakos | if not self.req: |
645 | 979bf615 | Filippos Giannakos | raise Error("xseg request not set") |
646 | 979bf615 | Filippos Giannakos | return self |
647 | 979bf615 | Filippos Giannakos | |
648 | 979bf615 | Filippos Giannakos | def __exit__(self, type_, value, traceback): |
649 | 979bf615 | Filippos Giannakos | if self.req: |
650 | 979bf615 | Filippos Giannakos | if xq_count(byref(self.req.contents.path)) == 0: |
651 | 1075ead7 | Filippos Giannakos | xseg_put_request(self.xseg_ctx.ctx, self.req, |
652 | 1075ead7 | Filippos Giannakos | self.xseg_ctx.portno)
|
653 | 979bf615 | Filippos Giannakos | self.req = None |
654 | 979bf615 | Filippos Giannakos | return False |
655 | 979bf615 | Filippos Giannakos | |
656 | 979bf615 | Filippos Giannakos | def set_op(self, op): |
657 | 979bf615 | Filippos Giannakos | self.req.contents.op = op
|
658 | 979bf615 | Filippos Giannakos | |
659 | 979bf615 | Filippos Giannakos | def get_op(self): |
660 | 979bf615 | Filippos Giannakos | return self.req.contents.op |
661 | 979bf615 | Filippos Giannakos | |
662 | 979bf615 | Filippos Giannakos | def set_offset(self, offset): |
663 | 979bf615 | Filippos Giannakos | self.req.contents.offset = offset
|
664 | 979bf615 | Filippos Giannakos | |
665 | 979bf615 | Filippos Giannakos | def get_offset(self): |
666 | 979bf615 | Filippos Giannakos | return self.req.contents.offset |
667 | 979bf615 | Filippos Giannakos | |
668 | 979bf615 | Filippos Giannakos | def get_size(self): |
669 | 979bf615 | Filippos Giannakos | return self.req.contents.size |
670 | 979bf615 | Filippos Giannakos | |
671 | 979bf615 | Filippos Giannakos | def set_size(self, size): |
672 | 979bf615 | Filippos Giannakos | self.req.contents.size = size
|
673 | 979bf615 | Filippos Giannakos | |
674 | 979bf615 | Filippos Giannakos | def set_flags(self, flags): |
675 | 979bf615 | Filippos Giannakos | self.req.contents.flags = flags
|
676 | 979bf615 | Filippos Giannakos | |
677 | 979bf615 | Filippos Giannakos | def get_flags(self): |
678 | 979bf615 | Filippos Giannakos | return self.req.contents.flags |
679 | 979bf615 | Filippos Giannakos | |
680 | 979bf615 | Filippos Giannakos | def set_target(self, target): |
681 | 979bf615 | Filippos Giannakos | """Sets the target of the request, respecting request's targetlen"""
|
682 | 979bf615 | Filippos Giannakos | if len(target) != self.req.contents.targetlen: |
683 | 979bf615 | Filippos Giannakos | return False |
684 | 979bf615 | Filippos Giannakos | c_target = xseg_get_target_nonstatic(self.xseg_ctx.ctx, self.req) |
685 | 979bf615 | Filippos Giannakos | p_target = create_string_buffer(target) |
686 | 979bf615 | Filippos Giannakos | # print hex(addressof(c_target.contents))
|
687 | 979bf615 | Filippos Giannakos | memmove(c_target, p_target, len(target))
|
688 | 979bf615 | Filippos Giannakos | return True |
689 | 979bf615 | Filippos Giannakos | |
690 | 979bf615 | Filippos Giannakos | def get_target(self): |
691 | 979bf615 | Filippos Giannakos | """Return a string to the target of the request"""
|
692 | 979bf615 | Filippos Giannakos | c_target = xseg_get_target_nonstatic(self.xseg_ctx.ctx, self.req) |
693 | 979bf615 | Filippos Giannakos | # print "target_addr " + str(addressof(c_target.contents))
|
694 | 979bf615 | Filippos Giannakos | return string_at(c_target, self.req.contents.targetlen) |
695 | 979bf615 | Filippos Giannakos | |
696 | 979bf615 | Filippos Giannakos | def set_data(self, data): |
697 | 1075ead7 | Filippos Giannakos | """Sets requests data. Data should be a xseg protocol structure"""
|
698 | 979bf615 | Filippos Giannakos | if sizeof(data) != self.req.contents.datalen: |
699 | 979bf615 | Filippos Giannakos | return False |
700 | 979bf615 | Filippos Giannakos | c_data = xseg_get_data_nonstatic(self.xseg_ctx.ctx, self.req) |
701 | 979bf615 | Filippos Giannakos | p_data = pointer(data) |
702 | 979bf615 | Filippos Giannakos | memmove(c_data, p_data, self.req.contents.datalen)
|
703 | 979bf615 | Filippos Giannakos | |
704 | 979bf615 | Filippos Giannakos | return True |
705 | 979bf615 | Filippos Giannakos | |
706 | 979bf615 | Filippos Giannakos | def get_data(self, _type): |
707 | 979bf615 | Filippos Giannakos | """return a pointer to the data buffer of the request, casted to the
|
708 | 979bf615 | Filippos Giannakos | selected type"""
|
709 | 1075ead7 | Filippos Giannakos | # print "data addr " + str(addressof(xseg_get_data_nonstatic(\
|
710 | 1075ead7 | Filippos Giannakos | # self.xseg_ctx.ctx, self.req).contents))
|
711 | 1075ead7 | Filippos Giannakos | # ret = cast(xseg_get_data_nonstatic(self.xseg_ctx.ctx, self.req),
|
712 | 1075ead7 | Filippos Giannakos | # _type)
|
713 | 979bf615 | Filippos Giannakos | # print addressof(ret.contents)
|
714 | 979bf615 | Filippos Giannakos | # return ret
|
715 | 979bf615 | Filippos Giannakos | if _type:
|
716 | 1075ead7 | Filippos Giannakos | return cast(xseg_get_data_nonstatic(self.xseg_ctx.ctx, self.req), |
717 | 1075ead7 | Filippos Giannakos | POINTER(_type)) |
718 | 979bf615 | Filippos Giannakos | else:
|
719 | 1075ead7 | Filippos Giannakos | return cast(xseg_get_data_nonstatic(self.xseg_ctx.ctx, self.req), |
720 | 1075ead7 | Filippos Giannakos | c_void_p) |
721 | 979bf615 | Filippos Giannakos | |
722 | 979bf615 | Filippos Giannakos | def submit(self): |
723 | 979bf615 | Filippos Giannakos | """Submit the associated xseg_request"""
|
724 | 1075ead7 | Filippos Giannakos | p = xseg_submit(self.xseg_ctx.ctx, self.req, self.xseg_ctx.portno, |
725 | 1075ead7 | Filippos Giannakos | X_ALLOC) |
726 | 979bf615 | Filippos Giannakos | if p == NoPort:
|
727 | 979bf615 | Filippos Giannakos | raise Exception |
728 | 979bf615 | Filippos Giannakos | xseg_signal(self.xseg_ctx.ctx, p)
|
729 | 979bf615 | Filippos Giannakos | |
730 | 979bf615 | Filippos Giannakos | def wait(self): |
731 | 979bf615 | Filippos Giannakos | """Wait until the associated xseg_request is responded, discarding any
|
732 | 979bf615 | Filippos Giannakos | other requests that may be received in the meantime"""
|
733 | 979bf615 | Filippos Giannakos | while True: |
734 | 979bf615 | Filippos Giannakos | received = xseg_receive(self.xseg_ctx.ctx, self.xseg_ctx.portno, 0) |
735 | 979bf615 | Filippos Giannakos | if received:
|
736 | 979bf615 | Filippos Giannakos | # print addressof(cast(self.req, c_void_p))
|
737 | 979bf615 | Filippos Giannakos | # print addressof(cast(received, c_void_p))
|
738 | 979bf615 | Filippos Giannakos | # print addressof(self.req.contents)
|
739 | 979bf615 | Filippos Giannakos | # print addressof(received.contents)
|
740 | 1075ead7 | Filippos Giannakos | if addressof(received.contents) == \
|
741 | 1075ead7 | Filippos Giannakos | addressof(self.req.contents):
|
742 | 1075ead7 | Filippos Giannakos | # if addressof(cast(received, c_void_p)) == \
|
743 | 1075ead7 | Filippos Giannakos | # addressof(cast(self.req, c_void_p)):
|
744 | 979bf615 | Filippos Giannakos | break
|
745 | 979bf615 | Filippos Giannakos | else:
|
746 | 1075ead7 | Filippos Giannakos | p = xseg_respond(self.xseg_ctx.ctx, received,
|
747 | 1075ead7 | Filippos Giannakos | self.xseg_ctx.portno, X_ALLOC)
|
748 | 979bf615 | Filippos Giannakos | if p == NoPort:
|
749 | 979bf615 | Filippos Giannakos | xseg_put_request(self.xseg_ctx.ctx, received,
|
750 | 1075ead7 | Filippos Giannakos | self.xseg_ctx.portno)
|
751 | 979bf615 | Filippos Giannakos | else:
|
752 | 979bf615 | Filippos Giannakos | xseg_signal(self.xseg_ctx.ctx, p)
|
753 | 979bf615 | Filippos Giannakos | else:
|
754 | 979bf615 | Filippos Giannakos | xseg_prepare_wait(self.xseg_ctx.ctx, self.xseg_ctx.portno) |
755 | 979bf615 | Filippos Giannakos | xseg_wait_signal(self.xseg_ctx.ctx, 10000000) |
756 | 979bf615 | Filippos Giannakos | xseg_cancel_wait(self.xseg_ctx.ctx, self.xseg_ctx.portno) |
757 | 979bf615 | Filippos Giannakos | return True |
758 | 979bf615 | Filippos Giannakos | |
759 | 979bf615 | Filippos Giannakos | def success(self): |
760 | 979bf615 | Filippos Giannakos | return bool((self.req.contents.state & XS_SERVED) and not |
761 | 1075ead7 | Filippos Giannakos | (self.req.contents.state & XS_FAILED)) |