From 5914e36b30d429648d626ee37f8969bfbf450186 Mon Sep 17 00:00:00 2001 From: Josh Gachnang Date: Wed, 19 Mar 2014 16:19:52 -0700 Subject: [PATCH] Replacing teeth/overlord with ipa/ironic --- .testr.conf | 2 +- Dockerfile | 2 + README.md | 4 +- ironic_python_agent/agent.py | 47 ++++++++++--------- ironic_python_agent/api/app.py | 2 +- ironic_python_agent/api/config.py | 4 +- ironic_python_agent/api/controllers/root.py | 6 +-- .../api/controllers/v1/__init__.py | 8 ++-- .../api/controllers/v1/command.py | 2 +- .../api/controllers/v1/link.py | 2 +- .../api/controllers/v1/status.py | 2 +- ironic_python_agent/base.py | 6 +-- ironic_python_agent/cmd/agent.py | 6 +-- ironic_python_agent/configdrive.py | 4 +- ironic_python_agent/decom.py | 2 +- ironic_python_agent/decorators.py | 2 +- ironic_python_agent/errors.py | 16 +++---- ironic_python_agent/hardware.py | 14 +++--- ...lord_agent_api.py => ironic_api_client.py} | 4 +- .../openstack/common/gettextutils.py | 14 +++--- .../openstack/common/importutils.py | 2 +- .../openstack/common/jsonutils.py | 6 +-- ironic_python_agent/openstack/common/log.py | 10 ++-- .../shell/copy_configdrive_to_disk.sh | 2 +- ironic_python_agent/standby.py | 12 ++--- ironic_python_agent/tests/agent.py | 29 ++++++------ ironic_python_agent/tests/api.py | 17 ++++--- ironic_python_agent/tests/configdrive.py | 12 ++--- ironic_python_agent/tests/decom.py | 2 +- ironic_python_agent/tests/hardware.py | 2 +- ...lord_agent_api.py => ironic_api_client.py} | 12 ++--- ironic_python_agent/tests/standby.py | 26 +++++----- openstack-common.conf | 2 +- setup.cfg | 18 +++---- tox.ini | 4 +- 35 files changed, 158 insertions(+), 147 deletions(-) rename ironic_python_agent/{overlord_agent_api.py => ironic_api_client.py} (97%) rename ironic_python_agent/tests/{overlord_agent_api.py => ironic_api_client.py} (95%) diff --git a/.testr.conf b/.testr.conf index b8a64a79d..38e2a618c 100644 --- a/.testr.conf +++ b/.testr.conf @@ -1,4 +1,4 @@ [DEFAULT] -test_command=OS_STDOUT_CAPTURE=1 OS_STDERR_CAPTURE=1 OS_TEST_TIMEOUT=60 ${PYTHON:-python} -m subunit.run discover -s teeth_agent/tests/ -p "*.py" $LISTOPT $IDOPTION +test_command=OS_STDOUT_CAPTURE=1 OS_STDERR_CAPTURE=1 OS_TEST_TIMEOUT=60 ${PYTHON:-python} -m subunit.run discover -s ironic_python_agent/tests/ -p "*.py" $LISTOPT $IDOPTION test_id_option=--load-list $IDFILE test_list_option=--list diff --git a/Dockerfile b/Dockerfile index 7fa950b14..d69cbee51 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,7 @@ FROM jayofdoom/docker-ubuntu-14.04 +#TODO(pcsforeducation) ask Jay what we can change here + # The add is before the RUN to ensure we get the latest version of packages # Docker will cache RUN commands, but because the SHA1 of the dir will be # different it will not cache this layer diff --git a/README.md b/README.md index 15e3a8a4f..c36203095 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -# teeth-agent +# ironic-python-agent [![Build Status](https://travis-ci.org/rackerlabs/teeth-agent.png?branch=master)](https://travis-ci.org/rackerlabs/teeth-agent) -An agent for rebuilding and controlling Teeth chassis. +An agent for rebuilding and controlling Ironic nodes. diff --git a/ironic_python_agent/agent.py b/ironic_python_agent/agent.py index 261a48771..82b8792f9 100644 --- a/ironic_python_agent/agent.py +++ b/ironic_python_agent/agent.py @@ -18,26 +18,26 @@ import random import threading import time +from ironic_python_agent.api import app +from ironic_python_agent import base +from ironic_python_agent import encoding +from ironic_python_agent import errors +from ironic_python_agent import hardware +from ironic_python_agent import ironic_api_client +from ironic_python_agent.openstack.common import log +from ironic_python_agent import utils + import pkg_resources from stevedore import driver from wsgiref import simple_server -from teeth_agent.api import app -from teeth_agent import base -from teeth_agent import encoding -from teeth_agent import errors -from teeth_agent import hardware -from teeth_agent.openstack.common import log -from teeth_agent import overlord_agent_api -from teeth_agent import utils - def _time(): """Wraps time.time() for simpler testing.""" return time.time() -class TeethAgentStatus(encoding.Serializable): +class IronicPythonAgentStatus(encoding.Serializable): def __init__(self, mode, started_at, version): self.mode = mode self.started_at = started_at @@ -52,7 +52,7 @@ class TeethAgentStatus(encoding.Serializable): ]) -class TeethAgentHeartbeater(threading.Thread): +class IronicPythonAgentHeartbeater(threading.Thread): # If we could wait at most N seconds between heartbeats (or in case of an # error) we will instead wait r x N seconds, where r is a random value # between these multipliers. @@ -67,10 +67,10 @@ class TeethAgentHeartbeater(threading.Thread): backoff_factor = 2.7 def __init__(self, agent): - super(TeethAgentHeartbeater, self).__init__() + super(IronicPythonAgentHeartbeater, self).__init__() self.agent = agent self.hardware = hardware.get_manager() - self.api = overlord_agent_api.APIClient(agent.api_url) + self.api = ironic_api_client.APIClient(agent.api_url) self.log = log.getLogger(__name__) self.stop_event = threading.Event() self.error_delay = self.initial_delay @@ -111,17 +111,18 @@ class TeethAgentHeartbeater(threading.Thread): return self.join() -class TeethAgent(object): +class IronicPythonAgent(object): def __init__(self, api_url, advertise_address, listen_address): self.api_url = api_url - self.api_client = overlord_agent_api.APIClient(self.api_url) + 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('teeth-agent').version + self.version = pkg_resources.get_distribution('ironic-python-agent')\ + .version self.api = app.VersionSelectorApplication(self) self.command_results = utils.get_ordereddict() - self.heartbeater = TeethAgentHeartbeater(self) + self.heartbeater = IronicPythonAgentHeartbeater(self) self.hardware = hardware.get_manager() self.command_lock = threading.Lock() self.log = log.getLogger(__name__) @@ -136,7 +137,7 @@ class TeethAgent(object): def get_status(self): """Retrieve a serializable status.""" - return TeethAgentStatus( + return IronicPythonAgentStatus( mode=self.get_mode_name(), started_at=self.started_at, version=self.version @@ -209,7 +210,7 @@ class TeethAgent(object): return result def run(self): - """Run the Teeth Agent.""" + """Run the Ironic Python Agent.""" self.started_at = _time() # Get the UUID so we can heartbeat to Ironic self.node = self.api_client.lookup_node( @@ -232,7 +233,7 @@ class TeethAgent(object): def _load_mode_implementation(mode_name): mgr = driver.DriverManager( - namespace='teeth_agent.modes', + namespace='ironic_python_agent.modes', name=mode_name.lower(), invoke_on_load=True, invoke_args=[], @@ -246,6 +247,6 @@ def build_agent(api_url, listen_host, listen_port): - return TeethAgent(api_url, - (advertise_host, advertise_port), - (listen_host, listen_port)) + return IronicPythonAgent(api_url, + (advertise_host, advertise_port), + (listen_host, listen_port)) diff --git a/ironic_python_agent/api/app.py b/ironic_python_agent/api/app.py index 247001d48..a45307d9e 100644 --- a/ironic_python_agent/api/app.py +++ b/ironic_python_agent/api/app.py @@ -17,7 +17,7 @@ limitations under the License. import pecan from pecan import hooks -from teeth_agent.api import config +from ironic_python_agent.api import config class AgentHook(hooks.PecanHook): diff --git a/ironic_python_agent/api/config.py b/ironic_python_agent/api/config.py index 8814a1c1e..938af6a0b 100644 --- a/ironic_python_agent/api/config.py +++ b/ironic_python_agent/api/config.py @@ -24,8 +24,8 @@ server = { # Pecan Application Configurations # See https://pecan.readthedocs.org/en/latest/configuration.html#application-configuration # noqa app = { - 'root': 'teeth_agent.api.controllers.root.RootController', - 'modules': ['teeth_agent.api'], + 'root': 'ironic_python_agent.api.controllers.root.RootController', + 'modules': ['ironic_python_agent.api'], 'static_root': '%(confdir)s/public', 'debug': False, 'enable_acl': True, diff --git a/ironic_python_agent/api/controllers/root.py b/ironic_python_agent/api/controllers/root.py index 4552e731b..46caaad01 100644 --- a/ironic_python_agent/api/controllers/root.py +++ b/ironic_python_agent/api/controllers/root.py @@ -18,9 +18,9 @@ from pecan import rest from wsme import types as wtypes import wsmeext.pecan as wsme_pecan -from teeth_agent.api.controllers import v1 -from teeth_agent.api.controllers.v1 import base -from teeth_agent.api.controllers.v1 import link +from ironic_python_agent.api.controllers import v1 +from ironic_python_agent.api.controllers.v1 import base +from ironic_python_agent.api.controllers.v1 import link class Version(base.APIBase): diff --git a/ironic_python_agent/api/controllers/v1/__init__.py b/ironic_python_agent/api/controllers/v1/__init__.py index a2bc16c76..726a0bf4e 100644 --- a/ironic_python_agent/api/controllers/v1/__init__.py +++ b/ironic_python_agent/api/controllers/v1/__init__.py @@ -22,10 +22,10 @@ from pecan import rest from wsme import types as wtypes import wsmeext.pecan as wsme_pecan -from teeth_agent.api.controllers.v1 import base -from teeth_agent.api.controllers.v1 import command -from teeth_agent.api.controllers.v1 import link -from teeth_agent.api.controllers.v1 import status +from ironic_python_agent.api.controllers.v1 import base +from ironic_python_agent.api.controllers.v1 import command +from ironic_python_agent.api.controllers.v1 import link +from ironic_python_agent.api.controllers.v1 import status class MediaType(base.APIBase): diff --git a/ironic_python_agent/api/controllers/v1/command.py b/ironic_python_agent/api/controllers/v1/command.py index 811000007..5815c4fa3 100644 --- a/ironic_python_agent/api/controllers/v1/command.py +++ b/ironic_python_agent/api/controllers/v1/command.py @@ -18,7 +18,7 @@ from pecan import rest from wsme import types from wsmeext import pecan as wsme_pecan -from teeth_agent.api.controllers.v1 import base +from ironic_python_agent.api.controllers.v1 import base class CommandResult(base.APIBase): diff --git a/ironic_python_agent/api/controllers/v1/link.py b/ironic_python_agent/api/controllers/v1/link.py index 987eb386d..7fa7f9823 100644 --- a/ironic_python_agent/api/controllers/v1/link.py +++ b/ironic_python_agent/api/controllers/v1/link.py @@ -15,7 +15,7 @@ from wsme import types as wtypes -from teeth_agent.api.controllers.v1 import base +from ironic_python_agent.api.controllers.v1 import base class Link(base.APIBase): diff --git a/ironic_python_agent/api/controllers/v1/status.py b/ironic_python_agent/api/controllers/v1/status.py index c631ee59b..7916f09c3 100644 --- a/ironic_python_agent/api/controllers/v1/status.py +++ b/ironic_python_agent/api/controllers/v1/status.py @@ -18,7 +18,7 @@ from pecan import rest from wsme import types from wsmeext import pecan as wsme_pecan -from teeth_agent.api.controllers.v1 import base +from ironic_python_agent.api.controllers.v1 import base class AgentStatus(base.APIBase): diff --git a/ironic_python_agent/base.py b/ironic_python_agent/base.py index 2e432f78f..473c0444d 100644 --- a/ironic_python_agent/base.py +++ b/ironic_python_agent/base.py @@ -18,9 +18,9 @@ import threading import uuid -from teeth_agent import encoding -from teeth_agent import errors -from teeth_agent.openstack.common import log +from ironic_python_agent import encoding +from ironic_python_agent import errors +from ironic_python_agent.openstack.common import log class AgentCommandStatus(object): diff --git a/ironic_python_agent/cmd/agent.py b/ironic_python_agent/cmd/agent.py index a30b8a9c6..e12d37d03 100644 --- a/ironic_python_agent/cmd/agent.py +++ b/ironic_python_agent/cmd/agent.py @@ -16,17 +16,17 @@ limitations under the License. import argparse -from teeth_agent import agent +from ironic_python_agent import agent def run(): parser = argparse.ArgumentParser( description=('An agent that handles decomissioning and provisioning' - ' on behalf of teeth-overlord.')) + ' on behalf of Ironic.')) parser.add_argument('--api-url', required=True, - help='URL of the Teeth agent API') + help='URL of the Ironic API') parser.add_argument('--listen-host', default='0.0.0.0', diff --git a/ironic_python_agent/configdrive.py b/ironic_python_agent/configdrive.py index d4bec9b0e..d581c6616 100644 --- a/ironic_python_agent/configdrive.py +++ b/ironic_python_agent/configdrive.py @@ -15,9 +15,11 @@ limitations under the License. """ import base64 + +from ironic_python_agent import utils + import json import os -from teeth_agent import utils class ConfigDriveWriter(object): diff --git a/ironic_python_agent/decom.py b/ironic_python_agent/decom.py index b1fe1f102..ac841ae10 100644 --- a/ironic_python_agent/decom.py +++ b/ironic_python_agent/decom.py @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. """ -from teeth_agent import base +from ironic_python_agent import base class DecomMode(base.BaseAgentMode): diff --git a/ironic_python_agent/decorators.py b/ironic_python_agent/decorators.py index 01cd5d7de..99213c9f5 100644 --- a/ironic_python_agent/decorators.py +++ b/ironic_python_agent/decorators.py @@ -15,7 +15,7 @@ limitations under the License. """ import functools -from teeth_agent import base +from ironic_python_agent import base def async_command(validator=None): diff --git a/ironic_python_agent/errors.py b/ironic_python_agent/errors.py index 6ba45316c..ff4960dc0 100644 --- a/ironic_python_agent/errors.py +++ b/ironic_python_agent/errors.py @@ -14,12 +14,12 @@ See the License for the specific language governing permissions and limitations under the License. """ -from teeth_agent import encoding -from teeth_agent import utils +from ironic_python_agent import encoding +from ironic_python_agent import utils class RESTError(Exception, encoding.Serializable): - """Base class for errors generated in teeth.""" + """Base class for errors generated in ironic-python-client.""" message = 'An error occurred' details = 'An unexpected error occurred. Please try back later.' status_code = 500 @@ -91,17 +91,17 @@ class RequestedObjectNotFoundError(NotFound): self.details = details -class OverlordAPIError(RESTError): +class IronicAPIError(RESTError): """Error raised when a call to the agent API fails.""" - message = 'Error in call to teeth-agent-api.' + message = 'Error in call to ironic-api.' def __init__(self, details): - super(OverlordAPIError, self).__init__(details) + super(IronicAPIError, self).__init__(details) self.details = details -class HeartbeatError(OverlordAPIError): +class HeartbeatError(IronicAPIError): """Error raised when a heartbeat to the agent API fails.""" message = 'Error heartbeating to agent API.' @@ -110,7 +110,7 @@ class HeartbeatError(OverlordAPIError): super(HeartbeatError, self).__init__(details) -class LookupNodeError(OverlordAPIError): +class LookupNodeError(IronicAPIError): """Error raised when the node configuration lookup to the Ironic API fails. """ diff --git a/ironic_python_agent/hardware.py b/ironic_python_agent/hardware.py index d6ed9d5d4..f41e306dc 100644 --- a/ironic_python_agent/hardware.py +++ b/ironic_python_agent/hardware.py @@ -20,9 +20,9 @@ import subprocess import stevedore -from teeth_agent import encoding -from teeth_agent.openstack.common import log -from teeth_agent import utils +from ironic_python_agent import encoding +from ironic_python_agent.openstack.common import log +from ironic_python_agent import utils _global_manager = None @@ -30,9 +30,9 @@ _global_manager = None class HardwareSupport(object): """These are just guidelines to suggest values that might be returned by calls to `evaluate_hardware_support`. No HardwareManager in mainline - teeth-agent will ever offer a value greater than `MAINLINE`. Service - Providers should feel free to return values greater than SERVICE_PROVIDER - to distinguish between additional levels of support. + ironic-python-agent will ever offer a value greater than `MAINLINE`. + Service Providers should feel free to return values greater than + SERVICE_PROVIDER to distinguish between additional levels of support. """ NONE = 0 GENERIC = 1 @@ -164,7 +164,7 @@ def get_manager(): if not _global_manager: LOG = log.getLogger() extension_manager = stevedore.ExtensionManager( - namespace='teeth_agent.hardware_managers', + namespace='ironic_python_agent.hardware_managers', invoke_on_load=True) # There will always be at least one extension available (the diff --git a/ironic_python_agent/overlord_agent_api.py b/ironic_python_agent/ironic_api_client.py similarity index 97% rename from ironic_python_agent/overlord_agent_api.py rename to ironic_python_agent/ironic_api_client.py index fda86b22b..a3f06dee4 100644 --- a/ironic_python_agent/overlord_agent_api.py +++ b/ironic_python_agent/ironic_api_client.py @@ -18,8 +18,8 @@ import json import requests -from teeth_agent import encoding -from teeth_agent import errors +from ironic_python_agent import encoding +from ironic_python_agent import errors class APIClient(object): diff --git a/ironic_python_agent/openstack/common/gettextutils.py b/ironic_python_agent/openstack/common/gettextutils.py index edcf14c1b..9c13e80a3 100644 --- a/ironic_python_agent/openstack/common/gettextutils.py +++ b/ironic_python_agent/openstack/common/gettextutils.py @@ -19,7 +19,7 @@ gettext for openstack-common modules. Usual usage in an openstack.common module: - from teeth_agent.openstack.common.gettextutils import _ + from ironic_python_agent.openstack.common.gettextutils import _ """ import copy @@ -32,15 +32,15 @@ import os from babel import localedata import six -_localedir = os.environ.get('teeth_agent'.upper() + '_LOCALEDIR') -_t = gettext.translation('teeth_agent', localedir=_localedir, fallback=True) +_localedir = os.environ.get('ironic_python_agent'.upper() + '_LOCALEDIR') +_t = gettext.translation('ironic_python_agent', localedir=_localedir, fallback=True) # We use separate translation catalogs for each log level, so set up a # mapping between the log level name and the translator. The domain # for the log level is project_name + "-log-" + log_level so messages # for each level end up in their own catalog. _t_log_levels = dict( - (level, gettext.translation('teeth_agent' + '-log-' + level, + (level, gettext.translation('ironic_python_agent' + '-log-' + level, localedir=_localedir, fallback=True)) for level in ['info', 'warning', 'error', 'critical'] @@ -64,7 +64,7 @@ def enable_lazy(): def _(msg): if USE_LAZY: - return Message(msg, domain='teeth_agent') + return Message(msg, domain='ironic_python_agent') else: if six.PY3: return _t.gettext(msg) @@ -75,7 +75,7 @@ def _log_translation(msg, level): """Build a single translation of a log message """ if USE_LAZY: - return Message(msg, domain='teeth_agent' + '-log-' + level) + return Message(msg, domain='ironic_python_agent' + '-log-' + level) else: translator = _t_log_levels[level] if six.PY3: @@ -152,7 +152,7 @@ class Message(six.text_type): """ def __new__(cls, msgid, msgtext=None, params=None, - domain='teeth_agent', *args): + domain='ironic_python_agent', *args): """Create a new Message object. In order for translation to work gettext requires a message ID, this diff --git a/ironic_python_agent/openstack/common/importutils.py b/ironic_python_agent/openstack/common/importutils.py index 42b36f676..d1590fb29 100644 --- a/ironic_python_agent/openstack/common/importutils.py +++ b/ironic_python_agent/openstack/common/importutils.py @@ -59,7 +59,7 @@ def import_module(import_str): def import_versioned_module(version, submodule=None): - module = 'teeth_agent.v%s' % version + module = 'ironic_python_agent.v%s' % version if submodule: module = '.'.join((module, submodule)) return import_module(module) diff --git a/ironic_python_agent/openstack/common/jsonutils.py b/ironic_python_agent/openstack/common/jsonutils.py index bbc833685..fca593458 100644 --- a/ironic_python_agent/openstack/common/jsonutils.py +++ b/ironic_python_agent/openstack/common/jsonutils.py @@ -40,9 +40,9 @@ import json import six import six.moves.xmlrpc_client as xmlrpclib -from teeth_agent.openstack.common import gettextutils -from teeth_agent.openstack.common import importutils -from teeth_agent.openstack.common import timeutils +from ironic_python_agent.openstack.common import gettextutils +from ironic_python_agent.openstack.common import importutils +from ironic_python_agent.openstack.common import timeutils netaddr = importutils.try_import("netaddr") diff --git a/ironic_python_agent/openstack/common/log.py b/ironic_python_agent/openstack/common/log.py index 20f4ca968..45a3ec56a 100644 --- a/ironic_python_agent/openstack/common/log.py +++ b/ironic_python_agent/openstack/common/log.py @@ -41,10 +41,10 @@ from oslo.config import cfg import six from six import moves -from teeth_agent.openstack.common.gettextutils import _ -from teeth_agent.openstack.common import importutils -from teeth_agent.openstack.common import jsonutils -from teeth_agent.openstack.common import local +from ironic_python_agent.openstack.common.gettextutils import _ +from ironic_python_agent.openstack.common import importutils +from ironic_python_agent.openstack.common import jsonutils +from ironic_python_agent.openstack.common import local _DEFAULT_LOG_DATE_FORMAT = "%Y-%m-%d %H:%M:%S" @@ -537,7 +537,7 @@ def _setup_logging_from_conf(project, version): if CONF.publish_errors: handler = importutils.import_object( - "teeth_agent.openstack.common.log_handler.PublishErrorsHandler", + "ironic_python_agent.openstack.common.log_handler.PublishErrorsHandler", logging.ERROR) log_root.addHandler(handler) diff --git a/ironic_python_agent/shell/copy_configdrive_to_disk.sh b/ironic_python_agent/shell/copy_configdrive_to_disk.sh index daeae1d7d..2a67389ff 100755 --- a/ironic_python_agent/shell/copy_configdrive_to_disk.sh +++ b/ironic_python_agent/shell/copy_configdrive_to_disk.sh @@ -37,7 +37,7 @@ genisoimage \ -allow-lowercase \ -allow-multidot \ -l \ - -publisher "teeth" \ + -publisher "ironic" \ -J \ -r \ -V 'config-2' \ diff --git a/ironic_python_agent/standby.py b/ironic_python_agent/standby.py index 3e10f16a8..c19c03938 100644 --- a/ironic_python_agent/standby.py +++ b/ironic_python_agent/standby.py @@ -20,12 +20,12 @@ import requests import subprocess import time -from teeth_agent import base -from teeth_agent import configdrive -from teeth_agent import decorators -from teeth_agent import errors -from teeth_agent import hardware -from teeth_agent.openstack.common import log +from ironic_python_agent import base +from ironic_python_agent import configdrive +from ironic_python_agent import decorators +from ironic_python_agent import errors +from ironic_python_agent import hardware +from ironic_python_agent.openstack.common import log LOG = log.getLogger(__name__) diff --git a/ironic_python_agent/tests/agent.py b/ironic_python_agent/tests/agent.py index 8f90e7a6a..4fc5d082f 100644 --- a/ironic_python_agent/tests/agent.py +++ b/ironic_python_agent/tests/agent.py @@ -18,17 +18,16 @@ import json import time import unittest +from ironic_python_agent import agent +from ironic_python_agent import base +from ironic_python_agent import encoding +from ironic_python_agent import errors +from ironic_python_agent import hardware + import mock import pkg_resources from wsgiref import simple_server - -from teeth_agent import agent -from teeth_agent import base -from teeth_agent import encoding -from teeth_agent import errors -from teeth_agent import hardware - EXPECTED_ERROR = RuntimeError('command execution failed') @@ -47,13 +46,13 @@ class FakeMode(base.BaseAgentMode): class TestHeartbeater(unittest.TestCase): def setUp(self): self.mock_agent = mock.Mock() - self.heartbeater = agent.TeethAgentHeartbeater(self.mock_agent) + self.heartbeater = agent.IronicPythonAgentHeartbeater(self.mock_agent) self.heartbeater.api = mock.Mock() self.heartbeater.hardware = mock.create_autospec( hardware.HardwareManager) self.heartbeater.stop_event = mock.Mock() - @mock.patch('teeth_agent.agent._time') + @mock.patch('ironic_python_agent.agent._time') @mock.patch('random.uniform') def test_heartbeat(self, mocked_uniform, mocked_time): time_responses = [] @@ -119,9 +118,10 @@ class TestHeartbeater(unittest.TestCase): class TestBaseAgent(unittest.TestCase): def setUp(self): self.encoder = encoding.RESTJSONEncoder(indent=4) - self.agent = agent.TeethAgent('https://fake_api.example.org:8081/', - ('203.0.113.1', 9990), - ('192.0.2.1', 9999)) + self.agent = agent.IronicPythonAgent('https://fake_api.example.' + 'org:8081/', + ('203.0.113.1', 9990), + ('192.0.2.1', 9999)) def assertEqualEncoded(self, a, b): # Evidently JSONEncoder.default() can't handle None (??) so we have to @@ -136,10 +136,11 @@ class TestBaseAgent(unittest.TestCase): self.agent.started_at = started_at status = self.agent.get_status() - self.assertTrue(isinstance(status, agent.TeethAgentStatus)) + self.assertTrue(isinstance(status, agent.IronicPythonAgentStatus)) self.assertEqual(status.started_at, started_at) self.assertEqual(status.version, - pkg_resources.get_distribution('teeth-agent').version) + pkg_resources.get_distribution('ironic-python-agent') + .version) def test_execute_command(self): do_something_impl = mock.Mock() diff --git a/ironic_python_agent/tests/api.py b/ironic_python_agent/tests/api.py index c1fc622eb..08f9b0fc2 100644 --- a/ironic_python_agent/tests/api.py +++ b/ironic_python_agent/tests/api.py @@ -21,17 +21,17 @@ import unittest import pecan import pecan.testing -from teeth_agent import agent -from teeth_agent import base +from ironic_python_agent import agent +from ironic_python_agent import base PATH_PREFIX = '/v1' -class TestTeethAPI(unittest.TestCase): +class TestIronicAPI(unittest.TestCase): def setUp(self): - super(TestTeethAPI, self).setUp() + super(TestIronicAPI, self).setUp() self.mock_agent = mock.MagicMock() self.app = self._make_app(self.mock_agent) @@ -41,8 +41,9 @@ class TestTeethAPI(unittest.TestCase): def _make_app(self, enable_acl=False): self.config = { 'app': { - 'root': 'teeth_agent.api.controllers.root.RootController', - 'modules': ['teeth_agent.api'], + 'root': 'ironic_python_agent.api.controllers.root.' + 'RootController', + 'modules': ['ironic_python_agent.api'], 'static_root': '', 'debug': True, }, @@ -165,7 +166,9 @@ class TestTeethAPI(unittest.TestCase): self.assertTrue('commands' in data.keys()) def test_get_agent_status(self): - status = agent.TeethAgentStatus('TEST_MODE', time.time(), 'v72ac9') + status = agent.IronicPythonAgentStatus('TEST_MODE', + time.time(), + 'v72ac9') self.mock_agent.get_status.return_value = status response = self.get_json('/status') diff --git a/ironic_python_agent/tests/configdrive.py b/ironic_python_agent/tests/configdrive.py index 915d939a7..fffedbebf 100644 --- a/ironic_python_agent/tests/configdrive.py +++ b/ironic_python_agent/tests/configdrive.py @@ -21,8 +21,8 @@ import json import mock import unittest -from teeth_agent import configdrive -from teeth_agent import utils +from ironic_python_agent import configdrive +from ironic_python_agent import utils class ConfigDriveWriterTestCase(unittest.TestCase): @@ -45,7 +45,7 @@ class ConfigDriveWriterTestCase(unittest.TestCase): def test_write_no_files(self, open_mock, makedirs_mock): metadata = {'admin_pass': 'password', 'hostname': 'test'} json_metadata = json.dumps(metadata) - metadata_path = '/lol/teeth/latest/meta_data.json' + metadata_path = '/lol/ironic/latest/meta_data.json' for k, v in metadata.iteritems(): self.writer.add_metadata(k, v) @@ -53,12 +53,12 @@ class ConfigDriveWriterTestCase(unittest.TestCase): open_mock.return_value.__exit__ = mock.Mock() write_mock = open_mock.return_value.write - self.writer.write('/lol', prefix='teeth', version='latest') + self.writer.write('/lol', prefix='ironic', version='latest') open_mock.assert_called_once_with(metadata_path, 'wb') write_mock.assert_called_once_with(json_metadata) makedirs_calls = [ - mock.call('/lol/teeth/latest'), - mock.call('/lol/teeth/content') + mock.call('/lol/ironic/latest'), + mock.call('/lol/ironic/content') ] self.assertEqual(makedirs_calls, makedirs_mock.call_args_list) diff --git a/ironic_python_agent/tests/decom.py b/ironic_python_agent/tests/decom.py index 920f2b97b..d55909718 100644 --- a/ironic_python_agent/tests/decom.py +++ b/ironic_python_agent/tests/decom.py @@ -16,7 +16,7 @@ limitations under the License. import unittest -from teeth_agent import decom +from ironic_python_agent import decom class TestDecomMode(unittest.TestCase): diff --git a/ironic_python_agent/tests/hardware.py b/ironic_python_agent/tests/hardware.py index 8e4a75d68..4db844cf6 100644 --- a/ironic_python_agent/tests/hardware.py +++ b/ironic_python_agent/tests/hardware.py @@ -17,7 +17,7 @@ limitations under the License. import mock import unittest -from teeth_agent import hardware +from ironic_python_agent import hardware class TestGenericHardwareManager(unittest.TestCase): diff --git a/ironic_python_agent/tests/overlord_agent_api.py b/ironic_python_agent/tests/ironic_api_client.py similarity index 95% rename from ironic_python_agent/tests/overlord_agent_api.py rename to ironic_python_agent/tests/ironic_api_client.py index 20f92ad78..8dd4dfb24 100644 --- a/ironic_python_agent/tests/overlord_agent_api.py +++ b/ironic_python_agent/tests/ironic_api_client.py @@ -20,16 +20,16 @@ import mock import time import unittest -from teeth_agent import errors -from teeth_agent import hardware -from teeth_agent import overlord_agent_api +from ironic_python_agent import errors +from ironic_python_agent import hardware +from ironic_python_agent import ironic_api_client -API_URL = 'http://agent-api.overlord.example.org/' +API_URL = 'http://agent-api.ironic.example.org/' -class TestBaseTeethAgent(unittest.TestCase): +class TestBaseIronicPythonAgent(unittest.TestCase): def setUp(self): - self.api_client = overlord_agent_api.APIClient(API_URL) + self.api_client = ironic_api_client.APIClient(API_URL) self.hardware_info = [ hardware.HardwareInfo(hardware.HardwareType.MAC_ADDRESS, 'aa:bb:cc:dd:ee:ff'), diff --git a/ironic_python_agent/tests/standby.py b/ironic_python_agent/tests/standby.py index f5f116266..bfaa896c5 100644 --- a/ironic_python_agent/tests/standby.py +++ b/ironic_python_agent/tests/standby.py @@ -17,8 +17,8 @@ limitations under the License. import mock import unittest -from teeth_agent import errors -from teeth_agent import standby +from ironic_python_agent import errors +from ironic_python_agent import standby class TestStandbyMode(unittest.TestCase): @@ -177,7 +177,7 @@ class TestStandbyMode(unittest.TestCase): standby._download_image, image_info) - @mock.patch('teeth_agent.standby._verify_image', autospec=True) + @mock.patch('ironic_python_agent.standby._verify_image', autospec=True) @mock.patch('__builtin__.open', autospec=True) @mock.patch('requests.get', autospec=True) def test_download_image_verify_fails(self, requests_mock, open_mock, @@ -218,9 +218,9 @@ class TestStandbyMode(unittest.TestCase): self.assertFalse(verified) self.assertEqual(md5_mock.call_count, 1) - @mock.patch('teeth_agent.hardware.get_manager', autospec=True) - @mock.patch('teeth_agent.standby._write_image', autospec=True) - @mock.patch('teeth_agent.standby._download_image', autospec=True) + @mock.patch('ironic_python_agent.hardware.get_manager', autospec=True) + @mock.patch('ironic_python_agent.standby._write_image', autospec=True) + @mock.patch('ironic_python_agent.standby._download_image', autospec=True) def test_cache_image(self, download_mock, write_mock, hardware_mock): image_info = self._build_fake_image_info() download_mock.return_value = None @@ -236,13 +236,15 @@ class TestStandbyMode(unittest.TestCase): self.assertEqual('SUCCEEDED', async_result.command_status) self.assertEqual(None, async_result.command_result) - @mock.patch('teeth_agent.standby._copy_configdrive_to_disk', autospec=True) - @mock.patch('teeth_agent.standby.configdrive.write_configdrive', + @mock.patch('ironic_python_agent.standby._copy_configdrive_to_disk', + autospec=True) + @mock.patch('ironic_python_agent.standby.configdrive.write_configdrive', + autospec=True) + @mock.patch('ironic_python_agent.hardware.get_manager', autospec=True) + @mock.patch('ironic_python_agent.standby._write_image', autospec=True) + @mock.patch('ironic_python_agent.standby._download_image', autospec=True) + @mock.patch('ironic_python_agent.standby._configdrive_location', autospec=True) - @mock.patch('teeth_agent.hardware.get_manager', autospec=True) - @mock.patch('teeth_agent.standby._write_image', autospec=True) - @mock.patch('teeth_agent.standby._download_image', autospec=True) - @mock.patch('teeth_agent.standby._configdrive_location', autospec=True) def test_prepare_image(self, location_mock, download_mock, diff --git a/openstack-common.conf b/openstack-common.conf index 04fdb964a..fab48572f 100644 --- a/openstack-common.conf +++ b/openstack-common.conf @@ -4,4 +4,4 @@ modules=log # The base module to hold the copy of openstack.common -base=teeth_agent +base=ironic_python_agent diff --git a/setup.cfg b/setup.cfg index c0034a15c..22b441f64 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,8 +1,8 @@ [metadata] -name = teeth-agent +name = ironic-python-agent author = Rackspace author-email = teeth-dev@lists.rackspace.com -summary = Teeth Host Agent +summary = Ironic Python Agent Ramdisk license = Apache-2 classifier = Development Status :: 4 - Beta @@ -12,18 +12,18 @@ classifier = Programming Language :: Python [files] packages = - teeth_agent + ironic_python_agent [entry_points] console_scripts = - teeth-agent = teeth_agent.cmd.agent:run + ironic-python-agent = ironic_python_agent.cmd.agent:run -teeth_agent.modes = - standby = teeth_agent.standby:StandbyMode - decom = teeth_agent.decom:DecomMode +ironic_python_agent.modes = + standby = ironic_python_agent.standby:StandbyMode + decom = ironic_python_agent.decom:DecomMode -teeth_agent.hardware_managers = - generic = teeth_agent.hardware:GenericHardwareManager +ironic_python_agent.hardware_managers = + generic = ironic_python_agent.hardware:GenericHardwareManager [pbr] autodoc_index_modules = True diff --git a/tox.ini b/tox.ini index 7dfba0e4e..2802f1b50 100644 --- a/tox.ini +++ b/tox.ini @@ -17,12 +17,12 @@ downloadcache = ~/cache/pip [testenv:pep8] commands = - flake8 {posargs:teeth_agent} + flake8 {posargs:ironic_python_agent} [testenv:cover] setenv = VIRTUAL_ENV={envdir} commands = - python setup.py testr --coverage {posargs:teeth_agent} + python setup.py testr --coverage {posargs:ironic_python_agent} [testenv:venv] commands = {posargs:}