Read ~/.sfi/sfi_config
[sfa-gui.git] / LinkPanel.py
1 from pyjamas.ui.VerticalPanel import VerticalPanel
2 from pyjamas.ui.Grid import Grid
3 from pyjamas.ui.DockPanel import DockPanel
4 from pyjamas.ui.HorizontalPanel import HorizontalPanel
5 from pyjamas.ui.CaptionPanel import CaptionPanel
6 from pyjamas.ui.CheckBox import CheckBox
7 from pyjamas.ui.TextBox import TextBox
8 from pyjamas.ui.Button import Button
9 from pyjamas.ui.HTML import HTML
10 from pyjamas.ui.Image import Image
11 from pyjamas.ui import HasAlignment
12
13 class TopPanel(DockPanel):
14     def __init__(self, top, bw, active = False):
15         DockPanel.__init__(self)
16         self.top = top
17         self.setWidth("100%")
18         self.cb = CheckBox("Use virtual topology")
19         self.cb.setChecked(active)
20         self.cb.addClickListener(self)
21         hp = HorizontalPanel()
22         self.tb = TextBox()
23         self.tb.setVisibleLength(8)
24         self.tb.setTextAlignment(self.tb.ALIGN_RIGHT)
25         self.tb.setText(bw)
26         hp.add(HTML("Default bandwidth: "))
27         hp.add(self.tb)
28         hp.add(HTML(" kbps"))
29
30         self.add(self.cb, DockPanel.WEST)
31         self.add(hp, DockPanel.EAST)
32         self.setCellHorizontalAlignment(hp, HasAlignment.ALIGN_RIGHT)
33
34     def onClick(self, sender):
35         if sender == self.cb:
36             if sender.isChecked():
37                 self.top.build_topology()
38                 self.top.refresh()
39             else:
40                 self.top.clear_vlinks()
41                 ## Unset vini_topo attribute?
42                 self.top.refresh()
43
44     def getDefaultBW(self):
45         bw = self.tb.getText()
46         return bw
47         
48 class VlinkPanel(DockPanel):
49     def __init__(self, top, handle, description, bw):
50         DockPanel.__init__(self)
51         self.handle = handle
52         self.description = description
53         self.bw = bw
54         self.top = top
55
56         hp1 = HorizontalPanel()
57         delete = Image("./images/cancel.png")
58         delete.addClickListener(self)
59         hp1.add(delete)
60         hp1.add(HTML(" %s" % self.description))
61         
62         hp2 = HorizontalPanel()
63         tb = TextBox()
64         tb.setVisibleLength(8)
65         tb.setTextAlignment(tb.ALIGN_RIGHT)
66         tb.setText(bw)
67         hp2.add(tb)
68         hp2.add(HTML(" kbps"))
69
70         self.add(hp1, DockPanel.WEST)
71         self.setCellHorizontalAlignment(hp1, HasAlignment.ALIGN_LEFT)
72         self.setCellWidth(hp1, "100%")
73
74         self.add(hp2, DockPanel.EAST)
75         self.setCellHorizontalAlignment(hp2, HasAlignment.ALIGN_RIGHT)
76         self.setWidth("100%")
77
78     def onClick(self, sender):
79         rspec = self.top.sfadata.getRSpec()
80         rspec.remove_vlink(self.handle)
81         self.top.refresh()
82
83
84 class LinkPanel(VerticalPanel):
85     def __init__(self, sfadata):
86         VerticalPanel.__init__(self)
87         self.sfadata = sfadata
88         self.defaultbw = 1000
89         self.setStyleName("ks-layouts")
90         self.refresh()
91
92     def refresh(self):
93         self.clear()
94         rspec = self.sfadata.getRSpec()
95         vlinks = rspec.get_vlink_list()
96
97         self.toppanel = TopPanel(self, self.defaultbw, (len(vlinks) > 0))
98         self.add(self.toppanel)
99
100         cp = CaptionPanel("Virtual links")
101         vp = VerticalPanel()
102         vp.setWidth("100%")
103         for (handle, desc, bw) in vlinks:
104             vp.add(VlinkPanel(self, handle, desc, bw))
105         cp.add(vp)
106         self.add(cp)
107
108     def clear_vlinks(self):
109         rspec = self.sfadata.getRSpec()
110         vlinks = rspec.get_vlink_list()
111         for (handle, desc, bw) in vlinks:
112             rspec.remove_vlink(handle)
113
114     def build_topology(self):
115         rspec = self.sfadata.getRSpec()
116         nodes = rspec.get_sliver_list()
117         links = rspec.get_link_list()
118         self.defaultbw = self.toppanel.getDefaultBW()
119
120         for (name, end1nodes, end2nodes) in links:
121             for node1 in end1nodes:
122                 for node2 in end2nodes:
123                     if (node1 in nodes) and (node2 in nodes):
124                         rspec.add_vlink(node1, node2, self.defaultbw)
125