)]}'
{"dragonflow/controller/aging.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2a46f3be26299bd20e77da3274c40e8fafdd9d0a","unresolved":false,"context_lines":[{"line_number":23,"context_line":"LOG \u003d log.getLogger(\"dragonflow.controller.aging\")\r"},{"line_number":24,"context_line":"\r"},{"line_number":25,"context_line":"aging_cookie \u003d 0\r"},{"line_number":26,"context_line":"global_cookie \u003d 0\r"},{"line_number":27,"context_line":"\r"},{"line_number":28,"context_line":"\r"},{"line_number":29,"context_line":"def get_global_cookie():\r"}],"source_content_type":"text/x-python","patch_set":7,"id":"1af94dfe_58ded311","line":26,"updated":"2016-03-17 08:12:23.000000000","message":"Please avoid using non-constant globals where possible. Consider using a singleton class to hold them.\n\nI am not certain e.g. aging_cookie shouldn\u0027t be a member of Aging.","commit_id":"a469033404090b8b20ff65b3da3a5351708a5d08"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"71f09898978d5e06408376c3c86425940862ad49","unresolved":false,"context_lines":[{"line_number":23,"context_line":"LOG \u003d log.getLogger(\"dragonflow.controller.aging\")\r"},{"line_number":24,"context_line":"\r"},{"line_number":25,"context_line":"aging_cookie \u003d 0\r"},{"line_number":26,"context_line":"global_cookie \u003d 0\r"},{"line_number":27,"context_line":"\r"},{"line_number":28,"context_line":"\r"},{"line_number":29,"context_line":"def get_global_cookie():\r"}],"source_content_type":"text/x-python","patch_set":7,"id":"1af94dfe_8b100203","line":26,"in_reply_to":"1af94dfe_58ded311","updated":"2016-03-17 09:51:31.000000000","message":"I retract this comment.","commit_id":"a469033404090b8b20ff65b3da3a5351708a5d08"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"191c30d4d40c0bdd225ea022869ec49c1edb6a1f","unresolved":false,"context_lines":[{"line_number":23,"context_line":"LOG \u003d log.getLogger(\"dragonflow.controller.aging\")\r"},{"line_number":24,"context_line":"\r"},{"line_number":25,"context_line":"aging_cookie \u003d 0\r"},{"line_number":26,"context_line":"global_cookie \u003d 0\r"},{"line_number":27,"context_line":"\r"},{"line_number":28,"context_line":"\r"},{"line_number":29,"context_line":"def get_global_cookie():\r"}],"source_content_type":"text/x-python","patch_set":7,"id":"1af94dfe_44b356e9","line":26,"in_reply_to":"1af94dfe_8b100203","updated":"2016-03-18 06:27:26.000000000","message":"Done","commit_id":"a469033404090b8b20ff65b3da3a5351708a5d08"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2a46f3be26299bd20e77da3274c40e8fafdd9d0a","unresolved":false,"context_lines":[{"line_number":26,"context_line":"global_cookie \u003d 0\r"},{"line_number":27,"context_line":"\r"},{"line_number":28,"context_line":"\r"},{"line_number":29,"context_line":"def get_global_cookie():\r"},{"line_number":30,"context_line":"    return global_cookie\r"},{"line_number":31,"context_line":"\r"},{"line_number":32,"context_line":"\r"}],"source_content_type":"text/x-python","patch_set":7,"id":"1af94dfe_1878cb29","line":29,"updated":"2016-03-17 08:12:23.000000000","message":"I couldn\u0027t find where this method is used.","commit_id":"a469033404090b8b20ff65b3da3a5351708a5d08"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"191c30d4d40c0bdd225ea022869ec49c1edb6a1f","unresolved":false,"context_lines":[{"line_number":26,"context_line":"global_cookie \u003d 0\r"},{"line_number":27,"context_line":"\r"},{"line_number":28,"context_line":"\r"},{"line_number":29,"context_line":"def get_global_cookie():\r"},{"line_number":30,"context_line":"    return global_cookie\r"},{"line_number":31,"context_line":"\r"},{"line_number":32,"context_line":"\r"}],"source_content_type":"text/x-python","patch_set":7,"id":"1af94dfe_a864e4e4","line":29,"in_reply_to":"1af94dfe_1878cb29","updated":"2016-03-18 06:27:26.000000000","message":"it\u0027s not used yet. I\u0027ll remove it, add it when needed","commit_id":"a469033404090b8b20ff65b3da3a5351708a5d08"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2a46f3be26299bd20e77da3274c40e8fafdd9d0a","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    return global_cookie\r"},{"line_number":31,"context_line":"\r"},{"line_number":32,"context_line":"\r"},{"line_number":33,"context_line":"def flap_aging_cookie(cookie):\r"},{"line_number":34,"context_line":"    c \u003d cookie\r"},{"line_number":35,"context_line":"    c |\u003d (aging_cookie \u0026 const.GLOBAL_AGING_COOKIE_MASK)\r"},{"line_number":36,"context_line":"    return c\r"}],"source_content_type":"text/x-python","patch_set":7,"id":"1af94dfe_98833b04","line":33,"updated":"2016-03-17 08:12:23.000000000","message":"The name of this method is confusing. What does this method do?","commit_id":"a469033404090b8b20ff65b3da3a5351708a5d08"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"191c30d4d40c0bdd225ea022869ec49c1edb6a1f","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    return global_cookie\r"},{"line_number":31,"context_line":"\r"},{"line_number":32,"context_line":"\r"},{"line_number":33,"context_line":"def flap_aging_cookie(cookie):\r"},{"line_number":34,"context_line":"    c \u003d cookie\r"},{"line_number":35,"context_line":"    c |\u003d (aging_cookie \u0026 const.GLOBAL_AGING_COOKIE_MASK)\r"},{"line_number":36,"context_line":"    return c\r"}],"source_content_type":"text/x-python","patch_set":7,"id":"1af94dfe_a847c41b","line":33,"in_reply_to":"1af94dfe_98833b04","updated":"2016-03-18 06:27:26.000000000","message":"here I want to make a OR oper, you can see the usage in l3_proactive_app.py, the app need to OR the aging_cookie to its own cookie before flushing flows.","commit_id":"a469033404090b8b20ff65b3da3a5351708a5d08"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2a46f3be26299bd20e77da3274c40e8fafdd9d0a","unresolved":false,"context_lines":[{"line_number":32,"context_line":"\r"},{"line_number":33,"context_line":"def flap_aging_cookie(cookie):\r"},{"line_number":34,"context_line":"    c \u003d cookie\r"},{"line_number":35,"context_line":"    c |\u003d (aging_cookie \u0026 const.GLOBAL_AGING_COOKIE_MASK)\r"},{"line_number":36,"context_line":"    return c\r"},{"line_number":37,"context_line":"\r"},{"line_number":38,"context_line":"\r"}],"source_content_type":"text/x-python","patch_set":7,"id":"1af94dfe_c36e7895","line":35,"range":{"start_line":35,"start_character":6,"end_line":35,"end_character":7},"updated":"2016-03-17 08:12:23.000000000","message":"Is this meant to be OR or XOR? Do you want to set the bits in the aging mask to be exactly the bits in the aging cookie? Or to flip them?","commit_id":"a469033404090b8b20ff65b3da3a5351708a5d08"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"191c30d4d40c0bdd225ea022869ec49c1edb6a1f","unresolved":false,"context_lines":[{"line_number":32,"context_line":"\r"},{"line_number":33,"context_line":"def flap_aging_cookie(cookie):\r"},{"line_number":34,"context_line":"    c \u003d cookie\r"},{"line_number":35,"context_line":"    c |\u003d (aging_cookie \u0026 const.GLOBAL_AGING_COOKIE_MASK)\r"},{"line_number":36,"context_line":"    return c\r"},{"line_number":37,"context_line":"\r"},{"line_number":38,"context_line":"\r"}],"source_content_type":"text/x-python","patch_set":7,"id":"1af94dfe_28be14d4","line":35,"range":{"start_line":35,"start_character":6,"end_line":35,"end_character":7},"in_reply_to":"1af94dfe_c36e7895","updated":"2016-03-18 06:27:26.000000000","message":"not flip, just OR.\nall apps will follow the cookie usage, that is:\nthe global cookie should not overlapped with local cookie,\nthe global cookie should not overlapped with global cookie,\nthe local cookie could overlapped with local cookie.\n\nbut for safety, I\u0027ll clear the those aging_cookie\u0027s bits before OR it.","commit_id":"a469033404090b8b20ff65b3da3a5351708a5d08"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2a46f3be26299bd20e77da3274c40e8fafdd9d0a","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    return c\r"},{"line_number":37,"context_line":"\r"},{"line_number":38,"context_line":"\r"},{"line_number":39,"context_line":"def get_xor_aging_cookie(cookie):\r"},{"line_number":40,"context_line":"    return cookie ^ 0x1\r"},{"line_number":41,"context_line":"\r"},{"line_number":42,"context_line":"\r"}],"source_content_type":"text/x-python","patch_set":7,"id":"1af94dfe_986e9bff","line":39,"updated":"2016-03-17 08:12:23.000000000","message":"This function doesn\u0027t do what it says it does.\nShouldn\u0027t it xor with aging_cookie, or the aging cookie mask?","commit_id":"a469033404090b8b20ff65b3da3a5351708a5d08"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"191c30d4d40c0bdd225ea022869ec49c1edb6a1f","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    return c\r"},{"line_number":37,"context_line":"\r"},{"line_number":38,"context_line":"\r"},{"line_number":39,"context_line":"def get_xor_aging_cookie(cookie):\r"},{"line_number":40,"context_line":"    return cookie ^ 0x1\r"},{"line_number":41,"context_line":"\r"},{"line_number":42,"context_line":"\r"}],"source_content_type":"text/x-python","patch_set":7,"id":"1af94dfe_e89b8c70","line":39,"in_reply_to":"1af94dfe_986e9bff","updated":"2016-03-18 06:27:26.000000000","message":"I\u0027ll rename it to get_xor_cookie(), the original one is confusing.","commit_id":"a469033404090b8b20ff65b3da3a5351708a5d08"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2a46f3be26299bd20e77da3274c40e8fafdd9d0a","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    return cookie ^ 0x1\r"},{"line_number":41,"context_line":"\r"},{"line_number":42,"context_line":"\r"},{"line_number":43,"context_line":"class Aging(DFlowApp, OpenFlowSwitchMixin):\r"},{"line_number":44,"context_line":"\r"},{"line_number":45,"context_line":"    def __init__(self, *args, **kwargs):\r"},{"line_number":46,"context_line":"        DFlowApp.__init__(self, *args, **kwargs)\r"}],"source_content_type":"text/x-python","patch_set":7,"id":"1af94dfe_98ffbb66","line":43,"updated":"2016-03-17 08:12:23.000000000","message":"I couldn\u0027t find where this class was used.","commit_id":"a469033404090b8b20ff65b3da3a5351708a5d08"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2a46f3be26299bd20e77da3274c40e8fafdd9d0a","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    return cookie ^ 0x1\r"},{"line_number":41,"context_line":"\r"},{"line_number":42,"context_line":"\r"},{"line_number":43,"context_line":"class Aging(DFlowApp, OpenFlowSwitchMixin):\r"},{"line_number":44,"context_line":"\r"},{"line_number":45,"context_line":"    def __init__(self, *args, **kwargs):\r"},{"line_number":46,"context_line":"        DFlowApp.__init__(self, *args, **kwargs)\r"}],"source_content_type":"text/x-python","patch_set":7,"id":"1af94dfe_9e2163a2","line":43,"range":{"start_line":43,"start_character":22,"end_line":43,"end_character":42},"updated":"2016-03-17 08:12:23.000000000","message":"Why use a Mixin?","commit_id":"a469033404090b8b20ff65b3da3a5351708a5d08"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"191c30d4d40c0bdd225ea022869ec49c1edb6a1f","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    return cookie ^ 0x1\r"},{"line_number":41,"context_line":"\r"},{"line_number":42,"context_line":"\r"},{"line_number":43,"context_line":"class Aging(DFlowApp, OpenFlowSwitchMixin):\r"},{"line_number":44,"context_line":"\r"},{"line_number":45,"context_line":"    def __init__(self, *args, **kwargs):\r"},{"line_number":46,"context_line":"        DFlowApp.__init__(self, *args, **kwargs)\r"}],"source_content_type":"text/x-python","patch_set":7,"id":"1af94dfe_88b128e4","line":43,"in_reply_to":"1af94dfe_98ffbb66","updated":"2016-03-18 06:27:26.000000000","message":"OpenflowSwitchMixin provides synchronous Openflow access.\nmany functions are defined in it, such as get_canary_flow, cleanup_flows, etc.","commit_id":"a469033404090b8b20ff65b3da3a5351708a5d08"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"191c30d4d40c0bdd225ea022869ec49c1edb6a1f","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    return cookie ^ 0x1\r"},{"line_number":41,"context_line":"\r"},{"line_number":42,"context_line":"\r"},{"line_number":43,"context_line":"class Aging(DFlowApp, OpenFlowSwitchMixin):\r"},{"line_number":44,"context_line":"\r"},{"line_number":45,"context_line":"    def __init__(self, *args, **kwargs):\r"},{"line_number":46,"context_line":"        DFlowApp.__init__(self, *args, **kwargs)\r"}],"source_content_type":"text/x-python","patch_set":7,"id":"1af94dfe_e65e1d11","line":43,"range":{"start_line":43,"start_character":22,"end_line":43,"end_character":42},"in_reply_to":"1af94dfe_9e2163a2","updated":"2016-03-18 06:27:26.000000000","message":"\"OpenFlow synchronous\" is a standalone feature, here I just want to add this feature to aging","commit_id":"a469033404090b8b20ff65b3da3a5351708a5d08"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2a46f3be26299bd20e77da3274c40e8fafdd9d0a","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        old_cookie \u003d get_xor_aging_cookie(aging_cookie)\r"},{"line_number":86,"context_line":"        self.cleanup_flows(old_cookie, self.aging_mask)\r"},{"line_number":87,"context_line":"\r"},{"line_number":88,"context_line":"    def renew_aging_cookie(self, cur_c):\r"},{"line_number":89,"context_line":"        global aging_cookie\r"},{"line_number":90,"context_line":"        LOG.info(_LI(\"renew cookie, current cookie is %x\"), cur_c)\r"},{"line_number":91,"context_line":"        new_c \u003d get_xor_aging_cookie(cur_c)\r"}],"source_content_type":"text/x-python","patch_set":7,"id":"1af94dfe_f82b5f92","line":88,"updated":"2016-03-17 08:12:23.000000000","message":"Is this method public?","commit_id":"a469033404090b8b20ff65b3da3a5351708a5d08"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"191c30d4d40c0bdd225ea022869ec49c1edb6a1f","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        old_cookie \u003d get_xor_aging_cookie(aging_cookie)\r"},{"line_number":86,"context_line":"        self.cleanup_flows(old_cookie, self.aging_mask)\r"},{"line_number":87,"context_line":"\r"},{"line_number":88,"context_line":"    def renew_aging_cookie(self, cur_c):\r"},{"line_number":89,"context_line":"        global aging_cookie\r"},{"line_number":90,"context_line":"        LOG.info(_LI(\"renew cookie, current cookie is %x\"), cur_c)\r"},{"line_number":91,"context_line":"        new_c \u003d get_xor_aging_cookie(cur_c)\r"}],"source_content_type":"text/x-python","patch_set":7,"id":"1af94dfe_465f11e5","line":88,"in_reply_to":"1af94dfe_f82b5f92","updated":"2016-03-18 06:27:26.000000000","message":"It\u0027s not public, but I think I could define it in ovs_sync_started(), then it is private","commit_id":"a469033404090b8b20ff65b3da3a5351708a5d08"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"2cb9943538bbc6545e4be4eeafe1bbf6c940ceef","unresolved":false,"context_lines":[{"line_number":26,"context_line":"global_cookie \u003d 0\r"},{"line_number":27,"context_line":"\r"},{"line_number":28,"context_line":"\r"},{"line_number":29,"context_line":"def set_aging_cookie_bits(cookie):\r"},{"line_number":30,"context_line":"    c \u003d cookie\r"},{"line_number":31,"context_line":"    # clear aging bits before using\r"},{"line_number":32,"context_line":"    c \u0026\u003d (0 \u0026 const.GLOBAL_AGING_COOKIE_MASK)\r"},{"line_number":33,"context_line":"    c |\u003d (aging_cookie \u0026 const.GLOBAL_AGING_COOKIE_MASK)\r"},{"line_number":34,"context_line":"    return c\r"},{"line_number":35,"context_line":"\r"},{"line_number":36,"context_line":"\r"},{"line_number":37,"context_line":"def get_xor_cookie(cookie):\r"},{"line_number":38,"context_line":"    return cookie ^ 0x1\r"},{"line_number":39,"context_line":"\r"},{"line_number":40,"context_line":"\r"},{"line_number":41,"context_line":"class Aging(DFlowApp, OpenFlowSwitchMixin):\r"}],"source_content_type":"text/x-python","patch_set":32,"id":"5a18252c_97909f97","line":38,"range":{"start_line":29,"start_character":0,"end_line":38,"end_character":23},"updated":"2016-04-12 06:10:13.000000000","message":"Please move this two function into utility common file in order to resolve the dependency issue","commit_id":"682572e0153a6d1b542585a3dbb8b4a752236697"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"31e82c0728c91f5962b97692a94f31b715ef323a","unresolved":false,"context_lines":[{"line_number":26,"context_line":"global_cookie \u003d 0\r"},{"line_number":27,"context_line":"\r"},{"line_number":28,"context_line":"\r"},{"line_number":29,"context_line":"def set_aging_cookie_bits(cookie):\r"},{"line_number":30,"context_line":"    c \u003d cookie\r"},{"line_number":31,"context_line":"    # clear aging bits before using\r"},{"line_number":32,"context_line":"    c \u0026\u003d (0 \u0026 const.GLOBAL_AGING_COOKIE_MASK)\r"},{"line_number":33,"context_line":"    c |\u003d (aging_cookie \u0026 const.GLOBAL_AGING_COOKIE_MASK)\r"},{"line_number":34,"context_line":"    return c\r"},{"line_number":35,"context_line":"\r"},{"line_number":36,"context_line":"\r"},{"line_number":37,"context_line":"def get_xor_cookie(cookie):\r"},{"line_number":38,"context_line":"    return cookie ^ 0x1\r"},{"line_number":39,"context_line":"\r"},{"line_number":40,"context_line":"\r"},{"line_number":41,"context_line":"class Aging(DFlowApp, OpenFlowSwitchMixin):\r"}],"source_content_type":"text/x-python","patch_set":32,"id":"5a18252c_77eea3ed","line":38,"range":{"start_line":29,"start_character":0,"end_line":38,"end_character":23},"in_reply_to":"5a18252c_97909f97","updated":"2016-04-12 06:30:11.000000000","message":"that is just what I always had been thinking about, but I just hesitate to add a new file which contains only two methods, putting those two functions in utils is better, thx","commit_id":"682572e0153a6d1b542585a3dbb8b4a752236697"}],"dragonflow/controller/common/arp_responder.py":[{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"662a28434d455a11542690d068f8e6351b4ca26f","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            instructions \u003d self._get_instructions()"},{"line_number":71,"context_line":"            ofproto \u003d self.datapath.ofproto"},{"line_number":72,"context_line":"            parser \u003d self.datapath.ofproto_parser"},{"line_number":73,"context_line":"            msg \u003d parser.OFPFlowMod(datapath\u003dself.datapath,"},{"line_number":74,"context_line":"                                    table_id\u003dself.table_id,"},{"line_number":75,"context_line":"                                    cookie\u003dset_aging_cookie_bits(0),"},{"line_number":76,"context_line":"                                    command\u003dofproto.OFPFC_ADD,"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a1b2928_dadb4c1a","line":73,"range":{"start_line":73,"start_character":25,"end_line":73,"end_character":35},"updated":"2016-04-11 13:10:01.000000000","message":"I think it will be best if we use mod_flow  every where \n\nCan we replace this call with mod_flow ?","commit_id":"682572e0153a6d1b542585a3dbb8b4a752236697"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"31e82c0728c91f5962b97692a94f31b715ef323a","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            instructions \u003d self._get_instructions()"},{"line_number":71,"context_line":"            ofproto \u003d self.datapath.ofproto"},{"line_number":72,"context_line":"            parser \u003d self.datapath.ofproto_parser"},{"line_number":73,"context_line":"            msg \u003d parser.OFPFlowMod(datapath\u003dself.datapath,"},{"line_number":74,"context_line":"                                    table_id\u003dself.table_id,"},{"line_number":75,"context_line":"                                    cookie\u003dset_aging_cookie_bits(0),"},{"line_number":76,"context_line":"                                    command\u003dofproto.OFPFC_ADD,"}],"source_content_type":"text/x-python","patch_set":32,"id":"5a18252c_97c41f41","line":73,"range":{"start_line":73,"start_character":25,"end_line":73,"end_character":35},"in_reply_to":"5a18252c_97625fd7","updated":"2016-04-12 06:30:11.000000000","message":"you\u0027re welcome","commit_id":"682572e0153a6d1b542585a3dbb8b4a752236697"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"2cb9943538bbc6545e4be4eeafe1bbf6c940ceef","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            instructions \u003d self._get_instructions()"},{"line_number":71,"context_line":"            ofproto \u003d self.datapath.ofproto"},{"line_number":72,"context_line":"            parser \u003d self.datapath.ofproto_parser"},{"line_number":73,"context_line":"            msg \u003d parser.OFPFlowMod(datapath\u003dself.datapath,"},{"line_number":74,"context_line":"                                    table_id\u003dself.table_id,"},{"line_number":75,"context_line":"                                    cookie\u003dset_aging_cookie_bits(0),"},{"line_number":76,"context_line":"                                    command\u003dofproto.OFPFC_ADD,"}],"source_content_type":"text/x-python","patch_set":32,"id":"5a18252c_97625fd7","line":73,"range":{"start_line":73,"start_character":25,"end_line":73,"end_character":35},"in_reply_to":"5a18252c_ef45bd17","updated":"2016-04-12 06:10:13.000000000","message":"Got it thx","commit_id":"682572e0153a6d1b542585a3dbb8b4a752236697"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"67d4a9f25767529ecd587661827f767210bfd76d","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            instructions \u003d self._get_instructions()"},{"line_number":71,"context_line":"            ofproto \u003d self.datapath.ofproto"},{"line_number":72,"context_line":"            parser \u003d self.datapath.ofproto_parser"},{"line_number":73,"context_line":"            msg \u003d parser.OFPFlowMod(datapath\u003dself.datapath,"},{"line_number":74,"context_line":"                                    table_id\u003dself.table_id,"},{"line_number":75,"context_line":"                                    cookie\u003dset_aging_cookie_bits(0),"},{"line_number":76,"context_line":"                                    command\u003dofproto.OFPFC_ADD,"}],"source_content_type":"text/x-python","patch_set":32,"id":"5a18252c_ef45bd17","line":73,"range":{"start_line":73,"start_character":25,"end_line":73,"end_character":35},"in_reply_to":"7a1b2928_d12b1c2f","updated":"2016-04-12 01:25:41.000000000","message":"yes, ArpResponder is the only exception.","commit_id":"682572e0153a6d1b542585a3dbb8b4a752236697"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"67d4a9f25767529ecd587661827f767210bfd76d","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            instructions \u003d self._get_instructions()"},{"line_number":71,"context_line":"            ofproto \u003d self.datapath.ofproto"},{"line_number":72,"context_line":"            parser \u003d self.datapath.ofproto_parser"},{"line_number":73,"context_line":"            msg \u003d parser.OFPFlowMod(datapath\u003dself.datapath,"},{"line_number":74,"context_line":"                                    table_id\u003dself.table_id,"},{"line_number":75,"context_line":"                                    cookie\u003dset_aging_cookie_bits(0),"},{"line_number":76,"context_line":"                                    command\u003dofproto.OFPFC_ADD,"}],"source_content_type":"text/x-python","patch_set":32,"id":"5a18252c_cf3601b4","line":73,"range":{"start_line":73,"start_character":25,"end_line":73,"end_character":35},"in_reply_to":"7a1b2928_dadb4c1a","updated":"2016-04-12 01:25:41.000000000","message":"ArpResponder is not subclass of DFlowApp, so we cannot use mod_flow","commit_id":"682572e0153a6d1b542585a3dbb8b4a752236697"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"b8ffe3ff50e85c4be1582ed976383f68f9f9d270","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            instructions \u003d self._get_instructions()"},{"line_number":71,"context_line":"            ofproto \u003d self.datapath.ofproto"},{"line_number":72,"context_line":"            parser \u003d self.datapath.ofproto_parser"},{"line_number":73,"context_line":"            msg \u003d parser.OFPFlowMod(datapath\u003dself.datapath,"},{"line_number":74,"context_line":"                                    table_id\u003dself.table_id,"},{"line_number":75,"context_line":"                                    cookie\u003dset_aging_cookie_bits(0),"},{"line_number":76,"context_line":"                                    command\u003dofproto.OFPFC_ADD,"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a1b2928_d12b1c2f","line":73,"range":{"start_line":73,"start_character":25,"end_line":73,"end_character":35},"in_reply_to":"7a1b2928_dadb4c1a","updated":"2016-04-11 18:52:41.000000000","message":"I think that may cause a circular dependency between apps and the ArpResponder. I think that in this case, this solution is all right.","commit_id":"682572e0153a6d1b542585a3dbb8b4a752236697"}],"dragonflow/controller/common/constants.py":[{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"5247edb9cf891b12b7338f84acbb154d4fd6e030","unresolved":false,"context_lines":[{"line_number":29,"context_line":"PRIORITY_MEDIUM \u003d 100"},{"line_number":30,"context_line":"PRIORITY_HIGH \u003d 200"},{"line_number":31,"context_line":"PRIORITY_VERY_HIGH \u003d 300"},{"line_number":32,"context_line":"CANARY_TABLE \u003d 200"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"# Cookie Mask"},{"line_number":35,"context_line":"# there are two types of cookies: global cookie and local cookie,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3afc51ec_5b86bfdb","line":32,"range":{"start_line":32,"start_character":0,"end_line":32,"end_character":12},"updated":"2016-03-15 08:26:37.000000000","message":"why do we need the CANARY table ?\n\nand if we need it it should be in the table number section","commit_id":"5dc6b17bbd315528a53512b776a15fe1194a1b96"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"b54830b9383bb9940e98f2d0dad85e1aefe95edc","unresolved":false,"context_lines":[{"line_number":29,"context_line":"PRIORITY_MEDIUM \u003d 100"},{"line_number":30,"context_line":"PRIORITY_HIGH \u003d 200"},{"line_number":31,"context_line":"PRIORITY_VERY_HIGH \u003d 300"},{"line_number":32,"context_line":"CANARY_TABLE \u003d 200"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"# Cookie Mask"},{"line_number":35,"context_line":"# there are two types of cookies: global cookie and local cookie,"}],"source_content_type":"text/x-python","patch_set":3,"id":"1af94dfe_1c77683b","line":32,"range":{"start_line":32,"start_character":0,"end_line":32,"end_character":12},"in_reply_to":"3afc51ec_5b86bfdb","updated":"2016-03-16 02:14:32.000000000","message":"canary flow is used to record the aging cookie. when controller restart, it will read the canary flow and get the current cookie. based on the current cookie, it could generate a new cookie, then it could flush flows with new cookie.\n\npreviously, it\u0027s plan to use random uuid to generate cookie.  security group and tunnel key also use cookie to store some info, reliability cannot occupy all bits of cookie, at most 32-bits, maybe less. \n\nactually the only requirement is the new cookie is different from the old cookie, so we could read the old cookie, based on the old cookie to generate the new one, this method could satisfy the requirement simply.\n\nanother advantage to use canary flow to record cookie is we could delete all the flows with old cookie efficiently(set table id to OFPTT_ALL and cookie to old cookie, we could delete all the flows with the old cookie in one command). it\u0027s obvious when there\u0027re many flows, such as 100K.","commit_id":"5dc6b17bbd315528a53512b776a15fe1194a1b96"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"794820ac48875548bfb24f6c2b2eaaee8b501ae1","unresolved":false,"context_lines":[{"line_number":29,"context_line":"PRIORITY_MEDIUM \u003d 100"},{"line_number":30,"context_line":"PRIORITY_HIGH \u003d 200"},{"line_number":31,"context_line":"PRIORITY_VERY_HIGH \u003d 300"},{"line_number":32,"context_line":"CANARY_TABLE \u003d 200"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"\"\"\""},{"line_number":35,"context_line":"Cookie Mask"}],"source_content_type":"text/x-python","patch_set":6,"id":"1af94dfe_272afa2c","line":32,"range":{"start_line":32,"start_character":0,"end_line":32,"end_character":12},"updated":"2016-03-16 12:40:05.000000000","message":"should go in the table section above","commit_id":"1aa5a9602a1e140f3091647c936d1ad5ea86237b"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"01487cc22d35a189e1dce7b8ea7a478c4d9de6c4","unresolved":false,"context_lines":[{"line_number":29,"context_line":"PRIORITY_MEDIUM \u003d 100"},{"line_number":30,"context_line":"PRIORITY_HIGH \u003d 200"},{"line_number":31,"context_line":"PRIORITY_VERY_HIGH \u003d 300"},{"line_number":32,"context_line":"CANARY_TABLE \u003d 200"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"\"\"\""},{"line_number":35,"context_line":"Cookie Mask"}],"source_content_type":"text/x-python","patch_set":6,"id":"1af94dfe_a502596d","line":32,"range":{"start_line":32,"start_character":0,"end_line":32,"end_character":12},"in_reply_to":"1af94dfe_272afa2c","updated":"2016-03-25 12:01:00.000000000","message":"Done","commit_id":"1aa5a9602a1e140f3091647c936d1ad5ea86237b"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"fabe7df3b631ab3b59b54862f1cc18d345edd04b","unresolved":false,"context_lines":[{"line_number":37,"context_line":"DRAGONFLOW_DEFAULT_BRIDGE \u003d \u0027br-int\u0027"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"\"\"\""},{"line_number":40,"context_line":"Cookie Mask"},{"line_number":41,"context_line":"there are two types of cookies: global cookie and local cookie,"},{"line_number":42,"context_line":"global cookies should not overlapped with local cookies, global cookies"},{"line_number":43,"context_line":"should not overlapped with global cookies, but local cookies could"},{"line_number":44,"context_line":"overlapped with local cookies"},{"line_number":45,"context_line":"\"\"\""},{"line_number":46,"context_line":"GLOBAL_AGING_COOKIE_MASK \u003d 0x1"},{"line_number":47,"context_line":"LOCAL_TUNNEL_KEY_COOKIE \u003d 0x1fffffffe"}],"source_content_type":"text/x-python","patch_set":34,"id":"5a18252c_926eb22d","line":44,"range":{"start_line":40,"start_character":0,"end_line":44,"end_character":29},"updated":"2016-04-13 06:56:16.000000000","message":"Can you please re rephrase I am not sure I understand this comment  \nyou mean that we have 1 bit defecated to the aging ?","commit_id":"485dc7ee20048fb9e48e03357c95e2ec74adb330"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"30a2cfb04f3aa1e5048b7c68dfdce016f1fdee68","unresolved":false,"context_lines":[{"line_number":37,"context_line":"DRAGONFLOW_DEFAULT_BRIDGE \u003d \u0027br-int\u0027"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"\"\"\""},{"line_number":40,"context_line":"Cookie Mask"},{"line_number":41,"context_line":"there are two types of cookies: global cookie and local cookie,"},{"line_number":42,"context_line":"global cookies should not overlapped with local cookies, global cookies"},{"line_number":43,"context_line":"should not overlapped with global cookies, but local cookies could"},{"line_number":44,"context_line":"overlapped with local cookies"},{"line_number":45,"context_line":"\"\"\""},{"line_number":46,"context_line":"GLOBAL_AGING_COOKIE_MASK \u003d 0x1"},{"line_number":47,"context_line":"LOCAL_TUNNEL_KEY_COOKIE \u003d 0x1fffffffe"}],"source_content_type":"text/x-python","patch_set":34,"id":"5a18252c_26d15f58","line":44,"range":{"start_line":40,"start_character":0,"end_line":44,"end_character":29},"in_reply_to":"5a18252c_926eb22d","updated":"2016-04-13 07:08:54.000000000","message":"I mean the 1-bit cookie used by aging should not be used by other app\u0027s cookie.","commit_id":"485dc7ee20048fb9e48e03357c95e2ec74adb330"}],"dragonflow/controller/common/utils.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e33842bc05c9e0013d2f26ba79dbf20a7e2c260e","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            raise ValueError(msg)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def set_aging_cookie(c):"},{"line_number":41,"context_line":"    global _aging_cookie"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"5a18252c_ad828350","line":40,"updated":"2016-04-12 17:57:50.000000000","message":"I think this function is a no-op.","commit_id":"26b8b9ea439eceaea2e397eff29693a1d83764e0"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"84927b8614e16fcd70316988c896b4fda1c42fed","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            raise ValueError(msg)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def set_aging_cookie(c):"},{"line_number":41,"context_line":"    global _aging_cookie"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"5a18252c_602184b4","line":40,"in_reply_to":"5a18252c_ad828350","updated":"2016-04-13 02:08:12.000000000","message":"sorry, it\u0027s typo, missed one line","commit_id":"26b8b9ea439eceaea2e397eff29693a1d83764e0"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e33842bc05c9e0013d2f26ba79dbf20a7e2c260e","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"def get_xor_cookie(cookie):"},{"line_number":57,"context_line":"    return cookie ^ 0x1"}],"source_content_type":"text/x-python","patch_set":33,"id":"5a18252c_edf3db08","line":57,"range":{"start_line":57,"start_character":20,"end_line":57,"end_character":23},"updated":"2016-04-12 17:57:50.000000000","message":"Consider using the mask constant here.","commit_id":"26b8b9ea439eceaea2e397eff29693a1d83764e0"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"84927b8614e16fcd70316988c896b4fda1c42fed","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"def get_xor_cookie(cookie):"},{"line_number":57,"context_line":"    return cookie ^ 0x1"}],"source_content_type":"text/x-python","patch_set":33,"id":"5a18252c_c0305804","line":57,"range":{"start_line":57,"start_character":20,"end_line":57,"end_character":23},"in_reply_to":"5a18252c_edf3db08","updated":"2016-04-13 02:08:12.000000000","message":"Done","commit_id":"26b8b9ea439eceaea2e397eff29693a1d83764e0"}],"dragonflow/controller/df_base_app.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2a46f3be26299bd20e77da3274c40e8fafdd9d0a","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        cookie \u003d do_aging.flap_aging_cookie(cookie)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        message \u003d datapath.ofproto_parser.OFPFlowMod(datapath, cookie,"},{"line_number":68,"context_line":"                                                     cookie_mask,"},{"line_number":69,"context_line":"                                                     table_id, command,"},{"line_number":70,"context_line":"                                                     idle_timeout,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1af94dfe_e3fa94bc","line":67,"updated":"2016-03-17 08:12:23.000000000","message":"There are many places OFPFlowMod is called manually. Is there a plan to change that? Otherwise, you will get a mix of flows with and without the aging cookie bit.","commit_id":"a469033404090b8b20ff65b3da3a5351708a5d08"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5cb0acf38c0e383d753e7a4ba4a302b4a2267fbb","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        if out_group is None:"},{"line_number":67,"context_line":"            out_group \u003d datapath.ofproto.OFPG_ANY"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        from dragonflow.controller.aging import set_aging_cookie_bits"},{"line_number":70,"context_line":"        cookie \u003d set_aging_cookie_bits(cookie)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        message \u003d datapath.ofproto_parser.OFPFlowMod(datapath, cookie,"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a061dce_6de906e6","line":69,"updated":"2016-04-07 08:21:22.000000000","message":"Consider placing this import with the others at the beginning of the file.","commit_id":"4c004fa1d71e5161af746c2bb6218ea5cd7a52a8"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"e8450c7231b0912443885d2c7a8555108bc2d74d","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        if out_group is None:"},{"line_number":67,"context_line":"            out_group \u003d datapath.ofproto.OFPG_ANY"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        from dragonflow.controller.aging import set_aging_cookie_bits"},{"line_number":70,"context_line":"        cookie \u003d set_aging_cookie_bits(cookie)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        message \u003d datapath.ofproto_parser.OFPFlowMod(datapath, cookie,"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a061dce_667badbe","line":69,"in_reply_to":"9a061dce_6de906e6","updated":"2016-04-08 02:26:26.000000000","message":"that will cause a recycle dependence between test_aging and df_base_app module. because df_base_app will need to use cookie interface.\nthis could be solved by separate the cookie function from test_aging, but I think it\u0027s unnecessary, the solution here can work well.","commit_id":"4c004fa1d71e5161af746c2bb6218ea5cd7a52a8"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5cb0acf38c0e383d753e7a4ba4a302b4a2267fbb","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        from dragonflow.controller.aging import set_aging_cookie_bits"},{"line_number":70,"context_line":"        cookie \u003d set_aging_cookie_bits(cookie)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        message \u003d datapath.ofproto_parser.OFPFlowMod(datapath, cookie,"},{"line_number":73,"context_line":"                                                     cookie_mask,"},{"line_number":74,"context_line":"                                                     table_id, command,"},{"line_number":75,"context_line":"                                                     idle_timeout,"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a061dce_cda772bb","line":72,"updated":"2016-04-07 08:21:22.000000000","message":"There are many places OFPFlowMod is called manually. Is there a plan to change that? Otherwise, you will get a mix of flows with and without the aging cookie bit.","commit_id":"4c004fa1d71e5161af746c2bb6218ea5cd7a52a8"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"e8450c7231b0912443885d2c7a8555108bc2d74d","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        from dragonflow.controller.aging import set_aging_cookie_bits"},{"line_number":70,"context_line":"        cookie \u003d set_aging_cookie_bits(cookie)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        message \u003d datapath.ofproto_parser.OFPFlowMod(datapath, cookie,"},{"line_number":73,"context_line":"                                                     cookie_mask,"},{"line_number":74,"context_line":"                                                     table_id, command,"},{"line_number":75,"context_line":"                                                     idle_timeout,"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a061dce_e945ce6e","line":72,"in_reply_to":"9a061dce_cda772bb","updated":"2016-04-08 02:26:26.000000000","message":"I think DFlowApp.mod_flow is already provide a interface, all apps should call this interface to send flows. then I need only modify this interface.","commit_id":"4c004fa1d71e5161af746c2bb6218ea5cd7a52a8"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"662a28434d455a11542690d068f8e6351b4ca26f","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        if out_group is None:"},{"line_number":67,"context_line":"            out_group \u003d datapath.ofproto.OFPG_ANY"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        from dragonflow.controller.aging import set_aging_cookie_bits"},{"line_number":70,"context_line":"        cookie \u003d set_aging_cookie_bits(cookie)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        message \u003d datapath.ofproto_parser.OFPFlowMod(datapath, cookie,"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a1b2928_da9fcc5d","line":69,"range":{"start_line":69,"start_character":8,"end_line":69,"end_character":69},"updated":"2016-04-11 13:10:01.000000000","message":"why here and not import it once in the top ?","commit_id":"682572e0153a6d1b542585a3dbb8b4a752236697"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"2cb9943538bbc6545e4be4eeafe1bbf6c940ceef","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        if out_group is None:"},{"line_number":67,"context_line":"            out_group \u003d datapath.ofproto.OFPG_ANY"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        from dragonflow.controller.aging import set_aging_cookie_bits"},{"line_number":70,"context_line":"        cookie \u003d set_aging_cookie_bits(cookie)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        message \u003d datapath.ofproto_parser.OFPFlowMod(datapath, cookie,"}],"source_content_type":"text/x-python","patch_set":32,"id":"5a18252c_97e7ff3f","line":69,"range":{"start_line":69,"start_character":8,"end_line":69,"end_character":69},"in_reply_to":"5a18252c_8fe7e93f","updated":"2016-04-12 06:10:13.000000000","message":"I think that the solution is to move the global function to the \ncontroller/common/utility file","commit_id":"682572e0153a6d1b542585a3dbb8b4a752236697"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"31e82c0728c91f5962b97692a94f31b715ef323a","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        if out_group is None:"},{"line_number":67,"context_line":"            out_group \u003d datapath.ofproto.OFPG_ANY"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        from dragonflow.controller.aging import set_aging_cookie_bits"},{"line_number":70,"context_line":"        cookie \u003d set_aging_cookie_bits(cookie)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        message \u003d datapath.ofproto_parser.OFPFlowMod(datapath, cookie,"}],"source_content_type":"text/x-python","patch_set":32,"id":"5a18252c_b7d79b22","line":69,"range":{"start_line":69,"start_character":8,"end_line":69,"end_character":69},"in_reply_to":"5a18252c_97e7ff3f","updated":"2016-04-12 06:30:11.000000000","message":"agree","commit_id":"682572e0153a6d1b542585a3dbb8b4a752236697"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"67d4a9f25767529ecd587661827f767210bfd76d","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        if out_group is None:"},{"line_number":67,"context_line":"            out_group \u003d datapath.ofproto.OFPG_ANY"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        from dragonflow.controller.aging import set_aging_cookie_bits"},{"line_number":70,"context_line":"        cookie \u003d set_aging_cookie_bits(cookie)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        message \u003d datapath.ofproto_parser.OFPFlowMod(datapath, cookie,"}],"source_content_type":"text/x-python","patch_set":32,"id":"5a18252c_8fe7e93f","line":69,"range":{"start_line":69,"start_character":8,"end_line":69,"end_character":69},"in_reply_to":"7a1b2928_91d88455","updated":"2016-04-12 01:25:41.000000000","message":"yes, to solve cyclic dependency","commit_id":"682572e0153a6d1b542585a3dbb8b4a752236697"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"b8ffe3ff50e85c4be1582ed976383f68f9f9d270","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        if out_group is None:"},{"line_number":67,"context_line":"            out_group \u003d datapath.ofproto.OFPG_ANY"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        from dragonflow.controller.aging import set_aging_cookie_bits"},{"line_number":70,"context_line":"        cookie \u003d set_aging_cookie_bits(cookie)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        message \u003d datapath.ofproto_parser.OFPFlowMod(datapath, cookie,"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a1b2928_91d88455","line":69,"range":{"start_line":69,"start_character":8,"end_line":69,"end_character":69},"in_reply_to":"7a1b2928_da9fcc5d","updated":"2016-04-11 18:52:41.000000000","message":"Is there another way to solve the cyclic dependency?","commit_id":"682572e0153a6d1b542585a3dbb8b4a752236697"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"67d4a9f25767529ecd587661827f767210bfd76d","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        if out_group is None:"},{"line_number":67,"context_line":"            out_group \u003d datapath.ofproto.OFPG_ANY"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        from dragonflow.controller.aging import set_aging_cookie_bits"},{"line_number":70,"context_line":"        cookie \u003d set_aging_cookie_bits(cookie)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        message \u003d datapath.ofproto_parser.OFPFlowMod(datapath, cookie,"}],"source_content_type":"text/x-python","patch_set":32,"id":"5a18252c_8f5529c8","line":69,"range":{"start_line":69,"start_character":8,"end_line":69,"end_character":69},"in_reply_to":"7a1b2928_da9fcc5d","updated":"2016-04-12 01:25:41.000000000","message":"just as Omer said, it will introduce cyclic dependency.","commit_id":"682572e0153a6d1b542585a3dbb8b4a752236697"}],"dragonflow/controller/df_local_controller.py":[{"author":{"_account_id":20188,"name":"zhuweiqiong","email":"zhuweiqiong@huawei.com","username":"zhuweiqiong"},"change_message_id":"7039341ecf1db36d10c6b64315c6b18496dfb80b","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        # for reliability, here we should check if controller is set for OVS,"},{"line_number":85,"context_line":"        # if yes, don\u0027t set controller and don\u0027t delete controller."},{"line_number":86,"context_line":"        # if no, set controller"},{"line_number":87,"context_line":"        targets \u003d \u0027tcp:\u0027 + self.ip + \u0027:6633\u0027"},{"line_number":88,"context_line":"        is_controller_set \u003d self.vswitch_api.check_controller(targets)"},{"line_number":89,"context_line":"        if not is_controller_set:"},{"line_number":90,"context_line":"            self.vswitch_api.set_controllers(\u0027br-int\u0027, [targets]).execute()"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a061dce_de4c43ca","line":87,"range":{"start_line":87,"start_character":40,"end_line":87,"end_character":42},"updated":"2016-04-07 03:04:39.000000000","message":"i think the port number should be variables","commit_id":"4c004fa1d71e5161af746c2bb6218ea5cd7a52a8"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"d9798d8b42477a468ef6247fb87746b79d3a4a17","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        # for reliability, here we should check if controller is set for OVS,"},{"line_number":85,"context_line":"        # if yes, don\u0027t set controller and don\u0027t delete controller."},{"line_number":86,"context_line":"        # if no, set controller"},{"line_number":87,"context_line":"        targets \u003d \u0027tcp:\u0027 + self.ip + \u0027:6633\u0027"},{"line_number":88,"context_line":"        is_controller_set \u003d self.vswitch_api.check_controller(targets)"},{"line_number":89,"context_line":"        if not is_controller_set:"},{"line_number":90,"context_line":"            self.vswitch_api.set_controllers(\u0027br-int\u0027, [targets]).execute()"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a061dce_be534f38","line":87,"range":{"start_line":87,"start_character":40,"end_line":87,"end_character":42},"in_reply_to":"9a061dce_de4c43ca","updated":"2016-04-07 03:13:16.000000000","message":"yes, the port should be set in configuration file, I\u0027ll add a TODO to mark it.","commit_id":"4c004fa1d71e5161af746c2bb6218ea5cd7a52a8"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5cb0acf38c0e383d753e7a4ba4a302b4a2267fbb","unresolved":false,"context_lines":[{"line_number":483,"context_line":""},{"line_number":484,"context_line":"    def ovs_sync_started(self):"},{"line_number":485,"context_line":"        self.open_flow_app.notify_ovs_sync_started()"},{"line_number":486,"context_line":"        self.open_flow_app.notify_switch_features_handler()"},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"    def get_nb_api(self):"},{"line_number":489,"context_line":"        return self.nb_api"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a061dce_b7608dd0","line":486,"updated":"2016-04-07 08:21:22.000000000","message":"Why is this necessary? Can\u0027t applications infer it from ovs_sync_started?","commit_id":"4c004fa1d71e5161af746c2bb6218ea5cd7a52a8"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"e8450c7231b0912443885d2c7a8555108bc2d74d","unresolved":false,"context_lines":[{"line_number":483,"context_line":""},{"line_number":484,"context_line":"    def ovs_sync_started(self):"},{"line_number":485,"context_line":"        self.open_flow_app.notify_ovs_sync_started()"},{"line_number":486,"context_line":"        self.open_flow_app.notify_switch_features_handler()"},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"    def get_nb_api(self):"},{"line_number":489,"context_line":"        return self.nb_api"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a061dce_dd6c2e0a","line":486,"in_reply_to":"9a061dce_b7608dd0","updated":"2016-04-08 02:26:26.000000000","message":"after ovs_sync_start should is processed by aging, then other apps could adding new flows. it must be in serial","commit_id":"4c004fa1d71e5161af746c2bb6218ea5cd7a52a8"}],"dragonflow/controller/l3_proactive_app.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2a46f3be26299bd20e77da3274c40e8fafdd9d0a","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                         const.LOCAL_TUNNEL_KEY_SHIFT_LEN)"},{"line_number":149,"context_line":"        self.mod_flow("},{"line_number":150,"context_line":"            self.get_datapath(),"},{"line_number":151,"context_line":"            cookie\u003ddo_aging.flap_aging_cookie(tunnel_cookie),"},{"line_number":152,"context_line":"            cookie_mask\u003dconst.LOCAL_TUNNEL_KEY_COOKIE,"},{"line_number":153,"context_line":"            inst\u003dinst,"},{"line_number":154,"context_line":"            table_id\u003dconst.L3_LOOKUP_TABLE,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1af94dfe_e30d743f","line":151,"updated":"2016-03-17 08:12:23.000000000","message":"mod_flow also calls flap_aging_cookie on the cookie. Is this intentional?","commit_id":"a469033404090b8b20ff65b3da3a5351708a5d08"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"6f973551486f320f714275ca0a10b5d4d736c618","unresolved":false,"context_lines":[{"line_number":150,"context_line":"                         const.LOCAL_TUNNEL_KEY_SHIFT_LEN)"},{"line_number":151,"context_line":"        self.mod_flow("},{"line_number":152,"context_line":"            self.get_datapath(),"},{"line_number":153,"context_line":"            cookie\u003ddo_aging.flap_aging_cookie(tunnel_cookie),"},{"line_number":154,"context_line":"            cookie_mask\u003dconst.LOCAL_TUNNEL_KEY_COOKIE,"},{"line_number":155,"context_line":"            inst\u003dinst,"},{"line_number":156,"context_line":"            table_id\u003dconst.L3_LOOKUP_TABLE,"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa0719c6_ec41c1aa","line":153,"updated":"2016-03-23 12:24:33.000000000","message":"Same comment from PatchSet 7 - mod_flow also calls flap_aging_cookie on the cookie. Is this intentional?","commit_id":"02b234a8b6ae7853aa34e89d04c9f539904a6ef8"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"44db4768bcdcf3432b4aa17f63b1a02dfaf94767","unresolved":false,"context_lines":[{"line_number":150,"context_line":"                         const.LOCAL_TUNNEL_KEY_SHIFT_LEN)"},{"line_number":151,"context_line":"        self.mod_flow("},{"line_number":152,"context_line":"            self.get_datapath(),"},{"line_number":153,"context_line":"            cookie\u003ddo_aging.flap_aging_cookie(tunnel_cookie),"},{"line_number":154,"context_line":"            cookie_mask\u003dconst.LOCAL_TUNNEL_KEY_COOKIE,"},{"line_number":155,"context_line":"            inst\u003dinst,"},{"line_number":156,"context_line":"            table_id\u003dconst.L3_LOOKUP_TABLE,"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa0719c6_084ae825","line":153,"in_reply_to":"fa0719c6_ec41c1aa","updated":"2016-03-24 09:33:52.000000000","message":"Done","commit_id":"02b234a8b6ae7853aa34e89d04c9f539904a6ef8"}],"dragonflow/controller/ofswitch.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"6f46dc2ace1323c726f29d7ccdba16dc34e595c6","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    Mixin to provide a convenient way to use OpenFlow messages synchronously\r"},{"line_number":30,"context_line":"    \"\"\"\r"},{"line_number":31,"context_line":"\r"},{"line_number":32,"context_line":"    def __init__(self, *args, **kwargs):\r"},{"line_number":33,"context_line":"        super(OpenFlowSwitchMixin, self).__init__(*args, **kwargs)\r"},{"line_number":34,"context_line":"        self._app \u003d kwargs.pop(\u0027ryu_app\u0027)\r"},{"line_number":35,"context_line":"        self._dp \u003d kwargs.pop(\u0027datapath\u0027)\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"3afc51ec_ed091c33","line":32,"updated":"2016-03-13 21:07:14.000000000","message":"Consider naming the arguments explicitly. Using *args, **kwargs in this fashion may cause confusion.","commit_id":"7f8c6f063386545729e1ee2e60ab9f3a3f35f8e9"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"231fdde0e43676c4ccdd543ab2cafb4e79b2c99b","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    Mixin to provide a convenient way to use OpenFlow messages synchronously\r"},{"line_number":30,"context_line":"    \"\"\"\r"},{"line_number":31,"context_line":"\r"},{"line_number":32,"context_line":"    def __init__(self, *args, **kwargs):\r"},{"line_number":33,"context_line":"        super(OpenFlowSwitchMixin, self).__init__(*args, **kwargs)\r"},{"line_number":34,"context_line":"        self._app \u003d kwargs.pop(\u0027ryu_app\u0027)\r"},{"line_number":35,"context_line":"        self._dp \u003d kwargs.pop(\u0027datapath\u0027)\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"3afc51ec_5ae39d05","line":32,"in_reply_to":"3afc51ec_ed091c33","updated":"2016-03-14 04:56:29.000000000","message":"Done","commit_id":"7f8c6f063386545729e1ee2e60ab9f3a3f35f8e9"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"5247edb9cf891b12b7338f84acbb154d4fd6e030","unresolved":false,"context_lines":[{"line_number":25,"context_line":"LOG \u003d log.getLogger(\"dragonflow.controller.df_local_controller\")\r"},{"line_number":26,"context_line":"\r"},{"line_number":27,"context_line":"\r"},{"line_number":28,"context_line":"class OpenFlowSwitchMixin(object):\r"},{"line_number":29,"context_line":"    \"\"\"\r"},{"line_number":30,"context_line":"    Mixin to provide a convenient way to use OpenFlow messages synchronously\r"},{"line_number":31,"context_line":"    \"\"\"\r"}],"source_content_type":"text/x-python","patch_set":3,"id":"3afc51ec_dba5af47","line":28,"range":{"start_line":28,"start_character":6,"end_line":28,"end_character":25},"updated":"2016-03-15 08:26:37.000000000","message":"why do we need the Mixin and where it is being used ?\n\nwhy not intruduce this changed into DFlowApp","commit_id":"5dc6b17bbd315528a53512b776a15fe1194a1b96"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"b54830b9383bb9940e98f2d0dad85e1aefe95edc","unresolved":false,"context_lines":[{"line_number":25,"context_line":"LOG \u003d log.getLogger(\"dragonflow.controller.df_local_controller\")\r"},{"line_number":26,"context_line":"\r"},{"line_number":27,"context_line":"\r"},{"line_number":28,"context_line":"class OpenFlowSwitchMixin(object):\r"},{"line_number":29,"context_line":"    \"\"\"\r"},{"line_number":30,"context_line":"    Mixin to provide a convenient way to use OpenFlow messages synchronously\r"},{"line_number":31,"context_line":"    \"\"\"\r"}],"source_content_type":"text/x-python","patch_set":3,"id":"1af94dfe_175623d2","line":28,"range":{"start_line":28,"start_character":6,"end_line":28,"end_character":25},"in_reply_to":"3afc51ec_dba5af47","updated":"2016-03-16 02:14:32.000000000","message":"OpenFlowSwitchMixin is used to provide the synchronous OpenFlow access. currently, DFlowApp only provide unsynchronous OpenFlow access.\nThe reason to use synchronous OpenFlow access is step 1 and 2 should be done before step 3:\n1. read canary flow to get old cookie\n2. generate new cookie\n3. apps use new cookie to reflush flows\n\nI think we could introduce this change to DFlowApp if there are other apps need synchronous OpenFlow access.","commit_id":"5dc6b17bbd315528a53512b776a15fe1194a1b96"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"5247edb9cf891b12b7338f84acbb154d4fd6e030","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        self._dp \u003d datapath\r"},{"line_number":36,"context_line":"\r"},{"line_number":37,"context_line":"    def _send_msg(self, msg, reply_cls\u003dNone, reply_multi\u003dFalse):\r"},{"line_number":38,"context_line":"        timeout_sec \u003d 10  # TODO(heshan) should be configured in cfg file\r"},{"line_number":39,"context_line":"        timeout \u003d eventlet.timeout.Timeout(seconds\u003dtimeout_sec)\r"},{"line_number":40,"context_line":"        try:\r"},{"line_number":41,"context_line":"            result \u003d ofctl_api.send_msg(self, msg, reply_cls, reply_multi)\r"}],"source_content_type":"text/x-python","patch_set":3,"id":"3afc51ec_db492fb9","line":38,"range":{"start_line":38,"start_character":41,"end_line":38,"end_character":73},"updated":"2016-03-15 08:26:37.000000000","message":"I agree","commit_id":"5dc6b17bbd315528a53512b776a15fe1194a1b96"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"b54830b9383bb9940e98f2d0dad85e1aefe95edc","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        self._dp \u003d datapath\r"},{"line_number":36,"context_line":"\r"},{"line_number":37,"context_line":"    def _send_msg(self, msg, reply_cls\u003dNone, reply_multi\u003dFalse):\r"},{"line_number":38,"context_line":"        timeout_sec \u003d 10  # TODO(heshan) should be configured in cfg file\r"},{"line_number":39,"context_line":"        timeout \u003d eventlet.timeout.Timeout(seconds\u003dtimeout_sec)\r"},{"line_number":40,"context_line":"        try:\r"},{"line_number":41,"context_line":"            result \u003d ofctl_api.send_msg(self, msg, reply_cls, reply_multi)\r"}],"source_content_type":"text/x-python","patch_set":3,"id":"1af94dfe_f75297dc","line":38,"range":{"start_line":38,"start_character":41,"end_line":38,"end_character":73},"in_reply_to":"3afc51ec_db492fb9","updated":"2016-03-16 02:14:32.000000000","message":"Done","commit_id":"5dc6b17bbd315528a53512b776a15fe1194a1b96"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"5247edb9cf891b12b7338f84acbb154d4fd6e030","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        if f is not None:\r"},{"line_number":121,"context_line":"            return f.cookie \u0026 const.GLOBAL_AGING_COOKIE_MASK\r"},{"line_number":122,"context_line":"\r"},{"line_number":123,"context_line":"    def add_canary_flow(self, cookie):\r"},{"line_number":124,"context_line":"        (dp, ofp, ofpp) \u003d self._get_dp()\r"},{"line_number":125,"context_line":"        msg \u003d ofpp.OFFlowMod(dp,\r"},{"line_number":126,"context_line":"                             command\u003dofp.OFPFC_ADD,\r"}],"source_content_type":"text/x-python","patch_set":3,"id":"3afc51ec_fb750bfa","line":123,"range":{"start_line":123,"start_character":8,"end_line":123,"end_character":23},"updated":"2016-03-15 08:26:37.000000000","message":"again why do we need the canary table","commit_id":"5dc6b17bbd315528a53512b776a15fe1194a1b96"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"b54830b9383bb9940e98f2d0dad85e1aefe95edc","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        if f is not None:\r"},{"line_number":121,"context_line":"            return f.cookie \u0026 const.GLOBAL_AGING_COOKIE_MASK\r"},{"line_number":122,"context_line":"\r"},{"line_number":123,"context_line":"    def add_canary_flow(self, cookie):\r"},{"line_number":124,"context_line":"        (dp, ofp, ofpp) \u003d self._get_dp()\r"},{"line_number":125,"context_line":"        msg \u003d ofpp.OFFlowMod(dp,\r"},{"line_number":126,"context_line":"                             command\u003dofp.OFPFC_ADD,\r"}],"source_content_type":"text/x-python","patch_set":3,"id":"1af94dfe_975873fc","line":123,"range":{"start_line":123,"start_character":8,"end_line":123,"end_character":23},"in_reply_to":"3afc51ec_fb750bfa","updated":"2016-03-16 02:14:32.000000000","message":"answered in constants.py","commit_id":"5dc6b17bbd315528a53512b776a15fe1194a1b96"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2a46f3be26299bd20e77da3274c40e8fafdd9d0a","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        self._app \u003d ryu_app\r"},{"line_number":41,"context_line":"\r"},{"line_number":42,"context_line":"    def _send_msg(self, msg, reply_cls\u003dNone, reply_multi\u003dFalse):\r"},{"line_number":43,"context_line":"        timeout_sec \u003d 20  # TODO(heshan) should be configured in cfg file\r"},{"line_number":44,"context_line":"        timeout \u003d eventlet.timeout.Timeout(seconds\u003dtimeout_sec)\r"},{"line_number":45,"context_line":"        result \u003d None\r"},{"line_number":46,"context_line":"        try:\r"}],"source_content_type":"text/x-python","patch_set":7,"id":"1af94dfe_fe5ea710","line":43,"updated":"2016-03-17 08:12:23.000000000","message":"Consider making this an optional parameter to _send_msg or __init__.","commit_id":"a469033404090b8b20ff65b3da3a5351708a5d08"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2a46f3be26299bd20e77da3274c40e8fafdd9d0a","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                    \"request\": msg,\r"},{"line_number":51,"context_line":"                    \"error\": e,\r"},{"line_number":52,"context_line":"            }\r"},{"line_number":53,"context_line":"            LOG.error(_LE(\"exception occurred, %s\"), m)\r"},{"line_number":54,"context_line":"        except eventlet.timeout.Timeout as e:\r"},{"line_number":55,"context_line":"            LOG.error(_LE(\"exception occurred, %s\"), e)\r"},{"line_number":56,"context_line":"        finally:\r"}],"source_content_type":"text/x-python","patch_set":7,"id":"1af94dfe_d8278310","line":53,"updated":"2016-03-17 08:12:23.000000000","message":"Consider using LOG.exception to log exceptions.","commit_id":"a469033404090b8b20ff65b3da3a5351708a5d08"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2a46f3be26299bd20e77da3274c40e8fafdd9d0a","unresolved":false,"context_lines":[{"line_number":52,"context_line":"            }\r"},{"line_number":53,"context_line":"            LOG.error(_LE(\"exception occurred, %s\"), m)\r"},{"line_number":54,"context_line":"        except eventlet.timeout.Timeout as e:\r"},{"line_number":55,"context_line":"            LOG.error(_LE(\"exception occurred, %s\"), e)\r"},{"line_number":56,"context_line":"        finally:\r"},{"line_number":57,"context_line":"            timeout.cancel()\r"},{"line_number":58,"context_line":"        LOG.debug(\"ofctl request %(request)s result %(result)s\",\r"}],"source_content_type":"text/x-python","patch_set":7,"id":"1af94dfe_18228b00","line":55,"updated":"2016-03-17 08:12:23.000000000","message":"Same here. Also consider rewording to indicate this is a timeout.","commit_id":"a469033404090b8b20ff65b3da3a5351708a5d08"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2a46f3be26299bd20e77da3274c40e8fafdd9d0a","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        try:\r"},{"line_number":85,"context_line":"            self.delete_flows(cookie\u003dmatch_c, cookie_mask\u003dmatch_cmask)\r"},{"line_number":86,"context_line":"        except Exception as e:\r"},{"line_number":87,"context_line":"            LOG.error(_LE(\"exception occurred when cleanup_flows %s\"), e)\r"},{"line_number":88,"context_line":"\r"},{"line_number":89,"context_line":"    @staticmethod\r"},{"line_number":90,"context_line":"    def _match(ofpp, match, **match_kwargs):\r"}],"source_content_type":"text/x-python","patch_set":7,"id":"1af94dfe_3e092fde","line":87,"updated":"2016-03-17 08:12:23.000000000","message":"See above re: Exception logging.","commit_id":"a469033404090b8b20ff65b3da3a5351708a5d08"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2a46f3be26299bd20e77da3274c40e8fafdd9d0a","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            LOG.error(_LE(\"exception occurred when cleanup_flows %s\"), e)\r"},{"line_number":88,"context_line":"\r"},{"line_number":89,"context_line":"    @staticmethod\r"},{"line_number":90,"context_line":"    def _match(ofpp, match, **match_kwargs):\r"},{"line_number":91,"context_line":"        if match is not None:\r"},{"line_number":92,"context_line":"            return match\r"},{"line_number":93,"context_line":"        return ofpp.OFPMatch(**match_kwargs)\r"}],"source_content_type":"text/x-python","patch_set":7,"id":"1af94dfe_7e13b70d","line":90,"updated":"2016-03-17 08:12:23.000000000","message":"Why is this method static?","commit_id":"a469033404090b8b20ff65b3da3a5351708a5d08"}],"dragonflow/controller/ryu_base_app.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5cb0acf38c0e383d753e7a4ba4a302b4a2267fbb","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        if version \u003c RyuDFAdapter.OF_AUTO_PORT_DESC_STATS_REQ_VER:"},{"line_number":149,"context_line":"            # Otherwise, this is done automatically by OFPHandler"},{"line_number":150,"context_line":"            self._send_port_desc_stats_request(self.datapath)"},{"line_number":151,"context_line":"        notify_start_ovsdb_monitor()"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def _send_port_desc_stats_request(self, datapath):"},{"line_number":154,"context_line":"        ofp_parser \u003d datapath.ofproto_parser"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a061dce_8ded7ab9","line":151,"updated":"2016-04-07 08:21:22.000000000","message":"Consider treating switch_features_handler and ovsdb sync_started separately. They are not the same event, and applications may want to be able to differentiate between them.","commit_id":"4c004fa1d71e5161af746c2bb6218ea5cd7a52a8"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"e8450c7231b0912443885d2c7a8555108bc2d74d","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        if version \u003c RyuDFAdapter.OF_AUTO_PORT_DESC_STATS_REQ_VER:"},{"line_number":149,"context_line":"            # Otherwise, this is done automatically by OFPHandler"},{"line_number":150,"context_line":"            self._send_port_desc_stats_request(self.datapath)"},{"line_number":151,"context_line":"        notify_start_ovsdb_monitor()"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def _send_port_desc_stats_request(self, datapath):"},{"line_number":154,"context_line":"        ofp_parser \u003d datapath.ofproto_parser"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a061dce_89e412ac","line":151,"in_reply_to":"9a061dce_8ded7ab9","updated":"2016-04-08 02:26:26.000000000","message":"yes, that\u0027s just what I had done. sync_start is for aging, switch_features_handler is for other apss to flush framework flows.","commit_id":"4c004fa1d71e5161af746c2bb6218ea5cd7a52a8"}],"dragonflow/db/drivers/ovsdb_vswitch_impl.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2a46f3be26299bd20e77da3274c40e8fafdd9d0a","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        self.pool \u003d eventlet.GreenPool(size\u003d1)"},{"line_number":71,"context_line":"        self.pool.spawn_n(self._wait_event_loop)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _wait_event_loop(self):"},{"line_number":74,"context_line":"        global start_ovsdb_monitor"},{"line_number":75,"context_line":"        while True:"},{"line_number":76,"context_line":"            time.sleep(1)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1af94dfe_3e2f6ff7","line":73,"updated":"2016-03-17 08:12:23.000000000","message":"Consider renaming this method to start_ovsdb_monitor.\nConsider calling this method directly from RyuApp, rather than going through start_ovsdb_monitor global.\n\nThis way you can also do without the additional thread (even though its a cheap greenthread), and you don\u0027t have to poll the global every second.","commit_id":"a469033404090b8b20ff65b3da3a5351708a5d08"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"c297beb4cb8fc2968ab1b0e78c1999ba602549a3","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        self.pool \u003d eventlet.GreenPool(size\u003d1)"},{"line_number":73,"context_line":"        self.pool.spawn_n(self._wait_event_loop)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def _wait_event_loop(self):"},{"line_number":76,"context_line":"        global start_ovsdb_monitor"},{"line_number":77,"context_line":"        while True:"},{"line_number":78,"context_line":"            time.sleep(1)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba0121b8_e5766f05","line":75,"updated":"2016-04-03 14:44:43.000000000","message":"Consider renaming this method to start_ovsdb_monitor.\nConsider calling this method directly from RyuApp, rather than going through start_ovsdb_monitor global.\nThis way you can also do without the additional thread (even though its a cheap greenthread), and you don\u0027t have to poll the global every second.","commit_id":"737316a2946928a8e11a52ac406b83fb0a32a31e"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"4655c914be721432cd26d013c323d9c69ef5a540","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        self.pool \u003d eventlet.GreenPool(size\u003d1)"},{"line_number":73,"context_line":"        self.pool.spawn_n(self._wait_event_loop)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def _wait_event_loop(self):"},{"line_number":76,"context_line":"        global start_ovsdb_monitor"},{"line_number":77,"context_line":"        while True:"},{"line_number":78,"context_line":"            time.sleep(1)"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a061dce_99eee589","line":75,"in_reply_to":"ba0121b8_e5766f05","updated":"2016-04-05 08:09:10.000000000","message":"I made the event notification mechanism to decouple ryu_base_app and ovsdb_monitor, there is nothing else other that notification. if ryu_base_app directly call ovsdb_monitor, ryu_base_app have to provide the initialization params, such as idl, it\u0027s not very good.","commit_id":"737316a2946928a8e11a52ac406b83fb0a32a31e"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"a3b17fd36c1abfdac11d6d82ad45f7d64bfc6057","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        self.pool \u003d eventlet.GreenPool(size\u003d1)"},{"line_number":73,"context_line":"        self.pool.spawn_n(self._wait_event_loop)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def _wait_event_loop(self):"},{"line_number":76,"context_line":"        global start_ovsdb_monitor"},{"line_number":77,"context_line":"        while True:"},{"line_number":78,"context_line":"            time.sleep(1)"}],"source_content_type":"text/x-python","patch_set":21,"id":"9a061dce_9e833d56","line":75,"updated":"2016-04-05 17:30:53.000000000","message":"Could you please explain what you are trying to do here?","commit_id":"9edfe60fac437f0a1d36dc0dbcb690ababca8550"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"f9ba366f28368dac74a02a8e52dba8ea8c5c086f","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        self.pool \u003d eventlet.GreenPool(size\u003d1)"},{"line_number":73,"context_line":"        self.pool.spawn_n(self._wait_event_loop)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def _wait_event_loop(self):"},{"line_number":76,"context_line":"        global start_ovsdb_monitor"},{"line_number":77,"context_line":"        while True:"},{"line_number":78,"context_line":"            time.sleep(1)"}],"source_content_type":"text/x-python","patch_set":21,"id":"9a061dce_769c80c0","line":75,"in_reply_to":"9a061dce_9e833d56","updated":"2016-04-06 02:42:13.000000000","message":"I\u0027ve explained this in patch 14.\nhere what we want to do is choose a right time to start ovsdb_monitor, the time is when openflow handler got called. as for why not calling ovsdb_monitor directly, then we don\u0027t need care about how to init ovsdb_monitor, the change of ovsdb_monitor\u0027s initialization params won\u0027t affect the caller. for example, now adding a idl param to ovsdb_monitor, we don\u0027t need to change any code of notification.","commit_id":"9edfe60fac437f0a1d36dc0dbcb690ababca8550"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5cb0acf38c0e383d753e7a4ba4a302b4a2267fbb","unresolved":false,"context_lines":[{"line_number":111,"context_line":"    def check_controller(self, targets):"},{"line_number":112,"context_line":"        is_controller_set \u003d False"},{"line_number":113,"context_line":"        br_int \u003d idlutils.row_by_value(self.idl, \u0027Bridge\u0027, \u0027name\u0027, \u0027br-int\u0027)"},{"line_number":114,"context_line":"        if br_int.controller[0].target \u003d\u003d targets:"},{"line_number":115,"context_line":"            is_controller_set \u003d True"},{"line_number":116,"context_line":"        return is_controller_set"},{"line_number":117,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"9a061dce_777ef519","line":114,"updated":"2016-04-07 08:21:22.000000000","message":"Is targets a list of connection strings? In that case, consider using \u0027in\u0027, not \u0027\u003d\u003d\u0027.\nOtherwise, consider renaming targets -\u003e target.","commit_id":"4c004fa1d71e5161af746c2bb6218ea5cd7a52a8"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"e8450c7231b0912443885d2c7a8555108bc2d74d","unresolved":false,"context_lines":[{"line_number":111,"context_line":"    def check_controller(self, targets):"},{"line_number":112,"context_line":"        is_controller_set \u003d False"},{"line_number":113,"context_line":"        br_int \u003d idlutils.row_by_value(self.idl, \u0027Bridge\u0027, \u0027name\u0027, \u0027br-int\u0027)"},{"line_number":114,"context_line":"        if br_int.controller[0].target \u003d\u003d targets:"},{"line_number":115,"context_line":"            is_controller_set \u003d True"},{"line_number":116,"context_line":"        return is_controller_set"},{"line_number":117,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"9a061dce_3d2a8a90","line":114,"in_reply_to":"9a061dce_777ef519","updated":"2016-04-08 02:26:26.000000000","message":"I\u0027ll change it to target","commit_id":"4c004fa1d71e5161af746c2bb6218ea5cd7a52a8"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5cb0acf38c0e383d753e7a4ba4a302b4a2267fbb","unresolved":false,"context_lines":[{"line_number":118,"context_line":"    def check_controller_fail_mode(self, fail_mode):"},{"line_number":119,"context_line":"        is_fail_mode_set \u003d False"},{"line_number":120,"context_line":"        br_int \u003d idlutils.row_by_value(self.idl, \u0027Bridge\u0027, \u0027name\u0027, \u0027br-int\u0027)"},{"line_number":121,"context_line":"        if br_int.fail_mode[0] \u003d\u003d fail_mode:"},{"line_number":122,"context_line":"            is_fail_mode_set \u003d True"},{"line_number":123,"context_line":"        return is_fail_mode_set"},{"line_number":124,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"9a061dce_521f7f07","line":121,"updated":"2016-04-07 08:21:22.000000000","message":"If unset, br_int.fail_mode may return an empty list, which will cause an error in this code.","commit_id":"4c004fa1d71e5161af746c2bb6218ea5cd7a52a8"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"e8450c7231b0912443885d2c7a8555108bc2d74d","unresolved":false,"context_lines":[{"line_number":118,"context_line":"    def check_controller_fail_mode(self, fail_mode):"},{"line_number":119,"context_line":"        is_fail_mode_set \u003d False"},{"line_number":120,"context_line":"        br_int \u003d idlutils.row_by_value(self.idl, \u0027Bridge\u0027, \u0027name\u0027, \u0027br-int\u0027)"},{"line_number":121,"context_line":"        if br_int.fail_mode[0] \u003d\u003d fail_mode:"},{"line_number":122,"context_line":"            is_fail_mode_set \u003d True"},{"line_number":123,"context_line":"        return is_fail_mode_set"},{"line_number":124,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"9a061dce_21054810","line":121,"in_reply_to":"9a061dce_521f7f07","updated":"2016-04-08 02:26:26.000000000","message":"I\u0027ll change it","commit_id":"4c004fa1d71e5161af746c2bb6218ea5cd7a52a8"}],"dragonflow/tests/common/utils.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5cb0acf38c0e383d753e7a4ba4a302b4a2267fbb","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                continue"},{"line_number":68,"context_line":"            fs \u003d flow.split(\u0027 \u0027)"},{"line_number":69,"context_line":"            res \u003d {}"},{"line_number":70,"context_line":"            res[\u0027table\u0027] \u003d fs[3].split(\u0027\u003d\u0027)[1].replace(\u0027,\u0027, \u0027\u0027)"},{"line_number":71,"context_line":"            res[\u0027match\u0027] \u003d fs[-2]"},{"line_number":72,"context_line":"            res[\u0027actions\u0027] \u003d fs[-1].split(\u0027\u003d\u0027)[1]"},{"line_number":73,"context_line":"            res[\u0027cookie\u0027] \u003d fs[1].split(\u0027\u003d\u0027)[1].replace(\u0027,\u0027, \u0027\u0027)"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a061dce_ad603ed0","line":70,"updated":"2016-04-07 08:21:22.000000000","message":"There exists code that relies on the comma at the end of the table name. Consider correcting it as well.","commit_id":"4c004fa1d71e5161af746c2bb6218ea5cd7a52a8"}],"dragonflow/tests/unit/test_ryu_base_app.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"c297beb4cb8fc2968ab1b0e78c1999ba602549a3","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    def setUp(self):"},{"line_number":32,"context_line":"        super(TestRyuDFAdapter, self).setUp()"},{"line_number":33,"context_line":"        self.db_store \u003d mock.Mock()"},{"line_number":34,"context_line":"        cfg.CONF \u003d mock.Mock()"},{"line_number":35,"context_line":"        self.ryu_df_adapter \u003d RyuDFAdapter(db_store\u003dself.db_store)"},{"line_number":36,"context_line":"        self.mock_app \u003d mock.Mock(spec\u003d["},{"line_number":37,"context_line":"                \u0027update_logical_switch\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba0121b8_85505360","line":34,"updated":"2016-04-03 14:44:43.000000000","message":"Wouldn\u0027t this cause the tests that come afterwards to fail?","commit_id":"737316a2946928a8e11a52ac406b83fb0a32a31e"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"4655c914be721432cd26d013c323d9c69ef5a540","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    def setUp(self):"},{"line_number":32,"context_line":"        super(TestRyuDFAdapter, self).setUp()"},{"line_number":33,"context_line":"        self.db_store \u003d mock.Mock()"},{"line_number":34,"context_line":"        cfg.CONF \u003d mock.Mock()"},{"line_number":35,"context_line":"        self.ryu_df_adapter \u003d RyuDFAdapter(db_store\u003dself.db_store)"},{"line_number":36,"context_line":"        self.mock_app \u003d mock.Mock(spec\u003d["},{"line_number":37,"context_line":"                \u0027update_logical_switch\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a061dce_99bc256e","line":34,"in_reply_to":"ba0121b8_85505360","updated":"2016-04-05 08:09:10.000000000","message":"all tests passed locally, here just delete a single test, because we move the notification from OpenFlow handler to ovsdb monitor, I\u0027ll try to find the reason others tests failed.","commit_id":"737316a2946928a8e11a52ac406b83fb0a32a31e"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5cb0acf38c0e383d753e7a4ba4a302b4a2267fbb","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    def setUp(self):"},{"line_number":31,"context_line":"        super(TestRyuDFAdapter, self).setUp()"},{"line_number":32,"context_line":"        self.db_store \u003d mock.Mock()"},{"line_number":33,"context_line":"        cfg.CONF \u003d mock.Mock()"},{"line_number":34,"context_line":"        self.ryu_df_adapter \u003d RyuDFAdapter(db_store\u003dself.db_store)"},{"line_number":35,"context_line":"        self.mock_app \u003d mock.Mock(spec\u003d["},{"line_number":36,"context_line":"                \u0027update_logical_switch\u0027,"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a061dce_cdf4925c","line":33,"updated":"2016-04-07 08:21:22.000000000","message":"Doesn\u0027t this cause failures in tests running after TestRyuDFAdapter?","commit_id":"4c004fa1d71e5161af746c2bb6218ea5cd7a52a8"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"e8450c7231b0912443885d2c7a8555108bc2d74d","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    def setUp(self):"},{"line_number":31,"context_line":"        super(TestRyuDFAdapter, self).setUp()"},{"line_number":32,"context_line":"        self.db_store \u003d mock.Mock()"},{"line_number":33,"context_line":"        cfg.CONF \u003d mock.Mock()"},{"line_number":34,"context_line":"        self.ryu_df_adapter \u003d RyuDFAdapter(db_store\u003dself.db_store)"},{"line_number":35,"context_line":"        self.mock_app \u003d mock.Mock(spec\u003d["},{"line_number":36,"context_line":"                \u0027update_logical_switch\u0027,"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a061dce_01900494","line":33,"in_reply_to":"9a061dce_cdf4925c","updated":"2016-04-08 02:26:26.000000000","message":"what failures do you got?\nI don\u0027t have any failures when testing.","commit_id":"4c004fa1d71e5161af746c2bb6218ea5cd7a52a8"}],"test-requirements.txt":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"a3b17fd36c1abfdac11d6d82ad45f7d64bfc6057","unresolved":false,"context_lines":[{"line_number":19,"context_line":"netaddr!\u003d0.7.16,\u003e\u003d0.7.12 # BSD"},{"line_number":20,"context_line":"pecan\u003e\u003d1.0.0 # BSD"},{"line_number":21,"context_line":"PasteDeploy\u003e\u003d1.5.0 # MIT"},{"line_number":22,"context_line":"Jinja2\u003e\u003d2.8 # BSD"},{"line_number":23,"context_line":"greenlet\u003e\u003d0.3.2 # MIT"}],"source_content_type":"text/plain","patch_set":21,"id":"9a061dce_1e744d66","line":22,"updated":"2016-04-05 17:30:53.000000000","message":"The lines here must match the respective lines in openstack/requirements/global-requirements.txt (https://github.com/openstack/requirements/blob/master/global-requirements.txt). Otherwise, the gate tests fails.","commit_id":"9edfe60fac437f0a1d36dc0dbcb690ababca8550"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"f9ba366f28368dac74a02a8e52dba8ea8c5c086f","unresolved":false,"context_lines":[{"line_number":19,"context_line":"netaddr!\u003d0.7.16,\u003e\u003d0.7.12 # BSD"},{"line_number":20,"context_line":"pecan\u003e\u003d1.0.0 # BSD"},{"line_number":21,"context_line":"PasteDeploy\u003e\u003d1.5.0 # MIT"},{"line_number":22,"context_line":"Jinja2\u003e\u003d2.8 # BSD"},{"line_number":23,"context_line":"greenlet\u003e\u003d0.3.2 # MIT"}],"source_content_type":"text/plain","patch_set":21,"id":"9a061dce_96f794f4","line":22,"in_reply_to":"9a061dce_1e744d66","updated":"2016-04-06 02:42:13.000000000","message":"I\u0027ll make a new patch for these new requirement and delete the requirement.txt from the current patch, for fullstack to work normally, I\u0027ll add several temporary shell commands to tools/tox_install.sh.","commit_id":"9edfe60fac437f0a1d36dc0dbcb690ababca8550"},{"author":{"_account_id":20336,"name":"heshan","email":"shan.he@huawei.com","username":"shanhe"},"change_message_id":"5366e6bf3cdf9fc41f7970d0b86966534e34b6a5","unresolved":false,"context_lines":[{"line_number":19,"context_line":"netaddr!\u003d0.7.16,\u003e\u003d0.7.12 # BSD"},{"line_number":20,"context_line":"pecan\u003e\u003d1.0.0 # BSD"},{"line_number":21,"context_line":"PasteDeploy\u003e\u003d1.5.0 # MIT"},{"line_number":22,"context_line":"Jinja2\u003e\u003d2.8 # BSD"},{"line_number":23,"context_line":"greenlet\u003e\u003d0.3.2 # MIT"}],"source_content_type":"text/plain","patch_set":21,"id":"9a061dce_1673844e","line":22,"in_reply_to":"9a061dce_96f794f4","updated":"2016-04-06 03:01:04.000000000","message":"After comparing with the global-requirement.txt, I found those requirements added are all listed in the global-requirements, I\u0027ve modified them to be same.","commit_id":"9edfe60fac437f0a1d36dc0dbcb690ababca8550"}]}
