X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;ds=sidebyside;f=sfa%2Frspecs%2Fsfa_rspec.py;h=3512c433f7607bf284e04a4e083a3a552077ac97;hb=2bd6bca8be9254195650c61dbe65f1aab49c8cff;hp=eb267b232c35d0b63fc1901466f64b5d473e8ed2;hpb=43a1883ec20a1cc9e5640a884a83e6356c1eaa95;p=sfa.git diff --git a/sfa/rspecs/sfa_rspec.py b/sfa/rspecs/sfa_rspec.py index eb267b23..3512c433 100755 --- a/sfa/rspecs/sfa_rspec.py +++ b/sfa/rspecs/sfa_rspec.py @@ -11,10 +11,10 @@ class SfaRSpec(RSpec): xml = None header = '\n' namespaces = {} - - ######## + type = 'sfa' + ################### # Parser - ######## + ################### def get_network_elements(self): return self.xml.xpath('//network', self.namespaces) @@ -150,36 +150,150 @@ class SfaRSpec(RSpec): def query_vlinks(self, endpoints, network=None): return get_vlink(endpoints,network) - ######### + ################## # Builder - ######## + ################## + + def add_network(self, network): + network_tag = etree.SubElement(self.xml, 'network', id=network) - def add_nodes(self, nodes, check_for_dupes=False): + def add_nodes(self, nodes, network = None, no_dupes=False): if not isinstance(nodes, list): nodes = [nodes] for node in nodes: - urn = "" - if check_for_dupes and \ - self.xml.xpath('//rspecv2:node[@component_uuid="%s"]' % urn, self.namespaces): + if no_dupes and \ + self.get_node_element(node['hostname']): # node already exists continue - - node_tag = etree.SubElement(self.xml, 'node') - node_type_tag = etree.SubElement(node_tag, 'node_type', type_name='pcvm', type_slots='100') - available_tag = etree.SubElement(node_tag, 'available').text = 'true' - exclusive_tag = etree.SubElement(node_tag, 'exclusive').text = 'false' - location_tag = etree.SubElement(node_tag, 'location') - interface_tag = etree.SubElement(node_tag, 'interface') + + 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_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) + if 'urn' in node: + node_tag.set('compinent_uuid', node['urn']) + if 'site_urn' in node: + node_tag.set('site_uuid', 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, slivers, check_for_dupes=False): - pass + def add_slivers(self, hostnames, network=None, no_dupes=False): + if not isinstance(hostnames, list): + hostnames = [hostnames] - def add_links(self, links, check_for_dupes=False): - pass + nodes_with_slivers = self.get_nodes_with_slivers(network) + for hostname in hostnames: + if 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) + + def add_default_sliver_attribute(self, name, value, network=None): + if network: + defaults = self.xml.xpath("//network[@name='%s']/sliver_defaults" % network) + else: + defaults = self.xml.xpath("//sliver_defaults" % network) + if defaults is None: + defaults = etree.Element("sliver_defaults") + network = self.xml.xpath("//network[@name='%s']" % network) + network.insert(0, defaults) + self.add_attribute(defaults, name, value) + + def add_sliver_attribute(self, hostname, name, value, network=None): + node = self.get_node_element(hostname, network) + sliver = node.find("sliver") + self.add_attribute(sliver, name, value) + + def remove_default_sliver_attribute(self, name, value, network=None): + if network: + defaults = self.xml.xpath("//network[@name='%s']/sliver_defaults" % network) + else: + defaults = self.xml.xpath("//sliver_defaults" % network) + self.remove_attribute(defaults, name, value) + def remove_sliver_attribute(self, hostname, name, value, network=None): + node = self.get_node_element(hostname, network) + sliver = node.find("sliver") + self.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.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 + """ + + # 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() - rspec.add_nodes([1]) + nodes = [ + {'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