X-Git-Url: http://git.onelab.eu/?p=sface.git;a=blobdiff_plain;f=sfamainscreen.py;h=1ded23164c4004c745406a46c01e6c7141447269;hp=5e7bbb88f8352c22cd36b0bfafe6dd3eb29ab518;hb=e8b04dd7ddc2ffb22d72098400cdbf676453a094;hpb=fe9d09d2042b839a76fc04a5510f6b88592f2235 diff --git a/sfamainscreen.py b/sfamainscreen.py index 5e7bbb8..1ded231 100644 --- a/sfamainscreen.py +++ b/sfamainscreen.py @@ -1,6 +1,8 @@ -from PyQt4.QtCore import Qt, QString -from PyQt4.QtGui import QWidget, QLabel, QTreeView, QStandardItemModel, QVBoxLayout +from PyQt4.QtCore import Qt, QString, SIGNAL +from PyQt4.QtGui import QWidget, QLabel, QTreeView, QStandardItemModel, QVBoxLayout, QSizePolicy + +from sfa.util.rspecHelper import RSpec from sfadata import SfaData from sfascreen import SfaScreen @@ -13,31 +15,86 @@ class SliceWidget(QWidget): self.nodeView = QTreeView(self) self.nodeView.setRootIsDecorated(False) self.nodeView.setAlternatingRowColors(True) + self.nodeView.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) - self.nodeModel = QStandardItemModel(0, 2, self) + 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) + + # mmhh. + data=SfaData() + slicename = QLabel ("Slice : %s"%(data.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) - self.refresh() - def refresh(self): + + # TODO: use the methods from sfa-trunk + def rspec_get_networks(self, rspec_string): + rspec = RSpec (rspec_string) + return rspec.rspec.xpath("./network[@name]/@name") + def rspec_get_xml_nodes_from_network(self, rspec_string, network): + rspec = RSpec (rspec_string) + return rspec.rspec.xpath("./network[@name='%s']/site/node" % network) + def rspec_get_sliver_nodes_from_network(self, rspec_string, network): + rspec = RSpec (rspec_string) + return rspec.rspec.xpath("./network[@name='%s']/site/node[sliver]/hostname/text()" % network) + def rspec_get_other_nodes_from_network(self, rspec_string, network): + rspec = RSpec (rspec_string) + # xxx todo - could not find the xpath syntax for 'does not have the sliver attribute' + return rspec.rspec.xpath("./network[@name='%s']/site/node[~sliver]/hostname/text()" % network) + + def refresh(self, link=None): data = SfaData() - rspec = data.getRSpecFromSM() - nodes = rspec.get_node_list() - - for n in nodes: - print n + 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): + 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)) @@ -47,3 +104,4 @@ class SfaMainScreen(SfaScreen): slice = SliceWidget(self) self.init(slice, "Main Window", "PlanetLab Federation GUI") + slice.refresh()