)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"877e03fffc24937eec1aa9116d7a4e9d068e072d","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Set trunk status to DOWN when parent port is unbound"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch ensures that trunk status is set to DOWN when its"},{"line_number":10,"context_line":"parent port is unbound."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I2673d2dd2d1dfd8eaabab66c009311cf4c143734"},{"line_number":13,"context_line":"Partially-implements: blueprint vlan-aware-vms"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"fa7ab95a_612c1eac","line":10,"updated":"2016-08-31 16:46:32.000000000","message":"I would add that this happens when the VM is deleted.","commit_id":"320a238d43023b71b30b0ac4ca4a5fcf3e2e53fa"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"1a6966daf09d8d7bae437373e2a166747c35b61f","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Set trunk status to DOWN when parent port is unbound"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch ensures that trunk status is set to DOWN when its"},{"line_number":10,"context_line":"parent port is unbound."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I2673d2dd2d1dfd8eaabab66c009311cf4c143734"},{"line_number":13,"context_line":"Partially-implements: blueprint vlan-aware-vms"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"fa7ab95a_c9b430d3","line":10,"in_reply_to":"fa7ab95a_612c1eac","updated":"2016-08-31 17:14:26.000000000","message":"Done","commit_id":"320a238d43023b71b30b0ac4ca4a5fcf3e2e53fa"}],"neutron/plugins/ml2/plugin.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"147cf0c7e723448dcfa9958bad93417848c180a5","unresolved":false,"context_lines":[{"line_number":326,"context_line":"            mech_context._clear_binding_levels()"},{"line_number":327,"context_line":"            port[\u0027status\u0027] \u003d const.PORT_STATUS_DOWN"},{"line_number":328,"context_line":"            kwargs \u003d {\u0027context\u0027: mech_context._plugin_context,"},{"line_number":329,"context_line":"                      \u0027updated_port\u0027: port}"},{"line_number":330,"context_line":"            registry.notify(resources.PORT, events.PRECOMMIT_UPDATE, self,"},{"line_number":331,"context_line":"                            **kwargs)"},{"line_number":332,"context_line":"            super(Ml2Plugin, self).update_port("}],"source_content_type":"text/x-python","patch_set":1,"id":"fa7ab95a_8b276a11","line":329,"updated":"2016-08-26 22:06:10.000000000","message":"I think port here is a db object. I wonder about line 341...","commit_id":"b2119acbd5fc348522e25c3097862c87eec990d2"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"152b43da3b6c3caf55c02b04dbfcdff1d4d3d8cf","unresolved":false,"context_lines":[{"line_number":326,"context_line":"            mech_context._clear_binding_levels()"},{"line_number":327,"context_line":"            port[\u0027status\u0027] \u003d const.PORT_STATUS_DOWN"},{"line_number":328,"context_line":"            kwargs \u003d {\u0027context\u0027: mech_context._plugin_context,"},{"line_number":329,"context_line":"                      \u0027updated_port\u0027: port}"},{"line_number":330,"context_line":"            registry.notify(resources.PORT, events.PRECOMMIT_UPDATE, self,"},{"line_number":331,"context_line":"                            **kwargs)"},{"line_number":332,"context_line":"            super(Ml2Plugin, self).update_port("}],"source_content_type":"text/x-python","patch_set":1,"id":"fa7ab95a_178071f6","line":329,"in_reply_to":"fa7ab95a_4e0194ae","updated":"2016-08-30 04:40:41.000000000","message":"port is a dict. mech_context.original_port is a db object. There is some inconsistency here, but maybe it will work itself out as we adopt versioned objects.","commit_id":"b2119acbd5fc348522e25c3097862c87eec990d2"},{"author":{"_account_id":16800,"name":"Rawlin Peters","email":"rawlin.peters@hpe.com","username":"rawlin"},"change_message_id":"31b3d822372fb465dcd10e3e39b85c58491661c5","unresolved":false,"context_lines":[{"line_number":326,"context_line":"            mech_context._clear_binding_levels()"},{"line_number":327,"context_line":"            port[\u0027status\u0027] \u003d const.PORT_STATUS_DOWN"},{"line_number":328,"context_line":"            kwargs \u003d {\u0027context\u0027: mech_context._plugin_context,"},{"line_number":329,"context_line":"                      \u0027updated_port\u0027: port}"},{"line_number":330,"context_line":"            registry.notify(resources.PORT, events.PRECOMMIT_UPDATE, self,"},{"line_number":331,"context_line":"                            **kwargs)"},{"line_number":332,"context_line":"            super(Ml2Plugin, self).update_port("}],"source_content_type":"text/x-python","patch_set":1,"id":"fa7ab95a_4e0194ae","line":329,"in_reply_to":"fa7ab95a_8b276a11","updated":"2016-08-29 20:32:35.000000000","message":"port is a dict here from what I see:\n\n(Pdb) pp type(port)\n\u003ctype \u0027dict\u0027\u003e","commit_id":"b2119acbd5fc348522e25c3097862c87eec990d2"}],"neutron/services/trunk/plugin.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"fbea576bbf4e61195171718e88f0f394f8c71cd8","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from neutron.db import common_db_mixin"},{"line_number":26,"context_line":"from neutron.db import db_base_plugin_common"},{"line_number":27,"context_line":"from neutron.db import db_base_plugin_v2"},{"line_number":28,"context_line":"from neutron.exceptions import portbindings"},{"line_number":29,"context_line":"from neutron.objects import base as objects_base"},{"line_number":30,"context_line":"from neutron.objects import trunk as trunk_objects"},{"line_number":31,"context_line":"from neutron.services import service_base"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa7ab95a_d432a0a6","line":28,"updated":"2016-08-29 17:59:25.000000000","message":"extensions :)","commit_id":"b2119acbd5fc348522e25c3097862c87eec990d2"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"4ffac8e1a20a3c453970f6415d635635af7c8c0b","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from neutron.db import common_db_mixin"},{"line_number":26,"context_line":"from neutron.db import db_base_plugin_common"},{"line_number":27,"context_line":"from neutron.db import db_base_plugin_v2"},{"line_number":28,"context_line":"from neutron.exceptions import portbindings"},{"line_number":29,"context_line":"from neutron.objects import base as objects_base"},{"line_number":30,"context_line":"from neutron.objects import trunk as trunk_objects"},{"line_number":31,"context_line":"from neutron.services import service_base"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa7ab95a_dc0630cd","line":28,"in_reply_to":"fa7ab95a_d432a0a6","updated":"2016-08-30 04:12:05.000000000","message":"Doh","commit_id":"b2119acbd5fc348522e25c3097862c87eec990d2"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"a3b47d02750eba2a6c31456bb74d74f34703a475","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        registry.subscribe(rules.enforce_port_deletion_rules,"},{"line_number":73,"context_line":"                           resources.PORT, events.BEFORE_DELETE)"},{"line_number":74,"context_line":"        registry.subscribe(self._handle_port_unbind,"},{"line_number":75,"context_line":"                           resources.PORT, events.PRECOMMIT_UPDATE)"},{"line_number":76,"context_line":"        registry.notify(constants.TRUNK_PLUGIN, events.AFTER_INIT, self)"},{"line_number":77,"context_line":"        for driver in self._drivers:"},{"line_number":78,"context_line":"            LOG.debug(\u0027Trunk plugin loaded with driver %s\u0027, driver.name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa7ab95a_8642ff3c","line":75,"updated":"2016-08-26 22:10:46.000000000","message":"alternatively we could exploit events.AFTER_UPDATE, which is emitted in [1]. I am ambivalent on which we choose at this point.\n\n[1] https://github.com/openstack/neutron/blob/master/neutron/plugins/ml2/plugin.py#L1427","commit_id":"b2119acbd5fc348522e25c3097862c87eec990d2"},{"author":{"_account_id":16800,"name":"Rawlin Peters","email":"rawlin.peters@hpe.com","username":"rawlin"},"change_message_id":"31b3d822372fb465dcd10e3e39b85c58491661c5","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        registry.subscribe(rules.enforce_port_deletion_rules,"},{"line_number":73,"context_line":"                           resources.PORT, events.BEFORE_DELETE)"},{"line_number":74,"context_line":"        registry.subscribe(self._handle_port_unbind,"},{"line_number":75,"context_line":"                           resources.PORT, events.PRECOMMIT_UPDATE)"},{"line_number":76,"context_line":"        registry.notify(constants.TRUNK_PLUGIN, events.AFTER_INIT, self)"},{"line_number":77,"context_line":"        for driver in self._drivers:"},{"line_number":78,"context_line":"            LOG.debug(\u0027Trunk plugin loaded with driver %s\u0027, driver.name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa7ab95a_abd93259","line":75,"in_reply_to":"fa7ab95a_8642ff3c","updated":"2016-08-29 20:32:35.000000000","message":"I\u0027d vote for AFTER_UPDATE because PRECOMMIT_UPDATE makes it seem like we need special access to the port before it\u0027s committed. Whereas it looks like we only care to inspect the port after it\u0027s been updated.","commit_id":"b2119acbd5fc348522e25c3097862c87eec990d2"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"ab58718f9e5044f0f0714a4cc084549a3f688922","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        registry.subscribe(rules.enforce_port_deletion_rules,"},{"line_number":73,"context_line":"                           resources.PORT, events.BEFORE_DELETE)"},{"line_number":74,"context_line":"        registry.subscribe(self._handle_port_unbind,"},{"line_number":75,"context_line":"                           resources.PORT, events.PRECOMMIT_UPDATE)"},{"line_number":76,"context_line":"        registry.notify(constants.TRUNK_PLUGIN, events.AFTER_INIT, self)"},{"line_number":77,"context_line":"        for driver in self._drivers:"},{"line_number":78,"context_line":"            LOG.debug(\u0027Trunk plugin loaded with driver %s\u0027, driver.name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa7ab95a_ff0bf421","line":75,"in_reply_to":"fa7ab95a_abd93259","updated":"2016-08-29 21:20:33.000000000","message":"the nicety about PRECOMMIT_UPDATE is that we leverage the DB transaction to make the trunk and port update atomic.. If we use AFTER_UPDATE, there\u0027s a chance that something sneaks in between the port update and the trunk update, but I suppose we can cross that bridge when we get to it!","commit_id":"b2119acbd5fc348522e25c3097862c87eec990d2"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"4ffac8e1a20a3c453970f6415d635635af7c8c0b","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        registry.subscribe(rules.enforce_port_deletion_rules,"},{"line_number":73,"context_line":"                           resources.PORT, events.BEFORE_DELETE)"},{"line_number":74,"context_line":"        registry.subscribe(self._handle_port_unbind,"},{"line_number":75,"context_line":"                           resources.PORT, events.PRECOMMIT_UPDATE)"},{"line_number":76,"context_line":"        registry.notify(constants.TRUNK_PLUGIN, events.AFTER_INIT, self)"},{"line_number":77,"context_line":"        for driver in self._drivers:"},{"line_number":78,"context_line":"            LOG.debug(\u0027Trunk plugin loaded with driver %s\u0027, driver.name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa7ab95a_1ca97890","line":75,"in_reply_to":"fa7ab95a_ff0bf421","updated":"2016-08-30 04:12:05.000000000","message":"I prefer PRECOMMIT_UPDATE, I like that it\u0027s atomic.","commit_id":"b2119acbd5fc348522e25c3097862c87eec990d2"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"147cf0c7e723448dcfa9958bad93417848c180a5","unresolved":false,"context_lines":[{"line_number":349,"context_line":""},{"line_number":350,"context_line":"    def _handle_port_unbind(self, resource, event, trigger, **kwargs):"},{"line_number":351,"context_line":"        context \u003d kwargs[\u0027context\u0027]"},{"line_number":352,"context_line":"        port \u003d kwargs[\u0027updated_port\u0027]"},{"line_number":353,"context_line":"        trunk_details \u003d port.get(\u0027trunk_details\u0027)"},{"line_number":354,"context_line":"        if trunk_details and port.get(portbindings.HOST_ID) \u003d\u003d \u0027\u0027:"},{"line_number":355,"context_line":"            trunk \u003d self._get_trunk(context, trunk_details[\u0027trunk_id\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa7ab95a_ab850eae","line":352,"updated":"2016-08-26 22:06:10.000000000","message":"should this be an object I think you should be able to look up the trunk backref and avoid the extra lookup. Something to try out.","commit_id":"b2119acbd5fc348522e25c3097862c87eec990d2"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"4ffac8e1a20a3c453970f6415d635635af7c8c0b","unresolved":false,"context_lines":[{"line_number":349,"context_line":""},{"line_number":350,"context_line":"    def _handle_port_unbind(self, resource, event, trigger, **kwargs):"},{"line_number":351,"context_line":"        context \u003d kwargs[\u0027context\u0027]"},{"line_number":352,"context_line":"        port \u003d kwargs[\u0027updated_port\u0027]"},{"line_number":353,"context_line":"        trunk_details \u003d port.get(\u0027trunk_details\u0027)"},{"line_number":354,"context_line":"        if trunk_details and port.get(portbindings.HOST_ID) \u003d\u003d \u0027\u0027:"},{"line_number":355,"context_line":"            trunk \u003d self._get_trunk(context, trunk_details[\u0027trunk_id\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa7ab95a_bcbfaca8","line":352,"in_reply_to":"fa7ab95a_ab850eae","updated":"2016-08-30 04:12:05.000000000","message":"port is a dict, we\u0027d have to get an object as pass that on the notification. I don\u0027t think we\u0027re gonna get the port in the form of an object *yet*. I\u0027ll see what we can do here. At a minimum it\u0027s worth a note or a todo.","commit_id":"b2119acbd5fc348522e25c3097862c87eec990d2"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"5dfea8a741c344ae56da386289e9cb19559ba137","unresolved":false,"context_lines":[{"line_number":349,"context_line":""},{"line_number":350,"context_line":"    def _handle_port_unbind(self, resource, event, trigger, **kwargs):"},{"line_number":351,"context_line":"        context \u003d kwargs[\u0027context\u0027]"},{"line_number":352,"context_line":"        port \u003d kwargs[\u0027updated_port\u0027]"},{"line_number":353,"context_line":"        trunk_details \u003d port.get(\u0027trunk_details\u0027)"},{"line_number":354,"context_line":"        if trunk_details and port.get(portbindings.HOST_ID) \u003d\u003d \u0027\u0027:"},{"line_number":355,"context_line":"            trunk \u003d self._get_trunk(context, trunk_details[\u0027trunk_id\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa7ab95a_579839c0","line":352,"in_reply_to":"fa7ab95a_bcbfaca8","updated":"2016-08-30 04:27:15.000000000","message":"If we pass current_port, that will have the backref. I\u0027ll look into that.","commit_id":"b2119acbd5fc348522e25c3097862c87eec990d2"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"147cf0c7e723448dcfa9958bad93417848c180a5","unresolved":false,"context_lines":[{"line_number":353,"context_line":"        trunk_details \u003d port.get(\u0027trunk_details\u0027)"},{"line_number":354,"context_line":"        if trunk_details and port.get(portbindings.HOST_ID) \u003d\u003d \u0027\u0027:"},{"line_number":355,"context_line":"            trunk \u003d self._get_trunk(context, trunk_details[\u0027trunk_id\u0027])"},{"line_number":356,"context_line":"            trunk.update_status(constants.DOWN_STATUS)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa7ab95a_2be1fed0","line":356,"updated":"2016-08-26 22:06:10.000000000","message":"#NOTE(status_police)!! :P","commit_id":"b2119acbd5fc348522e25c3097862c87eec990d2"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"4ffac8e1a20a3c453970f6415d635635af7c8c0b","unresolved":false,"context_lines":[{"line_number":353,"context_line":"        trunk_details \u003d port.get(\u0027trunk_details\u0027)"},{"line_number":354,"context_line":"        if trunk_details and port.get(portbindings.HOST_ID) \u003d\u003d \u0027\u0027:"},{"line_number":355,"context_line":"            trunk \u003d self._get_trunk(context, trunk_details[\u0027trunk_id\u0027])"},{"line_number":356,"context_line":"            trunk.update_status(constants.DOWN_STATUS)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa7ab95a_fce3f4d6","line":356,"in_reply_to":"fa7ab95a_2be1fed0","updated":"2016-08-30 04:12:05.000000000","message":"Done","commit_id":"b2119acbd5fc348522e25c3097862c87eec990d2"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"3038b72d362b300e3fa371b0117bbdd6399adcdb","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        registry.subscribe(rules.enforce_port_deletion_rules,"},{"line_number":73,"context_line":"                           resources.PORT, events.BEFORE_DELETE)"},{"line_number":74,"context_line":"        registry.subscribe(self._handle_port_unbind,"},{"line_number":75,"context_line":"                           resources.PORT, events.AFTER_UPDATE)"},{"line_number":76,"context_line":"        registry.notify(constants.TRUNK_PLUGIN, events.AFTER_INIT, self)"},{"line_number":77,"context_line":"        for driver in self._drivers:"},{"line_number":78,"context_line":"            LOG.debug(\u0027Trunk plugin loaded with driver %s\u0027, driver.name)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa7ab95a_a08d7932","line":75,"updated":"2016-08-30 22:25:02.000000000","message":"Decided to go with AFTER_UPDATE instead of PRECOMMIT_UPDATE. Found some strange unit test failures related to tracking transaction \"open\" count \u003d\u003d \"close\" count. I haven\u0027t investigated deeper, it could just be an issue with the tests and may not be a big deal. At the moment this feels like a lower risk way to get the notification.","commit_id":"320a238d43023b71b30b0ac4ca4a5fcf3e2e53fa"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"b07763e28016fdadde3226420cd5c900f56878b6","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        registry.subscribe(rules.enforce_port_deletion_rules,"},{"line_number":73,"context_line":"                           resources.PORT, events.BEFORE_DELETE)"},{"line_number":74,"context_line":"        registry.subscribe(self._handle_port_unbind,"},{"line_number":75,"context_line":"                           resources.PORT, events.AFTER_UPDATE)"},{"line_number":76,"context_line":"        registry.notify(constants.TRUNK_PLUGIN, events.AFTER_INIT, self)"},{"line_number":77,"context_line":"        for driver in self._drivers:"},{"line_number":78,"context_line":"            LOG.debug(\u0027Trunk plugin loaded with driver %s\u0027, driver.name)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa7ab95a_a8c55f0b","line":75,"in_reply_to":"fa7ab95a_68751731","updated":"2016-08-31 00:15:05.000000000","message":"perhaps add a note to remember us to consider switching to PRECOMMIT_UPDATE if we get stung?","commit_id":"320a238d43023b71b30b0ac4ca4a5fcf3e2e53fa"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"738b97ad7b84242fcf647e5246e071787d76f566","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        registry.subscribe(rules.enforce_port_deletion_rules,"},{"line_number":73,"context_line":"                           resources.PORT, events.BEFORE_DELETE)"},{"line_number":74,"context_line":"        registry.subscribe(self._handle_port_unbind,"},{"line_number":75,"context_line":"                           resources.PORT, events.AFTER_UPDATE)"},{"line_number":76,"context_line":"        registry.notify(constants.TRUNK_PLUGIN, events.AFTER_INIT, self)"},{"line_number":77,"context_line":"        for driver in self._drivers:"},{"line_number":78,"context_line":"            LOG.debug(\u0027Trunk plugin loaded with driver %s\u0027, driver.name)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa7ab95a_68751731","line":75,"in_reply_to":"fa7ab95a_a08d7932","updated":"2016-08-31 00:14:22.000000000","message":"do you have a trace?","commit_id":"320a238d43023b71b30b0ac4ca4a5fcf3e2e53fa"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"2b3d5db01393927a2674ec3bbb1c91e48f8e2ee2","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        registry.subscribe(rules.enforce_port_deletion_rules,"},{"line_number":73,"context_line":"                           resources.PORT, events.BEFORE_DELETE)"},{"line_number":74,"context_line":"        registry.subscribe(self._handle_port_unbind,"},{"line_number":75,"context_line":"                           resources.PORT, events.AFTER_UPDATE)"},{"line_number":76,"context_line":"        registry.notify(constants.TRUNK_PLUGIN, events.AFTER_INIT, self)"},{"line_number":77,"context_line":"        for driver in self._drivers:"},{"line_number":78,"context_line":"            LOG.debug(\u0027Trunk plugin loaded with driver %s\u0027, driver.name)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa7ab95a_892edaa3","line":75,"in_reply_to":"fa7ab95a_a8c55f0b","updated":"2016-08-31 04:00:09.000000000","message":"I\u0027ll at least add a note. Here\u0027s an example of what I\u0027m seeing [1]. The problems seems to manifest itself at [2].\n\n[1] http://paste.openstack.org/show/565019/\n\n[2] https://github.com/openstack/neutron/blob/master/neutron/tests/unit/plugins/ml2/test_plugin.py#L2393","commit_id":"320a238d43023b71b30b0ac4ca4a5fcf3e2e53fa"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"877e03fffc24937eec1aa9116d7a4e9d068e072d","unresolved":false,"context_lines":[{"line_number":347,"context_line":""},{"line_number":348,"context_line":"        return obj"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"    def _handle_port_unbind(self, resource, event, trigger, **kwargs):"},{"line_number":351,"context_line":"        context \u003d kwargs[\u0027context\u0027]"},{"line_number":352,"context_line":"        updated_port \u003d kwargs[\u0027port\u0027]"},{"line_number":353,"context_line":"        original_port \u003d kwargs[\u0027original_port\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa7ab95a_933099a0","line":350,"range":{"start_line":350,"start_character":8,"end_line":350,"end_character":27},"updated":"2016-08-31 16:46:32.000000000","message":"it bothers me that we have to run this for every port, but I don\u0027t see any easy work around.\nIt might be worth in terms of performance to exit this method immediately if it\u0027s not a parent port.\n\nif not updated_port.get(\u0027trunk_details\u0027):\n    return","commit_id":"320a238d43023b71b30b0ac4ca4a5fcf3e2e53fa"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"1a6966daf09d8d7bae437373e2a166747c35b61f","unresolved":false,"context_lines":[{"line_number":347,"context_line":""},{"line_number":348,"context_line":"        return obj"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"    def _handle_port_unbind(self, resource, event, trigger, **kwargs):"},{"line_number":351,"context_line":"        context \u003d kwargs[\u0027context\u0027]"},{"line_number":352,"context_line":"        updated_port \u003d kwargs[\u0027port\u0027]"},{"line_number":353,"context_line":"        original_port \u003d kwargs[\u0027original_port\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa7ab95a_a957ecc8","line":350,"range":{"start_line":350,"start_character":8,"end_line":350,"end_character":27},"in_reply_to":"fa7ab95a_933099a0","updated":"2016-08-31 17:14:26.000000000","message":"I\u0027m not sure we actually buy much in terms of performance since we\u0027re just reading a few values out of a dict. However, it would read more clearly if we just failed fast as you suggest. I\u0027ll make that change so that this reads more clearly and we save a few cycles when we\u0027re not dealing with a parent port.","commit_id":"320a238d43023b71b30b0ac4ca4a5fcf3e2e53fa"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"877e03fffc24937eec1aa9116d7a4e9d068e072d","unresolved":false,"context_lines":[{"line_number":354,"context_line":"        trunk_details \u003d updated_port.get(\u0027trunk_details\u0027)"},{"line_number":355,"context_line":"        new_host \u003d updated_port.get(portbindings.HOST_ID)"},{"line_number":356,"context_line":"        original_host \u003d original_port.get(portbindings.HOST_ID)"},{"line_number":357,"context_line":"        if trunk_details and new_host !\u003d original_host and new_host \u003d\u003d \u0027\u0027:"},{"line_number":358,"context_line":"            trunk \u003d self._get_trunk(context, trunk_details[\u0027trunk_id\u0027])"},{"line_number":359,"context_line":"            # NOTE(status_police) Trunk status goes to DOWN when the parent"},{"line_number":360,"context_line":"            # port is unbound."}],"source_content_type":"text/x-python","patch_set":3,"id":"fa7ab95a_f36725e8","line":357,"range":{"start_line":357,"start_character":29,"end_line":357,"end_character":73},"updated":"2016-08-31 16:46:32.000000000","message":"I was discussing this with Armando. We could check that the vif_type of the port is VIF_TYPE_UNBOUND, this would mirror more precisely the status of the parent port and will be a more robust check when we will deal with migrations.","commit_id":"320a238d43023b71b30b0ac4ca4a5fcf3e2e53fa"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"1a6966daf09d8d7bae437373e2a166747c35b61f","unresolved":false,"context_lines":[{"line_number":354,"context_line":"        trunk_details \u003d updated_port.get(\u0027trunk_details\u0027)"},{"line_number":355,"context_line":"        new_host \u003d updated_port.get(portbindings.HOST_ID)"},{"line_number":356,"context_line":"        original_host \u003d original_port.get(portbindings.HOST_ID)"},{"line_number":357,"context_line":"        if trunk_details and new_host !\u003d original_host and new_host \u003d\u003d \u0027\u0027:"},{"line_number":358,"context_line":"            trunk \u003d self._get_trunk(context, trunk_details[\u0027trunk_id\u0027])"},{"line_number":359,"context_line":"            # NOTE(status_police) Trunk status goes to DOWN when the parent"},{"line_number":360,"context_line":"            # port is unbound."}],"source_content_type":"text/x-python","patch_set":3,"id":"fa7ab95a_29767c3e","line":357,"range":{"start_line":357,"start_character":29,"end_line":357,"end_character":73},"in_reply_to":"fa7ab95a_f36725e8","updated":"2016-08-31 17:14:26.000000000","message":"Yes, I completely agree. I was actually thinking the same thing and am in the middle of addressing this.","commit_id":"320a238d43023b71b30b0ac4ca4a5fcf3e2e53fa"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"f4bdc8f6e25a8c0d55db4d9d7e8deb5d9d1ee4f4","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        # NOTE(tidwellr) Consider keying off of PRECOMMIT_UPDATE if we find"},{"line_number":75,"context_line":"        # AFTER_UPDATE to be problematic for setting trunk status when a"},{"line_number":76,"context_line":"        # a parent port becomes unbound."},{"line_number":77,"context_line":"        registry.subscribe(self._handle_port_unbind,"},{"line_number":78,"context_line":"                           resources.PORT, events.AFTER_UPDATE)"},{"line_number":79,"context_line":"        registry.notify(constants.TRUNK_PLUGIN, events.AFTER_INIT, self)"},{"line_number":80,"context_line":"        for driver in self._drivers:"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa7ab95a_a0be16fd","line":77,"updated":"2016-08-31 19:23:47.000000000","message":"it bothers me a little that this method name is not really self documenting. What about: _trigger_trunk_status_change?","commit_id":"d96814019e1884ce11f1b94ece68f993c8a654d4"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"f2f1f453178c21ca0696f90e5038c5470edc25ec","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        # NOTE(tidwellr) Consider keying off of PRECOMMIT_UPDATE if we find"},{"line_number":75,"context_line":"        # AFTER_UPDATE to be problematic for setting trunk status when a"},{"line_number":76,"context_line":"        # a parent port becomes unbound."},{"line_number":77,"context_line":"        registry.subscribe(self._handle_port_unbind,"},{"line_number":78,"context_line":"                           resources.PORT, events.AFTER_UPDATE)"},{"line_number":79,"context_line":"        registry.notify(constants.TRUNK_PLUGIN, events.AFTER_INIT, self)"},{"line_number":80,"context_line":"        for driver in self._drivers:"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa7ab95a_0ed61327","line":77,"in_reply_to":"fa7ab95a_a0be16fd","updated":"2016-08-31 20:06:23.000000000","message":"Done","commit_id":"d96814019e1884ce11f1b94ece68f993c8a654d4"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"f4bdc8f6e25a8c0d55db4d9d7e8deb5d9d1ee4f4","unresolved":false,"context_lines":[{"line_number":367,"context_line":"        if vif_type_changed and new_vif_type \u003d\u003d portbindings.VIF_TYPE_UNBOUND:"},{"line_number":368,"context_line":"            trunk \u003d self._get_trunk(context, trunk_details[\u0027trunk_id\u0027])"},{"line_number":369,"context_line":"            # NOTE(status_police) Trunk status goes to DOWN when the parent"},{"line_number":370,"context_line":"            # port is unbound."},{"line_number":371,"context_line":"            trunk.update(status\u003dconstants.DOWN_STATUS)"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa7ab95a_006182a8","line":370,"updated":"2016-08-31 19:23:47.000000000","message":"This means there are no more physical resources associated with the logical resource.","commit_id":"d96814019e1884ce11f1b94ece68f993c8a654d4"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"f2f1f453178c21ca0696f90e5038c5470edc25ec","unresolved":false,"context_lines":[{"line_number":367,"context_line":"        if vif_type_changed and new_vif_type \u003d\u003d portbindings.VIF_TYPE_UNBOUND:"},{"line_number":368,"context_line":"            trunk \u003d self._get_trunk(context, trunk_details[\u0027trunk_id\u0027])"},{"line_number":369,"context_line":"            # NOTE(status_police) Trunk status goes to DOWN when the parent"},{"line_number":370,"context_line":"            # port is unbound."},{"line_number":371,"context_line":"            trunk.update(status\u003dconstants.DOWN_STATUS)"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa7ab95a_2edd9742","line":370,"in_reply_to":"fa7ab95a_006182a8","updated":"2016-08-31 20:06:23.000000000","message":"Done","commit_id":"d96814019e1884ce11f1b94ece68f993c8a654d4"}],"neutron/tests/unit/services/trunk/test_plugin.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"738b97ad7b84242fcf647e5246e071787d76f566","unresolved":false,"context_lines":[{"line_number":273,"context_line":"            core_plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":274,"context_line":"            trunk \u003d self._create_test_trunk(parent)"},{"line_number":275,"context_line":"            trunk_obj \u003d self._get_trunk_obj(trunk[\u0027id\u0027])"},{"line_number":276,"context_line":"            parent \u003d core_plugin.get_port(self.context, parent[\u0027port\u0027][\u0027id\u0027])"},{"line_number":277,"context_line":"            trunk_obj.update(status\u003dconstants.ACTIVE_STATUS)"},{"line_number":278,"context_line":"            parent[portbindings.HOST_ID] \u003d \u0027\u0027"},{"line_number":279,"context_line":"            kwargs \u003d {\u0027context\u0027: self.context, \u0027port\u0027: parent,"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa7ab95a_a8771f07","line":276,"updated":"2016-08-31 00:14:22.000000000","message":"why are you getting parent again here? It feels strange you define it on 272 and don\u0027t use it.","commit_id":"320a238d43023b71b30b0ac4ca4a5fcf3e2e53fa"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"937f881e5a049b45de1d25205ec680c90582ac83","unresolved":false,"context_lines":[{"line_number":273,"context_line":"            core_plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":274,"context_line":"            trunk \u003d self._create_test_trunk(parent)"},{"line_number":275,"context_line":"            trunk_obj \u003d self._get_trunk_obj(trunk[\u0027id\u0027])"},{"line_number":276,"context_line":"            parent \u003d core_plugin.get_port(self.context, parent[\u0027port\u0027][\u0027id\u0027])"},{"line_number":277,"context_line":"            trunk_obj.update(status\u003dconstants.ACTIVE_STATUS)"},{"line_number":278,"context_line":"            parent[portbindings.HOST_ID] \u003d \u0027\u0027"},{"line_number":279,"context_line":"            kwargs \u003d {\u0027context\u0027: self.context, \u0027port\u0027: parent,"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa7ab95a_e224a9c7","line":276,"in_reply_to":"fa7ab95a_49c9325a","updated":"2016-08-31 18:06:12.000000000","message":"Now I remember why I did this. This is how I was refreshing the port so it had a trunk_details field. It\u0027s probably more clear what is happening if we just append it in the test rather than fetch the port again.","commit_id":"320a238d43023b71b30b0ac4ca4a5fcf3e2e53fa"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"2b3d5db01393927a2674ec3bbb1c91e48f8e2ee2","unresolved":false,"context_lines":[{"line_number":273,"context_line":"            core_plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":274,"context_line":"            trunk \u003d self._create_test_trunk(parent)"},{"line_number":275,"context_line":"            trunk_obj \u003d self._get_trunk_obj(trunk[\u0027id\u0027])"},{"line_number":276,"context_line":"            parent \u003d core_plugin.get_port(self.context, parent[\u0027port\u0027][\u0027id\u0027])"},{"line_number":277,"context_line":"            trunk_obj.update(status\u003dconstants.ACTIVE_STATUS)"},{"line_number":278,"context_line":"            parent[portbindings.HOST_ID] \u003d \u0027\u0027"},{"line_number":279,"context_line":"            kwargs \u003d {\u0027context\u0027: self.context, \u0027port\u0027: parent,"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa7ab95a_49c9325a","line":276,"in_reply_to":"fa7ab95a_a8771f07","updated":"2016-08-31 04:00:09.000000000","message":"Yeah, that\u0027s not right. Oops","commit_id":"320a238d43023b71b30b0ac4ca4a5fcf3e2e53fa"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"5d70ad377c10290f951e6b31dce2817d22951e7c","unresolved":false,"context_lines":[{"line_number":273,"context_line":"            core_plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":274,"context_line":"            trunk \u003d self._create_test_trunk(parent)"},{"line_number":275,"context_line":"            trunk_obj \u003d self._get_trunk_obj(trunk[\u0027id\u0027])"},{"line_number":276,"context_line":"            parent \u003d core_plugin.get_port(self.context, parent[\u0027port\u0027][\u0027id\u0027])"},{"line_number":277,"context_line":"            trunk_obj.update(status\u003dconstants.ACTIVE_STATUS)"},{"line_number":278,"context_line":"            parent[portbindings.HOST_ID] \u003d \u0027\u0027"},{"line_number":279,"context_line":"            kwargs \u003d {\u0027context\u0027: self.context, \u0027port\u0027: parent,"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa7ab95a_9de7c2ab","line":276,"in_reply_to":"fa7ab95a_e224a9c7","updated":"2016-08-31 18:21:39.000000000","message":"makes sense.","commit_id":"320a238d43023b71b30b0ac4ca4a5fcf3e2e53fa"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"c0458487a6a52c514b32db58be0c74c0c792a17c","unresolved":false,"context_lines":[{"line_number":269,"context_line":"            self.assertEqual(constants.DOWN_STATUS, trunk[\u0027status\u0027])"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"    def test__handle_port_unbind_vif_type_changed_unbound(self):"},{"line_number":272,"context_line":"        with self.port() as parent:"},{"line_number":273,"context_line":"            trunk \u003d self._create_test_trunk(parent)"},{"line_number":274,"context_line":"            trunk_obj \u003d self._get_trunk_obj(trunk[\u0027id\u0027])"},{"line_number":275,"context_line":"            trunk_obj.update(status\u003dconstants.ACTIVE_STATUS)"},{"line_number":276,"context_line":"            parent[portbindings.VIF_TYPE] \u003d portbindings.VIF_TYPE_UNBOUND"},{"line_number":277,"context_line":"            parent[\u0027trunk_details\u0027] \u003d {\u0027trunk_id\u0027: trunk[\u0027id\u0027]}"},{"line_number":278,"context_line":"            self._test__handle_port_unbind(parent,"},{"line_number":279,"context_line":"                                       {portbindings.VIF_TYPE: \u0027fakeviftype\u0027},"},{"line_number":280,"context_line":"                                       trunk_obj,"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa7ab95a_e0049ec7","line":277,"range":{"start_line":272,"start_character":1,"end_line":277,"end_character":63},"updated":"2016-08-31 19:24:22.000000000","message":"these repeat a lot.","commit_id":"d96814019e1884ce11f1b94ece68f993c8a654d4"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"f2f1f453178c21ca0696f90e5038c5470edc25ec","unresolved":false,"context_lines":[{"line_number":269,"context_line":"            self.assertEqual(constants.DOWN_STATUS, trunk[\u0027status\u0027])"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"    def test__handle_port_unbind_vif_type_changed_unbound(self):"},{"line_number":272,"context_line":"        with self.port() as parent:"},{"line_number":273,"context_line":"            trunk \u003d self._create_test_trunk(parent)"},{"line_number":274,"context_line":"            trunk_obj \u003d self._get_trunk_obj(trunk[\u0027id\u0027])"},{"line_number":275,"context_line":"            trunk_obj.update(status\u003dconstants.ACTIVE_STATUS)"},{"line_number":276,"context_line":"            parent[portbindings.VIF_TYPE] \u003d portbindings.VIF_TYPE_UNBOUND"},{"line_number":277,"context_line":"            parent[\u0027trunk_details\u0027] \u003d {\u0027trunk_id\u0027: trunk[\u0027id\u0027]}"},{"line_number":278,"context_line":"            self._test__handle_port_unbind(parent,"},{"line_number":279,"context_line":"                                       {portbindings.VIF_TYPE: \u0027fakeviftype\u0027},"},{"line_number":280,"context_line":"                                       trunk_obj,"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa7ab95a_6e95df3e","line":277,"range":{"start_line":272,"start_character":1,"end_line":277,"end_character":63},"in_reply_to":"fa7ab95a_e0049ec7","updated":"2016-08-31 20:06:23.000000000","message":"Yeah, I think I made this worse. Will be cleaned up in next PS","commit_id":"d96814019e1884ce11f1b94ece68f993c8a654d4"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"5e3e3df6713486b12f4b1cf43f212eec8198e943","unresolved":false,"context_lines":[{"line_number":288,"context_line":"            parent[portbindings.VIF_TYPE] \u003d \u0027fakeviftype\u0027"},{"line_number":289,"context_line":"            parent[\u0027trunk_details\u0027] \u003d {\u0027trunk_id\u0027: trunk[\u0027id\u0027]}"},{"line_number":290,"context_line":"            self._test__handle_port_unbind(parent,"},{"line_number":291,"context_line":"                                       {portbindings.VIF_TYPE: \u0027fakeviftype\u0027},"},{"line_number":292,"context_line":"                                       trunk_obj,"},{"line_number":293,"context_line":"                                       constants.ACTIVE_STATUS)"},{"line_number":294,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"fa7ab95a_9d77bf01","line":291,"updated":"2016-08-31 19:11:16.000000000","message":"these seem to be off","commit_id":"d96814019e1884ce11f1b94ece68f993c8a654d4"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"9bc4ba74c6ce4e418df634ad7ee2f8a2a1e250da","unresolved":false,"context_lines":[{"line_number":288,"context_line":"            parent[portbindings.VIF_TYPE] \u003d \u0027fakeviftype\u0027"},{"line_number":289,"context_line":"            parent[\u0027trunk_details\u0027] \u003d {\u0027trunk_id\u0027: trunk[\u0027id\u0027]}"},{"line_number":290,"context_line":"            self._test__handle_port_unbind(parent,"},{"line_number":291,"context_line":"                                       {portbindings.VIF_TYPE: \u0027fakeviftype\u0027},"},{"line_number":292,"context_line":"                                       trunk_obj,"},{"line_number":293,"context_line":"                                       constants.ACTIVE_STATUS)"},{"line_number":294,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"fa7ab95a_ddc6a715","line":291,"in_reply_to":"fa7ab95a_9d77bf01","updated":"2016-08-31 19:11:49.000000000","message":"wonder why pep8 didn\u0027t complain.","commit_id":"d96814019e1884ce11f1b94ece68f993c8a654d4"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"f2f1f453178c21ca0696f90e5038c5470edc25ec","unresolved":false,"context_lines":[{"line_number":288,"context_line":"            parent[portbindings.VIF_TYPE] \u003d \u0027fakeviftype\u0027"},{"line_number":289,"context_line":"            parent[\u0027trunk_details\u0027] \u003d {\u0027trunk_id\u0027: trunk[\u0027id\u0027]}"},{"line_number":290,"context_line":"            self._test__handle_port_unbind(parent,"},{"line_number":291,"context_line":"                                       {portbindings.VIF_TYPE: \u0027fakeviftype\u0027},"},{"line_number":292,"context_line":"                                       trunk_obj,"},{"line_number":293,"context_line":"                                       constants.ACTIVE_STATUS)"},{"line_number":294,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"fa7ab95a_6e7cff20","line":291,"in_reply_to":"fa7ab95a_ddc6a715","updated":"2016-08-31 20:06:23.000000000","message":"Doesn\u0027t matter, I\u0027m re-writing this anyway. Next PS should be cleaner.","commit_id":"d96814019e1884ce11f1b94ece68f993c8a654d4"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"5e3e3df6713486b12f4b1cf43f212eec8198e943","unresolved":false,"context_lines":[{"line_number":300,"context_line":"            parent[portbindings.VIF_TYPE] \u003d \u0027realviftype\u0027"},{"line_number":301,"context_line":"            parent[\u0027trunk_details\u0027] \u003d {\u0027trunk_id\u0027: trunk[\u0027id\u0027]}"},{"line_number":302,"context_line":"            self._test__handle_port_unbind(parent,"},{"line_number":303,"context_line":"                                       {portbindings.VIF_TYPE: \u0027fakeviftype\u0027},"},{"line_number":304,"context_line":"                                       trunk_obj,"},{"line_number":305,"context_line":"                                       constants.ACTIVE_STATUS)"},{"line_number":306,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"fa7ab95a_bd72c30f","line":303,"updated":"2016-08-31 19:11:16.000000000","message":"ditto","commit_id":"d96814019e1884ce11f1b94ece68f993c8a654d4"}]}
