From: Tony Mack Date: Thu, 10 Nov 2011 19:07:03 +0000 (-0500) Subject: refactored X-Git-Tag: sfa-1.1-3~68 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=aa9110bdf4a9356a7abd86805fcabe961a51c471;p=sfa.git refactored --- diff --git a/sfa/rspecs/elements/versions/pgv2SliverType.py b/sfa/rspecs/elements/versions/pgv2SliverType.py index e69de29b..0ea039d6 100644 --- a/sfa/rspecs/elements/versions/pgv2SliverType.py +++ b/sfa/rspecs/elements/versions/pgv2SliverType.py @@ -0,0 +1,20 @@ +from sfa.rspecs.elements.element import Element +from sfa.rspecs.elements.sliver import Sliver + +class PGv2SliverType: + + @staticmethod + def add_sliver(xml, sliver): + sliver_elem = Element.add(xml, 'sliver_type', sliver, ['name']) + + @staticmethod + def get_slivers(xml, filter={}): + xpath = './default:sliver_type | ./sliver_type' + sliver_elems = xml.xpath(xpath) + slivers = [] + for sliver_elem in sliver_elems: + sliver = Sliver(sliver_elem.attrib,sliver_elm) + if 'component_id' in xml.attrib: + sliver['component_id'] = xml.attrib['component_id'] + slivers.append(sliver) + return slivers diff --git a/sfa/rspecs/elements/versions/sfav1Node.py b/sfa/rspecs/elements/versions/sfav1Node.py index 0b67c91d..7e4b5f56 100644 --- a/sfa/rspecs/elements/versions/sfav1Node.py +++ b/sfa/rspecs/elements/versions/sfav1Node.py @@ -1,7 +1,8 @@ -from lxml import etree +from sfa.util.xml import XpathFilter from sfa.util.plxrn import PlXrn from sfa.util.xrn import Xrn +from sfa.rspecs.elements.element import Element from sfa.rspecs.elements.node import Node from sfa.rspecs.elements.sliver import Sliver from sfa.rspecs.elements.network import Network @@ -13,18 +14,12 @@ from sfa.rspecs.elements.bwlimit import BWlimit from sfa.rspecs.elements.pltag import PLTag from sfa.rspecs.rspec_elements import RSpecElement, RSpecElements from sfa.rspecs.elements.versions.sfav1Network import SFAv1Network +from sfa.rspecs.elements.versions.sfav1Sliver import SFAv1Sliver +from sfa.rspecs.elements.versions.sfav1PLTag import SFAv1PLTag from sfa.rspecs.elements.versions.pgv2Services import PGv2Services class SFAv1Node: - elements = { - 'node': RSpecElement(RSpecElements.NODE, '//default:node | //node'), - 'sliver': RSpecElement(RSpecElements.SLIVER, './default:sliver | ./sliver'), - 'interface': RSpecElement(RSpecElements.INTERFACE, './default:interface | ./interface'), - 'location': RSpecElement(RSpecElements.LOCATION, './default:location | ./location'), - 'bw_limit': RSpecElement(RSpecElements.BWLIMIT, './default:bw_limit | ./bw_limit'), - } - @staticmethod def add_nodes(xml, nodes): network_elems = SFAv1Network.get_networks(xml) @@ -32,111 +27,101 @@ class SFAv1Node: network_elem = network_elems[0] elif len(nodes) > 0 and nodes[0].get('component_manager_id'): network_elem = SFAv1Network.add_network(xml.root, {'name': nodes[0]['component_manager_id']}) - node_elems = [] for node in nodes: - node_elem = etree.SubElement(network_elem, 'node') + node_fields = ['component_manager_id', 'component_id', 'boot_state'] + elems = Element.add(network_elem, 'node', node, node_fields) + node_elem = elems[0] node_elems.append(node_elem) - network = None + + # determine network hrn + network_hrn = None if 'component_manager_id' in node and node['component_manager_id']: - node_elem.set('component_manager_id', node['component_manager_id']) - network = Xrn(node['component_manager_id']).get_hrn() + network_hrn = Xrn(node['component_manager_id']).get_hrn() + + # set component_name attribute and hostname element if 'component_id' in node and node['component_id']: - node_elem.set('component_id', node['component_id']) xrn = Xrn(node['component_id']) node_elem.set('component_name', xrn.get_leaf()) - hostname_tag = etree.SubElement(node_elem, 'hostname').text = xrn.get_leaf() + hostname_tag = node_elem.add_element('hostname') + hostname_tag.set_text(xrn.get_leaf()) + + # set site id if 'authority_id' in node and node['authority_id']: node_elem.set('site_id', node['authority_id']) - if 'boot_state' in node and node['boot_state']: - node_elem.set('boot_state', node['boot_state']) - if 'location' in node and node['location']: - location_elem = etree.SubElement(node_elem, 'location') - for field in Location.fields: - if field in node['location'] and node['location'][field]: - location_elem.set(field, node['location'][field]) - if 'interfaces' in node and node['interfaces']: - i = 0 - for interface in node['interfaces']: - if 'bwlimit' in interface and interface['bwlimit']: - bwlimit = etree.SubElement(node_elem, 'bw_limit', units='kbps').text = str(interface['bwlimit']/1000) - comp_id = PlXrn(auth=network, interface='node%s:eth%s' % (interface['node_id'], i)).get_urn() - ipaddr = interface['ipv4'] - interface_elem = etree.SubElement(node_elem, 'interface', component_id=comp_id, ipv4=ipaddr) - i+=1 - if 'bw_unallocated' in node and node['bw_unallocated']: - bw_unallocated = etree.SubElement(node_elem, 'bw_unallocated', units='kbps').text = str(int(node['bw_unallocated'])/1000) - - if node.get('services'): - PGv2Services.add_services(node_elem, node.get('services')) - if 'tags' in node: - for tag in node['tags']: - # expose this hard wired list of tags, plus the ones that are marked 'sfa' in their category - if tag['name'] in ['fcdistro', 'arch']: - tag_element = etree.SubElement(node_elem, tag['name']).text=tag['value'] + location_elems = Element.add(node_elem, 'location', node.get('location', []), Location.fields) + interface_elems = Element.add(node_elem, 'interface', node.get('interfaces', []), Interface.fields) + # need to generate the device id in the component_id + i=0 + for interface_elem in interface_elems: + comp_id = PlXrn(auth=network, interface='node%s:eth%s' % (interface['node_id'], i)).get_urn() + interface_elem.set('component_id', comp_id) + i++ + + #if 'bw_unallocated' in node and node['bw_unallocated']: + # bw_unallocated = etree.SubElement(node_elem, 'bw_unallocated', units='kbps').text = str(int(node['bw_unallocated'])/1000) - if node.get('slivers'): - for sliver in node['slivers']: - sliver_elem = etree.SubElement(node_elem, 'sliver') - if sliver.get('sliver_id'): - sliver_id_leaf = Xrn(sliver.get('sliver_id')).get_leaf() - sliver_id_parts = sliver_id_leaf.split(':') - name = sliver_id_parts[0] - sliver_elem.set('name', name) + PGv2Services.add_services(node_elem, node.get('services', [])) + SFAv1PLTags.add_tags(node_elem, node.get('tags', [])) + SFAv1Sliver.add_slivers(node_elem, node.get('slivers', [])) @staticmethod def add_slivers(xml, slivers): - pass + component_ids = [] + for sliver in slivers: + filter = {} + if isinstance(sliver, str): + filter['component_id'] = '*%s*' % sliver + sliver = {} + elif 'component_id' in sliver and sliver['component_id']: + filter['component_id'] = '*%s*' % sliver['component_id'] + nodes = SFAv1Node.get_nodes(xml, filter) + if not nodes: + continue + node = nodes[0] + SFAv1Sliver.add_slivers(node, sliver) + + @staticmethod + def remove_slivers(xml, hostnames): + for hostname in hostnames: + nodes = SFAv1Node.get_nodes(xml, {'component_id': '*%s*' % hostname}) + for node in nodes: + slivers = SFAv1Slivers.get_slivers(node.element) + for sliver in slivers: + node.element.remove(sliver.element) + + @staticmethod + def get_nodes(xml, filter={}): + xpath = '//node%s | //default:node%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter)) + node_elems = xml.xpath(xpath) + return SFAv1Node.get_node_objs(node_elems) + + @staticmethod + def get_nodes_with_slivers(xml): + xpath = '//node/sliver | //default:node/default:sliver' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter)) + node_elems = xml.xpath(xpath) + return SFAv1Node.get_nodes_objs(node_elems) + @staticmethod - def get_nodes(xml): - nodes = [] - node_elems = xml.xpath(SFAv1Node.elements['node'].path) + def get_node_objs(node_elems): + nodes = [] for node_elem in node_elems: node = Node(node_elem.attrib, node_elem) if 'site_id' in node_elem.attrib: node['authority_id'] = node_elem.attrib['site_id'] - if 'authority_id' in node_elem.attrib: - node['authority_id'] = node_elem.attrib['authority_id'] - - # set the location - location_elems = node_elem.xpath(SFAv1Node.elements['location'].path, xml.namespaces) - if len(location_elems) > 0: - node['location'] = Location(location_elems[0].attrib, location_elems[0]) - - # set the bwlimit - bwlimit_elems = node_elem.xpath(SFAv1Node.elements['bw_limit'].path, xml.namespaces) - if len(bwlimit_elems) > 0: - bwlimit = BWlimit(bwlimit_elems[0].attrib, bwlimit_elems[0]) - node['bwlimit'] = bwlimit - - # set the interfaces - interface_elems = node_elem.xpath(SFAv1Node.elements['interface'].path, xml.namespaces) - node['interfaces'] = [] - for interface_elem in interface_elems: - node['interfaces'].append(Interface(interface_elem.attrib, interface_elem)) - - # set the slivers - sliver_elems = node_elem.xpath(SFAv1Node.elements['sliver'].path, xml.namespaces) - node['slivers'] = [] - for sliver_elem in sliver_elems: - node['slivers'].append(Sliver(sliver_elem.attrib, sliver_elem)) - - # set tags - node['tags'] = [] - for child in node_elem.iterchildren(): - if child.tag not in SFAv1Node.elements: - tag = PLTag({'name': child.tag, 'value': child.text}, child) - node['tags'].append(tag) + location_objs = Element.get(node_elem, './default:location | ./location', Location) + if len(location_objs) > 0: + node['location'] = location_objs[0] + bwlimit_objs = Element.get(node_elem, './default:bw_limit | ./bw_limit', BWlimit) + if len(bwlimit_objs) > 0: + node['bwlimit'] = bwlimit_objs[0] + node['interfaces'] = Element.get(node_elem, './default:interface | ./interface', Interface) + node['services'] = PGv2Services.get_services(node_elem) + node['slivers'] = SFAv1Sliver.get_slivers(node_elem) + node['tags'] = SFAv1PLTag.get_pl_tags(node_elem, ignore=Node.fields.keys()) nodes.append(node) - return nodes - - @staticmethod - def get_nodes_with_slivers(xml): - nodes = SFAv1Node.get_nodes(xml) - nodes_with_slivers = [node for node in nodes if node['slivers']] - return nodes_with_slivers - - + return nodes + diff --git a/sfa/rspecs/elements/versions/sfav1Sliver.py b/sfa/rspecs/elements/versions/sfav1Sliver.py index f12c9776..addc4e4d 100644 --- a/sfa/rspecs/elements/versions/sfav1Sliver.py +++ b/sfa/rspecs/elements/versions/sfav1Sliver.py @@ -1,18 +1,32 @@ - -from lxml import etree - +from sfa.util.xrn import Xrn +from sfa.rspecs.elements.element import Element from sfa.rspecs.elements.sliver import Sliver +from sfa.rspecs.elements.versions.sfav1PLTag import SFAv1PLTag -from sfa.util.xrn import Xrn -from sfa.util.plxrn import PlXrn class SFAv1Sliver: @staticmethod def add_slivers(xml, slivers): + if not isinstance(slivers, list): + slivers = [slivers] for sliver in slivers: - sliver_elem = etree.SubElement(xml, 'sliver') - if sliver.get('component_id'): - name_full = Xrn(sliver.get('component_id')).get_leaf() - name = name_full.split(':') + sliver_elem = Element.add(xml, 'sliver', sliver, ['name']) + if sliver.get('sliver_id'): + sliver_id_leaf = Xrn(sliver.get('sliver_id')).get_leaf() + sliver_id_parts = sliver_id_leaf.split(':') + name = sliver_id_parts[0] sliver_elem.set('name', name) - + SFAv1PLTag.add_pl_tags(sliver_elem, sliver.get('tags', [])) + + @staticmethod + def get_slivers(xml, filter={}): + xpath = './default:sliver | ./sliver' + sliver_elems = xml.xpath(xpath) + slivers = [] + for sliver_elem in sliver_elems: + sliver = Sliver(sliver_elem.attrib,sliver_elm) + if 'component_id' in xml.attrib: + sliver['component_id'] = xml.attrib['component_id'] + sliver['tags'] = SFAv1PLTag.get_pl_tags(sliver_elem, ignore=Sliver.fields.keys()) + slivers.append(sliver) + return slivers diff --git a/sfa/rspecs/versions/sfav1.py b/sfa/rspecs/versions/sfav1.py index 3917b39b..29552734 100644 --- a/sfa/rspecs/versions/sfav1.py +++ b/sfa/rspecs/versions/sfav1.py @@ -5,6 +5,7 @@ from sfa.util.plxrn import PlXrn from sfa.rspecs.rspec_version import BaseVersion from sfa.rspecs.rspec_elements import RSpecElement, RSpecElements from sfa.rspecs.elements.versions.pgv2Link import PGv2Link +from sfa.rspecs.elements.versions.sfav1Node import SFAv1Node class SFAv1(BaseVersion): enabled = True @@ -24,47 +25,11 @@ class SFAv1(BaseVersion): def get_networks(self): return self.xml.xpath('//network[@name]/@name') - def get_node_element(self, hostname, network=None): - if network: - names = self.xml.xpath('//network[@name="%s"]//node/hostname' % network) - else: - names = self.xml.xpath('//node/hostname') - for name in names: - if str(name.text).strip() == hostname: - return name.getparent() - return None - - def get_node_elements(self, network=None): - if network: - return self.xml.xpath('//network[@name="%s"]//node' % network) - else: - return self.xml.xpath('//node') - def get_nodes(self, network=None): - if network == None: - nodes = self.xml.xpath('//node/hostname/text()') - else: - nodes = self.xml.xpath('//network[@name="%s"]//node/hostname/text()' % network) - - nodes = [node.strip() for node in nodes] - return nodes + return SFAv1Node.get_nodes(self.xml) def get_nodes_with_slivers(self, network = None): - if network: - nodes = self.xml.xpath('//network[@name="%s"]//node[sliver]/hostname/text()' % network) - else: - nodes = self.xml.xpath('//node[sliver]/hostname/text()') - - nodes = [node.strip() for node in nodes] - return nodes - - def get_nodes_without_slivers(self, network=None): - xpath_nodes_without_slivers = '//node[not(sliver)]/hostname/text()' - xpath_nodes_without_slivers_in_network = '//network[@name="%s"]//node[not(sliver)]/hostname/text()' - if network: - return self.xml.xpath('//network[@name="%s"]//node[not(sliver)]/hostname/text()' % network) - else: - return self.xml.xpath('//node[not(sliver)]/hostname/text()') + return SFAv1Node.get_nodes_with_slivers(self.xml) def attributes_list(self, elem): # convert a list of attribute tags into list of tuples @@ -106,72 +71,12 @@ class SFAv1(BaseVersion): slice_attributes.append(attribute) return slice_attributes - def get_site_nodes(self, siteid, network=None): - if network: - nodes = self.xml.xpath('//network[@name="%s"]/site[@id="%s"]/node/hostname/text()' % \ - (network, siteid)) - else: - nodes = self.xml.xpath('//site[@id="%s"]/node/hostname/text()' % siteid) - return nodes - def get_links(self, network=None): return PGv2Link.get_links(self.xml) def get_link_requests(self): return PGv2Link.get_link_requests(self.xml) - def get_link(self, fromnode, tonode, network=None): - fromsite = fromnode.getparent() - tosite = tonode.getparent() - fromid = fromsite.get("id") - toid = tosite.get("id") - if network: - query = "//network[@name='%s']" % network + "/link[@endpoints = '%s %s']" - else: - query = "//link[@endpoints = '%s %s']" - - results = self.rspec.xpath(query % (fromid, toid)) - if not results: - results = self.rspec.xpath(query % (toid, fromid)) - return results - - def query_links(self, fromnode, tonode, network=None): - return get_link(fromnode, tonode, network) - - def get_vlinks(self, network=None): - vlinklist = [] - if network: - vlinks = self.xml.xpath("//network[@name='%s']//vlink" % network) - else: - vlinks = self.xml.xpath("//vlink") - for vlink in vlinks: - endpoints = vlink.get("endpoints") - (end1, end2) = endpoints.split() - if network: - node1 = self.xml.xpath('//network[@name="%s"]//node[@id="%s"]/hostname/text()' % \ - (network, end1))[0] - node2 = self.xml.xpath('//network[@name="%s"]//node[@id="%s"]/hostname/text()' % \ - (network, end2))[0] - else: - node1 = self.xml.xpath('//node[@id="%s"]/hostname/text()' % end1)[0] - node2 = self.xml.xpath('//node[@id="%s"]/hostname/text()' % end2)[0] - desc = "%s <--> %s" % (node1, node2) - kbps = vlink.find("kbps") - vlinklist.append((endpoints, desc, kbps.text)) - return vlinklist - - def get_vlink(self, endponts, network=None): - if network: - query = "//network[@name='%s']//vlink[@endpoints = '%s']" % (network, endpoints) - else: - query = "//vlink[@endpoints = '%s']" % (network, endpoints) - results = self.rspec.xpath(query) - return results - - def query_vlinks(self, endpoints, network=None): - return get_vlink(endpoints,network) - - ################## # Builder ################## @@ -185,55 +90,7 @@ class SFAv1(BaseVersion): return network_tag def add_nodes(self, nodes, network = None, no_dupes=False): - if not isinstance(nodes, list): - nodes = [nodes] - for node in nodes: - if no_dupes and \ - self.get_node_element(node['hostname']): - # node already exists - continue - - network_tag = self.xml.root - if 'network' in node: - network = node['network'] - network_tag = self.add_network(network) - - node_tag = etree.SubElement(network_tag, 'node') - if 'network' in node: - node_tag.set('component_manager_id', hrn_to_urn(network, 'authority+sa')) - if 'urn' in node: - node_tag.set('component_id', node['urn']) - if 'site_urn' in node: - node_tag.set('site_id', node['site_urn']) - if 'node_id' in node: - node_tag.set('node_id', 'n'+str(node['node_id'])) - if 'boot_state' in node: - node_tag.set('boot_state', node['boot_state']) - if 'hostname' in node: - node_tag.set('component_name', node['hostname']) - hostname_tag = etree.SubElement(node_tag, 'hostname').text = node['hostname'] - if 'interfaces' in node: - i = 0 - for interface in node['interfaces']: - if 'bwlimit' in interface and interface['bwlimit']: - bwlimit = etree.SubElement(node_tag, 'bw_limit', units='kbps').text = str(interface['bwlimit']/1000) - comp_id = PlXrn(auth=network, interface='node%s:eth%s' % (node['node_id'], i)).get_urn() - ipaddr = interface['ip'] - interface_tag = etree.SubElement(node_tag, 'interface', component_id=comp_id, ipv4=ipaddr) - i+=1 - if 'bw_unallocated' in node: - bw_unallocated = etree.SubElement(node_tag, 'bw_unallocated', units='kbps').text = str(node['bw_unallocated']/1000) - if 'tags' in node: - for tag in node['tags']: - # expose this hard wired list of tags, plus the ones that are marked 'sfa' in their category - if tag['tagname'] in ['fcdistro', 'arch'] or 'sfa' in tag['category'].split('/'): - tag_element = etree.SubElement(node_tag, tag['tagname']).text=tag['value'] - - if 'site' in node: - longitude = str(node['site']['longitude']) - latitude = str(node['site']['latitude']) - location = etree.SubElement(node_tag, 'location', country='unknown', \ - longitude=longitude, latitude=latitude) + SFAv1Node.add_nodes(self.xml, nodes) def merge_node(self, source_node_tag, network, no_dupes=False): if no_dupes and self.get_node_element(node['hostname']): @@ -243,9 +100,6 @@ class SFAv1(BaseVersion): network_tag = self.add_network(network) network_tag.append(deepcopy(source_node_tag)) - def add_interfaces(self, interfaces): - pass - def add_links(self, links): networks = self.get_network_elements() if len(networks) > 0: @@ -285,11 +139,7 @@ class SFAv1(BaseVersion): parent.remove(node_elem) def remove_slivers(self, slivers, network=None, no_dupes=False): - for sliver in slivers: - node_elem = self.get_node_element(sliver['hostname'], network) - sliver_elem = node_elem.find('sliver') - if sliver_elem != None: - node_elem.remove(sliver_elem) + SFAv1Node.remove_slivers(self.xml, slivers) def add_default_sliver_attribute(self, name, value, network=None): if network: @@ -322,25 +172,6 @@ class SFAv1(BaseVersion): sliver = node.find("sliver") self.xml.remove_attribute(sliver, name, value) - def add_vlink(self, fromhost, tohost, kbps, network=None): - fromnode = self.get_node_element(fromhost, network) - tonode = self.get_node_element(tohost, network) - links = self.get_link(fromnode, tonode, network) - - for link in links: - vlink = etree.SubElement(link, "vlink") - fromid = fromnode.get("id") - toid = tonode.get("id") - vlink.set("endpoints", "%s %s" % (fromid, toid)) - self.xml.add_attribute(vlink, "kbps", kbps) - - - def remove_vlink(self, endpoints, network=None): - vlinks = self.query_vlinks(endpoints, network) - for vlink in vlinks: - vlink.getparent().remove(vlink) - - def merge(self, in_rspec): """ Merge contents for specified rspec with current rspec