import os import re from subprocess import * from sfa.util.rspecHelper import RSpec class SfaData: def __init__(self): self.registry = None self.slicemgr = None filename = os.path.expanduser("~/.sfi/sfi_config") execfile(filename, SfaData.__dict__) if not hasattr(SfaData, 'SFI_AUTH'): SfaData.SFI_AUTH = None if not hasattr(SfaData, 'SFI_USER'): SfaData.SFI_USER = None if not hasattr(SfaData, 'SFI_SLICE'): SfaData.SFI_SLICE = None 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 getRecord(self, hrn): text = Popen(["sfi.py", "-u", self.getUser(), "-a", self.getAuthority(), "-r", self.registry, "-s", self.slicemgr, "show", hrn], stdout=PIPE).communicate()[0] return text def listChildren(self, hrn): children = [] text = Popen(["sfi.py", "-u", self.getUser(), "-a", self.getAuthority(), "-r", self.registry, "-s", self.slicemgr, "list", hrn], stdout=PIPE).communicate()[0] 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 call(["sfi.py", "-u", self.getUser(), "-a", self.getAuthority(), "-r", self.registry, "-s", self.slicemgr, "resources", "-o", filename, slice]) 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() call(["sfi.py", "-u", self.getUser(), "-a", self.getAuthority(), "-r", self.registry, "-s", self.slicemgr, "create", slice, filename]) class PlanetLabData(SfaData): def __init__(self): SfaData.__init__(self) self.registry = "http://www.planet-lab.org:12345" self.slicemgr = "http://www.planet-lab.org:12346" 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.slicemgr = "http://www.planet-lab.eu:12346" class PLJData(PlanetLabData): def __init__(self): PlanetLabData.__init__(self) self.slicemgr = "http://www.planet-lab.jp:12346" class ViniData(PlanetLabData): def __init__(self): PlanetLabData.__init__(self) self.slicemgr = "http://www.vini-veritas.net:12346" class GpENIData(PlanetLabData): def __init__(self): PlanetLabData.__init__(self) self.slicemgr = "http://198.248.241.100:12346" class OpenCirrusData(SfaData): def __init__(self): SfaData.__init__(self) self.registry = "http://198.55.37.29:12345" self.slicemgr = "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)