mock_imports += ['OpenSSL',
'jwt',
'bcrypt',
- 'scipy',
'jsonpatch',
'rook.rook_client',
'rook.rook_client.ceph',
'rook.rook_client._helper',
'cherrypy=3.2.3']
-
+ # make diskprediction_local happy
+ mock_imports += ['numpy',
+ 'scipy']
# make restful happy
mock_imports += ['pecan',
'pecan.rest',
#
# in a command thread. See https://tracker.ceph.com/issues/42764
import scipy # noqa: ignore=F401
+from .predictor import Predictor, get_diskfailurepredictor_path
TIME_FORMAT = '%Y%m%d-%H%M%S'
self.log.error('failed to get device %s health data due to %s', devid, str(e))
# initialize appropriate disk failure predictor model
- from .predictor import get_diskfailurepredictor_path
- if self.predictor_model == 'prophetstor':
- from .predictor import PSDiskFailurePredictor
- obj_predictor = PSDiskFailurePredictor()
- ret = obj_predictor.initialize("{}/models/{}".format(get_diskfailurepredictor_path(), self.predictor_model))
- if ret is not None:
- self.log.error('Error initializing predictor')
- return predicted_result
- elif self.predictor_model == 'redhat':
- from .predictor import RHDiskFailurePredictor
- obj_predictor = RHDiskFailurePredictor()
- ret = obj_predictor.initialize("{}/models/{}".format(get_diskfailurepredictor_path(), self.predictor_model))
- if ret is not None:
- self.log.error('Error initializing predictor')
- return predicted_result
- else:
+ obj_predictor = Predictor.create(self.predictor_model)
+ if obj_predictor is None:
self.log.error('invalid value received for MODULE_OPTIONS.predictor_model')
return predicted_result
+ ret = obj_predictor.initialize("{}/models/{}".format(get_diskfailurepredictor_path(), self.predictor_model))
+ if ret is not None:
+ self.log.error('Error initializing predictor')
+ return predicted_result
if len(health_data) >= 6:
o_keys = sorted(health_data.keys(), reverse=True)
return dir_path
-class RHDiskFailurePredictor(object):
+class Predictor:
+ @classmethod
+ def create(cls, name: str) -> Optional['Predictor']:
+ if name == 'prophetstor':
+ return PSDiskFailurePredictor()
+ elif name == 'redhat':
+ return RHDiskFailurePredictor()
+ else:
+ return None
+
+ def initialize(self, model_dir: str) -> str:
+ raise NotImplementedError()
+
+ def predict(self, dataset: Sequence[DevSmartT]) -> str:
+ raise NotImplementedError()
+
+
+class RHDiskFailurePredictor(Predictor):
"""Disk failure prediction module developed at Red Hat
This class implements a disk failure prediction module.
return RHDiskFailurePredictor.PREDICTION_CLASSES[pred_class_id]
-class PSDiskFailurePredictor(object):
+class PSDiskFailurePredictor(Predictor):
"""Disk failure prediction developed at ProphetStor
This class implements a disk failure prediction module.