]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mgr/ssh: Add module to static type checking from tox.
authorSebastian Wagner <sebastian.wagner@suse.com>
Wed, 4 Dec 2019 21:49:30 +0000 (22:49 +0100)
committerSebastian Wagner <sebastian.wagner@suse.com>
Wed, 4 Dec 2019 21:49:30 +0000 (22:49 +0100)
Signed-off-by: Sebastian Wagner <sebastian.wagner@suse.com>
src/pybind/mgr/orchestrator.py
src/pybind/mgr/ssh/module.py
src/pybind/mgr/ssh/remotes.py
src/pybind/mgr/tests/__init__.py
src/pybind/mgr/tox.ini

index 460ad26b955f684021c5ed5ce8f7687848506c1b..65120ac87b120907473fd81dfb6b6dfc14d80da1 100644 (file)
@@ -177,7 +177,7 @@ class _Promise(object):
                  on_complete=None,    # type: Optional[Callable]
                  name=None,  # type: Optional[str]
                  ):
-        self._on_complete = on_complete
+        self._on_complete_ = on_complete
         self._name = name
         self._next_promise = None  # type: Optional[_Promise]
 
@@ -191,6 +191,18 @@ class _Promise(object):
         # T instead of (T -> r) -> r. Therefore we need to store the first promise here.
         self._first_promise = _first_promise or self  # type: '_Promise'
 
+    @property
+    def _on_complete(self):
+        # type: () -> Optional[Callable]
+        # https://github.com/python/mypy/issues/4125
+        return self._on_complete_
+
+    @_on_complete.setter
+    def _on_complete(self, val):
+        # type: (Optional[Callable]) -> None
+        self._on_complete_ = val
+
+
     def __repr__(self):
         name = self._name or getattr(self._on_complete, '__name__', '??') if self._on_complete else 'None'
         val = repr(self._value) if self._value is not self.NO_RESULT else 'NA'
index 58088bcd2dd1d5c70084ca992f37ad4d92c13cc6..96c689cac444cd41dbc2b9f72c72836d98c7ad11 100644 (file)
@@ -72,10 +72,10 @@ except ImportError:
 
 class AsyncCompletion(orchestrator.Completion):
     def __init__(self,
-                 _first_promise=None,  # type: Optional["Completion"]
+                 _first_promise=None,  # type: Optional[orchestrator.Completion]
                  value=orchestrator._Promise.NO_RESULT,  # type: Any
-                 on_complete=None,  # type: Optional[Callable],
-                 name=None,  # type: Optional[str],
+                 on_complete=None,  # type: Optional[Callable]
+                 name=None,  # type: Optional[str]
                  many=False, # type: bool
                  ):
 
@@ -87,19 +87,20 @@ class AsyncCompletion(orchestrator.Completion):
 
     @property
     def _progress_reference(self):
-        if hasattr(self.__on_complete, 'progress_id'):
-            return self.__on_complete
+        # type: () -> Optional[orchestrator.ProgressReference]
+        if hasattr(self._on_complete_, 'progress_id'):  # type: ignore
+            return self._on_complete_  # type: ignore
         return None
 
     @property
     def _on_complete(self):
         # type: () -> Optional[Callable]
-        if self.__on_complete is None:
+        if self._on_complete_ is None:
             return None
 
         def callback(result):
             try:
-                self.__on_complete = None
+                self._on_complete_ = None
                 self._finalize(result)
             except Exception as e:
                 self.fail(e)
@@ -108,16 +109,17 @@ class AsyncCompletion(orchestrator.Completion):
             self.fail(e)
 
         if six.PY3:
-            _callback = self.__on_complete
+            _callback = self._on_complete_
         else:
             def _callback(*args, **kwargs):
                 # Py2 only: _worker_pool doesn't call error_callback
                 try:
-                    return self.__on_complete(*args, **kwargs)
+                    return self._on_complete_(*args, **kwargs)
                 except Exception as e:
                     self.fail(e)
 
         def run(value):
+            assert SSHOrchestrator.instance
             if self.many:
                 if not value:
                     logger.info('calling map_async without values')
@@ -143,7 +145,7 @@ class AsyncCompletion(orchestrator.Completion):
     @_on_complete.setter
     def _on_complete(self, inner):
         # type: (Callable) -> None
-        self.__on_complete = inner
+        self._on_complete_ = inner
 
 
 def ssh_completion(cls=AsyncCompletion, **c_kwargs):
