Remove slice tags
authorAndy Bavier <acb@acb-imac.cs.princeton.edu>
Mon, 21 Feb 2011 22:10:18 +0000 (17:10 -0500)
committerAndy Bavier <acb@acb-imac.cs.princeton.edu>
Mon, 21 Feb 2011 22:10:18 +0000 (17:10 -0500)
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...

sface/screens/mainscreen.py

index 4792179..5e2d090 100644 (file)
@@ -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("<font color=red>No change in slice data. Not submitting!</font>", 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)