1 from sfa.util.sfalogging import logger
2 from sfa.util.xml import XpathFilter
3 from sfa.util.xrn import Xrn
5 from sfa.rspecs.elements.element import Element
6 from sfa.rspecs.elements.node import Node
7 from sfa.rspecs.elements.sliver import Sliver
8 from sfa.rspecs.elements.location import Location
9 from sfa.rspecs.elements.hardware_type import HardwareType
10 from sfa.rspecs.elements.disk_image import DiskImage
11 from sfa.rspecs.elements.interface import Interface
12 from sfa.rspecs.elements.bwlimit import BWlimit
13 from sfa.rspecs.elements.pltag import PLTag
14 from sfa.rspecs.elements.versions.nitosv1Sliver import NITOSv1Sliver
15 from sfa.rspecs.elements.versions.nitosv1PLTag import NITOSv1PLTag
16 from sfa.rspecs.elements.versions.pgv2Services import PGv2Services
17 from sfa.rspecs.elements.lease import Lease
18 from sfa.rspecs.elements.channel import Channel
21 from sfa.nitos.nitosxrn import xrn_to_hostname
26 def add_leases(xml, leases, channels):
28 network_elems = xml.xpath('//network')
29 if len(network_elems) > 0:
30 network_elem = network_elems[0]
32 network_urn = Xrn(leases[0]['component_id']).get_authority_urn().split(':')[0]
33 network_elem = xml.add_element('network', name = network_urn)
37 # group the leases by slice and timeslots
41 slice_id = leases[0]['slice_id']
42 start_time = leases[0]['start_time']
43 duration = leases[0]['duration']
47 if slice_id == lease['slice_id'] and start_time == lease['start_time'] and duration == lease['duration']:
50 grouped_leases.append(group)
56 for lease in grouped_leases:
57 #lease_fields = ['lease_id', 'component_id', 'slice_id', 'start_time', 'duration']
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)
62 # add nodes of this lease
64 lease_elem.add_instance('node', node, ['component_id'])
66 # add reserved channels of this lease
67 #channels = [{'channel_id': 1}, {'channel_id': 2}]
68 for channel in channels:
69 if channel['slice_id'] == lease[0]['slice_id'] and channel['start_time'] == lease[0]['start_time'] and channel['duration'] == lease[0]['duration']:
70 lease_elem.add_instance('channel', channel, ['channel_num'])
74 def get_leases(xml, filter={}):
75 xpath = '//lease%s | //default:lease%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
76 lease_elems = xml.xpath(xpath)
77 return NITOSv1Lease.get_lease_objs(lease_elems)
80 def get_lease_objs(lease_elems):
83 for lease_elem in lease_elems:
85 node_elems = lease_elem.xpath('./default:node | ./node')
86 for node_elem in node_elems:
87 lease = Lease(lease_elem.attrib, lease_elem)
88 lease['slice_id'] = lease_elem.attrib['slice_id']
89 lease['start_time'] = lease_elem.attrib['start_time']
90 lease['duration'] = lease_elem.attrib['duration']
91 lease['component_id'] = node_elem.attrib['component_id']
94 channel_elems = lease_elem.xpath('./default:channel | ./channel')
95 for channel_elem in channel_elems:
96 channel = Channel(channel_elem.attrib, channel_elem)
97 channel['slice_id'] = lease_elem.attrib['slice_id']
98 channel['start_time'] = lease_elem.attrib['start_time']
99 channel['duration'] = lease_elem.attrib['duration']
100 channel['channel_num'] = channel_elem.attrib['channel_num']
101 channels.append(channel)
103 return (leases, channels)