@@ -224,7 +226,7 @@ class SSHOrchestrator(MgrModule, orchestrator.Orchestrator):
 
 
     instance = None
-    NATIVE_OPTIONS = []
+    NATIVE_OPTIONS = []  # type: List[Any]
     MODULE_OPTIONS = [
         {
             'name': 'ssh_config_file',
@@ -311,7 +313,6 @@ class SSHOrchestrator(MgrModule, orchestrator.Orchestrator):
         self.log.error('ssh: shutdown')
         self._worker_pool.close()
         self._worker_pool.join()
-        self._worker_pool = None
 
     def config_notify(self):
         """
@@ -319,23 +320,23 @@ class SSHOrchestrator(MgrModule, orchestrator.Orchestrator):
         """
         for opt in self.MODULE_OPTIONS:
             setattr(self,
-                    opt['name'],
-                    self.get_module_option(opt['name']) or opt['default'])
+                    opt['name'],  # type: ignore
+                    self.get_module_option(opt['name']) or opt['default'])  # type: ignore
             self.log.debug(' mgr option %s = %s',
-                           opt['name'], getattr(self, opt['name']))
+                           opt['name'], getattr(self, opt['name']))  # type: ignore
         for opt in self.NATIVE_OPTIONS:
             setattr(self,
-                    opt,
+                    opt,  # type: ignore
                     self.get_ceph_option(opt))
-            self.log.debug(' native option %s = %s', opt, getattr(self, opt))
+            self.log.debug(' native option %s = %s', opt, getattr(self, opt))  # type: ignore
 
     def get_unique_name(self, existing, prefix=None, forcename=None):
         """
         Generate a unique random service name
         """
         if forcename:
-            if len([d for d in existing if d.service_instance == name]):
-                raise RuntimeError('specified name %s already in use', name)
+            if len([d for d in existing if d.service_instance == forcename]):
+                raise RuntimeError('specified name %s already in use', forcename)
             return forcename
 
         while True:
@@ -354,8 +355,8 @@ class SSHOrchestrator(MgrModule, orchestrator.Orchestrator):
         self.set_store('inventory', json.dumps(self.inventory))
 
     def _reconfig_ssh(self):
-        temp_files = []
-        ssh_options = []
+        temp_files = []  # type: list
+        ssh_options = []  # type: List[str]
 
         # ssh_config
         ssh_config_fname = self.ssh_config_file
@@ -394,7 +395,7 @@ class SSHOrchestrator(MgrModule, orchestrator.Orchestrator):
 
         self._temp_files = temp_files
         if ssh_options:
-            self._ssh_options = ' '.join(ssh_options)
+            self._ssh_options = ' '.join(ssh_options)  # type: Optional[str]
         else:
             self._ssh_options = None
         self.log.info('ssh_options %s' % ssh_options)
@@ -944,9 +945,9 @@ class SSHOrchestrator(MgrModule, orchestrator.Orchestrator):
                 '--format', 'json',
             ])
         self.log.debug('code %s out %s' % (code, out))
-        j = json.loads('\n'.join(out))
+        osds_elems = json.loads('\n'.join(out))
         fsid = self._cluster_fsid
-        for osd_id, osds in j.items():
+        for osd_id, osds in osds_elems.items():
             for osd in osds:
                 if osd['tags']['ceph.cluster_fsid'] != fsid:
                     self.log.debug('mismatched fsid, skipping %s' % osd)
index da057e83363b88a4ba785be5f19d9c841283435b..94f978dd2c0f28b5de0d45732138555f9336974b 100644 (file)
@@ -77,5 +77,5 @@ def which(executable):
             return executable_path
 
 if __name__ == '__channelexec__':
-    for item in channel:
-        channel.send(eval(item))
+    for item in channel:  # type: ignore
+        channel.send(eval(item))  # type: ignore
index af260d9853a7117db8a7dbe59381ad88943109a1..e2d73534fed9ec4e054fd478e4867547a77ddbe7 100644 (file)
@@ -1,3 +1,4 @@
+# type: ignore
 from __future__ import absolute_import
 
 
index f6f305d0f9bdcf827ff7b473cbc42ff2358bcc07..15ea35bcaa8f8b86e274148d3578bdbf7d56333a 100644 (file)
@@ -12,4 +12,4 @@ basepython = python3
 deps =
     -r requirements.txt
     mypy
-commands = mypy --config-file=../../mypy.ini orchestrator.py
\ No newline at end of file
+commands = mypy --config-file=../../mypy.ini orchestrator.py ssh/module.py
\ No newline at end of file