bugfixes
authorTony Mack <tmack@paris.CS.Princeton.EDU>
Wed, 16 Nov 2011 03:26:43 +0000 (22:26 -0500)
committerTony Mack <tmack@paris.CS.Princeton.EDU>
Wed, 16 Nov 2011 03:26:43 +0000 (22:26 -0500)
sfa/client/sfiAddSliver.py
sfa/plc/aggregate.py
sfa/rspecs/elements/versions/pgv2Node.py
sfa/rspecs/elements/versions/pgv2SliverType.py
sfa/rspecs/elements/versions/sfav1Node.py
sfa/rspecs/elements/versions/sfav1Sliver.py
sfa/rspecs/versions/pgv2.py
sfa/rspecs/versions/sfav1.py
sfa/util/xml.py

index 7e3ce2c..84ffa8b 100755 (executable)
@@ -36,9 +36,8 @@ try:
     version_num = ad_rspec.version.version
     request_version = version_manager._get_version(type, version_num, 'request')    
     request_rspec = RSpec(version=request_version)
-    slivers = [{'hostname': node} for node in nodes]
     request_rspec.version.merge(ad_rspec)
-    request_rspec.version.add_slivers(slivers)
+    request_rspec.version.add_slivers(nodes)
 except:
     logger.log_exc("sfiAddSliver failed with nodes %s" % nodes)
     sys.exit(1)
index 40e53aa..c1f008f 100644 (file)
@@ -195,7 +195,7 @@ class Aggregate:
             for if_id in node['interface_ids']:
                 interface = Interface(interfaces[if_id]) 
                 interface['ipv4'] = interface['ipv4']
-                interface['component_id'] = PlXrn(auth=self.api.hrn, interface='node%s:eth%s' % (node['node_id'], if_count))
+                interface['component_id'] = PlXrn(auth=self.api.hrn, interface='node%s:eth%s' % (node['node_id'], if_count)).get_urn()
                 rspec_node['interfaces'].append(interface)
                 if_count+=1
 
index f0a0a7b..e5ec58b 100644 (file)
@@ -1,9 +1,9 @@
 from sfa.util.plxrn import PlXrn, xrn_to_hostname
 from sfa.util.xrn import Xrn
+from sfa.util.xml import XpathFilter
 from sfa.rspecs.elements.element import Element
 from sfa.rspecs.elements.node import Node
 from sfa.rspecs.elements.sliver import Sliver
-from sfa.rspecs.elements.network import Network
 from sfa.rspecs.elements.location import Location
 from sfa.rspecs.elements.hardware_type import HardwareType
 from sfa.rspecs.elements.disk_image import DiskImage
@@ -31,7 +31,7 @@ class PGv2Node:
             # set location       
             location_elems = Element.add_elements(node_elem, 'location', node.get('location', []), Location.fields)
             # set interfaces
-            interface_elems = Element.add_elements(node_elem, 'interface', node.get('interfaces', []), Interface.fields)
+            interface_elems = Element.add_elements(node_elem, 'interface', node.get('interfaces', []), ['component_id', 'client_id', 'ipv4'])
             # set available element
             if node.get('boot_state', '').lower() == 'boot':
                 available_elem = node_elem.add_element('available', now='True')
@@ -59,13 +59,13 @@ class PGv2Node:
         return PGv2Node.get_node_objs(node_elems)
 
     @staticmethod
-    def get_nodes_with_sliver(xml, filter={}):
+    def get_nodes_with_slivers(xml, filter={}):
         xpath = '//node/sliver_type | //default:node/default:sliver_type' 
         node_elems = xml.xpath(xpath)        
         return PGv2Node.get_node_objs(node_elems)
 
     @staticmethod
-    def get_nodes_objs(node_elems):
+    def get_node_objs(node_elems):
         nodes = []
         for node_elem in node_elems:
             node = Node(node_elem.attrib, node_elem)
@@ -74,15 +74,15 @@ class PGv2Node:
                 node['authority_id'] = Xrn(node_elem.attrib['component_id']).get_authority_urn()
 
             node['hardware_types'] = Element.get_elements(node_elem, './default:hardwate_type | ./hardware_type', HardwareType)
-            lolocation_elems = Element.get_elements(node_elem, './default:location | ./location', Location)
+            location_elems = Element.get_elements(node_elem, './default:location | ./location', Location)
             if len(location_elems) > 0:
                 node['location'] = location_elems[0]
             node['interfaces'] = Element.get_elements(node_elem, './default:interface | ./interface', Interface)
             node['services'] = PGv2Services.get_services(node_elem)
             node['slivers'] = PGv2SliverType.get_slivers(node_elem)    
-            available = Element.get_elements(node_element, './default:available | ./available', fields=['now'])
-            if len(available) > 0 and 'name' in available[0].attrib:
-                if available[0].attrib.get('now', '').lower() == 'true': 
+            available_elem = Element.get_elements(node_elem, './default:available | ./available', fields=['now'])
+            if len(available_elem) > 0 and 'name' in available_elem[0]:
+                if available_elem[0].get('now', '').lower() == 'true': 
                     node['boot_state'] = 'boot'
                 else: 
                     node['boot_state'] = 'disabled' 
