]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/diskprediction_local: add Predictor abstract class
authorKefu Chai <kchai@redhat.com>
Sat, 20 Feb 2021 05:15:58 +0000 (13:15 +0800)
committerKefu Chai <kchai@redhat.com>
Sat, 20 Feb 2021 06:51:26 +0000 (14:51 +0800)
to make the interface more explicit, also pave the road to mypy.

Signed-off-by: Kefu Chai <kchai@redhat.com>
doc/_ext/ceph_commands.py
src/pybind/mgr/diskprediction_local/module.py
src/pybind/mgr/diskprediction_local/predictor.py

index 897343cee214d085dcc7df68b154749299a496b3..eec031ee3d2ab088380e8d2e06a49369e625910e 100644 (file)
@@ -275,13 +275,14 @@ class CephMgrCommands(Directive):
         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',
index 930fd1bbce4b1a63bd1d9c33aea2d9a21db7920c..31b1ccf925e35d5c824a477dc10d8b290fa77e09 100644 (file)
@@ -15,6 +15,7 @@ from mgr_module import CommandResult, MgrModule, Option
 #
 # 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'
@@ -136,24 +137,14 @@ class Module(MgrModule):
             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)
index fbea9dc94989ff5b9cd866b2eec653b127e3fbd8..e2b7fc4e720c0be0664ae5996b62ad64e09dcacf 100644 (file)
@@ -35,7 +35,24 @@ def get_diskfailurepredictor_path():
     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.
@@ -229,7 +246,7 @@ class RHDiskFailurePredictor(object):
         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.