)]}'
{"doc/source/server.rst":[{"author":{"_account_id":8770,"name":"Ken Giusti","email":"kgiusti@gmail.com","username":"kgiusti"},"change_message_id":"6eebc4623febdcaa0785ced21a5cb08b3b79b7cd","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":".. autofunction:: get_rpc_server"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":".. autoclass:: RPCAccessPolicyBase"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":".. autoclass:: LegacyRPCAccessPolicy"},{"line_number":14,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"1ac06dbe_70c97dac","line":11,"updated":"2016-08-25 01:35:07.000000000","message":"RPCAccessPolicyBase is not exported by the library.  It should be, right?","commit_id":"68c835c457703979c4c220bd97cf742b47196e40"},{"author":{"_account_id":8770,"name":"Ken Giusti","email":"kgiusti@gmail.com","username":"kgiusti"},"change_message_id":"6eebc4623febdcaa0785ced21a5cb08b3b79b7cd","unresolved":false,"context_lines":[{"line_number":15,"context_line":".. autoclass:: DefaultRPCAccessPolicy"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":".. autoclass:: ExplicitRPCAccessPolicy"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":".. autoclass:: RPCDispatcher"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":".. autoclass:: MessageHandlingServer"}],"source_content_type":"text/x-rst","patch_set":9,"id":"1ac06dbe_7ce14fd0","line":18,"updated":"2016-08-25 01:35:07.000000000","message":"You should also include the expose() method in the docs:\n\n.. autofunction:: expose","commit_id":"68c835c457703979c4c220bd97cf742b47196e40"}],"oslo_messaging/rpc/__init__.py":[{"author":{"_account_id":8770,"name":"Ken Giusti","email":"kgiusti@gmail.com","username":"kgiusti"},"change_message_id":"6eebc4623febdcaa0785ced21a5cb08b3b79b7cd","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    \u0027ExpectedException\u0027,"},{"line_number":19,"context_line":"    \u0027NoSuchMethod\u0027,"},{"line_number":20,"context_line":"    \u0027RPCClient\u0027,"},{"line_number":21,"context_line":"    \u0027LegacyRPCAccessPolicy\u0027,"},{"line_number":22,"context_line":"    \u0027DefaultRPCAccessPolicy\u0027,"},{"line_number":23,"context_line":"    \u0027ExplicitRPCAccessPolicy\u0027,"},{"line_number":24,"context_line":"    \u0027RPCDispatcher\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"1ac06dbe_1cf81b7c","line":21,"updated":"2016-08-25 01:35:07.000000000","message":"Need to add RPCAccessPolicyBase so custom access policies can inherit it","commit_id":"68c835c457703979c4c220bd97cf742b47196e40"}],"oslo_messaging/rpc/dispatcher.py":[{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"714f675dd50dea883c0c0319fce566e5885643c6","unresolved":false,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":"                    if self.explicitly_expose_endpoint_methods and \\"},{"line_number":168,"context_line":"                            not hasattr(endpoint_method, \u0027exposed\u0027):"},{"line_number":169,"context_line":"                        raise NoSuchMethod(method)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"                return self._do_dispatch(endpoint, method, ctxt, args)"},{"line_number":172,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1ac06dbe_ebea6aab","line":169,"range":{"start_line":169,"start_character":0,"end_line":169,"end_character":24},"updated":"2016-08-22 10:19:15.000000000","message":"This logic doesn\u0027t seem to be correct. If you have 2 endpoints (say x and y), which both have some method f, x.f is not exposed, but y.f is exposed, then you will throw an exception while processing x without even checking y.","commit_id":"ad098313b7e586ba87968a99e11c8f7f16bbd5d5"},{"author":{"_account_id":19520,"name":"Kirill Bespalov","email":"kbespalov@mirantis.com","username":"k.bespalov"},"change_message_id":"603a59d4bc2309cf47959d7a00f027e50e7e010f","unresolved":false,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":"                    if self.explicitly_expose_endpoint_methods and \\"},{"line_number":168,"context_line":"                            not hasattr(endpoint_method, \u0027exposed\u0027):"},{"line_number":169,"context_line":"                        raise NoSuchMethod(method)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"                return self._do_dispatch(endpoint, method, ctxt, args)"},{"line_number":172,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1ac06dbe_72166aa8","line":169,"range":{"start_line":169,"start_character":0,"end_line":169,"end_character":24},"in_reply_to":"1ac06dbe_ebea6aab","updated":"2016-08-22 11:53:27.000000000","message":"+1, you can use instead:\n\nif self.explicitly_expose_endpoint_methods    \n   if hasattr(endpoint_method, \u0027exposed\u0027):\n       return self._do_dispatch(endpoint, method, ctxt, args)\n\nwhen `for endpoint in self.endpoints` is ends and no exposed methods will be found the NoSuchMethod will be raised.","commit_id":"ad098313b7e586ba87968a99e11c8f7f16bbd5d5"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"714f675dd50dea883c0c0319fce566e5885643c6","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        def foo(self):"},{"line_number":198,"context_line":"            pass"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        @rpc.expose()"},{"line_number":201,"context_line":"        def bar(self):"},{"line_number":202,"context_line":"            pass"},{"line_number":203,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1ac06dbe_cb820e52","line":200,"range":{"start_line":200,"start_character":19,"end_line":200,"end_character":21},"updated":"2016-08-22 10:19:15.000000000","message":"Simply @rpc.expose would be better.","commit_id":"ad098313b7e586ba87968a99e11c8f7f16bbd5d5"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"b32eae4fbb961215716600971f6d3b83950d5831","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"class DefaultRPCAccessPolicy(RPCAccessPolicyBase):"},{"line_number":102,"context_line":"    \"\"\"The default access policy is restrict rpc.call for"},{"line_number":103,"context_line":"        private methods"},{"line_number":104,"context_line":"        \"\"\""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def is_allowed(self, endpoint, method):"},{"line_number":107,"context_line":"        return not method.startswith(\u0027_\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ac06dbe_a0a7a7bb","line":104,"range":{"start_line":103,"start_character":8,"end_line":104,"end_character":9},"updated":"2016-08-23 10:17:22.000000000","message":"These indents are not necessary.","commit_id":"afb077f45f338bdbb40ec151677eabddfdf16aef"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"b32eae4fbb961215716600971f6d3b83950d5831","unresolved":false,"context_lines":[{"line_number":151,"context_line":"                                                    RPCAccessPolicyBase):"},{"line_number":152,"context_line":"            self.access_policy \u003d access_policy()"},{"line_number":153,"context_line":"        else:"},{"line_number":154,"context_line":"            self.access_policy \u003d LegacyRPCAccessPolicy()"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    @staticmethod"},{"line_number":157,"context_line":"    def _is_namespace(target, namespace):"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ac06dbe_c0bbc3e3","line":154,"range":{"start_line":154,"start_character":33,"end_line":154,"end_character":54},"updated":"2016-08-23 10:17:22.000000000","message":"It is mentioned in the documentation of the get_rpc_server that the default policy is DefaultRPCAccessPolicy. So there is some inconsistency here.","commit_id":"afb077f45f338bdbb40ec151677eabddfdf16aef"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"b32eae4fbb961215716600971f6d3b83950d5831","unresolved":false,"context_lines":[{"line_number":208,"context_line":"            raise UnsupportedVersion(version, method\u003dmethod)"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"class RPCDispatcherDoNotExposePrivateMethods(RPCDispatcher):"},{"line_number":212,"context_line":"    \"\"\"RPCDispatcher that does not expose private methods."},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"1ac06dbe_00567bcd","line":211,"range":{"start_line":211,"start_character":0,"end_line":211,"end_character":5},"updated":"2016-08-23 10:17:22.000000000","message":"We don\u0027t need these dispatchers anymore.","commit_id":"afb077f45f338bdbb40ec151677eabddfdf16aef"},{"author":{"_account_id":8770,"name":"Ken Giusti","email":"kgiusti@gmail.com","username":"kgiusti"},"change_message_id":"6eebc4623febdcaa0785ced21a5cb08b3b79b7cd","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    \u0027NoSuchMethod\u0027,"},{"line_number":21,"context_line":"    \u0027LegacyRPCAccessPolicy\u0027,"},{"line_number":22,"context_line":"    \u0027DefaultRPCAccessPolicy\u0027,"},{"line_number":23,"context_line":"    \u0027ExplicitRPCAccessPolicy\u0027,"},{"line_number":24,"context_line":"    \u0027RPCDispatcher\u0027,"},{"line_number":25,"context_line":"    \u0027RPCDispatcherError\u0027,"},{"line_number":26,"context_line":"    \u0027UnsupportedVersion\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"1ac06dbe_dc34c34b","line":23,"updated":"2016-08-25 01:35:07.000000000","message":"ditto add RPCAccessPolicyBase","commit_id":"68c835c457703979c4c220bd97cf742b47196e40"},{"author":{"_account_id":8770,"name":"Ken Giusti","email":"kgiusti@gmail.com","username":"kgiusti"},"change_message_id":"6eebc4623febdcaa0785ced21a5cb08b3b79b7cd","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"@six.add_metaclass(ABCMeta)"},{"line_number":83,"context_line":"class RPCAccessPolicyBase(object):"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    @abstractmethod"},{"line_number":86,"context_line":"    def is_allowed(self, endpoint, method):"},{"line_number":87,"context_line":"        \"\"\"Applies an access policy to the rpc method"}],"source_content_type":"text/x-python","patch_set":9,"id":"1ac06dbe_fc225f00","line":84,"updated":"2016-08-25 01:35:07.000000000","message":"Can you add some class level doc here?  Something like:\n\n\"\"\"Determines which endpoint methods may be invoked via RPC\"\"\"","commit_id":"68c835c457703979c4c220bd97cf742b47196e40"},{"author":{"_account_id":8770,"name":"Ken Giusti","email":"kgiusti@gmail.com","username":"kgiusti"},"change_message_id":"6eebc4623febdcaa0785ced21a5cb08b3b79b7cd","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        \"\"\"Applies an access policy to the rpc method"},{"line_number":88,"context_line":"        :param endpoint: the instance of a rpc endpoint"},{"line_number":89,"context_line":"        :param method: the method of the endpoint"},{"line_number":90,"context_line":"        :return: True or False"},{"line_number":91,"context_line":"        \"\"\""},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"1ac06dbe_bc8747d6","line":90,"updated":"2016-08-25 01:35:07.000000000","message":"be specific re: the return value:\n\n\"True if the method may be invoked via RPC, else False.","commit_id":"68c835c457703979c4c220bd97cf742b47196e40"},{"author":{"_account_id":8770,"name":"Ken Giusti","email":"kgiusti@gmail.com","username":"kgiusti"},"change_message_id":"6eebc4623febdcaa0785ced21a5cb08b3b79b7cd","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"class LegacyRPCAccessPolicy(RPCAccessPolicyBase):"},{"line_number":95,"context_line":"    \"\"\"The legacy access policy allows access to all methods\"\"\""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def is_allowed(self, endpoint, method):"},{"line_number":98,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":9,"id":"1ac06dbe_5ce573a6","line":95,"updated":"2016-08-25 01:35:07.000000000","message":"\"The legacy access policy allows RPC access to all callable endpoint methods including private methods (methods prefixed by \u0027_\u0027)\"","commit_id":"68c835c457703979c4c220bd97cf742b47196e40"},{"author":{"_account_id":8770,"name":"Ken Giusti","email":"kgiusti@gmail.com","username":"kgiusti"},"change_message_id":"6eebc4623febdcaa0785ced21a5cb08b3b79b7cd","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"class DefaultRPCAccessPolicy(RPCAccessPolicyBase):"},{"line_number":102,"context_line":"    \"\"\"The default access policy is restrict rpc.call for private methods"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    ..note::"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"1ac06dbe_bcbaa76c","line":102,"updated":"2016-08-25 01:35:07.000000000","message":"\u0027restrict\u0027 is a bit vague - maybe \u0027prevents RPC calls to private methods\u0027?","commit_id":"68c835c457703979c4c220bd97cf742b47196e40"},{"author":{"_account_id":8770,"name":"Ken Giusti","email":"kgiusti@gmail.com","username":"kgiusti"},"change_message_id":"6eebc4623febdcaa0785ced21a5cb08b3b79b7cd","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    Endpoints may have a target attribute describing the namespace and version"},{"line_number":136,"context_line":"    of the methods exposed by that object."},{"line_number":137,"context_line":"    The RPCDispatcher may have an access_policy attribute which determines"},{"line_number":138,"context_line":"    which of the endpoint methods are to be dispatched."},{"line_number":139,"context_line":"    The default access_policy dispatches all public methods"},{"line_number":140,"context_line":"    on an endpoint object."}],"source_content_type":"text/x-python","patch_set":9,"id":"1ac06dbe_dc3a03e7","line":137,"updated":"2016-08-25 01:35:07.000000000","message":"A nit, but add a blank line after line 136 - the access policy description is melded into the target/namespace/version text in the docs.","commit_id":"68c835c457703979c4c220bd97cf742b47196e40"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"fc51c96549fd237d4099414d4c7ef87523569fcd","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        self.endpoints \u003d endpoints"},{"line_number":159,"context_line":"        self.serializer \u003d serializer or msg_serializer.NoOpSerializer()"},{"line_number":160,"context_line":"        self._default_target \u003d msg_target.Target()"},{"line_number":161,"context_line":"        if access_policy is not None and issubclass(access_policy,"},{"line_number":162,"context_line":"                                                    RPCAccessPolicyBase):"},{"line_number":163,"context_line":"            self.access_policy \u003d access_policy()"},{"line_number":164,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ac06dbe_dbcde05e","line":161,"updated":"2016-08-25 05:30:44.000000000","message":"How about the following (which avoids silently overwrting a given value if its bad).\n\n    if access_policy is not None:\n       if issubclass(access_policy, RPCAccessPolicyBase):\n          self.access_policy \u003d access_policy()\n       else:\n          raise TypeError(...)\n    else:\n       self.access_policy \u003d LegacyRPCAccessPolicy()\n\nThat way someone providing a incorrect access_policy doesn\u0027t silently get it overwritten by the legacy one.","commit_id":"01da2927c993ff9ac16ca3fac5571e4ed0008038"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"867e06ca7e9822b0524ae11bb3b1cf3125f80e81","unresolved":false,"context_lines":[{"line_number":166,"context_line":"                                \u0027RPCAccessPolicyBase\u0027)"},{"line_number":167,"context_line":"        else:"},{"line_number":168,"context_line":"            # TODO(pvinci): Change to DefaultRPCAccessPolicy when setting to"},{"line_number":169,"context_line":"            # DefaultRCPAccessPolicy no longer breaks in tempest tests."},{"line_number":170,"context_line":"            self.access_policy \u003d LegacyRPCAccessPolicy()"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa7ab95a_d9ca056e","line":169,"updated":"2016-08-29 07:33:18.000000000","message":"It will be better to print a deprecation warning in this case.\nThis will force consumer application to choice a policy, now.\n\nAnd we could switch to the default one safely in a couple of release. And People that have been not updated their application could not complain.","commit_id":"32858eb5c3adbbb9e9b84e1f6b319f2eba507575"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"fcf027b700944e4928659faf3dc96ae2b0df069e","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                                \u0027RPCAccessPolicyBase\u0027)"},{"line_number":175,"context_line":"        else:"},{"line_number":176,"context_line":"            # TODO(pvinci): Change to DefaultRPCAccessPolicy when setting to"},{"line_number":177,"context_line":"            # DefaultRCPAccessPolicy no longer breaks in tempest tests."},{"line_number":178,"context_line":"            self.access_policy \u003d LegacyRPCAccessPolicy()"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa7ab95a_097cb4b3","line":177,"updated":"2016-08-30 14:13:31.000000000","message":"I still prefer deprecation warning instead of TODO.","commit_id":"51c3142a4562cca987aa8c236eb5c9eaaed94e63"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"9cad8eb994e815e47d1b80b146ba8c22b9246fd5","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                                \u0027RPCAccessPolicyBase\u0027)"},{"line_number":175,"context_line":"        else:"},{"line_number":176,"context_line":"            # TODO(pvinci): Change to DefaultRPCAccessPolicy when setting to"},{"line_number":177,"context_line":"            # DefaultRCPAccessPolicy no longer breaks in tempest tests."},{"line_number":178,"context_line":"            self.access_policy \u003d LegacyRPCAccessPolicy()"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa7ab95a_6c446b49","line":177,"in_reply_to":"fa7ab95a_097cb4b3","updated":"2016-08-30 14:48:44.000000000","message":"Sorry I have missed the line 151.","commit_id":"51c3142a4562cca987aa8c236eb5c9eaaed94e63"}],"oslo_messaging/rpc/server.py":[{"author":{"_account_id":19520,"name":"Kirill Bespalov","email":"kbespalov@mirantis.com","username":"k.bespalov"},"change_message_id":"603a59d4bc2309cf47959d7a00f027e50e7e010f","unresolved":false,"context_lines":[{"line_number":158,"context_line":""},{"line_number":159,"context_line":"def get_rpc_server(transport, target, endpoints,"},{"line_number":160,"context_line":"                   executor\u003d\u0027blocking\u0027, serializer\u003dNone,"},{"line_number":161,"context_line":"                   dispatcher_cls\u003dNone):"},{"line_number":162,"context_line":"    \"\"\"Construct an RPC server."},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    The executor parameter controls how incoming messages will be received and"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ac06dbe_a9deb50e","line":161,"range":{"start_line":161,"start_character":18,"end_line":161,"end_character":40},"updated":"2016-08-22 11:53:27.000000000","message":"It is allow to use a custom user\u0027s implementation of a dispatcher, not\nonly from oslo.messaging. We have a lot of discussions about this feature here:\n\n[1] https://review.openstack.org/#/c/314732/3\n[2] http://lists.openstack.org/pipermail/openstack-dev/2016-May/095302.html\n\nAnd as I understand, now there is no consensus about this point.\n\nBut instead of providing implementation of the dispatcher to restrict an access to the rpc methods we can encapsulate accessing logic into policies and use them in the dispatcher:\n\nhttp://paste.openstack.org/show/562190/","commit_id":"ad098313b7e586ba87968a99e11c8f7f16bbd5d5"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"714f675dd50dea883c0c0319fce566e5885643c6","unresolved":false,"context_lines":[{"line_number":220,"context_line":"    return outer"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"def expose():"},{"line_number":224,"context_line":"    \"\"\"Decorator for RPC endpoint methods that are exposed to the RPC client."},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    To maintain backward compatibility, the endpoint requires a property named"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ac06dbe_6b479a4b","line":223,"range":{"start_line":223,"start_character":10,"end_line":223,"end_character":13},"updated":"2016-08-22 10:19:15.000000000","message":"Why do we need an extra nesting level here? Right now we have to use expose()(f) in order to decorate a function f, although expose(f) would be simpler and clearer. So I think that the internal decorate function is redundant.","commit_id":"ad098313b7e586ba87968a99e11c8f7f16bbd5d5"},{"author":{"_account_id":19520,"name":"Kirill Bespalov","email":"kbespalov@mirantis.com","username":"k.bespalov"},"change_message_id":"95dcbad47d83e14ec6551beaaead1343229d532d","unresolved":false,"context_lines":[{"line_number":227,"context_line":"    `explicitly_expose_endpoint_methods` to be set to `True` for the dispatcher"},{"line_number":228,"context_line":"    to modify it\u0027s behavior based on this decorator."},{"line_number":229,"context_line":"    \"\"\""},{"line_number":230,"context_line":"    def decorate(func):"},{"line_number":231,"context_line":"        # flag the method as exposed"},{"line_number":232,"context_line":"        func.exposed \u003d True"},{"line_number":233,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1ac06dbe_8647754a","line":230,"range":{"start_line":230,"start_character":3,"end_line":230,"end_character":23},"updated":"2016-08-22 08:52:46.000000000","message":"Could you add the @functools.wraps to kept function name and docstrings?","commit_id":"ad098313b7e586ba87968a99e11c8f7f16bbd5d5"},{"author":{"_account_id":8770,"name":"Ken Giusti","email":"kgiusti@gmail.com","username":"kgiusti"},"change_message_id":"6eebc4623febdcaa0785ced21a5cb08b3b79b7cd","unresolved":false,"context_lines":[{"line_number":220,"context_line":"    If the dispatcher\u0027s access_policy is set to ExplicitRPCAccessPolicy then"},{"line_number":221,"context_line":"    endpoint methods need to be explicitly exposed.::"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"        def foo(self):"},{"line_number":224,"context_line":"            pass"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"        @rpc.expose"}],"source_content_type":"text/x-python","patch_set":9,"id":"1ac06dbe_bc162753","line":223,"updated":"2016-08-25 01:35:07.000000000","message":"Can you add a comment highlighting that foo cannot be accessed via RPC but bar can?  Like maybe:\n\n+        # foo() cannot be invoked by an RPC client\n         def foo(self):\n             pass\n \n+        # bar() can be invoked by an RPC client\n         @rpc.expose\n         def bar(self):","commit_id":"68c835c457703979c4c220bd97cf742b47196e40"}],"oslo_messaging/tests/rpc/test_dispatcher.py":[{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"3bf479cc221468045c5b2ff051a58885352908ef","unresolved":false,"context_lines":[{"line_number":74,"context_line":"              access_policy\u003doslo_messaging.DefaultRPCAccessPolicy,"},{"line_number":75,"context_line":"              dispatch_to\u003ddict(endpoint\u003d0, method\u003d\u0027foo\u0027),"},{"line_number":76,"context_line":"              ctxt\u003d{}, msg\u003ddict(method\u003d\u0027foo\u0027, version\u003d\u00271.0\u0027),"},{"line_number":77,"context_line":"              exposed_methods\u003d[\u0027foo\u0027, \u0027bar\u0027, \u0027_foobar\u0027],"},{"line_number":78,"context_line":"              success\u003dTrue, ex\u003dNone)),"},{"line_number":79,"context_line":"        (\u0027default_target_no_such_method\u0027,"},{"line_number":80,"context_line":"         dict(endpoints\u003d[{}],"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ac06dbe_087b30f6","line":77,"range":{"start_line":77,"start_character":46,"end_line":77,"end_character":53},"updated":"2016-08-23 14:23:35.000000000","message":"_foobar mustn\u0027t be in a list of exposed_methods when access_policy is DefaultRPCAccessPolicy. Please remove it here and from the other tests with DefaultRPCAccessPolicy.","commit_id":"d1345b5d0e68a2c40418be1264964b5020f3b7c2"}],"oslo_messaging/tests/rpc/test_server.py":[{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"b32eae4fbb961215716600971f6d3b83950d5831","unresolved":false,"context_lines":[{"line_number":238,"context_line":"        target \u003d oslo_messaging.Target(server\u003d\u0027testserver\u0027)"},{"line_number":239,"context_line":"        self.assertRaises(TypeError, oslo_messaging.get_rpc_server,"},{"line_number":240,"context_line":"                          transport, target, [],"},{"line_number":241,"context_line":"                          dispatcher_cls\u003dobject)"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"    def test_unknown_executor(self):"},{"line_number":244,"context_line":"        transport \u003d oslo_messaging.get_transport(self.conf, url\u003d\u0027fake:\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ac06dbe_802d4baa","line":241,"range":{"start_line":241,"start_character":26,"end_line":241,"end_character":40},"updated":"2016-08-23 10:17:22.000000000","message":"We don\u0027t have this argument anymore in the get_rpc_server. Please recheck your tests. This test passes because it throws a TypeError due to an unexpected keyword argument, not due to invalid dispatcher_cls (which is not used now).","commit_id":"afb077f45f338bdbb40ec151677eabddfdf16aef"}]}
