Use openstack.config for config and Session objects
The TimingSession functionality has been merged into keystoneauth. This allows us to use the CloudRegion object to get the Session directly. Change-Id: Ib4c9210e681a2d2d9c5fc40de2c3ede1a5003154
This commit is contained in:
parent
bcf08b9c06
commit
ee79f6166e
|
@ -31,7 +31,7 @@ Jinja2==2.10
|
||||||
jmespath==0.9.0
|
jmespath==0.9.0
|
||||||
jsonpatch==1.16
|
jsonpatch==1.16
|
||||||
jsonpointer==1.13
|
jsonpointer==1.13
|
||||||
keystoneauth1==3.4.0
|
keystoneauth1==3.7.0
|
||||||
kombu==4.0.0
|
kombu==4.0.0
|
||||||
linecache2==1.0.0
|
linecache2==1.0.0
|
||||||
MarkupSafe==1.0
|
MarkupSafe==1.0
|
||||||
|
@ -44,8 +44,7 @@ munch==2.1.0
|
||||||
netaddr==0.7.18
|
netaddr==0.7.18
|
||||||
netifaces==0.10.4
|
netifaces==0.10.4
|
||||||
openstackdocstheme==1.18.1
|
openstackdocstheme==1.18.1
|
||||||
openstacksdk==0.11.2
|
openstacksdk==0.13.0
|
||||||
os-client-config==1.28.0
|
|
||||||
os-service-types==1.2.0
|
os-service-types==1.2.0
|
||||||
os-testr==1.0.0
|
os-testr==1.0.0
|
||||||
oslo.concurrency==3.25.0
|
oslo.concurrency==3.25.0
|
||||||
|
|
|
@ -15,15 +15,8 @@
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
try:
|
from openstack.config import exceptions as sdk_exceptions
|
||||||
from openstack.config import exceptions as occ_exceptions
|
from openstack.config import loader as config
|
||||||
except ImportError:
|
|
||||||
from os_client_config import exceptions as occ_exceptions
|
|
||||||
|
|
||||||
try:
|
|
||||||
from openstack.config import loader as config
|
|
||||||
except ImportError:
|
|
||||||
from os_client_config import config
|
|
||||||
|
|
||||||
from oslo_utils import strutils
|
from oslo_utils import strutils
|
||||||
import six
|
import six
|
||||||
|
@ -220,7 +213,7 @@ class OSC_Config(config.OpenStackConfig):
|
||||||
prompt_options.append(p_opt)
|
prompt_options.append(p_opt)
|
||||||
|
|
||||||
if msgs:
|
if msgs:
|
||||||
raise occ_exceptions.OpenStackConfigException('\n'.join(msgs))
|
raise sdk_exceptions.OpenStackConfigException('\n'.join(msgs))
|
||||||
else:
|
else:
|
||||||
for p_opt in prompt_options:
|
for p_opt in prompt_options:
|
||||||
config['auth'][p_opt.dest] = self._pw_callback(p_opt.prompt)
|
config['auth'][p_opt.dest] = self._pw_callback(p_opt.prompt)
|
||||||
|
|
|
@ -19,22 +19,14 @@ import copy
|
||||||
import logging
|
import logging
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
from openstack.config import loader as config # noqa
|
||||||
from openstack import connection
|
from openstack import connection
|
||||||
from oslo_utils import strutils
|
from oslo_utils import strutils
|
||||||
import six
|
import six
|
||||||
|
|
||||||
from osc_lib.api import auth
|
from osc_lib.api import auth
|
||||||
from osc_lib import exceptions
|
from osc_lib import exceptions
|
||||||
from osc_lib import session as osc_session
|
|
||||||
from osc_lib import version
|
|
||||||
|
|
||||||
# NOTE(dtroyer): Attempt an import to detect if the SDK installed is new
|
|
||||||
# enough to not use Profile. If so, use that.
|
|
||||||
try:
|
|
||||||
from openstack.config import loader as config # noqa
|
|
||||||
profile = None
|
|
||||||
except ImportError:
|
|
||||||
from openstack import profile
|
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -209,22 +201,9 @@ class ClientManager(object):
|
||||||
self._cli_options.remote_project_domain_name
|
self._cli_options.remote_project_domain_name
|
||||||
)
|
)
|
||||||
|
|
||||||
self.session = osc_session.TimingSession(
|
self.session = self._cli_options.get_session()
|
||||||
auth=self.auth,
|
|
||||||
verify=self.verify,
|
|
||||||
cert=self.cert,
|
|
||||||
app_name=self._app_name,
|
|
||||||
app_version=self._app_version,
|
|
||||||
additional_user_agent=[('osc-lib', version.version_string)],
|
|
||||||
)
|
|
||||||
|
|
||||||
# Create a common default SDK Connection object if it is the newer
|
self.sdk_connection = connection.Connection(config=self._cli_options)
|
||||||
# non-Profile style.
|
|
||||||
if profile is None:
|
|
||||||
self.sdk_connection = connection.Connection(
|
|
||||||
config=self._cli_options,
|
|
||||||
session=self.session,
|
|
||||||
)
|
|
||||||
|
|
||||||
self._auth_setup_completed = True
|
self._auth_setup_completed = True
|
||||||
|
|
||||||
|
|
|
@ -27,13 +27,10 @@ class Timing(command.Lister):
|
||||||
|
|
||||||
results = []
|
results = []
|
||||||
total = 0.0
|
total = 0.0
|
||||||
for url, td in self.app.timing_data:
|
for td in self.app.timing_data:
|
||||||
# NOTE(dtroyer): Take the long way here because total_seconds()
|
sec = td.elapsed.total_seconds()
|
||||||
# was added in py27.
|
|
||||||
sec = (td.microseconds + (td.seconds + td.days *
|
|
||||||
86400) * 1e6) / 1e6
|
|
||||||
total += sec
|
total += sec
|
||||||
results.append((url, sec))
|
results.append((td.method + ' ' + td.url, sec))
|
||||||
results.append(('Total', total))
|
results.append(('Total', total))
|
||||||
return (
|
return (
|
||||||
column_headers,
|
column_headers,
|
||||||
|
|
|
@ -1,50 +0,0 @@
|
||||||
# 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.
|
|
||||||
#
|
|
||||||
|
|
||||||
"""Subclass of keystoneauth1.session"""
|
|
||||||
|
|
||||||
from keystoneauth1 import session
|
|
||||||
|
|
||||||
|
|
||||||
class TimingSession(session.Session):
|
|
||||||
"""A Session that supports collection of timing data per Method URL"""
|
|
||||||
|
|
||||||
def __init__(
|
|
||||||
self,
|
|
||||||
**kwargs
|
|
||||||
):
|
|
||||||
"""Pass through all arguments except timing"""
|
|
||||||
super(TimingSession, self).__init__(**kwargs)
|
|
||||||
|
|
||||||
# times is a list of tuples: ("method url", elapsed_time)
|
|
||||||
self.times = []
|
|
||||||
|
|
||||||
def get_timings(self):
|
|
||||||
return self.times
|
|
||||||
|
|
||||||
def reset_timings(self):
|
|
||||||
self.times = []
|
|
||||||
|
|
||||||
def request(self, url, method, **kwargs):
|
|
||||||
"""Wrap the usual request() method with the timers"""
|
|
||||||
resp = super(TimingSession, self).request(url, method, **kwargs)
|
|
||||||
for h in resp.history:
|
|
||||||
self.times.append((
|
|
||||||
"%s %s" % (h.request.method, h.request.url),
|
|
||||||
h.elapsed,
|
|
||||||
))
|
|
||||||
self.times.append((
|
|
||||||
"%s %s" % (resp.request.method, resp.request.url),
|
|
||||||
resp.elapsed,
|
|
||||||
))
|
|
||||||
return resp
|
|
|
@ -38,6 +38,7 @@ from osc_lib import exceptions as exc
|
||||||
from osc_lib.i18n import _
|
from osc_lib.i18n import _
|
||||||
from osc_lib import logs
|
from osc_lib import logs
|
||||||
from osc_lib import utils
|
from osc_lib import utils
|
||||||
|
from osc_lib import version
|
||||||
|
|
||||||
osprofiler_profiler = importutils.try_import("osprofiler.profiler")
|
osprofiler_profiler = importutils.try_import("osprofiler.profiler")
|
||||||
|
|
||||||
|
@ -336,7 +337,7 @@ class OpenStackShell(app.App):
|
||||||
* super()
|
* super()
|
||||||
* _final_defaults()
|
* _final_defaults()
|
||||||
* OpenStackConfig
|
* OpenStackConfig
|
||||||
* get_one_cloud
|
* get_one
|
||||||
* _load_plugins()
|
* _load_plugins()
|
||||||
* _load_commands()
|
* _load_commands()
|
||||||
* ClientManager
|
* ClientManager
|
||||||
|
@ -423,7 +424,7 @@ class OpenStackShell(app.App):
|
||||||
|
|
||||||
# NOTE(dtroyer): Need to do this with validate=False to defer the
|
# NOTE(dtroyer): Need to do this with validate=False to defer the
|
||||||
# auth plugin handling to ClientManager.setup_auth()
|
# auth plugin handling to ClientManager.setup_auth()
|
||||||
self.cloud = self.cloud_config.get_one_cloud(
|
self.cloud = self.cloud_config.get_one(
|
||||||
cloud=self.options.cloud,
|
cloud=self.options.cloud,
|
||||||
argparse=self.options,
|
argparse=self.options,
|
||||||
validate=False,
|
validate=False,
|
||||||
|
@ -462,7 +463,7 @@ class OpenStackShell(app.App):
|
||||||
)
|
)
|
||||||
|
|
||||||
# NOTE(dtroyer): If auth is not required for a command, skip
|
# NOTE(dtroyer): If auth is not required for a command, skip
|
||||||
# get_one_Cloud()'s validation to avoid loading plugins
|
# get_one()'s validation to avoid loading plugins
|
||||||
validate = cmd.auth_required
|
validate = cmd.auth_required
|
||||||
|
|
||||||
# NOTE(dtroyer): Save the auth required state of the _current_ command
|
# NOTE(dtroyer): Save the auth required state of the _current_ command
|
||||||
|
@ -470,10 +471,13 @@ class OpenStackShell(app.App):
|
||||||
self.client_manager._auth_required = cmd.auth_required
|
self.client_manager._auth_required = cmd.auth_required
|
||||||
|
|
||||||
# Validate auth options
|
# Validate auth options
|
||||||
self.cloud = self.cloud_config.get_one_cloud(
|
self.cloud = self.cloud_config.get_one(
|
||||||
cloud=self.options.cloud,
|
cloud=self.options.cloud,
|
||||||
argparse=self.options,
|
argparse=self.options,
|
||||||
validate=validate,
|
validate=validate,
|
||||||
|
app_name=self.client_manager._app_name,
|
||||||
|
app_version=self.client_manager._app_version,
|
||||||
|
additional_user_agent=[('osc-lib', version.version_string)],
|
||||||
)
|
)
|
||||||
# Push the updated args into ClientManager
|
# Push the updated args into ClientManager
|
||||||
self.client_manager._cli_options = self.cloud
|
self.client_manager._cli_options = self.cloud
|
||||||
|
|
|
@ -15,12 +15,15 @@
|
||||||
|
|
||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
|
from keystoneauth1 import session
|
||||||
|
|
||||||
from osc_lib.command import timing
|
from osc_lib.command import timing
|
||||||
from osc_lib.tests import fakes
|
from osc_lib.tests import fakes
|
||||||
from osc_lib.tests import utils
|
from osc_lib.tests import utils
|
||||||
|
|
||||||
|
|
||||||
timing_url = 'GET http://localhost:5000'
|
timing_method = 'GET'
|
||||||
|
timing_url = 'http://localhost:5000'
|
||||||
timing_elapsed = 0.872809
|
timing_elapsed = 0.872809
|
||||||
|
|
||||||
|
|
||||||
|
@ -73,9 +76,10 @@ class TestTiming(utils.TestCommand):
|
||||||
self.assertEqual(datalist, data)
|
self.assertEqual(datalist, data)
|
||||||
|
|
||||||
def test_timing_list(self):
|
def test_timing_list(self):
|
||||||
self.app.timing_data = [(
|
self.app.timing_data = [session.RequestTiming(
|
||||||
timing_url,
|
method=timing_method,
|
||||||
datetime.timedelta(microseconds=timing_elapsed * 1000000),
|
url=timing_url,
|
||||||
|
elapsed=datetime.timedelta(microseconds=timing_elapsed * 1000000),
|
||||||
)]
|
)]
|
||||||
|
|
||||||
arglist = []
|
arglist = []
|
||||||
|
@ -88,7 +92,7 @@ class TestTiming(utils.TestCommand):
|
||||||
columns, data = self.cmd.take_action(parsed_args)
|
columns, data = self.cmd.take_action(parsed_args)
|
||||||
self.assertEqual(self.columns, columns)
|
self.assertEqual(self.columns, columns)
|
||||||
datalist = [
|
datalist = [
|
||||||
(timing_url, timing_elapsed),
|
(timing_method + ' ' + timing_url, timing_elapsed),
|
||||||
('Total', timing_elapsed),
|
('Total', timing_elapsed),
|
||||||
]
|
]
|
||||||
self.assertEqual(datalist, data)
|
self.assertEqual(datalist, data)
|
||||||
|
|
|
@ -24,14 +24,8 @@ from keystoneauth1 import loading
|
||||||
from keystoneauth1 import noauth
|
from keystoneauth1 import noauth
|
||||||
from keystoneauth1 import token_endpoint
|
from keystoneauth1 import token_endpoint
|
||||||
|
|
||||||
try:
|
from openstack.config import cloud_config
|
||||||
from openstack.config import cloud_config
|
from openstack.config import defaults
|
||||||
from openstack.config import defaults
|
|
||||||
_occ_in_sdk = True
|
|
||||||
except ImportError:
|
|
||||||
from os_client_config import cloud_config
|
|
||||||
from os_client_config import defaults
|
|
||||||
_occ_in_sdk = False
|
|
||||||
from openstack import connection
|
from openstack import connection
|
||||||
|
|
||||||
from osc_lib.api import auth
|
from osc_lib.api import auth
|
||||||
|
@ -423,10 +417,7 @@ class TestClientManagerSDK(utils.TestClientManager):
|
||||||
auth_required=True,
|
auth_required=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
if _occ_in_sdk:
|
|
||||||
self.assertIsInstance(
|
self.assertIsInstance(
|
||||||
client_manager.sdk_connection,
|
client_manager.sdk_connection,
|
||||||
connection.Connection,
|
connection.Connection,
|
||||||
)
|
)
|
||||||
else:
|
|
||||||
self.assertIsNone(getattr(client_manager, 'sdk_connection', None))
|
|
||||||
|
|
|
@ -22,16 +22,7 @@ import testtools
|
||||||
from osc_lib import shell
|
from osc_lib import shell
|
||||||
from osc_lib.tests import utils
|
from osc_lib.tests import utils
|
||||||
|
|
||||||
# NOTE(dtroyer): Attempt the import to detect if the SDK installed is new
|
from openstack.config import loader as config # noqa
|
||||||
# enough to contain the os_client_config code. If so, use
|
|
||||||
# that path for mocks.
|
|
||||||
CONFIG_MOCK_BASE = "openstack.config.loader"
|
|
||||||
try:
|
|
||||||
from openstack.config import loader as config # noqa
|
|
||||||
except ImportError:
|
|
||||||
# Fall back to os-client-config
|
|
||||||
CONFIG_MOCK_BASE = "os_client_config.config"
|
|
||||||
|
|
||||||
|
|
||||||
DEFAULT_AUTH_URL = "http://127.0.0.1:5000/v2.0/"
|
DEFAULT_AUTH_URL = "http://127.0.0.1:5000/v2.0/"
|
||||||
DEFAULT_PROJECT_ID = "xxxx-yyyy-zzzz"
|
DEFAULT_PROJECT_ID = "xxxx-yyyy-zzzz"
|
||||||
|
@ -197,12 +188,12 @@ class TestShellOptions(utils.TestShell):
|
||||||
def test_empty_auth(self):
|
def test_empty_auth(self):
|
||||||
os.environ = {}
|
os.environ = {}
|
||||||
self._assert_initialize_app_arg("", {})
|
self._assert_initialize_app_arg("", {})
|
||||||
self._assert_cloud_config_arg("", {})
|
self._assert_cloud_region_arg("", {})
|
||||||
|
|
||||||
def test_no_options(self):
|
def test_no_options(self):
|
||||||
os.environ = {}
|
os.environ = {}
|
||||||
self._assert_initialize_app_arg("", {})
|
self._assert_initialize_app_arg("", {})
|
||||||
self._assert_cloud_config_arg("", {})
|
self._assert_cloud_region_arg("", {})
|
||||||
|
|
||||||
def test_global_options(self):
|
def test_global_options(self):
|
||||||
self._test_options_init_app(global_options)
|
self._test_options_init_app(global_options)
|
||||||
|
@ -322,7 +313,7 @@ class TestShellCli(utils.TestShell):
|
||||||
self.assertEqual('mickey', _shell.options.key)
|
self.assertEqual('mickey', _shell.options.key)
|
||||||
self.assertEqual(('mycert', 'mickey'), _shell.client_manager.cert)
|
self.assertEqual(('mycert', 'mickey'), _shell.client_manager.cert)
|
||||||
|
|
||||||
@mock.patch(CONFIG_MOCK_BASE + ".OpenStackConfig._load_config_file")
|
@mock.patch("openstack.config.loader.OpenStackConfig._load_config_file")
|
||||||
def test_shell_args_cloud_no_vendor(self, config_mock):
|
def test_shell_args_cloud_no_vendor(self, config_mock):
|
||||||
"""Test cloud config options without the vendor file"""
|
"""Test cloud config options without the vendor file"""
|
||||||
config_mock.return_value = ('file.yaml', copy.deepcopy(CLOUD_1))
|
config_mock.return_value = ('file.yaml', copy.deepcopy(CLOUD_1))
|
||||||
|
@ -371,8 +362,8 @@ class TestShellCli(utils.TestShell):
|
||||||
self.assertIsNone(_shell.cloud.config['key'])
|
self.assertIsNone(_shell.cloud.config['key'])
|
||||||
self.assertIsNone(_shell.client_manager.cert)
|
self.assertIsNone(_shell.client_manager.cert)
|
||||||
|
|
||||||
@mock.patch(CONFIG_MOCK_BASE + ".OpenStackConfig._load_vendor_file")
|
@mock.patch("openstack.config.loader.OpenStackConfig._load_vendor_file")
|
||||||
@mock.patch(CONFIG_MOCK_BASE + ".OpenStackConfig._load_config_file")
|
@mock.patch("openstack.config.loader.OpenStackConfig._load_config_file")
|
||||||
def test_shell_args_cloud_public(self, config_mock, public_mock):
|
def test_shell_args_cloud_public(self, config_mock, public_mock):
|
||||||
"""Test cloud config options with the vendor file"""
|
"""Test cloud config options with the vendor file"""
|
||||||
config_mock.return_value = ('file.yaml', copy.deepcopy(CLOUD_2))
|
config_mock.return_value = ('file.yaml', copy.deepcopy(CLOUD_2))
|
||||||
|
@ -420,8 +411,8 @@ class TestShellCli(utils.TestShell):
|
||||||
self.assertEqual('mickey', _shell.cloud.config['key'])
|
self.assertEqual('mickey', _shell.cloud.config['key'])
|
||||||
self.assertEqual(('mycert', 'mickey'), _shell.client_manager.cert)
|
self.assertEqual(('mycert', 'mickey'), _shell.client_manager.cert)
|
||||||
|
|
||||||
@mock.patch(CONFIG_MOCK_BASE + ".OpenStackConfig._load_vendor_file")
|
@mock.patch("openstack.config.loader.OpenStackConfig._load_vendor_file")
|
||||||
@mock.patch(CONFIG_MOCK_BASE + ".OpenStackConfig._load_config_file")
|
@mock.patch("openstack.config.loader.OpenStackConfig._load_config_file")
|
||||||
def test_shell_args_precedence(self, config_mock, vendor_mock):
|
def test_shell_args_precedence(self, config_mock, vendor_mock):
|
||||||
config_mock.return_value = ('file.yaml', copy.deepcopy(CLOUD_2))
|
config_mock.return_value = ('file.yaml', copy.deepcopy(CLOUD_2))
|
||||||
vendor_mock.return_value = ('file.yaml', copy.deepcopy(PUBLIC_1))
|
vendor_mock.return_value = ('file.yaml', copy.deepcopy(PUBLIC_1))
|
||||||
|
@ -477,8 +468,8 @@ class TestShellCliPrecedence(utils.TestShell):
|
||||||
}
|
}
|
||||||
self.useFixture(utils.EnvFixture(env.copy()))
|
self.useFixture(utils.EnvFixture(env.copy()))
|
||||||
|
|
||||||
@mock.patch(CONFIG_MOCK_BASE + ".OpenStackConfig._load_vendor_file")
|
@mock.patch("openstack.config.loader.OpenStackConfig._load_vendor_file")
|
||||||
@mock.patch(CONFIG_MOCK_BASE + ".OpenStackConfig._load_config_file")
|
@mock.patch("openstack.config.loader.OpenStackConfig._load_config_file")
|
||||||
def test_shell_args_precedence_1(self, config_mock, vendor_mock):
|
def test_shell_args_precedence_1(self, config_mock, vendor_mock):
|
||||||
"""Test environment overriding occ"""
|
"""Test environment overriding occ"""
|
||||||
config_mock.return_value = ('file.yaml', copy.deepcopy(CLOUD_2))
|
config_mock.return_value = ('file.yaml', copy.deepcopy(CLOUD_2))
|
||||||
|
@ -525,8 +516,8 @@ class TestShellCliPrecedence(utils.TestShell):
|
||||||
_shell.client_manager.region_name,
|
_shell.client_manager.region_name,
|
||||||
)
|
)
|
||||||
|
|
||||||
@mock.patch(CONFIG_MOCK_BASE + ".OpenStackConfig._load_vendor_file")
|
@mock.patch("openstack.config.loader.OpenStackConfig._load_vendor_file")
|
||||||
@mock.patch(CONFIG_MOCK_BASE + ".OpenStackConfig._load_config_file")
|
@mock.patch("openstack.config.loader.OpenStackConfig._load_config_file")
|
||||||
def test_shell_args_precedence_2(self, config_mock, vendor_mock):
|
def test_shell_args_precedence_2(self, config_mock, vendor_mock):
|
||||||
"""Test command line overriding environment and occ"""
|
"""Test command line overriding environment and occ"""
|
||||||
config_mock.return_value = ('file.yaml', copy.deepcopy(CLOUD_2))
|
config_mock.return_value = ('file.yaml', copy.deepcopy(CLOUD_2))
|
||||||
|
@ -573,8 +564,8 @@ class TestShellCliPrecedence(utils.TestShell):
|
||||||
_shell.client_manager.region_name,
|
_shell.client_manager.region_name,
|
||||||
)
|
)
|
||||||
|
|
||||||
@mock.patch(CONFIG_MOCK_BASE + ".OpenStackConfig._load_vendor_file")
|
@mock.patch("openstack.config.loader.OpenStackConfig._load_vendor_file")
|
||||||
@mock.patch(CONFIG_MOCK_BASE + ".OpenStackConfig._load_config_file")
|
@mock.patch("openstack.config.loader.OpenStackConfig._load_config_file")
|
||||||
def test_shell_args_precedence_3(self, config_mock, vendor_mock):
|
def test_shell_args_precedence_3(self, config_mock, vendor_mock):
|
||||||
"""Test command line overriding environment and occ"""
|
"""Test command line overriding environment and occ"""
|
||||||
config_mock.return_value = ('file.yaml', copy.deepcopy(CLOUD_1))
|
config_mock.return_value = ('file.yaml', copy.deepcopy(CLOUD_1))
|
||||||
|
|
|
@ -24,12 +24,8 @@ from cliff import columns as cliff_columns
|
||||||
import fixtures
|
import fixtures
|
||||||
from keystoneauth1 import loading
|
from keystoneauth1 import loading
|
||||||
|
|
||||||
try:
|
from openstack.config import cloud_region
|
||||||
from openstack.config import cloud_config
|
from openstack.config import defaults
|
||||||
from openstack.config import defaults
|
|
||||||
except ImportError:
|
|
||||||
from os_client_config import cloud_config
|
|
||||||
from os_client_config import defaults
|
|
||||||
|
|
||||||
from oslo_utils import importutils
|
from oslo_utils import importutils
|
||||||
from requests_mock.contrib import fixture
|
from requests_mock.contrib import fixture
|
||||||
|
@ -40,16 +36,6 @@ from osc_lib import clientmanager
|
||||||
from osc_lib import shell
|
from osc_lib import shell
|
||||||
from osc_lib.tests import fakes
|
from osc_lib.tests import fakes
|
||||||
|
|
||||||
# NOTE(dtroyer): Attempt the import to detect if the SDK installed is new
|
|
||||||
# enough to contain the os_client_config code. If so, use
|
|
||||||
# that path for mocks.
|
|
||||||
CONFIG_MOCK_BASE = "openstack.config.loader"
|
|
||||||
try:
|
|
||||||
from openstack.config import loader as config # noqa
|
|
||||||
except ImportError:
|
|
||||||
# Fall back to os-client-config
|
|
||||||
CONFIG_MOCK_BASE = "os_client_config.config"
|
|
||||||
|
|
||||||
|
|
||||||
def fake_execute(shell, cmd):
|
def fake_execute(shell, cmd):
|
||||||
"""Pretend to execute shell commands."""
|
"""Pretend to execute shell commands."""
|
||||||
|
@ -301,9 +287,9 @@ class TestClientManager(TestCase):
|
||||||
loader = loading.get_plugin_loader(auth_plugin_name)
|
loader = loading.get_plugin_loader(auth_plugin_name)
|
||||||
auth_plugin = loader.load_from_options(**auth_dict)
|
auth_plugin = loader.load_from_options(**auth_dict)
|
||||||
client_manager = self._clientmanager_class()(
|
client_manager = self._clientmanager_class()(
|
||||||
cli_options=cloud_config.CloudConfig(
|
cli_options=cloud_region.CloudRegion(
|
||||||
name='t1',
|
name='t1',
|
||||||
region='1',
|
region_name='1',
|
||||||
config=cli_options,
|
config=cli_options,
|
||||||
auth_plugin=auth_plugin,
|
auth_plugin=auth_plugin,
|
||||||
),
|
),
|
||||||
|
@ -361,10 +347,10 @@ class TestShell(TestCase):
|
||||||
"%s does not match" % k,
|
"%s does not match" % k,
|
||||||
)
|
)
|
||||||
|
|
||||||
def _assert_cloud_config_arg(self, cmd_options, default_args):
|
def _assert_cloud_region_arg(self, cmd_options, default_args):
|
||||||
"""Check the args passed to cloud_config.get_one_cloud()
|
"""Check the args passed to OpenStackConfig.get_one()
|
||||||
|
|
||||||
The argparse argument to get_one_cloud() is an argparse.Namespace
|
The argparse argument to get_one() is an argparse.Namespace
|
||||||
object that contains all of the options processed to this point in
|
object that contains all of the options processed to this point in
|
||||||
initialize_app().
|
initialize_app().
|
||||||
"""
|
"""
|
||||||
|
@ -373,7 +359,7 @@ class TestShell(TestCase):
|
||||||
cloud.config = {}
|
cloud.config = {}
|
||||||
self.occ_get_one = mock.Mock(return_value=cloud)
|
self.occ_get_one = mock.Mock(return_value=cloud)
|
||||||
with mock.patch(
|
with mock.patch(
|
||||||
CONFIG_MOCK_BASE + ".OpenStackConfig.get_one_cloud",
|
"openstack.config.loader.OpenStackConfig.get_one",
|
||||||
self.occ_get_one,
|
self.occ_get_one,
|
||||||
):
|
):
|
||||||
_shell = make_shell(shell_class=self.shell_class)
|
_shell = make_shell(shell_class=self.shell_class)
|
||||||
|
@ -432,7 +418,7 @@ class TestShell(TestCase):
|
||||||
kwargs = {
|
kwargs = {
|
||||||
key: test_opts[opt][0],
|
key: test_opts[opt][0],
|
||||||
}
|
}
|
||||||
self._assert_cloud_config_arg(cmd, kwargs)
|
self._assert_cloud_region_arg(cmd, kwargs)
|
||||||
|
|
||||||
def _test_env_get_one_cloud(self, test_opts):
|
def _test_env_get_one_cloud(self, test_opts):
|
||||||
"""Test environment options sent "to openstack.config"""
|
"""Test environment options sent "to openstack.config"""
|
||||||
|
@ -447,4 +433,4 @@ class TestShell(TestCase):
|
||||||
opt2env(opt): test_opts[opt][0],
|
opt2env(opt): test_opts[opt][0],
|
||||||
}
|
}
|
||||||
os.environ = env.copy()
|
os.environ = env.copy()
|
||||||
self._assert_cloud_config_arg("", kwargs)
|
self._assert_cloud_region_arg("", kwargs)
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
upgrade:
|
||||||
|
- |
|
||||||
|
The dependency on ``os-client-config`` has been removed in favor of
|
||||||
|
direct use of ``openstacksdk``.
|
|
@ -6,9 +6,8 @@ six>=1.10.0 # MIT
|
||||||
|
|
||||||
Babel!=2.4.0,>=2.3.4 # BSD
|
Babel!=2.4.0,>=2.3.4 # BSD
|
||||||
cliff!=2.9.0,>=2.8.0 # Apache-2.0
|
cliff!=2.9.0,>=2.8.0 # Apache-2.0
|
||||||
keystoneauth1>=3.4.0 # Apache-2.0
|
keystoneauth1>=3.7.0 # Apache-2.0
|
||||||
openstacksdk>=0.11.2 # Apache-2.0
|
openstacksdk>=0.13.0 # Apache-2.0
|
||||||
os-client-config>=1.28.0 # Apache-2.0
|
|
||||||
oslo.i18n>=3.15.3 # Apache-2.0
|
oslo.i18n>=3.15.3 # Apache-2.0
|
||||||
oslo.utils>=3.33.0 # Apache-2.0
|
oslo.utils>=3.33.0 # Apache-2.0
|
||||||
simplejson>=3.5.1 # MIT
|
simplejson>=3.5.1 # MIT
|
||||||
|
|
1
tox.ini
1
tox.ini
|
@ -22,7 +22,6 @@ basepython = python3
|
||||||
commands =
|
commands =
|
||||||
pip install -q -e "git+file://{toxinidir}/../cliff#egg=cliff"
|
pip install -q -e "git+file://{toxinidir}/../cliff#egg=cliff"
|
||||||
pip install -q -e "git+file://{toxinidir}/../keystoneauth#egg=keystoneauth"
|
pip install -q -e "git+file://{toxinidir}/../keystoneauth#egg=keystoneauth"
|
||||||
pip install -q -e "git+file://{toxinidir}/../os-client-config#egg=os_client_config"
|
|
||||||
pip install -q -e "git+file://{toxinidir}/../openstacksdk#egg=openstacksdk"
|
pip install -q -e "git+file://{toxinidir}/../openstacksdk#egg=openstacksdk"
|
||||||
pip freeze
|
pip freeze
|
||||||
ostestr {posargs}
|
ostestr {posargs}
|
||||||
|
|
Loading…
Reference in New Issue