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