typo
[sfa-gui.git] / SfaData.py
index e1abfac..aea1ba4 100644 (file)
 import os
-from subprocess import call
+import re
+import time
+import subprocess
 from sfa.util.rspecHelper import RSpec
 
 class SfaData:
-    authority = "plc.princeton"
-    user = "plc.princeton.acb"
-    slice = "plc.princeton.iias"
+    defaults = { 'SFI_AUTH' : None,
+                 'SFI_USER' : None,
+                 'SFI_SLICE' : None,
+                 'SFI_REGISTRY' : "http://www.planet-lab.org:12345",
+                 'SFI_SM' : "http://www.planet-lab.org:12346",
+                 'SFAUI_VERBOSE' : False,
+                 }
 
     def __init__(self):
-        self.registry = None
-        self.slicemgr = None
+        self.filename = os.path.expanduser("~/.sfi/sfi_config")
+        execfile(self.filename, SfaData.__dict__)
+        for (k,v) in SfaData.defaults.items():
+            if not hasattr(SfaData,k): setattr(SfaData,k,v)
+    
+    def show(self,classname):
+        if SfaData.SFAUI_VERBOSE:
+            print "instance of %s after reading config from %s"%(classname,self.filename)
+            for (k,v) in SfaData.defaults.items():
+                print "%-20s: %r"%(k,getattr(SfaData,k))
 
     def getAuthority(self):
-        return SfaData.authority
+        return SfaData.SFI_AUTH
 
     def getUser(self):
-        return SfaData.user
+        return SfaData.SFI_USER
 
     def setUser(self, user):
-        SfaData.user = user
+        SfaData.SFI_USER = user
 
         # Should probably get authority from user record instead...
-        a = SfaData.user.split('.')
-        SfaData.authority = '.'.join(a[:len(a)-1])
+        a = user.split('.')
+        SfaData.SFI_AUTH = '.'.join(a[:len(a)-1])
 
     def getSlice(self):
-        return SfaData.slice
+        return SfaData.SFI_SLICE
 
     def setSlice(self, slice):
-        SfaData.slice = slice
-
-    def getRecord(self):
-        pass
+        SfaData.SFI_SLICE = slice
+
+    def registry(self):
+        return SfaData.SFI_REGISTRY
+
+    def slicemgr(self):
+        return SfaData.SFI_SM
+
+    def trace_command (self, command):
+        self._trace=time.time()
+        if self.SFAUI_VERBOSE:
+            print time.strftime('%M:%S'),'Invoking',' '.join(command)
+    def trace_end (self):
+        if self.SFAUI_VERBOSE:
+            print time.strftime('%M:%S'),"[%.3f s]"%(time.time()-self._trace),'Done'
+
+    def getRecord(self, hrn):
+        command = ["sfi.py", "-u", self.getUser(), "-a", self.getAuthority(), 
+                   "-r", self.registry(), "-s", self.slicemgr(), "show", hrn]
+        self.trace_command(command)
+        text = subprocess.Popen(command, stdout=subprocess.PIPE).communicate()[0]
+        self.trace_end()
+        return text
+
+    def listChildren(self, hrn):
+        children = []
+        command=["sfi.py", "-u", self.getUser(), "-a", self.getAuthority(), 
+                 "-r", self.registry(), "-s", self.slicemgr(), "list", hrn]
+        self.trace_command(command)
+        text = subprocess.Popen(command, stdout=subprocess.PIPE).communicate()[0]
+        self.trace_end()
+        lines = text.split('\n')
+        for line in lines:
+            if line:
+                (hrn, kind) = line.split() 
+                children.append((hrn, kind))
+                
+        return children
 
     def getRSpec(self):
         slice = self.getSlice()
-        call(["sfi.py", "-u", self.getUser(), "-a", self.getAuthority(), 
-              "-r", self.registry, "-s", self.slicemgr, "resources", 
-              "-o", slice, slice])
+        # Write RSpec to file for testing.
         filename = os.path.expanduser("~/.sfi/" + slice + ".rspec")
