actually create a job for scan now, and let the job manager do the work and send back output via new PA_JobManager_FE_Message table
This commit is contained in:
4
files.py
4
files.py
@@ -191,10 +191,8 @@ def files():
|
|||||||
@app.route("/files/scannow", methods=["GET"])
|
@app.route("/files/scannow", methods=["GET"])
|
||||||
def scannow():
|
def scannow():
|
||||||
job=NewJob("scannow", 1 )
|
job=NewJob("scannow", 1 )
|
||||||
print("beginning of using a job to scan for new files, rather than do it in code here: {}".format(job))
|
|
||||||
filedata.GenerateFileData()
|
|
||||||
st.SetAlert("success")
|
st.SetAlert("success")
|
||||||
st.SetMessage("Scanned for new files")
|
st.SetMessage("Created job to scan for new files")
|
||||||
return render_template("base.html", page_title='Forced look for new items', file_data=filedata)
|
return render_template("base.html", page_title='Forced look for new items', file_data=filedata)
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|||||||
5
job.py
5
job.py
@@ -75,7 +75,10 @@ def joblog(id):
|
|||||||
page_title='Show Job Details'
|
page_title='Show Job Details'
|
||||||
joblog = Job.query.get(id)
|
joblog = Job.query.get(id)
|
||||||
logs=Joblog.query.filter(Joblog.job_id==id).all()
|
logs=Joblog.query.filter(Joblog.job_id==id).all()
|
||||||
duration=(datetime.now(pytz.utc)-joblog.start_time)
|
if joblog.pa_job_state == "Completed":
|
||||||
|
duration=(joblog.last_update-joblog.start_time)
|
||||||
|
else:
|
||||||
|
duration=(datetime.now(pytz.utc)-joblog.start_time)
|
||||||
duration= duration-timedelta(microseconds=duration.microseconds)
|
duration= duration-timedelta(microseconds=duration.microseconds)
|
||||||
return render_template("joblog.html", job=joblog, logs=logs, duration=duration, page_title=page_title)
|
return render_template("joblog.html", job=joblog, logs=logs, duration=duration, page_title=page_title)
|
||||||
|
|
||||||
|
|||||||
23
main.py
23
main.py
@@ -36,12 +36,35 @@ from ai import *
|
|||||||
|
|
||||||
####################################### CLASSES / DB model #######################################
|
####################################### CLASSES / DB model #######################################
|
||||||
|
|
||||||
|
class PA_JobManager_Message(db.Model):
|
||||||
|
__tablename__ = "pa_job_manager_fe_message"
|
||||||
|
id = db.Column(db.Integer, db.Sequence('pa_job_manager_fe_message_id_seq'), primary_key=True )
|
||||||
|
job_id = db.Column(db.Integer, db.ForeignKey('job.id') )
|
||||||
|
alert = db.Column(db.String)
|
||||||
|
message = db.Column(db.String)
|
||||||
|
def __repr__(self):
|
||||||
|
return "<id: {}, job_id: {}, alert: {}, message: {}".format(self.id, self.job_id, self.alert, self.message)
|
||||||
|
|
||||||
|
def GetJM_Message():
|
||||||
|
msg=PA_JobManager_Message.query.first()
|
||||||
|
return msg
|
||||||
|
|
||||||
|
def ClearJM_Message(id):
|
||||||
|
msg=PA_JobManager_Message.query.get(id)
|
||||||
|
print("ClearJM_Message: {} ".format(msg))
|
||||||
|
PA_JobManager_Message.query.filter(PA_JobManager_Message.id==id).delete()
|
||||||
|
db.session.commit()
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
####################################### GLOBALS #######################################
|
####################################### GLOBALS #######################################
|
||||||
# allow jinja2 to call these python functions directly
|
# allow jinja2 to call these python functions directly
|
||||||
app.jinja_env.globals['ClearStatus'] = st.ClearStatus
|
app.jinja_env.globals['ClearStatus'] = st.ClearStatus
|
||||||
app.jinja_env.globals['GetAlert'] = st.GetAlert
|
app.jinja_env.globals['GetAlert'] = st.GetAlert
|
||||||
app.jinja_env.globals['GetMessage'] = st.GetMessage
|
app.jinja_env.globals['GetMessage'] = st.GetMessage
|
||||||
app.jinja_env.globals['GetNumActiveJobs'] = GetNumActiveJobs
|
app.jinja_env.globals['GetNumActiveJobs'] = GetNumActiveJobs
|
||||||
|
app.jinja_env.globals['GetJM_Message'] = GetJM_Message
|
||||||
|
app.jinja_env.globals['ClearJM_Message'] = ClearJM_Message
|
||||||
|
|
||||||
# default page, just the navbar
|
# default page, just the navbar
|
||||||
@app.route("/", methods=["GET"])
|
@app.route("/", methods=["GET"])
|
||||||
|
|||||||
@@ -202,7 +202,12 @@ class Settings(Base):
|
|||||||
### Initiatlise the file data set
|
### Initiatlise the file data set
|
||||||
filedata = FileData()
|
filedata = FileData()
|
||||||
|
|
||||||
#### DDP: work out the class creation line for just sqlalchemy
|
################################################################################
|
||||||
|
# classes for the job manager:
|
||||||
|
# PA_JobManager overall status tracking),
|
||||||
|
# Job (and Joblog) for each JOb, and
|
||||||
|
# PA_Jobmanager_fe_message (to pass messages to the front-end web)
|
||||||
|
################################################################################
|
||||||
class PA_JobManager(Base):
|
class PA_JobManager(Base):
|
||||||
__tablename__ = "pa_job_manager"
|
__tablename__ = "pa_job_manager"
|
||||||
id = Column(Integer, Sequence('pa_job_manager_id_seq'), primary_key=True)
|
id = Column(Integer, Sequence('pa_job_manager_id_seq'), primary_key=True)
|
||||||
@@ -213,20 +218,16 @@ class PA_JobManager(Base):
|
|||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<id={}, state={}, num_active_jobs={}, num_completed_jobs={}>".format( self.id, self.state, self.num_active_jobs, self.num_completed_jobs )
|
return "<id={}, state={}, num_active_jobs={}, num_completed_jobs={}>".format( self.id, self.state, self.num_active_jobs, self.num_completed_jobs )
|
||||||
|
|
||||||
|
|
||||||
class Joblog(Base):
|
class Joblog(Base):
|
||||||
__tablename__ = "joblog"
|
__tablename__ = "joblog"
|
||||||
id = Column(Integer, Sequence('ill_id_seq'), primary_key=True )
|
id = Column(Integer, Sequence('ill_id_seq'), primary_key=True )
|
||||||
job_id = Column(Integer, ForeignKey('job.id'), primary_key=True )
|
job_id = Column(Integer, ForeignKey('job.id') )
|
||||||
log_date = Column(DateTime(timezone=True))
|
log_date = Column(DateTime(timezone=True))
|
||||||
log = Column(String)
|
log = Column(String)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<id: {}, job_id: {}, log: {}".format(self.id, self.job_id, self.log )
|
return "<id: {}, job_id: {}, log: {}".format(self.id, self.job_id, self.log )
|
||||||
|
|
||||||
################################################################################
|
|
||||||
# Class describing Action in the database, and via sqlalchemy, connected to the DB as well
|
|
||||||
################################################################################
|
|
||||||
class Job(Base):
|
class Job(Base):
|
||||||
__tablename__ = "job"
|
__tablename__ = "job"
|
||||||
id = Column(Integer, Sequence('joblog_id_seq'), primary_key=True )
|
id = Column(Integer, Sequence('joblog_id_seq'), primary_key=True )
|
||||||
@@ -245,6 +246,19 @@ class Job(Base):
|
|||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<id: {}, start_time: {}, last_update: {}, name: {}, state: {}, num_passes: {}, current_passes: {}, num_files: {}, current_file_num: {}, current_file: {}>".format(self.id, self.start_time, self.last_update, self.name, self.state, self.num_passes, self.current_pass, self.num_files, self.num_files, self.current_file_num, self.current_file)
|
return "<id: {}, start_time: {}, last_update: {}, name: {}, state: {}, num_passes: {}, current_passes: {}, num_files: {}, current_file_num: {}, current_file: {}>".format(self.id, self.start_time, self.last_update, self.name, self.state, self.num_passes, self.current_pass, self.num_files, self.num_files, self.current_file_num, self.current_file)
|
||||||
|
|
||||||
|
class PA_JobManager_FE_Message(Base):
|
||||||
|
__tablename__ = "pa_job_manager_fe_message"
|
||||||
|
id = Column(Integer, Sequence('pa_job_manager_fe_message_id_seq'), primary_key=True )
|
||||||
|
job_id = Column(Integer, ForeignKey('job.id'), primary_key=True )
|
||||||
|
alert = Column(String)
|
||||||
|
message = Column(String)
|
||||||
|
def __repr__(self):
|
||||||
|
return "<id: {}, job_id: {}, alert: {}, message: {}".format(self.id, self.job_id, self.alert, self.message)
|
||||||
|
|
||||||
|
def MessageToFE( job_id, alert, message ):
|
||||||
|
msg = PA_JobManager_FE_Message( job_id=job_id, alert=alert, message=message)
|
||||||
|
session.add(msg)
|
||||||
|
session.commit()
|
||||||
|
|
||||||
def GetJobs():
|
def GetJobs():
|
||||||
return session.query(Job).all()
|
return session.query(Job).all()
|
||||||
@@ -261,16 +275,19 @@ def InitialiseManager():
|
|||||||
|
|
||||||
def RunJob(job):
|
def RunJob(job):
|
||||||
print("Run job: {}, pa_eng state: {}, internal job state: {}".format( job.name, job.pa_job_state, job.state) )
|
print("Run job: {}, pa_eng state: {}, internal job state: {}".format( job.name, job.pa_job_state, job.state) )
|
||||||
if job.name =="scannow":
|
try:
|
||||||
print("scannow not being handled yet")
|
if job.name =="scannow":
|
||||||
JobScanNow(job)
|
JobScanNow(job)
|
||||||
elif job.name =="forcescan":
|
elif job.name =="forcescan":
|
||||||
print("force scan not being handled yet")
|
print("force scan not being handled yet")
|
||||||
else:
|
else:
|
||||||
print("Requested to process unknown job type: {}".format(job.name))
|
print("Requested to process unknown job type: {}".format(job.name))
|
||||||
|
except:
|
||||||
|
MessageToFE( job.id, "danger", "Failed (see log for details)" )
|
||||||
return
|
return
|
||||||
|
|
||||||
def HandleJobs():
|
def HandleJobs():
|
||||||
|
print("PA job manager is scanning for jobs")
|
||||||
pa_eng.state = 'Scanning Jobs'
|
pa_eng.state = 'Scanning Jobs'
|
||||||
jobs=GetJobs()
|
jobs=GetJobs()
|
||||||
for job in jobs:
|
for job in jobs:
|
||||||
@@ -279,23 +296,19 @@ def HandleJobs():
|
|||||||
pa_eng.num_active_jobs = pa_eng.num_active_jobs + 1
|
pa_eng.num_active_jobs = pa_eng.num_active_jobs + 1
|
||||||
else:
|
else:
|
||||||
pa_eng.num_completed_jobs = pa_eng.num_completed_jobs +1
|
pa_eng.num_completed_jobs = pa_eng.num_completed_jobs +1
|
||||||
print("PA job manager is up")
|
print("PA job manager is waiting jobs")
|
||||||
pa_eng.state = 'Waiting for new Jobs'
|
pa_eng.state = 'Waiting for new Jobs'
|
||||||
return
|
return
|
||||||
|
|
||||||
def JobScanNow(job):
|
def JobScanNow(job):
|
||||||
print("About to call GenerateFileData()")
|
|
||||||
filedata.GenerateFileData()
|
filedata.GenerateFileData()
|
||||||
print( "need to update job");
|
|
||||||
job.state="Completed"
|
job.state="Completed"
|
||||||
job.pa_job_state="Completed"
|
job.pa_job_state="Completed"
|
||||||
job.last_update=datetime.now(pytz.utc)
|
job.last_update=datetime.now(pytz.utc)
|
||||||
|
MessageToFE( job.id, "success", "Completed (scan for new files)" )
|
||||||
session.commit()
|
session.commit()
|
||||||
return
|
return
|
||||||
|
|
||||||
def UpdateJob():
|
|
||||||
return
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
print("PA job manager starting")
|
print("PA job manager starting")
|
||||||
try:
|
try:
|
||||||
@@ -304,10 +317,5 @@ if __name__ == "__main__":
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
print( "Failed to initialise PA Job Manager: {}".format(e) )
|
print( "Failed to initialise PA Job Manager: {}".format(e) )
|
||||||
session.rollback()
|
session.rollback()
|
||||||
|
HandleJobs()
|
||||||
print("Exiting for now: {}".format( pa_eng ))
|
print("Exiting for now: {}".format( pa_eng ))
|
||||||
cnt=0
|
|
||||||
while cnt < 3:
|
|
||||||
HandleJobs()
|
|
||||||
time.sleep(60)
|
|
||||||
cnt=cnt+1
|
|
||||||
|
|
||||||
|
|||||||
@@ -98,9 +98,16 @@
|
|||||||
{% if GetMessage()|length %}
|
{% if GetMessage()|length %}
|
||||||
<div class="row alert alert-{{GetAlert()}}">
|
<div class="row alert alert-{{GetAlert()}}">
|
||||||
{{ GetMessage()|safe}}
|
{{ GetMessage()|safe}}
|
||||||
{{ ClearStatus() }}
|
{{ ClearStatus() }}
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% if GetJM_Message() != None %}
|
||||||
|
{% set msg=GetJM_Message() %}
|
||||||
|
<div class="row alert alert-{{msg.alert}}">
|
||||||
|
<a href="{{url_for('joblog', id=msg.job_id)}}">Job #{{msg.job_id}}</a>: {{msg.message|safe}}
|
||||||
|
</div>
|
||||||
|
{% set dont_print=ClearJM_Message(msg.id) %}
|
||||||
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% block main_content %}
|
{% block main_content %}
|
||||||
|
|||||||
Reference in New Issue
Block a user