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)
     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.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)
 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']
             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
 
                 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.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.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
 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
             # 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')
             # 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
         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
         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)
         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)
                 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)    
             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' 
                     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_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)
             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.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
 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', 
             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)
             
             #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={}):
 
     @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 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
 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))
 
         # 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):
     # 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 = []
 
     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:
         # 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', []):
 
             # 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
 
             # set the client id
-            node.set('client_id', hostname)
+            node_elem.element.set('client_id', hostname)
             if sliver_urn:
             if sliver_urn:
+                pass
+                # TODO
                 # set the sliver id
                 # 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    
 
             # 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():
 
         # 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) 
 
     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.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.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
 
 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):
         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 = []
 
     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]), 
         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]
             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():
 
         # 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):
 
 
     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 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.
         """
         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)
 
             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)
 
     def get(self, key, *args):
         return self.node.get(key, *args)