1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 from haizea.common.utils import vnodemapstr
20 import haizea.common.constants as constants
21 import haizea.core.enact.actions as actions
22 from haizea.core.scheduler import EnactmentError
23 import logging
27 - def __init__(self, info_enact, vm_enact, deploy_enact):
28 self.logger = logging.getLogger("RPOOL")
29
30 self.info = info_enact
31 self.vm = vm_enact
32
33
34
35 self.deployment = deploy_enact
36
37 self.nodes = self.info.get_nodes()
38
40 start_action = actions.VMEnactmentStartAction()
41 start_action.from_rr(rr)
42
43 for (vnode, pnode) in rr.nodes.items():
44 node = self.get_node(pnode)
45
46 start_action.vnodes[vnode].pnode = node.enactment_info
47
48 start_action.vnodes[vnode].resources = rr.resources_in_pnode[pnode]
49
50 try:
51 self.vm.start(start_action)
52 except EnactmentError, exc:
53 self.logger.error("Enactment of start VM failed: %s" % exc.message)
54 raise
55
64
79
84
99
104
106 new_nodes = self.info.refresh()
107 for node in new_nodes:
108 self.nodes[node.id] = node
109 return new_nodes
110
112 return self.nodes.values()
113
114
115
121
123 return len(self.nodes)
124
126 return self.nodes[node_id]
127
128 - def add_diskimage(self, pnode, diskimage_id, imagesize, lease_id, vnode):
129 self.logger.debug("Adding disk image for L%iV%i in pnode=%i" % (lease_id, vnode, pnode))
130
131 self.logger.vdebug("Files BEFORE:")
132 self.get_node(pnode).print_files()
133
134 imagefile = self.deployment.resolve_to_file(lease_id, vnode, diskimage_id)
135 img = DiskImageFile(imagefile, imagesize, lease_id, vnode, diskimage_id)
136 self.get_node(pnode).add_file(img)
137
138 self.logger.vdebug("Files AFTER:")
139 self.get_node(pnode).print_files()
140
141 return img
142
151
153 node = self.get_node(pnode)
154 self.logger.debug("Adding RAM file for L%iV%i in node %i" % (lease_id, vnode, pnode))
155 node.print_files()
156 f = RAMImageFile("RAM_L%iV%i" % (lease_id, vnode), size, lease_id, vnode)
157 node.add_file(f)
158 node.print_files()
159
166
169
171 - def __init__(self, node_id, hostname, capacity):
172 self.logger = logging.getLogger("RESOURCEPOOL")
173 self.id = node_id
174 self.hostname = hostname
175 self.capacity = capacity
176 self.files = []
177
178
179 self.enactment_info = None
180
183
186
188 image = [f for f in self.files if isinstance(f, DiskImageFile) and
189 f.diskimage_id == diskimage_id and
190 f.lease_id == lease_id and
191 f.vnode == vnode]
192 if len(image) == 0:
193 return None
194 elif len(image) == 1:
195 return image[0]
196 elif len(image) > 1:
197 self.logger.warning("More than one tainted image for L%iV%i on node %i" % (lease_id, vnode, self.id))
198 return image[0]
199
201 image = [f for f in self.files if isinstance(f, DiskImageFile) and
202 f.lease_id == lease_id and
203 f.vnode == vnode]
204 if len(image) > 0:
205 image = image[0]
206 self.files.remove(image)
207
209 ramfile = [f for f in self.files if isinstance(f, RAMImageFile) and f.lease_id==lease_id and f.vnode==vnode]
210 if len(ramfile) > 0:
211 ramfile = ramfile[0]
212 self.files.remove(ramfile)
213
214
216 return sum([f.filesize for f in self.files])
217
218
220 return [f for f in self.files if isinstance(f, DiskImageFile)]
221
223 images = ""
224 if len(self.files) > 0:
225 images = ", ".join([str(img) for img in self.files])
226 self.logger.vdebug("Node %i files: %iMB %s" % (self.id, self.get_disk_usage(), images))
227
237
238
239
240 -class File(object):
241 - def __init__(self, filename, filesize):
242 self.filename = filename
243 self.filesize = filesize
244
246 - def __init__(self, filename, filesize, lease_id, vnode, diskimage_id):
247 File.__init__(self, filename, filesize)
248 self.lease_id = lease_id
249 self.vnode = vnode
250 self.diskimage_id = diskimage_id
251
253 return "(DISK L%iv%i %s %s)" % (self.lease_id, self.vnode, self.diskimage_id, self.filename)
254
257 - def __init__(self, filename, filesize, lease_id, vnode):
258 File.__init__(self, filename, filesize)
259 self.lease_id = lease_id
260 self.vnode = vnode
261
263 return "(RAM L%iv%i %s)" % (self.lease_id, self.vnode, self.filename)
264
266 - def __init__(self, info_enact, vm_enact, deploy_enact):
270
288
291
299
300
301
302
303
306
309
312 - def __init__(self, node_id, hostname, capacity):
315
316 @classmethod
318 node = cls(n.id, n.hostname, n.capacity)
319 node.enactment_info = n.enactment_info
320 return node
321
323 self.reusable_images.append(f)
324
332
334 images = [i for i in self.reusable_images if i.diskimage_id == diskimage_id]
335 if after != None:
336 images = [i for i in images if i.timeout >= after]
337 if lease_id != None and vnode != None:
338 images = [i for i in images if i.has_mapping(lease_id, vnode)]
339 if len(images)>0:
340 return images[0]
341 else:
342 return None
343
345 entry = self.get_reusable_image(imagefile, after = after, lease_id=lease_id, vnode=vnode)
346 if entry == None:
347 return False
348 else:
349 return True
350
352 return self.reusable_images
353
355 return sum([f.filesize for f in self.reusable_images])
356
358 unused = [img for img in self.reusable_images if not img.has_mappings()]
359 if len(unused) == 0:
360 return 0
361 else:
362 i = iter(unused)
363 oldest = i.next()
364 for img in i:
365 if img.timeout < oldest.timeout:
366 oldest = img
367 self.reusable_images.remove(oldest)
368 return 1
369
371 done = False
372 while not done:
373 removed = self.purge_oldest_unused_image()
374 if removed==0:
375 done = True
376 success = False
377 elif removed == 1:
378 if self.get_reusable_images_size() <= target:
379 done = True
380 success = True
381 return success
382
389
391 - def __init__(self, filename, filesize, diskimage_id, timeout):
392 File.__init__(self, filename, filesize)
393 self.diskimage_id = diskimage_id
394 self.mappings = set([])
395 self.timeout = timeout
396
398 self.mappings.add((lease_id, vnode))
399
401 return (lease_id, vnode) in self.mappings
402
404 return len(self.mappings) > 0
405
407 if timeout > self.timeout:
408 self.timeout = timeout
409
411 if self.timeout == None:
412 return False
413 elif self.timeout > curTime:
414 return True
415 else:
416 return False
417
419 if self.timeout == None:
420 timeout = "NOTIMEOUT"
421 else:
422 timeout = self.timeout
423 return "(REUSABLE %s %s %s %s)" % (vnodemapstr(self.mappings), self.diskimage_id, str(timeout), self.filename)
424