)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"feda293155c7f4d846ab0f1b898a15027cb9514e","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add instance hard delete"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When rebuilding an instance that is mapped to cell0 we can end up in a"},{"line_number":10,"context_line":"situation where the same instance is active and running in the cell"},{"line_number":11,"context_line":"that is selected while scheduling and deleted in cell0."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"The solution to this problem would be to hard delete the instance from"},{"line_number":14,"context_line":"cell0 before starting the actual rebuilding procedure."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"ffd0ebdf_cbb786d8","line":11,"range":{"start_line":9,"start_character":0,"end_line":11,"end_character":55},"updated":"2019-01-04 20:56:21.000000000","message":"I don\u0027t understand this. Is this talking about something that can happen if we *don\u0027t* make this change to hard delete the instance from cell0 when rebuilding from cell0? I think that\u0027s what you\u0027re saying, it\u0027s just worded sort of confusing. Maybe re-word like, \"To avoid a situation where an instance is both in cell0 and rebuilt *out of* cell0, we need to first hard delete the instance in cell0.\".","commit_id":"a46b0a8f2dd280ac803bfeb08701cf286b059440"},{"author":{"_account_id":27057,"name":"Theodoros Tsioutsias","email":"theodoros.tsioutsias@cern.ch","username":"ttsiouts"},"change_message_id":"3386e142818e2a13c956ba121829f97611974e5f","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add instance hard delete"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When rebuilding an instance that is mapped to cell0 we can end up in a"},{"line_number":10,"context_line":"situation where the same instance is active and running in the cell"},{"line_number":11,"context_line":"that is selected while scheduling and deleted in cell0."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"The solution to this problem would be to hard delete the instance from"},{"line_number":14,"context_line":"cell0 before starting the actual rebuilding procedure."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"bfdaf3ff_fe83edca","line":11,"range":{"start_line":9,"start_character":0,"end_line":11,"end_character":55},"in_reply_to":"ffd0ebdf_cbb786d8","updated":"2019-01-23 11:52:45.000000000","message":"Done","commit_id":"a46b0a8f2dd280ac803bfeb08701cf286b059440"}],"nova/db/api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"feda293155c7f4d846ab0f1b898a15027cb9514e","unresolved":false,"context_lines":[{"line_number":753,"context_line":"    return IMPL.instance_destroy(context, instance_uuid, constraint)"},{"line_number":754,"context_line":""},{"line_number":755,"context_line":""},{"line_number":756,"context_line":"def instance_destroy_hard(context, instance_uuid, constraint\u003dNone):"},{"line_number":757,"context_line":"    \"\"\"Hard destroy the instance or raise if it does not exist.\"\"\""},{"line_number":758,"context_line":"    return IMPL.instance_destroy_hard(context, instance_uuid, constraint)"},{"line_number":759,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ffd0ebdf_ebbccabc","line":756,"updated":"2019-01-04 20:56:21.000000000","message":"Why isn\u0027t instance_destroy() sufficient?","commit_id":"a46b0a8f2dd280ac803bfeb08701cf286b059440"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"39935e1b6667153f6d0a40f052c45fc4f69d7a00","unresolved":false,"context_lines":[{"line_number":749,"context_line":""},{"line_number":750,"context_line":""},{"line_number":751,"context_line":"def instance_destroy(context, instance_uuid, constraint\u003dNone,"},{"line_number":752,"context_line":"                     hard_delete\u003dFalse):"},{"line_number":753,"context_line":"    \"\"\"Destroy the instance or raise if it does not exist.\"\"\""},{"line_number":754,"context_line":"    return IMPL.instance_destroy(context, instance_uuid,"},{"line_number":755,"context_line":"                                 constraint\u003dconstraint,"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_875fbee3","line":752,"updated":"2019-04-08 14:52:08.000000000","message":"nit: documenting this param in the docstring could be nice, but don\u0027t rev the patch just for this - maybe just if you need to rebase for some reason.","commit_id":"e046ca56cf4e729a2a48fa2e1d82f22c1d9b88a6"},{"author":{"_account_id":27057,"name":"Theodoros Tsioutsias","email":"theodoros.tsioutsias@cern.ch","username":"ttsiouts"},"change_message_id":"93dfc307f61124efd6e9ada4bd21f419bf72948f","unresolved":false,"context_lines":[{"line_number":749,"context_line":""},{"line_number":750,"context_line":""},{"line_number":751,"context_line":"def instance_destroy(context, instance_uuid, constraint\u003dNone,"},{"line_number":752,"context_line":"                     hard_delete\u003dFalse):"},{"line_number":753,"context_line":"    \"\"\"Destroy the instance or raise if it does not exist.\"\"\""},{"line_number":754,"context_line":"    return IMPL.instance_destroy(context, instance_uuid,"},{"line_number":755,"context_line":"                                 constraint\u003dconstraint,"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_7927ceb7","line":752,"in_reply_to":"5fc1f717_875fbee3","updated":"2019-04-09 12:54:09.000000000","message":"Done","commit_id":"e046ca56cf4e729a2a48fa2e1d82f22c1d9b88a6"}],"nova/db/sqlalchemy/api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"feda293155c7f4d846ab0f1b898a15027cb9514e","unresolved":false,"context_lines":[{"line_number":1821,"context_line":"    model_query(context, models.Migration).\\"},{"line_number":1822,"context_line":"            filter_by(instance_uuid\u003dinstance_uuid).\\"},{"line_number":1823,"context_line":"            soft_delete()"},{"line_number":1824,"context_line":"    model_query(context, models.InstanceIdMapping).filter_by("},{"line_number":1825,"context_line":"        uuid\u003dinstance_uuid).soft_delete()"},{"line_number":1826,"context_line":"    # NOTE(snikitin): We can\u0027t use model_query here, because there is no"},{"line_number":1827,"context_line":"    # column \u0027deleted\u0027 in \u0027tags\u0027 or \u0027console_auth_tokens\u0027 tables."}],"source_content_type":"text/x-python","patch_set":2,"id":"ffd0ebdf_cbdc661a","line":1824,"range":{"start_line":1824,"start_character":32,"end_line":1824,"end_character":49},"updated":"2019-01-04 20:56:21.000000000","message":"Why isn\u0027t this below as well? I\u0027m guessing because you missed it during a rebase?\n\nBut this is my main issue with this change - there is a lot of duplication here and I\u0027m not sure we really need it. What is the problem if the instance is (soft) deleted in cell0? Why must it be hard deleted? I realize it needs to be deleted so it\u0027s not listed out of multiple cells, but I don\u0027t see why we have to hard delete it. Archiving/purging cell0 will clean it up from cell0.\n\nIf we do need the hard delete, I would rather have one method that handles all of the deletes and is conditional based on the soft/hard nature of the delete if possible.","commit_id":"a46b0a8f2dd280ac803bfeb08701cf286b059440"},{"author":{"_account_id":27057,"name":"Theodoros Tsioutsias","email":"theodoros.tsioutsias@cern.ch","username":"ttsiouts"},"change_message_id":"3386e142818e2a13c956ba121829f97611974e5f","unresolved":false,"context_lines":[{"line_number":1821,"context_line":"    model_query(context, models.Migration).\\"},{"line_number":1822,"context_line":"            filter_by(instance_uuid\u003dinstance_uuid).\\"},{"line_number":1823,"context_line":"            soft_delete()"},{"line_number":1824,"context_line":"    model_query(context, models.InstanceIdMapping).filter_by("},{"line_number":1825,"context_line":"        uuid\u003dinstance_uuid).soft_delete()"},{"line_number":1826,"context_line":"    # NOTE(snikitin): We can\u0027t use model_query here, because there is no"},{"line_number":1827,"context_line":"    # column \u0027deleted\u0027 in \u0027tags\u0027 or \u0027console_auth_tokens\u0027 tables."}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_7b172f53","line":1824,"range":{"start_line":1824,"start_character":32,"end_line":1824,"end_character":49},"in_reply_to":"ffd0ebdf_cbdc661a","updated":"2019-01-23 11:52:45.000000000","message":"Yes you are right.","commit_id":"a46b0a8f2dd280ac803bfeb08701cf286b059440"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"feda293155c7f4d846ab0f1b898a15027cb9514e","unresolved":false,"context_lines":[{"line_number":1851,"context_line":"                    filter_by(uuid\u003dinstance_uuid)"},{"line_number":1852,"context_line":"    if constraint is not None:"},{"line_number":1853,"context_line":"        query \u003d constraint.apply(models.Instance, query)"},{"line_number":1854,"context_line":"    count \u003d query.soft_delete()"},{"line_number":1855,"context_line":"    if count \u003d\u003d 0:"},{"line_number":1856,"context_line":"        raise exception.ConstraintNotMet()"},{"line_number":1857,"context_line":"    instance_actions \u003d context.session.query(models.InstanceAction).\\"}],"source_content_type":"text/x-python","patch_set":2,"id":"ffd0ebdf_4bcb9652","line":1854,"range":{"start_line":1854,"start_character":18,"end_line":1854,"end_character":29},"updated":"2019-01-04 20:56:21.000000000","message":"Is this right?","commit_id":"a46b0a8f2dd280ac803bfeb08701cf286b059440"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"39935e1b6667153f6d0a40f052c45fc4f69d7a00","unresolved":false,"context_lines":[{"line_number":1795,"context_line":"                    filter_by(uuid\u003dinstance_uuid)"},{"line_number":1796,"context_line":"    if constraint is not None:"},{"line_number":1797,"context_line":"        query \u003d constraint.apply(models.Instance, query)"},{"line_number":1798,"context_line":"    # Either in hard or soft delete, we soft delete the instance first"},{"line_number":1799,"context_line":"    # to make sure that that the constraints were met."},{"line_number":1800,"context_line":"    count \u003d query.soft_delete()"},{"line_number":1801,"context_line":"    if count \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_07cf4e7f","line":1798,"range":{"start_line":1798,"start_character":37,"end_line":1798,"end_character":70},"updated":"2019-04-08 14:52:08.000000000","message":"In the case of hard-delete, where do you actually hard-delete the instance record? I don\u0027t see that happening.","commit_id":"e046ca56cf4e729a2a48fa2e1d82f22c1d9b88a6"},{"author":{"_account_id":27057,"name":"Theodoros Tsioutsias","email":"theodoros.tsioutsias@cern.ch","username":"ttsiouts"},"change_message_id":"93dfc307f61124efd6e9ada4bd21f419bf72948f","unresolved":false,"context_lines":[{"line_number":1795,"context_line":"                    filter_by(uuid\u003dinstance_uuid)"},{"line_number":1796,"context_line":"    if constraint is not None:"},{"line_number":1797,"context_line":"        query \u003d constraint.apply(models.Instance, query)"},{"line_number":1798,"context_line":"    # Either in hard or soft delete, we soft delete the instance first"},{"line_number":1799,"context_line":"    # to make sure that that the constraints were met."},{"line_number":1800,"context_line":"    count \u003d query.soft_delete()"},{"line_number":1801,"context_line":"    if count \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_ea40c7a4","line":1798,"range":{"start_line":1798,"start_character":37,"end_line":1798,"end_character":70},"in_reply_to":"5fc1f717_07cf4e7f","updated":"2019-04-09 12:54:09.000000000","message":"L1836. Just to make sure that it gets deleted last.","commit_id":"e046ca56cf4e729a2a48fa2e1d82f22c1d9b88a6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5928978d319dad2f45919050915c19b7c7e90b43","unresolved":false,"context_lines":[{"line_number":1795,"context_line":"                    filter_by(uuid\u003dinstance_uuid)"},{"line_number":1796,"context_line":"    if constraint is not None:"},{"line_number":1797,"context_line":"        query \u003d constraint.apply(models.Instance, query)"},{"line_number":1798,"context_line":"    # Either in hard or soft delete, we soft delete the instance first"},{"line_number":1799,"context_line":"    # to make sure that that the constraints were met."},{"line_number":1800,"context_line":"    count \u003d query.soft_delete()"},{"line_number":1801,"context_line":"    if count \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_622609ce","line":1798,"range":{"start_line":1798,"start_character":37,"end_line":1798,"end_character":70},"in_reply_to":"5fc1f717_ea40c7a4","updated":"2019-04-10 14:31:05.000000000","message":"\u003e L1836. Just to make sure that it gets deleted last.\n\nHeh I figured as much that I must be blind.","commit_id":"e046ca56cf4e729a2a48fa2e1d82f22c1d9b88a6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"62010cf8117206c717c2ba31d70288596209a24b","unresolved":false,"context_lines":[{"line_number":1801,"context_line":"    if count \u003d\u003d 0:"},{"line_number":1802,"context_line":"        raise exception.ConstraintNotMet()"},{"line_number":1803,"context_line":""},{"line_number":1804,"context_line":"    models_to_delete \u003d ["},{"line_number":1805,"context_line":"        models.SecurityGroupInstanceAssociation, models.InstanceInfoCache,"},{"line_number":1806,"context_line":"        models.InstanceMetadata, models.InstanceFault, models.InstanceExtra,"},{"line_number":1807,"context_line":"        models.InstanceSystemMetadata, models.BlockDeviceMapping,"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_eddbfc79","line":1804,"updated":"2019-04-08 18:41:48.000000000","message":"VirtualInterface should also be in this list - I hit it in my cross-cell resize testing with this which makes sure to have a VIF created. That likely also means we\u0027re orphaning those today when deleting an instance, so I\u0027ll open a separate bug for that.","commit_id":"e046ca56cf4e729a2a48fa2e1d82f22c1d9b88a6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"49a3f7ceaa5276d56b9a08a53b1b9320017c8c40","unresolved":false,"context_lines":[{"line_number":1801,"context_line":"    if count \u003d\u003d 0:"},{"line_number":1802,"context_line":"        raise exception.ConstraintNotMet()"},{"line_number":1803,"context_line":""},{"line_number":1804,"context_line":"    models_to_delete \u003d ["},{"line_number":1805,"context_line":"        models.SecurityGroupInstanceAssociation, models.InstanceInfoCache,"},{"line_number":1806,"context_line":"        models.InstanceMetadata, models.InstanceFault, models.InstanceExtra,"},{"line_number":1807,"context_line":"        models.InstanceSystemMetadata, models.BlockDeviceMapping,"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_3e092c83","line":1804,"in_reply_to":"5fc1f717_0df68890","updated":"2019-04-08 21:34:34.000000000","message":"You could rebase on this https://review.openstack.org/#/c/650995/.","commit_id":"e046ca56cf4e729a2a48fa2e1d82f22c1d9b88a6"},{"author":{"_account_id":27057,"name":"Theodoros Tsioutsias","email":"theodoros.tsioutsias@cern.ch","username":"ttsiouts"},"change_message_id":"93dfc307f61124efd6e9ada4bd21f419bf72948f","unresolved":false,"context_lines":[{"line_number":1801,"context_line":"    if count \u003d\u003d 0:"},{"line_number":1802,"context_line":"        raise exception.ConstraintNotMet()"},{"line_number":1803,"context_line":""},{"line_number":1804,"context_line":"    models_to_delete \u003d ["},{"line_number":1805,"context_line":"        models.SecurityGroupInstanceAssociation, models.InstanceInfoCache,"},{"line_number":1806,"context_line":"        models.InstanceMetadata, models.InstanceFault, models.InstanceExtra,"},{"line_number":1807,"context_line":"        models.InstanceSystemMetadata, models.BlockDeviceMapping,"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_5be3dc05","line":1804,"in_reply_to":"5fc1f717_3e092c83","updated":"2019-04-09 12:54:09.000000000","message":"Done","commit_id":"e046ca56cf4e729a2a48fa2e1d82f22c1d9b88a6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"95923068ccca614a89065ea611f27eac5e98e726","unresolved":false,"context_lines":[{"line_number":1801,"context_line":"    if count \u003d\u003d 0:"},{"line_number":1802,"context_line":"        raise exception.ConstraintNotMet()"},{"line_number":1803,"context_line":""},{"line_number":1804,"context_line":"    models_to_delete \u003d ["},{"line_number":1805,"context_line":"        models.SecurityGroupInstanceAssociation, models.InstanceInfoCache,"},{"line_number":1806,"context_line":"        models.InstanceMetadata, models.InstanceFault, models.InstanceExtra,"},{"line_number":1807,"context_line":"        models.InstanceSystemMetadata, models.BlockDeviceMapping,"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_0df68890","line":1804,"in_reply_to":"5fc1f717_adebb4da","updated":"2019-04-08 19:02:51.000000000","message":"Bug 1823781.","commit_id":"e046ca56cf4e729a2a48fa2e1d82f22c1d9b88a6"},{"author":{"_account_id":27057,"name":"Theodoros Tsioutsias","email":"theodoros.tsioutsias@cern.ch","username":"ttsiouts"},"change_message_id":"93dfc307f61124efd6e9ada4bd21f419bf72948f","unresolved":false,"context_lines":[{"line_number":1801,"context_line":"    if count \u003d\u003d 0:"},{"line_number":1802,"context_line":"        raise exception.ConstraintNotMet()"},{"line_number":1803,"context_line":""},{"line_number":1804,"context_line":"    models_to_delete \u003d ["},{"line_number":1805,"context_line":"        models.SecurityGroupInstanceAssociation, models.InstanceInfoCache,"},{"line_number":1806,"context_line":"        models.InstanceMetadata, models.InstanceFault, models.InstanceExtra,"},{"line_number":1807,"context_line":"        models.InstanceSystemMetadata, models.BlockDeviceMapping,"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_dbd7cc22","line":1804,"in_reply_to":"5fc1f717_adebb4da","updated":"2019-04-09 12:54:09.000000000","message":"Oh nice catch!!","commit_id":"e046ca56cf4e729a2a48fa2e1d82f22c1d9b88a6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c423356b1f4521f2006a052a7daf6ea5d3cd0fbc","unresolved":false,"context_lines":[{"line_number":1801,"context_line":"    if count \u003d\u003d 0:"},{"line_number":1802,"context_line":"        raise exception.ConstraintNotMet()"},{"line_number":1803,"context_line":""},{"line_number":1804,"context_line":"    models_to_delete \u003d ["},{"line_number":1805,"context_line":"        models.SecurityGroupInstanceAssociation, models.InstanceInfoCache,"},{"line_number":1806,"context_line":"        models.InstanceMetadata, models.InstanceFault, models.InstanceExtra,"},{"line_number":1807,"context_line":"        models.InstanceSystemMetadata, models.BlockDeviceMapping,"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_adebb4da","line":1804,"in_reply_to":"5fc1f717_eddbfc79","updated":"2019-04-08 18:49:10.000000000","message":"I guess this wasn\u0027t hit before because both normal and \"local\" delete (in the API) will call self.network_api.deallocate_for_instance which will call db.virtual_interface_delete_by_instance so it\u0027s an explicit delete rather than let the DB API handle it, but we should still handle VirtualInterface here.","commit_id":"e046ca56cf4e729a2a48fa2e1d82f22c1d9b88a6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"39935e1b6667153f6d0a40f052c45fc4f69d7a00","unresolved":false,"context_lines":[{"line_number":1808,"context_line":"        models.Migration, models.InstanceIdMapping"},{"line_number":1809,"context_line":"    ]"},{"line_number":1810,"context_line":""},{"line_number":1811,"context_line":"    filtered_by_uuid \u003d [models.InstanceIdMapping]"},{"line_number":1812,"context_line":""},{"line_number":1813,"context_line":"    for model in models_to_delete:"},{"line_number":1814,"context_line":"        key \u003d \u0027instance_uuid\u0027 if model not in filtered_by_uuid else \u0027uuid\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_07f8aec1","line":1811,"updated":"2019-04-08 14:52:08.000000000","message":"nit: a comment here could be nice, e.g. for most referenced models we filter by the instance_uuid column, but for these models we filter by the uuid column.","commit_id":"e046ca56cf4e729a2a48fa2e1d82f22c1d9b88a6"},{"author":{"_account_id":27057,"name":"Theodoros Tsioutsias","email":"theodoros.tsioutsias@cern.ch","username":"ttsiouts"},"change_message_id":"93dfc307f61124efd6e9ada4bd21f419bf72948f","unresolved":false,"context_lines":[{"line_number":1808,"context_line":"        models.Migration, models.InstanceIdMapping"},{"line_number":1809,"context_line":"    ]"},{"line_number":1810,"context_line":""},{"line_number":1811,"context_line":"    filtered_by_uuid \u003d [models.InstanceIdMapping]"},{"line_number":1812,"context_line":""},{"line_number":1813,"context_line":"    for model in models_to_delete:"},{"line_number":1814,"context_line":"        key \u003d \u0027instance_uuid\u0027 if model not in filtered_by_uuid else \u0027uuid\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_d94cc240","line":1811,"in_reply_to":"5fc1f717_07f8aec1","updated":"2019-04-09 12:54:09.000000000","message":"Done","commit_id":"e046ca56cf4e729a2a48fa2e1d82f22c1d9b88a6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"39935e1b6667153f6d0a40f052c45fc4f69d7a00","unresolved":false,"context_lines":[{"line_number":1814,"context_line":"        key \u003d \u0027instance_uuid\u0027 if model not in filtered_by_uuid else \u0027uuid\u0027"},{"line_number":1815,"context_line":"        filter_ \u003d {key: instance_uuid}"},{"line_number":1816,"context_line":"        if hard_delete:"},{"line_number":1817,"context_line":"            context.session.query(model).filter_by(**filter_).delete()"},{"line_number":1818,"context_line":"        else:"},{"line_number":1819,"context_line":"            model_query(context, model).filter_by(**filter_).soft_delete()"},{"line_number":1820,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_e7132200","line":1817,"range":{"start_line":1817,"start_character":12,"end_line":1817,"end_character":33},"updated":"2019-04-08 14:52:08.000000000","message":"At first I was wondering why you weren\u0027t using model_query here but I see it\u0027s for the same reason given on L1821 below.","commit_id":"e046ca56cf4e729a2a48fa2e1d82f22c1d9b88a6"},{"author":{"_account_id":27057,"name":"Theodoros Tsioutsias","email":"theodoros.tsioutsias@cern.ch","username":"ttsiouts"},"change_message_id":"93dfc307f61124efd6e9ada4bd21f419bf72948f","unresolved":false,"context_lines":[{"line_number":1814,"context_line":"        key \u003d \u0027instance_uuid\u0027 if model not in filtered_by_uuid else \u0027uuid\u0027"},{"line_number":1815,"context_line":"        filter_ \u003d {key: instance_uuid}"},{"line_number":1816,"context_line":"        if hard_delete:"},{"line_number":1817,"context_line":"            context.session.query(model).filter_by(**filter_).delete()"},{"line_number":1818,"context_line":"        else:"},{"line_number":1819,"context_line":"            model_query(context, model).filter_by(**filter_).soft_delete()"},{"line_number":1820,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_ca1cebc3","line":1817,"range":{"start_line":1817,"start_character":12,"end_line":1817,"end_character":33},"in_reply_to":"5fc1f717_e7132200","updated":"2019-04-09 12:54:09.000000000","message":"Hmm, I think we can use it here","commit_id":"e046ca56cf4e729a2a48fa2e1d82f22c1d9b88a6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"20affd182cff277ad07f2676e2d28593afd69bb2","unresolved":false,"context_lines":[{"line_number":1818,"context_line":"    # _archive_deleted_rows_for_table()."},{"line_number":1819,"context_line":"    if hard_delete:"},{"line_number":1820,"context_line":"        # NOTE(ttsiousts): In case of hard delete, we need to remove the"},{"line_number":1821,"context_line":"        # instance actions too since instance_uuid is a foreign key"},{"line_number":1822,"context_line":"        context.session.query(models.InstanceAction).filter_by("},{"line_number":1823,"context_line":"            instance_uuid\u003dinstance_uuid).delete()"},{"line_number":1824,"context_line":"        # NOTE(ttsiouts): The instance is the last thing to be deleted in"}],"source_content_type":"text/x-python","patch_set":6,"id":"5fc1f717_e521a39f","line":1821,"updated":"2019-04-10 14:43:22.000000000","message":"What about instance_actions_events? Are we missing a test case? We don\u0027t have cascading deletes in the schema so I don\u0027t think deleting the instance actions will also automatically delete the events.","commit_id":"e4dba7c1e2f0fa544103b3a6ff7addf197c4f113"},{"author":{"_account_id":27057,"name":"Theodoros Tsioutsias","email":"theodoros.tsioutsias@cern.ch","username":"ttsiouts"},"change_message_id":"c81354b814daa37f37ce2f475df6609c8bd21824","unresolved":false,"context_lines":[{"line_number":1818,"context_line":"    # _archive_deleted_rows_for_table()."},{"line_number":1819,"context_line":"    if hard_delete:"},{"line_number":1820,"context_line":"        # NOTE(ttsiousts): In case of hard delete, we need to remove the"},{"line_number":1821,"context_line":"        # instance actions too since instance_uuid is a foreign key"},{"line_number":1822,"context_line":"        context.session.query(models.InstanceAction).filter_by("},{"line_number":1823,"context_line":"            instance_uuid\u003dinstance_uuid).delete()"},{"line_number":1824,"context_line":"        # NOTE(ttsiouts): The instance is the last thing to be deleted in"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fce034c_2a6c1635","line":1821,"in_reply_to":"5fc1f717_e521a39f","updated":"2019-04-12 08:24:19.000000000","message":"Oh yes. missed that I\u0027m adding a case","commit_id":"e4dba7c1e2f0fa544103b3a6ff7addf197c4f113"},{"author":{"_account_id":27057,"name":"Theodoros Tsioutsias","email":"theodoros.tsioutsias@cern.ch","username":"ttsiouts"},"change_message_id":"34e97d101629f71bf03db2ba3d8216f11f48b004","unresolved":false,"context_lines":[{"line_number":1791,"context_line":"        models.InstanceMetadata, models.InstanceFault, models.InstanceExtra,"},{"line_number":1792,"context_line":"        models.InstanceSystemMetadata, models.BlockDeviceMapping,"},{"line_number":1793,"context_line":"        models.Migration, models.VirtualInterface"},{"line_number":1794,"context_line":"    ]"},{"line_number":1795,"context_line":""},{"line_number":1796,"context_line":"    # For most referenced models we filter by the instance_uuid column, but for"},{"line_number":1797,"context_line":"    # these models we filter by the uuid column."}],"source_content_type":"text/x-python","patch_set":7,"id":"3fce034c_372b1395","line":1794,"updated":"2019-04-12 15:57:04.000000000","message":"FixedIp and Console have the instances.uuid as a foreign key. Should we handle that also?","commit_id":"5eb61d8de7a87ae77a76f395abd56ed08f55ab3e"},{"author":{"_account_id":27057,"name":"Theodoros Tsioutsias","email":"theodoros.tsioutsias@cern.ch","username":"ttsiouts"},"change_message_id":"655f620412438359d956ac07d66d94cfd28db665","unresolved":false,"context_lines":[{"line_number":1791,"context_line":"        models.InstanceMetadata, models.InstanceFault, models.InstanceExtra,"},{"line_number":1792,"context_line":"        models.InstanceSystemMetadata, models.BlockDeviceMapping,"},{"line_number":1793,"context_line":"        models.Migration, models.VirtualInterface"},{"line_number":1794,"context_line":"    ]"},{"line_number":1795,"context_line":""},{"line_number":1796,"context_line":"    # For most referenced models we filter by the instance_uuid column, but for"},{"line_number":1797,"context_line":"    # these models we filter by the uuid column."}],"source_content_type":"text/x-python","patch_set":7,"id":"3fce034c_689f475f","line":1794,"in_reply_to":"3fce034c_02aa21d1","updated":"2019-04-16 15:24:29.000000000","message":"\u003e I don\u0027t see anywhere that automatically cleans those up when an\n \u003e instance is deleted, so those might be a problem (and likely have\n \u003e always been leaked), which would be weird though because that\n \u003e os-consoles API requires a server ID so if you deleted the server\n \u003e and then tried to access the console you\u0027d likely get a 404 but the\n \u003e console db record might not have been cleaned up.\n\nYeah I checked the same and I couldn\u0027t find where they get cleaned up but indeed as you said, I\u0027m getting a 404 since the instance is deleted.\n\n \u003e Seems like a bug, but I\u0027m not sure we need to hold this up for it -\n \u003e if someone that uses xen and the nova-console service cares they\n \u003e could investigate and clean it up.\n \n \u003e As for FixedIp, like I said it\u0027s nova-network which has been\n \u003e deprecated for a long time and will hopefully be removed soon, and\n \u003e I think you guys (CERN) should mostly not have to worry about it in\n \u003e this case? But I\u0027m not sure - you\u0027re not fully migrated to neutron\n \u003e yet are you?\n\nWe are not fully migrated to Neutron yet.\n\nIn the case of rebuilding from cell0 it\u0027s ok to not delete (or maybe clean up) the FixedIp records, since network will not have been allocated to an instance in cell0.\n\nI was thinking about the resize use case but I guess this is not supported for going out of a nova-network cell.","commit_id":"5eb61d8de7a87ae77a76f395abd56ed08f55ab3e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"47bf7a098bf52ad6da67b47a17b6e0e17b665a0f","unresolved":false,"context_lines":[{"line_number":1791,"context_line":"        models.InstanceMetadata, models.InstanceFault, models.InstanceExtra,"},{"line_number":1792,"context_line":"        models.InstanceSystemMetadata, models.BlockDeviceMapping,"},{"line_number":1793,"context_line":"        models.Migration, models.VirtualInterface"},{"line_number":1794,"context_line":"    ]"},{"line_number":1795,"context_line":""},{"line_number":1796,"context_line":"    # For most referenced models we filter by the instance_uuid column, but for"},{"line_number":1797,"context_line":"    # these models we filter by the uuid column."}],"source_content_type":"text/x-python","patch_set":7,"id":"3fce034c_02aa21d1","line":1794,"in_reply_to":"3fce034c_372b1395","updated":"2019-04-16 14:08:34.000000000","message":"Hmm, FixedIp would only be set for nova-network deployments and I\u0027m guessing that those are cleaned up during deallocate_for_instance in the network API before the instance is destroyed in the DB which is maybe why they\u0027ve never been a problem for soft delete.\n\nAs for consoles records, those are created by the nova-console service which is xenapi specific and created through the os-consoles API:\n\nhttps://developer.openstack.org/api-ref/compute/#server-consoles-servers-os-consoles-os-console-auth-tokens\n\nI don\u0027t see anywhere that automatically cleans those up when an instance is deleted, so those might be a problem (and likely have always been leaked), which would be weird though because that os-consoles API requires a server ID so if you deleted the server and then tried to access the console you\u0027d likely get a 404 but the console db record might not have been cleaned up.\n\nSeems like a bug, but I\u0027m not sure we need to hold this up for it - if someone that uses xen and the nova-console service cares they could investigate and clean it up.\n\nAs for FixedIp, like I said it\u0027s nova-network which has been deprecated for a long time and will hopefully be removed soon, and I think you guys (CERN) should mostly not have to worry about it in this case? But I\u0027m not sure - you\u0027re not fully migrated to neutron yet are you?","commit_id":"5eb61d8de7a87ae77a76f395abd56ed08f55ab3e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"20cc4b91761a00013318fe1f9320540fa437be69","unresolved":false,"context_lines":[{"line_number":1801,"context_line":"        key \u003d \u0027instance_uuid\u0027 if model not in filtered_by_uuid else \u0027uuid\u0027"},{"line_number":1802,"context_line":"        filter_ \u003d {key: instance_uuid}"},{"line_number":1803,"context_line":"        if hard_delete:"},{"line_number":1804,"context_line":"            model_query(context, model).filter_by(**filter_).delete()"},{"line_number":1805,"context_line":"        else:"},{"line_number":1806,"context_line":"            model_query(context, model).filter_by(**filter_).soft_delete()"},{"line_number":1807,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"bfb3d3c7_e42a4f2a","line":1804,"range":{"start_line":1804,"start_character":12,"end_line":1804,"end_character":69},"updated":"2019-05-24 20:42:11.000000000","message":"I think we have a bug here where the hard delete of the instance below can fail if there are related soft-deleted records (like detached volumes [bdms]), because I hit this in a gate run of the cross-cell resize stuff:\n\nhttp://paste.openstack.org/show/752057/\n\n\u0027Cannot delete or update a parent row: a foreign key constraint fails (`nova_cell2`.`block_device_mapping`, CONSTRAINT `block_device_mapping_instance_uuid_fkey` FOREIGN KEY (`instance_uuid`) REFERENCES `instances` (`uuid`))\u0027) [SQL: \u0027DELETE FROM instances WHERE instances.uuid \u003d %(uuid_1)s\u0027] [parameters: {\u0027uuid_1\u0027: \u00274b8a12c4-e28a-49cc-a681-236c1e8a174c\u0027}]\n\nThe only way I can figure that is happening is if (1) there is a race somehow or (2) we didn\u0027t delete all of the related soft-deleted BDMs. This should be pretty easy to recreate in a test though, and I have a TODO about testing that in my cross-cell resize code:\n\nhttps://review.opendev.org/#/c/638046/24/nova/conductor/tasks/cross_cell_migrate.py@1169","commit_id":"9760b5b7dc689c60802209db2c8d14efc565f495"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"13cdd192cfdffa84f0342ba08cf67251adbeceaa","unresolved":false,"context_lines":[{"line_number":1825,"context_line":"        for action in actions:"},{"line_number":1826,"context_line":"            context.session.query(models.InstanceActionEvent).filter_by("},{"line_number":1827,"context_line":"                action_id\u003daction.id).delete()"},{"line_number":1828,"context_line":"        context.session.query(models.InstanceAction).filter_by("},{"line_number":1829,"context_line":"            instance_uuid\u003dinstance_uuid).delete()"},{"line_number":1830,"context_line":"        # NOTE(ttsiouts): The instance is the last thing to be deleted in"},{"line_number":1831,"context_line":"        # order to respect all constraints"},{"line_number":1832,"context_line":"        context.session.query(models.Instance).filter_by("}],"source_content_type":"text/x-python","patch_set":8,"id":"3fce034c_62d3e539","line":1829,"range":{"start_line":1828,"start_character":8,"end_line":1829,"end_character":49},"updated":"2019-04-16 14:22:48.000000000","message":"Do you need this still? Couldn\u0027t you just add \"action.delete()\" in the for loop above after the events are deleted?","commit_id":"9760b5b7dc689c60802209db2c8d14efc565f495"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ef9e2aecf500d6fddc8010b5fc59f8da45503fe8","unresolved":false,"context_lines":[{"line_number":1825,"context_line":"        for action in actions:"},{"line_number":1826,"context_line":"            context.session.query(models.InstanceActionEvent).filter_by("},{"line_number":1827,"context_line":"                action_id\u003daction.id).delete()"},{"line_number":1828,"context_line":"        context.session.query(models.InstanceAction).filter_by("},{"line_number":1829,"context_line":"            instance_uuid\u003dinstance_uuid).delete()"},{"line_number":1830,"context_line":"        # NOTE(ttsiouts): The instance is the last thing to be deleted in"},{"line_number":1831,"context_line":"        # order to respect all constraints"},{"line_number":1832,"context_line":"        context.session.query(models.Instance).filter_by("}],"source_content_type":"text/x-python","patch_set":8,"id":"3fce034c_a2922df5","line":1829,"range":{"start_line":1828,"start_character":8,"end_line":1829,"end_character":49},"in_reply_to":"3fce034c_62d3e539","updated":"2019-04-16 14:40:07.000000000","message":"Nevermind:\n\nCaptured traceback:\n~~~~~~~~~~~~~~~~~~~\n    b\u0027Traceback (most recent call last):\u0027\n    b\u0027  File \"/home/osboxes/git/nova/.tox/py36/lib/python3.6/site-packages/mock/mock.py\", line 1305, in patched\u0027\n    b\u0027    return func(*args, **keywargs)\u0027\n    b\u0027  File \"/home/osboxes/git/nova/nova/tests/unit/db/test_db_api.py\", line 3065, in test_instance_destroy_hard\u0027\n    b\u0027    db.instance_destroy(ctxt, uuid, hard_delete\u003dTrue)\u0027\n    b\u0027  File \"/home/osboxes/git/nova/nova/db/api.py\", line 763, in instance_destroy\u0027\n    b\u0027    hard_delete\u003dhard_delete)\u0027\n    b\u0027  File \"/home/osboxes/git/nova/nova/db/sqlalchemy/api.py\", line 170, in wrapper\u0027\n    b\u0027    return f(*args, **kwargs)\u0027\n    b\u0027  File \"/home/osboxes/git/nova/.tox/py36/lib/python3.6/site-packages/oslo_db/api.py\", line 154, in wrapper\u0027\n    b\u0027    ectxt.value \u003d e.inner_exc\u0027\n    b\u0027  File \"/home/osboxes/git/nova/.tox/py36/lib/python3.6/site-packages/oslo_utils/excutils.py\", line 220, in __exit__\u0027\n    b\u0027    self.force_reraise()\u0027\n    b\u0027  File \"/home/osboxes/git/nova/.tox/py36/lib/python3.6/site-packages/oslo_utils/excutils.py\", line 196, in force_reraise\u0027\n    b\u0027    six.reraise(self.type_, self.value, self.tb)\u0027\n    b\u0027  File \"/home/osboxes/git/nova/.tox/py36/lib/python3.6/site-packages/six.py\", line 693, in reraise\u0027\n    b\u0027    raise value\u0027\n    b\u0027  File \"/home/osboxes/git/nova/.tox/py36/lib/python3.6/site-packages/oslo_db/api.py\", line 142, in wrapper\u0027\n    b\u0027    return f(*args, **kwargs)\u0027\n    b\u0027  File \"/home/osboxes/git/nova/nova/db/sqlalchemy/api.py\", line 213, in wrapped\u0027\n    b\u0027    return f(context, *args, **kwargs)\u0027\n    b\u0027  File \"/home/osboxes/git/nova/nova/db/sqlalchemy/api.py\", line 1828, in instance_destroy\u0027\n    b\u0027    action.delete()\u0027\n    b\"AttributeError: \u0027InstanceAction\u0027 object has no attribute \u0027delete\u0027\"\n    b\u0027\u0027","commit_id":"9760b5b7dc689c60802209db2c8d14efc565f495"},{"author":{"_account_id":27057,"name":"Theodoros Tsioutsias","email":"theodoros.tsioutsias@cern.ch","username":"ttsiouts"},"change_message_id":"655f620412438359d956ac07d66d94cfd28db665","unresolved":false,"context_lines":[{"line_number":1825,"context_line":"        for action in actions:"},{"line_number":1826,"context_line":"            context.session.query(models.InstanceActionEvent).filter_by("},{"line_number":1827,"context_line":"                action_id\u003daction.id).delete()"},{"line_number":1828,"context_line":"        context.session.query(models.InstanceAction).filter_by("},{"line_number":1829,"context_line":"            instance_uuid\u003dinstance_uuid).delete()"},{"line_number":1830,"context_line":"        # NOTE(ttsiouts): The instance is the last thing to be deleted in"},{"line_number":1831,"context_line":"        # order to respect all constraints"},{"line_number":1832,"context_line":"        context.session.query(models.Instance).filter_by("}],"source_content_type":"text/x-python","patch_set":8,"id":"3fce034c_0b0d5d36","line":1829,"range":{"start_line":1828,"start_character":8,"end_line":1829,"end_character":49},"in_reply_to":"3fce034c_a2922df5","updated":"2019-04-16 15:24:29.000000000","message":":) It\u0027s also less queries doing it once for all of the InstanceActions.","commit_id":"9760b5b7dc689c60802209db2c8d14efc565f495"}],"nova/objects/instance.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"feda293155c7f4d846ab0f1b898a15027cb9514e","unresolved":false,"context_lines":[{"line_number":640,"context_line":""},{"line_number":641,"context_line":"    @base.remotable"},{"line_number":642,"context_line":"    def destroy_hard(self):"},{"line_number":643,"context_line":"        # NOTE(ttsiouts): Could be done with a hard_delete param in destroy"},{"line_number":644,"context_line":"        if not self.obj_attr_is_set(\u0027id\u0027):"},{"line_number":645,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027destroy_hard\u0027,"},{"line_number":646,"context_line":"                                              reason\u003d\u0027already destroyed\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ffd0ebdf_cb2a26e6","line":643,"updated":"2019-01-04 20:56:21.000000000","message":"Sure could, and that would be my preference - I really don\u0027t like the duplication (and arguably I don\u0027t think we need the hard delete anyway).","commit_id":"a46b0a8f2dd280ac803bfeb08701cf286b059440"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"feda293155c7f4d846ab0f1b898a15027cb9514e","unresolved":false,"context_lines":[{"line_number":652,"context_line":"        else:"},{"line_number":653,"context_line":"            constraint \u003d None"},{"line_number":654,"context_line":""},{"line_number":655,"context_line":"        cell_type \u003d cells_opts.get_cell_type()"},{"line_number":656,"context_line":"        if cell_type is not None:"},{"line_number":657,"context_line":"            stale_instance \u003d self.obj_clone()"},{"line_number":658,"context_line":""},{"line_number":659,"context_line":"        try:"},{"line_number":660,"context_line":"            db_inst \u003d db.instance_destroy_hard(self._context, self.uuid,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ffd0ebdf_0bf34ea0","line":657,"range":{"start_line":655,"start_character":8,"end_line":657,"end_character":45},"updated":"2019-01-04 20:56:21.000000000","message":"This is all cells v1 stuff which we don\u0027t need for this.","commit_id":"a46b0a8f2dd280ac803bfeb08701cf286b059440"}],"nova/tests/unit/db/test_db_api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"20affd182cff277ad07f2676e2d28593afd69bb2","unresolved":false,"context_lines":[{"line_number":2972,"context_line":"        self.assertRaises(exception.InstanceNotFound,"},{"line_number":2973,"context_line":"                          db.instance_destroy, ctxt, instance[\u0027uuid\u0027])"},{"line_number":2974,"context_line":""},{"line_number":2975,"context_line":"    def test_instance_destroy_hard(self):"},{"line_number":2976,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":2977,"context_line":"        instance \u003d self.create_instance_with_args()"},{"line_number":2978,"context_line":"        db.instance_destroy(ctxt, instance[\u0027uuid\u0027], hard_delete\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5fc1f717_a51ddb0f","line":2975,"range":{"start_line":2975,"start_character":8,"end_line":2975,"end_character":34},"updated":"2019-04-10 14:43:22.000000000","message":"This test would be better if we had more of the related table records created before deleting the instance to make sure we don\u0027t blow up on referential constraints, i.e. the instance action events gap I noted.","commit_id":"e4dba7c1e2f0fa544103b3a6ff7addf197c4f113"},{"author":{"_account_id":27057,"name":"Theodoros Tsioutsias","email":"theodoros.tsioutsias@cern.ch","username":"ttsiouts"},"change_message_id":"c81354b814daa37f37ce2f475df6609c8bd21824","unresolved":false,"context_lines":[{"line_number":2972,"context_line":"        self.assertRaises(exception.InstanceNotFound,"},{"line_number":2973,"context_line":"                          db.instance_destroy, ctxt, instance[\u0027uuid\u0027])"},{"line_number":2974,"context_line":""},{"line_number":2975,"context_line":"    def test_instance_destroy_hard(self):"},{"line_number":2976,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":2977,"context_line":"        instance \u003d self.create_instance_with_args()"},{"line_number":2978,"context_line":"        db.instance_destroy(ctxt, instance[\u0027uuid\u0027], hard_delete\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5fc1f717_5b51782f","line":2975,"range":{"start_line":2975,"start_character":8,"end_line":2975,"end_character":34},"in_reply_to":"5fc1f717_a51ddb0f","updated":"2019-04-12 08:24:19.000000000","message":"Sure. Updating the patch","commit_id":"e4dba7c1e2f0fa544103b3a6ff7addf197c4f113"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c042651c804de0c1fb5ffe660c3cfdae4f748188","unresolved":false,"context_lines":[{"line_number":3078,"context_line":"            self.assertEqual(0, len(instance_faults[uuid]))"},{"line_number":3079,"context_line":"            inst_bdms \u003d db.block_device_mapping_get_all_by_instance(ctxt, uuid)"},{"line_number":3080,"context_line":"            self.assertEqual(0, len(inst_bdms))"},{"line_number":3081,"context_line":"            filters \u003d {\"isntance_uuid\": uuid}"},{"line_number":3082,"context_line":"            inst_migrations \u003d db.migration_get_all_by_filters(ctxt, filters)"},{"line_number":3083,"context_line":"            self.assertEqual(0, len(inst_migrations))"},{"line_number":3084,"context_line":"            vifs \u003d db.virtual_interface_get_by_instance(ctxt, uuid)"}],"source_content_type":"text/x-python","patch_set":8,"id":"bfb3d3c7_240dc7a0","line":3081,"range":{"start_line":3081,"start_character":24,"end_line":3081,"end_character":37},"updated":"2019-05-24 20:58:35.000000000","message":"oops","commit_id":"9760b5b7dc689c60802209db2c8d14efc565f495"}],"nova/tests/unit/objects/test_instance.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"39935e1b6667153f6d0a40f052c45fc4f69d7a00","unresolved":false,"context_lines":[{"line_number":1287,"context_line":"                  \u0027project_id\u0027: self.context.project_id}"},{"line_number":1288,"context_line":"        db_inst \u003d db.instance_create(self.context, values)"},{"line_number":1289,"context_line":"        inst \u003d objects.Instance(context\u003dself.context, id\u003ddb_inst[\u0027id\u0027],"},{"line_number":1290,"context_line":"                                 uuid\u003ddb_inst[\u0027uuid\u0027])"},{"line_number":1291,"context_line":"        inst.destroy(hard_delete\u003dTrue)"},{"line_number":1292,"context_line":"        elevated \u003d self.context.elevated(read_deleted\u003d\"yes\")"},{"line_number":1293,"context_line":"        self.assertRaises(exception.InstanceNotFound,"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_07942e43","line":1290,"range":{"start_line":1290,"start_character":32,"end_line":1290,"end_character":33},"updated":"2019-04-08 14:52:08.000000000","message":"nit: alignment","commit_id":"e046ca56cf4e729a2a48fa2e1d82f22c1d9b88a6"},{"author":{"_account_id":27057,"name":"Theodoros Tsioutsias","email":"theodoros.tsioutsias@cern.ch","username":"ttsiouts"},"change_message_id":"93dfc307f61124efd6e9ada4bd21f419bf72948f","unresolved":false,"context_lines":[{"line_number":1287,"context_line":"                  \u0027project_id\u0027: self.context.project_id}"},{"line_number":1288,"context_line":"        db_inst \u003d db.instance_create(self.context, values)"},{"line_number":1289,"context_line":"        inst \u003d objects.Instance(context\u003dself.context, id\u003ddb_inst[\u0027id\u0027],"},{"line_number":1290,"context_line":"                                 uuid\u003ddb_inst[\u0027uuid\u0027])"},{"line_number":1291,"context_line":"        inst.destroy(hard_delete\u003dTrue)"},{"line_number":1292,"context_line":"        elevated \u003d self.context.elevated(read_deleted\u003d\"yes\")"},{"line_number":1293,"context_line":"        self.assertRaises(exception.InstanceNotFound,"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_ca714b0f","line":1290,"range":{"start_line":1290,"start_character":32,"end_line":1290,"end_character":33},"in_reply_to":"5fc1f717_07942e43","updated":"2019-04-09 12:54:09.000000000","message":"Done","commit_id":"e046ca56cf4e729a2a48fa2e1d82f22c1d9b88a6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"39935e1b6667153f6d0a40f052c45fc4f69d7a00","unresolved":false,"context_lines":[{"line_number":1291,"context_line":"        inst.destroy(hard_delete\u003dTrue)"},{"line_number":1292,"context_line":"        elevated \u003d self.context.elevated(read_deleted\u003d\"yes\")"},{"line_number":1293,"context_line":"        self.assertRaises(exception.InstanceNotFound,"},{"line_number":1294,"context_line":"                          db.instance_get_by_uuid, elevated,"},{"line_number":1295,"context_line":"                          db_inst[\u0027uuid\u0027])"},{"line_number":1296,"context_line":""},{"line_number":1297,"context_line":"    def test_destroy_hard_host_constraint(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_a7e19ad2","line":1294,"range":{"start_line":1294,"start_character":26,"end_line":1294,"end_character":49},"updated":"2019-04-08 14:52:08.000000000","message":"This seems kind of weird to call directly in the objects test, I\u0027d have expected something like this instead:\n\nself.assertRaises(exception.InstanceNotFound,\n                  objects.Instance.get_by_uuid, ...)\n\nIn other words, calling db.instance_get_by_uuid directly is something I\u0027d expect to see in the nova.tests.unit.db.test_db_api tests.","commit_id":"e046ca56cf4e729a2a48fa2e1d82f22c1d9b88a6"},{"author":{"_account_id":27057,"name":"Theodoros Tsioutsias","email":"theodoros.tsioutsias@cern.ch","username":"ttsiouts"},"change_message_id":"93dfc307f61124efd6e9ada4bd21f419bf72948f","unresolved":false,"context_lines":[{"line_number":1291,"context_line":"        inst.destroy(hard_delete\u003dTrue)"},{"line_number":1292,"context_line":"        elevated \u003d self.context.elevated(read_deleted\u003d\"yes\")"},{"line_number":1293,"context_line":"        self.assertRaises(exception.InstanceNotFound,"},{"line_number":1294,"context_line":"                          db.instance_get_by_uuid, elevated,"},{"line_number":1295,"context_line":"                          db_inst[\u0027uuid\u0027])"},{"line_number":1296,"context_line":""},{"line_number":1297,"context_line":"    def test_destroy_hard_host_constraint(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_4a41db62","line":1294,"range":{"start_line":1294,"start_character":26,"end_line":1294,"end_character":49},"in_reply_to":"5fc1f717_a7e19ad2","updated":"2019-04-09 12:54:09.000000000","message":"Done","commit_id":"e046ca56cf4e729a2a48fa2e1d82f22c1d9b88a6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"39935e1b6667153f6d0a40f052c45fc4f69d7a00","unresolved":false,"context_lines":[{"line_number":1301,"context_line":"        db_inst \u003d db.instance_create(self.context, values)"},{"line_number":1302,"context_line":"        inst \u003d objects.Instance.get_by_uuid(self.context, db_inst[\u0027uuid\u0027])"},{"line_number":1303,"context_line":"        inst.host \u003d None"},{"line_number":1304,"context_line":"        self.assertRaises(exception.ObjectActionError,"},{"line_number":1305,"context_line":"                          inst.destroy, hard_delete\u003dTrue)"},{"line_number":1306,"context_line":""},{"line_number":1307,"context_line":"    def test_name_does_not_trigger_lazy_loads(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_47947636","line":1304,"updated":"2019-04-08 14:52:08.000000000","message":"This test would be more clear if you assert the actual error you expect from this, e.g.:\n\nex \u003d self.assertRaises(exception.ObjectActionError, ...)\nself.assertIn(\u0027host changed\u0027, six.text_type(ex))","commit_id":"e046ca56cf4e729a2a48fa2e1d82f22c1d9b88a6"},{"author":{"_account_id":27057,"name":"Theodoros Tsioutsias","email":"theodoros.tsioutsias@cern.ch","username":"ttsiouts"},"change_message_id":"93dfc307f61124efd6e9ada4bd21f419bf72948f","unresolved":false,"context_lines":[{"line_number":1301,"context_line":"        db_inst \u003d db.instance_create(self.context, values)"},{"line_number":1302,"context_line":"        inst \u003d objects.Instance.get_by_uuid(self.context, db_inst[\u0027uuid\u0027])"},{"line_number":1303,"context_line":"        inst.host \u003d None"},{"line_number":1304,"context_line":"        self.assertRaises(exception.ObjectActionError,"},{"line_number":1305,"context_line":"                          inst.destroy, hard_delete\u003dTrue)"},{"line_number":1306,"context_line":""},{"line_number":1307,"context_line":"    def test_name_does_not_trigger_lazy_loads(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_fb1648f2","line":1304,"in_reply_to":"5fc1f717_47947636","updated":"2019-04-09 12:54:09.000000000","message":"Done","commit_id":"e046ca56cf4e729a2a48fa2e1d82f22c1d9b88a6"}],"nova/tests/unit/objects/test_objects.py":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"8385e5b1975071d17926fa91b263b0aee57f5d51","unresolved":false,"context_lines":[{"line_number":1094,"context_line":"    \u0027IDEDeviceBus\u0027: \u00271.0-29d4c9f27ac44197f01b6ac1b7e16502\u0027,"},{"line_number":1095,"context_line":"    \u0027ImageMeta\u0027: \u00271.8-642d1b2eb3e880a367f37d72dd76162d\u0027,"},{"line_number":1096,"context_line":"    \u0027ImageMetaProps\u0027: \u00271.20-ffd686cde289814695d5f89522aa5aef\u0027,"},{"line_number":1097,"context_line":"    \u0027Instance\u0027: \u00272.4-d9449c964c9854db8e08e5483eb616d4\u0027,"},{"line_number":1098,"context_line":"    \u0027InstanceAction\u0027: \u00271.1-f9f293e526b66fca0d05c3b3a2d13914\u0027,"},{"line_number":1099,"context_line":"    \u0027InstanceActionEvent\u0027: \u00271.2-b2f368b8a29d8d872b1f6ea841e820a0\u0027,"},{"line_number":1100,"context_line":"    \u0027InstanceActionEventList\u0027: \u00271.1-13d92fb953030cdbfee56481756e02be\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_64436140","line":1097,"range":{"start_line":1097,"start_character":17,"end_line":1097,"end_character":20},"updated":"2018-05-31 13:53:05.000000000","message":"The version must be bumped when a remotable method is added.","commit_id":"9e183b946fe8ed52bf6db3c9109ba5c5def699df"}]}
