+from elixir import Entity, Field, OneToMany, ManyToOne, ManyToMany
+from elixir import options_defaults, using_options, setup_all, belongs_to
+from elixir import String, Integer as Int, DateTime, PickleType, Boolean
+from datetime import datetime,timedelta
+import elixir
+import traceback
+
+from monitor.database.dborm import mon_metadata, mon_session
+__metadata__ = mon_metadata
+__session__ = mon_session
+
+
+class FindbadNodeRecordSync(Entity):
+ hostname = Field(String(250),primary_key=True) #,alternateMethodName='by_hostname')
+ round = Field(Int,default=0)
+
+class FindbadPCURecordSync(Entity):
+ plc_pcuid = Field(Int,primary_key=True) #,alternateMethodName='by_pcuid')
+ round = Field(Int,default=0)
+
+class FindbadNodeRecord(Entity):
+ @classmethod
+ def get_all_latest(cls):
+ fbsync = FindbadNodeRecordSync.get_by(hostname="global")
+ return cls.query.filter_by(round=fbsync.round)
+
+ @classmethod
+ def get_latest_by(cls, **kwargs):
+ fbsync = FindbadNodeRecordSync.get_by(hostname="global")
+ kwargs['round'] = fbsync.round
+ return cls.query.filter_by(**kwargs)
+
+ @classmethod
+ def get_latest_n_by(cls, n=3, **kwargs):
+ fbsync = FindbadNodeRecordSync.get_by(hostname="global")
+ kwargs['round'] = fbsync.round
+ ret = []
+ for i in range(0,n):
+ kwargs['round'] = kwargs['round'] - i
+ f = cls.query.filter_by(**kwargs).first()
+ if f:
+ ret.append(f)
+ return ret
+
+# ACCOUNTING
+ date_checked = Field(DateTime,default=datetime.now)
+ round = Field(Int,default=0)
+ hostname = Field(String,default=None)
+ loginbase = Field(String)
+
+# INTERNAL
+ kernel_version = Field(String,default=None)
+ bootcd_version = Field(String,default=None)
+ nm_status = Field(String,default=None)
+ fs_status = Field(String,default=None)
+ dns_status = Field(String,default=None)
+ princeton_comon_dir = Field(Boolean,default=False)
+ princeton_comon_running = Field(Boolean,default=False)
+ princeton_comon_procs = Field(Int,default=None)
+
+# EXTERNAL
+ plc_node_stats = Field(PickleType,default=None)
+ plc_site_stats = Field(PickleType,default=None)
+ plc_pcuid = Field(Int,default=None)
+ comon_stats = Field(PickleType,default=None)
+ port_status = Field(PickleType,default=None)
+ ssh_portused = Field(Int,default=22)
+ ssh_status = Field(Boolean,default=False)
+ ssh_error = Field(String,default=None) # set if ssh_access == False
+ ping_status = Field(Boolean,default=False)
+
+# INFERRED
+ observed_category = Field(String,default=None)
+ observed_status = Field(String,default=None)
+
+ # NOTE: this is the child relation
+ action = ManyToOne('ActionRecord', required=False)
+
+class FindbadPCURecord(Entity):
+ @classmethod
+ def get_all_latest(cls):
+ fbsync = cls.get_by(hostname="global")
+ return cls.query.filter_by(round=fbsync.round)
+
+ @classmethod
+ def get_latest_by(cls, **kwargs):
+ fbsync = cls.get_by(hostname="global")
+ kwargs['round'] = fbsync.round
+ return cls.query.filter_by(**kwargs)
+# ACCOUNTING
+ date_checked = Field(DateTime)
+ round = Field(Int,default=0)
+ plc_pcuid = Field(Int) #alternateID=True,alternateMethodName='by_pcuid')
+
+# EXTERNAL
+ plc_pcu_stats = Field(PickleType,default=None)
+ dns_status = Field(String)
+ port_status = Field(PickleType)
+ entry_complete = Field(String)
+
+# INTERNAL
+# INFERRED
+ reboot_trial_status = Field(String)