)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"99fbaf9800c4aeff933533f9fe2036a19710bda5","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch combines infrastructure required changes and"},{"line_number":10,"context_line":"new sNAT application (chassis based sNAT)."},{"line_number":11,"context_line":"There is another stategy mode (tenant sNAT to be delivered separately"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Chassis sNAT mode has 2 configuration parameters"},{"line_number":14,"context_line":" - external_host_ip"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1a430d35_2be07e28","line":11,"range":{"start_line":11,"start_character":17,"end_line":11,"end_character":24},"updated":"2017-02-09 12:48:00.000000000","message":"strategy","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"db7d2307209741da5c7d3d4b2e22bc7658a4681f","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch combines infrastructure required changes and"},{"line_number":10,"context_line":"new sNAT application (chassis based sNAT)."},{"line_number":11,"context_line":"There is another stategy mode (tenant sNAT to be delivered separately"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Chassis sNAT mode has 2 configuration parameters"},{"line_number":14,"context_line":" - external_host_ip"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"fa31d9ce_32e98d81","line":11,"range":{"start_line":11,"start_character":17,"end_line":11,"end_character":24},"in_reply_to":"1a430d35_2be07e28","updated":"2017-02-12 13:03:20.000000000","message":"Done","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"0150553891f25aabaf53a1c9a68f2e0ea861f877","unresolved":false,"context_lines":[{"line_number":18,"context_line":"and will be further moved to provider_networks app"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"UpgradeImpact: OVS version\u003e\u003d2.6"},{"line_number":21,"context_line":"Implements: blueprint snat-distribution"},{"line_number":22,"context_line":"Change-Id: I7aadb10489d2bee7b2662be83da05a206afed786"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"fa31d9ce_0f1c6276","line":21,"range":{"start_line":21,"start_character":0,"end_line":21,"end_character":10},"updated":"2017-02-12 07:29:26.000000000","message":"Better put \u0027partially implements\u0027, since this patch is missing functional test.","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"db7d2307209741da5c7d3d4b2e22bc7658a4681f","unresolved":false,"context_lines":[{"line_number":18,"context_line":"and will be further moved to provider_networks app"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"UpgradeImpact: OVS version\u003e\u003d2.6"},{"line_number":21,"context_line":"Implements: blueprint snat-distribution"},{"line_number":22,"context_line":"Change-Id: I7aadb10489d2bee7b2662be83da05a206afed786"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"fa31d9ce_72030543","line":21,"range":{"start_line":21,"start_character":0,"end_line":21,"end_character":10},"in_reply_to":"fa31d9ce_0f1c6276","updated":"2017-02-12 13:03:20.000000000","message":"OK","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"}],"devstack/plugin.sh":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7ee80437d51ed4fe02f6c7dd0e24c516e5395209","unresolved":false,"context_lines":[{"line_number":53,"context_line":"#Set empty SNAT_HOST_IP"},{"line_number":54,"context_line":"SNAT_HOST_IP\u003d${SNAT_HOST_IP:-}"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"ACTION\u003d$1"},{"line_number":59,"context_line":"STAGE\u003d$2"}],"source_content_type":"text/x-sh","patch_set":5,"id":"da36d5c6_82056c7b","line":56,"range":{"start_line":56,"start_character":0,"end_line":56,"end_character":0},"updated":"2017-02-23 03:51:06.000000000","message":"extra empty lines","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7ee80437d51ed4fe02f6c7dd0e24c516e5395209","unresolved":false,"context_lines":[{"line_number":249,"context_line":"    iniset $DRAGONFLOW_CONF df_dnat_app int_peer_patch_port \"$INTEGRATION_PEER_PORT\""},{"line_number":250,"context_line":"    iniset $DRAGONFLOW_CONF df_dnat_app ex_peer_patch_port \"$PUBLIC_PEER_PORT\""},{"line_number":251,"context_line":"    if [[ ! -z ${SNAT_HOST_IP} ]]; then"},{"line_number":252,"context_line":"\tiniset $DRAGONFLOW_CONF df_snat_app external_host_ip \"$SNAT_HOST_IP\""},{"line_number":253,"context_line":"    fi"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"    if [[ \"$DF_PUB_SUB\" \u003d\u003d \"True\" ]]; then"}],"source_content_type":"text/x-sh","patch_set":5,"id":"da36d5c6_42f45485","line":252,"updated":"2017-02-23 03:51:06.000000000","message":"looks like a tab here. spaces are preferred.","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"2edad130b7627cc04aa0bbfdaa77d932cddd788b","unresolved":false,"context_lines":[{"line_number":249,"context_line":"    iniset $DRAGONFLOW_CONF df_dnat_app int_peer_patch_port \"$INTEGRATION_PEER_PORT\""},{"line_number":250,"context_line":"    iniset $DRAGONFLOW_CONF df_dnat_app ex_peer_patch_port \"$PUBLIC_PEER_PORT\""},{"line_number":251,"context_line":"    if [[ ! -z ${SNAT_HOST_IP} ]]; then"},{"line_number":252,"context_line":"\tiniset $DRAGONFLOW_CONF df_snat_app external_host_ip \"$SNAT_HOST_IP\""},{"line_number":253,"context_line":"    fi"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"    if [[ \"$DF_PUB_SUB\" \u003d\u003d \"True\" ]]; then"}],"source_content_type":"text/x-sh","patch_set":5,"id":"da36d5c6_1fafe0e2","line":252,"in_reply_to":"da36d5c6_42f45485","updated":"2017-02-23 14:04:06.000000000","message":"fixed","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"bd695035345b24bcbfba66935a0d0e6b06e54577","unresolved":false,"context_lines":[{"line_number":18,"context_line":"\"dhcp_app.DHCPApp,dnat_app.DNATApp,sg_app.SGApp,portsec_app.PortSecApp,\"\\"},{"line_number":19,"context_line":"\"portqos_app.PortQosApp,classifier_app.ClassifierApp,tunneling_app.TunnelingApp,\"\\"},{"line_number":20,"context_line":"\"provider_networks_app.ProviderNetworksApp,chassis_snat_app.ChassisSNATApp\""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"if is_service_enabled df-metadata ; then"},{"line_number":23,"context_line":"    DEFAULT_APPS_LIST\u003d\"$DEFAULT_APPS_LIST,metadata_service_app.MetadataServiceApp\""},{"line_number":24,"context_line":"fi"}],"source_content_type":"text/x-sh","patch_set":13,"id":"ba2be162_25a3b79e","line":21,"updated":"2017-03-03 04:53:47.000000000","message":"this app is optional and relies on SNAT_HOST_IP. do not add it to DEFAULT_APPS_LIST directly.\n\nfor example, \n\nif set $SNAT_HOST_IP, then: add ChassisSNATApp to DEFAULT_APPS_LIST.\n\njust like the metadata service.","commit_id":"0fd67ac14b0b46dc22ebf17279a480245f517db2"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"2898ab91c4b4cc3de913b68113137a2556004b47","unresolved":false,"context_lines":[{"line_number":18,"context_line":"\"dhcp_app.DHCPApp,dnat_app.DNATApp,sg_app.SGApp,portsec_app.PortSecApp,\"\\"},{"line_number":19,"context_line":"\"portqos_app.PortQosApp,classifier_app.ClassifierApp,tunneling_app.TunnelingApp,\"\\"},{"line_number":20,"context_line":"\"provider_networks_app.ProviderNetworksApp,chassis_snat_app.ChassisSNATApp\""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"if is_service_enabled df-metadata ; then"},{"line_number":23,"context_line":"    DEFAULT_APPS_LIST\u003d\"$DEFAULT_APPS_LIST,metadata_service_app.MetadataServiceApp\""},{"line_number":24,"context_line":"fi"}],"source_content_type":"text/x-sh","patch_set":13,"id":"ba2be162_8de7ecaa","line":21,"in_reply_to":"ba2be162_25a3b79e","updated":"2017-03-05 13:03:16.000000000","message":"Done","commit_id":"0fd67ac14b0b46dc22ebf17279a480245f517db2"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e0fb8af1037e69433f8fd8988e98eef22c0cf93a","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    DEFAULT_APPS_LIST\u003d\"$DEFAULT_APPS_LIST,active_port_detection_app.ActivePortDetectionApp\""},{"line_number":32,"context_line":"fi"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"if [[ ! -z ${SNAT_HOST_IP} ]]; then"},{"line_number":35,"context_line":"    DEFAULT_APPS_LIST\u003d\"$DEFAULT_APPS_LIST,chassis_snat_app.ChassisSNATApp\""},{"line_number":36,"context_line":"fi"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-sh","patch_set":16,"id":"1a1ced50_f2d444be","line":34,"range":{"start_line":34,"start_character":6,"end_line":34,"end_character":10},"updated":"2017-03-20 18:27:11.000000000","message":"nit: same as -n","commit_id":"00d4af55ab1adbcabc62ca72f8c98b9640719367"}],"dragonflow/common/constants.py":[{"author":{"_account_id":18347,"name":"Itamar Ofek","email":"itamofek@netscape.net","username":"itamaro"},"change_message_id":"0beb545381c9d922893e4fe2839cfdc3aa6e743e","unresolved":false,"context_lines":[{"line_number":10,"context_line":"# implied."},{"line_number":11,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":12,"context_line":"# limitations under the License."},{"line_number":13,"context_line":"from neutron_lib import constants as n_const"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"DRAGONFLOW_VIRTUAL_PORT \u003d \"DragonflowVirtualPort\""},{"line_number":16,"context_line":"OVS_INTERFACE \u003d \"ovsinterface\""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_72f94580","line":13,"range":{"start_line":13,"start_character":5,"end_line":13,"end_character":16},"updated":"2017-02-12 08:52:00.000000000","message":"doesn\u0027t it binds df harder ro neutron?","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"db7d2307209741da5c7d3d4b2e22bc7658a4681f","unresolved":false,"context_lines":[{"line_number":10,"context_line":"# implied."},{"line_number":11,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":12,"context_line":"# limitations under the License."},{"line_number":13,"context_line":"from neutron_lib import constants as n_const"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"DRAGONFLOW_VIRTUAL_PORT \u003d \"DragonflowVirtualPort\""},{"line_number":16,"context_line":"OVS_INTERFACE \u003d \"ovsinterface\""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_9208792f","line":13,"range":{"start_line":13,"start_character":5,"end_line":13,"end_character":16},"in_reply_to":"fa31d9ce_72f94580","updated":"2017-02-12 13:03:20.000000000","message":"neutron dependencies appear in a plenty of places across current DF implementation","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"4db62fb5b2833b77f49b490fa8e82c74e34aac1b","unresolved":false,"context_lines":[{"line_number":39,"context_line":"]"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"def is_port_owner_of_type(owner_type, type_list):"},{"line_number":43,"context_line":"    for sub_type in type_list:"},{"line_number":44,"context_line":"        if sub_type in owner_type:"},{"line_number":45,"context_line":"            return True"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_495cc425","line":42,"updated":"2017-02-12 07:27:54.000000000","message":"Docstring missing.\nMaybe move this function to the util module?\n\nI have some reservations about this function and its design. Wouldn\u0027t the functionality of \u0027in\u0027 or equality suffice? Then you won\u0027t need constants that are just a singleton list of another constant.","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"db7d2307209741da5c7d3d4b2e22bc7658a4681f","unresolved":false,"context_lines":[{"line_number":39,"context_line":"]"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"def is_port_owner_of_type(owner_type, type_list):"},{"line_number":43,"context_line":"    for sub_type in type_list:"},{"line_number":44,"context_line":"        if sub_type in owner_type:"},{"line_number":45,"context_line":"            return True"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_728a25c1","line":42,"in_reply_to":"fa31d9ce_495cc425","updated":"2017-02-12 13:03:20.000000000","message":"Done","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"4db62fb5b2833b77f49b490fa8e82c74e34aac1b","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"def is_port_owner_of_type(owner_type, type_list):"},{"line_number":43,"context_line":"    for sub_type in type_list:"},{"line_number":44,"context_line":"        if sub_type in owner_type:"},{"line_number":45,"context_line":"            return True"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    return False"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_893ebcb6","line":44,"range":{"start_line":44,"start_character":0,"end_line":44,"end_character":34},"updated":"2017-02-12 07:27:54.000000000","message":"This will return true if sub_type is a substring of owner_type. Is this intentional?","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"db7d2307209741da5c7d3d4b2e22bc7658a4681f","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"def is_port_owner_of_type(owner_type, type_list):"},{"line_number":43,"context_line":"    for sub_type in type_list:"},{"line_number":44,"context_line":"        if sub_type in owner_type:"},{"line_number":45,"context_line":"            return True"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    return False"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_b2abbd1c","line":44,"range":{"start_line":44,"start_character":0,"end_line":44,"end_character":34},"in_reply_to":"fa31d9ce_893ebcb6","updated":"2017-02-12 13:03:20.000000000","message":"This is done intentionally to make prefix search","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"0150553891f25aabaf53a1c9a68f2e0ea861f877","unresolved":false,"context_lines":[{"line_number":39,"context_line":"]"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"def is_port_owner_of_type(owner_type, type_list):"},{"line_number":43,"context_line":"    for sub_type in type_list:"},{"line_number":44,"context_line":"        if sub_type in owner_type:"},{"line_number":45,"context_line":"            return True"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    return False"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_4f481a88","line":47,"range":{"start_line":42,"start_character":0,"end_line":47,"end_character":16},"updated":"2017-02-12 07:29:26.000000000","message":"better to be defined inside utils.py","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"db7d2307209741da5c7d3d4b2e22bc7658a4681f","unresolved":false,"context_lines":[{"line_number":39,"context_line":"]"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"def is_port_owner_of_type(owner_type, type_list):"},{"line_number":43,"context_line":"    for sub_type in type_list:"},{"line_number":44,"context_line":"        if sub_type in owner_type:"},{"line_number":45,"context_line":"            return True"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    return False"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_d2a67152","line":47,"range":{"start_line":42,"start_character":0,"end_line":47,"end_character":16},"in_reply_to":"fa31d9ce_4f481a88","updated":"2017-02-12 13:03:20.000000000","message":"agree","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"20f1ac0ac9cf2b306112e2cb5adfb30f1f829242","unresolved":false,"context_lines":[{"line_number":26,"context_line":"DEVICE_OWNER_LOCAL_GW \u003d ("},{"line_number":27,"context_line":"            n_const.DEVICE_OWNER_NETWORK_PREFIX + \"local_router_gateway\")"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"DATA_DEVICE_OWNER \u003d ["},{"line_number":30,"context_line":"    n_const.DEVICE_OWNER_COMPUTE_PREFIX"},{"line_number":31,"context_line":"]"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"fa31d9ce_8bff4666","line":29,"updated":"2017-02-13 13:09:40.000000000","message":"Not sure why all 3 OWNER constants are lists","commit_id":"e7b1f99463b569a4f0412e8de3a7db76e6fdeb72"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"f79200c5e4f06b8ba73c1992b65971d652f75255","unresolved":false,"context_lines":[{"line_number":26,"context_line":"DEVICE_OWNER_LOCAL_GW \u003d ("},{"line_number":27,"context_line":"            n_const.DEVICE_OWNER_NETWORK_PREFIX + \"local_router_gateway\")"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"DATA_DEVICE_OWNER \u003d ["},{"line_number":30,"context_line":"    n_const.DEVICE_OWNER_COMPUTE_PREFIX"},{"line_number":31,"context_line":"]"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"fa31d9ce_cfb2fc05","line":29,"in_reply_to":"fa31d9ce_8bff4666","updated":"2017-02-14 09:38:54.000000000","message":"For the chassis NAT only first list is relevant so I removed others from here.","commit_id":"e7b1f99463b569a4f0412e8de3a7db76e6fdeb72"}],"dragonflow/conf/df_snat.py":[{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"99fbaf9800c4aeff933533f9fe2036a19710bda5","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"df_snat_app_opts \u003d ["},{"line_number":21,"context_line":"    cfg.StrOpt(\u0027external_host_ip\u0027,"},{"line_number":22,"context_line":"               default\u003d\u0027172.24.4.100\u0027,"},{"line_number":23,"context_line":"               help\u003d_(\"Compute node external IP\")),"},{"line_number":24,"context_line":"    cfg.StrOpt(\u0027external_host_mac\u0027,"},{"line_number":25,"context_line":"               default\u003d\u002791:92:93:94:95:96\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_4bf78ad2","line":22,"range":{"start_line":22,"start_character":24,"end_line":22,"end_character":38},"updated":"2017-02-09 12:48:00.000000000","message":"I\u0027m not sure providing those defaults is useful, maybe we can point it to local_ip?","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"4db62fb5b2833b77f49b490fa8e82c74e34aac1b","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"df_snat_app_opts \u003d ["},{"line_number":21,"context_line":"    cfg.StrOpt(\u0027external_host_ip\u0027,"},{"line_number":22,"context_line":"               default\u003d\u0027172.24.4.100\u0027,"},{"line_number":23,"context_line":"               help\u003d_(\"Compute node external IP\")),"},{"line_number":24,"context_line":"    cfg.StrOpt(\u0027external_host_mac\u0027,"},{"line_number":25,"context_line":"               default\u003d\u002791:92:93:94:95:96\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_c948b45e","line":22,"range":{"start_line":22,"start_character":24,"end_line":22,"end_character":38},"in_reply_to":"1a430d35_4bf78ad2","updated":"2017-02-12 07:27:54.000000000","message":"+1","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"0150553891f25aabaf53a1c9a68f2e0ea861f877","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"df_snat_app_opts \u003d ["},{"line_number":21,"context_line":"    cfg.StrOpt(\u0027external_host_ip\u0027,"},{"line_number":22,"context_line":"               default\u003d\u0027172.24.4.100\u0027,"},{"line_number":23,"context_line":"               help\u003d_(\"Compute node external IP\")),"},{"line_number":24,"context_line":"    cfg.StrOpt(\u0027external_host_mac\u0027,"},{"line_number":25,"context_line":"               default\u003d\u002791:92:93:94:95:96\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_6f5f9e41","line":22,"range":{"start_line":22,"start_character":24,"end_line":22,"end_character":38},"in_reply_to":"1a430d35_4bf78ad2","updated":"2017-02-12 07:29:26.000000000","message":"this address belongs to the external network, better leave out empty imho","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":18347,"name":"Itamar Ofek","email":"itamofek@netscape.net","username":"itamaro"},"change_message_id":"0beb545381c9d922893e4fe2839cfdc3aa6e743e","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"df_snat_app_opts \u003d ["},{"line_number":21,"context_line":"    cfg.StrOpt(\u0027external_host_ip\u0027,"},{"line_number":22,"context_line":"               default\u003d\u0027172.24.4.100\u0027,"},{"line_number":23,"context_line":"               help\u003d_(\"Compute node external IP\")),"},{"line_number":24,"context_line":"    cfg.StrOpt(\u0027external_host_mac\u0027,"},{"line_number":25,"context_line":"               default\u003d\u002791:92:93:94:95:96\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_92cdd95f","line":22,"range":{"start_line":22,"start_character":24,"end_line":22,"end_character":38},"in_reply_to":"fa31d9ce_6f5f9e41","updated":"2017-02-12 08:52:00.000000000","message":"I too think that no default value should be provided","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"db7d2307209741da5c7d3d4b2e22bc7658a4681f","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"df_snat_app_opts \u003d ["},{"line_number":21,"context_line":"    cfg.StrOpt(\u0027external_host_ip\u0027,"},{"line_number":22,"context_line":"               default\u003d\u0027172.24.4.100\u0027,"},{"line_number":23,"context_line":"               help\u003d_(\"Compute node external IP\")),"},{"line_number":24,"context_line":"    cfg.StrOpt(\u0027external_host_mac\u0027,"},{"line_number":25,"context_line":"               default\u003d\u002791:92:93:94:95:96\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_0d4e2a6f","line":22,"range":{"start_line":22,"start_character":24,"end_line":22,"end_character":38},"in_reply_to":"fa31d9ce_6f5f9e41","updated":"2017-02-12 13:03:20.000000000","message":"agree","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"db7d2307209741da5c7d3d4b2e22bc7658a4681f","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"df_snat_app_opts \u003d ["},{"line_number":21,"context_line":"    cfg.StrOpt(\u0027external_host_ip\u0027,"},{"line_number":22,"context_line":"               default\u003d\u0027172.24.4.100\u0027,"},{"line_number":23,"context_line":"               help\u003d_(\"Compute node external IP\")),"},{"line_number":24,"context_line":"    cfg.StrOpt(\u0027external_host_mac\u0027,"},{"line_number":25,"context_line":"               default\u003d\u002791:92:93:94:95:96\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_cd35f2da","line":22,"range":{"start_line":22,"start_character":24,"end_line":22,"end_character":38},"in_reply_to":"fa31d9ce_c948b45e","updated":"2017-02-12 13:03:20.000000000","message":"Done","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"4db62fb5b2833b77f49b490fa8e82c74e34aac1b","unresolved":false,"context_lines":[{"line_number":22,"context_line":"               default\u003d\u0027172.24.4.100\u0027,"},{"line_number":23,"context_line":"               help\u003d_(\"Compute node external IP\")),"},{"line_number":24,"context_line":"    cfg.StrOpt(\u0027external_host_mac\u0027,"},{"line_number":25,"context_line":"               default\u003d\u002791:92:93:94:95:96\u0027,"},{"line_number":26,"context_line":"               help\u003d_(\"Compute node mac address for external interface\")),"},{"line_number":27,"context_line":"]"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_a962a0d6","line":25,"range":{"start_line":25,"start_character":0,"end_line":25,"end_character":43},"updated":"2017-02-12 07:27:54.000000000","message":"Same here, maybe read this information from the OS?","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"db7d2307209741da5c7d3d4b2e22bc7658a4681f","unresolved":false,"context_lines":[{"line_number":22,"context_line":"               default\u003d\u0027172.24.4.100\u0027,"},{"line_number":23,"context_line":"               help\u003d_(\"Compute node external IP\")),"},{"line_number":24,"context_line":"    cfg.StrOpt(\u0027external_host_mac\u0027,"},{"line_number":25,"context_line":"               default\u003d\u002791:92:93:94:95:96\u0027,"},{"line_number":26,"context_line":"               help\u003d_(\"Compute node mac address for external interface\")),"},{"line_number":27,"context_line":"]"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_ed30f6ea","line":25,"range":{"start_line":25,"start_character":0,"end_line":25,"end_character":43},"in_reply_to":"fa31d9ce_a962a0d6","updated":"2017-02-12 13:03:20.000000000","message":"Done","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":18347,"name":"Itamar Ofek","email":"itamofek@netscape.net","username":"itamaro"},"change_message_id":"0beb545381c9d922893e4fe2839cfdc3aa6e743e","unresolved":false,"context_lines":[{"line_number":22,"context_line":"               default\u003d\u0027172.24.4.100\u0027,"},{"line_number":23,"context_line":"               help\u003d_(\"Compute node external IP\")),"},{"line_number":24,"context_line":"    cfg.StrOpt(\u0027external_host_mac\u0027,"},{"line_number":25,"context_line":"               default\u003d\u002791:92:93:94:95:96\u0027,"},{"line_number":26,"context_line":"               help\u003d_(\"Compute node mac address for external interface\")),"},{"line_number":27,"context_line":"]"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_72d22502","line":25,"range":{"start_line":25,"start_character":0,"end_line":25,"end_character":43},"in_reply_to":"fa31d9ce_a962a0d6","updated":"2017-02-12 08:52:00.000000000","message":"I do not think this value is nedded","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"}],"dragonflow/controller/base_snat_app.py":[{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"99fbaf9800c4aeff933533f9fe2036a19710bda5","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from ryu.ofproto import nicira_ext"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from dragonflow._i18n import _LI"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from dragonflow.common import constants as df_common_const"},{"line_number":25,"context_line":"from dragonflow.controller.common import arp_responder"},{"line_number":26,"context_line":"from dragonflow.controller.common import constants as const"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_cb09ba96","line":23,"updated":"2017-02-09 12:48:00.000000000","message":"This empty line shouldn\u0027t be there, both imports are of the same block","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"db7d2307209741da5c7d3d4b2e22bc7658a4681f","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from ryu.ofproto import nicira_ext"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from dragonflow._i18n import _LI"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from dragonflow.common import constants as df_common_const"},{"line_number":25,"context_line":"from dragonflow.controller.common import arp_responder"},{"line_number":26,"context_line":"from dragonflow.controller.common import constants as const"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_12d48945","line":23,"in_reply_to":"1a430d35_cb09ba96","updated":"2017-02-12 13:03:20.000000000","message":"Done","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"0150553891f25aabaf53a1c9a68f2e0ea861f877","unresolved":false,"context_lines":[{"line_number":29,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class BaseSNATApp(df_base_app.DFlowApp):"},{"line_number":33,"context_line":"    \"\"\"sNAT application base class provides common services"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    Application requirements:"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_ef31ce0c","line":32,"range":{"start_line":32,"start_character":5,"end_line":32,"end_character":18},"updated":"2017-02-12 07:29:26.000000000","message":"should not this class define methods to be overridden by the \u0027child\u0027? Worth to add this here","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"db7d2307209741da5c7d3d4b2e22bc7658a4681f","unresolved":false,"context_lines":[{"line_number":29,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class BaseSNATApp(df_base_app.DFlowApp):"},{"line_number":33,"context_line":"    \"\"\"sNAT application base class provides common services"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    Application requirements:"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_f2d0d555","line":32,"range":{"start_line":32,"start_character":5,"end_line":32,"end_character":18},"in_reply_to":"fa31d9ce_ef31ce0c","updated":"2017-02-12 13:03:20.000000000","message":"Added Metaclass description","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"99fbaf9800c4aeff933533f9fe2036a19710bda5","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        LOG.info(_LI(\"Ex. Bridge port update is called ... \"))"},{"line_number":70,"context_line":"        mac \u003d ovs_port.get_mac_in_use()"},{"line_number":71,"context_line":"        if (self.external_bridge_mac \u003d\u003d mac"},{"line_number":72,"context_line":"                or not mac"},{"line_number":73,"context_line":"                or mac \u003d\u003d const.EMPTY_MAC):"},{"line_number":74,"context_line":"            return"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        self.external_bridge_mac \u003d mac"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_ab146e9f","line":73,"range":{"start_line":71,"start_character":8,"end_line":73,"end_character":43},"updated":"2017-02-09 12:48:00.000000000","message":"Maybe this is a bit simpler\n\nif mac not in (None, const.EMPTY_MAC):\n    self.external_bridge_mac \u003d mac","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"4db62fb5b2833b77f49b490fa8e82c74e34aac1b","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        LOG.info(_LI(\"Ex. Bridge port update is called ... \"))"},{"line_number":70,"context_line":"        mac \u003d ovs_port.get_mac_in_use()"},{"line_number":71,"context_line":"        if (self.external_bridge_mac \u003d\u003d mac"},{"line_number":72,"context_line":"                or not mac"},{"line_number":73,"context_line":"                or mac \u003d\u003d const.EMPTY_MAC):"},{"line_number":74,"context_line":"            return"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        self.external_bridge_mac \u003d mac"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_a990e096","line":73,"range":{"start_line":71,"start_character":8,"end_line":73,"end_character":43},"in_reply_to":"1a430d35_ab146e9f","updated":"2017-02-12 07:27:54.000000000","message":"Or:\nif mac in (None, const.EMPTY_MAC, self.external_bridge_mac):\n    return\n\nSince there are actions here don\u0027t need repeating if the mac hasn\u0027t changed.","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"db7d2307209741da5c7d3d4b2e22bc7658a4681f","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        LOG.info(_LI(\"Ex. Bridge port update is called ... \"))"},{"line_number":70,"context_line":"        mac \u003d ovs_port.get_mac_in_use()"},{"line_number":71,"context_line":"        if (self.external_bridge_mac \u003d\u003d mac"},{"line_number":72,"context_line":"                or not mac"},{"line_number":73,"context_line":"                or mac \u003d\u003d const.EMPTY_MAC):"},{"line_number":74,"context_line":"            return"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        self.external_bridge_mac \u003d mac"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_52ce01b5","line":73,"range":{"start_line":71,"start_character":8,"end_line":73,"end_character":43},"in_reply_to":"fa31d9ce_a990e096","updated":"2017-02-12 13:03:20.000000000","message":"Done","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"99fbaf9800c4aeff933533f9fe2036a19710bda5","unresolved":false,"context_lines":[{"line_number":140,"context_line":"            # install flows only on first port add"},{"line_number":141,"context_line":"            # flows are agnostic of port amount and tenant id"},{"line_number":142,"context_line":"            if(self.count \u003d\u003d 0):"},{"line_number":143,"context_line":"                self.install_common_flows()"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"            self.install_lport_specific_flows(lport)"},{"line_number":146,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_4b7a2a25","line":143,"updated":"2017-02-09 12:48:00.000000000","message":"Posted this on another PS:\n\nWhy do we bother with removing common flows?\nWe can just install them once in switch_features_handler and remove them never...\n\nThen we don\u0027t have to count current number of ports...","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"db7d2307209741da5c7d3d4b2e22bc7658a4681f","unresolved":false,"context_lines":[{"line_number":140,"context_line":"            # install flows only on first port add"},{"line_number":141,"context_line":"            # flows are agnostic of port amount and tenant id"},{"line_number":142,"context_line":"            if(self.count \u003d\u003d 0):"},{"line_number":143,"context_line":"                self.install_common_flows()"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"            self.install_lport_specific_flows(lport)"},{"line_number":146,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_724ce542","line":143,"in_reply_to":"1a430d35_4b7a2a25","updated":"2017-02-12 13:03:20.000000000","message":"I like a clean way of install/uninstall","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":18347,"name":"Itamar Ofek","email":"itamofek@netscape.net","username":"itamaro"},"change_message_id":"0beb545381c9d922893e4fe2839cfdc3aa6e743e","unresolved":false,"context_lines":[{"line_number":140,"context_line":"            # install flows only on first port add"},{"line_number":141,"context_line":"            # flows are agnostic of port amount and tenant id"},{"line_number":142,"context_line":"            if(self.count \u003d\u003d 0):"},{"line_number":143,"context_line":"                self.install_common_flows()"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"            self.install_lport_specific_flows(lport)"},{"line_number":146,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_52ec418f","line":143,"in_reply_to":"1a430d35_4b7a2a25","updated":"2017-02-12 08:52:00.000000000","message":"These (common) flows are staretegy specific, and should be cleared upon last vm.","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"db7d2307209741da5c7d3d4b2e22bc7658a4681f","unresolved":false,"context_lines":[{"line_number":140,"context_line":"            # install flows only on first port add"},{"line_number":141,"context_line":"            # flows are agnostic of port amount and tenant id"},{"line_number":142,"context_line":"            if(self.count \u003d\u003d 0):"},{"line_number":143,"context_line":"                self.install_common_flows()"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"            self.install_lport_specific_flows(lport)"},{"line_number":146,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_2dd4ce45","line":143,"in_reply_to":"fa31d9ce_52ec418f","updated":"2017-02-12 13:03:20.000000000","message":"I changed names of install_common/remove_common methods to be\n*_startegy_based","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"4db62fb5b2833b77f49b490fa8e82c74e34aac1b","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        else:"},{"line_number":151,"context_line":"            LOG.info(_LI(\u0027SNAT application: not a compute port, skipped\u0027))"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def ovs_port_updated_helper(self):"},{"line_number":154,"context_line":"        pass"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    def install_common_flows(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_49cf64b0","line":153,"updated":"2017-02-12 07:27:54.000000000","message":"These empty methods warrant docstrings, so that extenders know what is expected.","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"db7d2307209741da5c7d3d4b2e22bc7658a4681f","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        else:"},{"line_number":151,"context_line":"            LOG.info(_LI(\u0027SNAT application: not a compute port, skipped\u0027))"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def ovs_port_updated_helper(self):"},{"line_number":154,"context_line":"        pass"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    def install_common_flows(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_1293a950","line":153,"in_reply_to":"fa31d9ce_49cf64b0","updated":"2017-02-12 13:03:20.000000000","message":"Done","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"4db62fb5b2833b77f49b490fa8e82c74e34aac1b","unresolved":false,"context_lines":[{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    def _install_ingress_goto_rules(self):"},{"line_number":179,"context_line":"        parser \u003d self.parser"},{"line_number":180,"context_line":"        match \u003d parser.OFPMatch()"},{"line_number":181,"context_line":"        match.set_in_port(self.external_ofport)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        self.add_flow_go_to_table("},{"line_number":184,"context_line":"            const.INGRESS_CLASSIFICATION_DISPATCH_TABLE,"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_bba9e37d","line":181,"range":{"start_line":180,"start_character":0,"end_line":181,"end_character":47},"updated":"2017-02-12 07:27:54.000000000","message":"nit: Why not:\n    match \u003d parser.OFPMatch(in_port\u003dself.external_ofport)","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"db7d2307209741da5c7d3d4b2e22bc7658a4681f","unresolved":false,"context_lines":[{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    def _install_ingress_goto_rules(self):"},{"line_number":179,"context_line":"        parser \u003d self.parser"},{"line_number":180,"context_line":"        match \u003d parser.OFPMatch()"},{"line_number":181,"context_line":"        match.set_in_port(self.external_ofport)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        self.add_flow_go_to_table("},{"line_number":184,"context_line":"            const.INGRESS_CLASSIFICATION_DISPATCH_TABLE,"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_72cb0554","line":181,"range":{"start_line":180,"start_character":0,"end_line":181,"end_character":47},"in_reply_to":"fa31d9ce_bba9e37d","updated":"2017-02-12 13:03:20.000000000","message":"Done","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"4db62fb5b2833b77f49b490fa8e82c74e34aac1b","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                        dst_field\u003d\u0027ipv4_src\u0027,"},{"line_number":201,"context_line":"                        n_bits\u003d32),"},{"line_number":202,"context_line":"            parser.NXActionRegLoad("},{"line_number":203,"context_line":"                        ofs_nbits\u003dnicira_ext.ofs_nbits(31, 31),"},{"line_number":204,"context_line":"                        dst\u003d\"ipv4_src\","},{"line_number":205,"context_line":"                        value\u003d1,)"},{"line_number":206,"context_line":"                   ]"},{"line_number":207,"context_line":"        actions +\u003d ["},{"line_number":208,"context_line":"            parser.NXActionCT("}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_efee2e8a","line":205,"range":{"start_line":203,"start_character":0,"end_line":205,"end_character":33},"updated":"2017-02-12 07:27:54.000000000","message":"nit: Did you happen to check if this is actually needed?","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"db7d2307209741da5c7d3d4b2e22bc7658a4681f","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                        dst_field\u003d\u0027ipv4_src\u0027,"},{"line_number":201,"context_line":"                        n_bits\u003d32),"},{"line_number":202,"context_line":"            parser.NXActionRegLoad("},{"line_number":203,"context_line":"                        ofs_nbits\u003dnicira_ext.ofs_nbits(31, 31),"},{"line_number":204,"context_line":"                        dst\u003d\"ipv4_src\","},{"line_number":205,"context_line":"                        value\u003d1,)"},{"line_number":206,"context_line":"                   ]"},{"line_number":207,"context_line":"        actions +\u003d ["},{"line_number":208,"context_line":"            parser.NXActionCT("}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_5239a140","line":205,"range":{"start_line":203,"start_character":0,"end_line":205,"end_character":33},"in_reply_to":"fa31d9ce_efee2e8a","updated":"2017-02-12 13:03:20.000000000","message":"this field to be written into linux conn. track table, so it should be a valid IP address.","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"4db62fb5b2833b77f49b490fa8e82c74e34aac1b","unresolved":false,"context_lines":[{"line_number":203,"context_line":"                        ofs_nbits\u003dnicira_ext.ofs_nbits(31, 31),"},{"line_number":204,"context_line":"                        dst\u003d\"ipv4_src\","},{"line_number":205,"context_line":"                        value\u003d1,)"},{"line_number":206,"context_line":"                   ]"},{"line_number":207,"context_line":"        actions +\u003d ["},{"line_number":208,"context_line":"            parser.NXActionCT("},{"line_number":209,"context_line":"                     alg\u003d0,"},{"line_number":210,"context_line":"                     flags\u003dconst.CT_FLAG_COMMIT,"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_fbb99bcc","line":207,"range":{"start_line":206,"start_character":0,"end_line":207,"end_character":20},"updated":"2017-02-12 07:27:54.000000000","message":"Why not just replace by a comma?","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"db7d2307209741da5c7d3d4b2e22bc7658a4681f","unresolved":false,"context_lines":[{"line_number":203,"context_line":"                        ofs_nbits\u003dnicira_ext.ofs_nbits(31, 31),"},{"line_number":204,"context_line":"                        dst\u003d\"ipv4_src\","},{"line_number":205,"context_line":"                        value\u003d1,)"},{"line_number":206,"context_line":"                   ]"},{"line_number":207,"context_line":"        actions +\u003d ["},{"line_number":208,"context_line":"            parser.NXActionCT("},{"line_number":209,"context_line":"                     alg\u003d0,"},{"line_number":210,"context_line":"                     flags\u003dconst.CT_FLAG_COMMIT,"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_724065a6","line":207,"range":{"start_line":206,"start_character":0,"end_line":207,"end_character":20},"in_reply_to":"fa31d9ce_fbb99bcc","updated":"2017-02-12 13:03:20.000000000","message":"Done","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"4db62fb5b2833b77f49b490fa8e82c74e34aac1b","unresolved":false,"context_lines":[{"line_number":297,"context_line":"            parser.OFPActionSetField(eth_dst\u003dvm_mac)"},{"line_number":298,"context_line":"                    ]"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"        actions +\u003d ["},{"line_number":301,"context_line":"            parser.NXActionRegLoad("},{"line_number":302,"context_line":"                            ofs_nbits\u003dnicira_ext.ofs_nbits(31, 31),"},{"line_number":303,"context_line":"                            dst\u003d\"ipv4_dst\","}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_af4fd6bb","line":300,"range":{"start_line":300,"start_character":16,"end_line":300,"end_character":17},"updated":"2017-02-12 07:27:54.000000000","message":"Same here: Why not just create the list in one go?","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"db7d2307209741da5c7d3d4b2e22bc7658a4681f","unresolved":false,"context_lines":[{"line_number":297,"context_line":"            parser.OFPActionSetField(eth_dst\u003dvm_mac)"},{"line_number":298,"context_line":"                    ]"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"        actions +\u003d ["},{"line_number":301,"context_line":"            parser.NXActionRegLoad("},{"line_number":302,"context_line":"                            ofs_nbits\u003dnicira_ext.ofs_nbits(31, 31),"},{"line_number":303,"context_line":"                            dst\u003d\"ipv4_dst\","}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_923b1938","line":300,"range":{"start_line":300,"start_character":16,"end_line":300,"end_character":17},"in_reply_to":"fa31d9ce_af4fd6bb","updated":"2017-02-12 13:03:20.000000000","message":"Done","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"302ef5c1caba033bef0ea76919a51d1ead5490b3","unresolved":false,"context_lines":[{"line_number":31,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":35,"context_line":"class BaseSNATApp(df_base_app.DFlowApp):"},{"line_number":36,"context_line":"    \"\"\"sNAT application base class provides common services"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"fa31d9ce_d1e01dcf","line":34,"range":{"start_line":34,"start_character":0,"end_line":34,"end_character":31},"updated":"2017-02-13 12:37:37.000000000","message":"This enforces the child to override the methods, even if they are kept the same. Maybe there\u0027s another way to do this?","commit_id":"e7b1f99463b569a4f0412e8de3a7db76e6fdeb72"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"f79200c5e4f06b8ba73c1992b65971d652f75255","unresolved":false,"context_lines":[{"line_number":31,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":35,"context_line":"class BaseSNATApp(df_base_app.DFlowApp):"},{"line_number":36,"context_line":"    \"\"\"sNAT application base class provides common services"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"fa31d9ce_2f95583e","line":34,"range":{"start_line":34,"start_character":0,"end_line":34,"end_character":31},"in_reply_to":"fa31d9ce_d1e01dcf","updated":"2017-02-14 09:38:54.000000000","message":"I am removing it. I see it causes extra complication","commit_id":"e7b1f99463b569a4f0412e8de3a7db76e6fdeb72"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7ee80437d51ed4fe02f6c7dd0e24c516e5395209","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":"import netaddr"},{"line_number":16,"context_line":"from oslo_config import cfg"},{"line_number":17,"context_line":"from oslo_log import log"},{"line_number":18,"context_line":"from ryu.ofproto import ether"},{"line_number":19,"context_line":"from ryu.ofproto import nicira_ext"}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_c213e464","line":16,"range":{"start_line":16,"start_character":0,"end_line":16,"end_character":27},"updated":"2017-02-23 03:51:06.000000000","message":"The config is commonly used this way, to make sure configurations are registered before using.\n\nfrom dragonflow import conf as cfg","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"2edad130b7627cc04aa0bbfdaa77d932cddd788b","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":"import netaddr"},{"line_number":16,"context_line":"from oslo_config import cfg"},{"line_number":17,"context_line":"from oslo_log import log"},{"line_number":18,"context_line":"from ryu.ofproto import ether"},{"line_number":19,"context_line":"from ryu.ofproto import nicira_ext"}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_df0f0886","line":16,"range":{"start_line":16,"start_character":0,"end_line":16,"end_character":27},"in_reply_to":"da36d5c6_c213e464","updated":"2017-02-23 14:04:06.000000000","message":"Done","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7ee80437d51ed4fe02f6c7dd0e24c516e5395209","unresolved":false,"context_lines":[{"line_number":28,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class BaseSNATApp(df_base_app.DFlowApp):"},{"line_number":32,"context_line":"    \"\"\"sNAT application base class provides common services"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    Application requirements:"}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_ea741569","line":31,"range":{"start_line":31,"start_character":0,"end_line":31,"end_character":40},"updated":"2017-02-23 03:51:06.000000000","message":"nit: If it is going to be a super class that will be shared by multiple apps, it is better to be a mixin class.","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"902aecf3e0767b3209c91a9a093736d5f182f683","unresolved":false,"context_lines":[{"line_number":28,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class BaseSNATApp(df_base_app.DFlowApp):"},{"line_number":32,"context_line":"    \"\"\"sNAT application base class provides common services"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    Application requirements:"}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_4a8b2f68","line":31,"range":{"start_line":31,"start_character":0,"end_line":31,"end_character":40},"in_reply_to":"da36d5c6_7f1a9c7e","updated":"2017-02-24 09:21:32.000000000","message":"Actually, there is no switch_features_handler() or ovs_port_updated() in base class. I think as long as BaseSNATApp can\u0027t work as an app, it should not be subclass of DFlowApp. And I have a similar work item here [1]. I guess we should choose one way or another, I would like to here your opinion about it.\n\n[1] https://review.openstack.org/#/c/436410/","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"2edad130b7627cc04aa0bbfdaa77d932cddd788b","unresolved":false,"context_lines":[{"line_number":28,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class BaseSNATApp(df_base_app.DFlowApp):"},{"line_number":32,"context_line":"    \"\"\"sNAT application base class provides common services"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    Application requirements:"}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_7f1a9c7e","line":31,"range":{"start_line":31,"start_character":0,"end_line":31,"end_character":40},"in_reply_to":"da36d5c6_ea741569","updated":"2017-02-23 14:04:06.000000000","message":"I am not sure think mixin concept suits here. This class in not just a collection of reusable methods but also overrides some basic functionality defined in base class \n- switch_features_handler() and ovs_port_updated()","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7ee80437d51ed4fe02f6c7dd0e24c516e5395209","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        if ovs_port.get_name() !\u003d self.external_network_bridge:"},{"line_number":66,"context_line":"            return"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        LOG.info(_LI(\"Ex. Bridge port update is called ... \"))"},{"line_number":69,"context_line":"        mac \u003d ovs_port.get_mac_in_use()"},{"line_number":70,"context_line":"        if mac in (None, const.EMPTY_MAC, self.external_bridge_mac):"},{"line_number":71,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_b6455518","line":68,"range":{"start_line":68,"start_character":0,"end_line":68,"end_character":62},"updated":"2017-02-23 03:51:06.000000000","message":"What is the meaning of this log?","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"2edad130b7627cc04aa0bbfdaa77d932cddd788b","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        if ovs_port.get_name() !\u003d self.external_network_bridge:"},{"line_number":66,"context_line":"            return"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        LOG.info(_LI(\"Ex. Bridge port update is called ... \"))"},{"line_number":69,"context_line":"        mac \u003d ovs_port.get_mac_in_use()"},{"line_number":70,"context_line":"        if mac in (None, const.EMPTY_MAC, self.external_bridge_mac):"},{"line_number":71,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_ba1ee25c","line":68,"range":{"start_line":68,"start_character":0,"end_line":68,"end_character":62},"in_reply_to":"da36d5c6_b6455518","updated":"2017-02-23 14:04:06.000000000","message":"This intended for debugging purposes so I changed it to LOG.debug","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7ee80437d51ed4fe02f6c7dd0e24c516e5395209","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"            # remove SNAT related flows only on last VM port removal"},{"line_number":120,"context_line":"            if (self.count \u003d\u003d 0):"},{"line_number":121,"context_line":"                self.remove_strategy_based_flows()"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"            # remove VM specific flows"},{"line_number":124,"context_line":"            self.remove_lport_based_flows(lport)"}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_369085ec","line":121,"range":{"start_line":121,"start_character":0,"end_line":121,"end_character":50},"updated":"2017-02-23 03:51:06.000000000","message":"Since the flows will be used by all local ports, why not just keep it statically, instead of maintain it dynamically?","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"6d480ec1cfc4b15723a12970d60032f5bc695076","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"            # remove SNAT related flows only on last VM port removal"},{"line_number":120,"context_line":"            if (self.count \u003d\u003d 0):"},{"line_number":121,"context_line":"                self.remove_strategy_based_flows()"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"            # remove VM specific flows"},{"line_number":124,"context_line":"            self.remove_lport_based_flows(lport)"}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_9f7bd08b","line":121,"range":{"start_line":121,"start_character":0,"end_line":121,"end_character":50},"in_reply_to":"da36d5c6_369085ec","updated":"2017-02-23 11:51:16.000000000","message":"@ishafran, it looks like you\u0027re outvoted on this point. I\u0027m rejoining Xiao\u0027s request here.","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"2edad130b7627cc04aa0bbfdaa77d932cddd788b","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"            # remove SNAT related flows only on last VM port removal"},{"line_number":120,"context_line":"            if (self.count \u003d\u003d 0):"},{"line_number":121,"context_line":"                self.remove_strategy_based_flows()"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"            # remove VM specific flows"},{"line_number":124,"context_line":"            self.remove_lport_based_flows(lport)"}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_dab716f3","line":121,"range":{"start_line":121,"start_character":0,"end_line":121,"end_character":50},"in_reply_to":"da36d5c6_369085ec","updated":"2017-02-23 14:04:06.000000000","message":"It looks to me logically correct to maintain flow removal as well as flow installation. Also static flow install on compute node with no VM deployed lead to unused OVS flow paths with \u0027dead end\u0027 since no port specific rules are installed yet. \nBesides maintaining simple counter not \u0027costs\u0027 a lot :)\nHowever I am not locked to this concept...","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"902aecf3e0767b3209c91a9a093736d5f182f683","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"            # remove SNAT related flows only on last VM port removal"},{"line_number":120,"context_line":"            if (self.count \u003d\u003d 0):"},{"line_number":121,"context_line":"                self.remove_strategy_based_flows()"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"            # remove VM specific flows"},{"line_number":124,"context_line":"            self.remove_lport_based_flows(lport)"}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_ea4223ad","line":121,"range":{"start_line":121,"start_character":0,"end_line":121,"end_character":50},"in_reply_to":"da36d5c6_dab716f3","updated":"2017-02-24 09:21:32.000000000","message":"Maintaining counter will be complicating when df controller restart or the controller disconnect and reconnect to br-int.\nHaving openflow with dead end should be fine, since there are only several flows. And as long as the provider app maintain the flow in table 0, the packet will not go inside br-int.","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7ee80437d51ed4fe02f6c7dd0e24c516e5395209","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        :param lport:  local logical port which is being added"},{"line_number":132,"context_line":"        \"\"\""},{"line_number":133,"context_line":"        LOG.info(_LI(\"SNAT application: add local port  %(lport)s\"),"},{"line_number":134,"context_line":"                 {\u0027lport\u0027: lport})"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"        # install flows only when compute port is added"}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_6aa3c5b2","line":133,"range":{"start_line":133,"start_character":54,"end_line":133,"end_character":56},"updated":"2017-02-23 03:51:06.000000000","message":"nit: extra space","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"2edad130b7627cc04aa0bbfdaa77d932cddd788b","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        :param lport:  local logical port which is being added"},{"line_number":132,"context_line":"        \"\"\""},{"line_number":133,"context_line":"        LOG.info(_LI(\"SNAT application: add local port  %(lport)s\"),"},{"line_number":134,"context_line":"                 {\u0027lport\u0027: lport})"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"        # install flows only when compute port is added"}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_7a9d4abb","line":133,"range":{"start_line":133,"start_character":54,"end_line":133,"end_character":56},"in_reply_to":"da36d5c6_6aa3c5b2","updated":"2017-02-23 14:04:06.000000000","message":"Done","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7ee80437d51ed4fe02f6c7dd0e24c516e5395209","unresolved":false,"context_lines":[{"line_number":139,"context_line":"            # install flows only on first port add"},{"line_number":140,"context_line":"            # flows are agnostic of port amount and tenant id"},{"line_number":141,"context_line":"            if(self.count \u003d\u003d 0):"},{"line_number":142,"context_line":"                self.install_strategy_based_flows()"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"            self.install_lport_based_flows(lport)"},{"line_number":145,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_aae5bddc","line":142,"range":{"start_line":142,"start_character":12,"end_line":142,"end_character":51},"updated":"2017-02-23 03:51:06.000000000","message":"same comment above.","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"2edad130b7627cc04aa0bbfdaa77d932cddd788b","unresolved":false,"context_lines":[{"line_number":139,"context_line":"            # install flows only on first port add"},{"line_number":140,"context_line":"            # flows are agnostic of port amount and tenant id"},{"line_number":141,"context_line":"            if(self.count \u003d\u003d 0):"},{"line_number":142,"context_line":"                self.install_strategy_based_flows()"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"            self.install_lport_based_flows(lport)"},{"line_number":145,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_baa98292","line":142,"range":{"start_line":142,"start_character":12,"end_line":142,"end_character":51},"in_reply_to":"da36d5c6_aae5bddc","updated":"2017-02-23 14:04:06.000000000","message":"answered above","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7ee80437d51ed4fe02f6c7dd0e24c516e5395209","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        parser \u003d self.parser"},{"line_number":218,"context_line":"        match \u003d parser.OFPMatch(eth_type\u003dether.ETH_TYPE_IP)"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"        self.add_flow_go_to_table("},{"line_number":221,"context_line":"            const.L3_LOOKUP_TABLE,"},{"line_number":222,"context_line":"            const.PRIORITY_MEDIUM_LOW,"},{"line_number":223,"context_line":"            const.EGRESS_NAT_TABLE,"},{"line_number":224,"context_line":"            match\u003dmatch)"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    def _install_ingress_goto_rules(self):"},{"line_number":227,"context_line":"        parser \u003d self.parser"}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_90f02c00","line":224,"range":{"start_line":220,"start_character":0,"end_line":224,"end_character":24},"updated":"2017-02-23 03:51:06.000000000","message":"This is going to bypass all the flows that have lower priority in L3_LOOKUP_TABLE, and will make L3_LOOKUP_TABLE looks strange. Can there be a flag to prevent dnat app and l3 app from adding other flows?","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"2edad130b7627cc04aa0bbfdaa77d932cddd788b","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        parser \u003d self.parser"},{"line_number":218,"context_line":"        match \u003d parser.OFPMatch(eth_type\u003dether.ETH_TYPE_IP)"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"        self.add_flow_go_to_table("},{"line_number":221,"context_line":"            const.L3_LOOKUP_TABLE,"},{"line_number":222,"context_line":"            const.PRIORITY_MEDIUM_LOW,"},{"line_number":223,"context_line":"            const.EGRESS_NAT_TABLE,"},{"line_number":224,"context_line":"            match\u003dmatch)"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    def _install_ingress_goto_rules(self):"},{"line_number":227,"context_line":"        parser \u003d self.parser"}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_9a191eda","line":224,"range":{"start_line":220,"start_character":0,"end_line":224,"end_character":24},"in_reply_to":"da36d5c6_90f02c00","updated":"2017-02-23 14:04:06.000000000","message":"Here new priority level MEDIUM_LOW was introduced to prevent hijacking east-west or DNAT traffic. Not sure about extra flag strategy, instead it could be moved to more common place - provider app","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"902aecf3e0767b3209c91a9a093736d5f182f683","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        parser \u003d self.parser"},{"line_number":218,"context_line":"        match \u003d parser.OFPMatch(eth_type\u003dether.ETH_TYPE_IP)"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"        self.add_flow_go_to_table("},{"line_number":221,"context_line":"            const.L3_LOOKUP_TABLE,"},{"line_number":222,"context_line":"            const.PRIORITY_MEDIUM_LOW,"},{"line_number":223,"context_line":"            const.EGRESS_NAT_TABLE,"},{"line_number":224,"context_line":"            match\u003dmatch)"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    def _install_ingress_goto_rules(self):"},{"line_number":227,"context_line":"        parser \u003d self.parser"}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_ca5c7f7f","line":224,"range":{"start_line":220,"start_character":0,"end_line":224,"end_character":24},"in_reply_to":"da36d5c6_9a191eda","updated":"2017-02-24 09:21:32.000000000","message":"I mean this flow will make the flows with priority 50 and priority 20 at [1] unreachable. Maybe we should not add those flows if we are going to add this one.\n\n\n[1] http://paste.ubuntu.com/24057835/","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7ee80437d51ed4fe02f6c7dd0e24c516e5395209","unresolved":false,"context_lines":[{"line_number":224,"context_line":"            match\u003dmatch)"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    def _install_ingress_goto_rules(self):"},{"line_number":227,"context_line":"        parser \u003d self.parser"},{"line_number":228,"context_line":"        match \u003d parser.OFPMatch(in_port\u003dself.external_ofport)"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        self.add_flow_go_to_table("},{"line_number":231,"context_line":"            const.INGRESS_CLASSIFICATION_DISPATCH_TABLE,"},{"line_number":232,"context_line":"            const.PRIORITY_DEFAULT,"},{"line_number":233,"context_line":"            const.INGRESS_NAT_TABLE,"},{"line_number":234,"context_line":"            match\u003dmatch)"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"    def _install_snat_egress_conntrack(self, match, ext_host_ip):"},{"line_number":237,"context_line":"        \"\"\"implements single sNAT pass for multiple tenant deployment"}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_aafcdd72","line":234,"range":{"start_line":227,"start_character":0,"end_line":234,"end_character":24},"updated":"2017-02-23 03:51:06.000000000","message":"This is a duplicated flow with the one in dnat app, I think you are going to move them to provider app, right?","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"2edad130b7627cc04aa0bbfdaa77d932cddd788b","unresolved":false,"context_lines":[{"line_number":224,"context_line":"            match\u003dmatch)"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    def _install_ingress_goto_rules(self):"},{"line_number":227,"context_line":"        parser \u003d self.parser"},{"line_number":228,"context_line":"        match \u003d parser.OFPMatch(in_port\u003dself.external_ofport)"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        self.add_flow_go_to_table("},{"line_number":231,"context_line":"            const.INGRESS_CLASSIFICATION_DISPATCH_TABLE,"},{"line_number":232,"context_line":"            const.PRIORITY_DEFAULT,"},{"line_number":233,"context_line":"            const.INGRESS_NAT_TABLE,"},{"line_number":234,"context_line":"            match\u003dmatch)"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"    def _install_snat_egress_conntrack(self, match, ext_host_ip):"},{"line_number":237,"context_line":"        \"\"\"implements single sNAT pass for multiple tenant deployment"}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_9ae4bee1","line":234,"range":{"start_line":227,"start_character":0,"end_line":234,"end_character":24},"in_reply_to":"da36d5c6_aafcdd72","updated":"2017-02-23 14:04:06.000000000","message":"correct, but provider app is still not merged AFAIK.","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7ee80437d51ed4fe02f6c7dd0e24c516e5395209","unresolved":false,"context_lines":[{"line_number":333,"context_line":"                zone_src\u003d\u0027\u0027,"},{"line_number":334,"context_line":"                actions\u003d["},{"line_number":335,"context_line":"                    parser.NXActionNAT(flags\u003d0)"},{"line_number":336,"context_line":"                                ]"},{"line_number":337,"context_line":"                              )"},{"line_number":338,"context_line":"                   ]"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"        action_inst \u003d parser.OFPInstructionActions("}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_ea609503","line":337,"range":{"start_line":336,"start_character":0,"end_line":337,"end_character":31},"updated":"2017-02-23 03:51:06.000000000","message":"The indention of parentheses makes code hard to read here.","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"2edad130b7627cc04aa0bbfdaa77d932cddd788b","unresolved":false,"context_lines":[{"line_number":333,"context_line":"                zone_src\u003d\u0027\u0027,"},{"line_number":334,"context_line":"                actions\u003d["},{"line_number":335,"context_line":"                    parser.NXActionNAT(flags\u003d0)"},{"line_number":336,"context_line":"                                ]"},{"line_number":337,"context_line":"                              )"},{"line_number":338,"context_line":"                   ]"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"        action_inst \u003d parser.OFPInstructionActions("}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_da0f1686","line":337,"range":{"start_line":336,"start_character":0,"end_line":337,"end_character":31},"in_reply_to":"da36d5c6_ea609503","updated":"2017-02-23 14:04:06.000000000","message":"Done","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"}],"dragonflow/controller/chassis_snat_app.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"302ef5c1caba033bef0ea76919a51d1ead5490b3","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                                        lport.get_mac(),"},{"line_number":74,"context_line":"                                        self.external_host_mac)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def remove_strategy_based_flows(self):"},{"line_number":77,"context_line":"        super(ChassisSNATApp, self).remove_strategy_based_flows()"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        parser \u003d self.parser"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa31d9ce_f8d97a84","line":76,"updated":"2017-02-13 12:37:37.000000000","message":"nit: Hmm... This means that _install_snat_egress_conntrack and _install_snat_egress_after_conntrack don\u0027t have matching _remove methods, which is a shame. But not enough for a downvote.","commit_id":"e7b1f99463b569a4f0412e8de3a7db76e6fdeb72"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"6665f94b2345b17d99c50a1005176728ec85e931","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        if self.external_host_mac is None:"},{"line_number":44,"context_line":"            self.external_host_mac \u003d CHASSIS_MAC"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        if self.external_host_ip is None:"},{"line_number":47,"context_line":"            raise Exception(_(\u0027External host IP is not set\u0027))"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def ovs_port_updated_helper(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa31d9ce_08667c50","line":46,"updated":"2017-02-16 05:05:21.000000000","message":"Maybe try by default to take the \u0027local_ip\u0027 configuration?","commit_id":"ed541903be8ea61e511e774acc3f24bcd1e408de"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"af5a8d987de1e42bfc9984af6a8a76a9617dfff7","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        if self.external_host_mac is None:"},{"line_number":44,"context_line":"            self.external_host_mac \u003d CHASSIS_MAC"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        if self.external_host_ip is None:"},{"line_number":47,"context_line":"            raise Exception(_(\u0027External host IP is not set\u0027))"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def ovs_port_updated_helper(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"da36d5c6_1a5a1b84","line":46,"in_reply_to":"fa31d9ce_08667c50","updated":"2017-02-19 12:22:01.000000000","message":"I addressed you latest comment for this.\nSNAT_HOST_IP devstack variable will init \u0027external_host_ip\u0027 in plugin.py\n\nHowever there is no good default value for this IP, so left exception as is...","commit_id":"ed541903be8ea61e511e774acc3f24bcd1e408de"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7ee80437d51ed4fe02f6c7dd0e24c516e5395209","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import netaddr"},{"line_number":17,"context_line":"from oslo_config import cfg"},{"line_number":18,"context_line":"from oslo_log import log"},{"line_number":19,"context_line":"from ryu.ofproto import ether"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_824bac86","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":27},"updated":"2017-02-23 03:51:06.000000000","message":"The config is commonly used this way.\n\nfrom dragonflow import conf as cfg","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"2edad130b7627cc04aa0bbfdaa77d932cddd788b","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import netaddr"},{"line_number":17,"context_line":"from oslo_config import cfg"},{"line_number":18,"context_line":"from oslo_log import log"},{"line_number":19,"context_line":"from ryu.ofproto import ether"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_7f145c9f","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":27},"in_reply_to":"da36d5c6_824bac86","updated":"2017-02-23 14:04:06.000000000","message":"Done","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7ee80437d51ed4fe02f6c7dd0e24c516e5395209","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        if self.external_host_mac is None:"},{"line_number":44,"context_line":"            self.external_host_mac \u003d CHASSIS_MAC"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        if self.external_host_ip is None:"},{"line_number":47,"context_line":"            raise Exception(_(\u0027External host IP is not set\u0027))"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def ovs_port_updated_helper(self):"},{"line_number":50,"context_line":"        # set correct mac address on update"}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_6ad5851a","line":47,"range":{"start_line":46,"start_character":0,"end_line":47,"end_character":61},"updated":"2017-02-23 03:51:06.000000000","message":"Can it be default to local_ip of current host?","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"2edad130b7627cc04aa0bbfdaa77d932cddd788b","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        if self.external_host_mac is None:"},{"line_number":44,"context_line":"            self.external_host_mac \u003d CHASSIS_MAC"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        if self.external_host_ip is None:"},{"line_number":47,"context_line":"            raise Exception(_(\u0027External host IP is not set\u0027))"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def ovs_port_updated_helper(self):"},{"line_number":50,"context_line":"        # set correct mac address on update"}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_bfb25404","line":47,"range":{"start_line":46,"start_character":0,"end_line":47,"end_character":61},"in_reply_to":"da36d5c6_6ad5851a","updated":"2017-02-23 14:04:06.000000000","message":"Not sure if any default will be correct here. Current implementation was tested under assumption that external_host_ip address is a part of provider network range. I didn\u0027t tested it with local ip that lies in different range i.e. control plane network range.","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7ee80437d51ed4fe02f6c7dd0e24c516e5395209","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        parser \u003d self.parser"},{"line_number":104,"context_line":"        ofproto \u003d self.ofproto"},{"line_number":105,"context_line":"        match \u003d parser.OFPMatch(eth_type\u003dether.ETH_TYPE_IP,"},{"line_number":106,"context_line":"                                ct_mark\u003dint(netaddr.IPAddress(vm_ip)))"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        self.mod_flow("},{"line_number":109,"context_line":"            command\u003dofproto.OFPFC_DELETE_STRICT,"}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_10ca7c4e","line":106,"range":{"start_line":106,"start_character":32,"end_line":106,"end_character":68},"updated":"2017-02-23 03:51:06.000000000","message":"I think it is going to be the lport\u0027s unique key in the ct_mark.","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"2edad130b7627cc04aa0bbfdaa77d932cddd788b","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        parser \u003d self.parser"},{"line_number":104,"context_line":"        ofproto \u003d self.ofproto"},{"line_number":105,"context_line":"        match \u003d parser.OFPMatch(eth_type\u003dether.ETH_TYPE_IP,"},{"line_number":106,"context_line":"                                ct_mark\u003dint(netaddr.IPAddress(vm_ip)))"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        self.mod_flow("},{"line_number":109,"context_line":"            command\u003dofproto.OFPFC_DELETE_STRICT,"}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_bfe5f4dc","line":106,"range":{"start_line":106,"start_character":32,"end_line":106,"end_character":68},"in_reply_to":"da36d5c6_10ca7c4e","updated":"2017-02-23 14:04:06.000000000","message":"fixed","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"c4574d5e18da36dc7d8ec3095c8fd8d95e1cb248","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        if self.is_data_port(lport):"},{"line_number":106,"context_line":"            if self.chassis is None:"},{"line_number":107,"context_line":"                self.chassis \u003d lport.get_chassis()"},{"line_number":108,"context_line":"                # install strategy flows on first VM port"},{"line_number":109,"context_line":"                self.install_strategy_based_flows()"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"            self.install_lport_based_flows(lport)"},{"line_number":112,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":8,"id":"da36d5c6_e04bd65d","line":109,"range":{"start_line":108,"start_character":0,"end_line":109,"end_character":51},"updated":"2017-02-27 20:51:16.000000000","message":"why not just move this to switch_features_handler? Since it is base flows, it might be missed during controller disconnection. Add base flow in switch_features_handler can avoid the issue.","commit_id":"defb668fee8edfd6abd43e4d9fe046d475884a88"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"afdef2ac0e7fd2f32e684887d79371342116c486","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        if self.is_data_port(lport):"},{"line_number":106,"context_line":"            if self.chassis is None:"},{"line_number":107,"context_line":"                self.chassis \u003d lport.get_chassis()"},{"line_number":108,"context_line":"                # install strategy flows on first VM port"},{"line_number":109,"context_line":"                self.install_strategy_based_flows()"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"            self.install_lport_based_flows(lport)"},{"line_number":112,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba2be162_a1d8edf0","line":109,"range":{"start_line":108,"start_character":0,"end_line":109,"end_character":51},"in_reply_to":"da36d5c6_e04bd65d","updated":"2017-03-01 09:46:30.000000000","message":"Done","commit_id":"defb668fee8edfd6abd43e4d9fe046d475884a88"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"ac414a6902726276bcc27d1c21a4b518e6275e94","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"CHASSIS_MAC \u003d \u002791:92:93:94:95:96\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class ChassisSNATApp(df_base_app.DFlowApp, snat_mixin.SNATApp_mixin):"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba2be162_f0ec582b","line":26,"range":{"start_line":26,"start_character":14,"end_line":26,"end_character":33},"updated":"2017-03-01 16:59:16.000000000","message":"is it safe to set same external mac for all nodes (assuming no setting is added in the config file","commit_id":"f2f8c9e239f3912ba711af08b43b68a87c6a9167"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"80c0e491151a8dcb0ee6c5ad6bbee0cf33bb7023","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"CHASSIS_MAC \u003d \u002791:92:93:94:95:96\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class ChassisSNATApp(df_base_app.DFlowApp, snat_mixin.SNATApp_mixin):"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba2be162_4ecd6a5c","line":26,"range":{"start_line":26,"start_character":14,"end_line":26,"end_character":33},"in_reply_to":"ba2be162_f0ec582b","updated":"2017-03-02 08:02:34.000000000","message":"Your comment is addressed in latest patch set #11","commit_id":"f2f8c9e239f3912ba711af08b43b68a87c6a9167"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"e0cd1ee4a29e97163edc144d8bf59e6794971c8b","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        self.enable_goto_flows \u003d cfg.CONF.df_snat_app.enable_goto_flows"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        # create mac address based on given \u0027external_host_ip\u0027"},{"line_number":53,"context_line":"        if self.external_host_ip is not None:"},{"line_number":54,"context_line":"            split_ip \u003d self.external_host_ip.split(\u0027.\u0027)"},{"line_number":55,"context_line":"            ip2mac \u003d \u0027{:02X}:{:02X}:{:02X}:{:02X}\u0027.format(*map(int, split_ip))"},{"line_number":56,"context_line":"            self.external_host_mac \u003d \u002791:92:\u0027 + ip2mac"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba2be162_725bda87","line":53,"range":{"start_line":53,"start_character":7,"end_line":53,"end_character":45},"updated":"2017-03-02 13:39:50.000000000","message":"Can it be None?","commit_id":"a84e16b80e9b12c6ecdf32a727f126dfd2442509"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"c130d33e815d6dde1d0f4a81bcb072ecc6f942de","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        self.enable_goto_flows \u003d cfg.CONF.df_snat_app.enable_goto_flows"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        # create mac address based on given \u0027external_host_ip\u0027"},{"line_number":53,"context_line":"        if self.external_host_ip is not None:"},{"line_number":54,"context_line":"            split_ip \u003d self.external_host_ip.split(\u0027.\u0027)"},{"line_number":55,"context_line":"            ip2mac \u003d \u0027{:02X}:{:02X}:{:02X}:{:02X}\u0027.format(*map(int, split_ip))"},{"line_number":56,"context_line":"            self.external_host_mac \u003d \u002791:92:\u0027 + ip2mac"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba2be162_452a8f7f","line":53,"range":{"start_line":53,"start_character":7,"end_line":53,"end_character":45},"in_reply_to":"ba2be162_725bda87","updated":"2017-03-02 14:28:11.000000000","message":"The default is None. When \u003cNone\u003e is set application will turn into disabled mode/test mode. IN this case static flows are not installed","commit_id":"a84e16b80e9b12c6ecdf32a727f126dfd2442509"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"e0cd1ee4a29e97163edc144d8bf59e6794971c8b","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        if self.external_host_ip is not None:"},{"line_number":54,"context_line":"            split_ip \u003d self.external_host_ip.split(\u0027.\u0027)"},{"line_number":55,"context_line":"            ip2mac \u003d \u0027{:02X}:{:02X}:{:02X}:{:02X}\u0027.format(*map(int, split_ip))"},{"line_number":56,"context_line":"            self.external_host_mac \u003d \u002791:92:\u0027 + ip2mac"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        # if mac is still empty we fill default value to pass tests"},{"line_number":59,"context_line":"        if self.external_host_mac is None:"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba2be162_d269e626","line":56,"range":{"start_line":56,"start_character":12,"end_line":56,"end_character":34},"updated":"2017-03-02 13:39:50.000000000","message":"I think you should check if external_host_mac is set in the config file, otherwise it is always overriden","commit_id":"a84e16b80e9b12c6ecdf32a727f126dfd2442509"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"c3b24047a72bc1038482a7ece75d874726a02d22","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        if self.external_host_ip is not None:"},{"line_number":54,"context_line":"            split_ip \u003d self.external_host_ip.split(\u0027.\u0027)"},{"line_number":55,"context_line":"            ip2mac \u003d \u0027{:02X}:{:02X}:{:02X}:{:02X}\u0027.format(*map(int, split_ip))"},{"line_number":56,"context_line":"            self.external_host_mac \u003d \u002791:92:\u0027 + ip2mac"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        # if mac is still empty we fill default value to pass tests"},{"line_number":59,"context_line":"        if self.external_host_mac is None:"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba2be162_65b153e1","line":56,"range":{"start_line":56,"start_character":12,"end_line":56,"end_character":34},"in_reply_to":"ba2be162_45d7ef22","updated":"2017-03-02 14:29:23.000000000","message":"+1","commit_id":"a84e16b80e9b12c6ecdf32a727f126dfd2442509"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"c130d33e815d6dde1d0f4a81bcb072ecc6f942de","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        if self.external_host_ip is not None:"},{"line_number":54,"context_line":"            split_ip \u003d self.external_host_ip.split(\u0027.\u0027)"},{"line_number":55,"context_line":"            ip2mac \u003d \u0027{:02X}:{:02X}:{:02X}:{:02X}\u0027.format(*map(int, split_ip))"},{"line_number":56,"context_line":"            self.external_host_mac \u003d \u002791:92:\u0027 + ip2mac"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        # if mac is still empty we fill default value to pass tests"},{"line_number":59,"context_line":"        if self.external_host_mac is None:"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba2be162_45d7ef22","line":56,"range":{"start_line":56,"start_character":12,"end_line":56,"end_character":34},"in_reply_to":"ba2be162_d269e626","updated":"2017-03-02 14:28:11.000000000","message":"I think I will just remove this configuration parameter. It has no real value to control it from outside.","commit_id":"a84e16b80e9b12c6ecdf32a727f126dfd2442509"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"bd695035345b24bcbfba66935a0d0e6b06e54577","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        if self.external_host_ip is not None:"},{"line_number":53,"context_line":"            split_ip \u003d self.external_host_ip.split(\u0027.\u0027)"},{"line_number":54,"context_line":"            ip2mac \u003d \u0027{:02X}:{:02X}:{:02X}:{:02X}\u0027.format(*map(int, split_ip))"},{"line_number":55,"context_line":"            self.external_host_mac \u003d \u002791:92:\u0027 + ip2mac"},{"line_number":56,"context_line":"        else:"},{"line_number":57,"context_line":"            # fill default value otherwise"},{"line_number":58,"context_line":"            self.external_host_mac \u003d CHASSIS_MAC"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba2be162_c533bb60","line":55,"range":{"start_line":55,"start_character":37,"end_line":55,"end_character":44},"updated":"2017-03-03 04:53:47.000000000","message":"make it at least a constant, EXTERNAL_HOST_MAC_PREFIX?","commit_id":"0fd67ac14b0b46dc22ebf17279a480245f517db2"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"2898ab91c4b4cc3de913b68113137a2556004b47","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        if self.external_host_ip is not None:"},{"line_number":53,"context_line":"            split_ip \u003d self.external_host_ip.split(\u0027.\u0027)"},{"line_number":54,"context_line":"            ip2mac \u003d \u0027{:02X}:{:02X}:{:02X}:{:02X}\u0027.format(*map(int, split_ip))"},{"line_number":55,"context_line":"            self.external_host_mac \u003d \u002791:92:\u0027 + ip2mac"},{"line_number":56,"context_line":"        else:"},{"line_number":57,"context_line":"            # fill default value otherwise"},{"line_number":58,"context_line":"            self.external_host_mac \u003d CHASSIS_MAC"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba2be162_adeaf071","line":55,"range":{"start_line":55,"start_character":37,"end_line":55,"end_character":44},"in_reply_to":"ba2be162_c533bb60","updated":"2017-03-05 13:03:16.000000000","message":"Done","commit_id":"0fd67ac14b0b46dc22ebf17279a480245f517db2"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"bd695035345b24bcbfba66935a0d0e6b06e54577","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            split_ip \u003d self.external_host_ip.split(\u0027.\u0027)"},{"line_number":54,"context_line":"            ip2mac \u003d \u0027{:02X}:{:02X}:{:02X}:{:02X}\u0027.format(*map(int, split_ip))"},{"line_number":55,"context_line":"            self.external_host_mac \u003d \u002791:92:\u0027 + ip2mac"},{"line_number":56,"context_line":"        else:"},{"line_number":57,"context_line":"            # fill default value otherwise"},{"line_number":58,"context_line":"            self.external_host_mac \u003d CHASSIS_MAC"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ba2be162_45da6b18","line":56,"updated":"2017-03-03 04:53:47.000000000","message":"does it make sense? could this line throw an exception instead?","commit_id":"0fd67ac14b0b46dc22ebf17279a480245f517db2"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"2898ab91c4b4cc3de913b68113137a2556004b47","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            split_ip \u003d self.external_host_ip.split(\u0027.\u0027)"},{"line_number":54,"context_line":"            ip2mac \u003d \u0027{:02X}:{:02X}:{:02X}:{:02X}\u0027.format(*map(int, split_ip))"},{"line_number":55,"context_line":"            self.external_host_mac \u003d \u002791:92:\u0027 + ip2mac"},{"line_number":56,"context_line":"        else:"},{"line_number":57,"context_line":"            # fill default value otherwise"},{"line_number":58,"context_line":"            self.external_host_mac \u003d CHASSIS_MAC"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ba2be162_6d9b9818","line":56,"in_reply_to":"ba2be162_45da6b18","updated":"2017-03-05 13:03:16.000000000","message":"Done","commit_id":"0fd67ac14b0b46dc22ebf17279a480245f517db2"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"bd695035345b24bcbfba66935a0d0e6b06e54577","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        # install strategy flows on first VM port"},{"line_number":65,"context_line":"        if self.external_host_ip is None:"},{"line_number":66,"context_line":"            LOG.warning(_LW(\"SNAT application is disabled/ in test mode\""},{"line_number":67,"context_line":"                            \"please supply external_host_ip conf. parameter\"))"},{"line_number":68,"context_line":"        else:"},{"line_number":69,"context_line":"            self.install_strategy_based_flows()"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ba2be162_a50b278d","line":67,"updated":"2017-03-03 04:53:47.000000000","message":"just log warning? or throw an exception?","commit_id":"0fd67ac14b0b46dc22ebf17279a480245f517db2"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"53ea9c077127f58022a51feaeb4166505ee7ee2a","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        self.external_ofport \u003d self.vswitch_api.get_port_ofport("},{"line_number":62,"context_line":"                self.ex_peer_patch_port)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        # install strategy flows on first VM port"},{"line_number":65,"context_line":"        if self.external_host_ip is None:"},{"line_number":66,"context_line":"            raise Exception(_(\u0027Please set external_host_ip conf. parameter \u0027"},{"line_number":67,"context_line":"                              \u0027to enable SNAT application\u0027))"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a30ddce_78c04d7d","line":64,"range":{"start_line":64,"start_character":0,"end_line":64,"end_character":49},"updated":"2017-03-08 02:35:44.000000000","message":"The comment doesn\u0027t match the code","commit_id":"c86484f4a66385cf9d23cddbcb1e8dc576810cd2"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"2e7b2ed3ec4e3fe01aa5735fdec752ad70a72a62","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        self.external_ofport \u003d self.vswitch_api.get_port_ofport("},{"line_number":62,"context_line":"                self.ex_peer_patch_port)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        # install strategy flows on first VM port"},{"line_number":65,"context_line":"        if self.external_host_ip is None:"},{"line_number":66,"context_line":"            raise Exception(_(\u0027Please set external_host_ip conf. parameter \u0027"},{"line_number":67,"context_line":"                              \u0027to enable SNAT application\u0027))"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a30ddce_ec9b9a70","line":64,"range":{"start_line":64,"start_character":0,"end_line":64,"end_character":49},"in_reply_to":"9a30ddce_78c04d7d","updated":"2017-03-08 08:18:38.000000000","message":"fixed","commit_id":"c86484f4a66385cf9d23cddbcb1e8dc576810cd2"}],"dragonflow/controller/common/constants.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"4db62fb5b2833b77f49b490fa8e82c74e34aac1b","unresolved":false,"context_lines":[{"line_number":103,"context_line":"# Ports"},{"line_number":104,"context_line":"MIN_PORT \u003d 1"},{"line_number":105,"context_line":"MAX_PORT \u003d 65535"},{"line_number":106,"context_line":"NAT_TRACKING_ZONE \u003d 65000"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"\"\"\""},{"line_number":109,"context_line":"Cookie Mask"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_8ffe9236","line":106,"updated":"2017-02-12 07:27:54.000000000","message":"Why not 65534 (0xfffe)?","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"db7d2307209741da5c7d3d4b2e22bc7658a4681f","unresolved":false,"context_lines":[{"line_number":103,"context_line":"# Ports"},{"line_number":104,"context_line":"MIN_PORT \u003d 1"},{"line_number":105,"context_line":"MAX_PORT \u003d 65535"},{"line_number":106,"context_line":"NAT_TRACKING_ZONE \u003d 65000"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"\"\"\""},{"line_number":109,"context_line":"Cookie Mask"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_cd6332db","line":106,"in_reply_to":"fa31d9ce_8ffe9236","updated":"2017-02-12 13:03:20.000000000","message":"No problem :)","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7ee80437d51ed4fe02f6c7dd0e24c516e5395209","unresolved":false,"context_lines":[{"line_number":46,"context_line":"IPV6_ND_TABLE \u003d 45"},{"line_number":47,"context_line":"# Handle fip"},{"line_number":48,"context_line":"INGRESS_NAT_TABLE \u003d 50"},{"line_number":49,"context_line":"INGRESS_NAT2_TABLE \u003d 51"},{"line_number":50,"context_line":"# Translate destination mac and port key to reg7 and forward packet to table"},{"line_number":51,"context_line":"# L3_LOOKUP_TABLE. Duplicate broadcase packets."},{"line_number":52,"context_line":"L2_LOOKUP_TABLE \u003d 55"}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_d64009a8","line":49,"range":{"start_line":49,"start_character":0,"end_line":49,"end_character":23},"updated":"2017-02-23 03:51:06.000000000","message":"Should be something more meaningful. e.g. INGRESS_SNAT_TABLE","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"2edad130b7627cc04aa0bbfdaa77d932cddd788b","unresolved":false,"context_lines":[{"line_number":46,"context_line":"IPV6_ND_TABLE \u003d 45"},{"line_number":47,"context_line":"# Handle fip"},{"line_number":48,"context_line":"INGRESS_NAT_TABLE \u003d 50"},{"line_number":49,"context_line":"INGRESS_NAT2_TABLE \u003d 51"},{"line_number":50,"context_line":"# Translate destination mac and port key to reg7 and forward packet to table"},{"line_number":51,"context_line":"# L3_LOOKUP_TABLE. Duplicate broadcase packets."},{"line_number":52,"context_line":"L2_LOOKUP_TABLE \u003d 55"}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_7fd29c5d","line":49,"range":{"start_line":49,"start_character":0,"end_line":49,"end_character":23},"in_reply_to":"da36d5c6_d64009a8","updated":"2017-02-23 14:04:06.000000000","message":"updated according to your suggestion","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7ee80437d51ed4fe02f6c7dd0e24c516e5395209","unresolved":false,"context_lines":[{"line_number":56,"context_line":"L3_PROACTIVE_LOOKUP_TABLE \u003d 65"},{"line_number":57,"context_line":"# Related to dnap app/snat_app"},{"line_number":58,"context_line":"EGRESS_NAT_TABLE \u003d 70"},{"line_number":59,"context_line":"EGRESS_NAT2_TABLE \u003d 71"},{"line_number":60,"context_line":"# Depending on reg7, packet is pushed localy to EGRESS_EXTERNAL_TABLE or"},{"line_number":61,"context_line":"# translated to tunnel."},{"line_number":62,"context_line":"EGRESS_TABLE \u003d 75"}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_b639d543","line":59,"range":{"start_line":59,"start_character":0,"end_line":59,"end_character":17},"updated":"2017-02-23 03:51:06.000000000","message":"EGRESS_SNAT_TABLE","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"2edad130b7627cc04aa0bbfdaa77d932cddd788b","unresolved":false,"context_lines":[{"line_number":56,"context_line":"L3_PROACTIVE_LOOKUP_TABLE \u003d 65"},{"line_number":57,"context_line":"# Related to dnap app/snat_app"},{"line_number":58,"context_line":"EGRESS_NAT_TABLE \u003d 70"},{"line_number":59,"context_line":"EGRESS_NAT2_TABLE \u003d 71"},{"line_number":60,"context_line":"# Depending on reg7, packet is pushed localy to EGRESS_EXTERNAL_TABLE or"},{"line_number":61,"context_line":"# translated to tunnel."},{"line_number":62,"context_line":"EGRESS_TABLE \u003d 75"}],"source_content_type":"text/x-python","patch_set":5,"id":"da36d5c6_9fd7504a","line":59,"range":{"start_line":59,"start_character":0,"end_line":59,"end_character":17},"in_reply_to":"da36d5c6_b639d543","updated":"2017-02-23 14:04:06.000000000","message":"updated according to your suggestion","commit_id":"9d2d7e5eee678be0a72d2b10b09cf922a54bfbd5"}],"dragonflow/controller/snat_app.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"4db62fb5b2833b77f49b490fa8e82c74e34aac1b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"fa31d9ce_0f4e2296","updated":"2017-02-12 07:27:54.000000000","message":"Consider renaming file to chassis_snat_app.py","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"db7d2307209741da5c7d3d4b2e22bc7658a4681f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"fa31d9ce_6df7a6f5","in_reply_to":"fa31d9ce_0f4e2296","updated":"2017-02-12 13:03:20.000000000","message":"Done","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"4db62fb5b2833b77f49b490fa8e82c74e34aac1b","unresolved":false,"context_lines":[{"line_number":47,"context_line":"                                                  self.external_host_mac)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def install_common_flows(self):"},{"line_number":50,"context_line":"        self._install_ingress_goto_rules()"},{"line_number":51,"context_line":"        self._install_snat_ingress_conntrack()"},{"line_number":52,"context_line":"        self._install_egress_goto_rules()"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        parser \u003d self.parser"},{"line_number":55,"context_line":"        match \u003d parser.OFPMatch(eth_type\u003dether.ETH_TYPE_IP)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_af59965c","line":52,"range":{"start_line":50,"start_character":0,"end_line":52,"end_character":41},"updated":"2017-02-12 07:27:54.000000000","message":"nit: This can be moved to the abstract class, and called with \u0027super\u0027 (As it\u0027s duplicated in tenant snat)\n\n(This won\u0027t be a nit in tenant_snat)","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"db7d2307209741da5c7d3d4b2e22bc7658a4681f","unresolved":false,"context_lines":[{"line_number":47,"context_line":"                                                  self.external_host_mac)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def install_common_flows(self):"},{"line_number":50,"context_line":"        self._install_ingress_goto_rules()"},{"line_number":51,"context_line":"        self._install_snat_ingress_conntrack()"},{"line_number":52,"context_line":"        self._install_egress_goto_rules()"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        parser \u003d self.parser"},{"line_number":55,"context_line":"        match \u003d parser.OFPMatch(eth_type\u003dether.ETH_TYPE_IP)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_ad927e9d","line":52,"range":{"start_line":50,"start_character":0,"end_line":52,"end_character":41},"in_reply_to":"fa31d9ce_af59965c","updated":"2017-02-12 13:03:20.000000000","message":"agree","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"4db62fb5b2833b77f49b490fa8e82c74e34aac1b","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                                        lport.get_mac(),"},{"line_number":68,"context_line":"                                        self.external_host_mac)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def remove_common_flows(self):"},{"line_number":71,"context_line":"        parser \u003d self.parser"},{"line_number":72,"context_line":"        ofproto \u003d self.ofproto"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_ef638e18","line":70,"updated":"2017-02-12 07:27:54.000000000","message":"How come install_common_flows calls pre-defined methods, but remove_common_flows has to call mod_flow directly? Where does this asymetry come from?","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"db7d2307209741da5c7d3d4b2e22bc7658a4681f","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                                        lport.get_mac(),"},{"line_number":68,"context_line":"                                        self.external_host_mac)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def remove_common_flows(self):"},{"line_number":71,"context_line":"        parser \u003d self.parser"},{"line_number":72,"context_line":"        ofproto \u003d self.ofproto"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_2d868e65","line":70,"in_reply_to":"fa31d9ce_ef638e18","updated":"2017-02-12 13:03:20.000000000","message":"Good catch. However this asymmetry is born from amount of code to put in single install method. It was too much code for one function, so I split it apart.  Remove do less work and it remained in single function so far","commit_id":"ff7184cf2b0c47b0db13cd84d7dbd8b98ea70c10"}],"dragonflow/controller/snat_app_mixin.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"c4574d5e18da36dc7d8ec3095c8fd8d95e1cb248","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from dragonflow.controller.common import arp_responder"},{"line_number":23,"context_line":"from dragonflow.controller.common import constants as const"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class SNATApp_mixin(object):"}],"source_content_type":"text/x-python","patch_set":8,"id":"da36d5c6_7d64f1e4","line":25,"range":{"start_line":25,"start_character":0,"end_line":25,"end_character":29},"updated":"2017-02-27 20:51:16.000000000","message":"This can be removed","commit_id":"defb668fee8edfd6abd43e4d9fe046d475884a88"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"afdef2ac0e7fd2f32e684887d79371342116c486","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from dragonflow.controller.common import arp_responder"},{"line_number":23,"context_line":"from dragonflow.controller.common import constants as const"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class SNATApp_mixin(object):"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba2be162_419f3103","line":25,"range":{"start_line":25,"start_character":0,"end_line":25,"end_character":29},"in_reply_to":"da36d5c6_7d64f1e4","updated":"2017-03-01 09:46:30.000000000","message":"reworked and fullstack test requires LOG print in this object","commit_id":"defb668fee8edfd6abd43e4d9fe046d475884a88"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e0fb8af1037e69433f8fd8988e98eef22c0cf93a","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        actions \u003d ["},{"line_number":227,"context_line":"            parser.OFPActionSetField(eth_src\u003dexternal_host_mac),"},{"line_number":228,"context_line":"            parser.OFPActionSetField(eth_dst\u003dvm_mac),"},{"line_number":229,"context_line":"            parser.NXActionRegLoad("},{"line_number":230,"context_line":"                            ofs_nbits\u003dnicira_ext.ofs_nbits(0, 31),"},{"line_number":231,"context_line":"                            dst\u003d\u0027reg7\u0027,"},{"line_number":232,"context_line":"                            value\u003dunique_key),"},{"line_number":233,"context_line":"            parser.NXActionRegMove("},{"line_number":234,"context_line":"                            src_field\u003d\u0027ct_label\u0027,"},{"line_number":235,"context_line":"                            dst_field\u003d\u0027ipv4_dst\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a1ced50_d1b1f390","line":232,"range":{"start_line":229,"start_character":0,"end_line":232,"end_character":46},"updated":"2017-03-20 18:27:11.000000000","message":"Can\u0027t this be replaced by a single flow with action: move:ct_mark[]-\u003ereg7[] ? Instead of one flow per port?","commit_id":"00d4af55ab1adbcabc62ca72f8c98b9640719367"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"002149259678202bbb399ccc5e62bfb2dbc2a704","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        actions \u003d ["},{"line_number":227,"context_line":"            parser.OFPActionSetField(eth_src\u003dexternal_host_mac),"},{"line_number":228,"context_line":"            parser.OFPActionSetField(eth_dst\u003dvm_mac),"},{"line_number":229,"context_line":"            parser.NXActionRegLoad("},{"line_number":230,"context_line":"                            ofs_nbits\u003dnicira_ext.ofs_nbits(0, 31),"},{"line_number":231,"context_line":"                            dst\u003d\u0027reg7\u0027,"},{"line_number":232,"context_line":"                            value\u003dunique_key),"},{"line_number":233,"context_line":"            parser.NXActionRegMove("},{"line_number":234,"context_line":"                            src_field\u003d\u0027ct_label\u0027,"},{"line_number":235,"context_line":"                            dst_field\u003d\u0027ipv4_dst\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a1ced50_c2d02cf9","line":232,"range":{"start_line":229,"start_character":0,"end_line":232,"end_character":46},"in_reply_to":"1a1ced50_87b726f4","updated":"2017-03-21 09:14:49.000000000","message":"Makes sense.","commit_id":"00d4af55ab1adbcabc62ca72f8c98b9640719367"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"e90639ff46b39e777f1763231012bd51b978272c","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        actions \u003d ["},{"line_number":227,"context_line":"            parser.OFPActionSetField(eth_src\u003dexternal_host_mac),"},{"line_number":228,"context_line":"            parser.OFPActionSetField(eth_dst\u003dvm_mac),"},{"line_number":229,"context_line":"            parser.NXActionRegLoad("},{"line_number":230,"context_line":"                            ofs_nbits\u003dnicira_ext.ofs_nbits(0, 31),"},{"line_number":231,"context_line":"                            dst\u003d\u0027reg7\u0027,"},{"line_number":232,"context_line":"                            value\u003dunique_key),"},{"line_number":233,"context_line":"            parser.NXActionRegMove("},{"line_number":234,"context_line":"                            src_field\u003d\u0027ct_label\u0027,"},{"line_number":235,"context_line":"                            dst_field\u003d\u0027ipv4_dst\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a1ced50_87b726f4","line":232,"range":{"start_line":229,"start_character":0,"end_line":232,"end_character":46},"in_reply_to":"1a1ced50_d1b1f390","updated":"2017-03-21 08:50:41.000000000","message":"To make it a single flow I need to save at egress 3 variables: unique_id, VM\u0027s MAC and IP addresses. I can pack IP address and MAC into single ct_label field since it is 128 bit long. But I don\u0027t see a good reason.","commit_id":"00d4af55ab1adbcabc62ca72f8c98b9640719367"}],"dragonflow/tests/fullstack/test_snat_flows.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"53ea9c077127f58022a51feaeb4166505ee7ee2a","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        return None"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def _check_if_app_enabled(self):"},{"line_number":34,"context_line":"        if SNAT_APP_NAME in cfg.CONF.df.apps_list:"},{"line_number":35,"context_line":"            return True"},{"line_number":36,"context_line":"        return False"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def _check_port_based_flows(self,"},{"line_number":39,"context_line":"                                flows, hex_port_key, external_host_mac, mac):"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a30ddce_b8680589","line":36,"range":{"start_line":34,"start_character":0,"end_line":36,"end_character":20},"updated":"2017-03-08 02:35:44.000000000","message":"nit: you could just \"return SNAT_APP_NAME in cfg.CONF.df.apps_list\"","commit_id":"c86484f4a66385cf9d23cddbcb1e8dc576810cd2"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"2e7b2ed3ec4e3fe01aa5735fdec752ad70a72a62","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        return None"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def _check_if_app_enabled(self):"},{"line_number":34,"context_line":"        if SNAT_APP_NAME in cfg.CONF.df.apps_list:"},{"line_number":35,"context_line":"            return True"},{"line_number":36,"context_line":"        return False"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def _check_port_based_flows(self,"},{"line_number":39,"context_line":"                                flows, hex_port_key, external_host_mac, mac):"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a30ddce_0cd1ce57","line":36,"range":{"start_line":34,"start_character":0,"end_line":36,"end_character":20},"in_reply_to":"9a30ddce_b8680589","updated":"2017-03-08 08:18:38.000000000","message":"Done","commit_id":"c86484f4a66385cf9d23cddbcb1e8dc576810cd2"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"53ea9c077127f58022a51feaeb4166505ee7ee2a","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        self.assertIsNotNone(external_host_ip)"},{"line_number":71,"context_line":"        split_ip \u003d external_host_ip.split(\u0027.\u0027)"},{"line_number":72,"context_line":"        ip2mac \u003d \u0027{:02x}:{:02x}:{:02x}:{:02x}\u0027.format(*map(int, split_ip))"},{"line_number":73,"context_line":"        external_host_mac \u003d \u002791:92:\u0027 + ip2mac"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        subnet \u003d self.neutron.create_subnet({\u0027subnet\u0027: subnet})"},{"line_number":76,"context_line":"        self.assertIsNotNone(subnet)"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a30ddce_78f5adc9","line":73,"range":{"start_line":73,"start_character":28,"end_line":73,"end_character":36},"updated":"2017-03-08 02:35:44.000000000","message":"Can this use the same constant as the snat app?","commit_id":"c86484f4a66385cf9d23cddbcb1e8dc576810cd2"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"2e7b2ed3ec4e3fe01aa5735fdec752ad70a72a62","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        self.assertIsNotNone(external_host_ip)"},{"line_number":71,"context_line":"        split_ip \u003d external_host_ip.split(\u0027.\u0027)"},{"line_number":72,"context_line":"        ip2mac \u003d \u0027{:02x}:{:02x}:{:02x}:{:02x}\u0027.format(*map(int, split_ip))"},{"line_number":73,"context_line":"        external_host_mac \u003d \u002791:92:\u0027 + ip2mac"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        subnet \u003d self.neutron.create_subnet({\u0027subnet\u0027: subnet})"},{"line_number":76,"context_line":"        self.assertIsNotNone(subnet)"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a30ddce_4cde6640","line":73,"range":{"start_line":73,"start_character":28,"end_line":73,"end_character":36},"in_reply_to":"9a30ddce_78f5adc9","updated":"2017-03-08 08:18:38.000000000","message":"OK, I moved this constant to common place to be used by application and test","commit_id":"c86484f4a66385cf9d23cddbcb1e8dc576810cd2"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"08b4a6668ac008ffeaeeb151d2f1a7031a713e40","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        vm.server.stop()"},{"line_number":102,"context_line":"        vm.close()"},{"line_number":103,"context_line":"        network.close()"},{"line_number":104,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba2be162_889ee160","line":104,"updated":"2017-03-06 12:50:03.000000000","message":"Can you add a test that sends packets between the vm port and a local socket?\n\ne.g.\n 1) spawn a thread to act as echo server\n 2) send a packet to that thread based on the local machine IP and port the thread bound to\n 3) Verify the packet reached both the echo server and vm port on its way back.","commit_id":"c86484f4a66385cf9d23cddbcb1e8dc576810cd2"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"2e7b2ed3ec4e3fe01aa5735fdec752ad70a72a62","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        vm.server.stop()"},{"line_number":102,"context_line":"        vm.close()"},{"line_number":103,"context_line":"        network.close()"},{"line_number":104,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a30ddce_8ccf7e7e","line":104,"in_reply_to":"9a30ddce_435c7eed","updated":"2017-03-08 08:18:38.000000000","message":"I will use a way you or Dima proposed in separate patch","commit_id":"c86484f4a66385cf9d23cddbcb1e8dc576810cd2"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"53ea9c077127f58022a51feaeb4166505ee7ee2a","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        vm.server.stop()"},{"line_number":102,"context_line":"        vm.close()"},{"line_number":103,"context_line":"        network.close()"},{"line_number":104,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a30ddce_435c7eed","line":104,"in_reply_to":"ba2be162_889ee160","updated":"2017-03-08 02:35:44.000000000","message":"An alternative will be, treating br-ex as the external host. Ping br-ex from VM port, and expect the packets come back. I used this way in the fullstack of DNAT.","commit_id":"c86484f4a66385cf9d23cddbcb1e8dc576810cd2"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"2e7b2ed3ec4e3fe01aa5735fdec752ad70a72a62","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        vm.server.stop()"},{"line_number":102,"context_line":"        vm.close()"},{"line_number":103,"context_line":"        network.close()"},{"line_number":104,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a30ddce_eced5af0","line":104,"in_reply_to":"ba2be162_889ee160","updated":"2017-03-08 08:18:38.000000000","message":"I will add such \u0027ping\u0027 test later","commit_id":"c86484f4a66385cf9d23cddbcb1e8dc576810cd2"}],"dragonflow/tests/unit/test_chassis_snat_app.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"53ea9c077127f58022a51feaeb4166505ee7ee2a","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def test_switch_features_handler(self):"},{"line_number":36,"context_line":"        ev \u003d mock.Mock()"},{"line_number":37,"context_line":"        ev.msg \u003d mock.Mock()"},{"line_number":38,"context_line":"        ev.msg.datapath \u003d mock.Mock()"},{"line_number":39,"context_line":"        ev.msg.datapath.ofproto \u003d mock.Mock()"},{"line_number":40,"context_line":"        ev.msg.datapath.ofproto.OFP_VERSION \u003d 0x04"},{"line_number":41,"context_line":"        self.controller.open_flow_app.switch_features_handler(ev)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        self.SNAT_app.add_flow_go_to_table.assert_has_calls("}],"source_content_type":"text/x-python","patch_set":14,"id":"9a30ddce_be19cd7b","line":40,"range":{"start_line":37,"start_character":0,"end_line":40,"end_character":50},"updated":"2017-03-08 02:35:44.000000000","message":"nit: these lines are not required, the mock.Mock() object will create attributes as mock automatically.","commit_id":"c86484f4a66385cf9d23cddbcb1e8dc576810cd2"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"2e7b2ed3ec4e3fe01aa5735fdec752ad70a72a62","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def test_switch_features_handler(self):"},{"line_number":36,"context_line":"        ev \u003d mock.Mock()"},{"line_number":37,"context_line":"        ev.msg \u003d mock.Mock()"},{"line_number":38,"context_line":"        ev.msg.datapath \u003d mock.Mock()"},{"line_number":39,"context_line":"        ev.msg.datapath.ofproto \u003d mock.Mock()"},{"line_number":40,"context_line":"        ev.msg.datapath.ofproto.OFP_VERSION \u003d 0x04"},{"line_number":41,"context_line":"        self.controller.open_flow_app.switch_features_handler(ev)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        self.SNAT_app.add_flow_go_to_table.assert_has_calls("}],"source_content_type":"text/x-python","patch_set":14,"id":"9a30ddce_4caca6a0","line":40,"range":{"start_line":37,"start_character":0,"end_line":40,"end_character":50},"in_reply_to":"9a30ddce_be19cd7b","updated":"2017-03-08 08:18:38.000000000","message":"Done","commit_id":"c86484f4a66385cf9d23cddbcb1e8dc576810cd2"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e0fb8af1037e69433f8fd8988e98eef22c0cf93a","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                       constants.INGRESS_CLASSIFICATION_DISPATCH_TABLE,"},{"line_number":43,"context_line":"                       constants.PRIORITY_DEFAULT,"},{"line_number":44,"context_line":"                       constants.INGRESS_NAT_TABLE,"},{"line_number":45,"context_line":"                       match\u003dmock.ANY),"},{"line_number":46,"context_line":"             mock.call("},{"line_number":47,"context_line":"                       constants.L3_LOOKUP_TABLE,"},{"line_number":48,"context_line":"                       constants.PRIORITY_MEDIUM_LOW,"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a1ced50_1aa3b250","line":45,"range":{"start_line":45,"start_character":34,"end_line":45,"end_character":37},"updated":"2017-03-20 18:27:11.000000000","message":"It\u0027s better to test against a specific match and inst, rather than mock.ANY.","commit_id":"00d4af55ab1adbcabc62ca72f8c98b9640719367"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"e90639ff46b39e777f1763231012bd51b978272c","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                       constants.INGRESS_CLASSIFICATION_DISPATCH_TABLE,"},{"line_number":43,"context_line":"                       constants.PRIORITY_DEFAULT,"},{"line_number":44,"context_line":"                       constants.INGRESS_NAT_TABLE,"},{"line_number":45,"context_line":"                       match\u003dmock.ANY),"},{"line_number":46,"context_line":"             mock.call("},{"line_number":47,"context_line":"                       constants.L3_LOOKUP_TABLE,"},{"line_number":48,"context_line":"                       constants.PRIORITY_MEDIUM_LOW,"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a1ced50_67586a8b","line":45,"range":{"start_line":45,"start_character":34,"end_line":45,"end_character":37},"in_reply_to":"1a1ced50_1aa3b250","updated":"2017-03-21 08:50:41.000000000","message":"this is tested in fullstack test","commit_id":"00d4af55ab1adbcabc62ca72f8c98b9640719367"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"002149259678202bbb399ccc5e62bfb2dbc2a704","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                       constants.INGRESS_CLASSIFICATION_DISPATCH_TABLE,"},{"line_number":43,"context_line":"                       constants.PRIORITY_DEFAULT,"},{"line_number":44,"context_line":"                       constants.INGRESS_NAT_TABLE,"},{"line_number":45,"context_line":"                       match\u003dmock.ANY),"},{"line_number":46,"context_line":"             mock.call("},{"line_number":47,"context_line":"                       constants.L3_LOOKUP_TABLE,"},{"line_number":48,"context_line":"                       constants.PRIORITY_MEDIUM_LOW,"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a1ced50_02d7a4ed","line":45,"range":{"start_line":45,"start_character":34,"end_line":45,"end_character":37},"in_reply_to":"1a1ced50_67586a8b","updated":"2017-03-21 09:14:49.000000000","message":"Good enough.","commit_id":"00d4af55ab1adbcabc62ca72f8c98b9640719367"}]}
