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
9 from monitor.database.dborm import mon_metadata, mon_session
10 __metadata__ = mon_metadata
11 __session__ = mon_session
13 #class IssueType(Entity):
14 # shortname = Field(String, default=None)
15 # description = Field(String, default=None)
16 # issue_record = ManyToMany('IssueRecord')
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)
23 # hostname = Field(String,default=None)
24 # loginbase = Field(String)
26 # ticket_id = Field(Integer, default=0)
27 # rt = Field(PickleType, default=None)
29 # # open, paused, closed
30 # status = Field(String, default="open")
32 # take_action = Field(Boolean, default=False)
33 # send_email = Field(Boolean, default=True)
35 # message_series = Field(String, default="nodedown")
36 # message_index = Field(Integer, default=0)
37 # penalty_level = Field(Integer, default=0)
39 # issue_type = ManyToMany('IssueType')
40 # actions = OneToMany('ActionRecord', order_by='-date_created')
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'])
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())
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())
59 def neverExpires(self):
66 if self.neverExpires():
69 if self.date_created + timedelta(0,self.expires) > datetime.now():
75 if self.neverExpires():
78 return self.date_created + timedelta(0, self.expires)
80 class BootmanSequenceRecord(Entity):
81 sequence = Field(String, primary_key=True, default=None)
82 action = Field(String, default=None)
83 date_created = Field(DateTime,default=datetime.now)
85 class ActionRecord(Entity):
87 def get_latest_by(cls, **kwargs):
88 # TODO: need to sort on 'round' since actions will not be globally sync'd.
89 return cls.query.filter_by(**kwargs).order_by(ActionRecord.id.desc()).first()
92 def delete_recent_by(cls, since, **kwargs):
93 acts = cls.query.filter_by(**kwargs).filter(cls.date_created >= datetime.now() - timedelta(since)).order_by(cls.date_created.desc())
94 for i in acts: i.delete()
97 date_created = Field(DateTime,default=datetime.now)
98 loginbase = Field(String,default=None)
99 hostname = Field(String,default=None)
101 # the expected kinds of actions are:
103 # * open ticket, send notice
105 # * apply penalty to site
106 # * backoff penalty to site
107 action = Field(String)
109 # NOTE: describes the kind of action. i.e. online-notice, offline-notice,
110 # reboot-first-try, reboot-second-try, penalty-pause, penalty-warning, penalty-no-create,
111 # penalty-disable-slices,
112 action_type = Field(String, default=None)
114 message_id = Field(Integer, default=0)
115 penalty_level = Field(Integer, default=0)
117 # NOTE: in case an exception is thrown while trying to perform an action.
118 error_string = Field(String, default=None)
120 log_path = Field(String, default=None)
122 #issue = ManyToOne('IssueRecord')
123 # NOTE: this is the parent relation to fb records. first create the
124 # action record, then append to this value all of the findbad records we
125 # want to have in our set.
127 # - create action record
128 # - find fbnode records
129 # - append fbnode records to action record
131 # - find fbnode records
132 # - create action record with fbnodes as argument
133 # findbad_records = OneToMany('FindbadNodeRecord', order_by='-date_checked')
135 # NOTE: can I move 'message_index, escellation_level, and penalty_level'
136 # into the same value? Maybe not penalty level, since there are only two;
137 # and, there may be additional message and escellation levels.
138 #send_email_to = Field(PickleType, default=None)
139 #action_description = Field(PickleType, default=None)
140 #message_arguments = Field(PickleType, default=None)
142 # NOTE: not sure this needs to be in the db.
143 #escellation_level = Field(Integer, default=0)
144 #stage = Field(String, default=None)