Update neutron-debug to use stevedore aliases

Updating neutron-debug as it is importing interface driver classes
directly and not using the load_driver_interface method.
Also adds unit tests for the neutron-debug tool.

Change-Id: Icf095b2182225e63e85d849d83c2cb36b8a39217
Closes-Bug: #1504536
This commit is contained in:
Martin Hickey 2015-10-21 15:24:13 +01:00
parent 911fd53285
commit c4e0574da1
2 changed files with 142 additions and 1 deletions

View File

@ -19,6 +19,7 @@ from oslo_config import cfg
from oslo_utils import importutils
from neutron.agent.common import config
from neutron.agent.common import utils
from neutron.agent.linux import interface
from neutron.debug import debug_agent
from neutronclient.common import exceptions as exc
@ -75,7 +76,7 @@ class NeutronDebugShell(shell.NeutronShell):
config.register_use_namespaces_opts_helper(cfg.CONF)
cfg.CONF(['--config-file', self.options.config_file])
config.setup_logging()
driver = importutils.import_object(cfg.CONF.interface_driver, cfg.CONF)
driver = utils.load_interface_driver(cfg.CONF)
self.debug_agent = debug_agent.NeutronDebugAgent(cfg.CONF,
client,
driver)

View File

@ -0,0 +1,140 @@
# Copyright (c) 2015 IBM Corp.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import argparse
import logging
import sys
import fixtures
import mock
from neutronclient import shell as openstack_shell
import six
from testtools import matchers
from neutron.debug import shell as debug_shell
from neutron.tests import base
class ShellTest(base.BaseTestCase):
def shell(self, argstr, check=False):
with mock.patch.dict('os.environ', clear=True):
with mock.patch('sys.stdout', new=six.moves.StringIO()) as \
stdout_io:
with mock.patch('sys.stderr', new=six.moves.StringIO()) as \
stderr_io:
try:
_shell = debug_shell.NeutronDebugShell(
openstack_shell.NEUTRON_API_VERSION)
_shell.run(argstr.split())
except SystemExit:
exc_type, exc_value, exc_traceback = sys.exc_info()
self.assertEqual(0, exc_value.code)
return stdout_io.getvalue(), stderr_io.getvalue()
def test_run_unknown_command(self):
self.useFixture(fixtures.FakeLogger(level=logging.DEBUG))
stdout, stderr = self.shell('fake', check=True)
self.assertFalse(stdout)
def test_help(self):
help_text, stderr = self.shell('help')
self.assertFalse(stderr)
def test_bash_completion(self):
required = '.*os_user_domain_id.*'
bash_completion, stderr = self.shell('bash-completion')
self.assertThat(
bash_completion,
matchers.MatchesRegex(required))
self.assertFalse(stderr)
def test_help_on_subcommand(self):
stdout, stderr = self.shell('help probe-list')
self.assertFalse(stderr)
def test_help_command(self):
stdout, stderr = self.shell('help network-create')
self.assertFalse(stderr)
def test_bash_completion_command(self):
bash_completion, stderr = self.shell('neutron bash-completion')
self.assertFalse(stderr)
def test_unknown_auth_strategy(self):
self.useFixture(fixtures.FakeLogger(level=logging.DEBUG))
stdout, stderr = self.shell('--os-auth-strategy fake probe-list')
self.assertFalse(stdout)
def test_build_option_parser(self):
neutron_shell = debug_shell.NeutronDebugShell(
openstack_shell.NEUTRON_API_VERSION)
result = neutron_shell.build_option_parser('descr', '2.0')
self.assertTrue(isinstance(result, argparse.ArgumentParser))
def test_endpoint_option(self):
shell = debug_shell.NeutronDebugShell(
openstack_shell.NEUTRON_API_VERSION)
parser = shell.build_option_parser('descr', '2.0')
# Neither $OS_ENDPOINT_TYPE nor --os-endpoint-type
namespace = parser.parse_args([])
self.assertEqual('publicURL', namespace.os_endpoint_type)
# --endpoint-type but not $OS_ENDPOINT_TYPE
namespace = parser.parse_args(['--os-endpoint-type=admin'])
self.assertEqual('admin', namespace.os_endpoint_type)
def test_endpoint_environment_variable(self):
fixture = fixtures.EnvironmentVariable("OS_ENDPOINT_TYPE",
"public")
self.useFixture(fixture)
shell = debug_shell.NeutronDebugShell(
openstack_shell.NEUTRON_API_VERSION)
parser = shell.build_option_parser('descr', '2.0')
# $OS_ENDPOINT_TYPE but not --endpoint-type
namespace = parser.parse_args([])
self.assertEqual("public", namespace.os_endpoint_type)
# --endpoint-type and $OS_ENDPOINT_TYPE
namespace = parser.parse_args(['--endpoint-type=admin'])
self.assertEqual('admin', namespace.endpoint_type)
def test_timeout_option(self):
shell = debug_shell.NeutronDebugShell(
openstack_shell.NEUTRON_API_VERSION)
parser = shell.build_option_parser('descr', '2.0')
# Neither $OS_ENDPOINT_TYPE nor --endpoint-type
namespace = parser.parse_args([])
self.assertIsNone(namespace.http_timeout)
# --endpoint-type but not $OS_ENDPOINT_TYPE
namespace = parser.parse_args(['--http-timeout=50'])
self.assertEqual(50, namespace.http_timeout)
def test_timeout_environment_variable(self):
fixture = fixtures.EnvironmentVariable("OS_NETWORK_TIMEOUT",
"50")
self.useFixture(fixture)
shell = debug_shell.NeutronDebugShell(
openstack_shell.NEUTRON_API_VERSION)
parser = shell.build_option_parser('descr', '2.0')
namespace = parser.parse_args([])
self.assertEqual(50, namespace.http_timeout)