From 44cc4f0bdbe861908e794b63a7b68c927cafd91d Mon Sep 17 00:00:00 2001 From: Mohamed Larabi Date: Thu, 14 Mar 2013 14:24:26 +0100 Subject: [PATCH] add support of leases for both pgv2 and pgv3 rspecs --- sfa/rspecs/elements/versions/pgv2Lease.py | 72 +++++++++++++++++++++++ sfa/rspecs/elements/versions/pgv2Node.py | 11 ++++ sfa/rspecs/versions/pgv2.py | 16 +++-- 3 files changed, 95 insertions(+), 4 deletions(-) create mode 100644 sfa/rspecs/elements/versions/pgv2Lease.py diff --git a/sfa/rspecs/elements/versions/pgv2Lease.py b/sfa/rspecs/elements/versions/pgv2Lease.py new file mode 100644 index 00000000..8ba53cbc --- /dev/null +++ b/sfa/rspecs/elements/versions/pgv2Lease.py @@ -0,0 +1,72 @@ +from sfa.util.xrn import Xrn +from sfa.util.xml import XpathFilter + +from sfa.rspecs.elements.node import Node +from sfa.rspecs.elements.sliver import Sliver +from sfa.rspecs.elements.location import Location +from sfa.rspecs.elements.hardware_type import HardwareType +from sfa.rspecs.elements.disk_image import DiskImage +from sfa.rspecs.elements.interface import Interface +from sfa.rspecs.elements.bwlimit import BWlimit +from sfa.rspecs.elements.pltag import PLTag +from sfa.rspecs.elements.versions.pgv2Services import PGv2Services +from sfa.rspecs.elements.versions.pgv2SliverType import PGv2SliverType +from sfa.rspecs.elements.versions.pgv2Interface import PGv2Interface +from sfa.rspecs.elements.lease import Lease + +from sfa.planetlab.plxrn import xrn_to_hostname + +class PGv2Lease: + @staticmethod + def add_leases(xml, leases): + # group the leases by slice and timeslots + grouped_leases = [] + + while leases: + slice_id = leases[0]['slice_id'] + start_time = leases[0]['start_time'] + duration = leases[0]['duration'] + group = [] + + for lease in leases: + if slice_id == lease['slice_id'] and start_time == lease['start_time'] and duration == lease['duration']: + group.append(lease) + + grouped_leases.append(group) + + for lease1 in group: + leases.remove(lease1) + + lease_elems = [] + for lease in grouped_leases: + lease_fields = ['slice_id', 'start_time', 'duration'] + lease_elem = xml.add_instance('lease', lease[0], lease_fields) + lease_elems.append(lease_elem) + + # add nodes of this lease + for node in lease: + lease_elem.add_instance('node', node, ['component_id']) + + + @staticmethod + def get_leases(xml, filter={}): + xpath = '//lease%s | //default:lease%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter)) + lease_elems = xml.xpath(xpath) + return PGv2Lease.get_lease_objs(lease_elems) + + + @staticmethod + def get_lease_objs(lease_elems): + leases = [] + for lease_elem in lease_elems: + #get nodes + node_elems = lease_elem.xpath('./default:node | ./node') + for node_elem in node_elems: + lease = Lease(lease_elem.attrib, lease_elem) + lease['slice_id'] = lease_elem.attrib['slice_id'] + lease['start_time'] = lease_elem.attrib['start_time'] + lease['duration'] = lease_elem.attrib['duration'] + lease['component_id'] = node_elem.attrib['component_id'] + leases.append(lease) + + return leases diff --git a/sfa/rspecs/elements/versions/pgv2Node.py b/sfa/rspecs/elements/versions/pgv2Node.py index 51916898..4b424038 100644 --- a/sfa/rspecs/elements/versions/pgv2Node.py +++ b/sfa/rspecs/elements/versions/pgv2Node.py @@ -12,6 +12,7 @@ from sfa.rspecs.elements.pltag import PLTag from sfa.rspecs.elements.versions.pgv2Services import PGv2Services from sfa.rspecs.elements.versions.pgv2SliverType import PGv2SliverType from sfa.rspecs.elements.versions.pgv2Interface import PGv2Interface +from sfa.rspecs.elements.granularity import Granularity from sfa.planetlab.plxrn import xrn_to_hostname @@ -34,6 +35,11 @@ class PGv2Node: # set location if node.get('location'): node_elem.add_instance('location', node['location'], Location.fields) + + # set granularity + if node['exclusive'] == "true": + granularity = node.get('granularity') + node_elem.add_instance('granularity', granularity, granularity.fields) # set interfaces PGv2Interface.add_interfaces(node_elem, node.get('interfaces')) #if node.get('interfaces'): @@ -91,6 +97,11 @@ class PGv2Node: if len(locations) > 0: node['location'] = locations[0] + # get granularity + granularity_elems = node_elem.xpath('./default:granularity | ./granularity') + if len(granularity_elems) > 0: + node['granularity'] = granularity_elems[0].get_instance(Granularity) + # get interfaces iface_elems = node_elem.xpath('./default:interface | ./interface') node['interfaces'] = [iface_elem.get_instance(Interface) for iface_elem in iface_elems] diff --git a/sfa/rspecs/versions/pgv2.py b/sfa/rspecs/versions/pgv2.py index f8759d8e..fbd8a394 100644 --- a/sfa/rspecs/versions/pgv2.py +++ b/sfa/rspecs/versions/pgv2.py @@ -5,6 +5,7 @@ from sfa.rspecs.version import RSpecVersion from sfa.rspecs.elements.versions.pgv2Link import PGv2Link from sfa.rspecs.elements.versions.pgv2Node import PGv2Node from sfa.rspecs.elements.versions.pgv2SliverType import PGv2SliverType +from sfa.rspecs.elements.versions.pgv2Lease import PGv2Lease class PGv2(RSpecVersion): type = 'ProtoGENI' @@ -176,10 +177,10 @@ class PGv2(RSpecVersion): # Leases def get_leases(self, filter=None): - pass + return PGv2Lease.get_leases(self.xml, filter) def add_leases(self, leases, network = None, no_dupes=False): - pass + PGv2Lease.add_leases(self.xml, leases) # Utility @@ -194,13 +195,20 @@ class PGv2(RSpecVersion): nodes = in_rspec.version.get_nodes() # protogeni rspecs need to advertise the availabel sliver types + main_nodes = [] for node in nodes: + if not node['component_name']: + # this node element is part of a lease + continue if not node.has_key('sliver') or not node['sliver']: node['sliver'] = {'name': 'plab-vserver'} - - self.add_nodes(nodes) + main_nodes.append(node) + self.add_nodes(main_nodes) self.add_links(in_rspec.version.get_links()) + # Leases + leases = in_rspec.version.get_leases() + self.add_leases(leases) # #rspec = RSpec(in_rspec) #for child in rspec.xml.iterchildren(): -- 2.43.0