0645b186840161674f878bf1606fcf9500c5e0f7
[monitor.git] / monitor / wrapper / plccache.py
1 #!/usr/bin/python
2
3 import sys
4 from monitor.wrapper import plc
5 from monitor.database.info.model import *
6
7 def dsites_from_lsites(l_sites):
8         d_sites = {}
9         id2lb = {}
10         for site in l_sites:
11                 if not site['login_base'] in d_sites:
12                         d_sites[site['login_base']] = site
13                         id2lb[site['site_id']] = site['login_base']
14                 else:
15                         #print "Two sites have the same login_base value %s!" % site['login_base']
16                         #sys.exit(1)
17                         continue
18         return (d_sites, id2lb)
19
20 def dsn_from_dsln(d_sites, id2lb, l_nodes):
21         lb2hn = {}
22         dsn = {}
23         hn2lb = {}
24         for id in id2lb:
25                 if id2lb[id] not in lb2hn:
26                         lb2hn[id2lb[id]] = []
27
28         for node in l_nodes:
29                 # this won't reach sites without nodes, which I guess isn't a problem.
30                 if node['site_id'] in id2lb.keys():
31                         login_base = id2lb[node['site_id']]
32                 else:
33                         print "%s has a foreign site_id %s" % (node['hostname'], 
34                                                                                                         node['site_id'])
35                         continue
36                         for i in id2lb:
37                                 print i, " ", id2lb[i]
38                         raise Exception, "Node has missing site id!! %s %d" %(node['hostname'], node['site_id'])
39                 if not login_base in dsn:
40                         lb2hn[login_base] = []
41                         dsn[login_base] = {}
42                         dsn[login_base]['plc'] = d_sites[login_base]
43                         dsn[login_base]['monitor'] = {} # event log, or something
44
45                 hostname = node['hostname']
46                 lb2hn[login_base].append(node)
47                 dsn[login_base][hostname] = {}
48                 dsn[login_base][hostname]['plc'] = node
49                 dsn[login_base][hostname]['comon'] = {}
50                 dsn[login_base][hostname]['monitor'] = {}
51
52                 hn2lb[hostname] = login_base
53         return (dsn, hn2lb, lb2hn)
54
55 l_sites = None
56 l_nodes = None
57 l_pcus = None
58
59 plcdb_hn2lb = None
60 plcdb_lb2hn = None
61 plcdb_id2lb = None
62
63 def init():
64         global l_sites
65         global l_nodes
66         global l_pcus
67         global plcdb_hn2lb
68         global plcdb_lb2hn
69         global plcdb_id2lb
70
71         dbsites = PlcSite.query.all()
72         l_sites = [ s.plc_site_stats for s in dbsites ]
73
74         dbnodes = PlcNode.query.all()
75         l_nodes = [ s.plc_node_stats for s in dbnodes ]
76
77         dbpcus = PlcPCU.query.all()
78         l_pcus = [ s.plc_pcu_stats for s in dbpcus ]
79
80         (d_sites,id2lb) = dsites_from_lsites(l_sites)
81         (plcdb, hn2lb, lb2hn) = dsn_from_dsln(d_sites, id2lb, l_nodes)
82
83         plcdb_hn2lb = hn2lb
84         plcdb_lb2hn = lb2hn
85         plcdb_id2lb = id2lb
86         
87         return
88
89 def GetNodesByIds(ids):
90         ret = []
91         for node_id in ids:
92                 node = PlcNode.get_by(node_id=node_id)
93                 ret.append(node.plc_node_stats)
94         return ret
95
96 def GetNodesBySite(loginbase):
97         site = PlcSite.get_by(loginbase=loginbase)
98         return GetNodesByIds(site.plc_site_stats['node_ids'])
99
100 def GetNodeByName(hostname):
101         node = PlcNode.get_by(hostname=hostname)
102         return node.plc_node_stats
103
104 def GetSitesByName(sitelist):
105         ret = []
106         for site in sitelist:
107                 site = PlcSite.get_by(loginbase=site)
108                 ret.append(site.plc_site_stats)
109         return ret
110
111 def sync():
112         l_sites = plc.api.GetSites({'peer_id':None}, 
113                                                 ['login_base', 'site_id', 'abbreviated_name', 'latitude', 
114                                                 'longitude', 'max_slices', 'slice_ids', 'node_ids', 
115                                                 'enabled', 'date_created' ])
116         l_nodes = plc.api.GetNodes({'peer_id':None}, 
117                                                 ['hostname', 'node_id', 'ports', 'site_id', 
118                                                  'version', 'last_updated', 'date_created', 
119                                                  'last_contact', 'pcu_ids', 'nodenetwork_ids'])
120         l_pcus = plc.api.GetPCUs()
121
122         print "sync sites"
123         for site in l_sites:
124                 dbsite = PlcSite.findby_or_create(site_id=site['site_id'])
125                 dbsite.loginbase = site['login_base']
126                 dbsite.date_checked = datetime.now()
127                 dbsite.plc_site_stats = site
128                 #dbsite.flush()
129         # TODO: delete old records.
130         session.flush()
131
132         print "sync nodes"
133         for node in l_nodes:
134                 dbnode = PlcNode.findby_or_create(node_id=node['node_id'])
135                 dbnode.hostname = node['hostname']
136                 dbnode.date_checked = datetime.now()
137                 dbnode.plc_node_stats = node
138                 #dbnode.flush()
139         # TODO: delete old records.
140         session.flush()
141
142         print "sync pcus"
143         for pcu in l_pcus:
144                 dbpcu = PlcPCU.findby_or_create(pcu_id=pcu['pcu_id'])
145                 dbpcu.date_checked = datetime.now()
146                 dbpcu.plc_pcu_stats = pcu
147                 #dbpcu.flush()
148         # TODO: delete old records.
149         session.flush()
150
151         init()
152
153         return
154
155 if __name__ == '__main__':
156         sync()
157 else:
158         init()