add functions for pcuview, nodeview, & siteview
[monitor.git] / monitor / database / info / findbad.py
1 from elixir import Entity, Field, OneToMany, ManyToOne, ManyToMany
2 from elixir import options_defaults, using_options, setup_all, belongs_to
3 from elixir import String, Integer as Int, DateTime, PickleType, Boolean
4 from datetime import datetime,timedelta
5 import elixir
6 import traceback
7
8 from monitor.database.dborm import mon_metadata, mon_session
9 __metadata__ = mon_metadata
10 __session__  = mon_session
11
12
13 class FindbadNodeRecordSync(Entity):
14         hostname = Field(String(250),primary_key=True) #,alternateMethodName='by_hostname')
15         round    = Field(Int,default=0)
16         
17 class FindbadPCURecordSync(Entity):
18         plc_pcuid = Field(Int,primary_key=True) #,alternateMethodName='by_pcuid')
19         round     = Field(Int,default=0)
20
21 class FindbadNodeRecord(Entity):
22         @classmethod
23         def get_all_latest(cls):
24                 fbsync = FindbadNodeRecordSync.get_by(hostname="global")
25                 if fbsync:
26                         return cls.query.filter_by(round=fbsync.round)
27                 else:
28                         return []
29
30         @classmethod
31         def get_latest_by(cls, **kwargs):
32                 fbsync = FindbadNodeRecordSync.get_by(hostname="global")
33                 if fbsync:
34                         kwargs['round'] = fbsync.round
35                         return cls.query.filter_by(**kwargs)
36                 else:
37                         return []
38
39         @classmethod
40         def get_latest_n_by(cls, n=3, **kwargs):
41                 fbsync = FindbadNodeRecordSync.get_by(hostname="global")
42                 kwargs['round'] = fbsync.round
43                 ret = []
44                 for i in range(0,n):
45                         kwargs['round'] = kwargs['round'] - i
46                         f = cls.query.filter_by(**kwargs).first()
47                         if f:
48                                 ret.append(f)
49                 return ret
50
51 # ACCOUNTING
52         date_checked = Field(DateTime,default=datetime.now)
53         round = Field(Int,default=0)
54         hostname = Field(String,default=None)
55         loginbase = Field(String)
56
57 # INTERNAL
58         kernel_version = Field(String,default=None)
59         bootcd_version = Field(String,default=None)
60         nm_status = Field(String,default=None)
61         fs_status = Field(String,default=None)
62         dns_status = Field(String,default=None)
63         princeton_comon_dir = Field(Boolean,default=False)
64         princeton_comon_running = Field(Boolean,default=False)
65         princeton_comon_procs = Field(Int,default=None)
66
67 # EXTERNAL
68         plc_node_stats = Field(PickleType,default=None)
69         plc_site_stats = Field(PickleType,default=None)
70         plc_pcuid      = Field(Int,default=None)
71         comon_stats    = Field(PickleType,default=None)
72         port_status    = Field(PickleType,default=None)
73         ssh_portused = Field(Int,default=22)
74         ssh_status = Field(Boolean,default=False)
75         ssh_error = Field(String,default=None)  # set if ssh_access == False
76         ping_status = Field(Boolean,default=False)
77
78 # INFERRED
79         observed_category = Field(String,default=None)
80         observed_status = Field(String,default=None)
81
82         # NOTE: this is the child relation
83         action = ManyToOne('ActionRecord', required=False)
84
85 class FindbadPCURecord(Entity):
86         @classmethod
87         def get_all_latest(cls):
88                 fbsync = FindbadPCURecordSync.get_by(plc_pcuid=0)
89                 if fbsync:
90                         return cls.query.filter_by(round=fbsync.round)
91                 else:
92                         return []
93
94         @classmethod
95         def get_latest_by(cls, **kwargs):
96                 fbsync = FindbadPCURecordSync.get_by(plc_pcuid=0)
97                 kwargs['round'] = fbsync.round
98                 return cls.query.filter_by(**kwargs)
99 # ACCOUNTING
100         date_checked = Field(DateTime)
101         round = Field(Int,default=0)
102         plc_pcuid = Field(Int) #alternateID=True,alternateMethodName='by_pcuid')
103
104 # EXTERNAL
105         plc_pcu_stats = Field(PickleType,default=None)
106         dns_status = Field(String)
107         port_status = Field(PickleType)
108         entry_complete = Field(String)
109
110 # INTERNAL
111 # INFERRED
112         reboot_trial_status = Field(String)