summaryrefslogtreecommitdiff
path: root/openstackclient/tests/unit/common
diff options
authorThomas Goirand <zigo@debian.org>2026-02-27 19:32:22 +0100
committergit-ubuntu importer <ubuntu-devel-discuss@lists.ubuntu.com>2026-02-27 22:30:41 +0000
commiteea691be496ccaccbfa6c5317edd3529fb19f3e4 (patch)
tree0c5af2c99703c82796c0a06e129d867c64cc183f /openstackclient/tests/unit/common
parent28412f7dd30f762954b495eb1fe0db14900e0b22 (diff)
9.0.0-1 (patches unapplied)import/9.0.0-1debian/experimental
Imported using git-ubuntu import.
Notes
Notes: * New upstream release. * Fixed (build-)depends for this release. * Removed patches applied upstream: - Fix_openstack_quota_show_without_cinder.patch - add-missing-backup_id-field.patch
Diffstat (limited to 'openstackclient/tests/unit/common')
-rw-r--r--openstackclient/tests/unit/common/test_command.py2
-rw-r--r--openstackclient/tests/unit/common/test_extension.py5
-rw-r--r--openstackclient/tests/unit/common/test_logs.py221
-rw-r--r--openstackclient/tests/unit/common/test_module.py21
-rw-r--r--openstackclient/tests/unit/common/test_quota.py79
5 files changed, 96 insertions, 232 deletions
diff --git a/openstackclient/tests/unit/common/test_command.py b/openstackclient/tests/unit/common/test_command.py
index 8233f89..1f1efce 100644
--- a/openstackclient/tests/unit/common/test_command.py
+++ b/openstackclient/tests/unit/common/test_command.py
@@ -14,9 +14,9 @@
from unittest import mock
-from osc_lib.command import command
from osc_lib import exceptions
+from openstackclient import command
from openstackclient.tests.unit import fakes as test_fakes
from openstackclient.tests.unit import utils as test_utils
diff --git a/openstackclient/tests/unit/common/test_extension.py b/openstackclient/tests/unit/common/test_extension.py
index 53d9d65..dd68431 100644
--- a/openstackclient/tests/unit/common/test_extension.py
+++ b/openstackclient/tests/unit/common/test_extension.py
@@ -10,7 +10,6 @@
# License for the specific language governing permissions and limitations
# under the License.
-from unittest import mock
from openstackclient.common import extension
from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes
@@ -295,8 +294,8 @@ class TestExtensionShow(TestExtension):
self.cmd = extension.ShowExtension(self.app, None)
- self.app.client_manager.network.find_extension = mock.Mock(
- return_value=self.extension_details
+ self.app.client_manager.network.find_extension.return_value = (
+ self.extension_details
)
def test_show_no_options(self):
diff --git a/openstackclient/tests/unit/common/test_logs.py b/openstackclient/tests/unit/common/test_logs.py
deleted file mode 100644
index 234ba42..0000000
--- a/openstackclient/tests/unit/common/test_logs.py
+++ /dev/null
@@ -1,221 +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.
-#
-
-# NOTE(dtroyer): This file is deprecated in Jun 2016, remove after 4.x release
-# or Jun 2017.
-
-import logging
-from unittest import mock
-
-from osc_lib import logs
-
-from openstackclient.tests.unit import utils
-
-
-class TestContext(utils.TestCase):
- def test_log_level_from_options(self):
- opts = mock.Mock()
- opts.verbose_level = 0
- self.assertEqual(logging.ERROR, logs.log_level_from_options(opts))
- opts.verbose_level = 1
- self.assertEqual(logging.WARNING, logs.log_level_from_options(opts))
- opts.verbose_level = 2
- self.assertEqual(logging.INFO, logs.log_level_from_options(opts))
- opts.verbose_level = 3
- self.assertEqual(logging.DEBUG, logs.log_level_from_options(opts))
-
- def test_log_level_from_config(self):
- cfg = {'verbose_level': 0}
- self.assertEqual(logging.ERROR, logs.log_level_from_config(cfg))
- cfg = {'verbose_level': 1}
- self.assertEqual(logging.WARNING, logs.log_level_from_config(cfg))
- cfg = {'verbose_level': 2}
- self.assertEqual(logging.INFO, logs.log_level_from_config(cfg))
- cfg = {'verbose_level': 3}
- self.assertEqual(logging.DEBUG, logs.log_level_from_config(cfg))
- cfg = {'verbose_level': 1, 'log_level': 'critical'}
- self.assertEqual(logging.CRITICAL, logs.log_level_from_config(cfg))
- cfg = {'verbose_level': 1, 'log_level': 'error'}
- self.assertEqual(logging.ERROR, logs.log_level_from_config(cfg))
- cfg = {'verbose_level': 1, 'log_level': 'warning'}
- self.assertEqual(logging.WARNING, logs.log_level_from_config(cfg))
- cfg = {'verbose_level': 1, 'log_level': 'info'}
- self.assertEqual(logging.INFO, logs.log_level_from_config(cfg))
- cfg = {'verbose_level': 1, 'log_level': 'debug'}
- self.assertEqual(logging.DEBUG, logs.log_level_from_config(cfg))
- cfg = {'verbose_level': 1, 'log_level': 'bogus'}
- self.assertEqual(logging.WARNING, logs.log_level_from_config(cfg))
- cfg = {'verbose_level': 1, 'log_level': 'info', 'debug': True}
- self.assertEqual(logging.DEBUG, logs.log_level_from_config(cfg))
-
- @mock.patch('warnings.simplefilter')
- def test_set_warning_filter(self, simplefilter):
- logs.set_warning_filter(logging.ERROR)
- simplefilter.assert_called_with("ignore")
- logs.set_warning_filter(logging.WARNING)
- simplefilter.assert_called_with("ignore")
- logs.set_warning_filter(logging.INFO)
- simplefilter.assert_called_with("once")
-
-
-class TestFileFormatter(utils.TestCase):
- def test_nothing(self):
- formatter = logs._FileFormatter()
- self.assertEqual(
- (
- '%(asctime)s.%(msecs)03d %(process)d %(levelname)s '
- '%(name)s %(message)s'
- ),
- formatter.fmt,
- )
-
- def test_options(self):
- class Opts:
- cloud = 'cloudy'
- os_project_name = 'projecty'
- username = 'usernamey'
-
- options = Opts()
- formatter = logs._FileFormatter(options=options)
- self.assertEqual(
- (
- '%(asctime)s.%(msecs)03d %(process)d %(levelname)s '
- '%(name)s [cloudy usernamey projecty] %(message)s'
- ),
- formatter.fmt,
- )
-
- def test_config(self):
- config = mock.Mock()
- config.config = {'cloud': 'cloudy'}
- config.auth = {'project_name': 'projecty', 'username': 'usernamey'}
- formatter = logs._FileFormatter(config=config)
- self.assertEqual(
- (
- '%(asctime)s.%(msecs)03d %(process)d %(levelname)s '
- '%(name)s [cloudy usernamey projecty] %(message)s'
- ),
- formatter.fmt,
- )
-
-
-class TestLogConfigurator(utils.TestCase):
- def setUp(self):
- super().setUp()
- self.options = mock.Mock()
- self.options.verbose_level = 1
- self.options.log_file = None
- self.options.debug = False
- self.root_logger = mock.Mock()
- self.root_logger.setLevel = mock.Mock()
- self.root_logger.addHandler = mock.Mock()
- self.requests_log = mock.Mock()
- self.requests_log.setLevel = mock.Mock()
- self.cliff_log = mock.Mock()
- self.cliff_log.setLevel = mock.Mock()
- self.stevedore_log = mock.Mock()
- self.stevedore_log.setLevel = mock.Mock()
- self.iso8601_log = mock.Mock()
- self.iso8601_log.setLevel = mock.Mock()
- self.loggers = [
- self.root_logger,
- self.requests_log,
- self.cliff_log,
- self.stevedore_log,
- self.iso8601_log,
- ]
-
- @mock.patch('logging.StreamHandler')
- @mock.patch('logging.getLogger')
- @mock.patch('osc_lib.logs.set_warning_filter')
- def test_init(self, warning_filter, getLogger, handle):
- getLogger.side_effect = self.loggers
- console_logger = mock.Mock()
- console_logger.setFormatter = mock.Mock()
- console_logger.setLevel = mock.Mock()
- handle.return_value = console_logger
-
- configurator = logs.LogConfigurator(self.options)
-
- getLogger.assert_called_with('iso8601') # last call
- warning_filter.assert_called_with(logging.WARNING)
- self.root_logger.setLevel.assert_called_with(logging.DEBUG)
- self.root_logger.addHandler.assert_called_with(console_logger)
- self.requests_log.setLevel.assert_called_with(logging.ERROR)
- self.cliff_log.setLevel.assert_called_with(logging.ERROR)
- self.stevedore_log.setLevel.assert_called_with(logging.ERROR)
- self.iso8601_log.setLevel.assert_called_with(logging.ERROR)
- self.assertFalse(configurator.dump_trace)
-
- @mock.patch('logging.getLogger')
- @mock.patch('osc_lib.logs.set_warning_filter')
- def test_init_no_debug(self, warning_filter, getLogger):
- getLogger.side_effect = self.loggers
- self.options.debug = True
-
- configurator = logs.LogConfigurator(self.options)
-
- warning_filter.assert_called_with(logging.DEBUG)
- self.requests_log.setLevel.assert_called_with(logging.DEBUG)
- self.assertTrue(configurator.dump_trace)
-
- @mock.patch('logging.FileHandler')
- @mock.patch('logging.getLogger')
- @mock.patch('osc_lib.logs.set_warning_filter')
- @mock.patch('osc_lib.logs._FileFormatter')
- def test_init_log_file(self, formatter, warning_filter, getLogger, handle):
- getLogger.side_effect = self.loggers
- self.options.log_file = '/tmp/log_file'
- file_logger = mock.Mock()
- file_logger.setFormatter = mock.Mock()
- file_logger.setLevel = mock.Mock()
- handle.return_value = file_logger
- mock_formatter = mock.Mock()
- formatter.return_value = mock_formatter
-
- logs.LogConfigurator(self.options)
-
- handle.assert_called_with(filename=self.options.log_file)
- self.root_logger.addHandler.assert_called_with(file_logger)
- file_logger.setFormatter.assert_called_with(mock_formatter)
- file_logger.setLevel.assert_called_with(logging.WARNING)
-
- @mock.patch('logging.FileHandler')
- @mock.patch('logging.getLogger')
- @mock.patch('osc_lib.logs.set_warning_filter')
- @mock.patch('osc_lib.logs._FileFormatter')
- def test_configure(self, formatter, warning_filter, getLogger, handle):
- getLogger.side_effect = self.loggers
- configurator = logs.LogConfigurator(self.options)
- cloud_config = mock.Mock()
- config_log = '/tmp/config_log'
- cloud_config.config = {
- 'log_file': config_log,
- 'verbose_level': 1,
- 'log_level': 'info',
- }
- file_logger = mock.Mock()
- file_logger.setFormatter = mock.Mock()
- file_logger.setLevel = mock.Mock()
- handle.return_value = file_logger
- mock_formatter = mock.Mock()
- formatter.return_value = mock_formatter
-
- configurator.configure(cloud_config)
-
- warning_filter.assert_called_with(logging.INFO)
- handle.assert_called_with(filename=config_log)
- self.root_logger.addHandler.assert_called_with(file_logger)
- file_logger.setFormatter.assert_called_with(mock_formatter)
- file_logger.setLevel.assert_called_with(logging.INFO)
- self.assertFalse(configurator.dump_trace)
diff --git a/openstackclient/tests/unit/common/test_module.py b/openstackclient/tests/unit/common/test_module.py
index 476538a..8396203 100644
--- a/openstackclient/tests/unit/common/test_module.py
+++ b/openstackclient/tests/unit/common/test_module.py
@@ -11,7 +11,6 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
-#
"""Test module module"""
@@ -19,10 +18,18 @@ import sys
from unittest import mock
from openstackclient.common import module as osc_module
-from openstackclient.tests.unit import fakes
from openstackclient.tests.unit import utils
+class FakeModule:
+ def __init__(self, name, version):
+ self.name = name
+ self.__version__ = version
+ # Workaround for openstacksdk case
+ self.version = mock.Mock()
+ self.version.__version__ = version
+
+
# NOTE(dtroyer): module_1 must match the version list filter (not --all)
# currently == '*client*'
module_name_1 = 'fakeclient'
@@ -45,11 +52,11 @@ module_version_5 = '0.0.1'
MODULES = {
'sys': sys,
- module_name_1: fakes.FakeModule(module_name_1, module_version_1),
- module_name_2: fakes.FakeModule(module_name_2, module_version_2),
- module_name_3: fakes.FakeModule(module_name_3, module_version_3),
- module_name_4: fakes.FakeModule(module_name_4, module_version_4),
- module_name_5: fakes.FakeModule(module_name_5, module_version_5),
+ module_name_1: FakeModule(module_name_1, module_version_1),
+ module_name_2: FakeModule(module_name_2, module_version_2),
+ module_name_3: FakeModule(module_name_3, module_version_3),
+ module_name_4: FakeModule(module_name_4, module_version_4),
+ module_name_5: FakeModule(module_name_5, module_version_5),
}
diff --git a/openstackclient/tests/unit/common/test_quota.py b/openstackclient/tests/unit/common/test_quota.py
index 53df4da..7bfb2e7 100644
--- a/openstackclient/tests/unit/common/test_quota.py
+++ b/openstackclient/tests/unit/common/test_quota.py
@@ -10,6 +10,7 @@
# License for the specific language governing permissions and limitations
# under the License.
+import copy
from unittest import mock
from openstack.block_storage.v3 import quota_set as _volume_quota_set
@@ -1041,6 +1042,26 @@ class TestQuotaShow(TestQuota):
)
self.assertNotCalled(self.network_client.get_quota_default)
+ def test_quota_show__missing_services(self):
+ self.app.client_manager.compute_endpoint_enabled = False
+ self.app.client_manager.volume_endpoint_enabled = False
+ self.app.client_manager.network_endpoint_enabled = False
+
+ arglist = [
+ self.projects[0].name,
+ ]
+ verifylist = [
+ ('service', 'all'),
+ ('project', self.projects[0].name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ self.cmd.take_action(parsed_args)
+
+ self.compute_client.get_quota_set.assert_not_called()
+ self.volume_sdk_client.get_quota_set.assert_not_called()
+ self.network_client.get_quota.assert_not_called()
+
def test_quota_show__with_compute(self):
arglist = [
'--compute',
@@ -1102,6 +1123,64 @@ class TestQuotaShow(TestQuota):
)
self.assertNotCalled(self.network_client.get_quota_default)
+ def test_quota_show__with_network_and_usage(self):
+ # ensure we do not interfere with other tests
+ self._network_quota_details = copy.deepcopy(
+ self._network_quota_details
+ )
+ # set a couple of resources
+ self._network_quota_details["floating_ips"].update(
+ limit=30, reserved=20, used=7
+ )
+ self._network_quota_details["security_group_rules"].update(
+ limit=9, reserved=7, used=5
+ )
+
+ arglist = [
+ '--network',
+ '--usage',
+ self.projects[0].name,
+ ]
+ verifylist = [
+ ('service', 'network'),
+ ('project', self.projects[0].name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ headers, result_gen = self.cmd.take_action(parsed_args)
+
+ self.assertEqual(('Resource', 'Limit', 'In Use', 'Reserved'), headers)
+
+ result = sorted(result_gen)
+
+ self.assertEqual(
+ [
+ ('floating-ips', 30, 7, 20),
+ ('health_monitors', 0, 0, 0),
+ ('l7_policies', 0, 0, 0),
+ ('listeners', 0, 0, 0),
+ ('load_balancers', 0, 0, 0),
+ ('networks', 0, 0, 0),
+ ('pools', 0, 0, 0),
+ ('ports', 0, 0, 0),
+ ('rbac_policies', 0, 0, 0),
+ ('routers', 0, 0, 0),
+ ('secgroup-rules', 9, 5, 7),
+ ('secgroups', 0, 0, 0),
+ ('subnet_pools', 0, 0, 0),
+ ('subnets', 0, 0, 0),
+ ],
+ result,
+ )
+
+ self.compute_client.get_quota_set.assert_not_called()
+ self.volume_sdk_client.get_quota_set.assert_not_called()
+ self.network_client.get_quota.assert_called_once_with(
+ self.projects[0].id,
+ details=True,
+ )
+ self.assertNotCalled(self.network_client.get_quota_default)
+
def test_quota_show__with_default(self):
arglist = [
'--default',