xml = None
header = '<?xml version="1.0"?>\n'
namespaces = {}
-
+ format = 'sfa'
###################
# 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:
return None
def get_node_elements(self):
- return self.xml.xpath('//node', self.namespaces)
+ 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):
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):
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 = []
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()
# Builder
##################
+ def add_network(self, network):
+ network_tag = etree.SubElement(self.xml, 'network', id=network)
+
def add_nodes(self, nodes, network = None, no_dupes=False):
if not isinstance(nodes, list):
nodes = [nodes]
for node in nodes:
- if check_for_dupes and \
+ if no_dupes and \
self.get_node_element(node['hostname']):
# node already exists
continue
-
- node_tag = etree.SubElement(self.xml, 'node')
- if network:
- node_tag.set('component_manager_uuid', network)
+
+ network_tag = self.xml
+ if 'network' in node:
+ network = node['network']
+ 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_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').tet = 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'])
+
+ 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['name'], 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:
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 = [
- {'hostname': 'node1.planet-lab.org',
+ {'network': 'plc',
+ '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