)]}'
{"neutron/agent/l3_agent.py":[{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"5bb64d71184b6fe2de965500fa64e4fcec5c61a8","unresolved":false,"context_lines":[{"line_number":829,"context_line":"        adds, removes \u003d common_utils.diff_list_of_dict(old_portfwds,"},{"line_number":830,"context_line":"                                                       new_portfwds)"},{"line_number":831,"context_line":"        for portfwd in adds:"},{"line_number":832,"context_line":"            self._update_portforwardings(ri, \u0027create\u0027, portfwd)"},{"line_number":833,"context_line":"        for portfwd in removes:"},{"line_number":834,"context_line":"            self._update_portforwardings(ri, \u0027delete\u0027, portfwd)"},{"line_number":835,"context_line":"        ri.portforwardings \u003d new_portfwds"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2F91U%3D","line":832,"updated":"2013-12-26 06:21:08.000000000","message":"what happened if just ri.router.get(\u0027gw_port\u0027) is changed?","commit_id":"1dcd4fa383133630c1b609bb7849f2fc05c0a540"}],"neutron/db/portforwardings_db.py":[{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"842b850d46ea9a4920fc792dd68c6e2861da9c00","unresolved":false,"context_lines":[{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class PortForwardingRule(model_base.BASEV2):"},{"line_number":35,"context_line":"    router_id \u003d sa.Column(sa.String(36),"},{"line_number":36,"context_line":"                          sa.ForeignKey(\u0027routers.id\u0027,"},{"line_number":37,"context_line":"                                        ondelete\u003d\"CASCADE\"),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9qCY%3D","line":34,"updated":"2013-12-09 07:51:19.000000000","message":"I think we should add an \u0027id\u0027 column as a primary key,\nand add unique index on \u0027router_id, protocol, outside_addr, ourside_port\u0027\nand add another unique index on \u0027router_id, protocol, inside_addr, inside_port\u0027\nright?\nto make all columns as primary key is not a good idea.","commit_id":"31bff1af9cdf939f3756f258b2d68034c4586c29"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"0b2460486831b2477128e02a0915e93fd82e490a","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                              backref\u003dorm.backref(\"portforwarding_list\","},{"line_number":42,"context_line":"                                                  lazy\u003d\u0027joined\u0027,"},{"line_number":43,"context_line":"                                                  cascade\u003d\u0027delete\u0027))"},{"line_number":44,"context_line":"    outside_addr \u003d sa.Column(sa.String(15))"},{"line_number":45,"context_line":"    outside_port \u003d sa.Column(sa.String(15))"},{"line_number":46,"context_line":"    inside_addr \u003d sa.Column(sa.String(15))"},{"line_number":47,"context_line":"    inside_port \u003d sa.Column(sa.String(15))"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9dfA%3D","line":44,"updated":"2013-12-11 09:32:20.000000000","message":"have you considered that we don\u0027t keep the outside_addr here. We can have outside address derived from the gateway interface of router?","commit_id":"66ebb9d7c933eee47867628951045b311adfd386"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"5ada50f5e7f7c6b8ddd8967b8da851faba44947d","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                              backref\u003dorm.backref(\"portforwarding_list\","},{"line_number":42,"context_line":"                                                  lazy\u003d\u0027joined\u0027,"},{"line_number":43,"context_line":"                                                  cascade\u003d\u0027delete\u0027))"},{"line_number":44,"context_line":"    outside_addr \u003d sa.Column(sa.String(15))"},{"line_number":45,"context_line":"    outside_port \u003d sa.Column(sa.String(15))"},{"line_number":46,"context_line":"    inside_addr \u003d sa.Column(sa.String(15))"},{"line_number":47,"context_line":"    inside_port \u003d sa.Column(sa.String(15))"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9dv8%3D","line":44,"updated":"2013-12-11 08:34:14.000000000","message":"ip addr had better use sa.Column(sa.String(255))","commit_id":"66ebb9d7c933eee47867628951045b311adfd386"},{"author":{"_account_id":7676,"name":"Jianing Yang","email":"jianingy.yang@gmail.com","username":"jianingy"},"change_message_id":"17549151419c5ea5773756199ada6e89b180f782","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                              backref\u003dorm.backref(\"portforwarding_list\","},{"line_number":42,"context_line":"                                                  lazy\u003d\u0027joined\u0027,"},{"line_number":43,"context_line":"                                                  cascade\u003d\u0027delete\u0027))"},{"line_number":44,"context_line":"    outside_addr \u003d sa.Column(sa.String(15))"},{"line_number":45,"context_line":"    outside_port \u003d sa.Column(sa.String(15))"},{"line_number":46,"context_line":"    inside_addr \u003d sa.Column(sa.String(15))"},{"line_number":47,"context_line":"    inside_port \u003d sa.Column(sa.String(15))"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9dCw%3D","line":44,"in_reply_to":"AAAATn%2F9dfA%3D","updated":"2013-12-11 11:28:38.000000000","message":"I thought about we may allow port forwarding between internal networks not just from external gateway address. But I am not sure about that. I think we should have a discuss if it is necessary to support internal network port forwarding","commit_id":"66ebb9d7c933eee47867628951045b311adfd386"},{"author":{"_account_id":7676,"name":"Jianing Yang","email":"jianingy.yang@gmail.com","username":"jianingy"},"change_message_id":"000ceeb7c38de5947839beb90b49f8a6b07eff8d","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                              backref\u003dorm.backref(\"portforwarding_list\","},{"line_number":42,"context_line":"                                                  lazy\u003d\u0027joined\u0027,"},{"line_number":43,"context_line":"                                                  cascade\u003d\u0027delete\u0027))"},{"line_number":44,"context_line":"    outside_addr \u003d sa.Column(sa.String(15))"},{"line_number":45,"context_line":"    outside_port \u003d sa.Column(sa.String(15))"},{"line_number":46,"context_line":"    inside_addr \u003d sa.Column(sa.String(15))"},{"line_number":47,"context_line":"    inside_port \u003d sa.Column(sa.String(15))"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9c2E%3D","line":44,"in_reply_to":"AAAATn%2F9dfA%3D","updated":"2013-12-11 11:59:48.000000000","message":"ok. I think I gonna removed outside_addr. I\u0027ll find an outside addr  by external gateway address. For internal networks, they can be routed so they don\u0027t need NAT. :)","commit_id":"66ebb9d7c933eee47867628951045b311adfd386"},{"author":{"_account_id":7676,"name":"Jianing Yang","email":"jianingy.yang@gmail.com","username":"jianingy"},"change_message_id":"17549151419c5ea5773756199ada6e89b180f782","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                              backref\u003dorm.backref(\"portforwarding_list\","},{"line_number":42,"context_line":"                                                  lazy\u003d\u0027joined\u0027,"},{"line_number":43,"context_line":"                                                  cascade\u003d\u0027delete\u0027))"},{"line_number":44,"context_line":"    outside_addr \u003d sa.Column(sa.String(15))"},{"line_number":45,"context_line":"    outside_port \u003d sa.Column(sa.String(15))"},{"line_number":46,"context_line":"    inside_addr \u003d sa.Column(sa.String(15))"},{"line_number":47,"context_line":"    inside_port \u003d sa.Column(sa.String(15))"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9dEY%3D","line":44,"in_reply_to":"AAAATn%2F9dv8%3D","updated":"2013-12-11 11:28:38.000000000","message":"we only consider IPv4 addresses so 15 is enough.","commit_id":"66ebb9d7c933eee47867628951045b311adfd386"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"5ada50f5e7f7c6b8ddd8967b8da851faba44947d","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    outside_addr \u003d sa.Column(sa.String(15))"},{"line_number":45,"context_line":"    outside_port \u003d sa.Column(sa.String(15))"},{"line_number":46,"context_line":"    inside_addr \u003d sa.Column(sa.String(15))"},{"line_number":47,"context_line":"    inside_port \u003d sa.Column(sa.String(15))"},{"line_number":48,"context_line":"    # NOTE(jianingy): protocol can be either TCP or UDP"},{"line_number":49,"context_line":"    protocol \u003d sa.Column(sa.String(4))"},{"line_number":50,"context_line":"    __table_args__ \u003d (sa.schema.UniqueConstraint(\u0027outside_addr\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9dwE%3D","line":47,"updated":"2013-12-11 08:34:14.000000000","message":"why not use int?","commit_id":"66ebb9d7c933eee47867628951045b311adfd386"},{"author":{"_account_id":7676,"name":"Jianing Yang","email":"jianingy.yang@gmail.com","username":"jianingy"},"change_message_id":"17549151419c5ea5773756199ada6e89b180f782","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    outside_addr \u003d sa.Column(sa.String(15))"},{"line_number":45,"context_line":"    outside_port \u003d sa.Column(sa.String(15))"},{"line_number":46,"context_line":"    inside_addr \u003d sa.Column(sa.String(15))"},{"line_number":47,"context_line":"    inside_port \u003d sa.Column(sa.String(15))"},{"line_number":48,"context_line":"    # NOTE(jianingy): protocol can be either TCP or UDP"},{"line_number":49,"context_line":"    protocol \u003d sa.Column(sa.String(4))"},{"line_number":50,"context_line":"    __table_args__ \u003d (sa.schema.UniqueConstraint(\u0027outside_addr\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9dCo%3D","line":47,"in_reply_to":"AAAATn%2F9dwE%3D","updated":"2013-12-11 11:28:38.000000000","message":"will fix this","commit_id":"66ebb9d7c933eee47867628951045b311adfd386"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"5ada50f5e7f7c6b8ddd8967b8da851faba44947d","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    inside_port \u003d sa.Column(sa.String(15))"},{"line_number":48,"context_line":"    # NOTE(jianingy): protocol can be either TCP or UDP"},{"line_number":49,"context_line":"    protocol \u003d sa.Column(sa.String(4))"},{"line_number":50,"context_line":"    __table_args__ \u003d (sa.schema.UniqueConstraint(\u0027outside_addr\u0027,"},{"line_number":51,"context_line":"                                                 \u0027outside_port\u0027,"},{"line_number":52,"context_line":"                                                 \u0027inside_addr\u0027,"},{"line_number":53,"context_line":"                                                 \u0027inside_port\u0027),)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9dv0%3D","line":50,"updated":"2013-12-11 08:34:14.000000000","message":"should add router_id into the unique constraint","commit_id":"66ebb9d7c933eee47867628951045b311adfd386"},{"author":{"_account_id":7676,"name":"Jianing Yang","email":"jianingy.yang@gmail.com","username":"jianingy"},"change_message_id":"17549151419c5ea5773756199ada6e89b180f782","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    inside_port \u003d sa.Column(sa.String(15))"},{"line_number":48,"context_line":"    # NOTE(jianingy): protocol can be either TCP or UDP"},{"line_number":49,"context_line":"    protocol \u003d sa.Column(sa.String(4))"},{"line_number":50,"context_line":"    __table_args__ \u003d (sa.schema.UniqueConstraint(\u0027outside_addr\u0027,"},{"line_number":51,"context_line":"                                                 \u0027outside_port\u0027,"},{"line_number":52,"context_line":"                                                 \u0027inside_addr\u0027,"},{"line_number":53,"context_line":"                                                 \u0027inside_port\u0027),)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9dCc%3D","line":50,"in_reply_to":"AAAATn%2F9dv0%3D","updated":"2013-12-11 11:28:38.000000000","message":"of course. my mistake :(","commit_id":"66ebb9d7c933eee47867628951045b311adfd386"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"f30b32ffceb35cb709e4b8aa527379587248ae12","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    #                 external ip address"},{"line_number":50,"context_line":"    outside_port \u003d sa.Column(sa.String(15), unique\u003dTrue)"},{"line_number":51,"context_line":"    inside_addr \u003d sa.Column(sa.String(15))"},{"line_number":52,"context_line":"    inside_port \u003d sa.Column(sa.String(15))"},{"line_number":53,"context_line":"    # NOTE(jianingy): protocol can be either TCP or UDP"},{"line_number":54,"context_line":"    protocol \u003d sa.Column(sa.String(4))"},{"line_number":55,"context_line":"    __table_args__ \u003d (sa.schema.UniqueConstraint(\u0027outside_port\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9DR4%3D","line":52,"updated":"2013-12-17 09:27:44.000000000","message":"why use string instead of int?","commit_id":"2d454eeb2798fcea56002caa928666bf6754917c"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"3439c967dbecc765c8729f1d249aaa61909cd258","unresolved":false,"context_lines":[{"line_number":47,"context_line":"                                                  cascade\u003d\u0027delete\u0027))"},{"line_number":48,"context_line":"    # NOTE(jianingy): outside_port should be unique as we only have one"},{"line_number":49,"context_line":"    #                 external ip address"},{"line_number":50,"context_line":"    outside_port \u003d sa.Column(sa.Integer(), unique\u003dTrue)"},{"line_number":51,"context_line":"    inside_addr \u003d sa.Column(sa.String(15))"},{"line_number":52,"context_line":"    inside_port \u003d sa.Column(sa.Integer())"},{"line_number":53,"context_line":"    # NOTE(jianingy): protocol can be either TCP or UDP"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F85Ek%3D","line":50,"updated":"2013-12-19 04:20:16.000000000","message":"it should be router_id , outside_port and protocol combination is unique, not the outside_port itself. right?","commit_id":"24781dab66582db37905d80b1a01b25878db9f94"},{"author":{"_account_id":7676,"name":"Jianing Yang","email":"jianingy.yang@gmail.com","username":"jianingy"},"change_message_id":"ac06522d026bc6734f3cfc2d6e56e9c3483f1100","unresolved":false,"context_lines":[{"line_number":47,"context_line":"                                                  cascade\u003d\u0027delete\u0027))"},{"line_number":48,"context_line":"    # NOTE(jianingy): outside_port should be unique as we only have one"},{"line_number":49,"context_line":"    #                 external ip address"},{"line_number":50,"context_line":"    outside_port \u003d sa.Column(sa.Integer(), unique\u003dTrue)"},{"line_number":51,"context_line":"    inside_addr \u003d sa.Column(sa.String(15))"},{"line_number":52,"context_line":"    inside_port \u003d sa.Column(sa.Integer())"},{"line_number":53,"context_line":"    # NOTE(jianingy): protocol can be either TCP or UDP"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F84%2BQ%3D","line":50,"in_reply_to":"AAAATn%2F85Ek%3D","updated":"2013-12-19 05:18:50.000000000","message":"not really. we have two unique constraints here. one for outside_port only, the other for tuple (\u0027outside_port\u0027, \u0027inside_addr\u0027 , \u0027inside_port\u0027), please refer __table_args__","commit_id":"24781dab66582db37905d80b1a01b25878db9f94"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"5bb64d71184b6fe2de965500fa64e4fcec5c61a8","unresolved":false,"context_lines":[{"line_number":56,"context_line":"                                                 \u0027outside_port\u0027,"},{"line_number":57,"context_line":"                                                 \u0027inside_addr\u0027,"},{"line_number":58,"context_line":"                                                 \u0027inside_port\u0027,"},{"line_number":59,"context_line":"                                                 name\u003d\u0027rule\u0027),"},{"line_number":60,"context_line":"                      sa.schema.UniqueConstraint(\u0027router_id\u0027,"},{"line_number":61,"context_line":"                                                 \u0027protocol\u0027,"},{"line_number":62,"context_line":"                                                 \u0027outside_port\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2F%2BDc%3D","line":59,"updated":"2013-12-26 06:21:08.000000000","message":"I think the above rule are useless","commit_id":"1dcd4fa383133630c1b609bb7849f2fc05c0a540"}],"neutron/extensions/portforwardings.py":[{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"68895c5315d6899de8018a17834278ea95d2ce94","unresolved":false,"context_lines":[{"line_number":23,"context_line":"# Attribute Map"},{"line_number":24,"context_line":"EXTENDED_ATTRIBUTES_2_0 \u003d {"},{"line_number":25,"context_line":"    \u0027routers\u0027: {"},{"line_number":26,"context_line":"        \u0027portforwardings\u0027: {"},{"line_number":27,"context_line":"            \u0027allow_post\u0027: False, \u0027allow_put\u0027: True,"},{"line_number":28,"context_line":"            \u0027validate\u0027: {\u0027type:portforwardings\u0027: None},"},{"line_number":29,"context_line":"            \u0027convert_to\u0027: attributes.convert_none_to_empty_list,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9dgY%3D","line":26,"updated":"2013-12-11 09:27:40.000000000","message":"in general, we use \u003cextension alias\u003e: as the attr name prefix for extend attrs.","commit_id":"66ebb9d7c933eee47867628951045b311adfd386"},{"author":{"_account_id":7676,"name":"Jianing Yang","email":"jianingy.yang@gmail.com","username":"jianingy"},"change_message_id":"17549151419c5ea5773756199ada6e89b180f782","unresolved":false,"context_lines":[{"line_number":23,"context_line":"# Attribute Map"},{"line_number":24,"context_line":"EXTENDED_ATTRIBUTES_2_0 \u003d {"},{"line_number":25,"context_line":"    \u0027routers\u0027: {"},{"line_number":26,"context_line":"        \u0027portforwardings\u0027: {"},{"line_number":27,"context_line":"            \u0027allow_post\u0027: False, \u0027allow_put\u0027: True,"},{"line_number":28,"context_line":"            \u0027validate\u0027: {\u0027type:portforwardings\u0027: None},"},{"line_number":29,"context_line":"            \u0027convert_to\u0027: attributes.convert_none_to_empty_list,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9dA0%3D","line":26,"in_reply_to":"AAAATn%2F9dgY%3D","updated":"2013-12-11 11:28:38.000000000","message":"I think it is better to use plural form as the name of a attribute. maybe I can change the alias to portforwardings. I left this difference because I saw portbinding extension also not have a consistent between its attribute name and alias","commit_id":"66ebb9d7c933eee47867628951045b311adfd386"}],"neutron/services/l3_router/l3_router_plugin.py":[{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"5e39eef993e68ee79a2248ead2f1c8fe0e7c89cf","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                     extraroute_db.ExtraRoute_db_mixin,"},{"line_number":55,"context_line":"                     l3_gwmode_db.L3_NAT_db_mixin,"},{"line_number":56,"context_line":"                     l3_agentschedulers_db.L3AgentSchedulerDbMixin,"},{"line_number":57,"context_line":"                     portforwardings_db.PortForwardingDbMixin,):"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    \"\"\"Implementation of the Neutron L3 Router Service Plugin."},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F90o%3D","line":57,"updated":"2013-12-26 06:24:21.000000000","message":"sicne portforwardingdbmixin derives from l3_db.L3_NAT_db_mixin, do we still need to add l3_gwmode_db.L3_NAT_db_mixin here?","commit_id":"a6ea8cafa100096707cce29c4ab3edd614dd199e"},{"author":{"_account_id":7676,"name":"Jianing Yang","email":"jianingy.yang@gmail.com","username":"jianingy"},"change_message_id":"c7a1309fc4d8cd80ba9fe151221d9fa85d8a1539","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                     extraroute_db.ExtraRoute_db_mixin,"},{"line_number":55,"context_line":"                     l3_gwmode_db.L3_NAT_db_mixin,"},{"line_number":56,"context_line":"                     l3_agentschedulers_db.L3AgentSchedulerDbMixin,"},{"line_number":57,"context_line":"                     portforwardings_db.PortForwardingDbMixin,):"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    \"\"\"Implementation of the Neutron L3 Router Service Plugin."},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F2Q0%3D","line":57,"in_reply_to":"AAAAT3%2F%2F90o%3D","updated":"2013-12-30 08:33:29.000000000","message":"I think it won\u0027t be a problem as methods of their common parents  will only be called once.","commit_id":"a6ea8cafa100096707cce29c4ab3edd614dd199e"}]}
