Skip to content
Snippets Groups Projects
Commit 57912746 authored by Robert Goldmann's avatar Robert Goldmann
Browse files

#9 - use job scheduler to manually trigger cleanup

parent 2ffae620
Branches
Tags
No related merge requests found
from datetime import datetime
from typing import Dict
from sqlalchemy.orm import Session
from logic.database import Schemas, DatabaseInfoProvider
from logic.database.DatabaseCleaner import DatabaseCleaner
from logic.database.RetentionPolicy import RetentionPolicy
class DatabaseCleanupService:
def __init__(self, cleanupSettings: Dict):
self._cleanupSettings = cleanupSettings
def cleanup(self, db: Session) -> Schemas.DatabaseCleanupInfo:
infoBefore = DatabaseInfoProvider.get_database_info(db)
retentionPolicies = self._cleanupSettings['retentionPolicies']
policies = []
for item in retentionPolicies:
policies.append(RetentionPolicy(numberOfMeasurementsPerDay=item['numberOfMeasurementsPerDay'],
ageInDays=item['ageInDays']))
DatabaseCleaner(policies, self._cleanupSettings['forceBackupAfterCleanup']).clean(db, datetime.now().date())
infoAfter = DatabaseInfoProvider.get_database_info(db)
deletedMeasurements = infoBefore.number_of_measurements - infoAfter.number_of_measurements
sizeFreed = infoBefore.size_on_disk_in_mb - infoAfter.size_on_disk_in_mb
infoDifference = Schemas.DatabaseInfo(number_of_measurements=deletedMeasurements, size_on_disk_in_mb=sizeFreed)
return Schemas.DatabaseCleanupInfo(status=Schemas.DatabaseCleanupStatus.FINISHED, before=infoBefore,
after=infoAfter, difference=infoDifference)
...@@ -134,3 +134,23 @@ class SensorValue(BaseModel): ...@@ -134,3 +134,23 @@ class SensorValue(BaseModel):
class MultipleMeasurements(BaseModel): class MultipleMeasurements(BaseModel):
deviceName: str deviceName: str
sensors: List[SensorValue] sensors: List[SensorValue]
# ===== scheduled jobs =====
class ScheduledJob(BaseModel):
job_id: str
run_frequency: str
next_run: str
class Config:
schema_extra = {
'example': {
'job_id': 'my job id',
'run_frequency': 'interval[0:05:00]',
'next_run': '2021-09-30 22:12:09.397935+2:00'
}
}
class ScheduledJobs(BaseModel):
jobs: List[ScheduledJob]
from datetime import datetime from fastapi import APIRouter, Depends, HTTPException
from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from Settings import SETTINGS from Settings import SETTINGS
from logic.DatabaseCleanupService import DatabaseCleanupService
from logic.Dependencies import get_database, check_api_key from logic.Dependencies import get_database, check_api_key
from logic.database import Schemas, DatabaseInfoProvider from logic.database import Schemas, DatabaseInfoProvider
from logic.database.DatabaseCleaner import DatabaseCleaner, RetentionPolicy
router = APIRouter( router = APIRouter(
prefix='/database', prefix='/database',
...@@ -26,29 +24,19 @@ async def databaseInfo(db: Session = Depends(get_database)): ...@@ -26,29 +24,19 @@ async def databaseInfo(db: Session = Depends(get_database)):
response_model=Schemas.Status, response_model=Schemas.Status,
dependencies=[Depends(check_api_key)]) dependencies=[Depends(check_api_key)])
async def databaseCleanup(db: Session = Depends(get_database)): async def databaseCleanup(db: Session = Depends(get_database)):
infoBefore = DatabaseInfoProvider.get_database_info(db) from logic import JobScheduler
cleanupService = DatabaseCleanupService(SETTINGS['database']['cleanup'])
cleanupSettings = SETTINGS['database']['cleanup'] try:
JobScheduler.SCHEDULER.run_manual_job(cleanupService.cleanup, args=[db])
retentionPolicies = cleanupSettings['retentionPolicies'] except JobScheduler.JobAlreadyRunningError as e:
policies = [] raise HTTPException(status_code=400, detail=str(e))
for item in retentionPolicies:
policies.append(RetentionPolicy(numberOfMeasurementsPerDay=item['numberOfMeasurementsPerDay'],
ageInDays=item['ageInDays']))
DatabaseCleaner(policies, cleanupSettings['forceBackupAfterCleanup']).clean(db, datetime.now().date())
infoAfter = DatabaseInfoProvider.get_database_info(db)
deletedMeasurements = infoBefore.number_of_measurements - infoAfter.number_of_measurements
sizeFreed = infoBefore.size_on_disk_in_mb - infoAfter.size_on_disk_in_mb
infoDifference = Schemas.DatabaseInfo(number_of_measurements=deletedMeasurements, size_on_disk_in_mb=sizeFreed)
return Schemas.DatabaseCleanupInfo(before=infoBefore, after=infoAfter, difference=infoDifference) return Schemas.Status(message='Successfully triggered database cleanup')
@router.get('/databaseCleanup', @router.get('/databaseCleanup',
summary='Provides the status of the current database cleanup', summary='Provides the status of the all scheduled database cleanup jobs',
response_model=Schemas.DatabaseCleanupInfo) response_model=Schemas.ScheduledJobs)
async def databaseCleanup(): async def databaseCleanup():
return Schemas.DatabaseCleanupInfo(status=Schemas.DatabaseCleanupStatus.UNDEFINED) from logic import JobScheduler
return JobScheduler.SCHEDULER.get_scheduled_jobs()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment