from PyQt4.QtCore import * from PyQt4.QtGui import * from sface.sfahelper import * from sface.sficonfig import config 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) label = QLabel("Refresh", self) label.setScaledContents(False) self.connect(label, SIGNAL('linkActivated(QString)'), self.refresh) slicename = QLabel ("Slice : %s"%(config.getSlice() or "None"),self) layout = QVBoxLayout() layout.addWidget(label) layout.addWidget(slicename) layout.addWidget(self.nodeView) self.setLayout(layout) self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) def refresh(self, link=None): data = SfaData() if not data.getSlice(): print 'slice not set yet' return if not data.SFACE_DEBUG: rspec_string = data.getRSpecFromSM() else: print 'SFACE_DEBUG : using local file' import os rspec_string = open(os.path.expanduser("~/.sfi/%s.rspec"%data.getSlice())).read() networks = self.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 = self.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()