0cdad0a850e24f236c6f17fe3a5d52b913554358
[monitor.git] / monitor / database / info / action.py
1 from elixir import Entity, Field, OneToMany, ManyToOne, ManyToMany
2 from elixir import options_defaults, using_options, setup_all, has_one
3 from elixir import String, Integer, DateTime, PickleType, Boolean
4 from elixir.ext.versioned import *
5 from datetime import datetime,timedelta
6 import elixir
7 import traceback
8
9 from monitor.database.dborm import mon_metadata, mon_session
10 __metadata__ = mon_metadata
11 __session__  = mon_session
12
13 #class IssueType(Entity):
14 #       shortname = Field(String, default=None)
15 #       description = Field(String, default=None)
16 #       issue_record = ManyToMany('IssueRecord')
17
18 #class IssueRecord(Entity):
19 #       date_created = Field(DateTime,default=datetime.now)
20 #       date_last_updated = Field(DateTime,default=datetime.now)
21 #       date_action_taken = Field(DateTime,default=datetime.now)
22 #
23 #       hostname = Field(String,default=None)
24 #       loginbase = Field(String)
25 #
26 #       ticket_id = Field(Integer, default=0)
27 #       rt = Field(PickleType, default=None)
28 #
29 #       # open, paused, closed
30 #       status = Field(String, default="open")
31 #
32 #       take_action = Field(Boolean, default=False)
33 #       send_email = Field(Boolean, default=True)
34 #
35 #       message_series =  Field(String, default="nodedown")
36 #       message_index = Field(Integer, default=0)
37 #       penalty_level = Field(Integer, default=0)
38 #
39 #       issue_type = ManyToMany('IssueType')
40 #       actions = OneToMany('ActionRecord', order_by='-date_created')
41
42 class BlacklistRecord(Entity):
43         date_created = Field(DateTime,default=datetime.now)
44         hostname = Field(String,default=None)
45         loginbase = Field(String,default=None)
46         expires = Field(Integer,default=0)      # seconds plus 
47         acts_as_versioned(['hostname'])
48
49         @classmethod
50         def getLoginbaseBlacklist(cls):
51                 # TODO: need to sort on 'round' since actions will not be globally sync'd.
52                 return cls.query.filter(cls.loginbase!=None).order_by(cls.loginbase.desc())
53
54         @classmethod
55         def getHostnameBlacklist(cls):
56                 # TODO: need to sort on 'round' since actions will not be globally sync'd.
57                 return cls.query.filter(cls.hostname!=None).order_by(cls.hostname.desc())
58
59         def neverExpires(self):
60                 if self.expires == 0:
61                         return True
62                 else:
63                         return False
64
65         def expired(self):
66                 if self.neverExpires():
67                         return False
68                 else:
69                         if self.date_created + timedelta(0,self.expires) > datetime.now():
70                                 return False
71                         else:
72                                 return True
73
74         def willExpire(self):
75                 if self.neverExpires():
76                         return "never"
77                 else:
78                         return self.date_created + timedelta(0, self.expires)
79
80 class ActionRecord(Entity):
81         @classmethod
82         def get_latest_by(cls, **kwargs):
83                 # TODO: need to sort on 'round' since actions will not be globally sync'd.
84                 return cls.query.filter_by(**kwargs).order_by(ActionRecord.id.desc()).first()
85
86         # ACCOUNTING
87         date_created = Field(DateTime,default=datetime.now)
88         loginbase = Field(String,default=None)
89         hostname = Field(String,default=None)
90         # NOTE:
91         #       the expected kinds of actions are:
92         #               * reboot node
93         #               * open ticket, send notice 
94         #               * close ticket
95         #               * apply penalty to site
96         #               * backoff penalty to site
97         action = Field(String)
98
99         # NOTE: describes the kind of action.  i.e. online-notice, offline-notice,
100         # reboot-first-try, reboot-second-try, penalty-pause, penalty-warning, penalty-no-create,
101         # penalty-disable-slices, 
102         action_type = Field(String, default=None)
103
104         message_id = Field(Integer, default=0)
105         penalty_level = Field(Integer, default=0)
106
107         # NOTE: in case an exception is thrown while trying to perform an action.
108         error_string = Field(String, default=None)
109
110         #issue = ManyToOne('IssueRecord')
111         # NOTE: this is the parent relation to fb records.  first create the
112         # action record, then append to this value all of the findbad records we
113         # want to have in our set.
114         # Model:
115         #    - create action record
116         #    - find fbnode records
117         #    - append fbnode records to action record
118         #  OR
119         #    - find fbnode records
120         #    - create action record with fbnodes as argument
121         # findbad_records = OneToMany('FindbadNodeRecord', order_by='-date_checked')
122
123         # NOTE: can I move 'message_index, escellation_level, and penalty_level'
124         #    into the same value?  Maybe not penalty level, since there are only two;
125         #    and, there may be additional message and escellation levels.
126         #send_email_to = Field(PickleType, default=None)
127         #action_description = Field(PickleType, default=None)
128         #message_arguments = Field(PickleType, default=None)
129
130         # NOTE: not sure this needs to be in the db.
131         #escellation_level = Field(Integer, default=0)
132         #stage = Field(String, default=None)