Merge branch 'master' of ssh://git.onelab.eu/git/sfa-gui
[sfa-gui.git] / SfaData.py
1 import os
2 import re
3 import time
4 import subprocess
5 from sfa.util.rspecHelper import RSpec
6
7 class SfaData:
8     defaults = { 'SFI_AUTH' : None,
9                  'SFI_USER' : None,
10                  'SFI_SLICE' : None,
11                  'SFI_REGISTRY' : "http://www.planet-lab.org:12345",
12                  'SFI_SM' : "http://www.planet-lab.org:12346",
13                  'SFAUI_VERBOSE' : False,
14                  }
15
16     def __init__(self):
17         self.filename = os.path.expanduser("~/.sfi/sfi_config")
18         execfile(self.filename, SfaData.__dict__)
19         for (k,v) in SfaData.defaults.items():
20             if not hasattr(SfaData,k): setattr(SfaData,k,v)
21     
22     def show(self,classname):
23         if SfaData.SFAUI_VERBOSE:
24             print "instance of %s after reading config from %s"%(classname,self.filename)
25             for (k,v) in SfaData.defaults.items():
26                 print "%-20s: %r"%(k,getattr(SfaData,k))
27
28     def getAuthority(self):
29         return SfaData.SFI_AUTH
30
31     def getUser(self):
32         return SfaData.SFI_USER
33
34     def setUser(self, user):
35         SfaData.SFI_USER = user
36
37         # Should probably get authority from user record instead...
38         a = user.split('.')
39         SfaData.SFI_AUTH = '.'.join(a[:len(a)-1])
40
41     def getSlice(self):
42         return SfaData.SFI_SLICE
43
44     def setSlice(self, slice):
45         SfaData.SFI_SLICE = slice
46
47     def registry(self):
48         return SfaData.SFI_REGISTRY
49
50     def slicemgr(self):
51         return SfaData.SFI_SM
52
53     def trace_command (self, command):
54         self._trace=time.time()
55         if self.SFAUI_VERBOSE:
56             print time.strftime('%M:%S'),'Invoking',' '.join(command)
57     def trace_end (self):
58         if self.SFAUI_VERBOSE:
59             print time.strftime('%M:%S'),"[%.3f s]"%(time.time()-self._trace),'Done'
60
61     def getRecord(self, hrn):
62         command = ["sfi.py", "-u", self.getUser(), "-a", self.getAuthority(), 
63                    "-r", self.registry(), "-s", self.slicemgr(), "show", hrn]
64         self.trace_command(command)
65         text = subprocess.Popen(command, stdout=subprocess.PIPE).communicate()[0]
66         self.trace_end()
67         return text
68
69     def listChildren(self, hrn):
70         children = []
71         command=["sfi.py", "-u", self.getUser(), "-a", self.getAuthority(), 
72                  "-r", self.registry(), "-s", self.slicemgr(), "list", hrn]
73         self.trace_command(command)
74         text = subprocess.Popen(command, stdout=subprocess.PIPE).communicate()[0]
75         self.trace_end()
76         lines = text.split('\n')
77         for line in lines:
78             if line:
79                 (hrn, kind) = line.split() 
80                 children.append((hrn, kind))
81                 
82         return children
83
84     def getRSpec(self):
85         slice = self.getSlice()
86         # Write RSpec to file for testing.
87         filename = os.path.expanduser("~/.sfi/" + slice + ".rspec")
88         try:
89             os.remove(filename)
90         except:
91             pass
92         command=["sfi.py", "-u", self.getUser(), "-a", self.getAuthority(), 
93                  "-r", self.registry(), "-s", self.slicemgr(), "resources", 
94                  "-o", filename, slice]
95         self.trace_command(command)
96         subprocess.call(command)
97         self.trace_end()
98         f = open(filename, "r")
99         xml = f.read()
100         f.close()
101         return xml
102
103     def applyRSpec(self, xml):
104         slice = self.getSlice()
105         filename = os.path.expanduser("~/.sfi/" + slice + ".rspec")
106         f = open(filename, "w")
107         f.write(xml)
108         f.close()
109         command=["sfi.py", "-u", self.getUser(), "-a", self.getAuthority(), 
110                  "-r", self.registry(), "-s", self.slicemgr(), "create", slice, filename]
111         self.trace_command(command)
112         subprocess.call(command)
113         self.trace_end()
114
115 class PlanetLabData(SfaData):
116     def __init__(self):
117         SfaData.__init__(self)
118         self.rspec = None
119
120     def refreshRSpec(self):
121         xml = SfaData.getRSpec(self)
122         self.rspec = RSpec(xml)
123
124     def getRSpec(self):
125         if self.rspec is None:
126             self.refreshRSpec()
127         return self.rspec
128     
129     def applyRSpec(self):
130         xml = self.rspec.toxml()
131         SfaData.applyRSpec(self, xml)
132
133 class PLEData(PlanetLabData):
134     def __init__(self):
135         PlanetLabData.__init__(self)
136         SfaData.SFI_REGISTRY = "http://www.planet-lab.eu:12345"
137         SfaData.SFI_SM = "http://www.planet-lab.eu:12346"
138         self.show("PlanetLabData")
139
140 class PLJData(PlanetLabData):
141     def __init__(self):
142         PlanetLabData.__init__(self)
143         SfaData.SFI_SM = "http://www.planet-lab.jp:12346"
144         self.show("PLJData")
145
146 class ViniData(PlanetLabData):
147     def __init__(self):
148         PlanetLabData.__init__(self)
149         SfaData.SFI_SM = "http://www.vini-veritas.net:12346"
150         self.show("ViniData")
151
152 class GpENIData(PlanetLabData):
153     def __init__(self):
154         PlanetLabData.__init__(self)
155         SfaData.SFI_SM = "http://198.248.241.100:12346"
156         self.show("GpENIData")
157
158 class OpenCirrusData(SfaData):
159     def __init__(self):
160         SfaData.__init__(self)
161         self.SFI_REGISTRY = "http://198.55.37.29:12345"
162         SfaData.SFI_SM = "http://198.55.37.29:12346"
163         self.show("OpenCirrusData")
164
165     def refreshRSpec(self):
166         xml = SfaData.getRSpec(self)
167         self.rspec = xml
168
169     def getRSpec(self):
170         if self.rspec is None:
171             self.refreshRSpec()
172         return self.rspec
173     
174     def applyRSpec(self):
175         xml = self.rspec
176         SfaData.applyRSpec(self, xml)