From: Tony Mack Date: Mon, 3 Oct 2011 19:54:11 +0000 (-0400) Subject: removing X-Git-Tag: sfa-1.1-1~157 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=28e7dacc91021db52b19dfdbb83669fd7ce2ef48;p=sfa.git removing --- diff --git a/sfa/rspecs/pg_rspec.py b/sfa/rspecs/pg_rspec.py deleted file mode 100755 index 405a8202..00000000 --- a/sfa/rspecs/pg_rspec.py +++ /dev/null @@ -1,265 +0,0 @@ -#!/usr/bin/python -from copy import deepcopy -from lxml import etree -from StringIO import StringIO -from sfa.rspecs.rspec import RSpec -from sfa.util.xrn import * -from sfa.util.plxrn import hostname_to_urn, xrn_to_hostname -from sfa.util.config import Config -from sfa.rspecs.rspec_version import RSpecVersion - -_ad_version = {'type': 'ProtoGENI', - 'version': '2', - 'schema': 'http://www.protogeni.net/resources/rspec/2/ad.xsd', - 'namespace': 'http://www.protogeni.net/resources/rspec/2', - 'extensions': [ - 'http://www.protogeni.net/resources/rspec/ext/gre-tunnel/1', - 'http://www.protogeni.net/resources/rspec/ext/other-ext/3' - ] -} - -_request_version = {'type': 'ProtoGENI', - 'version': '2', - 'schema': 'http://www.protogeni.net/resources/rspec/2/request.xsd', - 'namespace': 'http://www.protogeni.net/resources/rspec/2', - 'extensions': [ - 'http://www.protogeni.net/resources/rspec/ext/gre-tunnel/1', - 'http://www.protogeni.net/resources/rspec/ext/other-ext/3' - ] -} -pg_rspec_ad_version = RSpecVersion(_ad_version) -pg_rspec_request_version = RSpecVersion(_request_version) - -class PGRSpec(RSpec): - xml = None - header = '\n' - template = '' - - def __init__(self, rspec="", namespaces={}, type=None): - if not type: - type = 'advertisement' - self.type = type - - if type == 'advertisement': - self.version = pg_rspec_ad_version - rspec_type = 'ad' - else: - self.version = pg_rspec_request_version - rspec_type = type - - self.template = self.template % {'rspec_type': rspec_type} - - if not namespaces: - self.namespaces = {'rspecv2': self.version['namespace'], - 'flack': 'http://www.protogeni.net/resources/rspec/ext/flack/1', - 'planetlab': 'http://www.planet-lab.org/resources/sfa/ext/planetlab/1' } - - else: - self.namespaces = namespaces - - if rspec: - self.parse_rspec(rspec, self.namespaces) - else: - self.create() - - def create(self): - RSpec.create(self) - if self.type: - self.xml.set('type', self.type) - - def get_network(self): - network = None - nodes = self.xml.xpath('//rspecv2:node[@component_manager_id][1]', namespaces=self.namespaces) - if nodes: - network = nodes[0].get('component_manager_id') - return network - - def get_networks(self): - networks = self.xml.xpath('//rspecv2:node[@component_manager_id]/@component_manager_id', namespaces=self.namespaces) - return set(networks) - - def get_node_element(self, hostname, network=None): - nodes = self.xml.xpath('//rspecv2:node[@component_id[contains(., "%s")]] | node[@component_id[contains(., "%s")]]' % (hostname, hostname), namespaces=self.namespaces) - if isinstance(nodes,list) and nodes: - return nodes[0] - else: - return None - - def get_node_elements(self, network=None): - nodes = self.xml.xpath('//rspecv2:node | //node', namespaces=self.namespaces) - return nodes - - def get_nodes(self, network=None): - xpath = '//rspecv2:node[@component_name]/@component_id | //node[@component_name]/@component_id' - nodes = self.xml.xpath(xpath, namespaces=self.namespaces) - nodes = [xrn_to_hostname(node) for node in nodes] - return nodes - - def get_nodes_with_slivers(self, network=None): - if network: - nodes = self.xml.xpath('//rspecv2:node[@component_manager_id="%s"][sliver_type]/@component_id' % network, namespaces=self.namespaces) - else: - nodes = self.xml.xpath('//rspecv2:node[rspecv2:sliver_type]/@component_id', namespaces=self.namespaces) - nodes = [xrn_to_hostname(node) for node in nodes] - return nodes - - def get_nodes_without_slivers(self, network=None): - return [] - - def get_sliver_attributes(self, hostname, network=None): - node = self.get_node_element(hostname, network) - sliver = node.xpath('./rspecv2:sliver_type', namespaces=self.namespaces) - if sliver is not None and isinstance(sliver, list): - sliver = sliver[0] - return self.attributes_list(sliver) - - def get_slice_attributes(self, network=None): - slice_attributes = [] - nodes_with_slivers = self.get_nodes_with_slivers(network) - # TODO: default sliver attributes in the PG rspec? - default_ns_prefix = self.namespaces['rspecv2'] - for node in nodes_with_slivers: - sliver_attributes = self.get_sliver_attributes(node, network) - for sliver_attribute in sliver_attributes: - name=str(sliver_attribute[0]) - text =str(sliver_attribute[1]) - attribs = sliver_attribute[2] - # we currently only suppor the and attributes - if 'info' in name: - attribute = {'name': 'flack_info', 'value': str(attribs), 'node_id': node} - slice_attributes.append(attribute) - elif 'initscript' in name: - if attribs is not None and 'name' in attribs: - value = attribs['name'] - else: - value = text - attribute = {'name': 'initscript', 'value': value, 'node_id': node} - slice_attributes.append(attribute) - - return slice_attributes - - def attributes_list(self, elem): - opts = [] - if elem is not None: - for e in elem: - opts.append((e.tag, str(e.text).strip(), e.attrib)) - return opts - - def get_default_sliver_attributes(self, network=None): - return [] - - def add_default_sliver_attribute(self, name, value, network=None): - pass - - def add_nodes(self, nodes, check_for_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, namespaces=self.namespaces): - # node already exists - continue - - node_tag = etree.SubElement(self.xml, 'node', exclusive='false') - if 'network_urn' in node: - node_tag.set('component_manager_id', node['network_urn']) - if 'urn' in node: - node_tag.set('component_id', node['urn']) - if 'hostname' in node: - node_tag.set('component_name', node['hostname']) - # TODO: should replace plab-pc with pc model - node_type_tag = etree.SubElement(node_tag, 'hardware_type', name='plab-pc') - node_type_tag = etree.SubElement(node_tag, 'hardware_type', name='pc') - available_tag = etree.SubElement(node_tag, 'available', now='true') - sliver_type_tag = etree.SubElement(node_tag, 'sliver_type', name='plab-vnode') - - pl_initscripts = node.get('pl_initscripts', {}) - for pl_initscript in pl_initscripts.values(): - etree.SubElement(sliver_type_tag, '{%s}initscript' % self.namespaces['planetlab'], name=pl_initscript['name']) - - # protogeni uses the tag to identify the types of - # vms available at the node. - # only add location tag if longitude and latitude are not null - if 'site' in node: - longitude = node['site'].get('longitude', None) - latitude = node['site'].get('latitude', None) - if longitude and latitude: - location_tag = etree.SubElement(node_tag, 'location', country="us", \ - longitude=str(longitude), latitude=str(latitude)) - - def merge_node(self, source_node_tag): - # this is untested - self.xml.append(deepcopy(source_node_tag)) - - def add_slivers(self, slivers, sliver_urn=None, no_dupes=False): - - # all nodes hould already be present in the rspec. Remove all - # nodes that done have slivers - slivers = self._process_slivers(slivers) - slivers_dict = {} - for sliver in slivers: - slivers_dict[sliver['hostname']] = sliver - - nodes = self.get_node_elements() - for node in nodes: - urn = node.get('component_id') - hostname = xrn_to_hostname(urn) - if hostname not in slivers_dict: - parent = node.getparent() - parent.remove(node) - else: - sliver_info = slivers_dict[hostname] - node.set('client_id', hostname) - if sliver_urn: - slice_id = sliver_info.get('slice_id', -1) - node_id = sliver_info.get('node_id', -1) - sliver_id = urn_to_sliver_id(sliver_urn, slice_id, node_id) - node.set('sliver_id', sliver_id) - - # remove existing sliver_type tags,it needs to be recreated - sliver_elem = node.xpath('./rspecv2:sliver_type | ./sliver_type', namespaces=self.namespaces) - if sliver_elem and isinstance(sliver_elem, list): - sliver_elem = sliver_elem[0] - node.remove(sliver_elem) - - sliver_elem = etree.SubElement(node, 'sliver_type', name='plab-vnode') - for tag in sliver_info['tags']: - if tag['tagname'] == 'flack_info': - e = etree.SubElement(sliver_elem, '{%s}info' % self.namespaces['flack'], attrib=eval(tag['value'])) - elif tag['tagname'] == 'initscript': - e = etree.SubElement(sliver_elem, '{%s}initscript' % self.namespaces['planetlab'], attrib={'name': tag['value']}) - - - - def add_default_sliver_attribute(self, name, value, network=None): - pass - - def add_interfaces(self, interfaces, no_dupes=False): - pass - - def add_links(self, links, no_dupes=False): - pass - - - def merge(self, in_rspec): - """ - Merge contents for specified rspec with current rspec - """ - - # just copy over all the child elements under the root element - tree = etree.parse(StringIO(in_rspec)) - root = tree.getroot() - for child in root.getchildren(): - self.xml.append(child) - - def cleanup(self): - # remove unncecessary elements, attributes - if self.type in ['request', 'manifest']: - # remove 'available' element from remaining node elements - self.remove_element('//rspecv2:available | //available') - -if __name__ == '__main__': - rspec = PGRSpec() - rspec.add_nodes([1]) - print rspec diff --git a/sfa/rspecs/rspec_parser.py b/sfa/rspecs/rspec_parser.py deleted file mode 100755 index b29329bf..00000000 --- a/sfa/rspecs/rspec_parser.py +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/python -from sfa.rspecs.sfa_rspec import SfaRSpec -from sfa.rspecs.pg_rspec import PGRSpec -from sfa.rspecs.rspec import RSpec -from lxml import etree - -def parse_rspec(in_rspec): - rspec = RSpec(rspec=in_rspec) - # really simple check - # TODO: check against schema instead - out_rspec = None - if rspec.xml.xpath('//network'): - #out_rspec = SfaRSpec(in_rspec) - out_rspec = SfaRSpec() - out_rspec.type = 'SFA' - out_rspec.xml = rspec.xml - else: - #out_rspec = PGRSpec(in_rspec) - # TODO: determine if this is an ad or request - out_rspec = PGRSpec() - out_rspec.type = 'ProtoGENI' - out_rspec.xml = rspec.xml - return out_rspec - -if __name__ == '__main__': - - print "Parsing SFA RSpec:", - rspec = parse_rspec('nodes.rspec') - print rspec.version - rspec = parse_rspec('protogeni.rspec') - print "Parsing ProtoGENI RSpec:", - print rspec.version - - - diff --git a/sfa/rspecs/sfa_rspec.py b/sfa/rspecs/sfa_rspec.py deleted file mode 100755 index 56e302b6..00000000 --- a/sfa/rspecs/sfa_rspec.py +++ /dev/null @@ -1,380 +0,0 @@ -#!/usr/bin/python -from copy import deepcopy -from lxml import etree -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.rspecs.rspec_version import RSpecVersion - - -_version = { 'type': 'SFA', - 'version': '1' -} - -sfa_rspec_version = RSpecVersion(_version) - -class SfaRSpec(RSpec): - xml = None - header = '\n' - version = sfa_rspec_version - - def create(self): - RSpec.create(self) - self.xml.set('type', 'SFA') - - ################### - # Parser - ################### - def get_network_elements(self): - return self.xml.xpath('//network') - - 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 - - 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()') - - - def attributes_list(self, elem): - # convert a list of attribute tags into list of tuples - # (tagnme, text_value) - opts = [] - if elem is not None: - for e in elem: - opts.append((e.tag, str(e.text).strip())) - return opts - - def get_default_sliver_attributes(self, network=None): - if network: - defaults = self.xml.xpath("//network[@name='%s']/sliver_defaults" % network) - else: - defaults = self.xml.xpath("//sliver_defaults") - if isinstance(defaults, list) and defaults: - defaults = defaults[0] - return self.attributes_list(defaults) - - def get_sliver_attributes(self, hostname, network=None): - attributes = [] - node = self.get_node_element(hostname, network) - #sliver = node.find("sliver") - slivers = node.xpath('./sliver') - if isinstance(slivers, list) and slivers: - attributes = self.attributes_list(slivers[0]) - return attributes - - def get_slice_attributes(self, network=None): - slice_attributes = [] - nodes_with_slivers = self.get_nodes_with_slivers(network) - for default_attribute in self.get_default_sliver_attributes(network): - attribute = {'name': str(default_attribute[0]), 'value': str(default_attribute[1]), 'node_id': None} - slice_attributes.append(attribute) - for node in nodes_with_slivers: - sliver_attributes = self.get_sliver_attributes(node, network) - for sliver_attribute in sliver_attributes: - attribute = {'name': str(sliver_attribute[0]), 'value': str(sliver_attribute[1]), 'node_id': node} - 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): - if network: - links = self.xml.xpath('//network[@name="%s"]/link' % network) - else: - links = self.xml.xpath('//link') - linklist = [] - for link in links: - (end1, end2) = link.get("endpoints").split() - name = link.find("description") - linklist.append((name.text, - self.get_site_nodes(end1, network), - self.get_site_nodes(end2, network))) - return linklist - - 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 - ################## - - def add_network(self, 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] - 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 - 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: - hostname_tag = etree.SubElement(node_tag, 'hostname').text = node['hostname'] - 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']).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) - - def merge_node(self, source_node_tag, network, no_dupes=False): - if no_dupes and self.get_node_element(node['hostname']): - # node already exists - return - - network_tag = self.add_network(network) - network_tag.append(deepcopy(source_node_tag)) - - def add_interfaces(self, interfaces): - pass - - def add_links(self, links): - pass - - def add_slivers(self, slivers, network=None, sliver_urn=None, no_dupes=False): - # add slice name to network tag - network_tags = self.xml.xpath('//network') - if network_tags: - network_tag = network_tags[0] - network_tag.set('slice', urn_to_hrn(sliver_urn)[0]) - slivers = self._process_slivers(slivers) - nodes_with_slivers = self.get_nodes_with_slivers(network) - for sliver in slivers: - if sliver['hostname'] in nodes_with_slivers: - continue - 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']).text = value=tag['value'] - - def remove_slivers(self, slivers, network=None, no_dupes=False): - slivers = self._process_slivers(slivers) - 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) - - 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 not defaults : - network_tag = self.xml.xpath("//network[@name='%s']" % network) - if isinstance(network_tag, list): - network_tag = network_tag[0] - defaults = self.add_element('sliver_defaults', attrs={}, parent=network_tag) - elif isinstance(defaults, list): - defaults = defaults[0] - 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 - """ - - from sfa.rspecs.rspec_parser import parse_rspec - rspec = parse_rspec(in_rspec) - if rspec.type.lower() == 'protogeni': - from sfa.rspecs.rspec_converter import RSpecConverter - in_rspec = RSpecConverter.to_sfa_rspec(in_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 current_network and current_network not in current_networks: - self.xml.append(network) - current_networks.append(current_network) - - - - -if __name__ == '__main__': - rspec = SfaRSpec() - 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