various fixes - passes tests in sfav1 mode
authorThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Tue, 15 Nov 2011 15:39:49 +0000 (16:39 +0100)
committerThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Tue, 15 Nov 2011 15:39:49 +0000 (16:39 +0100)
sfa/managers/aggregate_manager.py
sfa/rspecs/elements/versions/sfav1Node.py
sfa/rspecs/versions/sfav1.py
sfa/util/xml.py

index 14ec7d0..30ebd92 100644 (file)
@@ -2,6 +2,7 @@ import datetime
 import time
 import sys
 
+from sfa.util.sfalogging import logger
 from sfa.util.faults import RecordNotFound, SliverDoesNotExist
 from sfa.util.xrn import get_authority, hrn_to_urn, urn_to_hrn, Xrn, urn_to_sliver_id
 from sfa.util.plxrn import slicename_to_hrn, hrn_to_pl_slicename
@@ -187,7 +188,7 @@ class AggregateManager:
         slices.verify_slice_attributes(slice, requested_attributes)
         
         # add/remove slice from nodes
-        requested_slivers = [node['component_name'] for node in rspec.version.get_nodes_with_slivers()]
+        requested_slivers = [node.get('component_name') for node in rspec.version.get_nodes_with_slivers()]
         slices.verify_slice_nodes(slice, requested_slivers, peer) 
    
         # add/remove links links 
index 838ae12..f93ff32 100644 (file)
@@ -1,7 +1,8 @@
-
+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
@@ -95,6 +96,21 @@ class SFAv1Node:
         node_elems = xml.xpath(xpath)
         return SFAv1Node.get_node_objs(node_elems)
 
+    # xxx Thierry : an ugly hack to get the tests to pass again
+    # probably this needs to be trashed
+    # the original code returned the <sliver /> tag, 
+    # but we prefer the <node> father node instead as it already holds data
+    # initially this was to preserve the nodename...
+    # xxx I don't get the ' | //default:node/default:sliver' ...
+    @staticmethod
+    def get_nodes_with_slivers_thierry(xml):
+        # dropping the ''
+        xpath = '//node[count (sliver)>0]'
+        node_elems = xml.xpath(xpath)
+        #  we need to check/recompute the node data 
+        
+        return node_elems
+
     @staticmethod
     def get_nodes_with_slivers(xml):
         xpath = '//node/sliver | //default:node/default:sliver' 
index dd03121..15ef89e 100644 (file)
@@ -1,7 +1,10 @@
 from copy import deepcopy
 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
@@ -26,12 +29,29 @@ class SFAv1(BaseVersion):
     def get_nodes(self, network=None):
         return SFAv1Node.get_nodes(self.xml)
 
+    def get_node_element(self,hostname,network):
+        if network is not None:
+            xpath="//network[@name='%s']/node[@component_id[contains(., '%s')]]" % (network,hostname)
+        else: xpath="//node[@component_id[contains(., '%s')]]" % (hostname)
+        nodes=self.xml.xpath(xpath)
+        print 'found %d nodes'%len(nodes)
+        if nodes:       return nodes[0]
+        else:           return None
+
     def get_nodes_with_slivers(self, network = None):
-        return SFAv1Node.get_nodes_with_slivers(self.xml)
+        return SFAv1Node.get_nodes_with_slivers_thierry(self.xml)
+
+    # xxx thierry - this seems more like it
+    # warning, the same code is duplicated in xml.py and pgv2.py..
+    def attributes_list_thierry (self, elem):
+        opts=[]
+        for (k,v) in elem.items():
+            opts.append ( (k,v.strip(),) )
+        return opts
 
     def attributes_list(self, elem):
         # convert a list of attribute tags into list of tuples
-        # (tagnme, text_value)
+        # (tagname, text_value)
         opts = []
         if elem is not None:
             for e in elem:
@@ -43,27 +63,27 @@ class SFAv1(BaseVersion):
             defaults = self.xml.xpath("//network[@name='%s']/sliver_defaults" % network)
         else:
             defaults = self.xml.xpath("//sliver_defaults")
-        if isinstance(defaults, list) and defaults:
-            defaults = defaults[0]
-        return self.attributes_list(defaults)
+        if not defaults: return []
+        return self.attributes_list_thierry(defaults)
 
     def get_sliver_attributes(self, hostname, network=None):
-        attributes = []
         node = self.get_node_element(hostname, network)
         #sliver = node.find("sliver")
         slivers = node.xpath('./sliver')
-        if isinstance(slivers, list) and slivers:
-            attributes = self.attributes_list(slivers[0])
-        return attributes
+        if not slivers: return []
+        return self.attributes_list_thierry(slivers[0])
 
     def get_slice_attributes(self, network=None):
         slice_attributes = []
         nodes_with_slivers = self.get_nodes_with_slivers(network)
         for default_attribute in self.get_default_sliver_attributes(network):
-            attribute = {'name': str(default_attribute[0]), 'value': str(default_attribute[1]), 'node_id': None}
+            attribute = {'name': str(default_attribute[0]), 
+                         'value': str(default_attribute[1]), 
+                         'node_id': None}
             slice_attributes.append(attribute)
         for node in nodes_with_slivers:
-            sliver_attributes = self.get_sliver_attributes(node, network)
+            nodename=node.get('component_name')
+            sliver_attributes = self.get_sliver_attributes(nodename, network)
             for sliver_attribute in sliver_attributes:
                 attribute = {'name': str(sliver_attribute[0]), 'value': str(sliver_attribute[1]), 'node_id': node}
                 slice_attributes.append(attribute)
@@ -117,17 +137,20 @@ class SFAv1(BaseVersion):
             network_tag.set('slice', urn_to_hrn(sliver_urn)[0])
         
         all_nodes = self.get_nodes()
+        all_nodenames = [ n['component_name'] for n in all_nodes ]
         nodes_with_slivers = [sliver['hostname'] for sliver in slivers]
-        nodes_without_slivers = set(all_nodes).difference(nodes_with_slivers)
+        nodes_without_slivers = set(all_nodenames).difference(set(nodes_with_slivers))
         
         # add slivers
         for sliver in slivers:
             node_elem = self.get_node_element(sliver['hostname'], network)
             if not node_elem: continue
-            sliver_elem = etree.SubElement(node_elem, 'sliver')
+#thierry    sliver_elem = etree.SubElement(node_elem, 'sliver')
+            sliver_elem = node_elem.add_element('sliver')
             if 'tags' in sliver:
                 for tag in sliver['tags']:
-                    etree.SubElement(sliver_elem, tag['tagname']).text = value=tag['value']
+#thierry            etree.SubElement(sliver_elem, tag['tagname']).text = value=tag['value']
+                    sliver_elem.add_element (tag['tagname'],{'text':tag['value']})
             
         # remove all nodes without slivers
         if not append:
index 2ededa9..3b19491 100755 (executable)
@@ -77,6 +77,11 @@ class XmlNode:
     def remove(element):
         self.node.remove(element)
 
+    def get(self, key, *args):
+        return self.node.get(key, *args)
+
+    def items(self): return self.node.items()
+
     def set(self, key, value):
         self.node.set(key, value)