@six.add_metaclass(abc.ABCMeta)
class AgentCoreResourceExtension(object):
- """Define stable abstract interface for Agent extension.
+ """Define stable abstract interface for agent extensions.
An agent extension extends the agent core functionality.
"""
"""Perform agent core resource extension initialization.
Called after all extensions have been loaded.
- No abstract methods defined below will be
- called prior to this method being called.
+ No port handling will be called before this method.
"""
- pass
-
- def handle_network(self, context, data):
- """handle agent extension for network.
-
- :param context - rpc context
- :param data - network data
- """
- pass
-
- def handle_subnet(self, context, data):
- """handle agent extension for subnet.
-
- :param context - rpc context
- :param data - subnet data
- """
- pass
+ @abc.abstractmethod
def handle_port(self, context, data):
"""handle agent extension for port.
:param context - rpc context
:param data - port data
"""
- pass
invoke_on_load=True, name_order=True)
LOG.info(_LI("Loaded agent extensions names: %s"), self.names())
- def _call_on_agent_extensions(self, method_name, context, data):
- """Helper method for calling a method across all agent extensions."""
- for extension in self:
- try:
- getattr(extension.obj, method_name)(context, data)
- # TODO(QoS) add agent extensions exception and catch them here
- except AttributeError:
- LOG.exception(
- _LE("Agent Extension '%(name)s' failed in %(method)s"),
- {'name': extension.name, 'method': method_name}
- )
-
def initialize(self):
# Initialize each agent extension in the list.
for extension in self:
LOG.info(_LI("Initializing agent extension '%s'"), extension.name)
extension.obj.initialize()
- def handle_network(self, context, data):
- """Notify all agent extensions to handle network."""
- self._call_on_agent_extensions("handle_network", context, data)
-
- def handle_subnet(self, context, data):
- """Notify all agent extensions to handle subnet."""
- self._call_on_agent_extensions("handle_subnet", context, data)
-
def handle_port(self, context, data):
"""Notify all agent extensions to handle port."""
- self._call_on_agent_extensions("handle_port", context, data)
+ for extension in self:
+ try:
+ extension.obj.handle_port(context, data)
+ # TODO(QoS) add agent extensions exception and catch them here
+ except AttributeError:
+ LOG.exception(
+ _LE("Agent Extension '%(name)s' failed "
+ "while handling port update"),
+ {'name': extension.name}
+ )
#TODO(Qos) we are missing how to handle delete. we can pass action
#type in all the handle methods or add handle_delete_resource methods
def _get_extension(self):
return self.manager.extensions[0].obj
- def test__call_on_agent_extension_missing_attribute_doesnt_crash(self):
- self.manager._call_on_agent_extensions('foo', 'bar', 'baz')
-
def test_initialize(self):
self.manager.initialize()
ext = self._get_extension()
self.assertTrue(ext.initialize.called)
- def test_handle_network(self):
- context = object()
- data = object()
- self.manager.handle_network(context, data)
- ext = self._get_extension()
- ext.handle_network.assert_called_once_with(context, data)
-
- def test_handle_subnet(self):
- context = object()
- data = object()
- self.manager.handle_subnet(context, data)
- ext = self._get_extension()
- ext.handle_subnet.assert_called_once_with(context, data)
-
def test_handle_port(self):
context = object()
data = object()