Added Node selection and Sliver (attribute) configuration panels to
[sfa-gui.git] / SliverPanel.py
diff --git a/SliverPanel.py b/SliverPanel.py
new file mode 100644 (file)
index 0000000..2ca4bbf
--- /dev/null
@@ -0,0 +1,114 @@
+from pyjamas.ui.VerticalPanel import VerticalPanel
+from pyjamas.ui.HorizontalPanel import HorizontalPanel
+from pyjamas.ui.CaptionPanel import CaptionPanel
+from pyjamas.ui.ListBox import ListBox
+from pyjamas.ui.TextBox import TextBox
+from pyjamas.ui.Button import Button
+from pyjamas.ui.HTML import HTML
+from pyjamas.ui import HasAlignment
+
+class AddPanel(CaptionPanel):
+    def __init__(self, top):
+        CaptionPanel.__init__(self, "Add attribute")
+        self.top = top
+
+        hp = HorizontalPanel()
+        self.nodes = ListBox()
+        self.nodes.addItem("All nodes")
+        for sliver in self.top.rspec.get_sliver_list():
+            self.nodes.addItem(sliver)
+
+        self.attrs = ListBox()
+        # Hardcoded for now...
+        names = ['capabilities', 'codemux', 'cpu_pct', 'cpu_share', 
+                 'delegations', 'disk_max', 'initscript', 'ip_addresses',
+                 'net_i2_max_kbyte', 'net_i2_max_rate', 'net_i2_min_rate',
+                 'net_i2_share', 'net_i2_thresh_kbyte', 
+                 'net_max_kbyte', 'net_max_rate', 'net_min_rate',
+                 'net_share', 'net_thresh_kbyte', 
+                 'vsys', 'vsys_vnet']
+        for name in names:
+            self.attrs.addItem(name)
+
+        self.value = TextBox()
+
+        hp.add(self.attrs)
+        hp.add(self.value)
+        hp.add(self.nodes)
+        hp.add(Button("Add", self.go))
+
+        self.add(hp)
+
+    def go(self, sender):
+        name = self.attrs.getItemText(self.attrs.getSelectedIndex())
+        value = self.value.getText()
+        nodeindex = self.nodes.getSelectedIndex()
+        if nodeindex == 0:
+            self.top.rspec.add_default_sliver_attribute(name, value)
+        else:
+            node = self.nodes.getItemText(nodeindex)
+            self.top.rspec.add_sliver_attribute(node, name, value)
+        self.top.refresh()
+        
+
+class AttributePanel(HorizontalPanel):
+    def __init__(self, top, name, value, node=None):
+        HorizontalPanel.__init__(self)
+        self.name = name
+        self.value = value
+        self.node = node
+        self.top = top
+
+        self.setSpacing(5)
+        self.setVerticalAlignment(HasAlignment.ALIGN_MIDDLE)
+        if not node:
+            b = Button("X", self.delete_all)
+        else:
+            b = Button("X", self.delete)
+        self.add(b)
+        self.add(HTML("%s: %s" % (self.name, self.value)))
+
+    def delete_all(self, sender):
+        self.top.rspec.remove_default_sliver_attribute(self.name, self.value)
+        self.top.refresh()
+
+    def delete(self, sender):
+        self.top.rspec.remove_sliver_attribute(self.node, self.name, self.value)
+        self.top.refresh()
+
+
+class SliverPanel(VerticalPanel):
+    def __init__(self, sfadata, rspec):
+        VerticalPanel.__init__(self)
+        self.data = sfadata
+        self.rspec = rspec
+        self.refresh()
+
+    def refresh(self):
+        self.clear()
+        self.add(AddPanel(self))
+
+        allattrs = self.rspec.get_default_sliver_attributes()
+        attrdict = {}
+        slivers = self.rspec.get_sliver_list()
+        for sliver in slivers:
+            attrs = self.rspec.get_sliver_attributes(sliver)
+            attrdict[sliver] = attrs
+
+        if allattrs:
+            cp = CaptionPanel("All nodes")
+            vp = VerticalPanel()
+            for (name, value) in allattrs:
+                ap = AttributePanel(self, name, value)
+                vp.add(ap)
+            cp.add(vp)
+            self.add(cp)
+
+        for sliver in slivers:
+            if attrdict[sliver]:
+                cp = CaptionPanel(sliver)
+                for (name, value) in attrdict[sliver]:
+                    ap = AttributePanel(self, name, value, sliver)
+                    cp.add(ap)
+                self.add(cp)
+