From 8cbca30afd2c7f3aa713e08c3b4698facbdd06cf Mon Sep 17 00:00:00 2001
From: "ChangBo Guo(gcb)" <eric.guo@easystack.cn>
Date: Fri, 3 Feb 2017 19:04:05 +0800
Subject: [PATCH] Move decorator updated_kwarg_default_value to right place

debtcollector's decorator updated_kwarg_default_value is used to indicate
default value will be changed in future version. We introduced parameter
access_policy and add itfor constructor method of RPCDispatcher in
d3a8f280ebd6fd12865fd20c4d772774e39aefa2. Other services usually call
get_rpc_server method instead of calling constructor method of
RPCDispatcher. get_rpc_server method constructs RPCDispatcher instance
in [1], then FutureWarning will be generated even we set parameter
access_policy explicitly. Need move the decorator updated_kwarg_default_value
to method get_rec_server to avoid the case.

Closes-Bug: #1661572

[1] https://github.com/openstack/oslo.messaging/blob/f1efaf1b6ed360b280d48e0ab41d1dd73c1553ef/oslo_messaging/rpc/server.py#L200.

Change-Id: I3214045856d0bbd05a0000eeafb769e4697cd34c
---
 oslo_messaging/rpc/dispatcher.py        |  9 --------
 oslo_messaging/rpc/server.py            | 11 ++++++++++
 oslo_messaging/tests/rpc/test_server.py | 29 +++++++++++++++++++++----
 3 files changed, 36 insertions(+), 13 deletions(-)

diff --git a/oslo_messaging/rpc/dispatcher.py b/oslo_messaging/rpc/dispatcher.py
index 06c72a763..313298d3c 100644
--- a/oslo_messaging/rpc/dispatcher.py
+++ b/oslo_messaging/rpc/dispatcher.py
@@ -34,7 +34,6 @@ import sys
 
 import six
 
-from debtcollector.updating import updated_kwarg_default_value
 from oslo_messaging import _utils as utils
 from oslo_messaging import dispatcher
 from oslo_messaging import serializer as msg_serializer
@@ -145,14 +144,6 @@ class RPCDispatcher(dispatcher.DispatcherBase):
 
 
     """
-    @updated_kwarg_default_value('access_policy', None, DefaultRPCAccessPolicy,
-                                 message='access_policy defaults to '
-                                         'LegacyRPCAccessPolicy which '
-                                         'exposes private methods. Explicitly '
-                                         'set access_policy to '
-                                         'DefaultRPCAccessPolicy or '
-                                         'ExplicitRPCAccessPolicy.',
-                                 version='?')
     def __init__(self, endpoints, serializer, access_policy=None):
         """Construct a rpc server dispatcher.
 
diff --git a/oslo_messaging/rpc/server.py b/oslo_messaging/rpc/server.py
index 9623db907..cc2fc025f 100644
--- a/oslo_messaging/rpc/server.py
+++ b/oslo_messaging/rpc/server.py
@@ -127,6 +127,8 @@ __all__ = [
 import logging
 import sys
 
+from debtcollector.updating import updated_kwarg_default_value
+
 from oslo_messaging._i18n import _LE
 from oslo_messaging.rpc import dispatcher as rpc_dispatcher
 from oslo_messaging import server as msg_server
@@ -177,6 +179,15 @@ class RPCServer(msg_server.MessageHandlingServer):
                 del failure
 
 
+@updated_kwarg_default_value('access_policy', None,
+                             rpc_dispatcher.DefaultRPCAccessPolicy,
+                             message='access_policy defaults to '
+                                     'LegacyRPCAccessPolicy which '
+                                     'exposes private methods. Explicitly '
+                                     'set access_policy to '
+                                     'DefaultRPCAccessPolicy or '
+                                     'ExplicitRPCAccessPolicy.',
+                             version='?')
 def get_rpc_server(transport, target, endpoints,
                    executor='blocking', serializer=None, access_policy=None):
     """Construct an RPC server.
diff --git a/oslo_messaging/tests/rpc/test_server.py b/oslo_messaging/tests/rpc/test_server.py
index 4aa8b36ec..56b5bd1f5 100644
--- a/oslo_messaging/tests/rpc/test_server.py
+++ b/oslo_messaging/tests/rpc/test_server.py
@@ -13,15 +13,17 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-import eventlet
 import threading
+import warnings
 
+import eventlet
 from oslo_config import cfg
 from six.moves import mock
 import testscenarios
 
 import oslo_messaging
 from oslo_messaging import rpc
+from oslo_messaging.rpc import dispatcher
 from oslo_messaging.rpc import server as rpc_server_module
 from oslo_messaging import server as server_module
 from oslo_messaging.tests import utils as test_utils
@@ -114,10 +116,16 @@ class TestRPCServer(test_utils.BaseTestCase, ServerSetupMixin):
         target = oslo_messaging.Target(topic='foo', server='bar')
         endpoints = [object()]
         serializer = object()
+        access_policy = dispatcher.DefaultRPCAccessPolicy
 
-        server = oslo_messaging.get_rpc_server(transport, target, endpoints,
-                                               serializer=serializer)
-
+        with warnings.catch_warnings(record=True) as capture:
+            warnings.simplefilter("always", FutureWarning)
+            server = oslo_messaging.get_rpc_server(transport,
+                                                   target,
+                                                   endpoints,
+                                                   serializer=serializer,
+                                                   access_policy=access_policy)
+        self.assertEqual(0, len(capture))
         self.assertIs(server.conf, self.conf)
         self.assertIs(server.transport, transport)
         self.assertIsInstance(server.dispatcher, oslo_messaging.RPCDispatcher)
@@ -125,6 +133,19 @@ class TestRPCServer(test_utils.BaseTestCase, ServerSetupMixin):
         self.assertIs(server.dispatcher.serializer, serializer)
         self.assertEqual('blocking', server.executor_type)
 
+    def test_constructor_without_explicit_RPCAccessPolicy(self):
+        transport = oslo_messaging.get_transport(self.conf, url='fake:')
+        target = oslo_messaging.Target(topic='foo', server='bar')
+        endpoints = [object()]
+        serializer = object()
+        with warnings.catch_warnings(record=True) as capture:
+            warnings.simplefilter("always", FutureWarning)
+            oslo_messaging.get_rpc_server(transport, target,
+                                          endpoints, serializer=serializer)
+        self.assertEqual(1, len(capture))
+        w = capture[0]
+        self.assertEqual(FutureWarning, w.category)
+
     def test_server_wait_method(self):
         transport = oslo_messaging.get_transport(self.conf, url='fake:')
         target = oslo_messaging.Target(topic='foo', server='bar')