Read ~/.sfi/sfi_config
[sfa-gui.git] / SfaData.py
1 import os
2 import re
3 from subprocess import *
4 from sfa.util.rspecHelper import RSpec
5
6 class SfaData:
7     def __init__(self):
8         self.registry = None
9         self.slicemgr = None
10         filename = os.path.expanduser("~/.sfi/sfi_config")
11         execfile(filename, SfaData.__dict__)
12         if not hasattr(SfaData, 'SFI_AUTH'): 
13             SfaData.SFI_AUTH = None
14         if not hasattr(SfaData, 'SFI_USER'): 
15             SfaData.SFI_USER = None
16         if not hasattr(SfaData, 'SFI_SLICE'): 
17             SfaData.SFI_SLICE = None
18
19     def getAuthority(self):
20         return SfaData.SFI_AUTH
21
22     def getUser(self):
23         return SfaData.SFI_USER
24
25     def setUser(self, user):
26         SfaData.SFI_USER = user
27
28         # Should probably get authority from user record instead...
29         a = user.split('.')
30         SfaData.SFI_AUTH = '.'.join(a[:len(a)-1])
31
32     def getSlice(self):
33         return SfaData.SFI_SLICE
34
35     def setSlice(self, slice):
36         SfaData.SFI_SLICE = slice
37
38     def getRecord(self, hrn):
39         text = Popen(["sfi.py", "-u", self.getUser(), "-a", 
40                       self.getAuthority(), "-r", self.registry, 
41                       "-s", self.slicemgr, "show", hrn], 
42                      stdout=PIPE).communicate()[0]
43         return text
44
45     def listChildren(self, hrn):
46         children = []
47         text = Popen(["sfi.py", "-u", self.getUser(), "-a", 
48                       self.getAuthority(), "-r", self.registry, 
49                       "-s", self.slicemgr, "list", hrn], 
50                      stdout=PIPE).communicate()[0]
51         lines = text.split('\n')
52         for line in lines:
53             if line:
54                 (hrn, kind) = line.split() 
55                 children.append((hrn, kind))
56
57         return children
58
59     def getRSpec(self):
60         slice = self.getSlice()
61         # Write RSpec to file for testing.
62         filename = os.path.expanduser("~/.sfi/" + slice + ".rspec")
63         os.remove(filename)
64         call(["sfi.py", "-u", self.getUser(), "-a", self.getAuthority(), 
65               "-r", self.registry, "-s", self.slicemgr, "resources", 
66               "-o", slice, slice])
67         f = open(filename, "r")
68         xml = f.read()
69         f.close()
70         return xml
71
72     def applyRSpec(self, xml):
73         slice = self.getSlice()
74         filename = os.path.expanduser("~/.sfi/" + slice + ".rspec")
75         os.remove(filename)
76         f = open(filename, "w")
77         f.write(xml)
78         f.close()
79         call(["sfi.py", "-u", self.getUser(), "-a", self.getAuthority(), 
80               "-r", self.registry, "-s", self.slicemgr, "create", 
81               slice, filename])
82
83 class PlanetLabData(SfaData):
84     def __init__(self):
85         SfaData.__init__(self)
86         self.registry = "http://www.planet-lab.org:12345"
87         self.slicemgr = "http://www.planet-lab.org:12346"
88         self.rspec = None
89
90     def refreshRSpec(self):
91         xml = SfaData.getRSpec(self)
92         self.rspec = RSpec(xml)
93
94     def getRSpec(self):
95         if self.rspec is None:
96             self.refreshRSpec()
97         return self.rspec
98     
99     def applyRSpec(self):
100         xml = self.rspec.toxml()
101         SfaData.applyRSpec(self, xml)
102
103 class PLEData(PlanetLabData):
104     def __init__(self):
105         PlanetLabData.__init__(self)
106         self.slicemgr = "http://www.planet-lab.eu:12346"
107
108 class PLJData(PlanetLabData):
109     def __init__(self):
110         PlanetLabData.__init__(self)
111         self.slicemgr = "http://www.planet-lab.jp:12346"
112
113 class ViniData(PlanetLabData):
114     def __init__(self):
115         PlanetLabData.__init__(self)
116         self.slicemgr = "http://www.vini-veritas.net:12346"
117
118 class GpENIData(PlanetLabData):
119     def __init__(self):
120         PlanetLabData.__init__(self)
121         self.slicemgr = "http://198.248.241.100:12346"
122
123 class OpenCirrusData(SfaData):
124     def __init__(self):
125         SfaData.__init__(self)
126         self.registry = "http://198.55.37.29:12345"
127         self.slicemgr = "http://198.55.37.29:12346"
128
129     def refreshRSpec(self):
130         xml = SfaData.getRSpec(self)
131         self.rspec = xml
132
133     def getRSpec(self):
134         if self.rspec is None:
135             self.refreshRSpec()
136         return self.rspec
137     
138     def applyRSpec(self):
139         xml = self.rspec
140         SfaData.applyRSpec(self, xml)