Merge branch 'master' of ssh://git.planet-lab.org/git/sfa
authorTony Mack <tmack@paris.CS.Princeton.EDU>
Thu, 10 Nov 2011 17:47:41 +0000 (12:47 -0500)
committerTony Mack <tmack@paris.CS.Princeton.EDU>
Thu, 10 Nov 2011 17:47:41 +0000 (12:47 -0500)
sfa/plc/aggregate.py
sfa/rspecs/elements/element.py
sfa/rspecs/elements/sliver.py
sfa/util/sfatime.py
sfa/util/xml.py

index bda3bbc..ddd8353 100644 (file)
@@ -14,6 +14,7 @@ from sfa.rspecs.elements.pltag import PLTag
 from sfa.util.topology import Topology
 from sfa.rspecs.version_manager import VersionManager
 from sfa.plc.vlink import get_tc_rate
+from sfa.util.sfatime import epochparse
 
 class Aggregate:
 
@@ -225,6 +226,8 @@ class Aggregate:
 
         slice, slivers = self.get_slice_and_slivers(slice_xrn)
         rspec = RSpec(version=rspec_version, user_options=self.user_options)
+        if slice and 'expiration_date' in slice:
+            rspec.set('expires',  epochparse(slice['expiration_date'])) 
         rspec.version.add_nodes(self.get_nodes(slice), slivers)
         rspec.version.add_links(self.get_links(slice))
         
index 6757f8a..2b27d9e 100644 (file)
@@ -7,3 +7,17 @@ class Element(dict):
         dict.__init__(self, self.fields) 
         self.update(fields)
 
+    @staticmethod
+    def get(element_class, xml, xpath, namespaces=None):
+        elems = xml.xpath(xpath, namespaces)
+        generic_elems = [element_class(elem.attrib, elem) for elem in elems]
+        return generic_elems
+
+
+    @staticmethod
+    def add(xml, element_class, name, obj):
+        elem = xml.add_element(name)
+        for field in element_class.fields:
+            if field in obj and obj[field]:
+                elem.set(field, obj[field])
+        return elem
index bf2cc1f..cd63f02 100644 (file)
@@ -3,6 +3,7 @@ from sfa.rspecs.elements.element import Element
 class Sliver(Element):
     fields = {
         'sliver_id': None,
+        'component_id': None,
         'client_id': None,
         'name': None,
         'tags': [],
index 11cc566..c5c6a55 100644 (file)
@@ -1,6 +1,7 @@
 from types import StringTypes
 import dateutil.parser
 import datetime
+import time
 
 from sfa.util.sfalogging import logger
 
@@ -24,3 +25,5 @@ For safety this can also handle inputs that are either timestamps, or datetimes
     else:
         logger.error("Unexpected type in utcparse [%s]"%type(input))
 
+def epochparse(input):
+    return time.strftime("%Y-%d-%m-T%H:%M:%SZ", time.localtime(input)) 
index bdaf539..47de319 100755 (executable)
@@ -40,13 +40,16 @@ class XpathFilter:
 class XmlNode:
     def __init__(self, node, namespaces):
         self.node = node
+        self.text = node.text
         self.namespaces = namespaces
         self.attrib = node.attrib
+        
 
     def xpath(self, xpath, namespaces=None):
         if not namespaces:
             namespaces = self.namespaces 
-        return self.node.xpath(xpath, namespaces=namespaces)
+        elems = self.node.xpath(xpath, namespaces=namespaces)
+        return [XmlNode(elem, namespaces) for elem in elems]
     
     def add_element(name, *args, **kwds):
         element = etree.SubElement(name, args, kwds)
@@ -65,6 +68,9 @@ class XmlNode:
             parent = element.getparent()
             parent.remove(element)
 
+    def remove(element):
+        self.node.remove(element)
+
     def set(self, key, value):
         self.node.set(key, value)
     
@@ -73,7 +79,10 @@ class XmlNode:
     
     def unset(self, key):
         del self.node.attrib[key]
-   
+  
+    def iterchildren(self):
+        return self.node.iterchildren()
+     
     def toxml(self):
         return etree.tostring(self.node, encoding='UTF-8', pretty_print=True)