3 from PyQt4.QtCore import *
4 from PyQt4.QtGui import *
6 from sfa.util.rspecHelper import RSpec
7 from sface.sfahelper import *
8 from sface.sficonfig import config
9 from sface.sfiprocess import SfiProcess
10 from sface.screens.sfascreen import SfaScreen
12 class NodeView(QTreeView):
13 def __init__(self, parent):
14 QTreeView.__init__(self, parent)
16 self.setItemsExpandable(True)
17 self.setRootIsDecorated(True)
18 self.setAlternatingRowColors(True)
19 self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
22 def __init__(self, data, parent=None):
23 self.parentItem = parent
28 for child in self.childItems:
34 def appendChild(self, child):
35 self.childItems.append(child)
38 return self.childItems[row]
41 return len(self.childItems)
43 def columnCount(self):
44 return len(self.itemData)
46 def data(self, column):
47 return self.itemData[column]
52 return self.parentItem.childItems.index(self)
58 return self.parentItem
62 class NodeModel(QAbstractItemModel):
63 def __init__(self, parent):
64 QAbstractItemModel.__init__(self, parent)
72 self.rootItem = TreeItem([QString("Testbed"), QString("Hostname")])
74 def columnCount(self, parent):
76 return parent.internalPointer().columnCount()
78 return self.rootItem.columnCount()
80 def data(self, index, role):
81 if not index.isValid():
84 if role != Qt.DisplayRole:
87 item = index.internalPointer()
88 return item.data(index.column())
90 def headerData(self, section, orientation, role):
91 if orientation == Qt.Horizontal and role == Qt.DisplayRole:
92 return self.rootItem.data(section)
95 def flags(self, index):
96 if not index.isValid():
98 return Qt.ItemIsEnabled | Qt.ItemIsSelectable
100 def index(self, row, column, parent):
101 if not self.hasIndex(row, column, parent):
105 if not parent.isValid():
106 parentItem = self.rootItem
108 parentItem = parent.internalPointer()
110 childItem = parentItem.child(row)
112 return self.createIndex(row, column, childItem)
116 def parent(self, index):
117 if not index.isValid():
120 childItem = index.internalPointer()
121 parentItem = childItem.parent()
126 if parentItem is self.rootItem:
129 return self.createIndex(parentItem.row(), 0, parentItem)
131 def rowCount(self, parent):
132 if parent.column() > 0:
136 if not parent.isValid():
137 parentItem = self.rootItem
139 parentItem = parent.internalPointer()
141 return parentItem.childCount()
144 class SliceWidget(QWidget):
145 def __init__(self, parent):
146 QWidget.__init__(self, parent)
148 self.nodeView = NodeView(self)
149 self.nodeModel = NodeModel(self)
150 self.nodeView.setModel(self.nodeModel)
152 refresh = QLabel("<a href='refresh'>Refresh</a>", self)
153 refresh.setScaledContents(False)
154 slicename = QLabel ("Slice : %s"%(config.getSlice() or "None"),self)
155 slicename.setScaledContents(False)
157 hlayout = QHBoxLayout()
158 hlayout.addWidget(slicename)
160 hlayout.addWidget(refresh)
162 layout = QVBoxLayout()
163 layout.addLayout(hlayout)
164 layout.addWidget(self.nodeView)
165 self.setLayout(layout)
166 self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
168 self.connect(refresh, SIGNAL('linkActivated(QString)'), self.refresh)
170 rspec_file = os.path.expanduser("~/.sfi/%s.rspec" % config.getSlice())
171 if os.path.exists(rspec_file):
174 def readSliceRSpec(self):
175 rspec_file = os.path.expanduser("~/.sfi/%s.rspec" % config.getSlice())
176 xml = open(rspec_file).read()
179 def refresh(self, link=None):
180 if not config.getSlice():
181 self.parent().setStatus("<font color='red'>Slice not set yet!</font>")
184 self.process = SfiProcess()
185 outfile = self.process.getRSpecFromSM()
186 self.parent().setStatus("Updating slice data. This may take some time...")
188 self.connect(self.process, SIGNAL('finished()'), self.refreshFinished)
190 def refreshFinished(self):
192 self.parent().setStatus("<font color='green'>Slice data updated.</font>")
195 def updateView(self):
196 self.nodeModel.clear()
197 rspec_string = self.readSliceRSpec()
198 networks = rspec_get_networks(rspec_string)
200 for network in networks:
201 networkItem = TreeItem([QString(network), QString("")], self.nodeModel.rootItem)
203 all_nodes = rspec_get_nodes_from_network(rspec_string, network)
204 for node in all_nodes:
205 nodeItem = TreeItem([QString(""), QString(node)], networkItem)
206 networkItem.appendChild(nodeItem)
208 self.nodeModel.rootItem.appendChild(networkItem)
210 self.nodeView.expandAll()
213 class MainScreen(SfaScreen):
214 def __init__(self, parent):
215 SfaScreen.__init__(self, parent)
217 slice = SliceWidget(self)
218 self.init(slice, "Main Window", "PlanetLab Federation GUI")