From 043ac5e574a16522370bddbd76158cc64174d061 Mon Sep 17 00:00:00 2001 From: whoami-rajat Date: Mon, 13 Aug 2018 04:58:59 +0000 Subject: [PATCH] Make code py3-compatible (global callable()) global function callable(f) is removed in python3. It can be replaced with isinstance(f, collections.Callable) This patch addresses the change. Ref : https://docs.python.org/3.1/whatsnew/3.0.html Change-Id: I47a50fffac14668f90aac043ee22a91bdb7dca41 --- cinder/api/openstack/wsgi.py | 3 ++- cinder/cmd/manage.py | 5 +++-- cinder/objects/base.py | 6 ++++-- cinder/objects/cleanable.py | 4 +++- .../netapp/dataontap/test_block_driver_interfaces.py | 3 ++- 5 files changed, 14 insertions(+), 7 deletions(-) diff --git a/cinder/api/openstack/wsgi.py b/cinder/api/openstack/wsgi.py index 3b85cf7e5a6..4f5e2a95e71 100644 --- a/cinder/api/openstack/wsgi.py +++ b/cinder/api/openstack/wsgi.py @@ -14,6 +14,7 @@ # License for the specific language governing permissions and limitations # under the License. +import collections import functools import inspect import math @@ -1088,7 +1089,7 @@ class ControllerMetaclass(type): versioned_methods.append(getattr(base, VER_METHOD_ATTR)) for key, value in cls_dict.items(): - if not callable(value): + if not isinstance(value, collections.Callable): continue if getattr(value, 'wsgi_action', None): actions[value.wsgi_action] = key diff --git a/cinder/cmd/manage.py b/cinder/cmd/manage.py index 29df21976a3..5678fc07a04 100644 --- a/cinder/cmd/manage.py +++ b/cinder/cmd/manage.py @@ -54,7 +54,7 @@ from __future__ import print_function - +import collections import logging as python_logging import prettytable import sys @@ -765,7 +765,8 @@ def methods_of(obj): """ result = [] for i in dir(obj): - if callable(getattr(obj, i)) and not i.startswith('_'): + if isinstance(getattr(obj, i), + collections.Callable) and not i.startswith('_'): result.append((i, getattr(obj, i))) return result diff --git a/cinder/objects/base.py b/cinder/objects/base.py index 93f2dfb8104..f6200fd2df5 100644 --- a/cinder/objects/base.py +++ b/cinder/objects/base.py @@ -14,6 +14,7 @@ """Cinder common internal object model""" +import collections import contextlib import datetime @@ -160,7 +161,8 @@ class CinderObjectRegistry(base.VersionedObjectRegistry): setattr(objects, cls.obj_name(), cls) # If registering class has a callable initialization method, call it. - if callable(getattr(cls, 'cinder_ovo_cls_init', None)): + if isinstance(getattr(cls, 'cinder_ovo_cls_init', None), + collections.Callable): cls.cinder_ovo_cls_init() @@ -567,7 +569,7 @@ class CinderObjectSerializer(base.VersionedObjectSerializer): entity = self._process_iterable(context, self.serialize_entity, entity) elif (hasattr(entity, 'obj_to_primitive') and - callable(entity.obj_to_primitive)): + isinstance(entity.obj_to_primitive, collections.Callable)): # NOTE(dulek): Backport outgoing object to the capped version. backport_ver = self._get_capped_obj_version(entity) entity = entity.obj_to_primitive(backport_ver, self.manifest) diff --git a/cinder/objects/cleanable.py b/cinder/objects/cleanable.py index dc796425843..a022e6248d4 100644 --- a/cinder/objects/cleanable.py +++ b/cinder/objects/cleanable.py @@ -13,6 +13,7 @@ # License for the specific language governing permissions and limitations # under the License. +import collections import inspect import decorator @@ -224,7 +225,8 @@ class CinderCleanableObject(base.CinderPersistentObject): # If we don't have optional decorator arguments the argument in # decorator_args is the function we have to decorate - if len(decorator_args) == 1 and callable(decorator_args[0]): + if len(decorator_args) == 1 and isinstance( + decorator_args[0], collections.Callable): function = decorator_args[0] decorator_args = None return _decorator(function) diff --git a/cinder/tests/unit/volume/drivers/netapp/dataontap/test_block_driver_interfaces.py b/cinder/tests/unit/volume/drivers/netapp/dataontap/test_block_driver_interfaces.py index c30543d103f..7b16dbba994 100644 --- a/cinder/tests/unit/volume/drivers/netapp/dataontap/test_block_driver_interfaces.py +++ b/cinder/tests/unit/volume/drivers/netapp/dataontap/test_block_driver_interfaces.py @@ -15,6 +15,7 @@ Mock unit tests for the NetApp block storage driver interfaces """ +import collections from cinder import test from cinder.volume.drivers.netapp.dataontap import block_cmode @@ -54,4 +55,4 @@ class NetAppBlockStorageDriverInterfaceTestCase(test.TestCase): def _get_local_functions(self, obj): """Get function names of an object without superclass functions.""" return set([key for key, value in type(obj).__dict__.items() - if callable(value)]) + if isinstance(value, collections.Callable)])