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

View File

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