X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=test%2Fvpp_object.py;h=2c07d472a657070a7c7cf0be616b37d9b4693871;hb=7c0eb56f4;hp=2b71fc1fd39734366e1772a7f96894511db78fa7;hpb=0e3c0de1ed87f3cdf16e26e05e39ea6eebeafb18;p=vpp.git diff --git a/test/vpp_object.py b/test/vpp_object.py index 2b71fc1fd39..2c07d472a65 100644 --- a/test/vpp_object.py +++ b/test/vpp_object.py @@ -1,34 +1,55 @@ -from abc import ABCMeta, abstractmethod +""" abstract vpp object and object registry """ +import abc +import six +from six import moves + + +@six.add_metaclass(abc.ABCMeta) class VppObject(object): """ Abstract vpp object """ - __metaclass__ = ABCMeta - def __init__(self): - VppObjectRegistry().register(self) - - @abstractmethod + @abc.abstractmethod def add_vpp_config(self): """ Add the configuration for this object to vpp. """ pass - @abstractmethod + @abc.abstractmethod def query_vpp_config(self): """Query the vpp configuration. :return: True if the object is configured""" pass - @abstractmethod + @abc.abstractmethod def remove_vpp_config(self): """ Remove the configuration for this object from vpp. """ pass - @abstractmethod def object_id(self): """ Return a unique string representing this object. """ - pass + return "Undefined. for <%s %s>" % (self.__class__.__name__, id(self)) + + def __str__(self): + return self.object_id() + + def __repr__(self): + return '<%s>' % self.object_id() + + def __hash__(self): + return hash(self.object_id()) + + def __eq__(self, other): + 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(object): @@ -42,13 +63,20 @@ class VppObjectRegistry(object): if not hasattr(self, "_object_dict"): self._object_dict = dict() - def register(self, o): + def register(self, obj, logger): """ Register an object in the registry. """ - if not o.unique_id() in self._object_dict: - self._object_registry.append(o) - self._object_dict[o.unique_id()] = o + if obj.object_id() not in self._object_dict: + self._object_registry.append(obj) + self._object_dict[obj.object_id()] = obj + logger.debug("REG: registering %s" % obj) else: - print "not adding duplicate %s" % o + logger.debug("REG: duplicate add, ignoring (%s)" % obj) + + def unregister_all(self, logger): + """ 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): """ @@ -56,24 +84,25 @@ class VppObjectRegistry(object): from the registry. """ if not self._object_registry: - logger.info("No objects registered for auto-cleanup.") + logger.info("REG: No objects registered for auto-cleanup.") return - logger.info("Removing VPP configuration for registered objects") - for o in reversed(self._object_registry): - if o.query_vpp_config(): - logger.info("Removing %s", o) - o.remove_vpp_config() - else: - logger.info("Skipping %s, configuration not present", o) + logger.info("REG: Removing VPP configuration for registered objects") + # remove the config in reverse order as there might be dependencies failed = [] - for o in self._object_registry: - if o.query_vpp_config(): - failed.append(o) - self._object_registry = [] - self._object_dict = dict() + for obj in reversed(self._object_registry): + if obj.query_vpp_config(): + logger.info("REG: Removing configuration for %s" % obj) + obj.remove_vpp_config() + if obj.query_vpp_config(): + failed.append(obj) + else: + logger.info( + "REG: Skipping removal for %s, configuration not present" % + obj) + self.unregister_all(logger) if failed: - logger.error("Couldn't remove configuration for object(s):") - for x in failed: - logger.error(repr(x)) + logger.error("REG: Couldn't remove configuration for object(s):") + for obj in failed: + logger.error(repr(obj)) raise Exception("Couldn't remove configuration for object(s): %s" % (", ".join(str(x) for x in failed)))