X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Frspecs%2Fsfa_rspec.py;h=2c8a0c93a196530f4460be2fc6d8ab6c27ef483c;hb=c1623056cb0a51c3817425ceee85aec3c62c57f3;hp=7f0c10e92488f677442814de63ab5602d5a0eda7;hpb=7322bf8fc1e36e8f0bc2b478322c38cac628db29;p=sfa.git diff --git a/sfa/rspecs/sfa_rspec.py b/sfa/rspecs/sfa_rspec.py index 7f0c10e9..2c8a0c93 100755 --- a/sfa/rspecs/sfa_rspec.py +++ b/sfa/rspecs/sfa_rspec.py @@ -4,22 +4,29 @@ from StringIO import StringIO from sfa.rspecs.rspec import RSpec from sfa.util.xrn import * from sfa.util.plxrn import hostname_to_urn -from sfa.util.config import Config +from sfa.util.config import Config +from sfa.rspecs.rspec_version import RSpecVersion +_version = { 'type': 'sfa', + 'version': '1' +} + +sfa_rspec_version = RSpecVersion(_version) + class SfaRSpec(RSpec): xml = None header = '\n' - namespaces = {} + version = sfa_rspec_version ################### # Parser ################### def get_network_elements(self): - return self.xml.xpath('//network', self.namespaces) + return self.xml.xpath('//network') def get_networks(self): - return self.xml.xpath('//network[@name]/@name', self.namespaces) + return self.xml.xpath('//network[@name]/@name') def get_node_element(self, hostname, network=None): if network: @@ -31,29 +38,32 @@ class SfaRSpec(RSpec): return name.getparent() return None - def get_node_elements(self): - return self.xml.xpath('//node', self.namespaces) + 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()', self.namespaces) + nodes = self.xml.xpath('//node/hostname/text()') else: - nodes = self.xml.xpath('//network[@name="%s"]//node/hostname/text()' % network, self.namespaces) + nodes = self.xml.xpath('//network[@name="%s"]//node/hostname/text()' % network) return nodes def get_nodes_with_slivers(self, network = None): if network: - return self.xml.xpath('//network[@name="%s"]//node[sliver]/hostname/text()' % network, self.namespaces) + return self.xml.xpath('//network[@name="%s"]//node[sliver]/hostname/text()' % network) else: - return self.xml.xpath('//node[sliver]/hostname/text()', self.namespaces) + return self.xml.xpath('//node[sliver]/hostname/text()') 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, self.namespaces) + return self.xml.xpath('//network[@name="%s"]//node[not(sliver)]/hostname/text()' % network) else: - return self.xml.xpath('//node[not(sliver)]/hostname/text()', self.namespaces) + return self.xml.xpath('//node[not(sliver)]/hostname/text()') def attributes_list(self, elem): @@ -67,9 +77,9 @@ class SfaRSpec(RSpec): def get_default_sliver_attributes(self, network=None): if network: - defaults = self.xml.xpath("//network[@name='%s']/sliver_defaults" % network, self.namespaces) + defaults = self.xml.xpath("//network[@name='%s']/sliver_defaults" % network) else: - defaults = self.xml.xpath("//network/sliver_defaults" % network, self.namespaces) + defaults = self.xml.xpath("//network/sliver_defaults" % network) return self.attributes_list(defaults) def get_sliver_attributes(self, hostname, network=None): @@ -80,14 +90,14 @@ class SfaRSpec(RSpec): 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), self.namespaces) + (network, siteid)) else: - nodes = self.xml.xpath('//site[@id="%s"]/node/hostname/text()' % siteid, self.namespaces) + nodes = self.xml.xpath('//site[@id="%s"]/node/hostname/text()' % siteid) return nodes def get_links(self, network=None): if network: - links = self.xml.xpath('//network[@name="%s"]/link' % network, self.namespaces) + links = self.xml.xpath('//network[@name="%s"]/link' % network) else: links = self.xml.xpath('//link') linklist = [] @@ -120,9 +130,9 @@ class SfaRSpec(RSpec): def get_vlinks(self, network=None): vlinklist = [] if network: - vlinks = self.xml.xpath("//network[@name='%s']//vlink" % network, self.namespaces) + vlinks = self.xml.xpath("//network[@name='%s']//vlink" % network) else: - vlinks = self.xml.xpath("//vlink", self.namespaces) + vlinks = self.xml.xpath("//vlink") for vlink in vlinks: endpoints = vlink.get("endpoints") (end1, end2) = endpoints.split() @@ -169,50 +179,76 @@ class SfaRSpec(RSpec): network_tag = self.xml if 'network' in node: network = node['network'] - network_tags = self.xml.xpath('//network[@name="%s"]' % network, self.namespaces) - if not network_tag: + network_tags = self.xml.xpath('//network[@name="%s"]' % network) + if not network_tags: network_tag = etree.SubElement(self.xml, 'network', name=network) else: network_tag = network_tags[0] node_tag = etree.SubElement(network_tag, 'node') if 'network' in node: - node_tag.set('component_manager_uuid', network) + node_tag.set('component_manager_id', network) if 'urn' in node: - node_tag.set('compinent_uuid', node['urn']) + node_tag.set('component_id', node['urn']) if 'site_urn' in node: - node_tag.set('site_uuid', node['site_urn']) + node_tag.set('site_id', node['site_urn']) if 'node_id' in node: node_tag.set('node_id', 'n'+str(node['node_id'])) if 'hostname' in node: hostname_tag = etree.SubElement(node_tag, 'hostname').text = node['hostname'] - if 'bw_unallocated' in node: - pass - if 'bw_limit' in node: - pass - - - def add_slivers(self, hostnames, network=None, no_dupes=False): - if not isinstance(hostnames, list): - hostnames = [hostnames] + if 'interfaces' in node: + 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) + 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'], value=tag['value']) + + #panos expose tags only if requested by the user using the -i option + if self.user_options: + #print "[sfa rspec] found tag ",tag," and have info ",self.user_options.get('info') + if self.user_options.get('info') and tag['tagname'] in self.user_options.get('info'): + tag_element = etree.SubElement(node_tag, tag['tagname'], value=tag['value']) + + if 'sfa' in tag['category'].split('/'): + tag_element = etree.SubElement(node_tag, tag['tagname'], value=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) + + def add_interfaces(self, interfaces): + pass + + def add_links(self, links): + pass + + def add_slivers(self, slivers, network=None, no_dupes=False): + if not isinstance(slivers, list): + slivers = [slivers] nodes_with_slivers = self.get_nodes_with_slivers(network) - for hostname in hostnames: - if hostname in nodes_with_slivers: + for sliver in slivers: + if sliver['hostname'] in nodes_with_slivers: continue - node = self.get_node_element(hostname, network) - etree.SubElement(node, 'sliver') - - def remove_slivers(self, hostnames, network=None, no_dupes=False): - if not isinstance(hostnames, list): - hostnames = [hostnames] - for hostname in hostnames: - node = self.get_node_element(hostname, network) - sliver = node.find('sliver') - if sliver: - node.remove(sliver) - - + node_elem = self.get_node_element(sliver['hostname'], network) + sliver_elem = etree.SubElement(node_elem, 'sliver') + if 'tags' in sliver: + for tag in sliver['tags']: + etree.SubElement(sliver_elem, tag['tagname'], value=tag['value']) + + def remove_slivers(self, slivers, network=None, no_dupes=False): + if not isinstance(slivers, list): + slivers = [slivers] + for sliver in slivers: + node_elem = self.get_node_element(sliver['hostname'], network) + sliver_elem = node.find('sliver') + if sliver_elem != None: + node_elem.remove(sliver) def add_default_sliver_attribute(self, name, value, network=None): if network: @@ -260,6 +296,24 @@ class SfaRSpec(RSpec): for vlink in vlinks: vlink.getparent().remove(vlink) + + def merge(self, in_rspec): + """ + Merge contents for specified rspec with current rspec + """ + + # just copy over all networks + current_networks = self.get_networks() + rspec = SfaRSpec(rspec=in_rspec) + networks = rspec.get_network_elements() + for network in networks: + current_network = network.get('name') + if not current_network in current_networks: + self.xml.append(network) + current_networks.append(current_network) + + + if __name__ == '__main__': rspec = SfaRSpec() nodes = [ @@ -267,7 +321,17 @@ if __name__ == '__main__': 'hostname': 'node1.planet-lab.org', 'site_urn': 'urn:publicid:IDN+plc+authority+cm', 'node_id': 1, - } + }, + {'network': 'plc', + 'hostname': 'node2.planet-lab.org', + 'site_urn': 'urn:publicid:IDN+plc+authority+cm', + 'node_id': 1, + }, + {'network': 'ple', + 'hostname': 'node1.planet-lab.eu', + 'site_urn': 'urn:publicid:IDN+plc+authority+cm', + 'node_id': 1, + }, ] rspec.add_nodes(nodes) print rspec