From 915aab4dbba1a1399cbbfb90ac080f5d22a08a14 Mon Sep 17 00:00:00 2001 From: Sofia Enriquez Date: Tue, 1 Oct 2019 18:16:27 +0200 Subject: [PATCH] Fix service-get-log to respect server filters The service-get-log command returns always the same output ignoring the 'server' filters. This fix avoid returning all the results when using the 'server' filter. How to reproduce: 'cinder --os-volume-api-version 3.52 service-get-log --server localhost.localdomain@cep' return the same output than 'cinder --os-volume-api-version 3.52 service-get-log' Also includes squash to fix unit test from: Fix service_get_log tests Change-Id: I633e67efa4869816786011c3d093dc81e177010c Change-Id: Iecb3faad9270f969185089cc291127b340483a46 (cherry picked from commit e793c5e24982e2f0d2bc3a681f5a1e3912af08b0) (cherry picked from commit 0f6b4cdcd4fc0fd4e6fe0e40772ad7d19d46f83c) --- cinder/api/contrib/services.py | 13 +++++---- .../tests/unit/api/contrib/test_services.py | 29 +++++++++++++++++++ 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/cinder/api/contrib/services.py b/cinder/api/contrib/services.py index 02180ba4c72..65d8fbb3c51 100644 --- a/cinder/api/contrib/services.py +++ b/cinder/api/contrib/services.py @@ -202,11 +202,14 @@ class ServiceController(wsgi.Controller): log_req = objects.LogLevel(context, prefix=prefix) - if constants.API_BINARY in binaries: - levels = utils.get_log_levels(prefix) - result.append({'host': CONF.host, - 'binary': constants.API_BINARY, - 'levels': levels}) + # Avoid showing constants if 'server' is set. + server_filter = body.get('server') + if not server_filter or server_filter == CONF.host: + if constants.API_BINARY in binaries: + levels = utils.get_log_levels(prefix) + result.append({'host': CONF.host, + 'binary': constants.API_BINARY, + 'levels': levels}) for service in services: levels = self.rpc_apis[service.binary].get_log_levels(context, service, diff --git a/cinder/tests/unit/api/contrib/test_services.py b/cinder/tests/unit/api/contrib/test_services.py index a6e5135c533..b5a0544f2f6 100644 --- a/cinder/tests/unit/api/contrib/test_services.py +++ b/cinder/tests/unit/api/contrib/test_services.py @@ -825,6 +825,35 @@ class ServicesTest(test.TestCase): self.controller._get_log, req, self.context, body=body) + def test_get_log_w_server_filter_same_host(self): + server_filter = 'controller-0' + CONF.set_override('host', server_filter) + body = {'binary': constants.API_BINARY, 'server': server_filter} + req = FakeRequest(version=mv.LOG_LEVEL) + + log_levels = self.controller._get_log( + req=req, context=mock.sentinel.context, body=body) + log_levels = log_levels['log_levels'] + + self.assertEqual(1, len(log_levels)) + self.assertEqual('controller-0', log_levels[0]['host']) + self.assertEqual('cinder-api', log_levels[0]['binary']) + # since there are a lot of log levels, we just check if the key-value + # exists for levels + self.assertIsNotNone(log_levels[0]['levels']) + + def test_get_log_w_server_filter_different_host(self): + server_filter = 'controller-0' + CONF.set_override('host', 'controller-different-host') + body = {'binary': constants.API_BINARY, 'server': server_filter} + req = FakeRequest(version=mv.LOG_LEVEL) + + log_levels = self.controller._get_log( + req=req, context=mock.sentinel.context, body=body) + log_levels = log_levels['log_levels'] + + self.assertEqual(0, len(log_levels)) + @ddt.data(None, '', '*') @mock.patch('cinder.objects.ServiceList.get_all') def test__log_params_binaries_service_all(self, binary, service_list_mock):