b5cb319c9db1a2b8c72f283bf1fa124d300c87fc
[sfa.git] / sfa / rspecs / elements / versions / nitosv1Lease.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.nitosv1Sliver import NITOSv1Sliver
16 from sfa.rspecs.elements.versions.nitosv1PLTag import NITOSv1PLTag
17 from sfa.rspecs.elements.versions.pgv2Services import PGv2Services
18 from sfa.rspecs.elements.lease import Lease
19 from sfa.rspecs.elements.channel import Channel
20
21
22 class NITOSv1Lease:
23
24     @staticmethod
25     def add_leases(xml, leases, channels):
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']
32                               ).get_authority_urn().split(':')[0]
33             network_elem = xml.add_element('network', name=network_urn)
34         else:
35             network_elem = xml
36
37         # group the leases by slice and timeslots
38         grouped_leases = []
39
40         while leases:
41             slice_id = leases[0]['slice_id']
42             start_time = leases[0]['start_time']
43             duration = leases[0]['duration']
44             group = []
45
46             for lease in leases:
47                 if slice_id == lease['slice_id'] and start_time == lease['start_time'] and duration == lease['duration']:
48                     group.append(lease)
49
50             grouped_leases.append(group)
51
52             for lease1 in group:
53                 leases.remove(lease1)
54
55         lease_elems = []
56         for lease in grouped_leases:
57             #lease[0]['start_time'] = datetime_to_string(utcparse(lease[0]['start_time']))
58
59             lease_fields = ['slice_id', 'start_time', 'duration']
60             lease_elem = network_elem.add_instance(
61                 'lease', lease[0], lease_fields)
62             lease_elems.append(lease_elem)
63
64             # add nodes of this lease
65             for node in lease:
66                 lease_elem.add_instance('node', node, ['component_id'])
67
68             # add reserved channels of this lease
69             #channels = [{'channel_id': 1}, {'channel_id': 2}]
70             for channel in channels:
71                 #channel['start_time'] = datetime_to_string(utcparse(channel['start_time']))
72                 if channel['slice_id'] == lease[0]['slice_id'] and channel['start_time'] == lease[0]['start_time'] and channel['duration'] == lease[0]['duration']:
73                     lease_elem.add_instance(
74                         'channel', channel, ['component_id'])
75
76     @staticmethod
77     def get_leases(xml, filter=None):
78         if filter is None:
79             filter = {}
80         xpath = '//lease%s | //default:lease%s' % (
81             XpathFilter.xpath(filter), XpathFilter.xpath(filter))
82         lease_elems = xml.xpath(xpath)
83         return NITOSv1Lease.get_lease_objs(lease_elems)
84
85     @staticmethod
86     def get_lease_objs(lease_elems):
87         leases = []
88         channels = []
89         for lease_elem in lease_elems:
90             # get nodes
91             node_elems = lease_elem.xpath('./default:node | ./node')
92             for node_elem in node_elems:
93                 lease = Lease(lease_elem.attrib, lease_elem)
94                 lease['slice_id'] = lease_elem.attrib['slice_id']
95                 #lease['start_time'] = datetime_to_epoch(utcparse(lease_elem.attrib['start_time']))
96                 lease['start_time'] = lease_elem.attrib['start_time']
97                 lease['duration'] = lease_elem.attrib['duration']
98                 lease['component_id'] = node_elem.attrib['component_id']
99                 lease['type'] = 'node'
100                 leases.append(lease)
101             # get channels
102             channel_elems = lease_elem.xpath('./default:channel | ./channel')
103             for channel_elem in channel_elems:
104                 channel = Channel(channel_elem.attrib, channel_elem)
105                 channel['slice_id'] = lease_elem.attrib['slice_id']
106                 #channel['start_time'] = datetime_to_epoch(utcparse(lease_elem.attrib['start_time']))
107                 channel['start_time'] = lease_elem.attrib['start_time']
108                 channel['duration'] = lease_elem.attrib['duration']
109                 channel['component_id'] = channel_elem.attrib['component_id']
110                 channel['type'] = 'channel'
111                 channels.append(channel)
112
113         return leases + channels