00c0499fd59aba388dd758a34306eddf98e1ddce
[sfa.git] / sfa / rspecs / elements / versions / sfav1Lease.py
1 from sfa.util.sfalogging import logger
2 from sfa.util.xml import XpathFilter
3 from sfa.util.xrn import Xrn
4 from sfa.util.sfatime import utcparse, datetime_to_string, datetime_to_epoch
5
6 from sfa.rspecs.elements.element import Element
7 from sfa.rspecs.elements.node import NodeElement
8 from sfa.rspecs.elements.sliver import Sliver
9 from sfa.rspecs.elements.location import Location
10 from sfa.rspecs.elements.hardware_type import HardwareType
11 from sfa.rspecs.elements.disk_image import DiskImage
12 from sfa.rspecs.elements.interface import Interface
13 from sfa.rspecs.elements.bwlimit import BWlimit
14 from sfa.rspecs.elements.pltag import PLTag
15 from sfa.rspecs.elements.versions.sfav1Sliver import SFAv1Sliver
16 from sfa.rspecs.elements.versions.sfav1PLTag import SFAv1PLTag
17 from sfa.rspecs.elements.versions.pgv2Services import PGv2Services
18 from sfa.rspecs.elements.lease import Lease
19
20 from sfa.planetlab.plxrn import xrn_to_hostname
21
22 class SFAv1Lease:
23
24     @staticmethod
25     def add_leases(xml, leases):
26         
27         network_elems = xml.xpath('//network')
28         if len(network_elems) > 0:
29             network_elem = network_elems[0]
30         elif len(leases) > 0:
31             network_urn = Xrn(leases[0]['component_id']).get_authority_urn().split(':')[0]
32             network_elem = xml.add_element('network', name = network_urn)
33         else:
34             network_elem = xml
35          
36         # group the leases by slice and timeslots
37         grouped_leases = []
38
39         while leases:
40              slice_id = leases[0]['slice_id']
41              start_time = leases[0]['start_time']
42              duration = leases[0]['duration']
43              group = []
44
45              for lease in leases:
46                   if slice_id == lease['slice_id'] and start_time == lease['start_time'] and duration == lease['duration']:
47                       group.append(lease)
48
49              grouped_leases.append(group)
50
51              for lease1 in group:
52                   leases.remove(lease1)
53
54         lease_elems = []
55         for lease in grouped_leases:
56             lease[0]['start_time'] = datetime_to_string(utcparse(lease[0]['start_time']))
57
58             lease_fields = ['slice_id', 'start_time', 'duration']
59             lease_elem = network_elem.add_instance('lease', lease[0], lease_fields)
60             lease_elems.append(lease_elem)
61
62             # add nodes of this lease
63             for node in lease:
64                  lease_elem.add_instance('node', node, ['component_id'])
65
66
67
68 #        lease_elems = []       
69 #        for lease in leases:
70 #            lease_fields = ['lease_id', 'component_id', 'slice_id', 'start_time', 'duration']
71 #            lease_elem = network_elem.add_instance('lease', lease, lease_fields)
72 #            lease_elems.append(lease_elem)
73
74
75     @staticmethod
76     def get_leases(xml, filter={}):
77         xpath = '//lease%s | //default:lease%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
78         lease_elems = xml.xpath(xpath)
79         return SFAv1Lease.get_lease_objs(lease_elems)
80
81     @staticmethod
82     def get_lease_objs(lease_elems):
83         leases = []
84         for lease_elem in lease_elems:
85             #get nodes
86             node_elems = lease_elem.xpath('./default:node | ./node')
87             for node_elem in node_elems:
88                  lease = Lease(lease_elem.attrib, lease_elem)
89                  lease['slice_id'] = lease_elem.attrib['slice_id']
90                  lease['start_time'] = datetime_to_epoch(utcparse(lease_elem.attrib['start_time']))
91                  lease['duration'] = lease_elem.attrib['duration']
92                  lease['component_id'] = node_elem.attrib['component_id']
93                  leases.append(lease)
94
95         return leases
96
97
98
99
100
101 #        leases = []    
102 #        for lease_elem in lease_elems:
103 #            lease = Lease(lease_elem.attrib, lease_elem)
104 #            if lease.get('lease_id'):
105 #               lease['lease_id'] = lease_elem.attrib['lease_id']
106 #            lease['component_id'] = lease_elem.attrib['component_id']
107 #            lease['slice_id'] = lease_elem.attrib['slice_id']
108 #            lease['start_time'] = lease_elem.attrib['start_time']
109 #            lease['duration'] = lease_elem.attrib['duration']
110
111 #            leases.append(lease)
112 #        return leases            
113