add sorting tables to the pcu view.
[monitor.git] / web / MonitorWeb / monitorweb / controllers.py
1 import turbogears as tg
2 from turbogears import controllers, expose, flash
3 # from monitorweb import model
4 # import logging
5 # log = logging.getLogger("monitorweb.controllers")
6 from monitor.database.info.model import *
7 from pcucontrol import reboot
8 from monitor.wrapper.plccache import plcdb_id2lb as site_id2lb
9
10 def format_ports(pcu):
11         retval = []
12         if pcu.port_status and len(pcu.port_status.keys()) > 0 :
13                 obj = reboot.model_to_object(pcu.plc_pcu_stats['model'])
14                 for port in obj.supported_ports:
15                         try:
16                                 state = pcu.port_status[str(port)]
17                         except:
18                                 state = "unknown"
19                                 
20                         retval.append( (port, state) )
21
22         if retval == []: 
23                 retval = [( "Closed/Filtered", "state" )]
24
25         return retval
26
27 def format_pcu_shortstatus(pcu):
28         status = "error"
29         if pcu.reboot_trial_status == str(0):
30                 status = "ok"
31         elif pcu.reboot_trial_status == "NetDown" or pcu.reboot_trial_status == "Not_Run":
32                 status = pcu.reboot_trial_status
33         else:
34                 status = "error"
35
36         return status
37
38 class Root(controllers.RootController):
39         @expose(template="monitorweb.templates.welcome")
40         def index(self):
41                 import time
42                 # log.debug("Happy TurboGears Controller Responding For Duty")
43                 flash("Your application is now running")
44                 return dict(now=time.ctime())
45
46         @expose(template="monitorweb.templates.nodelist")
47         def node(self, filter='BOOT'):
48                 import time
49                 fbquery = FindbadNodeRecord.get_all_latest()
50                 query = []
51                 filtercount = {'DOWN' : 0, 'BOOT': 0, 'DEBUG' : 0, 'neverboot' : 0, 'pending' : 0, 'all' : 0}
52                 for node in fbquery:
53                         if node.plc_pcuid:
54                                 pcu = FindbadPCURecord.get_latest_by(plc_pcuid=node.plc_pcuid).first()
55                                 if pcu:
56                                         node.pcu_status = pcu.reboot_trial_status
57                                 else:
58                                         node.pcu_status = "nodata"
59                                 node.pcu_short_status = format_pcu_shortstatus(pcu)
60
61                         else:
62                                 node.pcu_status = "nopcu"
63                                 node.pcu_short_status = "none"
64
65                         if node.kernel_version:
66                                 node.kernel = node.kernel_version.split()[2]
67                         else:
68                                 node.kernel = ""
69
70
71                         # NOTE: count filters
72                         if node.observed_status != 'DOWN':
73                                 filtercount[node.observed_status] += 1
74                         else:
75                                 if node.plc_node_stats['last_contact'] != None:
76                                         filtercount[node.observed_status] += 1
77                                 else:
78                                         filtercount['neverboot'] += 1
79
80                         # NOTE: apply filter
81                         if filter == node.observed_status:
82                                 if filter == "DOWN":
83                                         if node.plc_node_stats['last_contact'] != None:
84                                                 query.append(node)
85                                 else:
86                                         query.append(node)
87                         elif filter == "neverboot":
88                                 if node.plc_node_stats['last_contact'] == None:
89                                         query.append(node)
90                         elif filter == "pending":
91                                 # TODO: look in message logs...
92                                 pass
93                         elif filter == "all":
94                                 query.append(node)
95                                 
96                 return dict(now=time.ctime(), query=query, fc=filtercount)
97
98         @expose(template="monitorweb.templates.pculist")
99         def pcu(self, filter='all'):
100                 import time
101                 fbquery = FindbadPCURecord.get_all_latest()
102                 query = []
103                 filtercount = {'ok' : 0, 'NetDown': 0, 'Not_Run' : 0, 'pending' : 0, 'all' : 0}
104                 for node in fbquery:
105
106                         # NOTE: count filter
107                         if node.reboot_trial_status == str(0):
108                                 filtercount['ok'] += 1
109                         elif node.reboot_trial_status == 'NetDown' or node.reboot_trial_status == 'Not_Run':
110                                 filtercount[node.reboot_trial_status] += 1
111                         else:
112                                 filtercount['pending'] += 1
113                                 
114                         try:
115                                 node.loginbase = site_id2lb[node.plc_pcu_stats['site_id']]
116                         except:
117                                 node.loginbase = "unknown"
118
119                         node.ports = format_ports(node)
120                         node.status = format_pcu_shortstatus(node)
121
122                         # NOTE: apply filter
123                         if filter == "all":
124                                 query.append(node)
125                         elif filter == "ok" and node.reboot_trial_status == str(0):
126                                 query.append(node)
127                         elif filter == node.reboot_trial_status:
128                                 query.append(node)
129                         elif filter == "pending":
130                                 # TODO: look in message logs...
131                                 if node.reboot_trial_status != str(0) and \
132                                         node.reboot_trial_status != 'NetDown' and \
133                                         node.reboot_trial_status != 'Not_Run':
134
135                                         query.append(node)
136                                 
137                 return dict(query=query, fc=filtercount)
138
139         @expose(template="monitorweb.templates.sitelist")
140         def site(self, filter='all'):
141                 filtercount = {'good' : 0, 'down': 0, 'new' : 0, 'pending' : 0, 'all' : 0}
142                 fbquery = HistorySiteRecord.query.all()
143                 query = []
144                 for site in fbquery:
145                         # count filter
146                         filtercount['all'] += 1
147                         if site.new and site.slices_used == 0 and not site.enabled:
148                                 filtercount['new'] += 1
149                         elif not site.enabled:
150                                 filtercount['pending'] += 1
151                         else:
152                                 filtercount[site.status] += 1
153
154                         # apply filter
155                         if filter == "all":
156                                 query.append(site)
157                         elif filter == 'new' and site.new and site.slices_used == 0 and not site.enabled:
158                                 query.append(site)
159                         elif filter == "pending" and not site.enabled:
160                                 query.append(site)
161                         elif filter == site.status:
162                                 query.append(site)
163                                 
164                 return dict(query=query, fc=filtercount)
165
166         @expose(template="monitorweb.templates.pculist")
167         def action(self, filter='all'):
168                 filtercount = {'ok' : 0, 'NetDown': 0, 'Not_Run' : 0, 'pending' : 0, 'all' : 0}
169                 return dict(query=[], fc=filtercount)