volume: Migrate 'block storage log level *' to SDK

Change-Id: Ic03f65fee197a85518df448c18a0fd2c11d51993
Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
This commit is contained in:
Stephen Finucane
2025-03-06 12:44:54 +00:00
parent 79de137152
commit 00f4cf9c17
2 changed files with 83 additions and 99 deletions

View File

@@ -10,9 +10,10 @@
# 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 ddt
from openstack.block_storage.v3 import service as _service
from openstack.test import fakes as sdk_fakes
from osc_lib import exceptions
from openstackclient.tests.unit import utils as tests_utils
@@ -20,24 +21,17 @@ from openstackclient.tests.unit.volume.v3 import fakes as volume_fakes
from openstackclient.volume.v3 import block_storage_log_level as service
class TestService(volume_fakes.TestVolume):
class TestBlockStorageLogLevelList(volume_fakes.TestVolume):
def setUp(self):
super().setUp()
# Get a shortcut to the ServiceManager Mock
self.service_mock = self.volume_client.services
self.service_mock.reset_mock()
self.log_level = sdk_fakes.generate_fake_resource(
_service.LogLevel, binary='cinder-scheduler'
)
self.volume_sdk_client.get_service_log_levels.return_value = [
self.log_level
]
class TestBlockStorageLogLevelList(TestService):
service_log = volume_fakes.create_service_log_level_entry()
def setUp(self):
super().setUp()
self.service_mock.get_log_levels.return_value = [self.service_log]
# Get the command object to test
self.cmd = service.BlockStorageLogLevelList(self.app, None)
def test_block_storage_log_level_list(self):
@@ -45,16 +39,16 @@ class TestBlockStorageLogLevelList(TestService):
arglist = [
'--host',
self.service_log.host,
self.log_level.host,
'--service',
self.service_log.binary,
self.log_level.binary,
'--log-prefix',
self.service_log.prefix,
'cinder.',
]
verifylist = [
('host', self.service_log.host),
('service', self.service_log.binary),
('log_prefix', self.service_log.prefix),
('host', self.log_level.host),
('service', self.log_level.binary),
('log_prefix', 'cinder.'),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -66,40 +60,35 @@ class TestBlockStorageLogLevelList(TestService):
'Prefix',
'Level',
]
# confirming if all expected columns are present in the result.
self.assertEqual(expected_columns, columns)
datalist = (
datalist = tuple(
(
self.service_log.binary,
self.service_log.host,
self.service_log.prefix,
self.service_log.level,
),
self.log_level.binary,
self.log_level.host,
prefix,
level,
)
for prefix, level in self.log_level.levels.values()
)
# confirming if all expected values are present in the result.
self.assertEqual(expected_columns, columns)
self.assertEqual(datalist, tuple(data))
# checking if proper call was made to get log level of services
self.service_mock.get_log_levels.assert_called_with(
server=self.service_log.host,
binary=self.service_log.binary,
prefix=self.service_log.prefix,
self.volume_sdk_client.get_service_log_levels.assert_called_with(
server=self.log_level.host,
binary=self.log_level.binary,
prefix='cinder.',
)
def test_block_storage_log_level_list_pre_332(self):
arglist = [
'--host',
self.service_log.host,
self.log_level.host,
'--service',
'cinder-api',
'--log-prefix',
'cinder_test.api.common',
]
verifylist = [
('host', self.service_log.host),
('host', self.log_level.host),
('service', 'cinder-api'),
('log_prefix', 'cinder_test.api.common'),
]
@@ -117,14 +106,14 @@ class TestBlockStorageLogLevelList(TestService):
arglist = [
'--host',
self.service_log.host,
self.log_level.host,
'--service',
'nova-api',
'--log-prefix',
'cinder_test.api.common',
]
verifylist = [
('host', self.service_log.host),
('host', self.log_level.host),
('service', 'nova-api'),
('log_prefix', 'cinder_test.api.common'),
]
@@ -139,13 +128,15 @@ class TestBlockStorageLogLevelList(TestService):
@ddt.ddt
class TestBlockStorageLogLevelSet(TestService):
service_log = volume_fakes.create_service_log_level_entry()
class TestBlockStorageLogLevelSet(volume_fakes.TestVolume):
def setUp(self):
super().setUp()
# Get the command object to test
self.log_level = sdk_fakes.generate_fake_resource(
_service.LogLevel, binary='cinder-api'
)
self.volume_sdk_client.set_service_log_levels.return_value = None
self.cmd = service.BlockStorageLogLevelSet(self.app, None)
def test_block_storage_log_level_set(self):
@@ -154,45 +145,45 @@ class TestBlockStorageLogLevelSet(TestService):
arglist = [
'ERROR',
'--host',
self.service_log.host,
self.log_level.host,
'--service',
self.service_log.binary,
self.log_level.binary,
'--log-prefix',
self.service_log.prefix,
'cinder.api.common',
]
verifylist = [
('level', 'ERROR'),
('host', self.service_log.host),
('service', self.service_log.binary),
('log_prefix', self.service_log.prefix),
('host', self.log_level.host),
('service', self.log_level.binary),
('log_prefix', 'cinder.api.common'),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args)
ret = self.cmd.take_action(parsed_args)
# checking if proper call was made to set log level of services
self.service_mock.set_log_levels.assert_called_with(
self.assertIsNone(ret)
self.volume_sdk_client.set_service_log_levels.assert_called_with(
level='ERROR',
server=self.service_log.host,
binary=self.service_log.binary,
prefix=self.service_log.prefix,
server=self.log_level.host,
binary=self.log_level.binary,
prefix='cinder.api.common',
)
def test_block_storage_log_level_set_pre_332(self):
arglist = [
'ERROR',
'--host',
self.service_log.host,
self.log_level.host,
'--service',
'cinder-api',
'--log-prefix',
'cinder_test.api.common',
'cinder.api.common',
]
verifylist = [
('level', 'ERROR'),
('host', self.service_log.host),
('host', self.log_level.host),
('service', 'cinder-api'),
('log_prefix', 'cinder_test.api.common'),
('log_prefix', 'cinder.api.common'),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -209,7 +200,7 @@ class TestBlockStorageLogLevelSet(TestService):
arglist = [
'ERROR',
'--host',
self.service_log.host,
self.log_level.host,
'--service',
'nova-api',
'--log-prefix',
@@ -217,7 +208,7 @@ class TestBlockStorageLogLevelSet(TestService):
]
verifylist = [
('level', 'ERROR'),
('host', self.service_log.host),
('host', self.log_level.host),
('service', 'nova-api'),
('log_prefix', 'cinder.api.common'),
]
@@ -237,7 +228,7 @@ class TestBlockStorageLogLevelSet(TestService):
arglist = [
log_level,
'--host',
self.service_log.host,
self.log_level.host,
'--service',
'cinder-api',
'--log-prefix',
@@ -245,7 +236,7 @@ class TestBlockStorageLogLevelSet(TestService):
]
verifylist = [
('level', log_level.upper()),
('host', self.service_log.host),
('host', self.log_level.host),
('service', 'cinder-api'),
('log_prefix', 'cinder.api.common'),
]
@@ -263,10 +254,9 @@ class TestBlockStorageLogLevelSet(TestService):
self.cmd.take_action(parsed_args)
# checking if proper call was made to set log level of services
self.service_mock.set_log_levels.assert_called_with(
self.volume_sdk_client.set_service_log_levels.assert_called_with(
level=log_level.upper(),
server=self.service_log.host,
binary=self.service_log.binary,
prefix=self.service_log.prefix,
server=self.log_level.host,
binary=self.log_level.binary,
prefix='cinder.api.common',
)

View File

@@ -14,10 +14,9 @@
"""Block Storage Service action implementations"""
from cinderclient import api_versions
from openstack import utils as sdk_utils
from osc_lib.command import command
from osc_lib import exceptions
from osc_lib import utils
from openstackclient.i18n import _
@@ -33,7 +32,7 @@ class BlockStorageLogLevelList(command.Lister):
parser.add_argument(
"--host",
metavar="<host>",
default="",
default=None,
help=_(
"List block storage service log level of specified host "
"(name only)"
@@ -42,9 +41,9 @@ class BlockStorageLogLevelList(command.Lister):
parser.add_argument(
"--service",
metavar="<service>",
default="",
default=None,
choices=(
'',
None,
'*',
'cinder-api',
'cinder-volume',
@@ -59,13 +58,13 @@ class BlockStorageLogLevelList(command.Lister):
parser.add_argument(
"--log-prefix",
metavar="<log-prefix>",
default="",
default=None,
help="Prefix for the log, e.g. 'sqlalchemy'",
)
return parser
def take_action(self, parsed_args):
service_client = self.app.client_manager.volume
volume_client = self.app.client_manager.sdk_connection.volume
columns = [
"Binary",
"Host",
@@ -73,29 +72,24 @@ class BlockStorageLogLevelList(command.Lister):
"Level",
]
if service_client.api_version < api_versions.APIVersion('3.32'):
if not sdk_utils.supports_microversion(volume_client, '3.32'):
msg = _(
"--os-volume-api-version 3.32 or greater is required to "
"support the 'block storage log level list' command"
)
raise exceptions.CommandError(msg)
data = service_client.services.get_log_levels(
data = []
for entry in volume_client.get_service_log_levels(
binary=parsed_args.service,
server=parsed_args.host,
prefix=parsed_args.log_prefix,
)
):
entry_levels = sorted(entry.levels.items(), key=lambda x: x[0])
for prefix, level in entry_levels:
data.append((entry.binary, entry.host, prefix, level))
return (
columns,
(
utils.get_item_properties(
s,
columns,
)
for s in data
),
)
return (columns, data)
class BlockStorageLogLevelSet(command.Command):
@@ -111,12 +105,12 @@ class BlockStorageLogLevelSet(command.Command):
metavar="<log-level>",
choices=('INFO', 'WARNING', 'ERROR', 'DEBUG'),
type=str.upper,
help=_("Desired log level."),
help=_("Desired log level"),
)
parser.add_argument(
"--host",
metavar="<host>",
default="",
default=None,
help=_(
"Set block storage service log level of specified host "
"(name only)"
@@ -125,9 +119,9 @@ class BlockStorageLogLevelSet(command.Command):
parser.add_argument(
"--service",
metavar="<service>",
default="",
default=None,
choices=(
'',
None,
'*',
'cinder-api',
'cinder-volume',
@@ -142,22 +136,22 @@ class BlockStorageLogLevelSet(command.Command):
parser.add_argument(
"--log-prefix",
metavar="<log-prefix>",
default="",
default=None,
help="Prefix for the log, e.g. 'sqlalchemy'",
)
return parser
def take_action(self, parsed_args):
service_client = self.app.client_manager.volume
volume_client = self.app.client_manager.sdk_connection.volume
if service_client.api_version < api_versions.APIVersion('3.32'):
if not sdk_utils.supports_microversion(volume_client, '3.32'):
msg = _(
"--os-volume-api-version 3.32 or greater is required to "
"support the 'block storage log level set' command"
)
raise exceptions.CommandError(msg)
service_client.services.set_log_levels(
volume_client.set_service_log_levels(
level=parsed_args.level,
binary=parsed_args.service,
server=parsed_args.host,