X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Frspecs%2Fversions%2Fpgv2.py;h=9ac4d37c434092d136bd74b8bb7f9d93ce5127af;hb=1461ea22225041a799855f95c693224154f09a94;hp=60387dcc4f4df5d8a4048b03af88eb93b7fbee6f;hpb=81ec6a0c9ab0e8907af3a8d59fcb6f941aca400b;p=sfa.git diff --git a/sfa/rspecs/versions/pgv2.py b/sfa/rspecs/versions/pgv2.py index 60387dcc..9ac4d37c 100644 --- a/sfa/rspecs/versions/pgv2.py +++ b/sfa/rspecs/versions/pgv2.py @@ -1,13 +1,12 @@ from copy import deepcopy from StringIO import StringIO from sfa.util.xrn import Xrn, urn_to_sliver_id -from sfa.util.plxrn import hostname_to_urn, xrn_to_hostname -from sfa.rspecs.baseversion import BaseVersion +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 -class PGv2(BaseVersion): +class PGv2(RSpecVersion): type = 'ProtoGENI' content_type = 'ad' version = '2' @@ -16,19 +15,26 @@ 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 + # Networks def get_networks(self): - networks = set() - nodes = self.xml.xpath('//default:node[@component_manager_id]', namespaces=self.namespaces) - for node in nodes: - if 'component_manager_id' in node: - network_urn = node.get('component_manager_id') - network_hrn = Xrn(network_urn).get_hrn()[0] - networks.add({'name': network_hrn}) - return list(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 @@ -114,10 +120,18 @@ 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.element.remove(sliver_type.element) @@ -167,12 +181,24 @@ 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 + for node in nodes: + if not node.has_key('sliver') or not node['sliver']: + node['sliver'] = {'name': 'plab-vserver'} + + self.add_nodes(nodes) + self.add_links(in_rspec.version.get_links()) + + # + #rspec = RSpec(in_rspec) + #for child in rspec.xml.iterchildren(): + # self.xml.root.append(child) + - rspec = RSpec(in_rspec) - for child in rspec.xml.iterchildren(): - self.xml.root.append(child) def cleanup(self): # remove unncecessary elements, attributes @@ -184,19 +210,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 = ''