)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"411e2b298578369f25ad3bbcdc5a5bae24a6b5cd","unresolved":false,"context_lines":[{"line_number":15,"context_line":"agents will send messages in the null namespace while post-upgrade"},{"line_number":16,"context_line":"agents will send messages in \u0027some_namespace\u0027, and both will be"},{"line_number":17,"context_line":"accepted. Upgrading agents before the server is supported by"},{"line_number":18,"context_line":"implementing fallbacks in the clients (This is an exercise"},{"line_number":19,"context_line":"left to the projects)."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Change-Id: I713fe9228111c36aa3f7fb95cbd59c99100e8c96"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"9a80dd14_e62f923c","line":18,"updated":"2015-03-12 14:45:11.000000000","message":"For me upgrading clients first is broken by design. Client stuffs should always talk one version of code and server must handle compatibility of previous version.\nThe whole messaging stuffs have been designed like that. \n\nI prefer don\u0027t have in the commit message something that let think we can upgrade clients first.","commit_id":"31540a2bb84a680446eca1a977662dc35638f592"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"b21f652c5632642232360823d3cf09680d34f29e","unresolved":false,"context_lines":[{"line_number":15,"context_line":"agents will send messages in the null namespace while post-upgrade"},{"line_number":16,"context_line":"agents will send messages in \u0027some_namespace\u0027, and both will be"},{"line_number":17,"context_line":"accepted. Upgrading agents before the server is supported by"},{"line_number":18,"context_line":"implementing fallbacks in the clients (This is an exercise"},{"line_number":19,"context_line":"left to the projects)."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Change-Id: I713fe9228111c36aa3f7fb95cbd59c99100e8c96"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"9a80dd14_7046eb50","line":18,"in_reply_to":"9a80dd14_e62f923c","updated":"2015-03-12 19:00:49.000000000","message":"I thought about this and talked to some smart people and I think you\u0027re right.","commit_id":"31540a2bb84a680446eca1a977662dc35638f592"}],"oslo_messaging/rpc/dispatcher.py":[{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"279e389b9f11404164406fd6f044afe48f342306","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    @staticmethod"},{"line_number":113,"context_line":"    def _is_namespace(target, namespace):"},{"line_number":114,"context_line":"        return any(target_namespace \u003d\u003d namespace for"},{"line_number":115,"context_line":"                   target_namespace in target.namespace)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_71d1acfa","line":114,"updated":"2015-03-12 08:19:44.000000000","message":"Sorry, I can\u0027t get what is done here. \u0027target_namespace\u0027 is not declared to check it.","commit_id":"c1827d26d045201838e1c34b034cec68218827ad"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"3758988a9e18ba1f2f879a9f19b059c1706f8394","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    @staticmethod"},{"line_number":113,"context_line":"    def _is_namespace(target, namespace):"},{"line_number":114,"context_line":"        return any(target_namespace \u003d\u003d namespace for"},{"line_number":115,"context_line":"                   target_namespace in target.namespace)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_390d4e38","line":114,"in_reply_to":"9a80dd14_71d1acfa","updated":"2015-03-12 13:21:27.000000000","message":"target_namespace is the loop iterator name define in line 115.","commit_id":"c1827d26d045201838e1c34b034cec68218827ad"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"aa15af9ecaba7e0be8b0b54eaded029e73be2a47","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    @staticmethod"},{"line_number":113,"context_line":"    def _is_namespace(target, namespace):"},{"line_number":114,"context_line":"        return any(server_namespace \u003d\u003d namespace for"},{"line_number":115,"context_line":"                   server_namespace in target.accepted_namespaces)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    @staticmethod"},{"line_number":118,"context_line":"    def _is_compatible(target, version):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a80dd14_9d1b85c9","line":115,"updated":"2015-03-12 16:18:44.000000000","message":"Can\u0027t we use just as follows?\n\n  namespace in target.accepted_namespaces","commit_id":"31540a2bb84a680446eca1a977662dc35638f592"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"b21f652c5632642232360823d3cf09680d34f29e","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    @staticmethod"},{"line_number":113,"context_line":"    def _is_namespace(target, namespace):"},{"line_number":114,"context_line":"        return any(server_namespace \u003d\u003d namespace for"},{"line_number":115,"context_line":"                   server_namespace in target.accepted_namespaces)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    @staticmethod"},{"line_number":118,"context_line":"    def _is_compatible(target, version):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a80dd14_f0449b1c","line":115,"in_reply_to":"9a80dd14_9d1b85c9","updated":"2015-03-12 19:00:49.000000000","message":"Yes we can LOL. *Smacks head*. That piece of code is deserving to be on those \u002710 worst pieces of code ever\u0027 lists.","commit_id":"31540a2bb84a680446eca1a977662dc35638f592"}],"oslo_messaging/target.py":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"3758988a9e18ba1f2f879a9f19b059c1706f8394","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    def __init__(self, exchange\u003dNone, topic\u003dNone, namespace\u003dNone,"},{"line_number":66,"context_line":"                 version\u003dNone, server\u003dNone, fanout\u003dNone):"},{"line_number":67,"context_line":"        self.exchange \u003d exchange"},{"line_number":68,"context_line":"        self.topic \u003d topic"},{"line_number":69,"context_line":"        self.namespace \u003d (namespace if isinstance(namespace, list)"},{"line_number":70,"context_line":"                          else [namespace])"},{"line_number":71,"context_line":"        self.version \u003d version"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_9e06201f","line":68,"updated":"2015-03-12 13:21:27.000000000","message":"This puts namespace in a list for messages over the wire as well, which rightfully fails all of the tests.","commit_id":"c1827d26d045201838e1c34b034cec68218827ad"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"aa15af9ecaba7e0be8b0b54eaded029e73be2a47","unresolved":false,"context_lines":[{"line_number":58,"context_line":"      just one of them."},{"line_number":59,"context_line":"    :type fanout: bool"},{"line_number":60,"context_line":"    :param additional_server_namespaces: A target may accept messages in zero"},{"line_number":61,"context_line":"      or more namespaces. A server always accepts messages specified via the"},{"line_number":62,"context_line":"      \u0027namespace\u0027 parameter, and any additional namespaces listed via"},{"line_number":63,"context_line":"      additional_server_namespaces. This should be used sparingly, namely"},{"line_number":64,"context_line":"      for rolling upgrade purposes."}],"source_content_type":"text/x-python","patch_set":2,"id":"9a80dd14_7dfc113f","line":61,"updated":"2015-03-12 16:18:44.000000000","message":"\"zero or more namespaces\" is a bit difficult to understand.\nHow about \"A target may also accept messages in namesapces specified in this parameter\"?","commit_id":"31540a2bb84a680446eca1a977662dc35638f592"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"b21f652c5632642232360823d3cf09680d34f29e","unresolved":false,"context_lines":[{"line_number":58,"context_line":"      just one of them."},{"line_number":59,"context_line":"    :type fanout: bool"},{"line_number":60,"context_line":"    :param additional_server_namespaces: A target may accept messages in zero"},{"line_number":61,"context_line":"      or more namespaces. A server always accepts messages specified via the"},{"line_number":62,"context_line":"      \u0027namespace\u0027 parameter, and any additional namespaces listed via"},{"line_number":63,"context_line":"      additional_server_namespaces. This should be used sparingly, namely"},{"line_number":64,"context_line":"      for rolling upgrade purposes."}],"source_content_type":"text/x-python","patch_set":2,"id":"9a80dd14_37c2a885","line":61,"in_reply_to":"9a80dd14_7dfc113f","updated":"2015-03-12 19:00:49.000000000","message":"Done","commit_id":"31540a2bb84a680446eca1a977662dc35638f592"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"aa15af9ecaba7e0be8b0b54eaded029e73be2a47","unresolved":false,"context_lines":[{"line_number":61,"context_line":"      or more namespaces. A server always accepts messages specified via the"},{"line_number":62,"context_line":"      \u0027namespace\u0027 parameter, and any additional namespaces listed via"},{"line_number":63,"context_line":"      additional_server_namespaces. This should be used sparingly, namely"},{"line_number":64,"context_line":"      for rolling upgrade purposes."},{"line_number":65,"context_line":"    :type additional_server_namespaces: list of strings"},{"line_number":66,"context_line":"    \"\"\""},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9a80dd14_1d3f95d7","line":64,"updated":"2015-03-12 16:18:44.000000000","message":"The main purpose of this parameter is \"to switch namespace\" without breakingg rolling upgrades. I think it is better to mention \"switching namespaces\" as it is more clear purpose.","commit_id":"31540a2bb84a680446eca1a977662dc35638f592"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"b21f652c5632642232360823d3cf09680d34f29e","unresolved":false,"context_lines":[{"line_number":61,"context_line":"      or more namespaces. A server always accepts messages specified via the"},{"line_number":62,"context_line":"      \u0027namespace\u0027 parameter, and any additional namespaces listed via"},{"line_number":63,"context_line":"      additional_server_namespaces. This should be used sparingly, namely"},{"line_number":64,"context_line":"      for rolling upgrade purposes."},{"line_number":65,"context_line":"    :type additional_server_namespaces: list of strings"},{"line_number":66,"context_line":"    \"\"\""},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9a80dd14_57171cee","line":64,"in_reply_to":"9a80dd14_1d3f95d7","updated":"2015-03-12 19:00:49.000000000","message":"Done","commit_id":"31540a2bb84a680446eca1a977662dc35638f592"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"aa15af9ecaba7e0be8b0b54eaded029e73be2a47","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        self.server \u003d server"},{"line_number":76,"context_line":"        self.fanout \u003d fanout"},{"line_number":77,"context_line":"        additional_server_namespaces \u003d additional_server_namespaces or []"},{"line_number":78,"context_line":"        self.accepted_namespaces \u003d [namespace] + additional_server_namespaces"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def __call__(self, **kwargs):"},{"line_number":81,"context_line":"        for a in (\u0027exchange\u0027, \u0027topic\u0027, \u0027namespace\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a80dd14_0021ee9e","line":78,"updated":"2015-03-12 16:18:44.000000000","message":"We can write this in on line:\n\n  self.accpeted_namespaces \u003d [namespace] + (additional_server_namespaces or [])","commit_id":"31540a2bb84a680446eca1a977662dc35638f592"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"b21f652c5632642232360823d3cf09680d34f29e","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        self.server \u003d server"},{"line_number":76,"context_line":"        self.fanout \u003d fanout"},{"line_number":77,"context_line":"        additional_server_namespaces \u003d additional_server_namespaces or []"},{"line_number":78,"context_line":"        self.accepted_namespaces \u003d [namespace] + additional_server_namespaces"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def __call__(self, **kwargs):"},{"line_number":81,"context_line":"        for a in (\u0027exchange\u0027, \u0027topic\u0027, \u0027namespace\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a80dd14_3059d35b","line":78,"in_reply_to":"9a80dd14_0021ee9e","updated":"2015-03-12 19:00:49.000000000","message":"Done","commit_id":"31540a2bb84a680446eca1a977662dc35638f592"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"36ae8e601299b773d8d082512d9fb6aceff6e320","unresolved":false,"context_lines":[{"line_number":61,"context_line":"      the \u0027namespace\u0027 parameter, and may also accept messages defined via"},{"line_number":62,"context_line":"      this parameter. This option should be used to switch namespaces safely"},{"line_number":63,"context_line":"      during rolling upgrades."},{"line_number":64,"context_line":"    :type legacy_namespaces: list of strings"},{"line_number":65,"context_line":"    \"\"\""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def __init__(self, exchange\u003dNone, topic\u003dNone, namespace\u003dNone,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_bd32f7a4","line":64,"updated":"2015-03-12 19:17:27.000000000","message":"just wondering, why not a set.","commit_id":"8db32a33fb7b7f22fb04f668ed0681f0feea2b05"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"9a79e6c5f89f284cb774ed24d38f1566761d9b28","unresolved":false,"context_lines":[{"line_number":61,"context_line":"      the \u0027namespace\u0027 parameter, and may also accept messages defined via"},{"line_number":62,"context_line":"      this parameter. This option should be used to switch namespaces safely"},{"line_number":63,"context_line":"      during rolling upgrades."},{"line_number":64,"context_line":"    :type legacy_namespaces: list of strings"},{"line_number":65,"context_line":"    \"\"\""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def __init__(self, exchange\u003dNone, topic\u003dNone, namespace\u003dNone,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_e08048c1","line":64,"in_reply_to":"9a80dd14_bd32f7a4","updated":"2015-03-12 19:43:54.000000000","message":"We\u0027re talking about a container of 2 or 3 items, it doesn\u0027t matter what container it is from a performance perspective. From an API perspective I don\u0027t think it matters much as well, but maybe a list is simpler in some aspects.","commit_id":"8db32a33fb7b7f22fb04f668ed0681f0feea2b05"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"efc67f72cf345be9998bdaea25082e862e057ab1","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        self.version \u003d version"},{"line_number":74,"context_line":"        self.server \u003d server"},{"line_number":75,"context_line":"        self.fanout \u003d fanout"},{"line_number":76,"context_line":"        self.accepted_namespaces \u003d [namespace] + (legacy_namespaces or [])"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def __call__(self, **kwargs):"},{"line_number":79,"context_line":"        for a in (\u0027exchange\u0027, \u0027topic\u0027, \u0027namespace\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_400af426","line":76,"updated":"2015-03-12 19:50:45.000000000","message":"I know that we define the type of the legacy_namespaces argument as a list of strings, but I think that code could be made a bit more liberal to allow other types of iterators (like tuples) by applying list() to the argument value. Thoughts?","commit_id":"8db32a33fb7b7f22fb04f668ed0681f0feea2b05"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"ff4521882df5a6c7061bf8b1f412722c5a3c7e4c","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        self.version \u003d version"},{"line_number":74,"context_line":"        self.server \u003d server"},{"line_number":75,"context_line":"        self.fanout \u003d fanout"},{"line_number":76,"context_line":"        self.accepted_namespaces \u003d [namespace] + (legacy_namespaces or [])"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def __call__(self, **kwargs):"},{"line_number":79,"context_line":"        for a in (\u0027exchange\u0027, \u0027topic\u0027, \u0027namespace\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_cba1a5f9","line":76,"in_reply_to":"9a80dd14_400af426","updated":"2015-03-12 19:54:36.000000000","message":"We can persist accepted_namespaces as a set/list and permit legacy_namespaces to be any iterable. Personally I prefer a strict and explicit API but that\u0027s *really* subjective.","commit_id":"8db32a33fb7b7f22fb04f668ed0681f0feea2b05"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"89c088f27897af493f9dfb156ae82c850ab91ce3","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        self.version \u003d version"},{"line_number":74,"context_line":"        self.server \u003d server"},{"line_number":75,"context_line":"        self.fanout \u003d fanout"},{"line_number":76,"context_line":"        self.accepted_namespaces \u003d [namespace] + (legacy_namespaces or [])"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def __call__(self, **kwargs):"},{"line_number":79,"context_line":"        for a in (\u0027exchange\u0027, \u0027topic\u0027, \u0027namespace\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_0b449d19","line":76,"in_reply_to":"9a80dd14_cba1a5f9","updated":"2015-03-12 20:03:07.000000000","message":"python does not seem to be compatible with strict APIs, at least when it comes to interables. My perspective is that the argument could be defined as an iterable, not as a list, and allow some flexibility.\n\nBut yeah, that\u0027s quite subjective, so no need for a change if you don\u0027t feel like it.","commit_id":"8db32a33fb7b7f22fb04f668ed0681f0feea2b05"}],"oslo_messaging/tests/rpc/test_dispatcher.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"89c088f27897af493f9dfb156ae82c850ab91ce3","unresolved":false,"context_lines":[{"line_number":97,"context_line":"              success\u003dTrue, ex\u003dNone)),"},{"line_number":98,"context_line":"        (\u0027message_in_wrong_namespace_with_multiple_namespaces\u0027,"},{"line_number":99,"context_line":"         dict(endpoints\u003d[dict(namespace\u003d\u0027testns\u0027,"},{"line_number":100,"context_line":"                              additional_server_namespaces\u003d[\u0027second\u0027, None])],"},{"line_number":101,"context_line":"              dispatch_to\u003dNone,"},{"line_number":102,"context_line":"              ctxt\u003d{}, msg\u003ddict(method\u003d\u0027foo\u0027, namespace\u003d\u0027wrong\u0027),"},{"line_number":103,"context_line":"              success\u003dFalse, ex\u003doslo_messaging.UnsupportedVersion)),"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_8b996d7b","line":100,"updated":"2015-03-12 20:03:07.000000000","message":"Should the argument name be changed here too?","commit_id":"8db32a33fb7b7f22fb04f668ed0681f0feea2b05"}]}
