revert to showing only the settings
[sfa-gui.git] / SliverPanel.py
1 from pyjamas.ui.VerticalPanel import VerticalPanel
2 from pyjamas.ui.HorizontalPanel import HorizontalPanel
3 from pyjamas.ui.CaptionPanel import CaptionPanel
4 from pyjamas.ui.ListBox import ListBox
5 from pyjamas.ui.TextBox import TextBox
6 from pyjamas.ui.Button import Button
7 from pyjamas.ui.HTML import HTML
8 from pyjamas.ui.Image import Image
9 from pyjamas.ui import HasAlignment
10
11 class AddPanel(CaptionPanel):
12     def __init__(self, top):
13         CaptionPanel.__init__(self, "Add attribute")
14         self.top = top
15
16         hp = HorizontalPanel()
17         self.nodes = ListBox()
18         self.nodes.addItem("All nodes")
19         rspec = self.top.sfadata.getRSpec()
20         for sliver in rspec.get_sliver_list():
21             self.nodes.addItem(sliver)
22
23         self.attrs = ListBox()
24         # Hardcoded for now...
25         names = ['capabilities', 'codemux', 'cpu_pct', 'cpu_share', 
26                  'delegations', 'disk_max', 'initscript', 'ip_addresses',
27                  'net_i2_max_kbyte', 'net_i2_max_rate', 'net_i2_min_rate',
28                  'net_i2_share', 'net_i2_thresh_kbyte', 
29                  'net_max_kbyte', 'net_max_rate', 'net_min_rate',
30                  'net_share', 'net_thresh_kbyte', 
31                  'vsys', 'vsys_vnet']
32         for name in names:
33             self.attrs.addItem(name)
34
35         self.value = TextBox()
36
37         hp.add(self.attrs)
38         hp.add(self.value)
39         hp.add(self.nodes)
40         hp.add(Button("Add", self.go))
41
42         self.add(hp)
43
44     def go(self, sender):
45         name = self.attrs.getItemText(self.attrs.getSelectedIndex())
46         value = self.value.getText()
47         nodeindex = self.nodes.getSelectedIndex()
48         rspec = self.top.sfadata.getRSpec()
49         if nodeindex == 0:
50             rspec.add_default_sliver_attribute(name, value)
51         else:
52             node = self.nodes.getItemText(nodeindex)
53             rspec.add_sliver_attribute(node, name, value)
54         self.top.refresh()
55         
56
57 class AttributePanel(HorizontalPanel):
58     def __init__(self, top, name, value, node=None):
59         HorizontalPanel.__init__(self)
60         self.name = name
61         self.value = value
62         self.node = node
63         self.top = top
64
65         self.setSpacing(5)
66         self.setVerticalAlignment(HasAlignment.ALIGN_MIDDLE)
67         delete = Image("./images/cancel.png")
68         delete.addClickListener(self)
69         self.add(delete)
70         self.add(HTML("%s: %s" % (self.name, self.value)))
71
72     def onClick(self, sender):
73         rspec = self.top.sfadata.getRSpec()
74         if self.node:
75             rspec.remove_sliver_attribute(self.node, self.name, self.value)
76         else:
77             rspec.remove_default_sliver_attribute(self.name, self.value)
78         self.top.refresh()
79         
80
81 class SliverPanel(VerticalPanel):
82     def __init__(self, sfadata):
83         VerticalPanel.__init__(self)
84         self.sfadata = sfadata
85         self.setStyleName("ks-layouts")
86         self.refresh()
87
88     def refresh(self):
89         self.clear()
90         self.add(AddPanel(self))
91
92         rspec = self.sfadata.getRSpec()
93         allattrs = rspec.get_default_sliver_attributes()
94         attrdict = {}
95         slivers = rspec.get_sliver_list()
96         for sliver in slivers:
97             attrs = rspec.get_sliver_attributes(sliver)
98             attrdict[sliver] = attrs
99
100         if allattrs:
101             cp = CaptionPanel("All nodes")
102             vp = VerticalPanel()
103             for (name, value) in allattrs:
104                 ap = AttributePanel(self, name, value)
105                 vp.add(ap)
106             cp.add(vp)
107             self.add(cp)
108
109         for sliver in slivers:
110             if attrdict[sliver]:
111                 cp = CaptionPanel(sliver)
112                 for (name, value) in attrdict[sliver]:
113                     ap = AttributePanel(self, name, value, sliver)
114                     cp.add(ap)
115                 self.add(cp)
116