)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"2b2055e536d9592f269e9afa4b642527697de20f","unresolved":false,"context_lines":[{"line_number":12,"context_line":"Global sNAT mode has 2 configuration parameters"},{"line_number":13,"context_line":"Tenant sNAT mode has extra DF controller parameter to allocate provider IPs"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Implements: Distributed SNAT spec https://review.openstack.org/#/c/397992"},{"line_number":16,"context_line":"Change-Id: I2e8498462f7595823cde67afd4b506dfa8cc2f42"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1a430d35_06b534ed","line":15,"updated":"2017-02-06 07:45:22.000000000","message":"please follow the guideline at http://docs.openstack.org/infra/manual/developers.html#committing-a-change\nto reference the blueprint post its launchpad name (snat-distribution), so the link to the code patch will be added to the blueprint page","commit_id":"b8b70f759e454659339ccbd030ab918219e812d4"}],"dragonflow/conf/df_connector.py":[{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"2b2055e536d9592f269e9afa4b642527697de20f","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    cfg.StrOpt(\u0027external_network_bridge\u0027,"},{"line_number":22,"context_line":"               default\u003d\u0027br-ex\u0027,"},{"line_number":23,"context_line":"               help\u003d_(\"Name of bridge used for external network traffic\")),"},{"line_number":24,"context_line":"    cfg.StrOpt(\u0027int_peer_patch_port\u0027, default\u003d\u0027patch-ex\u0027,"},{"line_number":25,"context_line":"               help\u003d_(\"Peer patch port in integration bridge for external \""},{"line_number":26,"context_line":"                      \"bridge.\")),"},{"line_number":27,"context_line":"    cfg.StrOpt(\u0027ex_peer_patch_port\u0027, default\u003d\u0027patch-int\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_86c9247b","line":24,"range":{"start_line":24,"start_character":38,"end_line":24,"end_character":57},"updated":"2017-02-06 07:45:22.000000000","message":"please break the line for better readability","commit_id":"b8b70f759e454659339ccbd030ab918219e812d4"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"4da9f3fa4a071967509df2eb0db3740df200b246","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    cfg.StrOpt(\u0027external_network_bridge\u0027,"},{"line_number":22,"context_line":"               default\u003d\u0027br-ex\u0027,"},{"line_number":23,"context_line":"               help\u003d_(\"Name of bridge used for external network traffic\")),"},{"line_number":24,"context_line":"    cfg.StrOpt(\u0027int_peer_patch_port\u0027, default\u003d\u0027patch-ex\u0027,"},{"line_number":25,"context_line":"               help\u003d_(\"Peer patch port in integration bridge for external \""},{"line_number":26,"context_line":"                      \"bridge.\")),"},{"line_number":27,"context_line":"    cfg.StrOpt(\u0027ex_peer_patch_port\u0027, default\u003d\u0027patch-int\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_032a672c","line":24,"range":{"start_line":24,"start_character":38,"end_line":24,"end_character":57},"in_reply_to":"1a430d35_86c9247b","updated":"2017-02-07 10:34:40.000000000","message":"Done","commit_id":"b8b70f759e454659339ccbd030ab918219e812d4"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"2b2055e536d9592f269e9afa4b642527697de20f","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    cfg.StrOpt(\u0027int_peer_patch_port\u0027, default\u003d\u0027patch-ex\u0027,"},{"line_number":25,"context_line":"               help\u003d_(\"Peer patch port in integration bridge for external \""},{"line_number":26,"context_line":"                      \"bridge.\")),"},{"line_number":27,"context_line":"    cfg.StrOpt(\u0027ex_peer_patch_port\u0027, default\u003d\u0027patch-int\u0027,"},{"line_number":28,"context_line":"               help\u003d_(\"Peer patch port in external bridge for integration \""},{"line_number":29,"context_line":"                      \"bridge.\")),"},{"line_number":30,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_a6c4605f","line":27,"range":{"start_line":27,"start_character":37,"end_line":27,"end_character":57},"updated":"2017-02-06 07:45:22.000000000","message":"ditto","commit_id":"b8b70f759e454659339ccbd030ab918219e812d4"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"4da9f3fa4a071967509df2eb0db3740df200b246","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    cfg.StrOpt(\u0027int_peer_patch_port\u0027, default\u003d\u0027patch-ex\u0027,"},{"line_number":25,"context_line":"               help\u003d_(\"Peer patch port in integration bridge for external \""},{"line_number":26,"context_line":"                      \"bridge.\")),"},{"line_number":27,"context_line":"    cfg.StrOpt(\u0027ex_peer_patch_port\u0027, default\u003d\u0027patch-int\u0027,"},{"line_number":28,"context_line":"               help\u003d_(\"Peer patch port in external bridge for integration \""},{"line_number":29,"context_line":"                      \"bridge.\")),"},{"line_number":30,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_2321234e","line":27,"range":{"start_line":27,"start_character":37,"end_line":27,"end_character":57},"in_reply_to":"1a430d35_a6c4605f","updated":"2017-02-07 10:34:40.000000000","message":"Done","commit_id":"b8b70f759e454659339ccbd030ab918219e812d4"}],"dragonflow/controller/base_snat_app.py":[{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"2b2055e536d9592f269e9afa4b642527697de20f","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":43,"context_line":"        LOG.info(_LI(\"Loading SNAT application ... \"))"},{"line_number":44,"context_line":"        super(BaseSNATApp, self).__init__(*args, **kwargs)"},{"line_number":45,"context_line":"        self.external_network_bridge \u003d \\"},{"line_number":46,"context_line":"            cfg.CONF.df_connector_app.external_network_bridge"},{"line_number":47,"context_line":"        self.ex_peer_patch_port \u003d \\"},{"line_number":48,"context_line":"            cfg.CONF.df_connector_app.ex_peer_patch_port"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_e6a4a8ba","line":45,"range":{"start_line":45,"start_character":38,"end_line":45,"end_character":40},"updated":"2017-02-06 07:45:22.000000000","message":"I think its not according to the Openstack guidelines to use \\, consider using () instead","commit_id":"b8b70f759e454659339ccbd030ab918219e812d4"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"4da9f3fa4a071967509df2eb0db3740df200b246","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":43,"context_line":"        LOG.info(_LI(\"Loading SNAT application ... \"))"},{"line_number":44,"context_line":"        super(BaseSNATApp, self).__init__(*args, **kwargs)"},{"line_number":45,"context_line":"        self.external_network_bridge \u003d \\"},{"line_number":46,"context_line":"            cfg.CONF.df_connector_app.external_network_bridge"},{"line_number":47,"context_line":"        self.ex_peer_patch_port \u003d \\"},{"line_number":48,"context_line":"            cfg.CONF.df_connector_app.ex_peer_patch_port"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_83ed77f1","line":45,"range":{"start_line":45,"start_character":38,"end_line":45,"end_character":40},"in_reply_to":"1a430d35_e6a4a8ba","updated":"2017-02-07 10:34:40.000000000","message":"Done","commit_id":"b8b70f759e454659339ccbd030ab918219e812d4"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"2b2055e536d9592f269e9afa4b642527697de20f","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        LOG.info(_LI(\"SNAT application: add local port  %(lport)s\"),"},{"line_number":126,"context_line":"                {\u0027lport\u0027: lport})"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        # install flows only when compute port is added"},{"line_number":129,"context_line":"        if lport.get_device_owner().startswith("},{"line_number":130,"context_line":"                        n_const.DEVICE_OWNER_COMPUTE_PREFIX):"},{"line_number":131,"context_line":"            self.chassis \u003d lport.get_chassis()"},{"line_number":132,"context_line":"            # install flows only on first port add"},{"line_number":133,"context_line":"            # flows are agnostic of port amount and tenant id"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_26af9095","line":130,"range":{"start_line":128,"start_character":7,"end_line":130,"end_character":61},"updated":"2017-02-06 07:45:22.000000000","message":"what will be for Container?","commit_id":"b8b70f759e454659339ccbd030ab918219e812d4"}],"dragonflow/controller/snat_app.py":[{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"2b2055e536d9592f269e9afa4b642527697de20f","unresolved":false,"context_lines":[{"line_number":24,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class SNATApp(base_snat_app.BaseSNATApp):"},{"line_number":28,"context_line":"    \"\"\"Implements single global IP allocation strategy for all hosted VMs"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    Methods provide strategy specific operations"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_a69b8071","line":27,"range":{"start_line":27,"start_character":6,"end_line":27,"end_character":13},"updated":"2017-02-06 07:45:22.000000000","message":"Maybe name should be more descriptive, i.e. include Strategy name in the name","commit_id":"b8b70f759e454659339ccbd030ab918219e812d4"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"4da9f3fa4a071967509df2eb0db3740df200b246","unresolved":false,"context_lines":[{"line_number":24,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class SNATApp(base_snat_app.BaseSNATApp):"},{"line_number":28,"context_line":"    \"\"\"Implements single global IP allocation strategy for all hosted VMs"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    Methods provide strategy specific operations"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_c716aa54","line":27,"range":{"start_line":27,"start_character":6,"end_line":27,"end_character":13},"in_reply_to":"1a430d35_a69b8071","updated":"2017-02-07 10:34:40.000000000","message":"changed to ChassisSnatApp","commit_id":"b8b70f759e454659339ccbd030ab918219e812d4"}],"dragonflow/controller/tenant_snat_app.py":[{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"2b2055e536d9592f269e9afa4b642527697de20f","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        parser \u003d self.parser"},{"line_number":42,"context_line":"        for lport in ports:"},{"line_number":43,"context_line":"            if lport.get_device_owner().startswith("},{"line_number":44,"context_line":"                        n_const.DEVICE_OWNER_COMPUTE_PREFIX):"},{"line_number":45,"context_line":"                match \u003d parser.OFPMatch(eth_type\u003dether.ETH_TYPE_IP,"},{"line_number":46,"context_line":"                                        eth_src\u003dlport.get_mac())"},{"line_number":47,"context_line":"                self._install_snat_egress_after_conntrack(match,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_6936c9e8","line":44,"range":{"start_line":44,"start_character":23,"end_line":44,"end_character":60},"updated":"2017-02-06 07:45:22.000000000","message":"better have this as some common method in the base, so once it will be modified, it will be only one place to update.","commit_id":"b8b70f759e454659339ccbd030ab918219e812d4"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"4da9f3fa4a071967509df2eb0db3740df200b246","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        parser \u003d self.parser"},{"line_number":42,"context_line":"        for lport in ports:"},{"line_number":43,"context_line":"            if lport.get_device_owner().startswith("},{"line_number":44,"context_line":"                        n_const.DEVICE_OWNER_COMPUTE_PREFIX):"},{"line_number":45,"context_line":"                match \u003d parser.OFPMatch(eth_type\u003dether.ETH_TYPE_IP,"},{"line_number":46,"context_line":"                                        eth_src\u003dlport.get_mac())"},{"line_number":47,"context_line":"                self._install_snat_egress_after_conntrack(match,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_0a10b74d","line":44,"range":{"start_line":44,"start_character":23,"end_line":44,"end_character":60},"in_reply_to":"1a430d35_6936c9e8","updated":"2017-02-07 10:34:40.000000000","message":"Done","commit_id":"b8b70f759e454659339ccbd030ab918219e812d4"}],"dragonflow/neutron/ml2/mech_driver.py":[{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"2b2055e536d9592f269e9afa4b642527697de20f","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                                            is_neutron_server\u003dTrue)"},{"line_number":84,"context_line":"            self.port_status \u003d None"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        # this parameter allows controls local ip allocation from"},{"line_number":87,"context_line":"        #   external subnet"},{"line_number":88,"context_line":"        self.enable_addr_alloc_for_snat \u003d \\"},{"line_number":89,"context_line":"            cfg.CONF.df.enable_addr_alloc_for_snat"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_c94dfd73","line":86,"range":{"start_line":86,"start_character":25,"end_line":86,"end_character":41},"updated":"2017-02-06 07:45:22.000000000","message":"drop \u0027allows\u0027","commit_id":"b8b70f759e454659339ccbd030ab918219e812d4"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"4da9f3fa4a071967509df2eb0db3740df200b246","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                                            is_neutron_server\u003dTrue)"},{"line_number":84,"context_line":"            self.port_status \u003d None"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        # this parameter allows controls local ip allocation from"},{"line_number":87,"context_line":"        #   external subnet"},{"line_number":88,"context_line":"        self.enable_addr_alloc_for_snat \u003d \\"},{"line_number":89,"context_line":"            cfg.CONF.df.enable_addr_alloc_for_snat"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_1a9b7c73","line":86,"range":{"start_line":86,"start_character":25,"end_line":86,"end_character":41},"in_reply_to":"1a430d35_c94dfd73","updated":"2017-02-07 10:34:40.000000000","message":"Done","commit_id":"b8b70f759e454659339ccbd030ab918219e812d4"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"2b2055e536d9592f269e9afa4b642527697de20f","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        # this parameter allows controls local ip allocation from"},{"line_number":87,"context_line":"        #   external subnet"},{"line_number":88,"context_line":"        self.enable_addr_alloc_for_snat \u003d \\"},{"line_number":89,"context_line":"            cfg.CONF.df.enable_addr_alloc_for_snat"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def subscribe_registries(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_e950f90c","line":88,"range":{"start_line":88,"start_character":41,"end_line":88,"end_character":43},"updated":"2017-02-06 07:45:22.000000000","message":"use () instead","commit_id":"b8b70f759e454659339ccbd030ab918219e812d4"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"4da9f3fa4a071967509df2eb0db3740df200b246","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        # this parameter allows controls local ip allocation from"},{"line_number":87,"context_line":"        #   external subnet"},{"line_number":88,"context_line":"        self.enable_addr_alloc_for_snat \u003d \\"},{"line_number":89,"context_line":"            cfg.CONF.df.enable_addr_alloc_for_snat"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def subscribe_registries(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_5a8fc429","line":88,"range":{"start_line":88,"start_character":41,"end_line":88,"end_character":43},"in_reply_to":"1a430d35_e950f90c","updated":"2017-02-07 10:34:40.000000000","message":"Done","commit_id":"b8b70f759e454659339ccbd030ab918219e812d4"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"2b2055e536d9592f269e9afa4b642527697de20f","unresolved":false,"context_lines":[{"line_number":656,"context_line":"        # this code block allows support for tenant based local sNAT"},{"line_number":657,"context_line":"        # internal methods create local gateway port and extract its"},{"line_number":658,"context_line":"        #    ip,mac addresses for further wire sNAT DF flows"},{"line_number":659,"context_line":"        if self.enable_addr_alloc_for_snat is True and \\"},{"line_number":660,"context_line":"            updated_port.get(\u0027device_owner\u0027).startswith("},{"line_number":661,"context_line":"                    n_const.DEVICE_OWNER_COMPUTE_PREFIX):"},{"line_number":662,"context_line":""},{"line_number":663,"context_line":"            original_port \u003d context.original"},{"line_number":664,"context_line":"            original_profile \u003d original_port.get(\u0027binding:profile\u0027)"},{"line_number":665,"context_line":"            if \u0027external_host_ip\u0027 not in original_profile:"},{"line_number":666,"context_line":"                external_host_ip, external_host_mac \u003d \\"},{"line_number":667,"context_line":"                    self._extract_local_bind_info(context, updated_port)"},{"line_number":668,"context_line":""},{"line_number":669,"context_line":"                if external_host_ip is not None:"},{"line_number":670,"context_line":"                    binding_profile.update("},{"line_number":671,"context_line":"                                    {\u0027external_host_ip\u0027: external_host_ip,"},{"line_number":672,"context_line":"                                    \u0027external_host_mac\u0027: external_host_mac})"},{"line_number":673,"context_line":"                    updated_port[\u0027binding:profile\u0027] \u003d binding_profile"},{"line_number":674,"context_line":""},{"line_number":675,"context_line":"        ips \u003d [ip[\u0027ip_address\u0027] for ip in updated_port.get(\u0027fixed_ips\u0027, [])]"},{"line_number":676,"context_line":"        subnets \u003d [ip[\u0027subnet_id\u0027] for ip in updated_port.get(\u0027fixed_ips\u0027, [])]"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_9647851c","line":673,"range":{"start_line":659,"start_character":8,"end_line":673,"end_character":69},"updated":"2017-02-06 07:45:22.000000000","message":"I am not sure it belongs into ml2 context","commit_id":"b8b70f759e454659339ccbd030ab918219e812d4"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"9d4ca7017c6facb25bf3c428b2d6ffcc3ab3ee79","unresolved":false,"context_lines":[{"line_number":656,"context_line":"        # this code block allows support for tenant based local sNAT"},{"line_number":657,"context_line":"        # internal methods create local gateway port and extract its"},{"line_number":658,"context_line":"        #    ip,mac addresses for further wire sNAT DF flows"},{"line_number":659,"context_line":"        if self.enable_addr_alloc_for_snat is True and \\"},{"line_number":660,"context_line":"            updated_port.get(\u0027device_owner\u0027).startswith("},{"line_number":661,"context_line":"                    n_const.DEVICE_OWNER_COMPUTE_PREFIX):"},{"line_number":662,"context_line":""},{"line_number":663,"context_line":"            original_port \u003d context.original"},{"line_number":664,"context_line":"            original_profile \u003d original_port.get(\u0027binding:profile\u0027)"},{"line_number":665,"context_line":"            if \u0027external_host_ip\u0027 not in original_profile:"},{"line_number":666,"context_line":"                external_host_ip, external_host_mac \u003d \\"},{"line_number":667,"context_line":"                    self._extract_local_bind_info(context, updated_port)"},{"line_number":668,"context_line":""},{"line_number":669,"context_line":"                if external_host_ip is not None:"},{"line_number":670,"context_line":"                    binding_profile.update("},{"line_number":671,"context_line":"                                    {\u0027external_host_ip\u0027: external_host_ip,"},{"line_number":672,"context_line":"                                    \u0027external_host_mac\u0027: external_host_mac})"},{"line_number":673,"context_line":"                    updated_port[\u0027binding:profile\u0027] \u003d binding_profile"},{"line_number":674,"context_line":""},{"line_number":675,"context_line":"        ips \u003d [ip[\u0027ip_address\u0027] for ip in updated_port.get(\u0027fixed_ips\u0027, [])]"},{"line_number":676,"context_line":"        subnets \u003d [ip[\u0027subnet_id\u0027] for ip in updated_port.get(\u0027fixed_ips\u0027, [])]"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_ed227751","line":673,"range":{"start_line":659,"start_character":8,"end_line":673,"end_character":69},"in_reply_to":"1a430d35_1a029c0b","updated":"2017-02-07 12:19:50.000000000","message":"I am not sure the extension of the existing resource you are doing is the one neutron planned for. You are not actually extending the neutron resource, but causing then modification between neutron object and the one sent to Dragonflow. By putting the added logic here to diverge neutron port object and the one sent to the dragonflow will make DB sync application dependent.\nImplementation wise, modification instead of extension of the existing functionality is usually not a good thing.","commit_id":"b8b70f759e454659339ccbd030ab918219e812d4"},{"author":{"_account_id":24229,"name":"Igor Shafran","email":"igor.shafran@toganetworks.com","username":"ishafran"},"change_message_id":"4da9f3fa4a071967509df2eb0db3740df200b246","unresolved":false,"context_lines":[{"line_number":656,"context_line":"        # this code block allows support for tenant based local sNAT"},{"line_number":657,"context_line":"        # internal methods create local gateway port and extract its"},{"line_number":658,"context_line":"        #    ip,mac addresses for further wire sNAT DF flows"},{"line_number":659,"context_line":"        if self.enable_addr_alloc_for_snat is True and \\"},{"line_number":660,"context_line":"            updated_port.get(\u0027device_owner\u0027).startswith("},{"line_number":661,"context_line":"                    n_const.DEVICE_OWNER_COMPUTE_PREFIX):"},{"line_number":662,"context_line":""},{"line_number":663,"context_line":"            original_port \u003d context.original"},{"line_number":664,"context_line":"            original_profile \u003d original_port.get(\u0027binding:profile\u0027)"},{"line_number":665,"context_line":"            if \u0027external_host_ip\u0027 not in original_profile:"},{"line_number":666,"context_line":"                external_host_ip, external_host_mac \u003d \\"},{"line_number":667,"context_line":"                    self._extract_local_bind_info(context, updated_port)"},{"line_number":668,"context_line":""},{"line_number":669,"context_line":"                if external_host_ip is not None:"},{"line_number":670,"context_line":"                    binding_profile.update("},{"line_number":671,"context_line":"                                    {\u0027external_host_ip\u0027: external_host_ip,"},{"line_number":672,"context_line":"                                    \u0027external_host_mac\u0027: external_host_mac})"},{"line_number":673,"context_line":"                    updated_port[\u0027binding:profile\u0027] \u003d binding_profile"},{"line_number":674,"context_line":""},{"line_number":675,"context_line":"        ips \u003d [ip[\u0027ip_address\u0027] for ip in updated_port.get(\u0027fixed_ips\u0027, [])]"},{"line_number":676,"context_line":"        subnets \u003d [ip[\u0027subnet_id\u0027] for ip in updated_port.get(\u0027fixed_ips\u0027, [])]"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_1a029c0b","line":673,"range":{"start_line":659,"start_character":8,"end_line":673,"end_character":69},"in_reply_to":"1a430d35_9647851c","updated":"2017-02-07 10:34:40.000000000","message":"I am not agree with you. This code make kind of recursive call to create external port and associated resource in NB database. Moving same logic to separate extension also misses a bit concept of extending existing resource as stated in ExtensionDriver documentation.\nI would like to have more opinions on that","commit_id":"b8b70f759e454659339ccbd030ab918219e812d4"}]}
