)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":18031,"name":"Thomas Bachman","email":"tbachman@yahoo.com","username":"bachmantech"},"change_message_id":"159a9ba3c1042c5a7648c7871209fccce03f54ca","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"5e3aeb9c_7c5d0d95","updated":"2026-06-16 16:00:22.000000000","message":"Mostly questions, one suggestion.","commit_id":"e20828a4fe58a5e557b73d7d8f4e87f32c23429a"}],"networking_cisco/agent/nxos_topology.py":[{"author":{"_account_id":18031,"name":"Thomas Bachman","email":"tbachman@yahoo.com","username":"bachmantech"},"change_message_id":"159a9ba3c1042c5a7648c7871209fccce03f54ca","unresolved":true,"context_lines":[{"line_number":127,"context_line":"                physical_ports \u003d []"},{"line_number":128,"context_line":"                for port in ports:"},{"line_number":129,"context_line":"                    port_type \u003d self._get_port_type(port)"},{"line_number":130,"context_line":"                    if port_type in [\u0027patch\u0027, \u0027internal\u0027]:"},{"line_number":131,"context_line":"                        LOG.debug(\"Skipping port %s (type: %s) on bridge %s\","},{"line_number":132,"context_line":"                                port, port_type, bridge)"},{"line_number":133,"context_line":"                        continue"}],"source_content_type":"text/x-python","patch_set":6,"id":"7da0c014_ecc2c0a0","line":130,"range":{"start_line":130,"start_character":0,"end_line":130,"end_character":58},"updated":"2026-06-16 16:00:22.000000000","message":"I won\u0027t hold it up for this patch, but we should make the exclusion configurable with a regex.","commit_id":"e20828a4fe58a5e557b73d7d8f4e87f32c23429a"},{"author":{"_account_id":32213,"name":"Sayali Vidyadhar Naval","email":"sayalinaval@gmail.com","username":"sayalinaval"},"change_message_id":"4e391f4e2cdedf5966a50a6b9fc4169acd885e58","unresolved":false,"context_lines":[{"line_number":127,"context_line":"                physical_ports \u003d []"},{"line_number":128,"context_line":"                for port in ports:"},{"line_number":129,"context_line":"                    port_type \u003d self._get_port_type(port)"},{"line_number":130,"context_line":"                    if port_type in [\u0027patch\u0027, \u0027internal\u0027]:"},{"line_number":131,"context_line":"                        LOG.debug(\"Skipping port %s (type: %s) on bridge %s\","},{"line_number":132,"context_line":"                                port, port_type, bridge)"},{"line_number":133,"context_line":"                        continue"}],"source_content_type":"text/x-python","patch_set":6,"id":"e70b30af_1ab973ae","line":130,"range":{"start_line":130,"start_character":0,"end_line":130,"end_character":58},"in_reply_to":"7da0c014_ecc2c0a0","updated":"2026-06-16 16:17:16.000000000","message":"Done","commit_id":"e20828a4fe58a5e557b73d7d8f4e87f32c23429a"},{"author":{"_account_id":18031,"name":"Thomas Bachman","email":"tbachman@yahoo.com","username":"bachmantech"},"change_message_id":"159a9ba3c1042c5a7648c7871209fccce03f54ca","unresolved":true,"context_lines":[{"line_number":162,"context_line":"        self.bridge_to_interfaces \u003d self._discover_ovs_bridge_ports()"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        network_labels \u003d []"},{"line_number":165,"context_line":"        for mapping in bridge_mappings.split(\u0027,\u0027):"},{"line_number":166,"context_line":"            mapping \u003d mapping.strip()"},{"line_number":167,"context_line":"            if \u0027:\u0027 not in mapping:"},{"line_number":168,"context_line":"                continue"},{"line_number":169,"context_line":"            physnet, bridge \u003d mapping.split(\u0027:\u0027, 1)"},{"line_number":170,"context_line":"            physnet \u003d physnet.strip()"},{"line_number":171,"context_line":"            bridge \u003d bridge.strip()"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"            interfaces \u003d self.bridge_to_interfaces.get(bridge, [])"},{"line_number":174,"context_line":"            if not interfaces:"}],"source_content_type":"text/x-python","patch_set":6,"id":"6361f9db_cd3973ab","line":171,"range":{"start_line":165,"start_character":0,"end_line":171,"end_character":35},"updated":"2026-06-16 16:00:22.000000000","message":"You can use something similar to this:\nhttps://opendev.org/x/networking-cisco/src/branch/master/networking_cisco/ml2_drivers/ndfc/mech_ndfc.py#L437","commit_id":"e20828a4fe58a5e557b73d7d8f4e87f32c23429a"},{"author":{"_account_id":32213,"name":"Sayali Vidyadhar Naval","email":"sayalinaval@gmail.com","username":"sayalinaval"},"change_message_id":"4e391f4e2cdedf5966a50a6b9fc4169acd885e58","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        self.bridge_to_interfaces \u003d self._discover_ovs_bridge_ports()"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        network_labels \u003d []"},{"line_number":165,"context_line":"        for mapping in bridge_mappings.split(\u0027,\u0027):"},{"line_number":166,"context_line":"            mapping \u003d mapping.strip()"},{"line_number":167,"context_line":"            if \u0027:\u0027 not in mapping:"},{"line_number":168,"context_line":"                continue"},{"line_number":169,"context_line":"            physnet, bridge \u003d mapping.split(\u0027:\u0027, 1)"},{"line_number":170,"context_line":"            physnet \u003d physnet.strip()"},{"line_number":171,"context_line":"            bridge \u003d bridge.strip()"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"            interfaces \u003d self.bridge_to_interfaces.get(bridge, [])"},{"line_number":174,"context_line":"            if not interfaces:"}],"source_content_type":"text/x-python","patch_set":6,"id":"5e45b8b7_8f15533d","line":171,"range":{"start_line":165,"start_character":0,"end_line":171,"end_character":35},"in_reply_to":"6361f9db_cd3973ab","updated":"2026-06-16 16:17:16.000000000","message":"Done","commit_id":"e20828a4fe58a5e557b73d7d8f4e87f32c23429a"}],"networking_cisco/ml2_drivers/ndfc/mech_ndfc.py":[{"author":{"_account_id":18031,"name":"Thomas Bachman","email":"tbachman@yahoo.com","username":"bachmantech"},"change_message_id":"159a9ba3c1042c5a7648c7871209fccce03f54ca","unresolved":true,"context_lines":[{"line_number":863,"context_line":"                network_id\u003dnetwork[\u0027id\u0027],"},{"line_number":864,"context_line":"                host\u003dhost).scalar() or 0"},{"line_number":865,"context_line":""},{"line_number":866,"context_line":"            if not detach:"},{"line_number":867,"context_line":"                if count \u003d\u003d 1:"},{"line_number":868,"context_line":"                    return filtered_topology"},{"line_number":869,"context_line":""},{"line_number":870,"context_line":"                network_attachments \u003d ("},{"line_number":871,"context_line":"                    self._get_network_attachments_from_neutron_db("},{"line_number":872,"context_line":"                        context, network[\u0027id\u0027], host, filtered_topology))"},{"line_number":873,"context_line":"                if not network_attachments:"},{"line_number":874,"context_line":"                    return filtered_topology"},{"line_number":875,"context_line":""},{"line_number":876,"context_line":"                current_switches \u003d set(filtered_topology.keys())"},{"line_number":877,"context_line":"                attached_switches \u003d set(network_attachments.keys())"},{"line_number":878,"context_line":"                if current_switches.issubset(attached_switches):"},{"line_number":879,"context_line":"                    LOG.debug(\"Network %s already attached to switches %s \""},{"line_number":880,"context_line":"                            \"for host %s, skipping attach\","},{"line_number":881,"context_line":"                            network, current_switches, host)"},{"line_number":882,"context_line":"                    return"},{"line_number":883,"context_line":"                return filtered_topology"},{"line_number":884,"context_line":""},{"line_number":885,"context_line":"            if count \u003e 0:"},{"line_number":886,"context_line":"                LOG.debug(\"Network %s still has other ports on host %s, \""},{"line_number":887,"context_line":"                        \"skipping detach\", network, host)"},{"line_number":888,"context_line":"                return"},{"line_number":889,"context_line":"            return filtered_topology"},{"line_number":890,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"58f05489_d362dcf2","line":887,"range":{"start_line":866,"start_character":0,"end_line":887,"end_character":57},"updated":"2026-06-16 16:00:22.000000000","message":"Are we sure we still need this now that we have the network labels?","commit_id":"e20828a4fe58a5e557b73d7d8f4e87f32c23429a"},{"author":{"_account_id":32213,"name":"Sayali Vidyadhar Naval","email":"sayalinaval@gmail.com","username":"sayalinaval"},"change_message_id":"4e391f4e2cdedf5966a50a6b9fc4169acd885e58","unresolved":false,"context_lines":[{"line_number":863,"context_line":"                network_id\u003dnetwork[\u0027id\u0027],"},{"line_number":864,"context_line":"                host\u003dhost).scalar() or 0"},{"line_number":865,"context_line":""},{"line_number":866,"context_line":"            if not detach:"},{"line_number":867,"context_line":"                if count \u003d\u003d 1:"},{"line_number":868,"context_line":"                    return filtered_topology"},{"line_number":869,"context_line":""},{"line_number":870,"context_line":"                network_attachments \u003d ("},{"line_number":871,"context_line":"                    self._get_network_attachments_from_neutron_db("},{"line_number":872,"context_line":"                        context, network[\u0027id\u0027], host, filtered_topology))"},{"line_number":873,"context_line":"                if not network_attachments:"},{"line_number":874,"context_line":"                    return filtered_topology"},{"line_number":875,"context_line":""},{"line_number":876,"context_line":"                current_switches \u003d set(filtered_topology.keys())"},{"line_number":877,"context_line":"                attached_switches \u003d set(network_attachments.keys())"},{"line_number":878,"context_line":"                if current_switches.issubset(attached_switches):"},{"line_number":879,"context_line":"                    LOG.debug(\"Network %s already attached to switches %s \""},{"line_number":880,"context_line":"                            \"for host %s, skipping attach\","},{"line_number":881,"context_line":"                            network, current_switches, host)"},{"line_number":882,"context_line":"                    return"},{"line_number":883,"context_line":"                return filtered_topology"},{"line_number":884,"context_line":""},{"line_number":885,"context_line":"            if count \u003e 0:"},{"line_number":886,"context_line":"                LOG.debug(\"Network %s still has other ports on host %s, \""},{"line_number":887,"context_line":"                        \"skipping detach\", network, host)"},{"line_number":888,"context_line":"                return"},{"line_number":889,"context_line":"            return filtered_topology"},{"line_number":890,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"91fd721e_86874e6a","line":887,"range":{"start_line":866,"start_character":0,"end_line":887,"end_character":57},"in_reply_to":"58f05489_d362dcf2","updated":"2026-06-16 16:17:16.000000000","message":"Yes, we still need this logic. Network labels solve filtering topology by physnet, but the multi-NIC logic solves a different problem: preventing duplicate attachments when multiple ports on the same host/network try to attach to the same switches. Both are needed - one for filtering, one for deduplication.","commit_id":"e20828a4fe58a5e557b73d7d8f4e87f32c23429a"}]}
