Added Node selection and Sliver (attribute) configuration panels to
[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 import HasAlignment
9
10 class AddPanel(CaptionPanel):
11     def __init__(self, top):
12         CaptionPanel.__init__(self, "Add attribute")
13         self.top = top
14
15         hp = HorizontalPanel()
16         self.nodes = ListBox()
17         self.nodes.addItem("All nodes")
18         for sliver in self.top.rspec.get_sliver_list():
19             self.nodes.addItem(sliver)
20
21         self.attrs = ListBox()
22         # Hardcoded for now...
23         names = ['capabilities', 'codemux', 'cpu_pct', 'cpu_share', 
24                  'delegations', 'disk_max', 'initscript', 'ip_addresses',
25                  'net_i2_max_kbyte', 'net_i2_max_rate', 'net_i2_min_rate',
26                  'net_i2_share', 'net_i2_thresh_kbyte', 
27                  'net_max_kbyte', 'net_max_rate', 'net_min_rate',
28                  'net_share', 'net_thresh_kbyte', 
29                  'vsys', 'vsys_vnet']
30         for name in names:
31             self.attrs.addItem(name)
32
33         self.value = TextBox()
34
35         hp.add(self.attrs)
36         hp.add(self.value)
37         hp.add(self.nodes)
38         hp.add(Button("Add", self.go))
39
40         self.add(hp)
41
42     def go(self, sender):
43         name = self.attrs.getItemText(self.attrs.getSelectedIndex())
44         value = self.value.getText()
45         nodeindex = self.nodes.getSelectedIndex()
46         if nodeindex == 0:
47             self.top.rspec.add_default_sliver_attribute(name, value)
48         else:
49             node = self.nodes.getItemText(nodeindex)
50             self.top.rspec.add_sliver_attribute(node, name, value)
51         self.top.refresh()
52         
53
54 class AttributePanel(HorizontalPanel):
55     def __init__(self, top, name, value, node=None):
56         HorizontalPanel.__init__(self)
57         self.name = name
58         self.value = value
59         self.node = node
60         self.top = top
61
62         self.setSpacing(5)
63         self.setVerticalAlignment(HasAlignment.ALIGN_MIDDLE)
64         if not node:
65             b = Button("X", self.delete_all)
66         else:
67             b = Button("X", self.delete)
68         self.add(b)
69         self.add(HTML("%s: %s" % (self.name, self.value)))
70
71     def delete_all(self, sender):
72         self.top.rspec.remove_default_sliver_attribute(self.name, self.value)
73         self.top.refresh()
74
75     def delete(self, sender):
76         self.top.rspec.remove_sliver_attribute(self.node, self.name, 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