can run against library 2.0 or 2.1 (sqlalchemy) that has a new interface for dealing...
[sface.git] / sface / sfidata.py
index 0ba93cb..1a326c6 100644 (file)
@@ -1,3 +1,4 @@
+import json
 import os
 import pickle
 from PyQt4.QtCore import *
@@ -5,89 +6,9 @@ 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 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_default_sliver_attribute(self, name, value, network=None):
-        self.version.add_default_sliver_attribute(name, value, network)
-
-    def add_sliver_attribute(self, hostname, name, value, network=None):
-        self.version.add_sliver_attribute(hostname, name, value, network)
-
-    def remove_default_sliver_attribute(self, name, value, network=None):
-        self.version.remove_default_sliver_attribute(name, value, network)
-
-    def remove_sliver_attribute(self, hostname, name, value, network=None):
-        self.version.remove_sliver_attribute(hostname, name, value, network)
-
-    #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']
-
-    # these should be moved to SFAv1, etc.
-    def get_node_boot_state(self, node, network):
-        return self.get_node_element(node, network).attrib.get("boot_state","")
-
-    def get_node_sliver_type(self, node, network):
-        node = self.get_node_element(node, network)
-        if not node:
-            return ""
-
-        sliver_types = node.xpath("sliver_type")
-        if len(sliver_types)>0:
-            return sliver_types[0].attrib.get("name", "")
-
-        return ""
-
 class SfiData:
     def __init__(self):
         pass
@@ -110,25 +31,48 @@ class SfiData:
     def getSliceRecord(self):
         rec_file = config.getSliceRecordFile()
         if os.path.exists(rec_file):
-            xml = open(rec_file).read()
-            rec = SliceRecord()
-            rec.load_from_string(xml)
-            return rec
+            try:
+                from sfa.storage.record import SliceRecord
+                xml = open(rec_file).read()
+                rec = SliceRecord()
+                rec.load_from_string(xml)
+                return rec
+            except:
+                from sfa.storage.model import make_record
+                obj=make_record (xml=file(rec_file).read())
+                # consider as a dict for smooth transition
+                return obj.__dict__
         return None
 
     def getUserRecord(self):
         rec_file = config.getUserRecordFile()
         if os.path.exists(rec_file):
-            xml = open(rec_file).read()
-            rec = UserRecord()
-            rec.load_from_string(xml)
-            return rec
+            try:
+                from sfa.storage.record import SliceUser
+                xml = open(rec_file).read()
+                rec = UserRecord()
+                rec.load_from_string(xml)
+                return rec
+            except:
+                from sfa.storage.model import make_record
+                obj=make_record (xml=file(rec_file).read())
+                # consider as a dict for smooth transition
+                return obj.__dict__
         return None
 
     def getUserSliceHrns(self):
         rec = self.getUserRecord()
         if rec:
-            return rec.get_field("slices")
+            slices = rec.get_field("slices")
+            if (type(slices)!=list) or (len(slices)<1):
+                return []
+
+            # get_field("slices") is returning [{"text": name}, {"text": name}, ...]
+            if (type(slices[0])==dict):
+                if "text" in slices[0]:
+                    slices = [x["text"] for x in slices]
+
+            return slices
 
         return []
 
@@ -150,9 +94,11 @@ class SfiData:
         rspec_file = config.getSliceRSpecFile()
         if os.path.exists(rspec_file):
             xml = open(rspec_file).read()
-            rspec = SfaceRSpec(rspec=xml) #rspec = parse_rspec(xml)
 
-            self.purgeNonSliceResources(rspec)
+            if (xml.strip()==""):
+               return None
+
+            rspec = RSpec(rspec=xml)
 
             return rspec
         return None
@@ -161,7 +107,11 @@ class SfiData:
         rspec_file = config.getResourcesRSpecFile()
         if os.path.exists(rspec_file):
             xml = open(rspec_file).read()
-            rspec = SfaceRSpec(rspec=xml) #rspec= parse_rspec(xml)
+
+            if (xml.strip()==""):
+                return None
+
+            rspec = RSpec(rspec=xml)
             return rspec
         return None
 
@@ -169,11 +119,21 @@ class SfiData:
         if not slice:
             slice = config.getSlice()
 
+        if not slice:
+            return None
+
         filename = config.fullpath(slice+".sliverstatus")
 
         if os.path.exists(filename):
             data = open(filename).read()
-            return pickle.loads(data)
+            try:
+                if hasattr(json, "loads"):
+                     return json.loads(data)   # python 2.6
+                else:
+                     return json.read(data)    # python 2.5
+            except:
+                print "Exception in getSliverStatus"
+                return None
 
         return None