)]}'
{"neutron/common/constants.py":[{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"c454afa70e6e574f8077a67742f9a5c49d218492","unresolved":false,"context_lines":[{"line_number":40,"context_line":"DEVICE_OWNER_ROUTER_SNAT \u003d \"network:router_centralized_snat\""},{"line_number":41,"context_line":"DEVICE_OWNER_LOADBALANCER \u003d \"neutron:LOADBALANCER\""},{"line_number":42,"context_line":"DEVICE_OWNER_LOADBALANCERV2 \u003d \"neutron:LOADBALANCERV2\""},{"line_number":43,"context_line":"DEVICE_OWNER_COMPUTE \u003d \"compute:\""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"# Collection used to identify devices owned by router interfaces."},{"line_number":46,"context_line":"# DEVICE_OWNER_ROUTER_HA_INTF is a special case and so is not included."}],"source_content_type":"text/x-python","patch_set":8,"id":"9a1a9d01_015d5b78","line":43,"updated":"2015-09-29 23:57:54.000000000","message":"this constant should be used in:\n\n neutron.common.utils.is_dvr_serviced\n neutron.notifiers.nova._is_compute_port","commit_id":"a52b6faef2780e365dce7253fc8eca778977684a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"68965c3f33067e4f39d719a9c56068984b3c17fd","unresolved":false,"context_lines":[{"line_number":40,"context_line":"DEVICE_OWNER_ROUTER_SNAT \u003d \"network:router_centralized_snat\""},{"line_number":41,"context_line":"DEVICE_OWNER_LOADBALANCER \u003d \"neutron:LOADBALANCER\""},{"line_number":42,"context_line":"DEVICE_OWNER_LOADBALANCERV2 \u003d \"neutron:LOADBALANCERV2\""},{"line_number":43,"context_line":"DEVICE_OWNER_COMPUTE \u003d \"compute:\""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"# Collection used to identify devices owned by router interfaces."},{"line_number":46,"context_line":"# DEVICE_OWNER_ROUTER_HA_INTF is a special case and so is not included."}],"source_content_type":"text/x-python","patch_set":8,"id":"9a1a9d01_18a85c76","line":43,"in_reply_to":"9a1a9d01_015d5b78","updated":"2015-09-30 10:30:51.000000000","message":"I will do it as a follow up.","commit_id":"a52b6faef2780e365dce7253fc8eca778977684a"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"5faadd92f68c03e28da8eb439aa1c2e22c12edb8","unresolved":false,"context_lines":[{"line_number":40,"context_line":"DEVICE_OWNER_ROUTER_SNAT \u003d \"network:router_centralized_snat\""},{"line_number":41,"context_line":"DEVICE_OWNER_LOADBALANCER \u003d \"neutron:LOADBALANCER\""},{"line_number":42,"context_line":"DEVICE_OWNER_LOADBALANCERV2 \u003d \"neutron:LOADBALANCERV2\""},{"line_number":43,"context_line":"DEVICE_OWNER_COMPUTE \u003d \"compute:\""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"DEVICE_OWNER_PREFIXES \u003d [\"network:\", \"neutron:\"]"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5a2ca52d_2bb96415","line":43,"updated":"2015-10-16 11:08:01.000000000","message":"i suspect DEVICE_OWNER_COMPUTE_PREFIX is a better name.","commit_id":"6dc3ed15cd90457b94d9fb0d34a32633fc1d1a33"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"4d66b2e95336dd8066aa0e6785c1df7efe53ee0b","unresolved":false,"context_lines":[{"line_number":30,"context_line":"FLOATINGIP_STATUS_DOWN \u003d \u0027DOWN\u0027"},{"line_number":31,"context_line":"FLOATINGIP_STATUS_ERROR \u003d \u0027ERROR\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"DEVICE_OWNER_NETWORK \u003d \"network:\""},{"line_number":34,"context_line":"DEVICE_OWNER_ROUTER_HA_INTF \u003d\\"},{"line_number":35,"context_line":"                \"{}router_ha_interface\".format(DEVICE_OWNER_NETWORK)"},{"line_number":36,"context_line":"DEVICE_OWNER_ROUTER_INTF \u003d \"{}router_interface\".format(DEVICE_OWNER_NETWORK)"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_64a66755","line":33,"updated":"2015-11-13 07:29:25.000000000","message":"i\u0027d suggest DEVICE_OWNER_NETWORK_PREFIX","commit_id":"cf3a1c84ddbf5e49521097cdf7012489ffc0c771"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"77c47bed1767fd3922c58880b671dfb2584738d6","unresolved":false,"context_lines":[{"line_number":30,"context_line":"FLOATINGIP_STATUS_DOWN \u003d \u0027DOWN\u0027"},{"line_number":31,"context_line":"FLOATINGIP_STATUS_ERROR \u003d \u0027ERROR\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"DEVICE_OWNER_NETWORK \u003d \"network:\""},{"line_number":34,"context_line":"DEVICE_OWNER_ROUTER_HA_INTF \u003d\\"},{"line_number":35,"context_line":"                \"{}router_ha_interface\".format(DEVICE_OWNER_NETWORK)"},{"line_number":36,"context_line":"DEVICE_OWNER_ROUTER_INTF \u003d \"{}router_interface\".format(DEVICE_OWNER_NETWORK)"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_48e80c17","line":33,"in_reply_to":"da85f559_64a66755","updated":"2015-11-13 07:57:45.000000000","message":"will fix","commit_id":"cf3a1c84ddbf5e49521097cdf7012489ffc0c771"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"4d66b2e95336dd8066aa0e6785c1df7efe53ee0b","unresolved":false,"context_lines":[{"line_number":42,"context_line":"DEVICE_OWNER_AGENT_GW \u003d\\"},{"line_number":43,"context_line":"                \"{}floatingip_agent_gateway\".format(DEVICE_OWNER_NETWORK)"},{"line_number":44,"context_line":"DEVICE_OWNER_ROUTER_SNAT \u003d\\"},{"line_number":45,"context_line":"                \"{}router_centralized_snat\".format(DEVICE_OWNER_NETWORK)"},{"line_number":46,"context_line":"DEVICE_OWNER_LOADBALANCER \u003d \"neutron:LOADBALANCER\""},{"line_number":47,"context_line":"DEVICE_OWNER_LOADBALANCERV2 \u003d \"neutron:LOADBALANCERV2\""},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_04bbdb76","line":45,"updated":"2015-11-13 07:29:25.000000000","message":"these seem unnecessarily complicated to me.","commit_id":"cf3a1c84ddbf5e49521097cdf7012489ffc0c771"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"77c47bed1767fd3922c58880b671dfb2584738d6","unresolved":false,"context_lines":[{"line_number":42,"context_line":"DEVICE_OWNER_AGENT_GW \u003d\\"},{"line_number":43,"context_line":"                \"{}floatingip_agent_gateway\".format(DEVICE_OWNER_NETWORK)"},{"line_number":44,"context_line":"DEVICE_OWNER_ROUTER_SNAT \u003d\\"},{"line_number":45,"context_line":"                \"{}router_centralized_snat\".format(DEVICE_OWNER_NETWORK)"},{"line_number":46,"context_line":"DEVICE_OWNER_LOADBALANCER \u003d \"neutron:LOADBALANCER\""},{"line_number":47,"context_line":"DEVICE_OWNER_LOADBALANCERV2 \u003d \"neutron:LOADBALANCERV2\""},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_683b909d","line":45,"in_reply_to":"da85f559_04bbdb76","updated":"2015-11-13 07:57:45.000000000","message":"yeah I wanted to give it a try. Would it be better to use \"%sblabla\" % in your opinion or would you just leave it as it is today?","commit_id":"cf3a1c84ddbf5e49521097cdf7012489ffc0c771"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"87b426f63c465779389787b3fb6cbcb1e8a979fb","unresolved":false,"context_lines":[{"line_number":49,"context_line":"DEVICE_OWNER_LOADBALANCER \u003d DEVICE_OWNER_NEUTRON_PREFIX + \"LOADBALANCER\""},{"line_number":50,"context_line":"DEVICE_OWNER_LOADBALANCERV2 \u003d DEVICE_OWNER_NEUTRON_PREFIX + \"LOADBALANCERV2\""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"DEVICE_OWNER_PREFIXES \u003d (DEVICE_OWNER_NETWORK_PREFIX,"},{"line_number":53,"context_line":"                         DEVICE_OWNER_NEUTRON_PREFIX)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"# Collection used to identify devices owned by router interfaces."}],"source_content_type":"text/x-python","patch_set":15,"id":"ba8a016a_d550a6d6","line":52,"updated":"2015-11-18 12:18:51.000000000","message":"nice!","commit_id":"9025372efba1f743bd867ced9c46ebf3ec2b63ac"}],"neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py":[{"author":{"_account_id":2733,"name":"Darragh O\u0027Reilly","email":"doreilly@suse.com","username":"darragh-oreilly"},"change_message_id":"d1d017451c7ef1a57ff87f30ff9a90f9e6e8415c","unresolved":false,"context_lines":[{"line_number":390,"context_line":"            if not phy_dev_name:"},{"line_number":391,"context_line":"                return False"},{"line_number":392,"context_line":"            self.ensure_tap_mtu(tap_device_name, phy_dev_name)"},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"        # Check if device needs to be added to bridge"},{"line_number":395,"context_line":"        tap_device_in_bridge \u003d self.get_bridge_for_tap_device(tap_device_name)"},{"line_number":396,"context_line":"        if not tap_device_in_bridge:"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba3cc151_7a2bebeb","side":"PARENT","line":393,"updated":"2015-07-07 18:46:09.000000000","message":"I think we could check the port device_owner here and skip the \u0027brctl addif\u0027 if it belongs to nova. Just need to pass that attribute on from treat_devices_added_updated().","commit_id":"5c588003e2a84234229145b74f1f9db04abc1280"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"1c6b7d630fff5be0cc42e54eee17e35dfc76c271","unresolved":false,"context_lines":[{"line_number":390,"context_line":"            if not phy_dev_name:"},{"line_number":391,"context_line":"                return False"},{"line_number":392,"context_line":"            self.ensure_tap_mtu(tap_device_name, phy_dev_name)"},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"        # Check if device needs to be added to bridge"},{"line_number":395,"context_line":"        tap_device_in_bridge \u003d self.get_bridge_for_tap_device(tap_device_name)"},{"line_number":396,"context_line":"        if not tap_device_in_bridge:"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_23d56db8","side":"PARENT","line":393,"in_reply_to":"ba3cc151_7a2bebeb","updated":"2015-07-13 14:47:49.000000000","message":"Done","commit_id":"5c588003e2a84234229145b74f1f9db04abc1280"}],"neutron/plugins/ml2/drivers/linuxbridge/agent/linuxbridge_neutron_agent.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"79839a9f1ae5318c8108beceb688c8888ad8d9e1","unresolved":false,"context_lines":[{"line_number":919,"context_line":"                        device_details[\u0027physical_network\u0027],"},{"line_number":920,"context_line":"                        segmentation_id,"},{"line_number":921,"context_line":"                        device_details[\u0027port_id\u0027],"},{"line_number":922,"context_line":"                        device_details[\u0027device_owner\u0027]):"},{"line_number":923,"context_line":""},{"line_number":924,"context_line":"                        # update plugin about port status"},{"line_number":925,"context_line":"                        self.plugin_rpc.update_device_up(self.context,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a41bdd9_d4031541","line":922,"updated":"2015-07-13 15:33:14.000000000","message":"i have a few concerns with this - and maybe a little rusty at this stage. in the nova updates port updated is called a number of times and in one of the cases the port is update to have the device owner. this is not set when the port is initially created. could that be a problem?","commit_id":"15245acf503e8f365f2a8e480d2efb70f672baab"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"4366409e1b80b223b90c9aee5da9b0a9495a6363","unresolved":false,"context_lines":[{"line_number":391,"context_line":""},{"line_number":392,"context_line":"        # Check if device needs to be added to bridge - but only if"},{"line_number":393,"context_line":"        # the device_owner is not Nova"},{"line_number":394,"context_line":"        if constants.DEVICE_OWNER_COMPUTE not in device_owner:"},{"line_number":395,"context_line":"            bridge_name \u003d self.get_bridge_name(network_id)"},{"line_number":396,"context_line":"            tap_device_in_bridge \u003d self.get_bridge_for_tap_device("},{"line_number":397,"context_line":"                                    tap_device_name)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a50d1a3_9c9b1617","line":394,"updated":"2015-07-28 16:04:57.000000000","message":"I think the device should be plugged only if the owner is not nova but the check at line 398 should be done for all devices, otherwise the device up message could be sent for taps that haven\u0027t been plugged into the bridge yet.","commit_id":"19a4e792774d616a332ac45860d9a134c6daa573"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"c454afa70e6e574f8077a67742f9a5c49d218492","unresolved":false,"context_lines":[{"line_number":431,"context_line":""},{"line_number":432,"context_line":"        # Check if device needs to be added to bridge - but only if"},{"line_number":433,"context_line":"        # the device_owner is not Nova"},{"line_number":434,"context_line":"        tap_device_in_bridge \u003d self.get_bridge_for_tap_device(tap_device_name)"},{"line_number":435,"context_line":"        if (not tap_device_in_bridge and"},{"line_number":436,"context_line":"            constants.DEVICE_OWNER_COMPUTE not in device_owner):"},{"line_number":437,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9a1a9d01_a1790fca","line":434,"updated":"2015-09-29 23:57:54.000000000","message":"no need to compute tap_device_in_bridge if the device_owner is a compute","commit_id":"a52b6faef2780e365dce7253fc8eca778977684a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"68965c3f33067e4f39d719a9c56068984b3c17fd","unresolved":false,"context_lines":[{"line_number":431,"context_line":""},{"line_number":432,"context_line":"        # Check if device needs to be added to bridge - but only if"},{"line_number":433,"context_line":"        # the device_owner is not Nova"},{"line_number":434,"context_line":"        tap_device_in_bridge \u003d self.get_bridge_for_tap_device(tap_device_name)"},{"line_number":435,"context_line":"        if (not tap_device_in_bridge and"},{"line_number":436,"context_line":"            constants.DEVICE_OWNER_COMPUTE not in device_owner):"},{"line_number":437,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9a1a9d01_98854cd0","line":434,"in_reply_to":"9a1a9d01_a1790fca","updated":"2015-09-30 10:30:51.000000000","message":"Done","commit_id":"a52b6faef2780e365dce7253fc8eca778977684a"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"c454afa70e6e574f8077a67742f9a5c49d218492","unresolved":false,"context_lines":[{"line_number":433,"context_line":"        # the device_owner is not Nova"},{"line_number":434,"context_line":"        tap_device_in_bridge \u003d self.get_bridge_for_tap_device(tap_device_name)"},{"line_number":435,"context_line":"        if (not tap_device_in_bridge and"},{"line_number":436,"context_line":"            constants.DEVICE_OWNER_COMPUTE not in device_owner):"},{"line_number":437,"context_line":""},{"line_number":438,"context_line":"            data \u003d {\u0027tap_device_name\u0027: tap_device_name,"},{"line_number":439,"context_line":"                    \u0027bridge_name\u0027: bridge_name}"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a1a9d01_c1af6328","line":436,"updated":"2015-09-29 23:57:54.000000000","message":"In other places, the test is:\n\n device_owner.startswith(constants.DEVICE_OWNER_COMPUTE)\n\nnot:\n\n constants.DEVICE_OWNER_COMPUTE not in device_owner","commit_id":"a52b6faef2780e365dce7253fc8eca778977684a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"68965c3f33067e4f39d719a9c56068984b3c17fd","unresolved":false,"context_lines":[{"line_number":433,"context_line":"        # the device_owner is not Nova"},{"line_number":434,"context_line":"        tap_device_in_bridge \u003d self.get_bridge_for_tap_device(tap_device_name)"},{"line_number":435,"context_line":"        if (not tap_device_in_bridge and"},{"line_number":436,"context_line":"            constants.DEVICE_OWNER_COMPUTE not in device_owner):"},{"line_number":437,"context_line":""},{"line_number":438,"context_line":"            data \u003d {\u0027tap_device_name\u0027: tap_device_name,"},{"line_number":439,"context_line":"                    \u0027bridge_name\u0027: bridge_name}"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a1a9d01_78e638e9","line":436,"in_reply_to":"9a1a9d01_c1af6328","updated":"2015-09-30 10:30:51.000000000","message":"It would then be *not* ...startswith. Done.","commit_id":"a52b6faef2780e365dce7253fc8eca778977684a"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"c454afa70e6e574f8077a67742f9a5c49d218492","unresolved":false,"context_lines":[{"line_number":890,"context_line":""},{"line_number":891,"context_line":"    def ensure_port_admin_state(self, port_id, admin_state_up):"},{"line_number":892,"context_line":"        LOG.debug(\"Setting admin_state_up to %s for port %s\""},{"line_number":893,"context_line":"                  % (admin_state_up, port_id))"},{"line_number":894,"context_line":"        tap_name \u003d self.br_mgr.get_tap_device_name(port_id)"},{"line_number":895,"context_line":"        if admin_state_up:"},{"line_number":896,"context_line":"            ip_lib.IPDevice(tap_name).link.set_up()"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a1a9d01_617f77ab","line":893,"updated":"2015-09-29 23:57:54.000000000","message":"delegate formatting to LOG.debug","commit_id":"a52b6faef2780e365dce7253fc8eca778977684a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"68965c3f33067e4f39d719a9c56068984b3c17fd","unresolved":false,"context_lines":[{"line_number":890,"context_line":""},{"line_number":891,"context_line":"    def ensure_port_admin_state(self, port_id, admin_state_up):"},{"line_number":892,"context_line":"        LOG.debug(\"Setting admin_state_up to %s for port %s\""},{"line_number":893,"context_line":"                  % (admin_state_up, port_id))"},{"line_number":894,"context_line":"        tap_name \u003d self.br_mgr.get_tap_device_name(port_id)"},{"line_number":895,"context_line":"        if admin_state_up:"},{"line_number":896,"context_line":"            ip_lib.IPDevice(tap_name).link.set_up()"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a1a9d01_783ab8e8","line":893,"in_reply_to":"9a1a9d01_617f77ab","updated":"2015-09-30 10:30:51.000000000","message":"Done","commit_id":"a52b6faef2780e365dce7253fc8eca778977684a"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"9a78db9a73f2995e17700f8369acb68690c88db2","unresolved":false,"context_lines":[{"line_number":469,"context_line":"            self.ensure_tap_mtu(tap_device_name, phy_dev_name)"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"        # Check if device needs to be added to bridge - but only if"},{"line_number":472,"context_line":"        # the device_owner is not Nova"},{"line_number":473,"context_line":"        if not device_owner.startswith(constants.DEVICE_OWNER_COMPUTE):"},{"line_number":474,"context_line":"            tap_device_in_bridge \u003d ("},{"line_number":475,"context_line":"                self.get_bridge_for_tap_device(tap_device_name))"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a1a9d01_816b4785","line":472,"updated":"2015-10-01 22:22:13.000000000","message":"Not sure it\u0027s a good idea to mention explicitly nova","commit_id":"6dc3ed15cd90457b94d9fb0d34a32633fc1d1a33"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"552ab2ca6b619d4f2913fc3aa278dd5762146794","unresolved":false,"context_lines":[{"line_number":469,"context_line":"            self.ensure_tap_mtu(tap_device_name, phy_dev_name)"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"        # Check if device needs to be added to bridge - but only if"},{"line_number":472,"context_line":"        # the device_owner is not Nova"},{"line_number":473,"context_line":"        if not device_owner.startswith(constants.DEVICE_OWNER_COMPUTE):"},{"line_number":474,"context_line":"            tap_device_in_bridge \u003d ("},{"line_number":475,"context_line":"                self.get_bridge_for_tap_device(tap_device_name))"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a2fa921_257823c4","line":472,"in_reply_to":"9a1a9d01_816b4785","updated":"2015-10-06 16:33:53.000000000","message":"Done","commit_id":"6dc3ed15cd90457b94d9fb0d34a32633fc1d1a33"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"ac7d703dcf9066d625bf40ebc411befcc04f029f","unresolved":false,"context_lines":[{"line_number":480,"context_line":"                          \"%(bridge_name)s\", data)"},{"line_number":481,"context_line":"                if bridge_lib.BridgeDevice(bridge_name).addif(tap_device_name):"},{"line_number":482,"context_line":"                    return False"},{"line_number":483,"context_line":"        else:"},{"line_number":484,"context_line":"            data \u003d {\u0027tap_device_name\u0027: tap_device_name,"},{"line_number":485,"context_line":"                    \u0027bridge_name\u0027: bridge_name}"},{"line_number":486,"context_line":"            LOG.debug(\"%(tap_device_name)s already exists on bridge \""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a1a9d01_c7a75ca5","line":483,"updated":"2015-09-30 13:58:07.000000000","message":"Just wondering, should this else really belong to \"if not device_owner.startswith(constants.DEVICE_OWNER_COMPUTE)\"\n\nIf so maybe a better message would be \"tap will be plugged by nova\" (we don\u0027t know if it already has been plugged at that point of time, right?)\n\nOr does it still belong to \"if not tap_device_in_bridge\"? Then it\u0027s totally at the wrong place. And if not, does it make sense to have such an else branch here again?","commit_id":"6dc3ed15cd90457b94d9fb0d34a32633fc1d1a33"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"552ab2ca6b619d4f2913fc3aa278dd5762146794","unresolved":false,"context_lines":[{"line_number":480,"context_line":"                          \"%(bridge_name)s\", data)"},{"line_number":481,"context_line":"                if bridge_lib.BridgeDevice(bridge_name).addif(tap_device_name):"},{"line_number":482,"context_line":"                    return False"},{"line_number":483,"context_line":"        else:"},{"line_number":484,"context_line":"            data \u003d {\u0027tap_device_name\u0027: tap_device_name,"},{"line_number":485,"context_line":"                    \u0027bridge_name\u0027: bridge_name}"},{"line_number":486,"context_line":"            LOG.debug(\"%(tap_device_name)s already exists on bridge \""}],"source_content_type":"text/x-python","patch_set":9,"id":"7a2fa921_45ae7f2f","line":483,"in_reply_to":"9a1a9d01_c7a75ca5","updated":"2015-10-06 16:33:53.000000000","message":"Yeah, it should not claim it\u0027s present, it should only say that it ain\u0027t gonna touch it.","commit_id":"6dc3ed15cd90457b94d9fb0d34a32633fc1d1a33"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"46c4813740921e63bc20cb33c01bc4ee45b96604","unresolved":false,"context_lines":[{"line_number":935,"context_line":"    def setup_linux_bridge(self, bridge_mappings, interface_mappings):"},{"line_number":936,"context_line":"        self.br_mgr \u003d LinuxBridgeManager(bridge_mappings, interface_mappings)"},{"line_number":937,"context_line":""},{"line_number":938,"context_line":"    def ensure_port_admin_state(self, port_id, admin_state_up):"},{"line_number":939,"context_line":"        LOG.debug(\"Setting admin_state_up to %s for port %s\","},{"line_number":940,"context_line":"                  admin_state_up, port_id)"},{"line_number":941,"context_line":"        tap_name \u003d self.br_mgr.get_tap_device_name(port_id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a2fa921_b621afb6","line":938,"updated":"2015-10-07 09:22:14.000000000","message":"Unittest for this method is missing! Could you add one?\n\nMaybe a functional test would be the better choice - but this would be the first for linuxbrige, so I will not insist on that.","commit_id":"fe653b7d05eabf129fe3f76319123e7d3029e590"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"d739483a4aa704cb9e195d37546b97748371e339","unresolved":false,"context_lines":[{"line_number":935,"context_line":"    def setup_linux_bridge(self, bridge_mappings, interface_mappings):"},{"line_number":936,"context_line":"        self.br_mgr \u003d LinuxBridgeManager(bridge_mappings, interface_mappings)"},{"line_number":937,"context_line":""},{"line_number":938,"context_line":"    def ensure_port_admin_state(self, port_id, admin_state_up):"},{"line_number":939,"context_line":"        LOG.debug(\"Setting admin_state_up to %s for port %s\","},{"line_number":940,"context_line":"                  admin_state_up, port_id)"},{"line_number":941,"context_line":"        tap_name \u003d self.br_mgr.get_tap_device_name(port_id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"5a2ca52d_7d62f0ae","line":938,"in_reply_to":"7a2fa921_b621afb6","updated":"2015-10-15 14:54:46.000000000","message":"I will add a unit test. I am not *that* interested in Linux Bridge to do functional test heavy lifting for those who should care more about the driver. :)","commit_id":"fe653b7d05eabf129fe3f76319123e7d3029e590"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"850c835a020ac89d2a00a01b9de37d2a859f554d","unresolved":false,"context_lines":[{"line_number":469,"context_line":"            self.ensure_tap_mtu(tap_device_name, phy_dev_name)"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"        # Avoid messing with devices that the agent does not own"},{"line_number":472,"context_line":"        if not device_owner.startswith(constants.DEVICE_OWNER_COMPUTE):"},{"line_number":473,"context_line":"            tap_device_in_bridge \u003d ("},{"line_number":474,"context_line":"                self.get_bridge_for_tap_device(tap_device_name))"},{"line_number":475,"context_line":"            if not tap_device_in_bridge:"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a2ca52d_a8b6daf6","line":472,"updated":"2015-10-16 11:03:03.000000000","message":"isn\u0027t it safer to check if it\u0027s \"ownded by us\" rather than \"not owned by compute\" ?","commit_id":"8b445fc3d6bf8c5665f142486a341a17dee6c825"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"3695109e409be7179ecb9879f5953399e47b01ed","unresolved":false,"context_lines":[{"line_number":469,"context_line":"            self.ensure_tap_mtu(tap_device_name, phy_dev_name)"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"        # Avoid messing with devices that the agent does not own"},{"line_number":472,"context_line":"        if not device_owner.startswith(constants.DEVICE_OWNER_COMPUTE):"},{"line_number":473,"context_line":"            tap_device_in_bridge \u003d ("},{"line_number":474,"context_line":"                self.get_bridge_for_tap_device(tap_device_name))"},{"line_number":475,"context_line":"            if not tap_device_in_bridge:"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a26ad4f_5e0409bf","line":472,"in_reply_to":"1a26ad4f_bb3bef37","updated":"2015-10-29 03:04:04.000000000","message":"+1","commit_id":"8b445fc3d6bf8c5665f142486a341a17dee6c825"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"2c1505c187ec1fe86f4e7de1fde20903973326b0","unresolved":false,"context_lines":[{"line_number":469,"context_line":"            self.ensure_tap_mtu(tap_device_name, phy_dev_name)"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"        # Avoid messing with devices that the agent does not own"},{"line_number":472,"context_line":"        if not device_owner.startswith(constants.DEVICE_OWNER_COMPUTE):"},{"line_number":473,"context_line":"            tap_device_in_bridge \u003d ("},{"line_number":474,"context_line":"                self.get_bridge_for_tap_device(tap_device_name))"},{"line_number":475,"context_line":"            if not tap_device_in_bridge:"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a26ad4f_bb3bef37","line":472,"in_reply_to":"5a2ca52d_a8b6daf6","updated":"2015-10-29 02:51:16.000000000","message":"+1","commit_id":"8b445fc3d6bf8c5665f142486a341a17dee6c825"},{"author":{"_account_id":16707,"name":"Mohankumar","email":"nmohankumar1011@gmail.com","username":"mohankumar_n"},"change_message_id":"b2919d07f6033203f42c57f4495e6a02b55e9a80","unresolved":false,"context_lines":[{"line_number":469,"context_line":"            self.ensure_tap_mtu(tap_device_name, phy_dev_name)"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"        # Avoid messing with devices that the agent does not own"},{"line_number":472,"context_line":"        if not device_owner.startswith(constants.DEVICE_OWNER_COMPUTE):"},{"line_number":473,"context_line":"            tap_device_in_bridge \u003d ("},{"line_number":474,"context_line":"                self.get_bridge_for_tap_device(tap_device_name))"},{"line_number":475,"context_line":"            if not tap_device_in_bridge:"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa80f949_04ec028e","line":472,"in_reply_to":"5a2ca52d_a8b6daf6","updated":"2015-11-04 18:16:48.000000000","message":"+1","commit_id":"8b445fc3d6bf8c5665f142486a341a17dee6c825"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"a5fcf76544d9b52b094ddfe99ce60610f9485753","unresolved":false,"context_lines":[{"line_number":469,"context_line":"            self.ensure_tap_mtu(tap_device_name, phy_dev_name)"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"        # Avoid messing with devices that the agent does not own"},{"line_number":472,"context_line":"        if not device_owner.startswith(constants.DEVICE_OWNER_COMPUTE):"},{"line_number":473,"context_line":"            tap_device_in_bridge \u003d ("},{"line_number":474,"context_line":"                self.get_bridge_for_tap_device(tap_device_name))"},{"line_number":475,"context_line":"            if not tap_device_in_bridge:"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa80f949_f34ad182","line":472,"in_reply_to":"5a2ca52d_a8b6daf6","updated":"2015-11-05 08:40:37.000000000","message":"What do you mean exactly here? Checking that the device starts with prefixes used by Neutron? Like \u0027tap\u0027, \u0027qvo\u0027 , etc? The code would be less readable and any time a new prefix is added we have to remember to modify this line. The only thing that it would buy us is that if a device exists that doesn\u0027t belong neither to nova compute nor to neutron then this device won\u0027t be enslaved. Am I missing something?","commit_id":"8b445fc3d6bf8c5665f142486a341a17dee6c825"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"0e9f6515c547715338bd82620521c80d3c42f6ab","unresolved":false,"context_lines":[{"line_number":469,"context_line":"            self.ensure_tap_mtu(tap_device_name, phy_dev_name)"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"        # Avoid messing with devices that the agent does not own"},{"line_number":472,"context_line":"        if not device_owner.startswith(constants.DEVICE_OWNER_COMPUTE):"},{"line_number":473,"context_line":"            tap_device_in_bridge \u003d ("},{"line_number":474,"context_line":"                self.get_bridge_for_tap_device(tap_device_name))"},{"line_number":475,"context_line":"            if not tap_device_in_bridge:"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa80f949_4eb5322f","line":472,"in_reply_to":"fa80f949_f34ad182","updated":"2015-11-05 08:45:57.000000000","message":"Yamamato is proposing to use:\n\n if device_owner.startswith(\u0027network:\u0027):\n\ninstead of:\n\n if not device_owner.startswith(\u0027compute:\u0027):","commit_id":"8b445fc3d6bf8c5665f142486a341a17dee6c825"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"f4fd95f0696d9b5753cc92348e4daea8e37ac485","unresolved":false,"context_lines":[{"line_number":471,"context_line":"        # Avoid messing with devices that the agent does not own"},{"line_number":472,"context_line":"        if not device_owner.startswith(constants.DEVICE_OWNER_COMPUTE):"},{"line_number":473,"context_line":"            tap_device_in_bridge \u003d ("},{"line_number":474,"context_line":"                self.get_bridge_for_tap_device(tap_device_name))"},{"line_number":475,"context_line":"            if not tap_device_in_bridge:"},{"line_number":476,"context_line":"                data \u003d {\u0027tap_device_name\u0027: tap_device_name,"},{"line_number":477,"context_line":"                        \u0027bridge_name\u0027: bridge_name}"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a2ca52d_ccad739c","line":474,"updated":"2015-10-16 07:14:06.000000000","message":"Just for my understanding: Why don\u0027t we check if the tap device is plugged into the right bridge?\n\nbridge_name \u003d\u003d tap_device_in_bridge ?\n\nThis could be done in the else of \"if not tap_device_in_bridge\". Would this makes sense or can such a case not happen at all?","commit_id":"8b445fc3d6bf8c5665f142486a341a17dee6c825"},{"author":{"_account_id":12860,"name":"Dongcan Ye","email":"yedongcan@yeah.net","username":"yedongcan"},"change_message_id":"8bbf67f00ce76cc1ed6bffecb48a38bfdf593c15","unresolved":false,"context_lines":[{"line_number":483,"context_line":"            data \u003d {\u0027tap_device_name\u0027: tap_device_name,"},{"line_number":484,"context_line":"                    \u0027bridge_name\u0027: bridge_name}"},{"line_number":485,"context_line":"            LOG.debug(\"Device %(tap_device_name)s on %(bridge_name)s \""},{"line_number":486,"context_line":"                      \"is managed elsewhere\", data)"},{"line_number":487,"context_line":"        return True"},{"line_number":488,"context_line":""},{"line_number":489,"context_line":"    def ensure_tap_mtu(self, tap_dev_name, phy_dev_name):"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a29b11f_25529114","line":486,"updated":"2015-10-18 13:31:36.000000000","message":"A suggestion from my side: \"is managed by Nova Compute\" may be clear.","commit_id":"8b445fc3d6bf8c5665f142486a341a17dee6c825"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"3695109e409be7179ecb9879f5953399e47b01ed","unresolved":false,"context_lines":[{"line_number":483,"context_line":"            data \u003d {\u0027tap_device_name\u0027: tap_device_name,"},{"line_number":484,"context_line":"                    \u0027bridge_name\u0027: bridge_name}"},{"line_number":485,"context_line":"            LOG.debug(\"Device %(tap_device_name)s on %(bridge_name)s \""},{"line_number":486,"context_line":"                      \"is managed elsewhere\", data)"},{"line_number":487,"context_line":"        return True"},{"line_number":488,"context_line":""},{"line_number":489,"context_line":"    def ensure_tap_mtu(self, tap_dev_name, phy_dev_name):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a26ad4f_fe12b508","line":486,"in_reply_to":"3a29b11f_25529114","updated":"2015-10-29 03:04:04.000000000","message":"-1, I prefer the current message which avoids explicit reference to Nova","commit_id":"8b445fc3d6bf8c5665f142486a341a17dee6c825"},{"author":{"_account_id":12860,"name":"Dongcan Ye","email":"yedongcan@yeah.net","username":"yedongcan"},"change_message_id":"8bbf67f00ce76cc1ed6bffecb48a38bfdf593c15","unresolved":false,"context_lines":[{"line_number":935,"context_line":"    def setup_linux_bridge(self, bridge_mappings, interface_mappings):"},{"line_number":936,"context_line":"        self.br_mgr \u003d LinuxBridgeManager(bridge_mappings, interface_mappings)"},{"line_number":937,"context_line":""},{"line_number":938,"context_line":"    def ensure_port_admin_state(self, port_id, admin_state_up):"},{"line_number":939,"context_line":"        LOG.debug(\"Setting admin_state_up to %s for port %s\","},{"line_number":940,"context_line":"                  admin_state_up, port_id)"},{"line_number":941,"context_line":"        tap_name \u003d self.br_mgr.get_tap_device_name(port_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a29b11f_0582f552","line":938,"updated":"2015-10-18 13:31:36.000000000","message":"+1","commit_id":"8b445fc3d6bf8c5665f142486a341a17dee6c825"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"850c835a020ac89d2a00a01b9de37d2a859f554d","unresolved":false,"context_lines":[{"line_number":935,"context_line":"    def setup_linux_bridge(self, bridge_mappings, interface_mappings):"},{"line_number":936,"context_line":"        self.br_mgr \u003d LinuxBridgeManager(bridge_mappings, interface_mappings)"},{"line_number":937,"context_line":""},{"line_number":938,"context_line":"    def ensure_port_admin_state(self, port_id, admin_state_up):"},{"line_number":939,"context_line":"        LOG.debug(\"Setting admin_state_up to %s for port %s\","},{"line_number":940,"context_line":"                  admin_state_up, port_id)"},{"line_number":941,"context_line":"        tap_name \u003d self.br_mgr.get_tap_device_name(port_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a2ca52d_a846da78","line":938,"updated":"2015-10-16 11:03:03.000000000","message":"doesn\u0027t this race with nova?\nnova interface driver seems to make the interface up.","commit_id":"8b445fc3d6bf8c5665f142486a341a17dee6c825"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"e589dddf1c9ef588cdf1598c437015d6a45f20e9","unresolved":false,"context_lines":[{"line_number":935,"context_line":"    def setup_linux_bridge(self, bridge_mappings, interface_mappings):"},{"line_number":936,"context_line":"        self.br_mgr \u003d LinuxBridgeManager(bridge_mappings, interface_mappings)"},{"line_number":937,"context_line":""},{"line_number":938,"context_line":"    def ensure_port_admin_state(self, port_id, admin_state_up):"},{"line_number":939,"context_line":"        LOG.debug(\"Setting admin_state_up to %s for port %s\","},{"line_number":940,"context_line":"                  admin_state_up, port_id)"},{"line_number":941,"context_line":"        tap_name \u003d self.br_mgr.get_tap_device_name(port_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"da85f559_74f482f1","line":938,"in_reply_to":"1a26ad4f_dbe7cbe2","updated":"2015-11-10 10:14:07.000000000","message":"probably it isn\u0027t a problem for admin_state_up\u003dTrue.\nbut i guess it can be for admin_state_up\u003dFalse.","commit_id":"8b445fc3d6bf8c5665f142486a341a17dee6c825"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"2c1505c187ec1fe86f4e7de1fde20903973326b0","unresolved":false,"context_lines":[{"line_number":935,"context_line":"    def setup_linux_bridge(self, bridge_mappings, interface_mappings):"},{"line_number":936,"context_line":"        self.br_mgr \u003d LinuxBridgeManager(bridge_mappings, interface_mappings)"},{"line_number":937,"context_line":""},{"line_number":938,"context_line":"    def ensure_port_admin_state(self, port_id, admin_state_up):"},{"line_number":939,"context_line":"        LOG.debug(\"Setting admin_state_up to %s for port %s\","},{"line_number":940,"context_line":"                  admin_state_up, port_id)"},{"line_number":941,"context_line":"        tap_name \u003d self.br_mgr.get_tap_device_name(port_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a26ad4f_dbe7cbe2","line":938,"in_reply_to":"3a29b11f_0582f552","updated":"2015-10-29 02:51:16.000000000","message":"I\u0027m not sure if this is a problem here - bringing an up device up should not cause any issues!","commit_id":"8b445fc3d6bf8c5665f142486a341a17dee6c825"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"0ac359c313733d7836ea60746ac15f6afd6ccaa2","unresolved":false,"context_lines":[{"line_number":935,"context_line":"    def setup_linux_bridge(self, bridge_mappings, interface_mappings):"},{"line_number":936,"context_line":"        self.br_mgr \u003d LinuxBridgeManager(bridge_mappings, interface_mappings)"},{"line_number":937,"context_line":""},{"line_number":938,"context_line":"    def ensure_port_admin_state(self, port_id, admin_state_up):"},{"line_number":939,"context_line":"        LOG.debug(\"Setting admin_state_up to %s for port %s\","},{"line_number":940,"context_line":"                  admin_state_up, port_id)"},{"line_number":941,"context_line":"        tap_name \u003d self.br_mgr.get_tap_device_name(port_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a8ffd7b_1a37cbff","line":938,"in_reply_to":"9a8ffd7b_f4fe1b37","updated":"2015-11-30 10:42:03.000000000","message":"Andreas,\n\nthank you for detailed analysis.\nif you want to go with the current approach (which is surely\nan improvement from the original code) for now,\ncan you put TODO/REVISIT comment with your analysis\nand probably file a bug, so that it won\u0027t be forgotten?","commit_id":"8b445fc3d6bf8c5665f142486a341a17dee6c825"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"0d1bce2f01b5fb2a31a5cefea58a67f434501a71","unresolved":false,"context_lines":[{"line_number":935,"context_line":"    def setup_linux_bridge(self, bridge_mappings, interface_mappings):"},{"line_number":936,"context_line":"        self.br_mgr \u003d LinuxBridgeManager(bridge_mappings, interface_mappings)"},{"line_number":937,"context_line":""},{"line_number":938,"context_line":"    def ensure_port_admin_state(self, port_id, admin_state_up):"},{"line_number":939,"context_line":"        LOG.debug(\"Setting admin_state_up to %s for port %s\","},{"line_number":940,"context_line":"                  admin_state_up, port_id)"},{"line_number":941,"context_line":"        tap_name \u003d self.br_mgr.get_tap_device_name(port_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a8ffd7b_f4fe1b37","line":938,"in_reply_to":"da85f559_723b1f9d","updated":"2015-11-26 07:59:27.000000000","message":"splitting up the patchset does not work. Just consider the scenario, where a port is plugged with admin_state up (tap plugged by libvirt), then set the state to admin_state_down (agt removes tap from bridge) and then put it to admin_state_up again (agent would not plug the tap again, as it is of type compute)\nSo if we want to solve this bug, we either need \n\n- to go this way\n- to find a mechanism to only skip the add_tap on initial instance start, but there might be other scenarios, so I prefer the approach of this patchset.","commit_id":"8b445fc3d6bf8c5665f142486a341a17dee6c825"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"0f737baf4cd07b4f607aeebaeb13e91ceeab9110","unresolved":false,"context_lines":[{"line_number":935,"context_line":"    def setup_linux_bridge(self, bridge_mappings, interface_mappings):"},{"line_number":936,"context_line":"        self.br_mgr \u003d LinuxBridgeManager(bridge_mappings, interface_mappings)"},{"line_number":937,"context_line":""},{"line_number":938,"context_line":"    def ensure_port_admin_state(self, port_id, admin_state_up):"},{"line_number":939,"context_line":"        LOG.debug(\"Setting admin_state_up to %s for port %s\","},{"line_number":940,"context_line":"                  admin_state_up, port_id)"},{"line_number":941,"context_line":"        tap_name \u003d self.br_mgr.get_tap_device_name(port_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"da85f559_723b1f9d","line":938,"in_reply_to":"da85f559_74f482f1","updated":"2015-11-10 16:22:18.000000000","message":"ok, I had a look at the libvirt code which is responsible for creating the tap device, adding it to the bridge and bringing it online. The routine does this exactly in this order\n\n#1 create tap device, set mac + mtu\n#2 plug it into bridge\n#3 bring it online\n\nAnalysis of today\u0027s code:\n\nThe agent gets triggered after the tap device appeared in the filesystem, which happens slightly after step #1. If the desired admin_state_up is false, today\u0027s code tries to remove the tap device from the bridge. In theory this could become racy if it tries to remove it - before step#2 has been processed. The tap is not yet plugged, so everythings fine. After that step #2 is happening which plugs in the tap device again.\n\nThe proposal with the up state is very similar, except that the race could occur between step #2 and #3 instead of #1 and #2. So I see your issue, but I wonder - is this really more racy than the current approach? At least the code is more straight forward.\n\nSorry for this bad argument ;)\n\nProbably I should move this particular piece of code into a separate patchset....\n\n[1] http://code.metager.de/source/xref/lib/virt/src/util/virnetdevtap.c#532","commit_id":"8b445fc3d6bf8c5665f142486a341a17dee6c825"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"b93f8fff8ad906280805099878723c30716e1fa2","unresolved":false,"context_lines":[{"line_number":469,"context_line":"            self.ensure_tap_mtu(tap_device_name, phy_dev_name)"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"        # Avoid messing with devices that the agent does not own"},{"line_number":472,"context_line":"        if device_owner.startswith(constants.DEVICE_OWNER_NETWORK):"},{"line_number":473,"context_line":"            tap_device_in_bridge \u003d ("},{"line_number":474,"context_line":"                self.get_bridge_for_tap_device(tap_device_name))"},{"line_number":475,"context_line":"            if not tap_device_in_bridge:"}],"source_content_type":"text/x-python","patch_set":12,"id":"da85f559_a90c8cec","line":472,"updated":"2015-11-11 14:01:28.000000000","message":"should we also consider device_owner:neutron? When is one used vs the other?\n\nhttps://github.com/openstack/neutron/blob/master/neutron/common/constants.py#L41","commit_id":"93f08e8fdb84b0c881d25b24bf889c7a55db8f28"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"ef94c784cf97880576698ebfe044799172e6d020","unresolved":false,"context_lines":[{"line_number":469,"context_line":"            self.ensure_tap_mtu(tap_device_name, phy_dev_name)"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"        # Avoid messing with devices that the agent does not own"},{"line_number":472,"context_line":"        if device_owner.startswith(constants.DEVICE_OWNER_NETWORK):"},{"line_number":473,"context_line":"            tap_device_in_bridge \u003d ("},{"line_number":474,"context_line":"                self.get_bridge_for_tap_device(tap_device_name))"},{"line_number":475,"context_line":"            if not tap_device_in_bridge:"}],"source_content_type":"text/x-python","patch_set":12,"id":"da85f559_9460b8d0","line":472,"in_reply_to":"da85f559_a90c8cec","updated":"2015-11-11 16:40:55.000000000","message":"device_owner:neutron it\u0027s used here for example [1] but I don\u0027t know enough about it to say if we need to handle it here or not. \n\n[1] https://github.com/openstack/neutron-lbaas/blob/master/neutron_lbaas/services/loadbalancer/drivers/common/agent_driver_base.py#L194","commit_id":"93f08e8fdb84b0c881d25b24bf889c7a55db8f28"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"4d66b2e95336dd8066aa0e6785c1df7efe53ee0b","unresolved":false,"context_lines":[{"line_number":469,"context_line":"            self.ensure_tap_mtu(tap_device_name, phy_dev_name)"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"        # Avoid messing with devices that the agent does not own"},{"line_number":472,"context_line":"        if device_owner.startswith(constants.DEVICE_OWNER_NETWORK):"},{"line_number":473,"context_line":"            tap_device_in_bridge \u003d ("},{"line_number":474,"context_line":"                self.get_bridge_for_tap_device(tap_device_name))"},{"line_number":475,"context_line":"            if not tap_device_in_bridge:"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_74d7f0ed","line":472,"updated":"2015-11-13 07:29:25.000000000","message":"\"neutron:*\" should be handled as well.","commit_id":"cf3a1c84ddbf5e49521097cdf7012489ffc0c771"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"77c47bed1767fd3922c58880b671dfb2584738d6","unresolved":false,"context_lines":[{"line_number":469,"context_line":"            self.ensure_tap_mtu(tap_device_name, phy_dev_name)"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"        # Avoid messing with devices that the agent does not own"},{"line_number":472,"context_line":"        if device_owner.startswith(constants.DEVICE_OWNER_NETWORK):"},{"line_number":473,"context_line":"            tap_device_in_bridge \u003d ("},{"line_number":474,"context_line":"                self.get_bridge_for_tap_device(tap_device_name))"},{"line_number":475,"context_line":"            if not tap_device_in_bridge:"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_085764cb","line":472,"in_reply_to":"da85f559_74d7f0ed","updated":"2015-11-13 07:57:45.000000000","message":"that was basically one of the open questions I had. thx","commit_id":"cf3a1c84ddbf5e49521097cdf7012489ffc0c771"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"61aab1d3d3e059275959222a66a5f09c2015679d","unresolved":false,"context_lines":[{"line_number":469,"context_line":"            self.ensure_tap_mtu(tap_device_name, phy_dev_name)"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"        # Avoid messing with devices that the agent does not own"},{"line_number":472,"context_line":"        if device_owner.startswith(tuple(constants.DEVICE_OWNER_PREFIXES)):"},{"line_number":473,"context_line":"            tap_device_in_bridge \u003d ("},{"line_number":474,"context_line":"                self.get_bridge_for_tap_device(tap_device_name))"},{"line_number":475,"context_line":"            if not tap_device_in_bridge:"}],"source_content_type":"text/x-python","patch_set":14,"id":"da85f559_ed3ea928","line":472,"updated":"2015-11-13 21:26:53.000000000","message":"An alternative is to transform  DEVICE_OWNER_PREFIXES into a tuple, it seems safer to define immutable constants","commit_id":"423aee1176ad352a4537fea168b62a1f6ae861cc"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"b7c58fb2eb52ccfaae5596199cc0d58047008313","unresolved":false,"context_lines":[{"line_number":469,"context_line":"            self.ensure_tap_mtu(tap_device_name, phy_dev_name)"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"        # Avoid messing with devices that the agent does not own"},{"line_number":472,"context_line":"        if device_owner.startswith(tuple(constants.DEVICE_OWNER_PREFIXES)):"},{"line_number":473,"context_line":"            tap_device_in_bridge \u003d ("},{"line_number":474,"context_line":"                self.get_bridge_for_tap_device(tap_device_name))"},{"line_number":475,"context_line":"            if not tap_device_in_bridge:"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba8a016a_67303b9f","line":472,"in_reply_to":"da85f559_ed3ea928","updated":"2015-11-18 10:00:07.000000000","message":"agree","commit_id":"423aee1176ad352a4537fea168b62a1f6ae861cc"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"87b426f63c465779389787b3fb6cbcb1e8a979fb","unresolved":false,"context_lines":[{"line_number":432,"context_line":"                return False"},{"line_number":433,"context_line":"            self.ensure_tap_mtu(tap_device_name, phy_dev_name)"},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"        # Avoid messing with devices that the agent does not own"},{"line_number":436,"context_line":"        if device_owner.startswith(constants.DEVICE_OWNER_PREFIXES):"},{"line_number":437,"context_line":"            tap_device_in_bridge \u003d ("},{"line_number":438,"context_line":"                self.get_bridge_for_tap_device(tap_device_name))"}],"source_content_type":"text/x-python","patch_set":15,"id":"ba8a016a_952d3e97","line":435,"updated":"2015-11-18 12:18:51.000000000","message":"the comment above does not sit well with me, and I am sorry for nit picking here, the reason for this is that below we do \u0027mess\u0027 with the device when we set the admin state","commit_id":"9025372efba1f743bd867ced9c46ebf3ec2b63ac"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"7e8fc6693e7d678a654ac06d964c2e594361565f","unresolved":false,"context_lines":[{"line_number":432,"context_line":"                return False"},{"line_number":433,"context_line":"            self.ensure_tap_mtu(tap_device_name, phy_dev_name)"},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"        # Avoid messing with devices that the agent does not own"},{"line_number":436,"context_line":"        if device_owner.startswith(constants.DEVICE_OWNER_PREFIXES):"},{"line_number":437,"context_line":"            tap_device_in_bridge \u003d ("},{"line_number":438,"context_line":"                self.get_bridge_for_tap_device(tap_device_name))"}],"source_content_type":"text/x-python","patch_set":15,"id":"ba8a016a_6acd58b6","line":435,"in_reply_to":"ba8a016a_952d3e97","updated":"2015-11-18 13:47:47.000000000","message":"I agree. Need to be more precise. It\u0027s about mess when plugging the tap into a bridge.\n\nThe point is, there is no chance to not \"mess\" with nova/libvirt. I elaborated on that in an earlier review somewhere here: [1]\n\n\n[1] https://review.openstack.org/#/c/193485/11/neutron/plugins/ml2/drivers/linuxbridge/agent/linuxbridge_neutron_agent.py","commit_id":"9025372efba1f743bd867ced9c46ebf3ec2b63ac"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"87b426f63c465779389787b3fb6cbcb1e8a979fb","unresolved":false,"context_lines":[{"line_number":895,"context_line":"    def setup_linux_bridge(self, bridge_mappings, interface_mappings):"},{"line_number":896,"context_line":"        self.br_mgr \u003d LinuxBridgeManager(bridge_mappings, interface_mappings)"},{"line_number":897,"context_line":""},{"line_number":898,"context_line":"    def ensure_port_admin_state(self, port_id, admin_state_up):"},{"line_number":899,"context_line":"        LOG.debug(\"Setting admin_state_up to %s for port %s\","},{"line_number":900,"context_line":"                  admin_state_up, port_id)"},{"line_number":901,"context_line":"        tap_name \u003d self.br_mgr.get_tap_device_name(port_id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"ba8a016a_7a1a097f","line":898,"range":{"start_line":898,"start_character":8,"end_line":898,"end_character":31},"updated":"2015-11-18 12:18:51.000000000","message":"this is an internal method so can you please prefix it with _","commit_id":"9025372efba1f743bd867ced9c46ebf3ec2b63ac"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"7e8fc6693e7d678a654ac06d964c2e594361565f","unresolved":false,"context_lines":[{"line_number":895,"context_line":"    def setup_linux_bridge(self, bridge_mappings, interface_mappings):"},{"line_number":896,"context_line":"        self.br_mgr \u003d LinuxBridgeManager(bridge_mappings, interface_mappings)"},{"line_number":897,"context_line":""},{"line_number":898,"context_line":"    def ensure_port_admin_state(self, port_id, admin_state_up):"},{"line_number":899,"context_line":"        LOG.debug(\"Setting admin_state_up to %s for port %s\","},{"line_number":900,"context_line":"                  admin_state_up, port_id)"},{"line_number":901,"context_line":"        tap_name \u003d self.br_mgr.get_tap_device_name(port_id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"ba8a016a_871af57b","line":898,"in_reply_to":"ba8a016a_7a1a097f","updated":"2015-11-18 13:47:47.000000000","message":"Done","commit_id":"9025372efba1f743bd867ced9c46ebf3ec2b63ac"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"87b426f63c465779389787b3fb6cbcb1e8a979fb","unresolved":false,"context_lines":[{"line_number":944,"context_line":"                        device_details[\u0027port_id\u0027])"},{"line_number":945,"context_line":"                    arp_protect.setup_arp_spoofing_protection(port,"},{"line_number":946,"context_line":"                                                              device_details)"},{"line_number":947,"context_line":"                self.ensure_port_admin_state(device_details[\u0027port_id\u0027],"},{"line_number":948,"context_line":"                                             device_details[\u0027admin_state_up\u0027])"},{"line_number":949,"context_line":"                # create the networking for the port"},{"line_number":950,"context_line":"                network_type \u003d device_details.get(\u0027network_type\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"ba8a016a_b56082d0","line":947,"range":{"start_line":947,"start_character":21,"end_line":947,"end_character":22},"updated":"2015-11-18 12:18:51.000000000","message":"should we not ensure that the device exists prior?\n\nshould this not be called after line 952?","commit_id":"9025372efba1f743bd867ced9c46ebf3ec2b63ac"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"7e8fc6693e7d678a654ac06d964c2e594361565f","unresolved":false,"context_lines":[{"line_number":944,"context_line":"                        device_details[\u0027port_id\u0027])"},{"line_number":945,"context_line":"                    arp_protect.setup_arp_spoofing_protection(port,"},{"line_number":946,"context_line":"                                                              device_details)"},{"line_number":947,"context_line":"                self.ensure_port_admin_state(device_details[\u0027port_id\u0027],"},{"line_number":948,"context_line":"                                             device_details[\u0027admin_state_up\u0027])"},{"line_number":949,"context_line":"                # create the networking for the port"},{"line_number":950,"context_line":"                network_type \u003d device_details.get(\u0027network_type\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"ba8a016a_cac6c467","line":947,"in_reply_to":"ba8a016a_b56082d0","updated":"2015-11-18 13:47:47.000000000","message":"Good point. The existence of the tap is checked somehwhere in add_interface. Done!","commit_id":"9025372efba1f743bd867ced9c46ebf3ec2b63ac"},{"author":{"_account_id":13667,"name":"ZongKai LI","email":"onionpiece@163.com","username":"lzklibj"},"change_message_id":"f46ede07a669ff1c480f486fb66e878f4dda1c40","unresolved":false,"context_lines":[{"line_number":440,"context_line":"                          \"%(bridge_name)s\", data)"},{"line_number":441,"context_line":"                if bridge_lib.BridgeDevice(bridge_name).addif(tap_device_name):"},{"line_number":442,"context_line":"                    return False"},{"line_number":443,"context_line":"        else:"},{"line_number":444,"context_line":"            data \u003d {\u0027tap_device_name\u0027: tap_device_name,"},{"line_number":445,"context_line":"                    \u0027device_owner\u0027: device_owner,"},{"line_number":446,"context_line":"                    \u0027bridge_name\u0027: bridge_name}"}],"source_content_type":"text/x-python","patch_set":19,"id":"ba8a016a_c564c74a","line":443,"updated":"2015-11-22 16:24:53.000000000","message":"Since we can judge whether we can process this device or not by its device_owner, can we put the negative case check to a earlier place? If we\u0027re not going to handle it, we may needn\u0027t to get prepare for that.\n\n\nAnd check log message in L941 and L944-945, it may make people confused, if a device is not managed by neutron, how do neutron make sure that device/port is added or updated?","commit_id":"4e9c9538bc034bca008532586af8d28b905faf32"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"65f33d45926ae94bd2ea87b3a0db22edf85d1a9e","unresolved":false,"context_lines":[{"line_number":440,"context_line":"                          \"%(bridge_name)s\", data)"},{"line_number":441,"context_line":"                if bridge_lib.BridgeDevice(bridge_name).addif(tap_device_name):"},{"line_number":442,"context_line":"                    return False"},{"line_number":443,"context_line":"        else:"},{"line_number":444,"context_line":"            data \u003d {\u0027tap_device_name\u0027: tap_device_name,"},{"line_number":445,"context_line":"                    \u0027device_owner\u0027: device_owner,"},{"line_number":446,"context_line":"                    \u0027bridge_name\u0027: bridge_name}"}],"source_content_type":"text/x-python","patch_set":19,"id":"ba8a016a_5ebdf2d5","line":443,"in_reply_to":"ba8a016a_8218e676","updated":"2015-11-23 11:52:04.000000000","message":"done","commit_id":"4e9c9538bc034bca008532586af8d28b905faf32"},{"author":{"_account_id":13667,"name":"ZongKai LI","email":"onionpiece@163.com","username":"lzklibj"},"change_message_id":"c547289905f310ad1770ae8ecae5c3da0af3e3dd","unresolved":false,"context_lines":[{"line_number":440,"context_line":"                          \"%(bridge_name)s\", data)"},{"line_number":441,"context_line":"                if bridge_lib.BridgeDevice(bridge_name).addif(tap_device_name):"},{"line_number":442,"context_line":"                    return False"},{"line_number":443,"context_line":"        else:"},{"line_number":444,"context_line":"            data \u003d {\u0027tap_device_name\u0027: tap_device_name,"},{"line_number":445,"context_line":"                    \u0027device_owner\u0027: device_owner,"},{"line_number":446,"context_line":"                    \u0027bridge_name\u0027: bridge_name}"}],"source_content_type":"text/x-python","patch_set":19,"id":"ba8a016a_8218e676","line":443,"in_reply_to":"ba8a016a_b76d2a9b","updated":"2015-11-23 09:35:02.000000000","message":"Ok, I get your point now, thanks for your explanation. IMO, message like that may get more clear.","commit_id":"4e9c9538bc034bca008532586af8d28b905faf32"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"ef795f8bbb85841878a86f835dbfb3ea55c044cf","unresolved":false,"context_lines":[{"line_number":440,"context_line":"                          \"%(bridge_name)s\", data)"},{"line_number":441,"context_line":"                if bridge_lib.BridgeDevice(bridge_name).addif(tap_device_name):"},{"line_number":442,"context_line":"                    return False"},{"line_number":443,"context_line":"        else:"},{"line_number":444,"context_line":"            data \u003d {\u0027tap_device_name\u0027: tap_device_name,"},{"line_number":445,"context_line":"                    \u0027device_owner\u0027: device_owner,"},{"line_number":446,"context_line":"                    \u0027bridge_name\u0027: bridge_name}"}],"source_content_type":"text/x-python","patch_set":19,"id":"ba8a016a_b76d2a9b","line":443,"in_reply_to":"ba8a016a_c564c74a","updated":"2015-11-23 09:20:03.000000000","message":"The only thing we want to avoid is that the lb agent plugs the tap device into the bridge for devices that are \"plugged\" elsewhere (e.g. by libvirt). \n\nIt\u0027s not about managing and updating the device in general. Things like executing device_state_up or *_down or setting the MTU is still neutron jobs. So it\u0027s only about plugging the tap into the bridge. That\u0027s why we have this code at this place.\n\nI could update this message to say something like \"plug is done elsewhere\". Would that help?","commit_id":"4e9c9538bc034bca008532586af8d28b905faf32"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"df7794b0f0b0b53d15e19ac46751db474e535d64","unresolved":false,"context_lines":[{"line_number":431,"context_line":"        # does not own"},{"line_number":432,"context_line":"        if device_owner.startswith(constants.DEVICE_OWNER_PREFIXES):"},{"line_number":433,"context_line":"            # Check if device needs to be added to bridge"},{"line_number":434,"context_line":"            tap_device_in_bridge \u003d \\"},{"line_number":435,"context_line":"                bridge_lib.BridgeDevice.get_interface_bridge(tap_device_name)"},{"line_number":436,"context_line":"            if not tap_device_in_bridge:"},{"line_number":437,"context_line":"                data \u003d {\u0027tap_device_name\u0027: tap_device_name,"}],"source_content_type":"text/x-python","patch_set":20,"id":"9a8ffd7b_cffd943b","line":434,"updated":"2015-11-25 22:23:30.000000000","message":"Don\u0027t use a slash. You can fit this all on one line by inserting a newline between the parentheses. In fact, this variable is only used once. ever.\n\n\nSo do:\n\n            if not bridge_lib.BridgeDevice.get_interface_bridge(\n                    tap_device_name):","commit_id":"331f1e37df580f2e6f03fc16374c8595d4eedd62"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"078fbfc8dfdb5075e6c520446133c32573da3cfd","unresolved":false,"context_lines":[{"line_number":431,"context_line":"        # does not own"},{"line_number":432,"context_line":"        if device_owner.startswith(constants.DEVICE_OWNER_PREFIXES):"},{"line_number":433,"context_line":"            # Check if device needs to be added to bridge"},{"line_number":434,"context_line":"            tap_device_in_bridge \u003d \\"},{"line_number":435,"context_line":"                bridge_lib.BridgeDevice.get_interface_bridge(tap_device_name)"},{"line_number":436,"context_line":"            if not tap_device_in_bridge:"},{"line_number":437,"context_line":"                data \u003d {\u0027tap_device_name\u0027: tap_device_name,"}],"source_content_type":"text/x-python","patch_set":20,"id":"9a8ffd7b_b14f2e6a","line":434,"in_reply_to":"9a8ffd7b_cffd943b","updated":"2015-11-26 13:59:44.000000000","message":"Done","commit_id":"331f1e37df580f2e6f03fc16374c8595d4eedd62"}],"neutron/tests/unit/plugins/ml2/drivers/linuxbridge/agent/test_linuxbridge_neutron_agent.py":[{"author":{"_account_id":14757,"name":"Timothy Swanson","email":"tiswanso@cisco.com","username":"tiswanso"},"change_message_id":"f8a24324a741d1917e9fe2c6c822d362b35ec448","unresolved":false,"context_lines":[{"line_number":656,"context_line":"            with mock.patch.object(self.lbm, \"ensure_local_bridge\") as en_fn,\\"},{"line_number":657,"context_line":"                    mock.patch.object(utils, \"execute\") as exec_fn,\\"},{"line_number":658,"context_line":"                    mock.patch.object(self.lbm,"},{"line_number":659,"context_line":"                                      \"get_bridge_for_tap_device\") as get_br:"},{"line_number":660,"context_line":"                exec_fn.return_value \u003d False"},{"line_number":661,"context_line":"                get_br.return_value \u003d True"},{"line_number":662,"context_line":"                self.assertTrue(self.lbm.add_tap_interface(\"123\","}],"source_content_type":"text/x-python","patch_set":5,"id":"9a41bdd9_26072483","line":659,"updated":"2015-07-16 02:16:08.000000000","message":"I think you can remove this mock obj for get_bridge_for_tap_device and the get_br usage since with this patch add_tap_interface() no longer depends on those methods.","commit_id":"bee035c1c93b1a2796d9fbd881b12fc1c1c64e1a"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"4366409e1b80b223b90c9aee5da9b0a9495a6363","unresolved":false,"context_lines":[{"line_number":316,"context_line":"                                                      \u0027port123\u0027)"},{"line_number":317,"context_line":"        self.assertTrue(agent.plugin_rpc.update_device_up.called)"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"    def test_treat_devices_added_updated_admin_state_up_false(self):"},{"line_number":320,"context_line":"        agent \u003d self.agent"},{"line_number":321,"context_line":"        mock_details \u003d {\u0027device\u0027: \u0027dev123\u0027,"},{"line_number":322,"context_line":"                        \u0027port_id\u0027: \u0027port123\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a50d1a3_c540e2a7","side":"PARENT","line":319,"updated":"2015-07-28 16:04:57.000000000","message":"this test shouldn\u0027t be removed, should be updated I think","commit_id":"9d03b11837db701067e2cdd4c2f39df8a0142395"}]}
