)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"d1bf90ca4f74f3e7188a81eb44c63509dbb49775","unresolved":false,"context_lines":[{"line_number":10,"context_line":"(e.g. service plugins) may use to manipulate core resources. This"},{"line_number":11,"context_line":"check prevents them from passing in a context that is already part"},{"line_number":12,"context_line":"of an ongoing DB session because we do not want DB rollbacks to be"},{"line_number":13,"context_line":"allowed after the ML2 plugin calls postcommit methods on drivers."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I5aa099c2264636336ab0b76c0826b506e2dc44b6"},{"line_number":16,"context_line":"Closes-Bug: #1540844"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"dab17558_6491c299","line":13,"updated":"2016-05-06 21:02:02.000000000","message":"I understand this is a stop-gap solution and it must be absolutely clear in this commit message.\n\nThis check must be removed at some point. You just murdered OO, and I think you should take full responsibility for it.","commit_id":"c76e8b733ea855ccc63a528d44f58e4b26b92a5b"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"df201fc11503d16153a90365ae5759d5935aa77a","unresolved":false,"context_lines":[{"line_number":10,"context_line":"(e.g. service plugins) may use to manipulate core resources. This"},{"line_number":11,"context_line":"check prevents them from passing in a context that is already part"},{"line_number":12,"context_line":"of an ongoing DB session because we do not want DB rollbacks to be"},{"line_number":13,"context_line":"allowed after the ML2 plugin calls postcommit methods on drivers."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I5aa099c2264636336ab0b76c0826b506e2dc44b6"},{"line_number":16,"context_line":"Closes-Bug: #1540844"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"dab17558_1beb5ee0","line":13,"in_reply_to":"dab17558_6491c299","updated":"2016-05-11 09:42:41.000000000","message":"Armando,\n\nare you talking about \"is_unsafe\" check?\nor transaction_guard?","commit_id":"c76e8b733ea855ccc63a528d44f58e4b26b92a5b"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"9db6f1863f9b83d18fbd210c5033428ca312768c","unresolved":false,"context_lines":[{"line_number":10,"context_line":"(e.g. service plugins) may use to manipulate core resources. This"},{"line_number":11,"context_line":"check prevents them from passing in a context that is already part"},{"line_number":12,"context_line":"of an ongoing DB session because we do not want DB rollbacks to be"},{"line_number":13,"context_line":"allowed after the ML2 plugin calls postcommit methods on drivers."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I5aa099c2264636336ab0b76c0826b506e2dc44b6"},{"line_number":16,"context_line":"Closes-Bug: #1540844"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"dab17558_0c004233","line":13,"in_reply_to":"dab17558_6491c299","updated":"2016-05-17 09:30:54.000000000","message":"But this guard isn\u0027t a stop-gap solution. I assume you mean the is_unsafe thing?","commit_id":"c76e8b733ea855ccc63a528d44f58e4b26b92a5b"}],"neutron/common/utils.py":[{"author":{"_account_id":7018,"name":"Abhishek Raut","email":"rauta@vmware.com","username":"abhiraut"},"change_message_id":"658c536157c1cefbcc89256c8eb0c0ba13fb4071","unresolved":false,"context_lines":[{"line_number":645,"context_line":"        # TODO(kevinbenton): get rid of all unsafe operations"},{"line_number":646,"context_line":"        if context.session.is_active and not hasattr(context, \u0027is_unsafe\u0027):"},{"line_number":647,"context_line":"            raise RuntimeError(_(\"Method %s cannot be called within a \""},{"line_number":648,"context_line":"                                 \"transaction.\") % f)"},{"line_number":649,"context_line":"        return f(self, context, *args, **kwargs)"},{"line_number":650,"context_line":"    return inner"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a122d0e_4d41c1a8","line":648,"range":{"start_line":648,"start_character":51,"end_line":648,"end_character":52},"updated":"2016-04-19 22:58:16.000000000","message":"f.__name__?","commit_id":"4d49cbf5fc58d58b32c32803714b2a7d5822003e"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"55756b11f4ad3333c772ec43b037bb0bb56713f0","unresolved":false,"context_lines":[{"line_number":645,"context_line":"        # TODO(kevinbenton): get rid of all unsafe operations"},{"line_number":646,"context_line":"        if context.session.is_active and not hasattr(context, \u0027is_unsafe\u0027):"},{"line_number":647,"context_line":"            raise RuntimeError(_(\"Method %s cannot be called within a \""},{"line_number":648,"context_line":"                                 \"transaction.\") % f)"},{"line_number":649,"context_line":"        return f(self, context, *args, **kwargs)"},{"line_number":650,"context_line":"    return inner"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a122d0e_f554c7fe","line":648,"range":{"start_line":648,"start_character":51,"end_line":648,"end_character":52},"in_reply_to":"1a122d0e_4d41c1a8","updated":"2016-04-20 06:21:28.000000000","message":"not sure that is python3 safe. this doesn\u0027t need to be pretty anyway since it\u0027s a developer facing warning.","commit_id":"4d49cbf5fc58d58b32c32803714b2a7d5822003e"},{"author":{"_account_id":7018,"name":"Abhishek Raut","email":"rauta@vmware.com","username":"abhiraut"},"change_message_id":"9bc92566f83496a798c3fcf1b6c2db1067f6e026","unresolved":false,"context_lines":[{"line_number":645,"context_line":"        # TODO(kevinbenton): get rid of all unsafe operations"},{"line_number":646,"context_line":"        if context.session.is_active and not hasattr(context, \u0027is_unsafe\u0027):"},{"line_number":647,"context_line":"            raise RuntimeError(_(\"Method %s cannot be called within a \""},{"line_number":648,"context_line":"                                 \"transaction.\") % f)"},{"line_number":649,"context_line":"        return f(self, context, *args, **kwargs)"},{"line_number":650,"context_line":"    return inner"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a122d0e_afb80d12","line":648,"range":{"start_line":648,"start_character":51,"end_line":648,"end_character":52},"in_reply_to":"1a122d0e_f554c7fe","updated":"2016-04-20 20:59:55.000000000","message":"i think it should be.. i think its even used in neutron.. but no biggie","commit_id":"4d49cbf5fc58d58b32c32803714b2a7d5822003e"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"d1bf90ca4f74f3e7188a81eb44c63509dbb49775","unresolved":false,"context_lines":[{"line_number":626,"context_line":"    return result, dependency"},{"line_number":627,"context_line":""},{"line_number":628,"context_line":""},{"line_number":629,"context_line":"def transaction_guard(f):"},{"line_number":630,"context_line":"    \"\"\"Ensures that the context passed in is not in a transaction."},{"line_number":631,"context_line":""},{"line_number":632,"context_line":"    Various Neutron methods modifying resources have assumptions that they will"}],"source_content_type":"text/x-python","patch_set":7,"id":"dab17558_04c27685","line":629,"updated":"2016-05-06 21:02:02.000000000","message":"is this decorator (and its use) documented somewhere? If not, please do to explain how developers should use it.","commit_id":"c76e8b733ea855ccc63a528d44f58e4b26b92a5b"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"9db6f1863f9b83d18fbd210c5033428ca312768c","unresolved":false,"context_lines":[{"line_number":626,"context_line":"    return result, dependency"},{"line_number":627,"context_line":""},{"line_number":628,"context_line":""},{"line_number":629,"context_line":"def transaction_guard(f):"},{"line_number":630,"context_line":"    \"\"\"Ensures that the context passed in is not in a transaction."},{"line_number":631,"context_line":""},{"line_number":632,"context_line":"    Various Neutron methods modifying resources have assumptions that they will"}],"source_content_type":"text/x-python","patch_set":7,"id":"dab17558_8c68b2f6","line":629,"in_reply_to":"dab17558_04c27685","updated":"2016-05-17 09:30:54.000000000","message":"Isn\u0027t the docstring below enough?","commit_id":"c76e8b733ea855ccc63a528d44f58e4b26b92a5b"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"d1bf90ca4f74f3e7188a81eb44c63509dbb49775","unresolved":false,"context_lines":[{"line_number":642,"context_line":"    \"\"\""},{"line_number":643,"context_line":"    @functools.wraps(f)"},{"line_number":644,"context_line":"    def inner(self, context, *args, **kwargs):"},{"line_number":645,"context_line":"        # TODO(kevinbenton): get rid of all unsafe operations"},{"line_number":646,"context_line":"        if context.session.is_active and not hasattr(context, \u0027is_unsafe\u0027):"},{"line_number":647,"context_line":"            raise RuntimeError(_(\"Method %s cannot be called within a \""},{"line_number":648,"context_line":"                                 \"transaction.\") % f)"}],"source_content_type":"text/x-python","patch_set":7,"id":"dab17558_04ad56e9","line":645,"updated":"2016-05-06 21:02:02.000000000","message":"this is a FIXME","commit_id":"c76e8b733ea855ccc63a528d44f58e4b26b92a5b"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"9db6f1863f9b83d18fbd210c5033428ca312768c","unresolved":false,"context_lines":[{"line_number":642,"context_line":"    \"\"\""},{"line_number":643,"context_line":"    @functools.wraps(f)"},{"line_number":644,"context_line":"    def inner(self, context, *args, **kwargs):"},{"line_number":645,"context_line":"        # TODO(kevinbenton): get rid of all unsafe operations"},{"line_number":646,"context_line":"        if context.session.is_active and not hasattr(context, \u0027is_unsafe\u0027):"},{"line_number":647,"context_line":"            raise RuntimeError(_(\"Method %s cannot be called within a \""},{"line_number":648,"context_line":"                                 \"transaction.\") % f)"}],"source_content_type":"text/x-python","patch_set":7,"id":"dab17558_ec6b3eef","line":645,"in_reply_to":"dab17558_04ad56e9","updated":"2016-05-17 09:30:54.000000000","message":"Done","commit_id":"c76e8b733ea855ccc63a528d44f58e4b26b92a5b"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"be71124f4ffbaeb445fd36fff4dca4f51d9bf524","unresolved":false,"context_lines":[{"line_number":643,"context_line":"    @functools.wraps(f)"},{"line_number":644,"context_line":"    def inner(self, context, *args, **kwargs):"},{"line_number":645,"context_line":"        # TODO(kevinbenton): get rid of all unsafe operations"},{"line_number":646,"context_line":"        if context.session.is_active and not hasattr(context, \u0027is_unsafe\u0027):"},{"line_number":647,"context_line":"            raise RuntimeError(_(\"Method %s cannot be called within a \""},{"line_number":648,"context_line":"                                 \"transaction.\") % f)"},{"line_number":649,"context_line":"        return f(self, context, *args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a122d0e_f54f748f","line":646,"updated":"2016-04-20 21:53:25.000000000","message":"seems a bit strange to use:\n\n hasattr(context, ...)\n\ninstead of:\n\n getattr(context, ..., False)","commit_id":"c76e8b733ea855ccc63a528d44f58e4b26b92a5b"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"9db6f1863f9b83d18fbd210c5033428ca312768c","unresolved":false,"context_lines":[{"line_number":643,"context_line":"    @functools.wraps(f)"},{"line_number":644,"context_line":"    def inner(self, context, *args, **kwargs):"},{"line_number":645,"context_line":"        # TODO(kevinbenton): get rid of all unsafe operations"},{"line_number":646,"context_line":"        if context.session.is_active and not hasattr(context, \u0027is_unsafe\u0027):"},{"line_number":647,"context_line":"            raise RuntimeError(_(\"Method %s cannot be called within a \""},{"line_number":648,"context_line":"                                 \"transaction.\") % f)"},{"line_number":649,"context_line":"        return f(self, context, *args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":7,"id":"dab17558_674ac956","line":646,"in_reply_to":"1a122d0e_f54f748f","updated":"2016-05-17 09:30:54.000000000","message":"Done","commit_id":"c76e8b733ea855ccc63a528d44f58e4b26b92a5b"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"13ad94ce999edaa76f377df1741c044ea0665d94","unresolved":false,"context_lines":[{"line_number":608,"context_line":"    @functools.wraps(f)"},{"line_number":609,"context_line":"    def inner(self, context, *args, **kwargs):"},{"line_number":610,"context_line":"        # FIXME(kevinbenton): get rid of all unsafe operations"},{"line_number":611,"context_line":"        if context.session.is_active and not getattr(context, \u0027UNSAFE\u0027, False):"},{"line_number":612,"context_line":"            raise RuntimeError(_(\"Method %s cannot be called within a \""},{"line_number":613,"context_line":"                                 \"transaction.\") % f)"},{"line_number":614,"context_line":"        return f(self, context, *args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":9,"id":"bacf61ea_77fea539","line":611,"range":{"start_line":611,"start_character":41,"end_line":611,"end_character":78},"updated":"2016-08-02 18:58:29.000000000","message":"Is this a triple negative? It turns my brain to mush. Can you use SAFE instead of UNSAFE?","commit_id":"ff44f9fdb40cef7c707a8f96987560297d99e605"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"2567ce091c25a23c45557861210819a7d5b86269","unresolved":false,"context_lines":[{"line_number":608,"context_line":"    @functools.wraps(f)"},{"line_number":609,"context_line":"    def inner(self, context, *args, **kwargs):"},{"line_number":610,"context_line":"        # FIXME(kevinbenton): get rid of all unsafe operations"},{"line_number":611,"context_line":"        if context.session.is_active and not getattr(context, \u0027UNSAFE\u0027, False):"},{"line_number":612,"context_line":"            raise RuntimeError(_(\"Method %s cannot be called within a \""},{"line_number":613,"context_line":"                                 \"transaction.\") % f)"},{"line_number":614,"context_line":"        return f(self, context, *args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":9,"id":"bacf61ea_6bc0807d","line":611,"range":{"start_line":611,"start_character":41,"end_line":611,"end_character":78},"in_reply_to":"bacf61ea_3039d342","updated":"2016-08-02 20:29:48.000000000","message":"Oh, nevermind. Safe would work fine if i default the getattr to True","commit_id":"ff44f9fdb40cef7c707a8f96987560297d99e605"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"47017cf466ae128bf2a3223269335b917419b0a6","unresolved":false,"context_lines":[{"line_number":608,"context_line":"    @functools.wraps(f)"},{"line_number":609,"context_line":"    def inner(self, context, *args, **kwargs):"},{"line_number":610,"context_line":"        # FIXME(kevinbenton): get rid of all unsafe operations"},{"line_number":611,"context_line":"        if context.session.is_active and not getattr(context, \u0027UNSAFE\u0027, False):"},{"line_number":612,"context_line":"            raise RuntimeError(_(\"Method %s cannot be called within a \""},{"line_number":613,"context_line":"                                 \"transaction.\") % f)"},{"line_number":614,"context_line":"        return f(self, context, *args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":9,"id":"bacf61ea_3039d342","line":611,"range":{"start_line":611,"start_character":41,"end_line":611,"end_character":78},"in_reply_to":"bacf61ea_77fea539","updated":"2016-08-02 20:11:29.000000000","message":"Just a double negative \u0027not unsafe\u0027. I would have to put SAFE on every context object and I don\u0027t want to actually modify the base context to legitimize this in any way. :)\n\nLet me choose another word.","commit_id":"ff44f9fdb40cef7c707a8f96987560297d99e605"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"1ae88ac962f0b56744cd0205d0907ba7a4e7c9ef","unresolved":false,"context_lines":[{"line_number":607,"context_line":"    \"\"\""},{"line_number":608,"context_line":"    @functools.wraps(f)"},{"line_number":609,"context_line":"    def inner(self, context, *args, **kwargs):"},{"line_number":610,"context_line":"        # FIXME(kevinbenton): get rid of all uses of this flag"},{"line_number":611,"context_line":"        if (context.session.is_active and"},{"line_number":612,"context_line":"                getattr(context, \u0027GUARD_TRANSACTION\u0027, True)):"},{"line_number":613,"context_line":"            raise RuntimeError(_(\"Method %s cannot be called within a \""}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_aeda7ce7","line":610,"updated":"2016-08-03 03:50:40.000000000","message":"do you have a suggestion how to adapt service plugins currently using surrounding transactions?\n\neg. https://github.com/openstack/networking-midonet/blob/2e59afbbd67587dbef5e2ede80c2f13823272e2f/midonet/neutron/services/l3/l3_midonet.py#L163","commit_id":"21f77ad8e1c91654fffd3625a8fcafe422e2fa21"}],"neutron/db/l3_dvr_db.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"d1bf90ca4f74f3e7188a81eb44c63509dbb49775","unresolved":false,"context_lines":[{"line_number":227,"context_line":"                    # for the same host. Until we find a good solution for"},{"line_number":228,"context_line":"                    # augmenting multiple server requests we should use the"},{"line_number":229,"context_line":"                    # existing flow."},{"line_number":230,"context_line":"                    # TODO(kevinbenton): refactor so this happens outside"},{"line_number":231,"context_line":"                    # of floating IP transaction since it creates a port"},{"line_number":232,"context_line":"                    # via ML2."},{"line_number":233,"context_line":"                    setattr(admin_ctx, \u0027is_unsafe\u0027, True)"}],"source_content_type":"text/x-python","patch_set":7,"id":"dab17558_c4aa2ed4","line":230,"updated":"2016-05-06 21:02:02.000000000","message":"this is a FIXME","commit_id":"c76e8b733ea855ccc63a528d44f58e4b26b92a5b"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"9db6f1863f9b83d18fbd210c5033428ca312768c","unresolved":false,"context_lines":[{"line_number":227,"context_line":"                    # for the same host. Until we find a good solution for"},{"line_number":228,"context_line":"                    # augmenting multiple server requests we should use the"},{"line_number":229,"context_line":"                    # existing flow."},{"line_number":230,"context_line":"                    # TODO(kevinbenton): refactor so this happens outside"},{"line_number":231,"context_line":"                    # of floating IP transaction since it creates a port"},{"line_number":232,"context_line":"                    # via ML2."},{"line_number":233,"context_line":"                    setattr(admin_ctx, \u0027is_unsafe\u0027, True)"}],"source_content_type":"text/x-python","patch_set":7,"id":"dab17558_0793fd5b","line":230,"in_reply_to":"dab17558_c4aa2ed4","updated":"2016-05-17 09:30:54.000000000","message":"Done","commit_id":"c76e8b733ea855ccc63a528d44f58e4b26b92a5b"}],"neutron/plugins/ml2/plugin.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"d1bf90ca4f74f3e7188a81eb44c63509dbb49775","unresolved":false,"context_lines":[{"line_number":881,"context_line":""},{"line_number":882,"context_line":"    def _create_subnet_db(self, context, subnet):"},{"line_number":883,"context_line":"        session \u003d context.session"},{"line_number":884,"context_line":"        # TODO(kevinbenton): this is a mess because create_subnet ends up"},{"line_number":885,"context_line":"        # calling _update_router_gw_ports which ends up calling update_port"},{"line_number":886,"context_line":"        # on a router port inside this transaction. Need to find a way to"},{"line_number":887,"context_line":"        # separate router updates from the subnet update operation."}],"source_content_type":"text/x-python","patch_set":7,"id":"dab17558_64e8a211","line":884,"updated":"2016-05-06 21:02:02.000000000","message":"FIXME","commit_id":"c76e8b733ea855ccc63a528d44f58e4b26b92a5b"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"9db6f1863f9b83d18fbd210c5033428ca312768c","unresolved":false,"context_lines":[{"line_number":881,"context_line":""},{"line_number":882,"context_line":"    def _create_subnet_db(self, context, subnet):"},{"line_number":883,"context_line":"        session \u003d context.session"},{"line_number":884,"context_line":"        # TODO(kevinbenton): this is a mess because create_subnet ends up"},{"line_number":885,"context_line":"        # calling _update_router_gw_ports which ends up calling update_port"},{"line_number":886,"context_line":"        # on a router port inside this transaction. Need to find a way to"},{"line_number":887,"context_line":"        # separate router updates from the subnet update operation."}],"source_content_type":"text/x-python","patch_set":7,"id":"dab17558_c759f5fe","line":884,"in_reply_to":"dab17558_64e8a211","updated":"2016-05-17 09:30:54.000000000","message":"Done","commit_id":"c76e8b733ea855ccc63a528d44f58e4b26b92a5b"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"df201fc11503d16153a90365ae5759d5935aa77a","unresolved":false,"context_lines":[{"line_number":1344,"context_line":"        binding.host \u003d attrs and attrs.get(portbindings.HOST_ID)"},{"line_number":1345,"context_line":"        binding.router_id \u003d attrs and attrs.get(\u0027device_id\u0027)"},{"line_number":1346,"context_line":""},{"line_number":1347,"context_line":"    def update_dvr_port_binding(self, context, id, port):"},{"line_number":1348,"context_line":"        attrs \u003d port[attributes.PORT]"},{"line_number":1349,"context_line":""},{"line_number":1350,"context_line":"        host \u003d attrs and attrs.get(portbindings.HOST_ID)"}],"source_content_type":"text/x-python","patch_set":7,"id":"dab17558_3b50e2d3","line":1347,"range":{"start_line":1347,"start_character":8,"end_line":1347,"end_character":31},"updated":"2016-05-11 09:42:41.000000000","message":"this method is not \"core methods\" but ought to be decorated.","commit_id":"c76e8b733ea855ccc63a528d44f58e4b26b92a5b"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"9db6f1863f9b83d18fbd210c5033428ca312768c","unresolved":false,"context_lines":[{"line_number":1344,"context_line":"        binding.host \u003d attrs and attrs.get(portbindings.HOST_ID)"},{"line_number":1345,"context_line":"        binding.router_id \u003d attrs and attrs.get(\u0027device_id\u0027)"},{"line_number":1346,"context_line":""},{"line_number":1347,"context_line":"    def update_dvr_port_binding(self, context, id, port):"},{"line_number":1348,"context_line":"        attrs \u003d port[attributes.PORT]"},{"line_number":1349,"context_line":""},{"line_number":1350,"context_line":"        host \u003d attrs and attrs.get(portbindings.HOST_ID)"}],"source_content_type":"text/x-python","patch_set":7,"id":"dab17558_07e5bd07","line":1347,"range":{"start_line":1347,"start_character":8,"end_line":1347,"end_character":31},"in_reply_to":"dab17558_3b50e2d3","updated":"2016-05-17 09:30:54.000000000","message":"Done","commit_id":"c76e8b733ea855ccc63a528d44f58e4b26b92a5b"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"df201fc11503d16153a90365ae5759d5935aa77a","unresolved":false,"context_lines":[{"line_number":1469,"context_line":"        self.notifier.port_delete(context, port[\u0027id\u0027])"},{"line_number":1470,"context_line":"        self.notify_security_groups_member_updated(context, port)"},{"line_number":1471,"context_line":""},{"line_number":1472,"context_line":"    def get_bound_port_context(self, plugin_context, port_id, host\u003dNone,"},{"line_number":1473,"context_line":"                               cached_networks\u003dNone):"},{"line_number":1474,"context_line":"        session \u003d plugin_context.session"},{"line_number":1475,"context_line":"        with session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":7,"id":"dab17558_7b642ab8","line":1472,"range":{"start_line":1472,"start_character":8,"end_line":1472,"end_character":30},"updated":"2016-05-11 09:42:41.000000000","message":"ditto","commit_id":"c76e8b733ea855ccc63a528d44f58e4b26b92a5b"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"9db6f1863f9b83d18fbd210c5033428ca312768c","unresolved":false,"context_lines":[{"line_number":1469,"context_line":"        self.notifier.port_delete(context, port[\u0027id\u0027])"},{"line_number":1470,"context_line":"        self.notify_security_groups_member_updated(context, port)"},{"line_number":1471,"context_line":""},{"line_number":1472,"context_line":"    def get_bound_port_context(self, plugin_context, port_id, host\u003dNone,"},{"line_number":1473,"context_line":"                               cached_networks\u003dNone):"},{"line_number":1474,"context_line":"        session \u003d plugin_context.session"},{"line_number":1475,"context_line":"        with session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":7,"id":"dab17558_67192922","line":1472,"range":{"start_line":1472,"start_character":8,"end_line":1472,"end_character":30},"in_reply_to":"dab17558_7b642ab8","updated":"2016-05-17 09:30:54.000000000","message":"Done","commit_id":"c76e8b733ea855ccc63a528d44f58e4b26b92a5b"}],"neutron/tests/unit/plugins/ml2/test_plugin.py":[{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"df201fc11503d16153a90365ae5759d5935aa77a","unresolved":false,"context_lines":[{"line_number":1228,"context_line":"            }"},{"line_number":1229,"context_line":"            exc \u003d db_exc.DBReferenceError(\u0027\u0027, \u0027\u0027, \u0027\u0027, \u0027\u0027)"},{"line_number":1230,"context_line":"            with mock.patch.object(ml2_db, \u0027ensure_dvr_port_binding\u0027,"},{"line_number":1231,"context_line":"                                   side_effect\u003dexc):"},{"line_number":1232,"context_line":"                res \u003d plugin.update_dvr_port_binding("},{"line_number":1233,"context_line":"                    self.context, port[\u0027id\u0027], {\u0027port\u0027: port})"},{"line_number":1234,"context_line":"        self.assertIsNone(res)"}],"source_content_type":"text/x-python","patch_set":7,"id":"dab17558_384468b5","line":1231,"updated":"2016-05-11 09:42:41.000000000","message":"this change makes underlying sqlalchemy/db state different.\ni haven\u0027t investigated if it\u0027s good enough for this particular test though.","commit_id":"c76e8b733ea855ccc63a528d44f58e4b26b92a5b"}]}
