X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=test%2Fvpp_object.py;h=d3652b1b62c23086f9ae590ac218ea9c4185a10f;hb=bf12efc432823c83dc06ead6be2094ac605f0021;hp=8fe549e74ff3b63e3dbf3c0ff97d8eb95801a94a;hpb=00671cf9cfbcd9ed25d79712bf01d29cb8787bf2;p=vpp.git diff --git a/test/vpp_object.py b/test/vpp_object.py index 8fe549e74ff..d3652b1b62c 100644 --- a/test/vpp_object.py +++ b/test/vpp_object.py @@ -1,50 +1,67 @@ """ abstract vpp object and object registry """ -from abc import ABCMeta, abstractmethod +import abc -import six +class VppObject(metaclass=abc.ABCMeta): + """Abstract vpp object""" -class VppObject(object): - """ Abstract vpp object """ - __metaclass__ = ABCMeta - - @abstractmethod - def add_vpp_config(self): - """ Add the configuration for this object to vpp. """ + @abc.abstractmethod + def add_vpp_config(self) -> None: + """Add the configuration for this object to vpp.""" pass - @abstractmethod - def query_vpp_config(self): + @abc.abstractmethod + def query_vpp_config(self) -> bool: """Query the vpp configuration. :return: True if the object is configured""" pass - @abstractmethod - def remove_vpp_config(self): - """ Remove the configuration for this object from vpp. """ + @abc.abstractmethod + def remove_vpp_config(self) -> None: + """Remove the configuration for this object from vpp.""" pass - @abstractmethod - def object_id(self): - """ Return a unique string representing this object. """ - pass + def object_id(self) -> str: + """Return a unique string representing this object.""" + return "Undefined. for <%s %s>" % (self.__class__.__name__, id(self)) + + def __str__(self) -> str: + return self.object_id() + + def __repr__(self) -> str: + return "<%s>" % self.object_id() + + def __hash__(self) -> int: + return hash(self.object_id()) + + def __eq__(self, other) -> bool: + if not isinstance(other, self.__class__): + return NotImplemented + if other.object_id() == self.object_id(): + return True + return False + + # This can be removed when python2 support is dropped. + def __ne__(self, other): + return not self.__eq__(other) + +class VppObjectRegistry: + """Class which handles automatic configuration cleanup.""" -class VppObjectRegistry(object): - """ Class which handles automatic configuration cleanup. """ _shared_state = {} - def __init__(self): + def __init__(self) -> None: self.__dict__ = self._shared_state if not hasattr(self, "_object_registry"): self._object_registry = [] if not hasattr(self, "_object_dict"): self._object_dict = dict() - def register(self, obj, logger): - """ Register an object in the registry. """ + def register(self, obj: VppObject, logger) -> None: + """Register an object in the registry.""" if obj.object_id() not in self._object_dict: self._object_registry.append(obj) self._object_dict[obj.object_id()] = obj @@ -52,13 +69,13 @@ class VppObjectRegistry(object): else: logger.debug("REG: duplicate add, ignoring (%s)" % obj) - def unregister_all(self, logger): - """ Remove all object registrations from registry. """ + def unregister_all(self, logger) -> None: + """Remove all object registrations from registry.""" logger.debug("REG: removing all object registrations") self._object_registry = [] self._object_dict = dict() - def remove_vpp_config(self, logger): + def remove_vpp_config(self, logger) -> None: """ Remove configuration (if present) from vpp and then remove all objects from the registry. @@ -77,12 +94,14 @@ class VppObjectRegistry(object): failed.append(obj) else: logger.info( - "REG: Skipping removal for %s, configuration not present" % - obj) + "REG: Skipping removal for %s, configuration not present" % obj + ) self.unregister_all(logger) if failed: logger.error("REG: Couldn't remove configuration for object(s):") for obj in failed: - logger.error(six.reprlib(obj)) - raise Exception("Couldn't remove configuration for object(s): %s" % - (", ".join(str(x) for x in failed))) + logger.error(repr(obj)) + raise Exception( + "Couldn't remove configuration for object(s): %s" + % (", ".join(str(x) for x in failed)) + )