)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"82340f84df39006392b419883dc5d3ba20dd42fe","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     dbingham \u003cdbingham@godaddy.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2019-01-09 17:08:22 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[WIP] Allow multiple segments to same host on routed networks"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Allows multiple segments of a routed network to be bound to the same"},{"line_number":10,"context_line":"host. This allows deployers to create multiple segments on a routed"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"9fdfeff1_7504f24a","line":7,"updated":"2019-01-25 09:44:28.000000000","message":"Is this patch still Work In Progress or it is ready for review now?","commit_id":"72eb2864eb8369cc1e96f1c631feb0121c587358"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5bfb40396942d7fa92eaed15b0d53ef36d11e7d0","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[WIP] Allow multiple segments to same host on routed networks"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Allows multiple segments of a routed network to be bound to the same"},{"line_number":10,"context_line":"host. This allows deployers to create multiple segments on a routed"},{"line_number":11,"context_line":"network, attach multiple segments to the same host and correctly"},{"line_number":12,"context_line":"be able to deploy VMs from it."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"f90dce52_49ca29c0","line":10,"range":{"start_line":9,"start_character":0,"end_line":10,"end_character":5},"updated":"2020-12-11 19:09:13.000000000","message":"is the use case here creating multiple segment on the same phynet?\n\nthat should be possible today. if not i agree that is a bug.\na singel host should also be able to be a memebr of multple phsynets.\n\nalthogh it shoudl be noted that nova does not supprot the multi provider\nnet neutron extension.","commit_id":"eb333241e48efb16aecc5763541607503dce4d79"},{"author":{"_account_id":9076,"name":"Kris Lindgren","email":"klindgren@godaddy.com","username":"klindgren"},"change_message_id":"72211400dc9f9eec0ba9b711827a8248103dac54","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[WIP] Allow multiple segments to same host on routed networks"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Allows multiple segments of a routed network to be bound to the same"},{"line_number":10,"context_line":"host. This allows deployers to create multiple segments on a routed"},{"line_number":11,"context_line":"network, attach multiple segments to the same host and correctly"},{"line_number":12,"context_line":"be able to deploy VMs from it."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"3b2ecb20_1ed8b5d7","line":10,"range":{"start_line":9,"start_character":0,"end_line":10,"end_character":5},"in_reply_to":"f90dce52_49ca29c0","updated":"2020-12-11 22:29:03.000000000","message":"It\u0027s to remove the restriction thats called out here:\nhttps://github.com/openstack/neutron/blob/master/neutron/objects/subnet.py#L345-L354\n\nWhich specifically prevents a host from having more than one routed network segment assigned to it.  The discussion along with the reason we want this is pretty well fleshed out under: https://bugs.launchpad.net/neutron/+bug/1764738 along with https://review.opendev.org/c/openstack/neutron-specs/+/657170/4/specs/train/multi-segment-per-host-support.rst","commit_id":"eb333241e48efb16aecc5763541607503dce4d79"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f78e05fe085fd063982c0bba3b924905f04c64a4","unresolved":true,"context_lines":[{"line_number":11,"context_line":"network, attach multiple segments to the same host and correctly"},{"line_number":12,"context_line":"be able to deploy VMs from it."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Changes:"},{"line_number":15,"context_line":"Patches 1-6: Core changes"},{"line_number":16,"context_line":"Patch 7: Add Alembic migration to backfill segment_id bridge_name"},{"line_number":17,"context_line":"Patch 8: Fixes for alembic migration. Fix plugin comment."},{"line_number":18,"context_line":"Patch 9: Rebase"},{"line_number":19,"context_line":"Patch 10: Rebase + fix bug in get_vif_details to always set bridge_name"},{"line_number":20,"context_line":"Patch 11: Rebase"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: Ibcc90e9d25f863e8577e4092fef786c25755f35a"},{"line_number":23,"context_line":"Closes-Bug: 1764738"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"134bc588_2dac3736","line":20,"range":{"start_line":14,"start_character":0,"end_line":20,"end_character":16},"updated":"2020-12-11 18:01:54.000000000","message":"we normally dont include this in openstack patches.\n\nthis is common on mailing list flows with cover letters but basically is just noise for\ngerrit based review.\n\nyou also have not had 11 patches you have had 11 revisions of the same patch so the terminology is different.","commit_id":"eb333241e48efb16aecc5763541607503dce4d79"}],"neutron/agent/rpc.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"bd0a73f6d440ed1375b0d8ffac781abf54e35ada","unresolved":false,"context_lines":[{"line_number":326,"context_line":"            \u0027profile\u0027: binding.profile,"},{"line_number":327,"context_line":"            \u0027security_groups\u0027: list(port_obj.security_group_ids)"},{"line_number":328,"context_line":"        }"},{"line_number":329,"context_line":"        if(hasattr(net, \u0027l2_adjacency\u0027) and"},{"line_number":330,"context_line":"           net.l2_adjacency is not None and not net.l2_adjacency):"},{"line_number":331,"context_line":"            entry[\u0027segment_id\u0027] \u003d segment.id"},{"line_number":332,"context_line":"        LOG.debug(\"Returning: %s\", entry)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_ad1a71c5","line":329,"updated":"2018-12-13 08:20:57.000000000","message":"nit: space between \"if\" and \"(hasattr\",","commit_id":"01841f97eebe3bc8b0f21d561fb02f4c4d1b3cac"},{"author":{"_account_id":10962,"name":"David Bingham","email":"dbingham@godaddy.com","username":"wwriverrat"},"change_message_id":"1941077f03dc9074a3ac5406c415c8ee91db6afd","unresolved":false,"context_lines":[{"line_number":326,"context_line":"            \u0027profile\u0027: binding.profile,"},{"line_number":327,"context_line":"            \u0027security_groups\u0027: list(port_obj.security_group_ids)"},{"line_number":328,"context_line":"        }"},{"line_number":329,"context_line":"        if(hasattr(net, \u0027l2_adjacency\u0027) and"},{"line_number":330,"context_line":"           net.l2_adjacency is not None and not net.l2_adjacency):"},{"line_number":331,"context_line":"            entry[\u0027segment_id\u0027] \u003d segment.id"},{"line_number":332,"context_line":"        LOG.debug(\"Returning: %s\", entry)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_d797134c","line":329,"in_reply_to":"3f79a3b5_ad1a71c5","updated":"2019-01-02 20:10:32.000000000","message":"fixed in upcoming patch","commit_id":"01841f97eebe3bc8b0f21d561fb02f4c4d1b3cac"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"bd0a73f6d440ed1375b0d8ffac781abf54e35ada","unresolved":false,"context_lines":[{"line_number":327,"context_line":"            \u0027security_groups\u0027: list(port_obj.security_group_ids)"},{"line_number":328,"context_line":"        }"},{"line_number":329,"context_line":"        if(hasattr(net, \u0027l2_adjacency\u0027) and"},{"line_number":330,"context_line":"           net.l2_adjacency is not None and not net.l2_adjacency):"},{"line_number":331,"context_line":"            entry[\u0027segment_id\u0027] \u003d segment.id"},{"line_number":332,"context_line":"        LOG.debug(\"Returning: %s\", entry)"},{"line_number":333,"context_line":"        return entry"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_0d6fe52f","line":330,"range":{"start_line":330,"start_character":11,"end_line":330,"end_character":64},"updated":"2018-12-13 08:20:57.000000000","message":"can\u0027t You just write:\n\n    net.l2_adjency \u003d\u003d False","commit_id":"01841f97eebe3bc8b0f21d561fb02f4c4d1b3cac"},{"author":{"_account_id":10962,"name":"David Bingham","email":"dbingham@godaddy.com","username":"wwriverrat"},"change_message_id":"1941077f03dc9074a3ac5406c415c8ee91db6afd","unresolved":false,"context_lines":[{"line_number":327,"context_line":"            \u0027security_groups\u0027: list(port_obj.security_group_ids)"},{"line_number":328,"context_line":"        }"},{"line_number":329,"context_line":"        if(hasattr(net, \u0027l2_adjacency\u0027) and"},{"line_number":330,"context_line":"           net.l2_adjacency is not None and not net.l2_adjacency):"},{"line_number":331,"context_line":"            entry[\u0027segment_id\u0027] \u003d segment.id"},{"line_number":332,"context_line":"        LOG.debug(\"Returning: %s\", entry)"},{"line_number":333,"context_line":"        return entry"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_33eeb420","line":330,"range":{"start_line":330,"start_character":11,"end_line":330,"end_character":64},"in_reply_to":"3f79a3b5_0d6fe52f","updated":"2019-01-02 20:10:32.000000000","message":"fixed in upcoming patch","commit_id":"01841f97eebe3bc8b0f21d561fb02f4c4d1b3cac"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"3098e6fe90c5bb4fad5f32281e3189c29ae6af43","unresolved":false,"context_lines":[{"line_number":366,"context_line":"            \u0027vnic_type\u0027: binding.vnic_type,"},{"line_number":367,"context_line":"            \u0027security_groups\u0027: list(port_obj.security_group_ids)"},{"line_number":368,"context_line":"        }"},{"line_number":369,"context_line":"        if hasattr(net, \u0027l2_adjacency\u0027) and net.l2_adjacency is False:"},{"line_number":370,"context_line":"            entry[\u0027segment_id\u0027] \u003d segment.id"},{"line_number":371,"context_line":"        LOG.debug(\"Returning: %s\", entry)"},{"line_number":372,"context_line":"        return entry"}],"source_content_type":"text/x-python","patch_set":11,"id":"9fb8cfa7_af4782bc","line":369,"updated":"2019-06-21 08:50:20.000000000","message":"IMO it\u0027s better to use \"getattr()\" here","commit_id":"eb333241e48efb16aecc5763541607503dce4d79"}],"neutron/db/migration/alembic_migrations/versions/train/expand/d78a99b61416_add_segment_id_based_bridge_names_to_.py":[{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"6ce4ebd04fa60e36c5359e634b53f369c5e62be0","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    query \u003d query.join(mod.Subnet, mod.Subnet.id \u003d\u003d mod.IPAllocation.subnet_id)"},{"line_number":73,"context_line":"    query \u003d query.outerjoin(ml2_mod.PortBinding,"},{"line_number":74,"context_line":"                            mod.Port.id \u003d\u003d ml2_mod.PortBinding.port_id)"},{"line_number":75,"context_line":"    # Next statement assumes \"routed networks\" are flagged as deferred"},{"line_number":76,"context_line":"    query \u003d query.filter(mod.Port.ip_allocation \u003d\u003d \u0027deferred\u0027)"},{"line_number":77,"context_line":"    query \u003d query.filter(mod.Port.device_owner.like(\u0027compute:%\u0027))"},{"line_number":78,"context_line":"    # Next #noqa lines due to sqlalchemy not working using \u0027is not\u0027 comparison"},{"line_number":79,"context_line":"    query \u003d query.filter(sa.not_(mod.Subnet.segment_id \u003d\u003d None))  # noqa"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_8a9f4f4f","line":76,"range":{"start_line":75,"start_character":4,"end_line":76,"end_character":62},"updated":"2019-07-05 12:46:05.000000000","message":"Based on this this will not always be true:\nhttps://www.openstack.org/assets/presentation-media/Scaling-Up-OpenStack-Networking-with-Routed-Networks.pdf\n\nIn the original spec I can\u0027t see what values ip_allocation can have:\nhttps://www.openstack.org/assets/presentation-media/Scaling-Up-OpenStack-Networking-with-Routed-Networks.pdf","commit_id":"eb333241e48efb16aecc5763541607503dce4d79"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2f03ccf9f396ac71d0daad5730bb5fff81f75255","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    query \u003d query.outerjoin(ml2_mod.PortBinding,"},{"line_number":74,"context_line":"                            mod.Port.id \u003d\u003d ml2_mod.PortBinding.port_id)"},{"line_number":75,"context_line":"    # Next statement assumes \"routed networks\" are flagged as deferred"},{"line_number":76,"context_line":"    query \u003d query.filter(mod.Port.ip_allocation \u003d\u003d \u0027deferred\u0027)"},{"line_number":77,"context_line":"    query \u003d query.filter(mod.Port.device_owner.like(\u0027compute:%\u0027))"},{"line_number":78,"context_line":"    # Next #noqa lines due to sqlalchemy not working using \u0027is not\u0027 comparison"},{"line_number":79,"context_line":"    query \u003d query.filter(sa.not_(mod.Subnet.segment_id \u003d\u003d None))  # noqa"}],"source_content_type":"text/x-python","patch_set":11,"id":"9fb8cfa7_ae439f41","line":76,"updated":"2019-06-12 17:42:46.000000000","message":"Can\u0027t we have a local DHCP for any segment?","commit_id":"eb333241e48efb16aecc5763541607503dce4d79"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5bfb40396942d7fa92eaed15b0d53ef36d11e7d0","unresolved":true,"context_lines":[{"line_number":72,"context_line":"    query \u003d query.join(mod.Subnet, mod.Subnet.id \u003d\u003d mod.IPAllocation.subnet_id)"},{"line_number":73,"context_line":"    query \u003d query.outerjoin(ml2_mod.PortBinding,"},{"line_number":74,"context_line":"                            mod.Port.id \u003d\u003d ml2_mod.PortBinding.port_id)"},{"line_number":75,"context_line":"    # Next statement assumes \"routed networks\" are flagged as deferred"},{"line_number":76,"context_line":"    query \u003d query.filter(mod.Port.ip_allocation \u003d\u003d \u0027deferred\u0027)"},{"line_number":77,"context_line":"    query \u003d query.filter(mod.Port.device_owner.like(\u0027compute:%\u0027))"},{"line_number":78,"context_line":"    # Next #noqa lines due to sqlalchemy not working using \u0027is not\u0027 comparison"},{"line_number":79,"context_line":"    query \u003d query.filter(sa.not_(mod.Subnet.segment_id \u003d\u003d None))  # noqa"}],"source_content_type":"text/x-python","patch_set":11,"id":"c3b85f2e_4d83be9d","line":76,"range":{"start_line":75,"start_character":4,"end_line":76,"end_character":62},"in_reply_to":"7faddb67_8a9f4f4f","updated":"2020-12-11 19:09:13.000000000","message":"route network can work in 1 of two way\neither neutron is providing dhcp in which case you need 1 dhcp agent per segment,\nor you are using provider nettworks with dhcp and routing provided external to neutron.\n\nin this case you can configure your switch to act as a dhcp rely to a central dhcp server on a different l2 segment.\n\nso yes we can have local dhcp agent on each segment or we can have no dhcp agents.\n\nso we shoudl allow it but not require it.\n\nwhere neutron is providing dhcp i think the expection is a dhcp agent will run in each segment which is alos the expection i get form https://www.openstack.org/assets/presentation-media/Scaling-Up-OpenStack-Networking-with-Routed-Networks.pdf based on slide 14","commit_id":"eb333241e48efb16aecc5763541607503dce4d79"}],"neutron/objects/subnet.py":[{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"8b95970104d86ce36ec8e959208c2720dd6e7422","unresolved":false,"context_lines":[{"line_number":326,"context_line":"                       for subnet, mapping in results"},{"line_number":327,"context_line":"                       if mapping}"},{"line_number":328,"context_line":"        if 1 \u003c len(segment_ids):"},{"line_number":329,"context_line":"            raise segment_exc.HostConnectedToMultipleSegments("},{"line_number":330,"context_line":"                host\u003dhost, network_id\u003dnetwork_id)"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"        return [subnet for subnet, _mapping in results]"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_130abad1","side":"PARENT","line":329,"range":{"start_line":329,"start_character":30,"end_line":329,"end_character":61},"updated":"2019-07-05 15:13:11.000000000","message":"If multiple segments for external network still can not work, you may need to remain this exception for it with some network `router:external ` key check.","commit_id":"17caf723fab18c7292ceb6a9d248440ed9942505"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"3098e6fe90c5bb4fad5f32281e3189c29ae6af43","unresolved":false,"context_lines":[{"line_number":327,"context_line":"                       if mapping}"},{"line_number":328,"context_line":"        if 1 \u003c len(segment_ids):"},{"line_number":329,"context_line":"            raise segment_exc.HostConnectedToMultipleSegments("},{"line_number":330,"context_line":"                host\u003dhost, network_id\u003dnetwork_id)"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"        return [subnet for subnet, _mapping in results]"},{"line_number":333,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9fb8cfa7_6f618a39","side":"PARENT","line":330,"updated":"2019-06-21 08:50:20.000000000","message":"I already asked in spec patch but will also ask here: what with drivers which don\u0027t support this new feature? How You want to handle that?","commit_id":"17caf723fab18c7292ceb6a9d248440ed9942505"}],"neutron/plugins/ml2/drivers/linuxbridge/agent/linuxbridge_neutron_agent.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"bd0a73f6d440ed1375b0d8ffac781abf54e35ada","unresolved":false,"context_lines":[{"line_number":577,"context_line":"                       device_owner):"},{"line_number":578,"context_line":"        bridge_id \u003d network_id"},{"line_number":579,"context_line":"        if network_segment.segment_id:"},{"line_number":580,"context_line":"            bridge_id \u003d network_segment.segment_id"},{"line_number":581,"context_line":"        return self.add_tap_interface(bridge_id, network_segment.network_type,"},{"line_number":582,"context_line":"                                      network_segment.physical_network,"},{"line_number":583,"context_line":"                                      network_segment.segmentation_id,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_ad4831b5","line":580,"updated":"2018-12-13 08:20:57.000000000","message":"can\u0027t be just:\n\n    bridge_id \u003d network_segment_id or network_id\n\n?","commit_id":"01841f97eebe3bc8b0f21d561fb02f4c4d1b3cac"},{"author":{"_account_id":10962,"name":"David Bingham","email":"dbingham@godaddy.com","username":"wwriverrat"},"change_message_id":"1941077f03dc9074a3ac5406c415c8ee91db6afd","unresolved":false,"context_lines":[{"line_number":577,"context_line":"                       device_owner):"},{"line_number":578,"context_line":"        bridge_id \u003d network_id"},{"line_number":579,"context_line":"        if network_segment.segment_id:"},{"line_number":580,"context_line":"            bridge_id \u003d network_segment.segment_id"},{"line_number":581,"context_line":"        return self.add_tap_interface(bridge_id, network_segment.network_type,"},{"line_number":582,"context_line":"                                      network_segment.physical_network,"},{"line_number":583,"context_line":"                                      network_segment.segmentation_id,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_1337f8b0","line":580,"in_reply_to":"3f79a3b5_ad4831b5","updated":"2019-01-02 20:10:32.000000000","message":"yep. I like it :).  fixed in upcoming patch","commit_id":"01841f97eebe3bc8b0f21d561fb02f4c4d1b3cac"},{"author":{"_account_id":9076,"name":"Kris Lindgren","email":"klindgren@godaddy.com","username":"klindgren"},"change_message_id":"d6c2a2800977ada69a938418b26c4f4ecd184c7e","unresolved":false,"context_lines":[{"line_number":578,"context_line":"        bridge_id \u003d network_id"},{"line_number":579,"context_line":"        if network_segment.segment_id:"},{"line_number":580,"context_line":"            bridge_id \u003d network_segment.segment_id"},{"line_number":581,"context_line":"        return self.add_tap_interface(bridge_id, network_segment.network_type,"},{"line_number":582,"context_line":"                                      network_segment.physical_network,"},{"line_number":583,"context_line":"                                      network_segment.segmentation_id,"},{"line_number":584,"context_line":"                                      tap_name, device_owner,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_f1c5785f","line":581,"updated":"2018-12-14 22:17:35.000000000","message":"I want to also specifically call out - this change will be a breaking change for VM\u0027s that are already on a routed network.  As now the bridge that they should be plugged into would be refrenced from the segment uuid and not the network uuid.  Is their a way to migrate these gracefully?  Mainly nova needs to update the vm\u0027s domain.xml with the new bridge name.","commit_id":"01841f97eebe3bc8b0f21d561fb02f4c4d1b3cac"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"334c87ad298be18ca7b72e38d04a76fa1dd85960","unresolved":false,"context_lines":[{"line_number":578,"context_line":"        bridge_id \u003d network_id"},{"line_number":579,"context_line":"        if network_segment.segment_id:"},{"line_number":580,"context_line":"            bridge_id \u003d network_segment.segment_id"},{"line_number":581,"context_line":"        return self.add_tap_interface(bridge_id, network_segment.network_type,"},{"line_number":582,"context_line":"                                      network_segment.physical_network,"},{"line_number":583,"context_line":"                                      network_segment.segmentation_id,"},{"line_number":584,"context_line":"                                      tap_name, device_owner,"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffd0ebdf_68047c7c","line":581,"in_reply_to":"3f79a3b5_f1c5785f","updated":"2019-01-04 09:52:30.000000000","message":"I don\u0027t think that there is any graceful way to do it. Probably user will have to do reboot hard or migration of VMs.\nWill existing VMs working fine after upgrade or all will be broken?","commit_id":"01841f97eebe3bc8b0f21d561fb02f4c4d1b3cac"},{"author":{"_account_id":9076,"name":"Kris Lindgren","email":"klindgren@godaddy.com","username":"klindgren"},"change_message_id":"a5caddebcb9cd648c81cd29d912b8503e7884212","unresolved":false,"context_lines":[{"line_number":578,"context_line":"        bridge_id \u003d network_id"},{"line_number":579,"context_line":"        if network_segment.segment_id:"},{"line_number":580,"context_line":"            bridge_id \u003d network_segment.segment_id"},{"line_number":581,"context_line":"        return self.add_tap_interface(bridge_id, network_segment.network_type,"},{"line_number":582,"context_line":"                                      network_segment.physical_network,"},{"line_number":583,"context_line":"                                      network_segment.segmentation_id,"},{"line_number":584,"context_line":"                                      tap_name, device_owner,"}],"source_content_type":"text/x-python","patch_set":3,"id":"dfd5e7cf_5d1495a0","line":581,"in_reply_to":"ffd0ebdf_68047c7c","updated":"2019-01-10 00:05:24.000000000","message":"Existing VM\u0027s will be broken.  As we will move the port that is providing connectivity to the network, to a different bridge.","commit_id":"01841f97eebe3bc8b0f21d561fb02f4c4d1b3cac"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2f03ccf9f396ac71d0daad5730bb5fff81f75255","unresolved":false,"context_lines":[{"line_number":584,"context_line":""},{"line_number":585,"context_line":"    def plug_interface(self, network_id, network_segment, tap_name,"},{"line_number":586,"context_line":"                       device_owner):"},{"line_number":587,"context_line":"        bridge_id \u003d network_segment.segment_id or network_id"},{"line_number":588,"context_line":"        return self.add_tap_interface(bridge_id, network_segment.network_type,"},{"line_number":589,"context_line":"                                      network_segment.physical_network,"},{"line_number":590,"context_line":"                                      network_segment.segmentation_id,"}],"source_content_type":"text/x-python","patch_set":11,"id":"9fb8cfa7_0ece6bb3","line":587,"range":{"start_line":587,"start_character":36,"end_line":587,"end_character":46},"updated":"2019-06-12 17:42:46.000000000","message":"1) This \"network_segment\" is a neutron.plugins.ml2.drivers.agent._agent_manager_base.NetworkSegment. It has no segment_id because this is not a Neutron network segment, just an agent network segment.\n\n2) Why do you need to create a bridge per segment? For isolation? Two network segments can have the same segmentation ID and the traffic from both segments will be in the same virtual network or tunneled network.","commit_id":"eb333241e48efb16aecc5763541607503dce4d79"},{"author":{"_account_id":9076,"name":"Kris Lindgren","email":"klindgren@godaddy.com","username":"klindgren"},"change_message_id":"72211400dc9f9eec0ba9b711827a8248103dac54","unresolved":false,"context_lines":[{"line_number":584,"context_line":""},{"line_number":585,"context_line":"    def plug_interface(self, network_id, network_segment, tap_name,"},{"line_number":586,"context_line":"                       device_owner):"},{"line_number":587,"context_line":"        bridge_id \u003d network_segment.segment_id or network_id"},{"line_number":588,"context_line":"        return self.add_tap_interface(bridge_id, network_segment.network_type,"},{"line_number":589,"context_line":"                                      network_segment.physical_network,"},{"line_number":590,"context_line":"                                      network_segment.segmentation_id,"}],"source_content_type":"text/x-python","patch_set":11,"id":"b8670b2f_caab7587","line":587,"range":{"start_line":587,"start_character":36,"end_line":587,"end_character":46},"in_reply_to":"0a32bd45_b543a076","updated":"2020-12-11 22:29:03.000000000","message":"Yes, the bridge names that the VM\u0027s attach to do indeed change - they have to.  Since with routed networks the network_id is always the same, but the segments which contain the specific vlan/segment information are those that are unique.  Which will cause issues when you try to bind two segments from the same routed network to the same host.  Everything will get plugged into the same bridge.  All the vm\u0027s and vlan specific interfaces.\n\nWe are running this code in production and have been since pike. We had a migration script that we ran, when we switched over to this code that allowed us to migrate to the non-conflicting segment based bridges.  With negligible downtime (read \u003c 5 missed pings).  Which basically was: \nCreate the new segment based bridge if it didn\u0027t exist, create a veth device between the old bridge and the new bridge(keep the traffic flowing when we move vm tap devices).  Move each of the vm taps from the old bridge to the new bridge.  Update the vm\u0027s running config and stored xml files to reference the new bridge. Move the vlan device to the new bridge.  Remove the veth, remove the old bridge, restart neutron agent.\n\nMy guess this is only required on linux_bridge, because the OVS based code always provides the bridge name to use to neutron.  Rather than the existing code which just provides the network name and nova uses that.  This patch essentially works by causing the port object given to nova to include the bridge_name to use (just like ovs does).  The rest of it is basically making sure that we pass around the segment_id instead of the network_id so things get plugged into the correct places on the neutron side.\n\n\nAlso - this code doesn\u0027t do anything with vm ports, if you applied this patch and restarted the neutron agent on a routed network.  what ends up happing is that the vlan port the neutron agent is responsible for managing gets moved to a new segment based bridge id and the existing bridge with the vm\u0027s on it loose their networking.  Until they are shutdown/restarted and nova grabs a fresh version of the networkinfo_cache for the vm and rewrites the libvirt xml file with the segment based bridge name.","commit_id":"eb333241e48efb16aecc5763541607503dce4d79"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"3a990ae6ec22c5e2ee8b650460df7b276a145e4d","unresolved":false,"context_lines":[{"line_number":584,"context_line":""},{"line_number":585,"context_line":"    def plug_interface(self, network_id, network_segment, tap_name,"},{"line_number":586,"context_line":"                       device_owner):"},{"line_number":587,"context_line":"        bridge_id \u003d network_segment.segment_id or network_id"},{"line_number":588,"context_line":"        return self.add_tap_interface(bridge_id, network_segment.network_type,"},{"line_number":589,"context_line":"                                      network_segment.physical_network,"},{"line_number":590,"context_line":"                                      network_segment.segmentation_id,"}],"source_content_type":"text/x-python","patch_set":11,"id":"9fb8cfa7_ae8b9fc0","line":587,"range":{"start_line":587,"start_character":36,"end_line":587,"end_character":46},"in_reply_to":"9fb8cfa7_0ece6bb3","updated":"2019-06-12 17:51:43.000000000","message":"1) https://review.opendev.org/#/c/623115/11/neutron/plugins/ml2/drivers/agent/_common_agent.py@253 --\u003e autoreply","commit_id":"eb333241e48efb16aecc5763541607503dce4d79"},{"author":{"_account_id":9076,"name":"Kris Lindgren","email":"klindgren@godaddy.com","username":"klindgren"},"change_message_id":"a29ed85d81d6909cb5556695c2bfe1d7f8e201d5","unresolved":false,"context_lines":[{"line_number":584,"context_line":""},{"line_number":585,"context_line":"    def plug_interface(self, network_id, network_segment, tap_name,"},{"line_number":586,"context_line":"                       device_owner):"},{"line_number":587,"context_line":"        bridge_id \u003d network_segment.segment_id or network_id"},{"line_number":588,"context_line":"        return self.add_tap_interface(bridge_id, network_segment.network_type,"},{"line_number":589,"context_line":"                                      network_segment.physical_network,"},{"line_number":590,"context_line":"                                      network_segment.segmentation_id,"}],"source_content_type":"text/x-python","patch_set":11,"id":"9fb8cfa7_19ceb3b3","line":587,"range":{"start_line":587,"start_character":36,"end_line":587,"end_character":46},"in_reply_to":"9fb8cfa7_0ece6bb3","updated":"2019-06-12 18:10:47.000000000","message":"2.) We create a bridge per segment because in the case where you have two network segments with different vlan_ids (our specific use case we are addressing, (EG having 2 segments with a unique vlan_id, with a /22 per-segment assigned to the same host in a routed network).  Under linux bridge, without this you would create a single bridge, and attach both the vlan interfaces and all the vm\u0027s to that bridge.  Then you would be effectively bridging the traffic from vlan say 401 to vlan 402.  This works the same way that creating two separate non-routed networks with different vlanids and mapping those to the same host.\n\nI dont get the use case for creating 2 segments with the same segment_id attached to the same host.  IE two segments on a routed network both with vlan 401 attached to the same host.  As they would both have same vlanID and traffic would mix between those two segments.  But you are specifically trying to say these are and should be separate (by creating a new/different network segment).  If you wanted these to mix, why not just add the additional subnet that is in the other segment to the original segment with the same Id?\n\nI do get the use case of being able to create multiple segments with the same segmentation id and assigning those to different hosts.  IE compute nodes in rack 1 using vlan401 and compute nodes in rack2 using vlan401 as well.  But in this case the vlans, while the ID is the same are totally seperate and are local to each rack.  In this use case you shouldn\u0027t (in reality can\u0027t, without mixing traffic?) have both segments assigned to the same host.","commit_id":"eb333241e48efb16aecc5763541607503dce4d79"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5bfb40396942d7fa92eaed15b0d53ef36d11e7d0","unresolved":false,"context_lines":[{"line_number":584,"context_line":""},{"line_number":585,"context_line":"    def plug_interface(self, network_id, network_segment, tap_name,"},{"line_number":586,"context_line":"                       device_owner):"},{"line_number":587,"context_line":"        bridge_id \u003d network_segment.segment_id or network_id"},{"line_number":588,"context_line":"        return self.add_tap_interface(bridge_id, network_segment.network_type,"},{"line_number":589,"context_line":"                                      network_segment.physical_network,"},{"line_number":590,"context_line":"                                      network_segment.segmentation_id,"}],"source_content_type":"text/x-python","patch_set":11,"id":"0a32bd45_b543a076","line":587,"range":{"start_line":587,"start_character":36,"end_line":587,"end_character":46},"in_reply_to":"9fb8cfa7_19ceb3b3","updated":"2020-12-11 19:09:13.000000000","message":"this potentially has upgrade impacts right as the bridge names could change. previously it would have been the network id for a rounted network and after it would become the networkname.\n\n\nthis code is racy by the way. its been a long standing isseu that neutorn attemts to plug network interaces for vms. this function really should only be used for l3 agent and dhcp.\n\nos-vif/nova is responcible for plugging interfaces for vms so nova need to konw the bridge name.\n\nwe added the bridge name to the vif details and the required code on the nova side to use it\nhttps://github.com/openstack/nova/commit/e912f5e54785d77b4fabd1113c16b19d0981f003\nbut on upgrade the bridge will only change if the instance is hard rebooted.\n\nit woudl be incorrect to atempt to move them from the neutron agent side since neutron own the l1 pluging and neutron only manges l2+ of the network stack.","commit_id":"eb333241e48efb16aecc5763541607503dce4d79"}],"neutron/plugins/ml2/drivers/linuxbridge/mech_driver/mech_linuxbridge.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"4e8dd5f06a491eac9c07270c01d212ab4b8ebaef","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    def get_vif_details(self, context, agent, segment):"},{"line_number":59,"context_line":"        vif_details \u003d self.vif_details"},{"line_number":60,"context_line":"        if (not context._network_context._network.get(\u0027l2_adjacency\u0027, True) and"},{"line_number":61,"context_line":"                segment):"},{"line_number":62,"context_line":"            bridge_name \u003d lb_agent.LinuxBridgeManager.get_bridge_name("},{"line_number":63,"context_line":"                segment[\u0027id\u0027])"},{"line_number":64,"context_line":"            vif_details[portbindings.VIF_DETAILS_BRIDGE_NAME] \u003d bridge_name"}],"source_content_type":"text/x-python","patch_set":4,"id":"ffd0ebdf_f4460250","line":61,"range":{"start_line":61,"start_character":16,"end_line":61,"end_character":23},"updated":"2019-01-03 21:25:26.000000000","message":"nit: don\u0027t know if it would be more obvious to have the first two lines:\n\nif not segment:\n    return self.vif_details\n\nor even check them both and return early.  just a thought","commit_id":"0b91adfe48ce67f398bf24ec31034c9b775f9634"},{"author":{"_account_id":10962,"name":"David Bingham","email":"dbingham@godaddy.com","username":"wwriverrat"},"change_message_id":"c815d4ae393c499a46a2b8dbaf4cb881e47b3ff4","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    def get_vif_details(self, context, agent, segment):"},{"line_number":59,"context_line":"        vif_details \u003d self.vif_details"},{"line_number":60,"context_line":"        if (not context._network_context._network.get(\u0027l2_adjacency\u0027, True) and"},{"line_number":61,"context_line":"                segment):"},{"line_number":62,"context_line":"            bridge_name \u003d lb_agent.LinuxBridgeManager.get_bridge_name("},{"line_number":63,"context_line":"                segment[\u0027id\u0027])"},{"line_number":64,"context_line":"            vif_details[portbindings.VIF_DETAILS_BRIDGE_NAME] \u003d bridge_name"}],"source_content_type":"text/x-python","patch_set":4,"id":"dfd5e7cf_0b1b5e1b","line":61,"range":{"start_line":61,"start_character":16,"end_line":61,"end_character":23},"in_reply_to":"ffd0ebdf_962c5348","updated":"2019-01-10 00:04:53.000000000","message":"I like it a lot. Fixed in patch","commit_id":"0b91adfe48ce67f398bf24ec31034c9b775f9634"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"334c87ad298be18ca7b72e38d04a76fa1dd85960","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    def get_vif_details(self, context, agent, segment):"},{"line_number":59,"context_line":"        vif_details \u003d self.vif_details"},{"line_number":60,"context_line":"        if (not context._network_context._network.get(\u0027l2_adjacency\u0027, True) and"},{"line_number":61,"context_line":"                segment):"},{"line_number":62,"context_line":"            bridge_name \u003d lb_agent.LinuxBridgeManager.get_bridge_name("},{"line_number":63,"context_line":"                segment[\u0027id\u0027])"},{"line_number":64,"context_line":"            vif_details[portbindings.VIF_DETAILS_BRIDGE_NAME] \u003d bridge_name"}],"source_content_type":"text/x-python","patch_set":4,"id":"ffd0ebdf_962c5348","line":61,"range":{"start_line":61,"start_character":16,"end_line":61,"end_character":23},"in_reply_to":"ffd0ebdf_f4460250","updated":"2019-01-04 09:52:30.000000000","message":"+1","commit_id":"0b91adfe48ce67f398bf24ec31034c9b775f9634"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"3eaf5757b8ff2a6cb968f49c39891199b2b825be","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            bridge_name \u003d lb_agent.LinuxBridgeManager.get_bridge_name("},{"line_number":65,"context_line":"                segment[\u0027id\u0027])"},{"line_number":66,"context_line":"            vif_details[portbindings.VIF_DETAILS_BRIDGE_NAME] \u003d bridge_name"},{"line_number":67,"context_line":"        return vif_details"}],"source_content_type":"text/x-python","patch_set":5,"id":"9fdfeff1_9c1c3f6b","line":67,"updated":"2019-01-23 22:05:46.000000000","message":"nit: I guess this method could be turned around...\n\nif segment:\n     do some work\n     self.vif_details[...] \u003d ...\nreturn self.vif_details\n\nThen there\u0027s just one return, but it\u0027s a nit","commit_id":"72eb2864eb8369cc1e96f1c631feb0121c587358"},{"author":{"_account_id":10962,"name":"David Bingham","email":"dbingham@godaddy.com","username":"wwriverrat"},"change_message_id":"4cd738fc44d88f63fc11f969108e10399232278f","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            bridge_name \u003d lb_agent.LinuxBridgeManager.get_bridge_name("},{"line_number":65,"context_line":"                segment[\u0027id\u0027])"},{"line_number":66,"context_line":"            vif_details[portbindings.VIF_DETAILS_BRIDGE_NAME] \u003d bridge_name"},{"line_number":67,"context_line":"        return vif_details"}],"source_content_type":"text/x-python","patch_set":5,"id":"9fdfeff1_3cb993e8","line":67,"in_reply_to":"9fdfeff1_9c1c3f6b","updated":"2019-01-23 22:25:24.000000000","message":"I like it. I took comment from previous review and did the fix literally as asked. I like your suggestion better.","commit_id":"72eb2864eb8369cc1e96f1c631feb0121c587358"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"6ce4ebd04fa60e36c5359e634b53f369c5e62be0","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def get_vif_details(self, context, agent, segment):"},{"line_number":62,"context_line":"        if segment:"},{"line_number":63,"context_line":"            details \u003d self.vif_details"},{"line_number":64,"context_line":"            if not context._network_context._network.get(\u0027l2_adjacency\u0027,"},{"line_number":65,"context_line":"                                                         True):"},{"line_number":66,"context_line":"                # For multi-segment networks, set bridge name based on seg ID"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_6d40ed36","line":63,"range":{"start_line":63,"start_character":12,"end_line":63,"end_character":38},"updated":"2019-07-05 12:46:05.000000000","message":"this extra variable makes reading harder.\nWhy not just manipulating self.vif_details?","commit_id":"eb333241e48efb16aecc5763541607503dce4d79"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5bfb40396942d7fa92eaed15b0d53ef36d11e7d0","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def get_vif_details(self, context, agent, segment):"},{"line_number":62,"context_line":"        if segment:"},{"line_number":63,"context_line":"            details \u003d self.vif_details"},{"line_number":64,"context_line":"            if not context._network_context._network.get(\u0027l2_adjacency\u0027,"},{"line_number":65,"context_line":"                                                         True):"},{"line_number":66,"context_line":"                # For multi-segment networks, set bridge name based on seg ID"}],"source_content_type":"text/x-python","patch_set":11,"id":"77c94613_09562ce0","line":63,"range":{"start_line":63,"start_character":12,"end_line":63,"end_character":38},"in_reply_to":"7faddb67_6d40ed36","updated":"2020-12-11 19:09:13.000000000","message":"im guessing the 80 charater limit","commit_id":"eb333241e48efb16aecc5763541607503dce4d79"}],"neutron/plugins/ml2/drivers/mech_agent.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"bd0a73f6d440ed1375b0d8ffac781abf54e35ada","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                # is found."},{"line_number":113,"context_line":"                # See neutron.plugins.ml2.plugin.Ml2Plugin._bind_port"},{"line_number":114,"context_line":"                if \u0027fixed_ips\u0027 in context.current:"},{"line_number":115,"context_line":"                    ips \u003d context.current[\u0027fixed_ips\u0027]"},{"line_number":116,"context_line":"                    for ip in ips:"},{"line_number":117,"context_line":"                        if \u0027segment_id\u0027 in ip:"},{"line_number":118,"context_line":"                            for segment in context.segments_to_bind:"},{"line_number":119,"context_line":"                                if ip[\u0027segment_id\u0027] \u003d\u003d segment[\u0027id\u0027]:"},{"line_number":120,"context_line":"                                    if self.try_to_bind_segment_for_agent("},{"line_number":121,"context_line":"                                            context, segment, agent):"},{"line_number":122,"context_line":"                                        LOG.debug(\"Bound using segment: %s\","},{"line_number":123,"context_line":"                                                  segment)"},{"line_number":124,"context_line":"                                        return"},{"line_number":125,"context_line":"                for segment in context.segments_to_bind:"},{"line_number":126,"context_line":"                    if self.try_to_bind_segment_for_agent(context, segment,"},{"line_number":127,"context_line":"                                                          agent):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_8da77553","line":124,"range":{"start_line":115,"start_character":20,"end_line":124,"end_character":46},"updated":"2018-12-13 08:20:57.000000000","message":"IMO You can move it to separate method and call it here, it will be more readable then\n\nAlso, if try_to bind_segment_for_agent will fail for all segments here, is it still needed to iterate once again below?","commit_id":"01841f97eebe3bc8b0f21d561fb02f4c4d1b3cac"},{"author":{"_account_id":9076,"name":"Kris Lindgren","email":"klindgren@godaddy.com","username":"klindgren"},"change_message_id":"6a0a95ad5d3ad1293d4561cee25ef956e7519b47","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                # is found."},{"line_number":113,"context_line":"                # See neutron.plugins.ml2.plugin.Ml2Plugin._bind_port"},{"line_number":114,"context_line":"                if \u0027fixed_ips\u0027 in context.current:"},{"line_number":115,"context_line":"                    ips \u003d context.current[\u0027fixed_ips\u0027]"},{"line_number":116,"context_line":"                    for ip in ips:"},{"line_number":117,"context_line":"                        if \u0027segment_id\u0027 in ip:"},{"line_number":118,"context_line":"                            for segment in context.segments_to_bind:"},{"line_number":119,"context_line":"                                if ip[\u0027segment_id\u0027] \u003d\u003d segment[\u0027id\u0027]:"},{"line_number":120,"context_line":"                                    if self.try_to_bind_segment_for_agent("},{"line_number":121,"context_line":"                                            context, segment, agent):"},{"line_number":122,"context_line":"                                        LOG.debug(\"Bound using segment: %s\","},{"line_number":123,"context_line":"                                                  segment)"},{"line_number":124,"context_line":"                                        return"},{"line_number":125,"context_line":"                for segment in context.segments_to_bind:"},{"line_number":126,"context_line":"                    if self.try_to_bind_segment_for_agent(context, segment,"},{"line_number":127,"context_line":"                                                          agent):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_b48aa71c","line":124,"range":{"start_line":115,"start_character":20,"end_line":124,"end_character":46},"in_reply_to":"3f79a3b5_8da77553","updated":"2018-12-14 03:54:43.000000000","message":"We can move this to its own function.\nThis is basically iterating through all the ports fixed_ip\u0027s, to see if they contain a segment_id, and attempting to bind with that segment ID, only if it\u0027s also in context.segments_to_bind.  The reason why we left the original code there is the case that the port doesn\u0027t have fixed_ips on it or none of the fixed_ip\u0027s have a segment_id in them.  Which would happen if we didn\u0027t add it under neutron.plugins.ml2.plugin.Ml2Plugin._bind_port because l2_adjacenty on the network is set to true (IE it\u0027s not a routed network).","commit_id":"01841f97eebe3bc8b0f21d561fb02f4c4d1b3cac"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"bd0a73f6d440ed1375b0d8ffac781abf54e35ada","unresolved":false,"context_lines":[{"line_number":227,"context_line":"        #       linux_bridge_agent on port binding"},{"line_number":228,"context_line":"        if (not context._network_context._network.get(\u0027l2_adjacency\u0027, True) and"},{"line_number":229,"context_line":"                segment):"},{"line_number":230,"context_line":"            bridge_name \u003d \u0027brq\u0027 + segment[\u0027id\u0027][:11]"},{"line_number":231,"context_line":"            vif_details[portbindings.VIF_DETAILS_BRIDGE_NAME] \u003d bridge_name"},{"line_number":232,"context_line":"        return vif_details"},{"line_number":233,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_0d42856b","line":230,"range":{"start_line":230,"start_character":27,"end_line":230,"end_character":30},"updated":"2018-12-13 08:20:57.000000000","message":"I think that there is constant for this somewhere and You should use it","commit_id":"01841f97eebe3bc8b0f21d561fb02f4c4d1b3cac"},{"author":{"_account_id":10962,"name":"David Bingham","email":"dbingham@godaddy.com","username":"wwriverrat"},"change_message_id":"1941077f03dc9074a3ac5406c415c8ee91db6afd","unresolved":false,"context_lines":[{"line_number":227,"context_line":"        #       linux_bridge_agent on port binding"},{"line_number":228,"context_line":"        if (not context._network_context._network.get(\u0027l2_adjacency\u0027, True) and"},{"line_number":229,"context_line":"                segment):"},{"line_number":230,"context_line":"            bridge_name \u003d \u0027brq\u0027 + segment[\u0027id\u0027][:11]"},{"line_number":231,"context_line":"            vif_details[portbindings.VIF_DETAILS_BRIDGE_NAME] \u003d bridge_name"},{"line_number":232,"context_line":"        return vif_details"},{"line_number":233,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_1c7292e2","line":230,"range":{"start_line":230,"start_character":27,"end_line":230,"end_character":30},"in_reply_to":"3f79a3b5_0d42856b","updated":"2019-01-02 20:10:32.000000000","message":"yeah, we had concerns here too. We were hesitant to import constants/functions that lives in linux_bridge specific implementations into a driver agnostic mech_agent. Ref: https://github.com/openstack/neutron/blob/master/neutron/plugins/ml2/drivers/linuxbridge/agent/linuxbridge_neutron_agent.py#L166-L173\n\n\nThe above function, its constants and RESOURCE_ID_LENGTH all come from linux_bridge specific modules. I\u0027d be happy to import them as long as we all know the implications. Even at this point, not all implementations use a `bridge`.","commit_id":"01841f97eebe3bc8b0f21d561fb02f4c4d1b3cac"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"334c87ad298be18ca7b72e38d04a76fa1dd85960","unresolved":false,"context_lines":[{"line_number":227,"context_line":"        #       linux_bridge_agent on port binding"},{"line_number":228,"context_line":"        if (not context._network_context._network.get(\u0027l2_adjacency\u0027, True) and"},{"line_number":229,"context_line":"                segment):"},{"line_number":230,"context_line":"            bridge_name \u003d \u0027brq\u0027 + segment[\u0027id\u0027][:11]"},{"line_number":231,"context_line":"            vif_details[portbindings.VIF_DETAILS_BRIDGE_NAME] \u003d bridge_name"},{"line_number":232,"context_line":"        return vif_details"},{"line_number":233,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ffd0ebdf_16f06390","line":230,"range":{"start_line":230,"start_character":27,"end_line":230,"end_character":30},"in_reply_to":"3f79a3b5_1c7292e2","updated":"2019-01-04 09:52:30.000000000","message":"Maybe You should extract this method from linuxbridge agent to some more common module and reuse in both places?","commit_id":"01841f97eebe3bc8b0f21d561fb02f4c4d1b3cac"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"334c87ad298be18ca7b72e38d04a76fa1dd85960","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                        LOG.debug(\"Bound using segment: %s\", segment)"},{"line_number":123,"context_line":"                        return"},{"line_number":124,"context_line":"                # Otherwise attach to the first bindable segment"},{"line_number":125,"context_line":"                for segment in context.segments_to_bind:"},{"line_number":126,"context_line":"                    if self.try_to_bind_segment_for_agent(context, segment,"},{"line_number":127,"context_line":"                                                          agent):"},{"line_number":128,"context_line":"                        LOG.debug(\"Bound using segment: %s\", segment)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ffd0ebdf_56910b52","line":125,"updated":"2019-01-04 09:52:30.000000000","message":"here I think that You can in fact try only those segments which You didn\u0027t try yet above","commit_id":"0b91adfe48ce67f398bf24ec31034c9b775f9634"},{"author":{"_account_id":10962,"name":"David Bingham","email":"dbingham@godaddy.com","username":"wwriverrat"},"change_message_id":"c815d4ae393c499a46a2b8dbaf4cb881e47b3ff4","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                        LOG.debug(\"Bound using segment: %s\", segment)"},{"line_number":123,"context_line":"                        return"},{"line_number":124,"context_line":"                # Otherwise attach to the first bindable segment"},{"line_number":125,"context_line":"                for segment in context.segments_to_bind:"},{"line_number":126,"context_line":"                    if self.try_to_bind_segment_for_agent(context, segment,"},{"line_number":127,"context_line":"                                                          agent):"},{"line_number":128,"context_line":"                        LOG.debug(\"Bound using segment: %s\", segment)"}],"source_content_type":"text/x-python","patch_set":4,"id":"dfd5e7cf_8b98ae6a","line":125,"in_reply_to":"ffd0ebdf_56910b52","updated":"2019-01-10 00:04:53.000000000","message":"done in next patch","commit_id":"0b91adfe48ce67f398bf24ec31034c9b775f9634"}],"neutron/plugins/ml2/plugin.py":[{"author":{"_account_id":9076,"name":"Kris Lindgren","email":"klindgren@godaddy.com","username":"klindgren"},"change_message_id":"6a0a95ad5d3ad1293d4561cee25ef956e7519b47","unresolved":false,"context_lines":[{"line_number":522,"context_line":"            vif_type\u003dportbindings.VIF_TYPE_UNBOUND,"},{"line_number":523,"context_line":"            vif_details\u003d\u0027\u0027"},{"line_number":524,"context_line":"        )"},{"line_number":525,"context_line":"        # TODO(wwriverrat) Is there better way to do this?"},{"line_number":526,"context_line":"        # The port has an IP that came from a specific segment so therefore"},{"line_number":527,"context_line":"        # we must try to bind using that segment."},{"line_number":528,"context_line":"        # See mech_agent.AgentMechanismDriverBase.bind_port"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_b41dc7c1","line":525,"updated":"2018-12-14 03:54:43.000000000","message":"@slaweq - is their a better spot to be doing this?  arbitrarily injecting the segment_id into fixed_ip dict of the port seems..... ugly?","commit_id":"01841f97eebe3bc8b0f21d561fb02f4c4d1b3cac"},{"author":{"_account_id":10962,"name":"David Bingham","email":"dbingham@godaddy.com","username":"wwriverrat"},"change_message_id":"1941077f03dc9074a3ac5406c415c8ee91db6afd","unresolved":false,"context_lines":[{"line_number":522,"context_line":"            vif_type\u003dportbindings.VIF_TYPE_UNBOUND,"},{"line_number":523,"context_line":"            vif_details\u003d\u0027\u0027"},{"line_number":524,"context_line":"        )"},{"line_number":525,"context_line":"        # TODO(wwriverrat) Is there better way to do this?"},{"line_number":526,"context_line":"        # The port has an IP that came from a specific segment so therefore"},{"line_number":527,"context_line":"        # we must try to bind using that segment."},{"line_number":528,"context_line":"        # See mech_agent.AgentMechanismDriverBase.bind_port"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_b7029706","line":525,"in_reply_to":"3f79a3b5_b41dc7c1","updated":"2019-01-02 20:10:32.000000000","message":"Also, calling out to `self.get_subnet` to get the subnet\u0027s segment id seems heavy. Is this efficient enough? Is there easier/more-efficient way to retrieve the segment_id tied to the subnet (from which that specific IP ip came from)?","commit_id":"01841f97eebe3bc8b0f21d561fb02f4c4d1b3cac"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"334c87ad298be18ca7b72e38d04a76fa1dd85960","unresolved":false,"context_lines":[{"line_number":522,"context_line":"            vif_type\u003dportbindings.VIF_TYPE_UNBOUND,"},{"line_number":523,"context_line":"            vif_details\u003d\u0027\u0027"},{"line_number":524,"context_line":"        )"},{"line_number":525,"context_line":"        # TODO(wwriverrat) Is there better way to do this?"},{"line_number":526,"context_line":"        # The port has an IP that came from a specific segment so therefore"},{"line_number":527,"context_line":"        # we must try to bind using that segment."},{"line_number":528,"context_line":"        # See mech_agent.AgentMechanismDriverBase.bind_port"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffd0ebdf_1645c3b3","line":525,"in_reply_to":"3f79a3b5_b7029706","updated":"2019-01-04 09:52:30.000000000","message":"Maybe a bit better way would be to use \"get_subnets\" method and get all subnets with one call only?","commit_id":"01841f97eebe3bc8b0f21d561fb02f4c4d1b3cac"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"4e8dd5f06a491eac9c07270c01d212ab4b8ebaef","unresolved":false,"context_lines":[{"line_number":529,"context_line":"        if not orig_context._network_context._network.get(\u0027l2_adjacency\u0027,"},{"line_number":530,"context_line":"                                                          True):"},{"line_number":531,"context_line":"            for ip in port[\u0027fixed_ips\u0027]:"},{"line_number":532,"context_line":"                if \u0027subnet_id\u0027 in ip:"},{"line_number":533,"context_line":"                    subnet \u003d self.get_subnet(orig_context._plugin_context,"},{"line_number":534,"context_line":"                                             ip[\u0027subnet_id\u0027])"},{"line_number":535,"context_line":"                    if \u0027segment_id\u0027 in subnet:"}],"source_content_type":"text/x-python","patch_set":4,"id":"ffd0ebdf_943696b4","line":532,"updated":"2019-01-03 21:25:26.000000000","message":"There should always be a subnet_id here","commit_id":"0b91adfe48ce67f398bf24ec31034c9b775f9634"},{"author":{"_account_id":10962,"name":"David Bingham","email":"dbingham@godaddy.com","username":"wwriverrat"},"change_message_id":"c815d4ae393c499a46a2b8dbaf4cb881e47b3ff4","unresolved":false,"context_lines":[{"line_number":529,"context_line":"        if not orig_context._network_context._network.get(\u0027l2_adjacency\u0027,"},{"line_number":530,"context_line":"                                                          True):"},{"line_number":531,"context_line":"            for ip in port[\u0027fixed_ips\u0027]:"},{"line_number":532,"context_line":"                if \u0027subnet_id\u0027 in ip:"},{"line_number":533,"context_line":"                    subnet \u003d self.get_subnet(orig_context._plugin_context,"},{"line_number":534,"context_line":"                                             ip[\u0027subnet_id\u0027])"},{"line_number":535,"context_line":"                    if \u0027segment_id\u0027 in subnet:"}],"source_content_type":"text/x-python","patch_set":4,"id":"dfd5e7cf_5266f7ef","line":532,"in_reply_to":"ffd0ebdf_943696b4","updated":"2019-01-10 00:04:53.000000000","message":"awesome","commit_id":"0b91adfe48ce67f398bf24ec31034c9b775f9634"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"4e8dd5f06a491eac9c07270c01d212ab4b8ebaef","unresolved":false,"context_lines":[{"line_number":531,"context_line":"            for ip in port[\u0027fixed_ips\u0027]:"},{"line_number":532,"context_line":"                if \u0027subnet_id\u0027 in ip:"},{"line_number":533,"context_line":"                    subnet \u003d self.get_subnet(orig_context._plugin_context,"},{"line_number":534,"context_line":"                                             ip[\u0027subnet_id\u0027])"},{"line_number":535,"context_line":"                    if \u0027segment_id\u0027 in subnet:"},{"line_number":536,"context_line":"                        ip[\u0027segment_id\u0027] \u003d subnet[\u0027segment_id\u0027]"},{"line_number":537,"context_line":"        self._update_port_dict_binding(port, new_binding)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ffd0ebdf_f4fe02ad","line":534,"updated":"2019-01-03 21:25:26.000000000","message":"get_subnet can throw a SubnetNotFound exception","commit_id":"0b91adfe48ce67f398bf24ec31034c9b775f9634"},{"author":{"_account_id":10962,"name":"David Bingham","email":"dbingham@godaddy.com","username":"wwriverrat"},"change_message_id":"c815d4ae393c499a46a2b8dbaf4cb881e47b3ff4","unresolved":false,"context_lines":[{"line_number":531,"context_line":"            for ip in port[\u0027fixed_ips\u0027]:"},{"line_number":532,"context_line":"                if \u0027subnet_id\u0027 in ip:"},{"line_number":533,"context_line":"                    subnet \u003d self.get_subnet(orig_context._plugin_context,"},{"line_number":534,"context_line":"                                             ip[\u0027subnet_id\u0027])"},{"line_number":535,"context_line":"                    if \u0027segment_id\u0027 in subnet:"},{"line_number":536,"context_line":"                        ip[\u0027segment_id\u0027] \u003d subnet[\u0027segment_id\u0027]"},{"line_number":537,"context_line":"        self._update_port_dict_binding(port, new_binding)"}],"source_content_type":"text/x-python","patch_set":4,"id":"dfd5e7cf_b29ac3c2","line":534,"in_reply_to":"ffd0ebdf_f4fe02ad","updated":"2019-01-10 00:04:53.000000000","message":"True. will wrap in a try.   Although... god I hope that it can find the subnet by ID given that the IP came from that subnet.","commit_id":"0b91adfe48ce67f398bf24ec31034c9b775f9634"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"4e8dd5f06a491eac9c07270c01d212ab4b8ebaef","unresolved":false,"context_lines":[{"line_number":532,"context_line":"                if \u0027subnet_id\u0027 in ip:"},{"line_number":533,"context_line":"                    subnet \u003d self.get_subnet(orig_context._plugin_context,"},{"line_number":534,"context_line":"                                             ip[\u0027subnet_id\u0027])"},{"line_number":535,"context_line":"                    if \u0027segment_id\u0027 in subnet:"},{"line_number":536,"context_line":"                        ip[\u0027segment_id\u0027] \u003d subnet[\u0027segment_id\u0027]"},{"line_number":537,"context_line":"        self._update_port_dict_binding(port, new_binding)"},{"line_number":538,"context_line":"        new_context \u003d driver_context.PortContext("}],"source_content_type":"text/x-python","patch_set":4,"id":"ffd0ebdf_94d21634","line":535,"updated":"2019-01-03 21:25:26.000000000","message":"segment_id \u003d subnet.get(\u0027segment_id\u0027) is cleaner.","commit_id":"0b91adfe48ce67f398bf24ec31034c9b775f9634"},{"author":{"_account_id":10962,"name":"David Bingham","email":"dbingham@godaddy.com","username":"wwriverrat"},"change_message_id":"c815d4ae393c499a46a2b8dbaf4cb881e47b3ff4","unresolved":false,"context_lines":[{"line_number":532,"context_line":"                if \u0027subnet_id\u0027 in ip:"},{"line_number":533,"context_line":"                    subnet \u003d self.get_subnet(orig_context._plugin_context,"},{"line_number":534,"context_line":"                                             ip[\u0027subnet_id\u0027])"},{"line_number":535,"context_line":"                    if \u0027segment_id\u0027 in subnet:"},{"line_number":536,"context_line":"                        ip[\u0027segment_id\u0027] \u003d subnet[\u0027segment_id\u0027]"},{"line_number":537,"context_line":"        self._update_port_dict_binding(port, new_binding)"},{"line_number":538,"context_line":"        new_context \u003d driver_context.PortContext("}],"source_content_type":"text/x-python","patch_set":4,"id":"dfd5e7cf_92f77ff6","line":535,"in_reply_to":"ffd0ebdf_94d21634","updated":"2019-01-10 00:04:53.000000000","message":"done","commit_id":"0b91adfe48ce67f398bf24ec31034c9b775f9634"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"3eaf5757b8ff2a6cb968f49c39891199b2b825be","unresolved":false,"context_lines":[{"line_number":530,"context_line":"                    subnet \u003d self.get_subnet(orig_context._plugin_context,"},{"line_number":531,"context_line":"                                             ip[\u0027subnet_id\u0027])"},{"line_number":532,"context_line":"                except exc.SubnetNotFound:"},{"line_number":533,"context_line":"                    pass  # Should be nearly"},{"line_number":534,"context_line":"                else:"},{"line_number":535,"context_line":"                    ip[\u0027segment_id\u0027] \u003d subnet.get(\u0027segment_id\u0027)"},{"line_number":536,"context_line":"        self._update_port_dict_binding(port, new_binding)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9fdfeff1_b954b522","line":533,"updated":"2019-01-23 22:05:46.000000000","message":"I don\u0027t understand the comment","commit_id":"72eb2864eb8369cc1e96f1c631feb0121c587358"},{"author":{"_account_id":10962,"name":"David Bingham","email":"dbingham@godaddy.com","username":"wwriverrat"},"change_message_id":"4cd738fc44d88f63fc11f969108e10399232278f","unresolved":false,"context_lines":[{"line_number":530,"context_line":"                    subnet \u003d self.get_subnet(orig_context._plugin_context,"},{"line_number":531,"context_line":"                                             ip[\u0027subnet_id\u0027])"},{"line_number":532,"context_line":"                except exc.SubnetNotFound:"},{"line_number":533,"context_line":"                    pass  # Should be nearly"},{"line_number":534,"context_line":"                else:"},{"line_number":535,"context_line":"                    ip[\u0027segment_id\u0027] \u003d subnet.get(\u0027segment_id\u0027)"},{"line_number":536,"context_line":"        self._update_port_dict_binding(port, new_binding)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9fdfeff1_dc4ac725","line":533,"in_reply_to":"9fdfeff1_b954b522","updated":"2019-01-23 22:25:24.000000000","message":"doh! \n\nThis was going to say: \"Should be nearly impossible to ever get here\"\n\nThis is because the subnet_id comes from an IP that we acquired from that subnet (ref ip[\u0027subnet_id\u0027). If SubnetNotFound, how could that IP report that it exists in that subnet? The try-except was added in response to a previous review. But, shrug. Will fix or remove the comment. Thanks for the catch.","commit_id":"72eb2864eb8369cc1e96f1c631feb0121c587358"},{"author":{"_account_id":10962,"name":"David Bingham","email":"dbingham@godaddy.com","username":"wwriverrat"},"change_message_id":"3397d3c6bee824ad0f756e1f2b76e41e8f1eb040","unresolved":false,"context_lines":[{"line_number":529,"context_line":"                    subnet \u003d self.get_subnet(orig_context._plugin_context,"},{"line_number":530,"context_line":"                                             ip[\u0027subnet_id\u0027])"},{"line_number":531,"context_line":"                except exc.SubnetNotFound:"},{"line_number":532,"context_line":"                    pass  # Should be nearly"},{"line_number":533,"context_line":"                else:"},{"line_number":534,"context_line":"                    ip[\u0027segment_id\u0027] \u003d subnet.get(\u0027segment_id\u0027)"},{"line_number":535,"context_line":"        self._update_port_dict_binding(port, new_binding)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_fe7d76b2","line":532,"updated":"2019-02-19 16:43:27.000000000","message":"Ughhh... I forgot to remove and/or fix this. Will fix in next patch. Sorry :-(","commit_id":"fe6ac7e8559bfccc2f15f71bdafef8c096ffea9d"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2f03ccf9f396ac71d0daad5730bb5fff81f75255","unresolved":false,"context_lines":[{"line_number":572,"context_line":"                except exc.SubnetNotFound:"},{"line_number":573,"context_line":"                    pass"},{"line_number":574,"context_line":"                else:"},{"line_number":575,"context_line":"                    ip[\u0027segment_id\u0027] \u003d subnet.get(\u0027segment_id\u0027)"},{"line_number":576,"context_line":"        self._update_port_dict_binding(port, new_binding)"},{"line_number":577,"context_line":"        new_context \u003d driver_context.PortContext("},{"line_number":578,"context_line":"            self, orig_context._plugin_context, port,"}],"source_content_type":"text/x-python","patch_set":11,"id":"9fb8cfa7_ce105351","line":575,"updated":"2019-06-12 17:42:46.000000000","message":"trivial nit: this could go after L571","commit_id":"eb333241e48efb16aecc5763541607503dce4d79"}],"neutron/plugins/ml2/rpc.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2f03ccf9f396ac71d0daad5730bb5fff81f75255","unresolved":false,"context_lines":[{"line_number":161,"context_line":"                 \u0027propagate_uplink_status\u0027: port.get("},{"line_number":162,"context_line":"                     usp.PROPAGATE_UPLINK_STATUS, False)}"},{"line_number":163,"context_line":"        if not port_context.network._network.get(\u0027l2_adjacency\u0027, True):"},{"line_number":164,"context_line":"            entry[\u0027segment_id\u0027] \u003d segment[api.ID]"},{"line_number":165,"context_line":"        LOG.debug(\"Returning: %s\", entry)"},{"line_number":166,"context_line":"        return entry"},{"line_number":167,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9fb8cfa7_ce3933d7","line":164,"updated":"2019-06-12 17:42:46.000000000","message":"Why not populate always the segment_id?","commit_id":"eb333241e48efb16aecc5763541607503dce4d79"}],"neutron/tests/unit/extensions/test_segment.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"3098e6fe90c5bb4fad5f32281e3189c29ae6af43","unresolved":false,"context_lines":[{"line_number":1169,"context_line":"                                     tenant_id\u003dnetwork[\u0027network\u0027][\u0027tenant_id\u0027],"},{"line_number":1170,"context_line":"                                     arg_list\u003d(portbindings.HOST_ID,),"},{"line_number":1171,"context_line":"                                     **{portbindings.HOST_ID: \u0027fakehost\u0027})"},{"line_number":1172,"context_line":"        # Multiple segments are ok, it succeeds."},{"line_number":1173,"context_line":"        self.assertEqual(webob.exc.HTTPCreated.code, response.status_int)"},{"line_number":1174,"context_line":"        self._assert_one_ip_in_subnet(response, subnets[0][\u0027subnet\u0027][\u0027cidr\u0027])"},{"line_number":1175,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9fb8cfa7_4fecc68e","line":1172,"updated":"2019-06-21 08:50:20.000000000","message":"it\u0027s ok only for LinuxBridge agent so far :)","commit_id":"eb333241e48efb16aecc5763541607503dce4d79"}],"neutron/tests/unit/plugins/ml2/test_plugin.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"bd0a73f6d440ed1375b0d8ffac781abf54e35ada","unresolved":false,"context_lines":[{"line_number":2175,"context_line":"    def test__bind_port_original_port_set_multiseg(self):"},{"line_number":2176,"context_line":"        plugin \u003d directory.get_plugin()"},{"line_number":2177,"context_line":"        plugin.mechanism_manager \u003d mock.Mock()"},{"line_number":2178,"context_line":"        ip_dict \u003d {\u0027ip\u0027: \u0027someip\u0027, \u0027subnet_id\u0027: \u0027somesubid\u0027}"},{"line_number":2179,"context_line":"        mock_port \u003d {\u0027id\u0027: \u0027port_id\u0027, \u0027fixed_ips\u0027: [ip_dict]}"},{"line_number":2180,"context_line":"        context \u003d mock.Mock()"},{"line_number":2181,"context_line":"        context.network.current \u003d {\u0027id\u0027: \u0027net_id\u0027}"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_2d15014c","line":2178,"updated":"2018-12-13 08:20:57.000000000","message":"nit: would be better if You could use more \"real\" values, like some real IP address and real, generated uuid here","commit_id":"01841f97eebe3bc8b0f21d561fb02f4c4d1b3cac"},{"author":{"_account_id":10962,"name":"David Bingham","email":"dbingham@godaddy.com","username":"wwriverrat"},"change_message_id":"1941077f03dc9074a3ac5406c415c8ee91db6afd","unresolved":false,"context_lines":[{"line_number":2175,"context_line":"    def test__bind_port_original_port_set_multiseg(self):"},{"line_number":2176,"context_line":"        plugin \u003d directory.get_plugin()"},{"line_number":2177,"context_line":"        plugin.mechanism_manager \u003d mock.Mock()"},{"line_number":2178,"context_line":"        ip_dict \u003d {\u0027ip\u0027: \u0027someip\u0027, \u0027subnet_id\u0027: \u0027somesubid\u0027}"},{"line_number":2179,"context_line":"        mock_port \u003d {\u0027id\u0027: \u0027port_id\u0027, \u0027fixed_ips\u0027: [ip_dict]}"},{"line_number":2180,"context_line":"        context \u003d mock.Mock()"},{"line_number":2181,"context_line":"        context.network.current \u003d {\u0027id\u0027: \u0027net_id\u0027}"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_77d87f4e","line":2178,"in_reply_to":"3f79a3b5_2d15014c","updated":"2019-01-02 20:10:32.000000000","message":"will do. look for them in next patch (and... adding more tests)","commit_id":"01841f97eebe3bc8b0f21d561fb02f4c4d1b3cac"}],"neutron/tests/unit/plugins/ml2/test_rpc.py":[{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"f1e00993329cb171e5b8a11a83e0a58553cab2c9","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                                          cached_networks\u003dcached_networks)"},{"line_number":121,"context_line":"        self.assertIn(\u0027fake_port\u0027, cached_networks)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def test_get_device_details_multisegment(self):"},{"line_number":124,"context_line":"        fake_seg \u003d {"},{"line_number":125,"context_line":"            \u0027id\u0027: \u0027a_seg_id\u0027,"},{"line_number":126,"context_line":"            \u0027network_type\u0027: \u0027vlan\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_cd1eab0b","line":123,"range":{"start_line":123,"start_character":8,"end_line":123,"end_character":44},"updated":"2019-07-08 13:12:02.000000000","message":"There is only 1 segment in this test","commit_id":"eb333241e48efb16aecc5763541607503dce4d79"}]}
