import os from PyQt4.QtCore import * from PyQt4.QtGui import * from sfa.util.rspecHelper import RSpec from sface.sfahelper import * from sface.sficonfig import config from sface.sfiprocess import SfiProcess from sface.screens.sfascreen import SfaScreen class SliceWidget(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent) self.nodeView = QTreeView(self) self.nodeView.setRootIsDecorated(False) self.nodeView.setAlternatingRowColors(True) self.nodeView.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.nodeModel = QStandardItemModel(0, 3, self) self.nodeModel.setHeaderData(0, Qt.Horizontal, QString("Testbed")) self.nodeModel.setHeaderData(1, Qt.Horizontal, QString("Hostname")) self.nodeModel.setHeaderData(2, Qt.Horizontal, QString("IsIn")) self.nodeView.setModel(self.nodeModel) refresh = QLabel("Refresh", self) refresh.setScaledContents(False) slicename = QLabel ("Slice : %s"%(config.getSlice() or "None"),self) slicename.setScaledContents(False) self.status = QLabel("") hlayout = QHBoxLayout() hlayout.addWidget(slicename) hlayout.addStretch() hlayout.addWidget(refresh) layout = QVBoxLayout() layout.addLayout(hlayout) layout.addWidget(self.nodeView) layout.addWidget(self.status) self.setLayout(layout) self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.connect(refresh, SIGNAL('linkActivated(QString)'), self.refresh) rspec_file = os.path.expanduser("~/.sfi/%s.rspec" % config.getSlice()) if os.path.exists(rspec_file): self.updateView() def readSliceRSpec(self): rspec_file = os.path.expanduser("~/.sfi/%s.rspec" % config.getSlice()) xml = open(rspec_file).read() return xml def refresh(self, link=None): if not config.getSlice(): self.status.setText("Slice not set yet!") return self.process = SfiProcess() outfile = self.process.getRSpecFromSM() self.status.setText("Updating slice data. This may take some time...") self.connect(self.process, SIGNAL('finished()'), self.refreshFinished) def refreshFinished(self): del self.process self.status.setText("Slice data updated.") self.updateView() def updateView(self): rspec_string = self.readSliceRSpec() networks = rspec_get_networks(rspec_string) networks.reverse() for network in networks: # nodes = self.rspec_get_sliver_nodes_from_network(rspec_string, network) # for node in nodes: self.addNode(network, node, True) # nodes = self.rspec_get_other_nodes_from_network(rspec_string, network) # for node in nodes: self.addNode(network, node, False) # hacky - i'm just gettin used to this xml navigation stuff xml_nodes = rspec_get_xml_nodes_from_network(rspec_string, network) from lxml import etree # addNode inserts before, so let's start with the ones that are not in for xml_node in xml_nodes: if not xml_node.xpath('sliver'): self.addNode(network, xml_node.xpath('hostname/text()')[0],False) for xml_node in xml_nodes: if xml_node.xpath('sliver'): self.addNode(network, xml_node.xpath('hostname/text()')[0],True) def addNode(self, testbed, hostname, mark): self.nodeModel.insertRow(0) self.nodeModel.setData(self.nodeModel.index(0,0), QString(testbed)) self.nodeModel.setData(self.nodeModel.index(0,1), QString(hostname)) if mark:msg="x" else: msg="-" self.nodeModel.setData(self.nodeModel.index(0,2), QString(msg)) class MainScreen(SfaScreen): def __init__(self, parent=None): SfaScreen.__init__(self, parent) slice = SliceWidget(self) self.init(slice, "Main Window", "PlanetLab Federation GUI") # slice.refresh()