X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Frspecs%2Fversions%2Fslabv1.py;h=39adddacefccc0ddae4bcb37ab7d1c5c79be48c5;hb=1cc8e9613cab8b5b22478de369f259e591c54e6d;hp=8c1030c68e6c41f50c62a4353f4bf4b30685e806;hpb=7d3140aa22406b54c32e0a830e969cfe4b699828;p=sfa.git diff --git a/sfa/rspecs/versions/slabv1.py b/sfa/rspecs/versions/slabv1.py index 8c1030c6..39adddac 100644 --- a/sfa/rspecs/versions/slabv1.py +++ b/sfa/rspecs/versions/slabv1.py @@ -1,13 +1,18 @@ 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 +import sys +from sfa.rspecs.elements.versions.slabv1Lease import Slabv1Lease from sfa.rspecs.elements.versions.slabv1Node import Slabv1Node from sfa.rspecs.elements.versions.slabv1Sliver import Slabv1Sliver + + +from sfa.rspecs.elements.versions.sfav1Lease import SFAv1Lease + +from sfa.util.sfalogging import logger -class Slabv1(BaseVersion): +class Slabv1(RSpecVersion): #enabled = True type = 'Slab' content_type = 'ad' @@ -25,7 +30,10 @@ class Slabv1(BaseVersion): # Network def get_networks(self): - network_elems = self.xml.xpath('//network') + #WARNING Added //default:network to the xpath + #otherwise network element not detected 16/07/12 SA + + network_elems = self.xml.xpath('//network | //default:network') networks = [network_elem.get_instance(fields=['name', 'slice']) for \ network_elem in network_elems] return networks @@ -47,52 +55,72 @@ class Slabv1(BaseVersion): def get_nodes_with_slivers(self): return Slabv1Node.get_nodes_with_slivers(self.xml) - + + def get_slice_timeslot(self ): + return Slabv1Timeslot.get_slice_timeslot(self.xml) + + def add_connection_information(self, ldap_username, sites_set): + return Slabv1Node.add_connection_information(self.xml,ldap_username, sites_set) + def add_nodes(self, nodes, check_for_dupes=False): - return Slabv1Node.add_nodes(self.xml, nodes) + return Slabv1Node.add_nodes(self.xml,nodes ) 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 + logger.debug("SLABV1 merge_node") + #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)) # Slivers - def get_sliver_attributes(self, hostname, network=None): + def get_sliver_attributes(self, hostname, node, network=None): + print>>sys.stderr, "\r\n \r\n \r\n \t\t SLABV1.PY get_sliver_attributes hostname %s " %(hostname) nodes = self.get_nodes({'component_id': '*%s*' %hostname}) - attribs = [] + attribs = [] + print>>sys.stderr, "\r\n \r\n \r\n \t\t SLABV1.PY get_sliver_attributes-----------------nodes %s " %(nodes) 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 node : + #sliver = node.xpath('./default:sliver | ./sliver') + #sliver = node.xpath('./default:sliver', namespaces=self.namespaces) + sliver = node['slivers'] + if sliver is not None and isinstance(sliver, list) and len(sliver) > 0: sliver = sliver[0] + attribs = sliver #attribs = self.attributes_list(sliver) + print>>sys.stderr, "\r\n \r\n \r\n \t\t SLABV1.PY get_sliver_attributes----------NN------- sliver %s self.namespaces %s attribs %s " %(sliver, self.namespaces,attribs) return attribs def get_slice_attributes(self, network=None): + slice_attributes = [] + 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: - sliver_attributes = self.get_sliver_attributes(node, network) + sliver_attributes = self.get_sliver_attributes(node['component_id'],node, network) for sliver_attribute in sliver_attributes: - name=str(sliver_attribute[0]) - text =str(sliver_attribute[1]) + 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 'info' in name: + #attribute = {'name': 'flack_info', 'value': str(attribs), 'node_id': node} + #slice_attributes.append(attribute) + #elif 'initscript' in name: + if '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 @@ -112,6 +140,7 @@ class Slabv1(BaseVersion): def add_slivers(self, hostnames, attributes=[], sliver_urn=None, append=False): # all nodes hould already be present in the rspec. Remove all # nodes that done have slivers + print>>sys.stderr, "\r\n \r\n \r\n \t\t\t SLABv1.PY add_slivers ----->get_node " for hostname in hostnames: node_elems = self.get_nodes({'component_id': '*%s*' % hostname}) if not node_elems: @@ -119,6 +148,7 @@ class Slabv1(BaseVersion): node_elem = node_elems[0] # determine sliver types for this node + #TODO : add_slivers valid type of sliver needs to be changed 13/07/12 SA valid_sliver_types = ['slab-node', 'emulab-openvz', 'raw-pc', 'plab-vserver', 'plab-vnode'] #valid_sliver_types = ['emulab-openvz', 'raw-pc', 'plab-vserver', 'plab-vnode'] requested_sliver_type = None @@ -130,7 +160,7 @@ class Slabv1(BaseVersion): continue sliver = {'type': requested_sliver_type, 'pl_tags': attributes} - + print>>sys.stderr, "\r\n \r\n \r\n \t\t\t SLABv1.PY add_slivers node_elem %s sliver_type %s \r\n \r\n " %(node_elem, sliver_type) # remove available element for available_elem in node_elem.xpath('./default:available | ./available'): node_elem.remove(available_elem) @@ -154,8 +184,9 @@ class Slabv1(BaseVersion): #sliver_id = urn_to_sliver_id(sliver_urn, slice_id, node_id) #node_elem.set('sliver_id', sliver_id) - # add the sliver type elemnt - Slabv1SliverType.add_slivers(node_elem.element, sliver) + # add the sliver type elemnt + Slabv1Sliver.add_slivers(node_elem.element, sliver) + #Slabv1SliverType.add_slivers(node_elem.element, sliver) # remove all nodes without slivers if not append: @@ -166,35 +197,51 @@ class Slabv1(BaseVersion): def remove_slivers(self, slivers, network=None, no_dupes=False): Slabv1Node.remove_slivers(self.xml, slivers) - - - + + # Utility - + def merge(self, in_rspec): """ Merge contents for specified rspec with current rspec """ - from sfa.rspecs.rspec import RSpec - # just copy over all the child elements under the root element - 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': 'slab-node'} - - 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) + + if not in_rspec: + return + from sfa.rspecs.rspec import RSpec + + if isinstance(in_rspec, RSpec): + rspec = in_rspec + else: + rspec = RSpec(in_rspec) + if rspec.version.type.lower() == 'protogeni': + from sfa.rspecs.rspec_converter import RSpecConverter + in_rspec = RSpecConverter.to_sfa_rspec(rspec.toxml()) + rspec = RSpec(in_rspec) + # just copy over all networks + #Attention special get_networks using //default:network xpath + current_networks = self.get_networks() + networks = rspec.version.get_networks() + for network in networks: + current_network = network.get('name') + if current_network and current_network not in current_networks: + self.xml.append(network.element) + current_networks.append(current_network) + + + + + # Leases + + def get_leases(self, lease_filter=None): + return SFAv1Lease.get_leases(self.xml, lease_filter) + #return Slabv1Lease.get_leases(self.xml, lease_filter) + + def add_leases(self, leases, network = None, no_dupes=False): + SFAv1Lease.add_leases(self.xml, leases) + #Slabv1Lease.add_leases(self.xml, leases) def cleanup(self): # remove unncecessary elements, attributes @@ -215,36 +262,14 @@ class Slabv1Request(Slabv1): content_type = 'request' schema = 'http://senslab.info/resources/rspec/1/request.xsd' #http://www.geni.net/resources/rspec/3/request.xsd - template = '' + template = '' class Slabv1Manifest(Slabv1): enabled = True content_type = 'manifest' schema = 'http://senslab.info/resources/rspec/1/manifest.xsd' #http://www.geni.net/resources/rspec/3/manifest.xsd - template = '' -#class Slabv1Ad(Slabv1): - #enabled = True - #content_type = 'ad' - #schema = 'http://senslab.info/resources/rspec/1/ad.xsd' - ##http://www.geni.net/resources/rspec/3/ad.xsd' - #template = '' - -#class Slabv1Request(Slabv1): - #enabled = True - #content_type = 'request' - #schema = 'http://senslab.info/resources/rspec/1/request.xsd' - ##http://www.geni.net/resources/rspec/3/request.xsd - #template = '' - -#class Slabv1Manifest(Slabv1): - #enabled = True - #content_type = 'manifest' - #schema = 'http://senslab.info/resources/rspec/1/manifest.xsd' - ##http://www.geni.net/resources/rspec/3/manifest.xsd - #template = '' - - + template = '' if __name__ == '__main__':