index 7ea9d1d..c071532 100644 (file)
@@ -29,7 +29,7 @@ class PGv2SliverType:
         sliver_elems = xml.xpath(xpath)
         slivers = []
         for sliver_elem in sliver_elems:
-            sliver = Sliver(sliver_elem.attrib,sliver_elm)
+            sliver = Sliver(sliver_elem.attrib,sliver_elem)
             if 'component_id' in xml.attrib:     
                 sliver['component_id'] = xml.attrib['component_id']
             slivers.append(sliver)
index f93ff32..f62cc71 100644 (file)
@@ -2,7 +2,6 @@ from sfa.util.sfalogging import logger
 from sfa.util.xml import XpathFilter
 from sfa.util.plxrn import PlXrn, xrn_to_hostname
 from sfa.util.xrn import Xrn
-
 from sfa.rspecs.elements.element import Element
 from sfa.rspecs.elements.node import Node
 from sfa.rspecs.elements.sliver import Sliver
@@ -54,7 +53,7 @@ class SFAv1Node:
             location_elems = Element.add_elements(node_elem, 'location',
                                                   node.get('location', []), Location.fields)
             interface_elems = Element.add_elements(node_elem, 'interface', 
-                                                   node.get('interfaces', []), Interface.fields)
+                                                   node.get('interfaces', []), ['component_id', 'client_id', 'ipv4'])
             
             #if 'bw_unallocated' in node and node['bw_unallocated']:
             #    bw_unallocated = etree.SubElement(node_elem, 'bw_unallocated', units='kbps').text = str(int(node['bw_unallocated'])/1000)
index 20ffdf8..d0a7592 100644 (file)
@@ -39,4 +39,4 @@ class SFAv1Sliver:
 
     @staticmethod
     def get_sliver_attributes(xml, filter={}):
-        return SFAv1PLTag.get_pl_tags(xml, ignore=Sliver.fields.keys())     
+        return SFAv1PLTag.get_pl_tags(xml, ignore=Sliver.fields)     
index d1d7f5f..ceff971 100644 (file)
@@ -2,7 +2,7 @@ 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.rspecs.baseversion import BaseVersion
 from sfa.rspecs.elements.versions.pgv2Link import PGv2Link
 from sfa.rspecs.elements.versions.pgv2Node import PGv2Node
 from sfa.rspecs.elements.versions.pgv2SliverType import PGv2SliverType
@@ -47,26 +47,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:
@@ -125,26 +121,28 @@ class PGv2(BaseVersion):
 
             # remove existing sliver_type tags
             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 = urn_to_sliver_id(sliver_urn, slice_id, node_id)
+                #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) 
index 35d17f7..85aa86e 100644 (file)
@@ -4,11 +4,11 @@ from lxml import etree
 from sfa.util.sfalogging import logger
 from sfa.util.xrn import hrn_to_urn, urn_to_hrn
 from sfa.util.plxrn import PlXrn
-
 from sfa.rspecs.baseversion import BaseVersion
 from sfa.rspecs.elements.element import Element
 from sfa.rspecs.elements.versions.pgv2Link import PGv2Link
 from sfa.rspecs.elements.versions.sfav1Node import SFAv1Node
+from sfa.rspecs.elements.versions.sfav1Sliver import SFAv1Sliver
 
 class SFAv1(BaseVersion):
     enabled = True
@@ -73,15 +73,19 @@ class SFAv1(BaseVersion):
         return self.attributes_list_thierry(defaults)
 
     def get_sliver_attributes(self, hostname, network=None):
-        node = self.get_node_element(hostname, network)
-        #sliver = node.find("sliver")
-        slivers = node.xpath('./sliver')
-        if not slivers: return []
-        return self.attributes_list_thierry(slivers[0])
+        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', 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()
         for default_attribute in self.get_default_sliver_attributes(network):
             attribute = {'name': str(default_attribute[0]), 
                          'value': str(default_attribute[1]), 
@@ -112,14 +116,14 @@ class SFAv1(BaseVersion):
             if not node_elems: 
                 continue
             node_elem = node_elems[0]
-            SFAv1Sliver.add_slivers(node_elem, sliver)   
+            SFAv1Sliver.add_slivers(node_elem.element, sliver)   
 
         # remove all nodes without slivers
         if not append:
             for node_elem in self.get_nodes():
-                if not node['slivers']:
-                    parent = node.getparent()
-                    parent.remove(node_elem)
+                if not node_elem['slivers']:
+                    parent = node_elem.element.getparent()
+                    parent.remove(node_elem.element)
 
 
     def remove_slivers(self, slivers, network=None, no_dupes=False):
index 9d5f52c..bb298a3 100755 (executable)
@@ -64,7 +64,7 @@ class XmlNode:
     def getparent(self):
         return XmlNode(self.node.getparent(), self.namespaces)
 
-    def remove_elements(name):
+    def remove_elements(self, name):
         """
         Removes all occurences of an element from the tree. Start at
         specified root_node if specified, otherwise start at tree's root.
@@ -77,8 +77,11 @@ class XmlNode:
             parent = element.getparent()
             parent.remove(element)
 
-    def remove(element):
-        self.node.remove(element)
+    def remove(self, element):
+        if isinstance(element, XmlNode):
+            self.node.remove(element.node)
+        else:
+            self.node.remove(element)
 
     def get(self, key, *args):
         return self.node.get(key, *args)