--- /dev/null
+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)
+