def getSliceRSpecFile(self): return self.fullpath("%s.rspec" % self.getSlice())
+ def getResourcesRSpecFile(self): return self.fullpath("resources.rspec")
+
def getSliceRecordFile(self): return self.fullpath ("%s.record" % self.getSlice())
def getAuthorityRecordFile(self): return self.fullpath ("%s/%s.record" % self.getAuthority())
- def getAuthorityListFile(self, i=None):
+ def getAuthorityListRecordFile(self, i=None):
+ # DEPRECATED
if (i != None) and (i != 0):
return self.fullpath ("%s_list.record.%d" % (self.getAuthority(),i))
else:
return self.fullpath ("%s_list.record" % self.getAuthority())
+ def getAuthorityListFile(self):
+ return self.fullpath ("%s_list.xml" % self.getAuthority())
+
# configuration singleton
config = Config()
import sface.screens
from sface.config import config
from sface.logwindow import LogWindow
-from sface.rspecwindow import RSpecWindow
+from sface.rspecwindow import RSpecWindow, ResourcesWindow
from sface.screens.sfascreen import SfaScreen
from sface.xmlrpcwindow import get_tracker, init_tracker
# to our parent. Otherwise, getting a segfault on exit in Ubuntu.
self.logWindow = LogWindow(parent)
self.rspecWindow = RSpecWindow(parent)
+ self.resourcesWindow = ResourcesWindow(parent)
self.trackerWindow = init_tracker(parent)
self.pix = QLabel(self)
self.nav.setTitle(self.screenWidgets[0].getTitleText())
self.status = Status(self)
- self.tracker = QLabel("<a href='showtracker'>Show Xmlrpc</a>", self)
- self.log = QLabel("<a href='showlog'>Show Log</a>", self)
- self.rspec = QLabel("<a href='showlog'>Show RSpec</a>", self)
+ self.tracker = QLabel("<a href='showtracker'>Xmlrpc</a>", self)
+ self.log = QLabel("<a href='showlog'>Log</a>", self)
+ self.rspec = QLabel("<a href='showlog'>RSpec</a>", self)
+ self.resources = QLabel("<a href='showlog'>Resources</a>", self)
hlayout = QHBoxLayout()
hlayout.addWidget(self.status)
hlayout.addStretch()
hlayout.addWidget(self.tracker)
hlayout.addWidget(self.rspec)
+ hlayout.addWidget(self.resources)
hlayout.addWidget(self.log)
layout = QVBoxLayout()
self.showLogWindow)
self.connect(self.rspec, SIGNAL('linkActivated(QString)'),
self.showRSpecWindow)
+ self.connect(self.resources, SIGNAL('linkActivated(QString)'),
+ self.showResourcesWindow)
def redirectOutputToLog(self):
self.logWindow.redirectOutput()
self.rspecWindow.raise_()
self.rspecWindow.activateWindow()
+ def showResourcesWindow(self, link):
+ self.resourcesWindow.show()
+ self.resourcesWindow.resize(500, 640)
+ self.resourcesWindow.raise_()
+ self.resourcesWindow.activateWindow()
+
def animatePixmap(self, y):
self.pix.move(0, y)
from sface.xmlwidget import *
from sface.config import config
from sface.screens.sfascreen import SfaScreen
+from sface.sfidata import SfiData
class RSpecView(XmlView):
for r in range(rows):
child_index = index.child(r, 0)
search(child_index)
-
+
root_rows = model.rowCount()
for r in range(root_rows):
index = model.index(r, 0)
def showNode(self, hostname):
self.view.expandMatchingText(hostname)
- def updateView(self):
- XmlWindow.updateView(self)
+ def readContent(self):
+ rspec = SfiData().getSliceRSpec()
+ if not rspec:
+ return ""
+
+ return rspec.toxml()
+
+class ResourcesWindow(XmlWindow):
+ def __init__(self, parent=None):
+ XmlWindow.__init__(self, parent, 'Resources Window')
+
+ def initView(self):
+ return RSpecView(self)
+
+ def showNode(self, hostname):
+ self.view.expandMatchingText(hostname)
+
+ def readContent(self):
+ rspec = SfiData().getResourcesRSpec()
+ if not rspec:
+ return ""
+
+ return rspec.toxml()
- rspec_file = config.getSliceRSpecFile()
- if not os.path.exists(rspec_file):
- return
- self.document.setContent(open(rspec_file,'r').read())
from sface.sfirenew import RenewWindow
from sface.sfiprocess import SfiProcess
from sface.screens.sfascreen import SfaScreen
+from sface.sfidata import SfiData
already_in_nodes = []
self.updateView()
def submitFinished(self):
+ self.disconnect(self.process, SIGNAL('finished()'), self.submitFinished)
+
faultString = self.process.getFaultString()
if not faultString:
self.setStatus("<font color='green'>Slice data submitted.</font>")
self.updateView()
self.parent().signalAll("rspecUpdated")
- def refreshFinished(self):
+ def refreshResourcesFinished(self):
+ self.disconnect(self.process, SIGNAL('finished()'), self.refreshResourcesFinished)
+
+ self.setStatus("Refreshing slice RSpec.")
+ self.connect(self.process, SIGNAL('finished()'), self.refreshRSpecFinished)
+ self.process.retrieveRspec()
+
+ def refreshRSpecFinished(self):
+ self.disconnect(self.process, SIGNAL('finished()'), self.refreshRSpecFinished)
self.setStatus("<font color='green'>Slice data refreshed.</font>", timeout=5000)
self.updateView()
self.parent().signalAll("rspecUpdated")
- def readSliceRSpec(self):
- rspec_file = config.getSliceRSpecFile()
- if os.path.exists(rspec_file):
- xml = open(rspec_file).read()
- return parse_rspec(xml)
- return None
-
def setStatus(self, msg, timeout=None):
self.parent().setStatus(msg, timeout)
return item.data(Qt.DisplayRole).toString()
# Recursively walk the tree, making changes to the RSpec
- def process_subtree(self, rspec, item, depth = 0):
+ def process_subtree(self, rspec, resources, item, depth = 0):
change = False
model = self.nodeModel
status = self.itemStatus(item)
if status == node_status['add']:
print "Add hostname: %s" % hostname
- rspec.add_slivers(str(hostname), testbed)
- change = True
+
+ resource_node = resources.get_node_element(hostname)
+
+ if resource_node==None:
+ print "Error: Failed to find %s in resources rspec" % hostname
+ else:
+ rspec.merge_node(resource_node, testbed)
+ rspec.add_slivers(str(hostname), testbed)
+ change = True
elif status == node_status['remove']:
print "Remove hostname: %s" % hostname
rspec.remove_slivers(str(hostname), testbed)
children = item.rowCount()
for row in range(0, children):
- status = self.process_subtree(rspec, item.child(row), depth + 1)
+ status = self.process_subtree(rspec, resources, item.child(row), depth + 1)
change = change or status
return change
if self.checkRunningProcess():
return
- rspec = self.readSliceRSpec()
- change = self.process_subtree(rspec, self.nodeModel.invisibleRootItem())
+ rspec = SfiData().getSliceRSpec()
+ resources = SfiData().getResourcesRSpec()
+ change = self.process_subtree(rspec, resources, self.nodeModel.invisibleRootItem())
if not change:
self.setStatus("<font color=red>No change in slice data. Not submitting!</font>", timeout=3000)
return
- self.disconnect(self.process, SIGNAL('finished()'), self.refreshFinished)
self.connect(self.process, SIGNAL('finished()'), self.submitFinished)
self.process.applyRSpec(rspec)
self.setStatus("<font color='red'>There is already a process running. Please wait.</font>")
return
- self.disconnect(self.process, SIGNAL('finished()'), self.submitFinished)
- self.connect(self.process, SIGNAL('finished()'), self.refreshFinished)
+ self.connect(self.process, SIGNAL('finished()'), self.refreshResourcesFinished)
- self.process.retrieveRspec()
- self.setStatus("Refreshing slice data. This will take some time...")
+ self.process.retrieveResources()
+ self.setStatus("Refreshing resources. This will take some time...")
def updateView(self):
global already_in_nodes
self.network_names = []
self.nodeModel.clear()
- rspec = self.readSliceRSpec()
+ rspec = SfiData().getSliceRSpec()
if not rspec:
return None
+ resources = SfiData().getResourcesRSpec()
+ if not resources:
+ return None
+
rootItem = self.nodeModel.invisibleRootItem()
- #networks = sorted(rspec.get_network_list())
networks = rspec.get_networks()
+
+ for network in resources.get_networks():
+ if not network in networks:
+ networks.append(network)
+
for network in networks:
self.network_names.append(network)
- #all_nodes = rspec.get_node_list(network)
- #sliver_nodes = rspec.get_sliver_list(network)
- all_nodes = rspec.get_nodes(network)
+ all_nodes = resources.get_nodes(network)
sliver_nodes = rspec.get_nodes_with_slivers(network)
+
available_nodes = [ node for node in all_nodes if node not in sliver_nodes ]
networkItem = QStandardItem(QString(network))
for node in available_nodes:
nodeItem = QStandardItem(QString(node))
statusItem = QStandardItem(QString(node_status['out']))
- nodeStatus = QStandardItem(QString(rspec.get_node_element(node, network).attrib.get("boot_state","")))
+ nodeStatus = QStandardItem(QString(resources.get_node_element(node, network).attrib.get("boot_state","")))
networkItem.appendRow([nodeItem, nodeStatus, statusItem, QStandardItem(QString("node"))])
self.filterModel.setSourceModel(self.nodeModel)
from sface.config import config
from sface.sfiprocess import SfiProcess
from sface.screens.sfascreen import SfaScreen
+from sface.sfidata import SfiData
NAME_COLUMN = 0
#ROLE_COLUMN = 1
slice_persons.append({"name": name, "role": "researcher", "member": user_status["in"]})
added_persons.append(name)
- i=0
- while (os.path.exists(config.getAuthorityListFile(i))):
- rec = self.readUserRecord(i)
- if rec:
- type = str(rec.get_type())
- if (type == "user"):
- name = str(rec.get_name())
- if not name in added_persons:
- slice_persons.append({"name": name, "role": "", "member": user_status["out"]})
- added_persons.append(name)
- i=i+1
+ userNames = SfiData().getAuthorityHrns(type="user")
+ for name in userNames:
+ if not name in added_persons:
+ slice_persons.append({"name": name, "role": "", "member": user_status["out"]})
+ added_persons.append(name)
rootItem = self.invisibleRootItem()
return researchers
- def readUserRecord(self, i):
- rec_file = config.getAuthorityListFile(i)
- if os.path.exists(rec_file):
- xml = open(rec_file).read()
- rec = UserRecord()
- rec.load_from_string(xml)
- return rec
- return None
-
class UsersWidget(QWidget):
def __init__(self, parent):
QWidget.__init__(self, parent)
else:
self.setStatus("<font color='red'>Authority rec refresh error: %s</font>" % (faultString))
- def readSliceRecord(self):
- rec_file = config.getSliceRecordFile()
- if os.path.exists(rec_file):
- xml = open(rec_file).read()
- rec = SliceRecord()
- rec.load_from_string(xml)
- return rec
- return None
-
- def readAuthorityRecord(self):
- rec_file = config.getAuthorityRecordFile()
- if os.path.exists(rec_file):
- xml = open(rec_file).read()
- rec = AuthorityRecord()
- rec.load_from_string(xml)
- return rec
- return None
-
def setStatus(self, msg, timeout=None):
self.parent().setStatus(msg, timeout)
if self.checkRunningProcess():
return
- rec = self.readSliceRecord()
+ rec = SfiData().getSliceRecord()
change = self.userModel.updateRecord(rec)
if not change:
def refreshAuthority(self):
self.connect(self.process, SIGNAL('finished()'), self.getAuthorityRecordFinished)
- self.process.listRecords(config.getAuthority(), None, config.getAuthorityListFile())
+ self.process.listRecords(config.getAuthority(), None)
self.setStatus("Refreshing user records. This will take some time...")
def updateView(self):
- sliceRec = self.readSliceRecord()
+ sliceRec = SfiData().getSliceRecord()
if not sliceRec:
# wait until we've resolved the slicerecord before displaying
import sys
import time
+from distutils.version import LooseVersion
+from sfa.util.version import version_core
+
from PyQt4.QtCore import *
from sface.config import config
from sface.xmlrpcwindow import get_tracker, XmlrpcReader
self.start()
return filename
+ def retrieveResources(self):
+ mgr = config.getSlicemgr()
+ # Write RSpec to file
+ filename = config.getResourcesRSpecFile()
+ try:
+ os.remove(filename)
+ except:
+ pass
+ args = ["-u", config.getUser(), "-a", config.getAuthority(),
+ "-r", config.getRegistry(), "-s", mgr, "resources",
+ "-o", filename]
+
+ self.__init_command(args)
+ self.start()
+ return filename
+
def listRecords(self, hrn, rectype=None, filename=None):
args = ["-u", config.getUser(), "-a", config.getAuthority(),
"-r", config.getRegistry(), "-s", config.getSlicemgr(), "list", hrn]
- if filename:
- # we can't tell whether SFI will create one file or many, so delete
- # leftovers from last time, then we'll know what we got, after we get it.
- if os.path.exists(filename):
- os.remove(filename)
- if os.path.exists(filename + ".1"):
- os.remove(filename + ".1")
- args.append("-o")
- args.append(filename)
+ if not filename:
+ if LooseVersion(version_core()['code_tag']) <= LooseVersion("1.0-35"):
+ # DEPRECATED
+ filename = config.getAuthorityListRecordFile()
+ else:
+ filename = config.getAuthorityListFile()
+
+ # we can't tell whether SFI will create one file or many, so delete
+ # leftovers from last time, then we'll know what we got, after we get it.
+ if os.path.exists(filename):
+ os.remove(filename)
+ if os.path.exists(filename + ".1"):
+ os.remove(filename + ".1")
+ args.append("-o")
+ args.append(filename)
if rectype:
args.append("-t")
from sfa.util.record import SfaRecord, SliceRecord, AuthorityRecord
from sface.config import config
+from sface.sfidata import SfiData
NAME_COLUMN = 0
MEMBERSHIP_STATUS_COLUMN = 1
def updateModel(self):
self.clear()
- slice_names = []
-
- i=0
- while (os.path.exists(config.getAuthorityListFile(i))):
- rec = self.readSliceRecord(i)
- if rec:
- name = str(rec.get_name())
- if (rec.get_type() == "slice"):
- slice_names.append(name)
- i=i+1
+ slice_names = SfiData().getAuthorityHrns(type="slice")
rootItem = self.invisibleRootItem()
return slices
- def readSliceRecord(self, i):
- rec_file = config.getAuthorityListFile(i)
- if os.path.exists(rec_file):
- xml = open(rec_file).read()
- rec = SliceRecord()
- rec.load_from_string(xml)
- return rec
- return None
-
methodName = "<exception in parseMethodCall>"
request["args"] = [str(x) for x in pythonParams]
- request["methodName"] = methodName # methodNames[0].text
+ request["methodName"] = methodName
return request
self.updateView()
QDialog.show(self)
+ def readContent(self):
+ raise ValueError("readContent needs to be implemented in the subclass")
+
def updateView(self):
del self.document
del self.model
self.view.setModel(self.model)
- #move the code below to rspec window
- rspec_file = config.getSliceRSpecFile()
- if not os.path.exists(rspec_file):
- return
-
- self.document.setContent(open(rspec_file,'r').read())
+ self.document.setContent(self.readContent())
if self.document.childNodes().count() == 0:
# empty document - do nothing
document.drawContents(painter)
painter.restore()
-