Skip to content
Snippets Groups Projects
Commit 4c0f3e18 authored by Rajmund Hruška's avatar Rajmund Hruška
Browse files

Feature: Create missing detectors. (Redmine issue: #7577)

parent 53dbc566
No related branches found
No related tags found
No related merge requests found
......@@ -927,6 +927,22 @@ class DetectorModel(MODEL): # pylint: disable=locally-disabled,too-few-public-m
'credibility': float(self.credibility)
}
def detectormodel_from_typeddict(structure, defaults = None):
"""
Convenience method for creating :py:class:`mentat.datatype.sqldb.DetectorModel`
object from :py:class:`mentat.datatype.internal.Detector` objects.
"""
if not defaults:
defaults = {}
sqlobj = DetectorModel()
sqlobj.name = structure.get('name')
sqlobj.source = structure.get('source')
sqlobj.credibility = structure.get('credibility', defaults.get('credibility', 1.0))
sqlobj.description = structure.get('description', defaults.get('description', None))
return sqlobj
#-------------------------------------------------------------------------------
......
......@@ -82,7 +82,7 @@ import mentat.script.fetcher
import mentat.const
import mentat.datatype.internal
from mentat.datatype.sqldb import DetectorModel, NetworkModel, SettingsReportingModel, \
networkmodel_from_typeddict
detectormodel_from_typeddict
DETECTORS_FILE_GENERIC = 'detectors-file'
DETECTORS_FILE_WARDEN = 'warden'
......@@ -219,7 +219,8 @@ class MentatDetmngrScript(mentat.script.fetcher.FetcherScript):
:return: Structure containing information about changes.
:rtype: dict
"""
result = {'create': {}, 'delete': {}, 'update': {}}
result = {'create': [], 'delete': {}, 'update': {}}
det_db = {}
det_file = self.c(self.CONFIG_DETECTORS_FILE)
det_file_type, det_file_data_raw = self._load_detectors_file(det_file)
......@@ -230,7 +231,10 @@ class MentatDetmngrScript(mentat.script.fetcher.FetcherScript):
detectors = self.sqlservice.session.query(DetectorModel).order_by(DetectorModel.name).all()
self.sqlservice.session.commit()
self.logger.info("Number of detectors in the database: %d", len(detectors))
for detector in detectors:
det_db[detector.name] = detector
self._detectors_create_missing(det_db, det_file_data, det_file_type, result, status_only)
return result
def _load_detectors_file(self, detectors_file):
......@@ -270,3 +274,31 @@ class MentatDetmngrScript(mentat.script.fetcher.FetcherScript):
self.logger.debug(det)
processed_data[det['name']] = det
return processed_data
def _detectors_create_missing(self, det_db, det_file_data, det_file_type, result, status_only):
"""
Create missing detector records in the database.
:param dict det_db: Detectors loaded from the database.
:param dict det_file_data: Detectors loaded from the reference detectors file.
:param str det_file_type: Source of the detectors in the reference detectors file.
:param dict result: Structure containing processing log, will be appended to script runlog.
:param bool status_only: Do not actually perform any database operations, just report status.
"""
for detector_name in sorted(det_file_data.keys()):
# Try finding the detector from the file in the database by the name.
if not detector_name in det_db:
gkey = '{}::{}'.format(detector_name, det_file_type)
result['create'].append(gkey)
if status_only:
self.logger.warning("'%s' Found new detector.", gkey)
continue
sqldet = detectormodel_from_typeddict(
det_file_data[detector_name],
{'description' : 'Detector created automatically by mentat-detmngr.py utility.'}
)
self.logger.warning("'%s' Creating new detector.", gkey)
self.sqlservice.session.add(sqldet)
self.sqlservice.session.commit()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment