+import os
+import re
+import time
+import subprocess
+from sfa.util.rspecHelper import RSpec
+
+class SfaData:
+ 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):
+ filename = os.path.expanduser("~/.sfi/sfi_config")
+ execfile(filename, SfaData.__dict__)
+ for (k,v) in SfaData.defaults.items():
+ if not hasattr(SfaData,k): setattr(SfaData,k,v)
+ if SfaData.SFAUI_VERBOSE:
+ print "After reading config from %s"%filename
+ for (k,v) in SfaData.defaults.items():
+ print "%-20s: %r"%(k,getattr(SfaData,k))
+
+ def getAuthority(self):
+ return SfaData.SFI_AUTH
+
+ def getUser(self):
+ return SfaData.SFI_USER
+
+ def setUser(self, user):
+ SfaData.SFI_USER = user
+
+ # Should probably get authority from user record instead...
+ a = user.split('.')
+ SfaData.SFI_AUTH = '.'.join(a[:len(a)-1])
+
+ def getSlice(self):
+ return SfaData.SFI_SLICE
+
+ def setSlice(self, slice):
+ 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()
+ # 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
+
+ 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.rspec = None
+
+ def refreshRSpec(self):
+ xml = SfaData.getRSpec(self)
+ self.rspec = RSpec(xml)
+
+ 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):
+ PlanetLabData.__init__(self)
+ self.SFI_SM = "http://www.planet-lab.eu:12346"
+
+class PLJData(PlanetLabData):
+ def __init__(self):
+ PlanetLabData.__init__(self)
+ self.SFI_SM = "http://www.planet-lab.jp:12346"
+
+class ViniData(PlanetLabData):
+ def __init__(self):
+ PlanetLabData.__init__(self)
+ self.SFI_SM = "http://www.vini-veritas.net:12346"
+
+class GpENIData(PlanetLabData):
+ def __init__(self):
+ PlanetLabData.__init__(self)
+ self.SFI_SM = "http://198.248.241.100:12346"
+
+class OpenCirrusData(SfaData):
+ def __init__(self):
+ SfaData.__init__(self)
+ self.SFI_REGISTRY = "http://198.55.37.29:12345"
+ self.SFI_SM = "http://198.55.37.29:12346"
+
+ 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)