+        try:
+            os.remove(filename)
+        except:
+            pass
+        command=["sfi.py", "-u", self.getUser(), "-a", self.getAuthority(), 
+                 "-r", self.registry(), "-s", self.slicemgr(), "resources", 
+                 "-o", filename, slice]
+        self.trace_command(command)
+        subprocess.call(command)
+        self.trace_end()
         f = open(filename, "r")
         xml = f.read()
         f.close()
         return xml
 
-class ViniData(SfaData):
+    def applyRSpec(self, xml):
+        slice = self.getSlice()
+        filename = os.path.expanduser("~/.sfi/" + slice + ".rspec")
+        f = open(filename, "w")
+        f.write(xml)
+        f.close()
+        command=["sfi.py", "-u", self.getUser(), "-a", self.getAuthority(), 
+                 "-r", self.registry(), "-s", self.slicemgr(), "create", slice, filename]
+        self.trace_command(command)
+        subprocess.call(command)
+        self.trace_end()
+
+class PlanetLabData(SfaData):
     def __init__(self):
         SfaData.__init__(self)
-        self.registry = "http://www.planet-lab.org:12345"
-        self.slicemgr = "http://www.vini-veritas.net:12346"
+        self.rspec = None
 
-    def getRSpec(self):
+    def refreshRSpec(self):
         xml = SfaData.getRSpec(self)
-        return RSpec(xml)
+        self.rspec = RSpec(xml)
 
-class PlanetLabData(SfaData):
+    def getRSpec(self):
+        if self.rspec is None:
+            self.refreshRSpec()
+        return self.rspec
+    
+    def applyRSpec(self):
+        xml = self.rspec.toxml()
+        SfaData.applyRSpec(self, xml)
+
+class PLEData(PlanetLabData):
     def __init__(self):
-        SfaData.__init__(self)
-        self.registry = "http://www.planet-lab.org:12345"
-        self.slicemgr = "http://www.planet-lab.org:12346"
+        PlanetLabData.__init__(self)
+        SfaData.SFI_REGISTRY = "http://www.planet-lab.eu:12345"
+        SfaData.SFI_SM = "http://www.planet-lab.eu:12346"
+        self.show("PlanetLabData")
 
-    def getRSpec(self):
-        xml = SfaData.getRSpec(self)
-        return RSpec(xml)
+class PLJData(PlanetLabData):
+    def __init__(self):
+        PlanetLabData.__init__(self)
+        SfaData.SFI_SM = "http://www.planet-lab.jp:12346"
+        self.show("PLJData")
+
+class ViniData(PlanetLabData):
+    def __init__(self):
+        PlanetLabData.__init__(self)
+        SfaData.SFI_SM = "http://www.vini-veritas.net:12346"
+        self.show("ViniData")
+
+class GpENIData(PlanetLabData):
+    def __init__(self):
+        PlanetLabData.__init__(self)
+        SfaData.SFI_SM = "http://198.248.241.100:12346"
+        self.show("GpENIData")
 
 class OpenCirrusData(SfaData):
     def __init__(self):
         SfaData.__init__(self)
-        self.registry = "http://www.planet-lab.org:12345"
-        self.slicemgr = "http://www.planet-lab.org:12346"
+        self.SFI_REGISTRY = "http://198.55.37.29:12345"
+        SfaData.SFI_SM = "http://198.55.37.29:12346"
+        self.show("OpenCirrusData")
 
+    def refreshRSpec(self):
+        xml = SfaData.getRSpec(self)
+        self.rspec = xml
+
+    def getRSpec(self):
+        if self.rspec is None:
+            self.refreshRSpec()
+        return self.rspec
+    
+    def applyRSpec(self):
+        xml = self.rspec
+        SfaData.applyRSpec(self, xml)