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): self.read_config() def read_config(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 save_config(self): config_keys = SfaData.defaults.keys() configfile = os.path.expanduser("~/.sfi/sfi_config") tmpfile = configfile + ".tmp" out = open(tmpfile, "w") for line in open(os.path.expanduser("~/.sfi/sfi_config")): try: key, val = line.split('=') key = key.strip() val = val.strip() if key in config_keys: line = "%s = '%s'\n" % (key, getattr(self, key)) except: pass out.write(line) out.close() os.unlink(configfile) os.rename(tmpfile, configfile) 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)