remove timezone info from credential expiration before validating
[sfa.git] / sfa / rspecs / sfa_rspec.py
index 7663e0c..7f0cd36 100755 (executable)
@@ -4,14 +4,25 @@ from StringIO import StringIO
 from sfa.rspecs.rspec import RSpec 
 from sfa.util.xrn import *
 from sfa.util.plxrn import hostname_to_urn
-from sfa.util.config import Config  
+from sfa.util.config import Config
+from sfa.rspecs.rspec_version import RSpecVersion  
 
 
+_version = { 'type': 'SFA', 
+             'version': '1' 
+}
+
+sfa_rspec_version = RSpecVersion(_version)
+
 class SfaRSpec(RSpec):
     xml = None
     header = '<?xml version="1.0"?>\n'
-    namespaces = {}
-    format = 'sfa'
+    version = sfa_rspec_version
+
+    def create(self):
+        RSpec.create(self)
+        self.xml.set('type', 'SFA')
+
     ###################
     # Parser
     ###################
@@ -31,22 +42,29 @@ class SfaRSpec(RSpec):
                 return name.getparent()
         return None
  
-    def get_node_elements(self):
-        return self.xml.xpath('//node')
+    def get_node_elements(self, network=None):
+        if network:
+            return self.xml.xpath('//network[@name="%s"]//node' % network)
+        else:
+            return self.xml.xpath('//node')
 
     def get_nodes(self, network=None):
         if network == None:
             nodes = self.xml.xpath('//node/hostname/text()')
         else:
             nodes = self.xml.xpath('//network[@name="%s"]//node/hostname/text()' % network)
+
+        nodes = [node.strip() for node in nodes]
         return nodes
 
     def get_nodes_with_slivers(self, network = None):
         if network:
-            return self.xml.xpath('//network[@name="%s"]//node[sliver]/hostname/text()' % network)   
+            nodes =  self.xml.xpath('//network[@name="%s"]//node[sliver]/hostname/text()' % network)   
         else:
-            return self.xml.xpath('//node[sliver]/hostname/text()')
+            nodes = self.xml.xpath('//node[sliver]/hostname/text()')
 
+        nodes = [node.strip() for node in nodes]
+        return nodes     
     def get_nodes_without_slivers(self, network=None): 
         xpath_nodes_without_slivers = '//node[not(sliver)]/hostname/text()'
         xpath_nodes_without_slivers_in_network = '//network[@name="%s"]//node[not(sliver)]/hostname/text()' 
@@ -77,6 +95,10 @@ class SfaRSpec(RSpec):
         sliver = node.find("sliver")
         return self.attributes_list(sliver)
 
+    def get_slice_attributes(self, network=None):
+        # TODO: FINISH
+        return []
+
     def get_site_nodes(self, siteid, network=None):
         if network:
             nodes = self.xml.xpath('//network[@name="%s"]/site[@id="%s"]/node/hostname/text()' % \
@@ -189,11 +211,18 @@ class SfaRSpec(RSpec):
             if 'interfaces' in node:
                 for interface in node['interfaces']:
                     if 'bwlimit' in interface and interface['bwlimit']:
-                        bwlimit = etree.SubElement(node_tag, 'bwlimit', units='kbps').tet = str(interface['bwlimit']/1000)
+                        bwlimit = etree.SubElement(node_tag, 'bw_limit', units='kbps').text = str(interface['bwlimit']/1000)
             if 'tags' in node:
                 for tag in node['tags']:
-                   if tag['tagname'] in ['fcdistro', 'arch']:
-                        tag_element = etree.SubElement(node_tag, tag['tagname'], value=tag['value'])           
+                   # expose this hard wired list of tags, plus the ones that are marked 'sfa' in their category 
+                   if tag['tagname'] in ['fcdistro', 'arch'] or 'sfa' in tag['category'].split('/'):
+                        tag_element = etree.SubElement(node_tag, tag['tagname'], value=tag['value'])
+
+            if 'site' in node:
+                longitude = str(node['site']['longitude'])
+                latitude = str(node['site']['latitude'])
+                location = etree.SubElement(node_tag, 'location', country='unknown', \
+                                            longitude=longitude, latitude=latitude)                
 
     def add_interfaces(self, interfaces):
         pass     
@@ -201,35 +230,38 @@ class SfaRSpec(RSpec):
     def add_links(self, links):
         pass
     
-    def add_slivers(self, hostnames, network=None, no_dupes=False):
-        if not isinstance(hostnames, list):
-            hostnames = [hostnames]
-
+    def add_slivers(self, slivers, network=None, sliver_urn=None, no_dupes=False):
+        slivers = self._process_slivers(slivers)
         nodes_with_slivers = self.get_nodes_with_slivers(network)
-        for hostname in hostnames:
-            if hostname in nodes_with_slivers:
+        for sliver in slivers:
+            if sliver['hostname'] in nodes_with_slivers:
                 continue
-            node = self.get_node_element(hostname, network)
-            etree.SubElement(node, 'sliver')
-
-    def remove_slivers(self, hostnames, network=None, no_dupes=False):
-        if not isinstance(hostnames, list):
-            hostnames = [hostnames]
-        for hostname in hostnames:
-            node = self.get_node_element(hostname, network)
-            sliver = node.find('sliver')
-            if sliver != None:
-                node.remove(sliver)                 
+            node_elem = self.get_node_element(sliver['hostname'], network)
+            sliver_elem = etree.SubElement(node_elem, 'sliver')
+            if 'tags' in sliver:
+                for tag in sliver['tags']:
+                    etree.SubElement(sliver_elem, tag['tagname'], value=tag['value'])
+
+    def remove_slivers(self, slivers, network=None, no_dupes=False):
+        slivers = self._process_slivers(slivers)
+        for sliver in slivers:
+            node_elem = self.get_node_element(sliver['hostname'], network)
+            sliver_elem = node_elem.find('sliver')
+            if sliver_elem != None:
+                node_elem.remove(sliver_elem)
     
     def add_default_sliver_attribute(self, name, value, network=None):
         if network:
             defaults = self.xml.xpath("//network[@name='%s']/sliver_defaults" % network)
         else:
             defaults = self.xml.xpath("//sliver_defaults" % network)
-        if defaults is None:
-            defaults = etree.Element("sliver_defaults")
-            network = self.xml.xpath("//network[@name='%s']" % network)
-            network.insert(0, defaults)
+        if not defaults :
+            network_tag = self.xml.xpath("//network[@name='%s']" % network)
+            if isinstance(network_tag, list):
+                network_tag = network_tag[0]
+            defaults = self.add_element('sliver_defaults', attrs={}, parent=network_tag)
+        elif isinstance(defaults, list):
+            defaults = defaults[0]
         self.add_attribute(defaults, name, value)
 
     def add_sliver_attribute(self, hostname, name, value, network=None):