From: Andy Bavier Date: Mon, 21 Feb 2011 22:10:18 +0000 (-0500) Subject: Remove slice tags X-Git-Tag: sface-0.1-5~5 X-Git-Url: http://git.onelab.eu/?p=sface.git;a=commitdiff_plain;h=36c83a6d4bcb418e1b848eb71733a8decf798c7e Remove slice tags Allow the user to remove slice tags by clicking on them if he has permission. Currently the set of user-settable tags is hardcoded and very small. The information about which tags are settable by the user should probably be somewhere in the RSpec... --- diff --git a/sface/screens/mainscreen.py b/sface/screens/mainscreen.py index 4792179..5e2d090 100644 --- a/sface/screens/mainscreen.py +++ b/sface/screens/mainscreen.py @@ -20,6 +20,9 @@ tag_status = { "in": "Already Set", "add": "To be Added", "remove": "To be Removed"} +default_tags = "Default tags" +settable_tags = ['delegations', 'initscript'] + def itemType(index): if index.parent().parent().isValid(): return "tag" @@ -49,6 +52,11 @@ class NodeView(QTreeView): node_data = node_index.data().toString() if itemType(node_index) == "tag": + tagname, value = node_index.data().toStringList() + if tagname not in settable_tags: + # Pop up error msg + QMessageBox.warning(self, "Not settable", "Insufficient permission to change '%s' tag" % tagname) + return if status_data == tag_status['in']: model.setData(status_index, QString(tag_status['remove'])) elif status_data == tag_status['add']: @@ -183,8 +191,7 @@ class TreeItem: for c in self.childItems: all.append(c) if c.childItems: - for cc in c.childItems: - all.append(cc) + all.extend(c.allChildItems()) return all def appendChild(self, child): @@ -426,6 +433,12 @@ class SliceWidget(QWidget): filters = networks + [str(filter_string)] self.filterModel.setFilterRegExp(QRegExp('|'.join(filters))) + def levels_down(self, item): + if item == self.nodeModel.rootItem: + return 0 + else: + return self.levels_down(item.parent()) + 1 + def submit(self): if self.checkRunningProcess(): return @@ -435,16 +448,43 @@ class SliceWidget(QWidget): no_change = True all_child = self.nodeModel.rootItem.allChildItems() for c in all_child: - testbed, hostname, status = c.itemData + testbed, name, status = c.itemData + if isinstance(status, QVariant): status = status.toString() - if status == node_status['add']: - rspec.add_sliver(hostname) - no_change = False - elif str(status) == node_status['remove']: - rspec.remove_sliver(hostname) - no_change = False + treelevel = self.levels_down(c) + + if treelevel == 2: + testbed = c.parent().itemData[0] + if status == node_status['add']: + #print "Add hostname: %s" % name + rspec.add_sliver(name, testbed) + no_change = False + elif status == node_status['remove']: + #print "Remove hostname: %s" % name + rspec.remove_sliver(name, testbed) + no_change = False + elif treelevel == 3: + # A tag entry + tag, value = name + tag = "%s" % tag # Prevent weird error from lxml + node = c.parent().itemData[1] + testbed = c.parent().parent().itemData[0] + if status == tag_status['add']: + #print "Add tag: %s/%s " % (tag, value) + if node.startswith(default_tags): + rspec.add_default_sliver.attribute(tag, value, testbed) + else: + rspec.add_sliver_attribute(tag, value, node, testbed) + no_change = False + elif status == node_status['remove']: + #print "Remove tag: %s/%s" % (tag, value) + if node.startsWith(default_tags): + rspec.remove_default_sliver_attribute(tag, value, testbed) + else: + rspec.remove_sliver_attribute(node, tag, value, testbed) + no_change = False if no_change: self.setStatus("No change in slice data. Not submitting!", timeout=3000) @@ -486,12 +526,6 @@ class SliceWidget(QWidget): for network in networks: self.network_names.append(network) data = [QString(network), QString(""), QString("")] - #taglist = QStringList() - #attrs = rspec.get_default_sliver_attributes(network) - #for (name, value) in attrs: - # taglist.append(QString("%s/%s" % (name, value))) - # taglist.append(QString("in")) - #data.append(taglist) networkItem = TreeItem(data, self.nodeModel.rootItem) all_nodes = rspec.get_node_list(network) sliver_nodes = rspec.get_sliver_list(network) @@ -499,6 +533,18 @@ class SliceWidget(QWidget): already_in_nodes += sliver_nodes + # Add default slice tags + data = [QString(""), QString("%s for %s" % (default_tags, network)), + QString("")] + nodeItem = TreeItem(data, networkItem) + networkItem.appendChild(nodeItem) + attrs = rspec.get_default_sliver_attributes(network) + for (name, value) in attrs: + tagstring = QStringList([name, value]) + data = [QString(""), tagstring, QString(tag_status['in'])] + tagItem = TreeItem(data, nodeItem) + nodeItem.appendChild(tagItem) + for node in sliver_nodes: data = [QString(""), QString(node), QString(node_status['in'])] nodeItem = TreeItem(data, networkItem) @@ -512,7 +558,7 @@ class SliceWidget(QWidget): nodeItem.appendChild(tagItem) for node in available_nodes: - nodeItem = TreeItem([QString(""), QString(node), QString(node_status['out']), QString("")], networkItem) + nodeItem = TreeItem([QString(""), QString(node), QString(node_status['out'])], networkItem) networkItem.appendChild(nodeItem) self.nodeModel.rootItem.appendChild(networkItem)