Merge Master in geni-v3 conflict resolution
[sfa.git] / sfa / rspecs / elements / versions / pgv2Lease.py
1 from sfa.util.xrn import Xrn
2 from sfa.util.xml import XpathFilter
3
4 from sfa.rspecs.elements.node import Node
5 from sfa.rspecs.elements.sliver import Sliver
6 from sfa.rspecs.elements.location import Location
7 from sfa.rspecs.elements.hardware_type import HardwareType
8 from sfa.rspecs.elements.disk_image import DiskImage
9 from sfa.rspecs.elements.interface import Interface
10 from sfa.rspecs.elements.bwlimit import BWlimit
11 from sfa.rspecs.elements.pltag import PLTag
12 from sfa.rspecs.elements.versions.pgv2Services import PGv2Services     
13 from sfa.rspecs.elements.versions.pgv2SliverType import PGv2SliverType     
14 from sfa.rspecs.elements.versions.pgv2Interface import PGv2Interface     
15 from sfa.rspecs.elements.lease import Lease
16
17 from sfa.planetlab.plxrn import xrn_to_hostname
18
19 class PGv2Lease:
20     @staticmethod
21     def add_leases(xml, leases):
22         # group the leases by slice and timeslots
23         grouped_leases = []
24
25         while leases:
26              slice_id = leases[0]['slice_id']
27              start_time = leases[0]['start_time']
28              duration = leases[0]['duration']
29              group = []
30
31              for lease in leases:
32                   if slice_id == lease['slice_id'] and start_time == lease['start_time'] and duration == lease['duration']:
33                       group.append(lease)
34
35              grouped_leases.append(group)
36
37              for lease1 in group:
38                   leases.remove(lease1)
39
40         lease_elems = []
41         for lease in grouped_leases:
42             lease_fields = ['slice_id', 'start_time', 'duration']
43             lease_elem = xml.add_instance('lease', lease[0], lease_fields)
44             lease_elems.append(lease_elem)
45
46             # add nodes of this lease
47             for node in lease:
48                  lease_elem.add_instance('node', node, ['component_id'])
49
50
51     @staticmethod
52     def get_leases(xml, filter={}):
53         xpath = '//lease%s | //default:lease%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
54         lease_elems = xml.xpath(xpath)
55         return PGv2Lease.get_lease_objs(lease_elems)
56
57
58     @staticmethod
59     def get_lease_objs(lease_elems):
60         leases = []
61         for lease_elem in lease_elems:
62             #get nodes
63             node_elems = lease_elem.xpath('./default:node | ./node')
64             for node_elem in node_elems:
65                  lease = Lease(lease_elem.attrib, lease_elem)
66                  lease['slice_id'] = lease_elem.attrib['slice_id']
67                  lease['start_time'] = lease_elem.attrib['start_time']
68                  lease['duration'] = lease_elem.attrib['duration']
69                  lease['component_id'] = node_elem.attrib['component_id']
70                  leases.append(lease)
71
72         return leases