import re import urlparse import xmlrpclib from lxml import etree from PyQt4.QtXml import QDomDocument from sface.sfiprocess import SfiProcess from sface.sfidata import SfiData from PyQt4.QtCore import * from PyQt4.QtGui import * class ClientSliceManager(QDialog): def __init__(self, parent): QDialog.__init__(self, parent=parent) self.process = SfiProcess(self) self.browserMessages = QTextBrowser() self.layout = QVBoxLayout() self.layout.addWidget(self.browserMessages) self.setLayout(self.layout) def setStatus(self, x): self.browserMessages.append(x) # ProtoGENI-compatible submit. Contact each aggregate individually rather # than using the slice manager. # This code will be removed when ProtoGENI slicemanager is patched. def submit_pg_compat(self, rspec): # Several aggregates have issues with the section in the # rspec, so make sure it's not there. stats_elems = rspec.xml.xpath("//statistics") if len(stats_elems)>0: stats_elem = stats_elems[0] parent = stats_elem.xpath("..")[0] parent.remove(stats_elem) self.submit_aggSuccessCount = 0 self.submit_aggFailCount = 0 self.submit_rspec = rspec self.connect(self.process, SIGNAL('finished()'), self.getVersionFinished) self.process.getSliceMgrVersion() self.setStatus("Getting aggregate directory...") def getVersionFinished(self): self.disconnect(self.process, SIGNAL('finished()'), self.getVersionFinished) faultString = self.process.getFaultString() if not faultString: peers = SfiData().getSliceMgrVersion()["peers"] self.submit_aggs = [(key, peers[key]) for key in peers.keys()] self.delete_aggs = [(key, peers[key]) for key in peers.keys() if key.startswith("emulab")] self.setStatus("Successfully retrieved agg list.") self.deleteNextAgg() else: self.setStatus("getSliceMgrVersion failed: %s" % (faultString)) def deleteNextAgg(self): if (self.delete_aggs == []): self.submitNextAgg() return self.delete_agg = self.delete_aggs.pop() urlParts = urlparse.urlsplit(self.delete_agg[1]) amPort = urlParts.port amAddr = urlParts.hostname+urlParts.path self.setStatus("Deleting slivers on %s..." % (self.delete_agg[0])) self.connect(self.process, SIGNAL('finished()'), self.deleteNextAggFinished) self.process.deleteSlivers(aggAddr = amAddr, aggPort = amPort) def submitNextAgg(self): if (self.submit_aggs == []): #self.emit(SIGNAL("finished(PyQt_PyObject)"), self) self.close() return self.submit_agg = self.submit_aggs.pop() urlParts = urlparse.urlsplit(self.submit_agg[1]) amPort = urlParts.port amAddr = urlParts.hostname+urlParts.path self.setStatus("Submitting to %s..." % (self.submit_agg[0])) self.connect(self.process, SIGNAL('finished()'), self.submitNextAggFinished) self.process.applyRSpec(self.submit_rspec, aggAddr = amAddr, aggPort = amPort, saveObtained=False) def submitNextAggFinished(self): self.disconnect(self.process, SIGNAL('finished()'), self.submitNextAggFinished) faultString = self.process.getFaultString() if not faultString: self.submit_aggSuccessCount+=1 self.setStatus("Succeeded on %s. " % (self.submit_agg[0])) else: self.submit_aggFailCount+=1 self.setStatus("Failed on %s. " % (self.submit_agg[0])) self.submitNextAgg() def deleteNextAggFinished(self): self.disconnect(self.process, SIGNAL('finished()'), self.deleteNextAggFinished) faultString = self.process.getFaultString() if not faultString: self.setStatus("Succeeded deleteslivers on %s. " % (self.delete_agg[0])) else: self.setStatus("Failed deleteslivers on %s. " % (self.delete_agg[0])) self.deleteNextAgg()