7 from PyQt4.QtCore import *
8 from PyQt4.QtXml import QDomDocument
9 from sface.config import config
10 from sface.logwindow import LogIO
11 from sface.rspecwindow import RSpecWindow, DomModel
14 def find_executable(exec_name):
15 """find the given executable in $PATH"""
16 paths = os.getenv("PATH").split(':')
18 exec_path = os.path.join(p, exec_name)
19 if os.path.exists(exec_path):
24 class SfiProcess(QObject):
25 def __init__(self, parent=None):
26 QObject.__init__(self, parent)
28 self.process = QProcess()
29 self.connect(self.process, SIGNAL("finished(int, QProcess::ExitStatus)"),
32 self.xmltracker = XmlTracker()
34 def __init_command(self, args):
35 self.args = QStringList()
37 self.args << QString(arg)
39 self.exe = find_executable("sfi.py")
41 print "FATAL.. Could not locate binary sfi.py - not much we can do without that"
44 return self.process.state() != QProcess.NotRunning
46 def processFinished(self):
47 if self.process.exitStatus() == QProcess.CrashExit:
48 print self.readOutput()
49 print "Process exited with errors:",
50 err = self.process.error()
51 if err == QProcess.FailedToStart:
53 elif err == QProcess.Crashed:
55 elif err == QProcess.Timedout:
57 elif err == QProcess.WriteError:
59 elif err == QProcess.ReadError:
61 elif err == QProcess.UnknownError:
64 self.emit(SIGNAL("finished()"))
66 def __getRSpec(self, mgr):
67 slice = config.getSlice()
68 # Write RSpec to file for testing.
69 filename = os.path.expanduser("~/.sfi/" + slice + ".rspec")
74 args = ["-u", config.getUser(), "-a", config.getAuthority(),
75 "-r", config.getRegistry(), "-s", mgr, "resources",
76 "-o", filename, slice]
78 self.__init_command(args)
82 def getRSpecFromSM(self):
83 return self.__getRSpec(config.getSlicemgr())
85 def getRSpecFromAM(self):
86 return self.__getRSpec(config.getAggmgr())
88 def getRecord(self, hrn):
89 args = ["-u", config.getUser(), "-a", config.getAuthority(),
90 "-r", config.getRegistry(), "-s", config.getSlicemgr(), "show", hrn]
91 self.__init_command(args)
94 def applyRSpec(self, rspec):
95 filename = config.getSliceRSpecFile() + "_new"
97 args = ["-u", config.getUser(), "-a", config.getAuthority(),
98 "-r", config.getRegistry(), "-s", config.getSlicemgr(), "create",
99 config.getSlice(), filename]
100 self.__init_command(args)
105 self.args.prepend(QString('-D'))
107 self.process.start(self.exe, self.args)
110 def readOutput(self):
111 if self.process.state() == QProcess.NotRunning:
112 return self.process.readAll()
114 def trace_command (self):
116 self._trace=time.time()
117 command = "%s %s" % (self.exe, self.args.join(" "))
118 print time.strftime('%M:%S'),'Invoking',command
119 #self.xmltracker.startTracking()
122 def trace_end (self):
124 #print "stop tracking"
125 #self.xmltracker.stopTracking()
126 command = "%s %s" % (self.exe, self.args.join(" "))
127 print time.strftime('%M:%S'),"[%.3f s]"%(time.time()-self._trace),command,'Done'
128 self.xmltracker.getAndPrint(self.process.readAllStandardOutput())
132 self.xmlrpcwindow = XmlrpcWindow()
134 def getAndPrint(self, rawOutput):
135 self.store(rawOutput)
137 self.xmlrpcwindow.setData(self.xml)
141 def showXmlrpc(self):
143 self.xmlrpcwindow.show()
144 self.xmlrpcwindow.resize(500, 640)
145 self.xmlrpcwindow.raise_()
146 self.xmlrpcwindow.activateWindow()
148 def store(self, rawOutput):
149 self.rawOutput = rawOutput
151 def extractXml(self):
152 pttrnAsk = '<methodCall>.*?</methodCall>'
153 pttrnAns = '<methodResponse>.*?</methodResponse>'
154 answers = re.compile(pttrnAsk, re.DOTALL).findall(self.rawOutput)
155 replies = re.compile(pttrnAns, re.DOTALL).findall(self.rawOutput)
157 answers = map(lambda x: x.replace('\\n','\n'), answers)
158 replies = map(lambda x: x.replace('\\n','\n').replace("'body: '", ''), replies)
159 # A well-formed XML document must have one, and only one, top-level element
162 self.xml += ans + replies.pop()
163 self.xml += '</debug>'
169 # statistics: round-trip time, size of the com
172 def prettyPrint(self, XmlComs):
176 class XmlrpcWindow(RSpecWindow):
177 def __init__(self, parent=None):
178 # super __init__() calls updateView,
179 # which assumes you have some data
180 self.data = '<debug/>'
181 RSpecWindow.__init__(self, parent)
183 def setData(self, XmlrpcCom):
184 self.data = XmlrpcCom
186 def updateView(self):
192 self.document = QDomDocument("RSpec")
193 self.document.setContent(self.data)
194 self.model = DomModel(self.document, self)
196 self.view.setModel(self.model)
197 self.view.expand(self.model.index(0, 0)) #expand first level only