summaryrefslogtreecommitdiff
path: root/ironic_python_agent/agent.py
diff options
context:
space:
mode:
authorAlexander Gordeev <agordeev@mirantis.com>2014-03-25 18:00:10 +0400
committerAlexander Gordeev <agordeev@mirantis.com>2014-03-27 17:28:57 +0400
commitaee1555156706bfebd37d98d6d315229ee024cc4 (patch)
treec2412b8efe88fa5ed9b40feaf556f35ea48de2c5 /ironic_python_agent/agent.py
parent55ea7b8edd563b5bd293110f09e49ae5317bfa84 (diff)
downloadironic-python-agent-aee1555156706bfebd37d98d6d315229ee024cc4.tar.gz
Get rid of modes. Introduce pluggable extensions
Allow multiple extensions to be loaded by switching to ExtensionManager from stevedore. Remove any reference to modes. Change-Id: Ic160478625226b4dd17bd68b3d37f3b05823e519
Diffstat (limited to 'ironic_python_agent/agent.py')
-rw-r--r--ironic_python_agent/agent.py53
1 files changed, 15 insertions, 38 deletions
diff --git a/ironic_python_agent/agent.py b/ironic_python_agent/agent.py
index bab3449e..a3fe3940 100644
--- a/ironic_python_agent/agent.py
+++ b/ironic_python_agent/agent.py
@@ -19,7 +19,7 @@ import threading
import time
import pkg_resources
-from stevedore import driver
+from stevedore import extension
from wsgiref import simple_server
from ironic_python_agent.api import app
@@ -38,15 +38,13 @@ def _time():
class IronicPythonAgentStatus(encoding.Serializable):
- def __init__(self, mode, started_at, version):
- self.mode = mode
+ def __init__(self, started_at, version):
self.started_at = started_at
self.version = version
def serialize(self):
"""Turn the status into a dict."""
return utils.get_ordereddict([
- ('mode', self.mode),
('started_at', self.started_at),
('version', self.version),
])
@@ -113,7 +111,6 @@ class IronicPythonAgent(object):
self.api_client = ironic_api_client.APIClient(self.api_url)
self.listen_address = listen_address
self.advertise_address = advertise_address
- self.mode_implementation = None
self.version = pkg_resources.get_distribution('ironic-python-agent')\
.version
self.api = app.VersionSelectorApplication(self)
@@ -125,17 +122,15 @@ class IronicPythonAgent(object):
self.log = log.getLogger(__name__)
self.started_at = None
self.node = None
-
- def get_mode_name(self):
- if self.mode_implementation:
- return self.mode_implementation.name
- else:
- return 'NONE'
+ self.ext_mgr = extension.ExtensionManager(
+ namespace='ironic_python_agent.extensions',
+ invoke_on_load=True,
+ propagate_map_exceptions=True,
+ )
def get_status(self):
"""Retrieve a serializable status."""
return IronicPythonAgentStatus(
- mode=self.get_mode_name(),
started_at=self.started_at,
version=self.version
)
@@ -162,26 +157,14 @@ class IronicPythonAgent(object):
command_parts = command_name.split('.', 1)
if len(command_parts) != 2:
raise errors.InvalidCommandError(
- 'Command name must be of the form <mode>.<name>')
+ 'Command name must be of the form <extension>.<name>')
return (command_parts[0], command_parts[1])
- def _verify_mode(self, mode_name, command_name):
- if not self.mode_implementation:
- try:
- self.mode_implementation = _load_mode_implementation(mode_name)
- except Exception:
- raise errors.InvalidCommandError(
- 'Unknown mode: {0}'.format(mode_name))
- elif self.get_mode_name().lower() != mode_name:
- raise errors.InvalidCommandError(
- 'Agent is already in {0} mode'.format(self.get_mode_name()))
-
def execute_command(self, command_name, **kwargs):
"""Execute an agent command."""
with self.command_lock:
- mode_part, command_part = self._split_command(command_name)
- self._verify_mode(mode_part, command_part)
+ extension_part, command_part = self._split_command(command_name)
if len(self.command_results) > 0:
last_command = self.command_results.values()[-1]
@@ -189,8 +172,12 @@ class IronicPythonAgent(object):
raise errors.CommandExecutionError('agent is busy')
try:
- result = self.mode_implementation.execute(command_part,
- **kwargs)
+ ext = self.ext_mgr[extension_part].obj
+ result = ext.execute(command_part, **kwargs)
+ except KeyError:
+ # Extension Not found
+ raise errors.RequestedObjectNotFoundError('Extension',
+ extension_part)
except errors.InvalidContentError as e:
# Any command may raise a InvalidContentError which will be
# returned to the caller directly.
@@ -232,16 +219,6 @@ class IronicPythonAgent(object):
self.heartbeater.stop()
-def _load_mode_implementation(mode_name):
- mgr = driver.DriverManager(
- namespace='ironic_python_agent.modes',
- name=mode_name.lower(),
- invoke_on_load=True,
- invoke_args=[],
- )
- return mgr.driver
-
-
def build_agent(api_url,
advertise_host,
advertise_port,