X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Frspecs%2Fversions%2Fpgv2.py;h=fbd8a394eec2f7d453bb4a2faceed1171b28a805;hb=1cc8e9613cab8b5b22478de369f259e591c54e6d;hp=ef480b4af91c5c63663823674731668856965845;hpb=616217d8d864e62ad2aa665296f5757dde703214;p=sfa.git diff --git a/sfa/rspecs/versions/pgv2.py b/sfa/rspecs/versions/pgv2.py index ef480b4a..fbd8a394 100644 --- a/sfa/rspecs/versions/pgv2.py +++ b/sfa/rspecs/versions/pgv2.py @@ -1,13 +1,13 @@ from copy import deepcopy from StringIO import StringIO -from sfa.util.xrn import urn_to_sliver_id -from sfa.util.plxrn import hostname_to_urn, xrn_to_hostname -from sfa.rspecs.rspec_version import BaseVersion +from sfa.util.xrn import Xrn +from sfa.rspecs.version import RSpecVersion from sfa.rspecs.elements.versions.pgv2Link import PGv2Link from sfa.rspecs.elements.versions.pgv2Node import PGv2Node from sfa.rspecs.elements.versions.pgv2SliverType import PGv2SliverType +from sfa.rspecs.elements.versions.pgv2Lease import PGv2Lease -class PGv2(BaseVersion): +class PGv2(RSpecVersion): type = 'ProtoGENI' content_type = 'ad' version = '2' @@ -16,22 +16,27 @@ class PGv2(BaseVersion): extensions = { 'flack': "http://www.protogeni.net/resources/rspec/ext/flack/1", 'planetlab': "http://www.planet-lab.org/resources/sfa/ext/planetlab/1", + 'plos': "http://www.planet-lab.org/resources/sfa/ext/plos/1", } namespaces = dict(extensions.items() + [('default', namespace)]) - # Networks - def get_network(self): - network = None - nodes = self.xml.xpath('//default:node[@component_manager_id][1]', namespaces=self.namespaces) - if nodes: - network = nodes[0].get('component_manager_id') - return network - + # Networks def get_networks(self): - networks = self.xml.xpath('//default:node[@component_manager_id]/@component_manager_id', namespaces=self.namespaces) - return set(networks) + network_names = set() + nodes = self.xml.xpath('//default:node[@component_manager_id] | //node[@component_manager_id]', namespaces=self.namespaces) + for node in nodes: + if 'component_manager_id' in node.attrib: + network_urn = node.get('component_manager_id') + if network_urn.startswith("urn:"): + network_hrn = Xrn(network_urn).get_hrn() + else: + # some component_manager_ids are hrns instead of urns?? + network_hrn = network_urn + network_names.add(network_hrn) + network_names = list(network_names) + networks = [{"name": x} for x in network_names] + return networks - # Nodes def get_nodes(self, filter=None): @@ -47,26 +52,22 @@ class PGv2(BaseVersion): # this is untested self.xml.root.append(deepcopy(source_node_tag)) - def get_nodes_with_slivers(self, network=None): - if network: - nodes = self.xml.xpath('//default:node[@component_manager_id="%s"][sliver_type]/@component_id' % network, namespaces=self.namespaces) - else: - nodes = self.xml.xpath('//default:node[default:sliver_type]/@component_id', namespaces=self.namespaces) - nodes = [xrn_to_hostname(node) for node in nodes] - return nodes - # Slivers def get_sliver_attributes(self, hostname, network=None): - node = self.get_node_element(hostname, network) - sliver = node.xpath('./default:sliver_type', namespaces=self.namespaces) - if sliver is not None and isinstance(sliver, list): - sliver = sliver[0] - return self.attributes_list(sliver) + nodes = self.get_nodes({'component_id': '*%s*' %hostname}) + attribs = [] + if nodes is not None and isinstance(nodes, list) and len(nodes) > 0: + node = nodes[0] + sliver = node.xpath('./default:sliver_type', namespaces=self.namespaces) + if sliver is not None and isinstance(sliver, list) and len(sliver) > 0: + sliver = sliver[0] + #attribs = self.attributes_list(sliver) + return attribs def get_slice_attributes(self, network=None): slice_attributes = [] - nodes_with_slivers = self.get_nodes_with_slivers(network) + nodes_with_slivers = self.get_nodes_with_slivers() # TODO: default sliver attributes in the PG rspec? default_ns_prefix = self.namespaces['default'] for node in nodes_with_slivers: @@ -120,31 +121,41 @@ class PGv2(BaseVersion): if not requested_sliver_type: continue - sliver = {'name': requested_sliver_type, + sliver = {'type': requested_sliver_type, 'pl_tags': attributes} - # remove existing sliver_type tags + # remove available element + for available_elem in node_elem.xpath('./default:available | ./available'): + node_elem.remove(available_elem) + + # remove interface elements + for interface_elem in node_elem.xpath('./default:interface | ./interface'): + node_elem.remove(interface_elem) + + # remove existing sliver_type elements for sliver_type in node_elem.get('slivers', []): - node_elem.remove(sliver_type) + node_elem.element.remove(sliver_type.element) # set the client id - node.set('client_id', hostname) + node_elem.element.set('client_id', hostname) if sliver_urn: + pass + # TODO # set the sliver id - 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_elem.set('sliver_id', sliver_id) + #slice_id = sliver_info.get('slice_id', -1) + #node_id = sliver_info.get('node_id', -1) + #sliver_id = Xrn(xrn=sliver_urn, type='slice', id=str(node_id)).get_urn() + #node_elem.set('sliver_id', sliver_id) # add the sliver type elemnt - PGv1Sliver.add_slivers(node_elem, sliver) + PGv2SliverType.add_slivers(node_elem.element, sliver) # remove all nodes without slivers if not append: for node_elem in self.get_nodes(): - if not node['client_id']: - parent = node.getparent() - parent.remove(node_elem) + if not node_elem['client_id']: + parent = node_elem.element.getparent() + parent.remove(node_elem.element) def remove_slivers(self, slivers, network=None, no_dupes=False): PGv2Node.remove_slivers(self.xml, slivers) @@ -163,6 +174,14 @@ class PGv2(BaseVersion): def add_link_requests(self, link_tuples, append=False): PGv2Link.add_link_requests(self.xml.root, link_tuples, append) + # Leases + + def get_leases(self, filter=None): + return PGv2Lease.get_leases(self.xml, filter) + + def add_leases(self, leases, network = None, no_dupes=False): + PGv2Lease.add_leases(self.xml, leases) + # Utility def merge(self, in_rspec): @@ -171,12 +190,31 @@ class PGv2(BaseVersion): """ from sfa.rspecs.rspec import RSpec # just copy over all the child elements under the root element - if isinstance(in_rspec, RSpec): - in_rspec = in_rspec.toxml() + if isinstance(in_rspec, basestring): + in_rspec = RSpec(in_rspec) + + nodes = in_rspec.version.get_nodes() + # protogeni rspecs need to advertise the availabel sliver types + main_nodes = [] + for node in nodes: + if not node['component_name']: + # this node element is part of a lease + continue + if not node.has_key('sliver') or not node['sliver']: + node['sliver'] = {'name': 'plab-vserver'} + main_nodes.append(node) + self.add_nodes(main_nodes) + self.add_links(in_rspec.version.get_links()) + + # Leases + leases = in_rspec.version.get_leases() + self.add_leases(leases) + # + #rspec = RSpec(in_rspec) + #for child in rspec.xml.iterchildren(): + # self.xml.root.append(child) + - rspec = RSpec(in_rspec) - for child in rspec.root.iterchildren(): - self.xml.root.append(child) def cleanup(self): # remove unncecessary elements, attributes @@ -188,19 +226,19 @@ class PGv2Ad(PGv2): enabled = True content_type = 'ad' schema = 'http://www.protogeni.net/resources/rspec/2/ad.xsd' - template = '' + template = '' class PGv2Request(PGv2): enabled = True content_type = 'request' schema = 'http://www.protogeni.net/resources/rspec/2/request.xsd' - template = '' + template = '' class PGv2Manifest(PGv2): enabled = True content_type = 'manifest' schema = 'http://www.protogeni.net/resources/rspec/2/manifest.xsd' - template = '' + template = ''