5 from PyQt4.QtXml import QDomDocument
6 from sface.sfiprocess import SfiProcess
7 from sface.sfidata import SfiData
9 from PyQt4.QtCore import *
10 from PyQt4.QtGui import *
12 class ClientSliceManager(QDialog):
13 def __init__(self, parent):
14 QDialog.__init__(self, parent=parent)
15 self.process = SfiProcess(self)
17 self.browserMessages = QTextBrowser()
19 self.layout = QVBoxLayout()
20 self.layout.addWidget(self.browserMessages)
21 self.setLayout(self.layout)
23 def setStatus(self, x):
24 self.browserMessages.append(x)
26 # ProtoGENI-compatible submit. Contact each aggregate individually rather
27 # than using the slice manager.
28 # This code will be removed when ProtoGENI slicemanager is patched.
29 def submit_pg_compat(self, rspec):
30 # Several aggregates have issues with the <statistics> section in the
31 # rspec, so make sure it's not there.
32 stats_elems = rspec.xml.xpath("//statistics")
33 if len(stats_elems)>0:
34 stats_elem = stats_elems[0]
35 parent = stats_elem.xpath("..")[0]
36 parent.remove(stats_elem)
38 self.submit_aggSuccessCount = 0
39 self.submit_aggFailCount = 0
40 self.submit_rspec = rspec
41 self.connect(self.process, SIGNAL('finished()'), self.getVersionFinished)
42 self.process.getSliceMgrVersion()
43 self.setStatus("Getting aggregate directory...")
45 def getVersionFinished(self):
46 self.disconnect(self.process, SIGNAL('finished()'), self.getVersionFinished)
48 faultString = self.process.getFaultString()
50 peers = SfiData().getSliceMgrVersion()["peers"]
51 self.submit_aggs = [(key, peers[key]) for key in peers.keys()]
52 self.delete_aggs = [(key, peers[key]) for key in peers.keys() if key.startswith("emulab")]
53 self.setStatus("<font color='green'>Successfully retrieved agg list.</font>")
56 self.setStatus("<font color='red'>getSliceMgrVersion failed: %s</font>" % (faultString))
58 def deleteNextAgg(self):
59 if (self.delete_aggs == []):
63 self.delete_agg = self.delete_aggs.pop()
65 urlParts = urlparse.urlsplit(self.delete_agg[1])
66 amPort = urlParts.port
67 amAddr = urlParts.hostname+urlParts.path
69 self.setStatus("Deleting slivers on %s..." % (self.delete_agg[0]))
71 self.connect(self.process, SIGNAL('finished()'), self.deleteNextAggFinished)
72 self.process.deleteSlivers(aggAddr = amAddr, aggPort = amPort)
74 def submitNextAgg(self):
75 if (self.submit_aggs == []):
76 #self.emit(SIGNAL("finished(PyQt_PyObject)"), self)
80 self.submit_agg = self.submit_aggs.pop()
82 urlParts = urlparse.urlsplit(self.submit_agg[1])
83 amPort = urlParts.port
84 amAddr = urlParts.hostname+urlParts.path
86 self.setStatus("Submitting to %s..." % (self.submit_agg[0]))
88 self.connect(self.process, SIGNAL('finished()'), self.submitNextAggFinished)
89 self.process.applyRSpec(self.submit_rspec, aggAddr = amAddr, aggPort = amPort, saveObtained=False)
91 def submitNextAggFinished(self):
92 self.disconnect(self.process, SIGNAL('finished()'), self.submitNextAggFinished)
94 faultString = self.process.getFaultString()
96 self.submit_aggSuccessCount+=1
97 self.setStatus("<font color='green'>Succeeded on %s.</font> " % (self.submit_agg[0]))
99 self.submit_aggFailCount+=1
100 self.setStatus("<font color='red'>Failed on %s.</font> " % (self.submit_agg[0]))
104 def deleteNextAggFinished(self):
105 self.disconnect(self.process, SIGNAL('finished()'), self.deleteNextAggFinished)
107 faultString = self.process.getFaultString()
109 self.setStatus("<font color='green'>Succeeded deleteslivers on %s.</font> " % (self.delete_agg[0]))
111 self.setStatus("<font color='red'>Failed deleteslivers on %s.</font> " % (self.delete_agg[0]))