changes to work with latest rspec versions, try create at aggregates for protogeni...
[sface.git] / sface / sfidata.py
index 5de402a..57a6260 100644 (file)
@@ -4,10 +4,63 @@ from PyQt4.QtCore import *
 from PyQt4.QtGui import *
 
 from lxml import etree
+from sfa.util.xrn import hrn_to_urn, urn_to_hrn
 from sfa.util.record import SfaRecord, SliceRecord, AuthorityRecord, UserRecord
-from sfa.rspecs.rspec_parser import parse_rspec
+from sfa.rspecs.rspec import RSpec
 from sface.config import config
 
+# SfaceRSpec
+# temporary, until these references are tracked down and replaced with
+# rspec.version
+
+class SfaceRSpec(RSpec):
+    def __init__(self, rspec="", version=None, user_options={}):
+        RSpec.__init__(self, rspec, version, user_options)
+
+    def get_networks(self):
+        return self.version.get_networks()
+
+    def get_nodes(self, network):
+        return self.version.get_nodes(network)
+
+    def get_nodes_with_slivers(self, network):
+        return self.version.get_nodes_with_slivers(network)
+
+    def get_node_element(self, node, network=None):
+        return self.version.get_node_element(node, network)
+
+    def get_default_sliver_attributes(self, network):
+        return self.version.get_default_sliver_attributes(network)
+
+    def get_sliver_attributes(self, node, network):
+        return self.version.get_sliver_attributes(node, network)
+
+    def remove_slivers(self, slivers, network=None, no_dupes=False):
+        return self.version.remove_slivers(slivers, network, no_dupes)
+
+    #def add_slivers(self, slivers, network=None, sliver_urn=None, no_dupes=False):
+    #    return self.version.add_slivers(slivers, network, sliver_urn, no_dupes)
+
+    def merge_node(self, source_node_tag, network, no_dupes=False):
+        return self.version.merge_node(source_node_tag, network, no_dupes)
+
+    # sfav1.add_slivers isn't working for us...
+    def add_slivers(self, slivers, network=None, sliver_urn=None, no_dupes=False):
+        # add slice name to network tag
+        network_tags = self.xml.xpath('//network')
+        if network_tags:
+            network_tag = network_tags[0]
+            network_tag.set('slice', urn_to_hrn(sliver_urn)[0])
+
+        # 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')
+            if 'tags' in sliver:
+                for tag in sliver['tags']:
+                    etree.SubElement(sliver_elem, tag['tagname']).text = value=tag['value']
+
 class SfiData:
     def __init__(self):
         pass
@@ -70,7 +123,7 @@ class SfiData:
         rspec_file = config.getSliceRSpecFile()
         if os.path.exists(rspec_file):
             xml = open(rspec_file).read()
-            rspec = parse_rspec(xml)
+            rspec = SfaceRSpec(rspec=xml) #rspec = parse_rspec(xml)
 
             self.purgeNonSliceResources(rspec)
 
@@ -81,7 +134,8 @@ class SfiData:
         rspec_file = config.getResourcesRSpecFile()
         if os.path.exists(rspec_file):
             xml = open(rspec_file).read()
-            return parse_rspec(xml)
+            rspec = SfaceRSpec(rspec=xml) #rspec= parse_rspec(xml)
+            return rspec
         return None
 
     def getSliverStatus(self, slice=None):
@@ -96,4 +150,12 @@ class SfiData:
 
         return None
 
+    def getSliceMgrVersion(self):
+        filename = config.fullpath("slicemgr.version")
+
+        if os.path.exists(filename):
+            data = open(filename).read()
+            return pickle.loads(data)
+
+        return None