From: Tony Mack Date: Tue, 25 Oct 2011 23:48:46 +0000 (-0400) Subject: Merge branch 'master' of ssh://git.planet-lab.org/git/sfa X-Git-Tag: sfa-1.1-1~33^2~1 X-Git-Url: http://git.onelab.eu/?p=sfa.git;a=commitdiff_plain;h=8a2dd68e76ddc9a5e35c5fe5a8c9d2b0c13d9d8a;hp=d7783df8ee22afb550dcd6916c8ac47a67bd9fe8 Merge branch 'master' of ssh://git.planet-lab.org/git/sfa --- diff --git a/sfa/rspecs/elements/interface.py b/sfa/rspecs/elements/interface.py index d2022d89..2aadf4db 100644 --- a/sfa/rspecs/elements/interface.py +++ b/sfa/rspecs/elements/interface.py @@ -1,10 +1,12 @@ class Interface(dict): + element = None fields = {'component_id': None, 'role': None, 'client_id': None, - 'ipv4': None + 'ipv4': None, } - def __init__(self, fields={}): + def __init__(self, fields={}, element=None): + self.element = element dict.__init__(self, Interface.fields) self.update(fields) diff --git a/sfa/rspecs/elements/link.py b/sfa/rspecs/elements/link.py index f3a857b3..d916d22f 100644 --- a/sfa/rspecs/elements/link.py +++ b/sfa/rspecs/elements/link.py @@ -1,7 +1,7 @@ from sfa.rspecs.elements.interface import Interface class Link(dict): - + element = None fields = { 'client_id': None, 'component_id': None, @@ -14,10 +14,10 @@ class Link(dict): 'latency': None, 'packet_loss': None, 'description': None, - '_element': None } - def __init__(self, fields={}): + def __init__(self, fields={}, element=None): + self.element = element dict.__init__(self, Link.fields) self.update(fields) diff --git a/sfa/rspecs/elements/versions/pgv2Link.py b/sfa/rspecs/elements/versions/pgv2Link.py index c1efccee..727afaf7 100644 --- a/sfa/rspecs/elements/versions/pgv2Link.py +++ b/sfa/rspecs/elements/versions/pgv2Link.py @@ -1,4 +1,6 @@ from lxml import etree +from sfa.util.plxrn import PlXrn +from sfa.util.xrn import Xrn from sfa.rspecs.elements.link import Link from sfa.rspecs.elements.interface import Interface from sfa.rspecs.rspec_elements import RSpecElement, RSpecElements @@ -43,8 +45,7 @@ class PGv2Link: link_elems = xml.xpath(PGv2Link.elements['link'].path, namespaces=xml.namespaces) for link_elem in link_elems: # set client_id, component_id, component_name - link = Link(link_elem.attrib) - link['_element'] = link_elem + link = Link(link_elem.attrib, link_elem) # set component manager cm = link_elem.xpath('./default:component_manager', namespaces=xml.namespaces) if len(cm) > 0: @@ -70,7 +71,7 @@ class PGv2Link: if_elems = link_elem.xpath(PGv2Link.elements['interface_ref'].path, namespaces=xml.namespaces) ifs = [] for if_elem in if_elems: - if_ref = Interface(if_elem.attrib) + if_ref = Interface(if_elem.attrib, if_elem) ifs.append(if_ref) if len(ifs) > 1: link['interface1'] = ifs[0] @@ -78,7 +79,44 @@ class PGv2Link: links.append(link) return links + @staticmethod + def add_link_requests(xml, link_tuples, append=False): + if not isinstance(link_tuples, set): + link_tuples = set(link_tuples) + + available_links = PGv2Link.get_links(xml) + recently_added = [] + for link in available_links: + auth = Xrn(link['component_id']).get_authority_hrn() + if_name1 = Xrn(link['interface1']['component_id']).get_leaf() + if_name2 = Xrn(link['interface2']['component_id']).get_leaf() + + requested_link = None + l_tup_1 = (if_name1, if_name2) + l_tup_2 = (if_name2, if_name1) + if link_tuples.issuperset([(if_name1, if_name2)]): + requested_link = (if_name1, if_name2) + elif link_tuples.issuperset([(if_name2, if_name2)]): + requested_link = (if_name2, if_name1) + + if requested_link: + # add client id to link ane interface elements + link.element.set('client_id', link['component_name']) + link['interface1'].element.set('client_id', Xrn(link['interface1']['component_id']).get_leaf()) + link['interface2'].element.set('client_id', Xrn(link['interface2']['component_id']).get_leaf()) + recently_added.append(link['component_name']) - def add_link_requests(xml, links_tuple): - available_links = PGv2Link.get_links(xml) - + if not append: + # remove all links that don't have a client id + for link in PGv2Link.get_links(xml): + if not link['client_id'] or link['component_name'] not in recently_added: + parent = link.element.getparent() + parent.remove(link.element) + + @staticmethod + def get_link_requests(xml): + link_requests = [] + for link in PGv2Link.get_links(xml): + if link['client_id']: + link_requests.append(link) + return link_requests diff --git a/sfa/rspecs/versions/pgv2.py b/sfa/rspecs/versions/pgv2.py index a332286d..889cfec1 100644 --- a/sfa/rspecs/versions/pgv2.py +++ b/sfa/rspecs/versions/pgv2.py @@ -93,12 +93,17 @@ class PGv2(BaseVersion): return slice_attributes def get_links(self, network=None): - links = PGv2Link.get_links(self.xml) - return links + return PGv2Link.get_links(self.xml) + + def get_link_requests(self): + return PGv2Link.get_link_requests(self.xml) def add_links(self, links): PGv2Link.add_links(self.xml, links) + def add_link_requests(self, link_tuples, append=False): + PGv2Link.add_link_requests(self.xml, link_tuples, append) + def attributes_list(self, elem): opts = [] if elem is not None: diff --git a/sfa/util/xrn.py b/sfa/util/xrn.py index 3dc87b63..869184e7 100644 --- a/sfa/util/xrn.py +++ b/sfa/util/xrn.py @@ -173,13 +173,17 @@ class Xrn: # or completely change how record types are generated/stored if name != 'sa': type = type + "+" + name - + name ="" + else: + name = parts.pop(len(parts)-1) # convert parts (list) into hrn (str) by doing the following # 1. remove blank parts # 2. escape dots inside parts # 3. replace ':' with '.' inside parts - # 3. join parts using '.' - hrn = '.'.join([Xrn.escape(part).replace(':','.') for part in parts if part]) + # 3. join parts using '.' + hrn = '.'.join([Xrn.escape(part).replace(':','.') for part in parts if part]) + if name: + hrn += '.%s' % name self.hrn=str(hrn) self.type=str(type)