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(False)
18 self.setAlternatingRowColors(True)
19 self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
22 def __init__(self, data, parent=None):
23 self.parentItem = parent
27 def appendChild(self, child):
28 self.childItems.append(child)
31 return self.childItems[row]
34 return len(self.childItems)
36 def columnCount(self):
37 print len(self.itemData)
38 return len(self.itemData)
40 def data(self, column):
41 return self.itemData[column]
45 for i in self.parentItem.childItems:
50 return self.parentItem
54 class NodeModel(QAbstractItemModel):
55 def __init__(self, parent):
56 QAbstractItemModel.__init__(self, parent)
57 self.rootItem = TreeItem([QString("Testbed"), QString("Hostname")])
59 def addToRoot(self, item):
60 self.rootItem.appendChild(item)
62 def columnCount(self, parent):
65 parent.internalPointer().columnCount()
68 return self.rootItem.columnCount()
70 def data(self, index, role):
71 if not index.isValid():
74 if role != Qt.DisplayRole:
77 item = index.internalPointer()
78 return item.data(index.column())
80 def headerData(self, section, orientation, role):
81 if orientation == Qt.Horizontal and role == Qt.DisplayRole:
82 return self.rootItem.data(section)
85 def index(self, row, column, parent):
86 if not self.hasIndex(row, column, parent):
90 if not parent.isValid():
91 parentItem = self.rootItem
93 parentItem = parent.internalPointer()
95 childItem = parentItem.child(row)
97 return self.createIndex(row, column, childItem)
101 def parent(self, index):
102 if not index.isValid():
105 childItem = index.internalPointer()
106 parentItem = childItem.parent()
111 if parentItem == self.rootItem:
114 return self.createIndex(parentItem.row(), 0, parentItem);
116 def rowCount(self, parent):
117 if parent.column() > 0:
121 if not parent.isValid():
122 parentItem = self.rootItem
124 parentItem = parent.internalPointer()
126 return parentItem.childCount()
129 class SliceWidget(QWidget):
130 def __init__(self, parent):
131 QWidget.__init__(self, parent)
133 self.nodeView = NodeView(self)
134 self.nodeModel = NodeModel(self)
135 self.nodeView.setModel(self.nodeModel)
137 refresh = QLabel("<a href='refresh'>Refresh</a>", self)
138 refresh.setScaledContents(False)
139 slicename = QLabel ("Slice : %s"%(config.getSlice() or "None"),self)
140 slicename.setScaledContents(False)
142 hlayout = QHBoxLayout()
143 hlayout.addWidget(slicename)
145 hlayout.addWidget(refresh)
147 layout = QVBoxLayout()
148 layout.addLayout(hlayout)
149 layout.addWidget(self.nodeView)
150 self.setLayout(layout)
151 self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
153 self.connect(refresh, SIGNAL('linkActivated(QString)'), self.refresh)
155 rspec_file = os.path.expanduser("~/.sfi/%s.rspec" % config.getSlice())
156 if os.path.exists(rspec_file):
159 def readSliceRSpec(self):
160 rspec_file = os.path.expanduser("~/.sfi/%s.rspec" % config.getSlice())
161 xml = open(rspec_file).read()
164 def refresh(self, link=None):
165 if not config.getSlice():
166 self.parent().setStatus("<font color='red'>Slice not set yet!</font>")
169 self.process = SfiProcess()
170 outfile = self.process.getRSpecFromSM()
171 self.parent().setStatus("Updating slice data. This may take some time...")
173 self.connect(self.process, SIGNAL('finished()'), self.refreshFinished)
175 def refreshFinished(self):
177 self.parent().setStatus("<font color='green'>Slice data updated.</font>")
180 def updateView(self):
181 rspec_string = self.readSliceRSpec()
182 networks = rspec_get_networks(rspec_string)
184 for network in networks:
185 networkItem = TreeItem([QString(network), QString("")])
187 all_nodes = rspec_get_nodes_from_network(rspec_string, network)
188 for node in all_nodes:
189 nodeItem = TreeItem([QString(""), QString(node)])
190 networkItem.appendChild(nodeItem)
192 self.nodeModel.addToRoot(networkItem)
195 class MainScreen(SfaScreen):
196 def __init__(self, parent):
197 SfaScreen.__init__(self, parent)
199 slice = SliceWidget(self)
200 self.init(slice, "Main Window", "PlanetLab Federation GUI")