)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fe6d96ecfced997946ca89e240b11bb6e40055b7","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This adds a uuid column to the block_device_mapping table,"},{"line_number":10,"context_line":"and makes it semi-optional for graceful upgrade of existing rows"},{"line_number":11,"context_line":"without a uuid. It also provides us a way to do a targeted updates"},{"line_number":12,"context_line":"and queries of BDM rows by uuid."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: Ibf0db6ad5b8367fc3267ac309516c08547d47e8c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"fa80f949_1e04ee15","line":11,"updated":"2015-11-06 19:38:28.000000000","message":"s/a targeted/targeted/","commit_id":"bd65c41a44601e98b6235a9aaf5f7d4fc63303b5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fe6d96ecfced997946ca89e240b11bb6e40055b7","unresolved":false,"context_lines":[{"line_number":10,"context_line":"and makes it semi-optional for graceful upgrade of existing rows"},{"line_number":11,"context_line":"without a uuid. It also provides us a way to do a targeted updates"},{"line_number":12,"context_line":"and queries of BDM rows by uuid."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: Ibf0db6ad5b8367fc3267ac309516c08547d47e8c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"fa80f949_be14c24c","line":13,"updated":"2015-11-06 19:38:28.000000000","message":"Partial-Bug: #1489581","commit_id":"bd65c41a44601e98b6235a9aaf5f7d4fc63303b5"}],"nova/block_device.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f728e72b6aada67b8c75c672d31dd20c6c263254","unresolved":false,"context_lines":[{"line_number":290,"context_line":""},{"line_number":291,"context_line":"def snapshot_from_bdm(snapshot_id, template):"},{"line_number":292,"context_line":"    \"\"\"Create a basic volume snapshot BDM from a given template bdm.\"\"\""},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"    copy_from_template \u003d (\u0027disk_bus\u0027, \u0027device_type\u0027, \u0027boot_index\u0027,"},{"line_number":295,"context_line":"                          \u0027delete_on_termination\u0027, \u0027volume_size\u0027,"},{"line_number":296,"context_line":"                          \u0027device_name\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"da85f559_b7476276","line":293,"updated":"2015-11-09 22:50:11.000000000","message":"I think this needs \u0027uuid\u0027 in it else we don\u0027t persist that in the image mapping metadata when creating volume-backed snapshots:\n\nhttp://logs.openstack.org/98/242698/6/check/gate-tempest-dsvm-cells/cae4a43/console.html#_2015-11-09_21_49_21_425","commit_id":"bc02ddf9a4b298cac14134777801339a2a083433"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3d8a18eb9ce8da6efe52378f6caa8ef1043fae8a","unresolved":false,"context_lines":[{"line_number":290,"context_line":""},{"line_number":291,"context_line":"def snapshot_from_bdm(snapshot_id, template):"},{"line_number":292,"context_line":"    \"\"\"Create a basic volume snapshot BDM from a given template bdm.\"\"\""},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"    copy_from_template \u003d (\u0027disk_bus\u0027, \u0027device_type\u0027, \u0027boot_index\u0027,"},{"line_number":295,"context_line":"                          \u0027delete_on_termination\u0027, \u0027volume_size\u0027,"},{"line_number":296,"context_line":"                          \u0027device_name\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"da85f559_570dd63c","line":293,"in_reply_to":"da85f559_b7476276","updated":"2015-11-09 22:51:03.000000000","message":"Maybe not, I need to see why we\u0027re getting duplicate BDMs in that list.","commit_id":"bc02ddf9a4b298cac14134777801339a2a083433"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"5ec4841d9c87e713b35a77d3d10d99a4d35fcc9b","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                              \u0027image_id\u0027, \u0027connection_info\u0027])"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"bdm_new_api_only_fields \u003d set([\u0027uuid\u0027])"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"bdm_new_api_fields \u003d ((bdm_new_fields - bdm_new_non_api_fields) |"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a1ff146_124aed83","line":62,"range":{"start_line":62,"start_character":32,"end_line":62,"end_character":36},"updated":"2017-03-15 11:58:13.000000000","message":"So this is part of the api and refers variously to an image_id, volume_id, or snapshot_id. A DB field also called uuid doesn\u0027t conflict with this, but it\u0027s pretty confusing. I wonder if we should call the new uuid something else. bdm_uuid would be technically redundant, but imho clearer in the context of the api object of the same name from which the db record is created.","commit_id":"c5a90a6bc03bde2bc1c45dfebecaca5b477021ab"}],"nova/db/api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"58adc2b61dbf99d8650c83aa0a6bd12d7c346c36","unresolved":false,"context_lines":[{"line_number":1238,"context_line":"        context, instance_uuid, volume_id)"},{"line_number":1239,"context_line":""},{"line_number":1240,"context_line":""},{"line_number":1241,"context_line":"def block_device_mapping_destroy_by_instance_and_uuid(context, instance_uuid,"},{"line_number":1242,"context_line":"                                                      uuid):"},{"line_number":1243,"context_line":"    \"\"\"Destroy the block device mapping.\"\"\""},{"line_number":1244,"context_line":"    return IMPL.block_device_mapping_destroy_by_instance_and_uuid("}],"source_content_type":"text/x-python","patch_set":1,"id":"fa80f949_d99be064","line":1241,"updated":"2015-11-06 19:51:01.000000000","message":"I wouldn\u0027t think we\u0027d need an instance_uuid to delete a bdm if we have the uuid, since the uuid is, well, a uuid.","commit_id":"bd65c41a44601e98b6235a9aaf5f7d4fc63303b5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"2fe1dae3256cb5209399870282cfaac5a518ab7a","unresolved":false,"context_lines":[{"line_number":1238,"context_line":"        context, instance_uuid, volume_id)"},{"line_number":1239,"context_line":""},{"line_number":1240,"context_line":""},{"line_number":1241,"context_line":"def block_device_mapping_destroy_by_instance_and_uuid(context, instance_uuid,"},{"line_number":1242,"context_line":"                                                      uuid):"},{"line_number":1243,"context_line":"    \"\"\"Destroy the block device mapping.\"\"\""},{"line_number":1244,"context_line":"    return IMPL.block_device_mapping_destroy_by_instance_and_uuid("}],"source_content_type":"text/x-python","patch_set":1,"id":"fa80f949_9976b8d5","line":1241,"in_reply_to":"fa80f949_d99be064","updated":"2015-11-06 19:56:03.000000000","message":"I left this in here merely to eliminate any issues with the fact that we don\u0027t have a unique constraint on uuid. In the cells parent, you could have the same uuid on two different instances, but not on the same one I think. So, I left it as further scoping to be extra safe.\n\nThat said, I can surely remove it.","commit_id":"bd65c41a44601e98b6235a9aaf5f7d4fc63303b5"}],"nova/db/sqlalchemy/api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"58adc2b61dbf99d8650c83aa0a6bd12d7c346c36","unresolved":false,"context_lines":[{"line_number":3956,"context_line":"            result \u003d query.filter_by(instance_uuid\u003dvalues[\u0027instance_uuid\u0027],"},{"line_number":3957,"context_line":"                                     uuid\u003dvalues[\u0027uuid\u0027]).first()"},{"line_number":3958,"context_line":"            if not result:"},{"line_number":3959,"context_line":"                raise exception.NotFound("},{"line_number":3960,"context_line":"                    \u0027Block device mapping %s not found\u0027 % values[\u0027uuid\u0027])"},{"line_number":3961,"context_line":"        elif values[\u0027device_name\u0027]:"},{"line_number":3962,"context_line":"            query \u003d _block_device_mapping_get_query(context, session\u003dsession)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa80f949_79e994e5","line":3959,"updated":"2015-11-06 19:51:01.000000000","message":"This is update or create, so I don\u0027t think you can raise a NotFound here.  I don\u0027t think we\u0027re assuming that block_device_mapping_create was already called are we because of the wonky bdm._create() object code.\n\nUnless I guess we just want to force that callers of this method with the intent to create aren\u0027t passing in a uuid, but then they should be using block_device_mapping_create.","commit_id":"bd65c41a44601e98b6235a9aaf5f7d4fc63303b5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"2fe1dae3256cb5209399870282cfaac5a518ab7a","unresolved":false,"context_lines":[{"line_number":3956,"context_line":"            result \u003d query.filter_by(instance_uuid\u003dvalues[\u0027instance_uuid\u0027],"},{"line_number":3957,"context_line":"                                     uuid\u003dvalues[\u0027uuid\u0027]).first()"},{"line_number":3958,"context_line":"            if not result:"},{"line_number":3959,"context_line":"                raise exception.NotFound("},{"line_number":3960,"context_line":"                    \u0027Block device mapping %s not found\u0027 % values[\u0027uuid\u0027])"},{"line_number":3961,"context_line":"        elif values[\u0027device_name\u0027]:"},{"line_number":3962,"context_line":"            query \u003d _block_device_mapping_get_query(context, session\u003dsession)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa80f949_f4002903","line":3959,"in_reply_to":"fa80f949_79e994e5","updated":"2015-11-06 19:56:03.000000000","message":"Right, which we can now use in the cells parent I think. My thinking here was that this shouldn\u0027t be allowed to continue to create the ambiguous situation anymore if you provided a uuid. That means we\u0027d need to either create with the uuid, or update with the uuid.","commit_id":"bd65c41a44601e98b6235a9aaf5f7d4fc63303b5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"58adc2b61dbf99d8650c83aa0a6bd12d7c346c36","unresolved":false,"context_lines":[{"line_number":3967,"context_line":"            result.update(values)"},{"line_number":3968,"context_line":"        else:"},{"line_number":3969,"context_line":"            # Either the device_name doesn\u0027t exist in the database yet, or no"},{"line_number":3970,"context_line":"            # device_name was provided. Both cases mean creating a new BDM."},{"line_number":3971,"context_line":"            values[\u0027uuid\u0027] \u003d str(uuid.uuid4())"},{"line_number":3972,"context_line":"            result \u003d models.BlockDeviceMapping(**values)"},{"line_number":3973,"context_line":"            result.save(session\u003dsession)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa80f949_59ecd0f2","line":3970,"updated":"2015-11-06 19:51:01.000000000","message":"device_name or uuid","commit_id":"bd65c41a44601e98b6235a9aaf5f7d4fc63303b5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"58adc2b61dbf99d8650c83aa0a6bd12d7c346c36","unresolved":false,"context_lines":[{"line_number":3968,"context_line":"        else:"},{"line_number":3969,"context_line":"            # Either the device_name doesn\u0027t exist in the database yet, or no"},{"line_number":3970,"context_line":"            # device_name was provided. Both cases mean creating a new BDM."},{"line_number":3971,"context_line":"            values[\u0027uuid\u0027] \u003d str(uuid.uuid4())"},{"line_number":3972,"context_line":"            result \u003d models.BlockDeviceMapping(**values)"},{"line_number":3973,"context_line":"            result.save(session\u003dsession)"},{"line_number":3974,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa80f949_d9ad209c","line":3971,"updated":"2015-11-06 19:51:01.000000000","message":"If we remove the NotFound, this becomes:\n\nvalues[\u0027uuid\u0027] \u003d values.get(\u0027uuid\u0027) or str(uuid.uuid4())","commit_id":"bd65c41a44601e98b6235a9aaf5f7d4fc63303b5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"58adc2b61dbf99d8650c83aa0a6bd12d7c346c36","unresolved":false,"context_lines":[{"line_number":4036,"context_line":""},{"line_number":4037,"context_line":""},{"line_number":4038,"context_line":"@require_context"},{"line_number":4039,"context_line":"def block_device_mapping_destroy_by_instance_and_uuid(context, instance_uuid,"},{"line_number":4040,"context_line":"                                                      uuid):"},{"line_number":4041,"context_line":"    _block_device_mapping_get_query(context).\\"},{"line_number":4042,"context_line":"            filter_by(instance_uuid\u003dinstance_uuid).\\"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa80f949_39746c34","line":4039,"updated":"2015-11-06 19:51:01.000000000","message":"I wouldn\u0027t think we\u0027d need an instance_uuid to delete a bdm if we have the uuid, since the uuid is, well, a uuid.","commit_id":"bd65c41a44601e98b6235a9aaf5f7d4fc63303b5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f39c3d433f27aeed2a54193a7b7f2faa8efa3a1f","unresolved":false,"context_lines":[{"line_number":3948,"context_line":"        result \u003d None"},{"line_number":3949,"context_line":"        # NOTE(xqueralt): Only update a BDM when device_name or uuid"},{"line_number":3950,"context_line":"        # was provided. Prefer the uuid, if available, but fall back"},{"line_number":3951,"context_line":"        # to device_name if there is no match, which can happen for"},{"line_number":3952,"context_line":"        # BDMs created before we had a uuid. We allow empty device"},{"line_number":3953,"context_line":"        # names so they will be set later by the manager."},{"line_number":3954,"context_line":"        if \u0027uuid\u0027 in values:"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_71095831","line":3951,"updated":"2015-11-06 21:13:46.000000000","message":"nit: \"if there is no match\" is not really accurate, more like \"if uuid is not provided when updating\", something like that.","commit_id":"c2adaa0a0b3ffb0480e05132cfd6c1507a914d70"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f39c3d433f27aeed2a54193a7b7f2faa8efa3a1f","unresolved":false,"context_lines":[{"line_number":3955,"context_line":"            query \u003d _block_device_mapping_get_query(context, session\u003dsession)"},{"line_number":3956,"context_line":"            result \u003d query.filter_by(instance_uuid\u003dvalues[\u0027instance_uuid\u0027],"},{"line_number":3957,"context_line":"                                     uuid\u003dvalues[\u0027uuid\u0027]).first()"},{"line_number":3958,"context_line":"            if not result:"},{"line_number":3959,"context_line":"                raise exception.NotFound("},{"line_number":3960,"context_line":"                    \u0027Block device mapping %s not found\u0027 % values[\u0027uuid\u0027])"},{"line_number":3961,"context_line":"        elif values[\u0027device_name\u0027]:"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_d4fef204","line":3958,"updated":"2015-11-06 21:13:46.000000000","message":"Per previous discussion, maybe we want to add a comment here that we assume if you\u0027re calling this method with a uuid you\u0027re expecting an update, and we actually plan on eventually removing this method in favor of the explicit create/update methods.","commit_id":"c2adaa0a0b3ffb0480e05132cfd6c1507a914d70"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cfa9c2e0c0f1eb433ab5d758e5930d366a7a9723","unresolved":false,"context_lines":[{"line_number":3915,"context_line":"    values \u003d _from_legacy_values(values, legacy)"},{"line_number":3916,"context_line":"    convert_objects_related_datetimes(values)"},{"line_number":3917,"context_line":""},{"line_number":3918,"context_line":"    if \u0027uuid\u0027 not in values:"},{"line_number":3919,"context_line":"        values[\u0027uuid\u0027] \u003d str(uuid.uuid4())"},{"line_number":3920,"context_line":""},{"line_number":3921,"context_line":"    bdm_ref \u003d models.BlockDeviceMapping()"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_1449dad0","line":3918,"updated":"2015-11-06 21:32:38.000000000","message":"Actually should this be like instance_create?\n\n    if not values.get(\u0027uuid\u0027):\n        values[\u0027uuid\u0027] \u003d str(uuid.uuid4())\n\nSince uuid is nullable in the model, we could have values[\u0027uuid\u0027] \u003d None.","commit_id":"eeb6adb0f6803d6429da025ffc8f45d56289d060"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d6a146bbb4b36296af2cb8155cf58e2b4143606e","unresolved":false,"context_lines":[{"line_number":3962,"context_line":"                # specifically. We hope to remove this method soon to"},{"line_number":3963,"context_line":"                # remove the ambiguity."},{"line_number":3964,"context_line":"                raise exception.NotFound("},{"line_number":3965,"context_line":"                    \u0027Block device mapping %s not found\u0027 % values[\u0027uuid\u0027])"},{"line_number":3966,"context_line":"        elif values[\u0027device_name\u0027]:"},{"line_number":3967,"context_line":"            query \u003d _block_device_mapping_get_query(context, session\u003dsession)"},{"line_number":3968,"context_line":"            result \u003d query.filter_by(instance_uuid\u003dvalues[\u0027instance_uuid\u0027],"}],"source_content_type":"text/x-python","patch_set":6,"id":"da85f559_c574ecd0","line":3965,"updated":"2015-11-08 07:47:30.000000000","message":"missing translation","commit_id":"5c99bb2c1116958455477da3f46a2760c61b4414"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"9b1f82794abfbfd90000adde1542b4a69195395f","unresolved":false,"context_lines":[{"line_number":4255,"context_line":"                first()"},{"line_number":4256,"context_line":""},{"line_number":4257,"context_line":""},{"line_number":4258,"context_line":"@require_context"},{"line_number":4259,"context_line":"def block_device_mapping_destroy(context, bdm_id):"},{"line_number":4260,"context_line":"    _block_device_mapping_get_query(context).\\"},{"line_number":4261,"context_line":"            filter_by(id\u003dbdm_id).\\"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a629dbe_cf091c86","line":4258,"range":{"start_line":4258,"start_character":0,"end_line":4258,"end_character":16},"updated":"2016-11-10 11:33:57.000000000","message":"urgh, the rebase removed @pick_context_manager_writer for block_device_mapping_destroy, re-spinning now.","commit_id":"2b741efea4f0bf201134c2fa9e0c35f62946b6f1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"486855d7e06af5596279c6184b020ac9d15e1fb9","unresolved":false,"context_lines":[{"line_number":4303,"context_line":""},{"line_number":4304,"context_line":""},{"line_number":4305,"context_line":"@require_context"},{"line_number":4306,"context_line":"@pick_context_manager_writer"},{"line_number":4307,"context_line":"def block_device_mapping_get_by_uuid(context, uuid,"},{"line_number":4308,"context_line":"                                     columns_to_join\u003dNone):"},{"line_number":4309,"context_line":"    return _block_device_mapping_get_query(context,"}],"source_content_type":"text/x-python","patch_set":19,"id":"ba2be162_7fd7014b","line":4306,"range":{"start_line":4306,"start_character":1,"end_line":4306,"end_character":28},"updated":"2017-03-03 01:23:48.000000000","message":"This should be a reader right?","commit_id":"348b474f162afdb12576c90ff218c7aa1aa97c85"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"486855d7e06af5596279c6184b020ac9d15e1fb9","unresolved":false,"context_lines":[{"line_number":4304,"context_line":""},{"line_number":4305,"context_line":"@require_context"},{"line_number":4306,"context_line":"@pick_context_manager_writer"},{"line_number":4307,"context_line":"def block_device_mapping_get_by_uuid(context, uuid,"},{"line_number":4308,"context_line":"                                     columns_to_join\u003dNone):"},{"line_number":4309,"context_line":"    return _block_device_mapping_get_query(context,"},{"line_number":4310,"context_line":"            columns_to_join\u003dcolumns_to_join).\\"}],"source_content_type":"text/x-python","patch_set":19,"id":"ba2be162_3f1669f1","line":4307,"updated":"2017-03-03 01:23:48.000000000","message":"There is no unit test for this method.","commit_id":"348b474f162afdb12576c90ff218c7aa1aa97c85"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"5ec4841d9c87e713b35a77d3d10d99a4d35fcc9b","unresolved":false,"context_lines":[{"line_number":4218,"context_line":"    values \u003d _from_legacy_values(values, legacy, allow_updates\u003dTrue)"},{"line_number":4219,"context_line":"    convert_objects_related_datetimes(values)"},{"line_number":4220,"context_line":""},{"line_number":4221,"context_line":"    if uuidutils.is_uuid_like(bdm_id):"},{"line_number":4222,"context_line":"        query \u003d _block_device_mapping_get_query(context).filter_by(uuid\u003dbdm_id)"},{"line_number":4223,"context_line":"    else:"},{"line_number":4224,"context_line":"        query \u003d _block_device_mapping_get_query(context).filter_by(id\u003dbdm_id)"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a1ff146_e5aaed6f","line":4221,"updated":"2017-03-15 11:58:13.000000000","message":"There\u0027s only one caller, and it always knows whether it\u0027s passing an id or a uuid. Doing a regex match on bdm_id to guess its type here is both nasty and unnecessary. I can think of at least 2 ways to make this unambiguous off the top of my head:\n\n * Pass bdm_id/bdm_uuid as a kwarg instead and check which one we were given.\n * Create block_device_mapping_update_by_uuid, and deprecate this one when it\u0027s no longer required.\n\nThere are probably other ways. We should pick one and do that.","commit_id":"c5a90a6bc03bde2bc1c45dfebecaca5b477021ab"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"d15f9202d6369cf12f356f9b12d2c464449ca656","unresolved":false,"context_lines":[{"line_number":4218,"context_line":"    values \u003d _from_legacy_values(values, legacy, allow_updates\u003dTrue)"},{"line_number":4219,"context_line":"    convert_objects_related_datetimes(values)"},{"line_number":4220,"context_line":""},{"line_number":4221,"context_line":"    if uuidutils.is_uuid_like(bdm_id):"},{"line_number":4222,"context_line":"        query \u003d _block_device_mapping_get_query(context).filter_by(uuid\u003dbdm_id)"},{"line_number":4223,"context_line":"    else:"},{"line_number":4224,"context_line":"        query \u003d _block_device_mapping_get_query(context).filter_by(id\u003dbdm_id)"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a1ff146_8eccf136","line":4221,"in_reply_to":"3a1ff146_e5aaed6f","updated":"2017-03-15 14:22:06.000000000","message":"IMHO we don\u0027t even need to do that for this patchset, the only caller uses id so this isn\u0027t required yet and we can drop this for now. If we want to add the ability to update by uuid we can do that later in another method.","commit_id":"c5a90a6bc03bde2bc1c45dfebecaca5b477021ab"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"5ec4841d9c87e713b35a77d3d10d99a4d35fcc9b","unresolved":false,"context_lines":[{"line_number":4238,"context_line":"    # back to device_name if no uuid is provided, which can happen"},{"line_number":4239,"context_line":"    # for BDMs created before we had a uuid. We allow empty device"},{"line_number":4240,"context_line":"    # names so they will be set later by the manager."},{"line_number":4241,"context_line":"    if \u0027uuid\u0027 in values:"},{"line_number":4242,"context_line":"        query \u003d _block_device_mapping_get_query(context)"},{"line_number":4243,"context_line":"        result \u003d query.filter_by(instance_uuid\u003dvalues[\u0027instance_uuid\u0027],"},{"line_number":4244,"context_line":"                                 uuid\u003dvalues[\u0027uuid\u0027]).first()"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a1ff146_88ca304e","line":4241,"updated":"2017-03-15 11:58:13.000000000","message":"This method can be passed a BDM object as \u0027values\u0027 (via cellsv1). Wouldn\u0027t this test always succeed in that case, even if uuid wasn\u0027t set?","commit_id":"c5a90a6bc03bde2bc1c45dfebecaca5b477021ab"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"5ec4841d9c87e713b35a77d3d10d99a4d35fcc9b","unresolved":false,"context_lines":[{"line_number":4241,"context_line":"    if \u0027uuid\u0027 in values:"},{"line_number":4242,"context_line":"        query \u003d _block_device_mapping_get_query(context)"},{"line_number":4243,"context_line":"        result \u003d query.filter_by(instance_uuid\u003dvalues[\u0027instance_uuid\u0027],"},{"line_number":4244,"context_line":"                                 uuid\u003dvalues[\u0027uuid\u0027]).first()"},{"line_number":4245,"context_line":"    if not result and values[\u0027device_name\u0027]:"},{"line_number":4246,"context_line":"        query \u003d _block_device_mapping_get_query(context)"},{"line_number":4247,"context_line":"        result \u003d query.filter_by(instance_uuid\u003dvalues[\u0027instance_uuid\u0027],"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a1ff146_a837ece1","line":4244,"range":{"start_line":4244,"start_character":54,"end_line":4244,"end_character":59},"updated":"2017-03-15 11:58:13.000000000","message":"nit: one_or_none() is probably better here. It will raise an exception if there\u0027s more than one, which is probably better than doing bizarre things later and at least specifically highlights the corrupt data.","commit_id":"c5a90a6bc03bde2bc1c45dfebecaca5b477021ab"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"5ec4841d9c87e713b35a77d3d10d99a4d35fcc9b","unresolved":false,"context_lines":[{"line_number":4314,"context_line":"    return _block_device_mapping_get_query(context,"},{"line_number":4315,"context_line":"            columns_to_join\u003dcolumns_to_join).\\"},{"line_number":4316,"context_line":"                filter_by(uuid\u003duuid).\\"},{"line_number":4317,"context_line":"                first()"},{"line_number":4318,"context_line":""},{"line_number":4319,"context_line":""},{"line_number":4320,"context_line":"@require_context"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a1ff146_febb5a0c","line":4317,"range":{"start_line":4317,"start_character":16,"end_line":4317,"end_character":21},"updated":"2017-03-15 11:58:13.000000000","message":"nit: one_or_none()","commit_id":"c5a90a6bc03bde2bc1c45dfebecaca5b477021ab"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"d15f9202d6369cf12f356f9b12d2c464449ca656","unresolved":false,"context_lines":[{"line_number":4314,"context_line":"    return _block_device_mapping_get_query(context,"},{"line_number":4315,"context_line":"            columns_to_join\u003dcolumns_to_join).\\"},{"line_number":4316,"context_line":"                filter_by(uuid\u003duuid).\\"},{"line_number":4317,"context_line":"                first()"},{"line_number":4318,"context_line":""},{"line_number":4319,"context_line":""},{"line_number":4320,"context_line":"@require_context"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a1ff146_c320829e","line":4317,"range":{"start_line":4317,"start_character":16,"end_line":4317,"end_character":21},"in_reply_to":"3a1ff146_febb5a0c","updated":"2017-03-15 14:22:06.000000000","message":"Done","commit_id":"c5a90a6bc03bde2bc1c45dfebecaca5b477021ab"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"a471eb15fac178e3642a3fe3a3573fc4b07f348b","unresolved":false,"context_lines":[{"line_number":3749,"context_line":"    values \u003d _from_legacy_values(values, legacy, allow_updates\u003dTrue)"},{"line_number":3750,"context_line":"    convert_objects_related_datetimes(values)"},{"line_number":3751,"context_line":""},{"line_number":3752,"context_line":"    if uuidutils.is_uuid_like(bdm_id):"},{"line_number":3753,"context_line":"        query \u003d _block_device_mapping_get_query(context).filter_by(uuid\u003dbdm_id)"},{"line_number":3754,"context_line":"    else:"},{"line_number":3755,"context_line":"        query \u003d _block_device_mapping_get_query(context).filter_by(id\u003dbdm_id)"},{"line_number":3756,"context_line":"    query.update(values)"}],"source_content_type":"text/x-python","patch_set":23,"id":"df87a7cf_abd7abed","line":3753,"range":{"start_line":3752,"start_character":0,"end_line":3753,"end_character":79},"updated":"2017-12-04 15:13:25.000000000","message":"If we want to pass a uuid, we should do it explicitly. I\u0027ll add block_device_mapping_update_by_uuid().\n\nI haven\u0027t noticed a caller for this yet, though.","commit_id":"52b98f3ee4a3eb417917dac4aa4944208b61d600"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"a471eb15fac178e3642a3fe3a3573fc4b07f348b","unresolved":false,"context_lines":[{"line_number":3845,"context_line":"    return _block_device_mapping_get_query(context,"},{"line_number":3846,"context_line":"            columns_to_join\u003dcolumns_to_join).\\"},{"line_number":3847,"context_line":"                filter_by(uuid\u003duuid).\\"},{"line_number":3848,"context_line":"                first()"},{"line_number":3849,"context_line":""},{"line_number":3850,"context_line":""},{"line_number":3851,"context_line":"@require_context"}],"source_content_type":"text/x-python","patch_set":23,"id":"df87a7cf_ab732b15","line":3848,"range":{"start_line":3848,"start_character":16,"end_line":3848,"end_character":21},"updated":"2017-12-04 15:13:25.000000000","message":"nit: one()","commit_id":"52b98f3ee4a3eb417917dac4aa4944208b61d600"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0ef359cb4e566db39ad0a4ee83338f6e54d98004","unresolved":false,"context_lines":[{"line_number":3733,"context_line":"    values \u003d _from_legacy_values(values, legacy)"},{"line_number":3734,"context_line":"    convert_objects_related_datetimes(values)"},{"line_number":3735,"context_line":""},{"line_number":3736,"context_line":"    if not values.get(\u0027uuid\u0027):"},{"line_number":3737,"context_line":"        values[\u0027uuid\u0027] \u003d uuidutils.generate_uuid()"},{"line_number":3738,"context_line":""},{"line_number":3739,"context_line":"    bdm_ref \u003d models.BlockDeviceMapping()"}],"source_content_type":"text/x-python","patch_set":24,"id":"df87a7cf_c5538138","line":3736,"range":{"start_line":3736,"start_character":23,"end_line":3736,"end_character":27},"updated":"2017-12-08 14:26:16.000000000","message":"Will we have a new DB API method to get a BDM by it\u0027s UUID? Maybe that comes later in the series.","commit_id":"ff938da863251ebdc46bc6765200b4c64cf06524"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"2a01d07f69cd8e6e1b32ad36fed7a6a4d7f2874c","unresolved":false,"context_lines":[{"line_number":3733,"context_line":"    values \u003d _from_legacy_values(values, legacy)"},{"line_number":3734,"context_line":"    convert_objects_related_datetimes(values)"},{"line_number":3735,"context_line":""},{"line_number":3736,"context_line":"    if not values.get(\u0027uuid\u0027):"},{"line_number":3737,"context_line":"        values[\u0027uuid\u0027] \u003d uuidutils.generate_uuid()"},{"line_number":3738,"context_line":""},{"line_number":3739,"context_line":"    bdm_ref \u003d models.BlockDeviceMapping()"}],"source_content_type":"text/x-python","patch_set":24,"id":"df87a7cf_a65dfe79","line":3736,"range":{"start_line":3736,"start_character":23,"end_line":3736,"end_character":27},"in_reply_to":"df87a7cf_c5538138","updated":"2017-12-11 13:45:25.000000000","message":"An earlier version of this patch contained one, but I removed it as there\u0027s no currently planned user: it would be dead code right now. No reason we can\u0027t add one later if it\u0027s required, though.","commit_id":"ff938da863251ebdc46bc6765200b4c64cf06524"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0ef359cb4e566db39ad0a4ee83338f6e54d98004","unresolved":false,"context_lines":[{"line_number":3768,"context_line":"    # names so they will be set later by the manager."},{"line_number":3769,"context_line":"    if \u0027uuid\u0027 in values:"},{"line_number":3770,"context_line":"        query \u003d _block_device_mapping_get_query(context)"},{"line_number":3771,"context_line":"        result \u003d query.filter_by(instance_uuid\u003dvalues[\u0027instance_uuid\u0027],"},{"line_number":3772,"context_line":"                                 uuid\u003dvalues[\u0027uuid\u0027]).one_or_none()"},{"line_number":3773,"context_line":""},{"line_number":3774,"context_line":"    if not result and values[\u0027device_name\u0027]:"}],"source_content_type":"text/x-python","patch_set":24,"id":"df87a7cf_c5a5c148","line":3771,"range":{"start_line":3771,"start_character":47,"end_line":3771,"end_character":70},"updated":"2017-12-08 14:26:16.000000000","message":"How do we know that instance_uuid is in values? I see this is how things worked before too, but...","commit_id":"ff938da863251ebdc46bc6765200b4c64cf06524"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"2a01d07f69cd8e6e1b32ad36fed7a6a4d7f2874c","unresolved":false,"context_lines":[{"line_number":3768,"context_line":"    # names so they will be set later by the manager."},{"line_number":3769,"context_line":"    if \u0027uuid\u0027 in values:"},{"line_number":3770,"context_line":"        query \u003d _block_device_mapping_get_query(context)"},{"line_number":3771,"context_line":"        result \u003d query.filter_by(instance_uuid\u003dvalues[\u0027instance_uuid\u0027],"},{"line_number":3772,"context_line":"                                 uuid\u003dvalues[\u0027uuid\u0027]).one_or_none()"},{"line_number":3773,"context_line":""},{"line_number":3774,"context_line":"    if not result and values[\u0027device_name\u0027]:"}],"source_content_type":"text/x-python","patch_set":24,"id":"df87a7cf_f1c3c2eb","line":3771,"range":{"start_line":3771,"start_character":47,"end_line":3771,"end_character":70},"in_reply_to":"df87a7cf_c5a5c148","updated":"2017-12-11 13:45:25.000000000","message":"We know because:\n\n* It was previously a programming error for it not to be there. The correct thing to do would be to explode here, which this does anyway (if not gracefully).\n\n* It\u0027s part of the model. Any set of values including uuid came from the db, so includes instance_uuid.\n\nAlso it gives the query optimizer two index options instead of one, which is nice for it.\n\nI don\u0027t want to touch this primarily because it\u0027s a can of worms. The main issue here is that this function exists at all: we should remove it. I was going to do this at one point, but punted in favour of keeping the scope down, especially as cells v1 calls it.\n\nI added a TODO comment.","commit_id":"ff938da863251ebdc46bc6765200b4c64cf06524"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0ef359cb4e566db39ad0a4ee83338f6e54d98004","unresolved":false,"context_lines":[{"line_number":3779,"context_line":"    if result:"},{"line_number":3780,"context_line":"        result.update(values)"},{"line_number":3781,"context_line":"    else:"},{"line_number":3782,"context_line":"        # Either the device_name doesn\u0027t exist in the database yet, or no"},{"line_number":3783,"context_line":"        # device_name was provided. Both cases mean creating a new BDM."},{"line_number":3784,"context_line":"        values[\u0027uuid\u0027] \u003d uuidutils.generate_uuid()"},{"line_number":3785,"context_line":"        result \u003d models.BlockDeviceMapping(**values)"},{"line_number":3786,"context_line":"        result.save(context.session)"}],"source_content_type":"text/x-python","patch_set":24,"id":"df87a7cf_e577a5d3","line":3783,"range":{"start_line":3782,"start_character":8,"end_line":3783,"end_character":71},"updated":"2017-12-08 14:26:16.000000000","message":"This comment could be updated.","commit_id":"ff938da863251ebdc46bc6765200b4c64cf06524"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"2a01d07f69cd8e6e1b32ad36fed7a6a4d7f2874c","unresolved":false,"context_lines":[{"line_number":3779,"context_line":"    if result:"},{"line_number":3780,"context_line":"        result.update(values)"},{"line_number":3781,"context_line":"    else:"},{"line_number":3782,"context_line":"        # Either the device_name doesn\u0027t exist in the database yet, or no"},{"line_number":3783,"context_line":"        # device_name was provided. Both cases mean creating a new BDM."},{"line_number":3784,"context_line":"        values[\u0027uuid\u0027] \u003d uuidutils.generate_uuid()"},{"line_number":3785,"context_line":"        result \u003d models.BlockDeviceMapping(**values)"},{"line_number":3786,"context_line":"        result.save(context.session)"}],"source_content_type":"text/x-python","patch_set":24,"id":"df87a7cf_a66e5efd","line":3783,"range":{"start_line":3782,"start_character":8,"end_line":3783,"end_character":71},"in_reply_to":"df87a7cf_e577a5d3","updated":"2017-12-11 13:45:25.000000000","message":"Done","commit_id":"ff938da863251ebdc46bc6765200b4c64cf06524"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7684e564e3ceb4ab438ba4d6db9333126cdb70d6","unresolved":false,"context_lines":[{"line_number":3766,"context_line":"    else:"},{"line_number":3767,"context_line":"        # Either the device_name or uuid doesn\u0027t exist in the database yet, or"},{"line_number":3768,"context_line":"        # neither was provided. Both cases mean creating a new BDM."},{"line_number":3769,"context_line":"        values[\u0027uuid\u0027] \u003d uuidutils.generate_uuid()"},{"line_number":3770,"context_line":"        result \u003d models.BlockDeviceMapping(**values)"},{"line_number":3771,"context_line":"        result.save(context.session)"},{"line_number":3772,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"bf8cb3f7_99080829","line":3769,"updated":"2017-12-21 22:43:23.000000000","message":"This is assuming that values doesn\u0027t already have uuid in it, which is wrong. This should be like block_device_mapping_create above.","commit_id":"de4d4bf098fe8c2cf24bd81df674e1ba44753a73"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"a9b6f4285f7df23a515b55c87fd468505612cd27","unresolved":false,"context_lines":[{"line_number":3766,"context_line":"    else:"},{"line_number":3767,"context_line":"        # Either the device_name or uuid doesn\u0027t exist in the database yet, or"},{"line_number":3768,"context_line":"        # neither was provided. Both cases mean creating a new BDM."},{"line_number":3769,"context_line":"        values[\u0027uuid\u0027] \u003d uuidutils.generate_uuid()"},{"line_number":3770,"context_line":"        result \u003d models.BlockDeviceMapping(**values)"},{"line_number":3771,"context_line":"        result.save(context.session)"},{"line_number":3772,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"bf8cb3f7_3713fcb7","line":3769,"in_reply_to":"bf8cb3f7_99080829","updated":"2017-12-22 13:24:48.000000000","message":"Agreed. Don\u0027t think this is an issue in practise, as the model here is that uuid \u0027comes from the db\u0027, i.e. here. Safer is better, though. I\u0027ll fix this.","commit_id":"de4d4bf098fe8c2cf24bd81df674e1ba44753a73"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bd8bec0aee6a100f327a52ffd1ec750e604ed4f5","unresolved":false,"context_lines":[{"line_number":3714,"context_line":"    # values doesn\u0027t contain uuid, or it\u0027s blank"},{"line_number":3715,"context_line":"    if not uuid:"},{"line_number":3716,"context_line":"        values[\u0027uuid\u0027] \u003d uuidutils.generate_uuid()"},{"line_number":3717,"context_line":""},{"line_number":3718,"context_line":"    # values contains a uuid"},{"line_number":3719,"context_line":"    else:"},{"line_number":3720,"context_line":"        if not uuidutils.is_uuid_like(uuid):"}],"source_content_type":"text/x-python","patch_set":28,"id":"bf8cb3f7_9d4c69c8","line":3717,"updated":"2017-12-22 15:41:42.000000000","message":"this blank line is too blank for my taste","commit_id":"cd3901c0673620794fb2240a448c9fc14b608172"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"56215e841f4877a4dcd4148e1039e07d18dd4055","unresolved":false,"context_lines":[{"line_number":3714,"context_line":"    # values doesn\u0027t contain uuid, or it\u0027s blank"},{"line_number":3715,"context_line":"    if not uuid:"},{"line_number":3716,"context_line":"        values[\u0027uuid\u0027] \u003d uuidutils.generate_uuid()"},{"line_number":3717,"context_line":""},{"line_number":3718,"context_line":"    # values contains a uuid"},{"line_number":3719,"context_line":"    else:"},{"line_number":3720,"context_line":"        if not uuidutils.is_uuid_like(uuid):"}],"source_content_type":"text/x-python","patch_set":28,"id":"bf8cb3f7_bd036d42","line":3717,"in_reply_to":"bf8cb3f7_9d4c69c8","updated":"2017-12-22 15:44:37.000000000","message":"# THIS LINE LEFT INTENTIONALLY BLANK","commit_id":"cd3901c0673620794fb2240a448c9fc14b608172"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8ef3ad0ea75c69700df4db04797c0eeab943da87","unresolved":false,"context_lines":[{"line_number":3714,"context_line":"    # values doesn\u0027t contain uuid, or it\u0027s blank"},{"line_number":3715,"context_line":"    if not uuid:"},{"line_number":3716,"context_line":"        values[\u0027uuid\u0027] \u003d uuidutils.generate_uuid()"},{"line_number":3717,"context_line":""},{"line_number":3718,"context_line":"    # values contains a uuid"},{"line_number":3719,"context_line":"    else:"},{"line_number":3720,"context_line":"        if not uuidutils.is_uuid_like(uuid):"}],"source_content_type":"text/x-python","patch_set":28,"id":"bf8cb3f7_ac9b33c7","line":3717,"in_reply_to":"bf8cb3f7_bd036d42","updated":"2017-12-24 11:40:15.000000000","message":"I always thought it ironic seeing those pages marked \"this page intentionally left blank\" in books. I mean, by putting that in the page, the page is no longer blank. :)","commit_id":"cd3901c0673620794fb2240a448c9fc14b608172"}],"nova/db/sqlalchemy/migrate_repo/versions/313_bdm_uuid.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"58adc2b61dbf99d8650c83aa0a6bd12d7c346c36","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    for prefix in (\u0027\u0027, \u0027shadow_\u0027):"},{"line_number":25,"context_line":"        table \u003d Table(prefix + \u0027block_device_mapping\u0027, meta, autoload\u003dTrue)"},{"line_number":26,"context_line":"        new_column \u003d Column(\u0027uuid\u0027, String(36), nullable\u003dTrue)"},{"line_number":27,"context_line":"        if not hasattr(table.c, \u0027uuid\u0027):"},{"line_number":28,"context_line":"            table.create_column(new_column)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa80f949_b9329c5c","line":26,"updated":"2015-11-06 19:51:01.000000000","message":"nullable\u003dTrue is not fun on a uuid column, remember the previous hoops to get instance.uuid non-nullable.\n\nBut if we make it non-nullable, then we also have to provide a default, which we don\u0027t have, unless sqlalchemy lets you pass a function to run to default the value on the column when creating it...","commit_id":"bd65c41a44601e98b6235a9aaf5f7d4fc63303b5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"2fe1dae3256cb5209399870282cfaac5a518ab7a","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    for prefix in (\u0027\u0027, \u0027shadow_\u0027):"},{"line_number":25,"context_line":"        table \u003d Table(prefix + \u0027block_device_mapping\u0027, meta, autoload\u003dTrue)"},{"line_number":26,"context_line":"        new_column \u003d Column(\u0027uuid\u0027, String(36), nullable\u003dTrue)"},{"line_number":27,"context_line":"        if not hasattr(table.c, \u0027uuid\u0027):"},{"line_number":28,"context_line":"            table.create_column(new_column)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa80f949_142dad94","line":26,"in_reply_to":"fa80f949_b9329c5c","updated":"2015-11-06 19:56:03.000000000","message":"Right, we have to make this nullable for now I think. We can provide a similar online migration command to fill out any stragglers and then do the change. It\u0027s the only way we can do this and not require atomic downtime.","commit_id":"bd65c41a44601e98b6235a9aaf5f7d4fc63303b5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f39c3d433f27aeed2a54193a7b7f2faa8efa3a1f","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    for prefix in (\u0027\u0027, \u0027shadow_\u0027):"},{"line_number":25,"context_line":"        table \u003d Table(prefix + \u0027block_device_mapping\u0027, meta, autoload\u003dTrue)"},{"line_number":26,"context_line":"        new_column \u003d Column(\u0027uuid\u0027, String(36), nullable\u003dTrue)"},{"line_number":27,"context_line":"        if not hasattr(table.c, \u0027uuid\u0027):"},{"line_number":28,"context_line":"            table.create_column(new_column)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_941f0a5b","line":26,"updated":"2015-11-06 21:13:46.000000000","message":"We could add a note to eventually make this nullable\u003dFalse after we\u0027ve done some online data migration and then force a full atomic migration in 14.0.0?","commit_id":"c2adaa0a0b3ffb0480e05132cfd6c1507a914d70"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4d310c86777a4e035010e023f2f2478d663859d0","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    for prefix in (\u0027\u0027, \u0027shadow_\u0027):"},{"line_number":25,"context_line":"        table \u003d Table(prefix + \u0027block_device_mapping\u0027, meta, autoload\u003dTrue)"},{"line_number":26,"context_line":"        new_column \u003d Column(\u0027uuid\u0027, String(36), nullable\u003dTrue)"},{"line_number":27,"context_line":"        if not hasattr(table.c, \u0027uuid\u0027):"},{"line_number":28,"context_line":"            table.create_column(new_column)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_94986a6c","line":26,"in_reply_to":"da85f559_34e41e3a","updated":"2015-11-06 21:26:59.000000000","message":"Like Liz Taylor....","commit_id":"c2adaa0a0b3ffb0480e05132cfd6c1507a914d70"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"54e034f921d3ae71a3943c6edeb3ddd27a0a36fe","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    for prefix in (\u0027\u0027, \u0027shadow_\u0027):"},{"line_number":25,"context_line":"        table \u003d Table(prefix + \u0027block_device_mapping\u0027, meta, autoload\u003dTrue)"},{"line_number":26,"context_line":"        new_column \u003d Column(\u0027uuid\u0027, String(36), nullable\u003dTrue)"},{"line_number":27,"context_line":"        if not hasattr(table.c, \u0027uuid\u0027):"},{"line_number":28,"context_line":"            table.create_column(new_column)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_34e41e3a","line":26,"in_reply_to":"da85f559_941f0a5b","updated":"2015-11-06 21:19:57.000000000","message":"I think it would be better in the model, since these are sort of timeless.","commit_id":"c2adaa0a0b3ffb0480e05132cfd6c1507a914d70"}],"nova/db/sqlalchemy/migrate_repo/versions/347_bdm_uuid.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"917b559569eeace960ff5fce6fbd7f747d10c6eb","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    for prefix in (\u0027\u0027, \u0027shadow_\u0027):"},{"line_number":25,"context_line":"        table \u003d Table(prefix + \u0027block_device_mapping\u0027, meta, autoload\u003dTrue)"},{"line_number":26,"context_line":"        new_column \u003d Column(\u0027uuid\u0027, String(36), nullable\u003dTrue)"},{"line_number":27,"context_line":"        if not hasattr(table.c, \u0027uuid\u0027):"},{"line_number":28,"context_line":"            table.create_column(new_column)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a77a97e_ec21c84e","line":26,"range":{"start_line":26,"start_character":29,"end_line":26,"end_character":33},"updated":"2016-11-16 16:03:13.000000000","message":"I guess we can\u0027t mark this as unique\u003dTrue because it\u0027s nullable\u003dTrue, but it seems we should have an index on this column given we have query methods using it now.","commit_id":"2988a3ab07b4b41422a5b2dde6049203f477cc0e"}],"nova/db/sqlalchemy/migrate_repo/versions/358_bdm_uuid.py":[{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"5ec4841d9c87e713b35a77d3d10d99a4d35fcc9b","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    for prefix in (\u0027\u0027, \u0027shadow_\u0027):"},{"line_number":33,"context_line":"        table \u003d Table(prefix + \u0027block_device_mapping\u0027, meta, autoload\u003dTrue)"},{"line_number":34,"context_line":"        new_column \u003d Column(\u0027uuid\u0027, String(36), nullable\u003dTrue)"},{"line_number":35,"context_line":"        if not hasattr(table.c, \u0027uuid\u0027):"},{"line_number":36,"context_line":"            table.create_column(new_column)"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3a1ff146_08c72013","line":34,"updated":"2017-03-15 11:58:13.000000000","message":"nit: This could go under the guard on the line below.\n\nAlso, UUIDField.","commit_id":"c5a90a6bc03bde2bc1c45dfebecaca5b477021ab"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"d15f9202d6369cf12f356f9b12d2c464449ca656","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    for prefix in (\u0027\u0027, \u0027shadow_\u0027):"},{"line_number":33,"context_line":"        table \u003d Table(prefix + \u0027block_device_mapping\u0027, meta, autoload\u003dTrue)"},{"line_number":34,"context_line":"        new_column \u003d Column(\u0027uuid\u0027, String(36), nullable\u003dTrue)"},{"line_number":35,"context_line":"        if not hasattr(table.c, \u0027uuid\u0027):"},{"line_number":36,"context_line":"            table.create_column(new_column)"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3a1ff146_034c5a41","line":34,"in_reply_to":"3a1ff146_08c72013","updated":"2017-03-15 14:22:06.000000000","message":"Again that isn\u0027t a Column data type.","commit_id":"c5a90a6bc03bde2bc1c45dfebecaca5b477021ab"}],"nova/db/sqlalchemy/migrate_repo/versions/374_bdm_uuid.py":[{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"2a01d07f69cd8e6e1b32ad36fed7a6a4d7f2874c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"#    a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":24,"id":"df87a7cf_ccdf010b","line":1,"updated":"2017-12-11 13:45:25.000000000","message":"t","commit_id":"ff938da863251ebdc46bc6765200b4c64cf06524"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0ef359cb4e566db39ad0a4ee83338f6e54d98004","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"            if prefix \u003d\u003d \u0027\u0027:"},{"line_number":32,"context_line":"                # Only add the constraint on the non-shadow table..."},{"line_number":33,"context_line":"                con \u003d UniqueConstraint(\u0027uuid\u0027, table\u003dtable,"},{"line_number":34,"context_line":"                                       name\u003d\"uniq_block_device_mapping0uuid\")"},{"line_number":35,"context_line":"                con.create(migrate_engine)"}],"source_content_type":"text/x-python","patch_set":24,"id":"df87a7cf_e03c73c9","line":35,"range":{"start_line":33,"start_character":16,"end_line":35,"end_character":42},"updated":"2017-12-08 14:26:16.000000000","message":"We don\u0027t do this for compute_nodes, services, migrations or aggregates, so why are we doing it for BDMs? We do have an index on the uuid column in some of those other tables presumably because we\u0027ll have a \u003cresource\u003e_get_by_uuid API method.\n\nI realize we want the uuid to be unique in the table, but until it\u0027s non-nullable I\u0027m not sure we should enforce that? Some DBs don\u0027t allow a unique constraint on a nullable column is my point.","commit_id":"ff938da863251ebdc46bc6765200b4c64cf06524"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"91b7b5d34a444c2d9bf69dd130d19a5b2c9a6d63","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"            if prefix \u003d\u003d \u0027\u0027:"},{"line_number":32,"context_line":"                # Only add the constraint on the non-shadow table..."},{"line_number":33,"context_line":"                con \u003d UniqueConstraint(\u0027uuid\u0027, table\u003dtable,"},{"line_number":34,"context_line":"                                       name\u003d\"uniq_block_device_mapping0uuid\")"},{"line_number":35,"context_line":"                con.create(migrate_engine)"}],"source_content_type":"text/x-python","patch_set":24,"id":"bf8cb3f7_4c65c7e0","line":35,"range":{"start_line":33,"start_character":16,"end_line":35,"end_character":42},"in_reply_to":"df87a7cf_2cbf8daa","updated":"2017-12-24 11:36:16.000000000","message":"@mdbooth: You\u0027re lacking some history here :) Matt is likely referring to his (not so pleasant) experiences trying to get IBM DB2 working properly with unique constraints on nullable columns (which isn\u0027t supported for DB2). In the course of doing that work, we pretty much landed on a solution that simply indexes and doesn\u0027t provide a constraint on the nullable fields.\n\nIn the future (after all stopper patches for these types of migrations are added and we can ensure non-nullability on all the columns), I think we\u0027d like to add in unique constraints on them all.","commit_id":"ff938da863251ebdc46bc6765200b4c64cf06524"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"2a01d07f69cd8e6e1b32ad36fed7a6a4d7f2874c","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"            if prefix \u003d\u003d \u0027\u0027:"},{"line_number":32,"context_line":"                # Only add the constraint on the non-shadow table..."},{"line_number":33,"context_line":"                con \u003d UniqueConstraint(\u0027uuid\u0027, table\u003dtable,"},{"line_number":34,"context_line":"                                       name\u003d\"uniq_block_device_mapping0uuid\")"},{"line_number":35,"context_line":"                con.create(migrate_engine)"}],"source_content_type":"text/x-python","patch_set":24,"id":"df87a7cf_2cbf8daa","line":35,"range":{"start_line":33,"start_character":16,"end_line":35,"end_character":42},"in_reply_to":"df87a7cf_e03c73c9","updated":"2017-12-11 13:45:25.000000000","message":"I actually researched this. Both databases we support allow indexes on nullable columns. Also, according to the relevant SQLXX spec (I forget which exactly), all databases should support this. Specifically NULL !\u003d NULL, so the constraint is not violated.\n\nThe main reason to add it is that a duplicate UUID would indicate a bug. If there were a bug which accidentally created them, it would be a pain to fix up later. Better to blow up without creating invalid data.\n\nThe unique constraint is also an index, which means no schema change would be required if we later needed to add a _get_by_uuid method.\n\nWe should probably have unique constraints on all our uuid columns.","commit_id":"ff938da863251ebdc46bc6765200b4c64cf06524"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"1a7339e7e9cbde053714d2e75b190d42331d703c","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    for prefix in (\u0027\u0027, \u0027shadow_\u0027):"},{"line_number":26,"context_line":"        table \u003d Table(prefix + \u0027block_device_mapping\u0027, meta, autoload\u003dTrue)"},{"line_number":27,"context_line":"        new_column \u003d Column(\u0027uuid\u0027, String(36), nullable\u003dTrue)"},{"line_number":28,"context_line":"        if not hasattr(table.c, \u0027uuid\u0027):"},{"line_number":29,"context_line":"            table.create_column(new_column)"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"bf8cb3f7_b6c87c55","line":27,"updated":"2017-12-21 19:49:56.000000000","message":"The tiniest of nits: we can move this into the if to avoid needlessly creating the Column.","commit_id":"de4d4bf098fe8c2cf24bd81df674e1ba44753a73"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"a9b6f4285f7df23a515b55c87fd468505612cd27","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    for prefix in (\u0027\u0027, \u0027shadow_\u0027):"},{"line_number":26,"context_line":"        table \u003d Table(prefix + \u0027block_device_mapping\u0027, meta, autoload\u003dTrue)"},{"line_number":27,"context_line":"        new_column \u003d Column(\u0027uuid\u0027, String(36), nullable\u003dTrue)"},{"line_number":28,"context_line":"        if not hasattr(table.c, \u0027uuid\u0027):"},{"line_number":29,"context_line":"            table.create_column(new_column)"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"bf8cb3f7_5779e0f9","line":27,"in_reply_to":"bf8cb3f7_b6c87c55","updated":"2017-12-22 13:24:48.000000000","message":"I have to respin this anyway, so because it\u0027s you...","commit_id":"de4d4bf098fe8c2cf24bd81df674e1ba44753a73"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8ef3ad0ea75c69700df4db04797c0eeab943da87","unresolved":false,"context_lines":[{"line_number":31,"context_line":"            if prefix \u003d\u003d \u0027\u0027:"},{"line_number":32,"context_line":"                # Only add the constraint on the non-shadow table..."},{"line_number":33,"context_line":"                con \u003d UniqueConstraint(\u0027uuid\u0027, table\u003dtable,"},{"line_number":34,"context_line":"                                       name\u003d\"uniq_block_device_mapping0uuid\")"},{"line_number":35,"context_line":"                con.create(migrate_engine)"}],"source_content_type":"text/x-python","patch_set":28,"id":"bf8cb3f7_2caf23e4","line":34,"updated":"2017-12-24 11:40:15.000000000","message":"I guess Matt is OK with this now...","commit_id":"cd3901c0673620794fb2240a448c9fc14b608172"}],"nova/db/sqlalchemy/models.py":[{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"5ec4841d9c87e713b35a77d3d10d99a4d35fcc9b","unresolved":false,"context_lines":[{"line_number":586,"context_line":"    instance_uuid \u003d Column(String(36), ForeignKey(\u0027instances.uuid\u0027))"},{"line_number":587,"context_line":"    # FIXME(danms): This should eventually be unique and non-nullable,"},{"line_number":588,"context_line":"    # but we need a transition period first."},{"line_number":589,"context_line":"    uuid \u003d Column(String(36))"},{"line_number":590,"context_line":"    instance \u003d orm.relationship(Instance,"},{"line_number":591,"context_line":"                            backref\u003dorm.backref(\u0027block_device_mapping\u0027),"},{"line_number":592,"context_line":"                            foreign_keys\u003dinstance_uuid,"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a1ff146_924b3d2b","line":589,"updated":"2017-03-15 11:58:13.000000000","message":"Any reason this isn\u0027t UUIDField?\n\nAlso, see comment in block_device.py. I think this should be called something else so that it\u0027s immediately obvious to anybody poking in here (developer or operator) this isn\u0027t related to the \u0027uuid\u0027 we passed to the api when creating it. My preference is the technically redundant \u0027bdm_uuid\u0027.","commit_id":"c5a90a6bc03bde2bc1c45dfebecaca5b477021ab"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"d15f9202d6369cf12f356f9b12d2c464449ca656","unresolved":false,"context_lines":[{"line_number":586,"context_line":"    instance_uuid \u003d Column(String(36), ForeignKey(\u0027instances.uuid\u0027))"},{"line_number":587,"context_line":"    # FIXME(danms): This should eventually be unique and non-nullable,"},{"line_number":588,"context_line":"    # but we need a transition period first."},{"line_number":589,"context_line":"    uuid \u003d Column(String(36))"},{"line_number":590,"context_line":"    instance \u003d orm.relationship(Instance,"},{"line_number":591,"context_line":"                            backref\u003dorm.backref(\u0027block_device_mapping\u0027),"},{"line_number":592,"context_line":"                            foreign_keys\u003dinstance_uuid,"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a1ff146_804a0082","line":589,"in_reply_to":"3a1ff146_924b3d2b","updated":"2017-03-15 14:22:06.000000000","message":"As UUIDField isn\u0027t a Column data type AFAIK [1]. Are you confusing this change with the following BlockDeviceMapping NovaObject changes?\n\n[1] http://docs.sqlalchemy.org/en/latest/core/type_basics.html","commit_id":"c5a90a6bc03bde2bc1c45dfebecaca5b477021ab"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"a471eb15fac178e3642a3fe3a3573fc4b07f348b","unresolved":false,"context_lines":[{"line_number":588,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue, autoincrement\u003dTrue)"},{"line_number":589,"context_line":""},{"line_number":590,"context_line":"    instance_uuid \u003d Column(String(36), ForeignKey(\u0027instances.uuid\u0027))"},{"line_number":591,"context_line":"    # FIXME(danms): This should eventually be unique and non-nullable,"},{"line_number":592,"context_line":"    # but we need a transition period first."},{"line_number":593,"context_line":"    uuid \u003d Column(String(36))"},{"line_number":594,"context_line":"    instance \u003d orm.relationship(Instance,"}],"source_content_type":"text/x-python","patch_set":23,"id":"df87a7cf_2b407b56","line":591,"range":{"start_line":591,"start_character":46,"end_line":591,"end_character":52},"updated":"2017-12-04 15:13:25.000000000","message":"I understand why this can\u0027t be non-nullable in the first instance, but I don\u0027t understand why it can\u0027t be unique.","commit_id":"52b98f3ee4a3eb417917dac4aa4944208b61d600"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"b9e746dc9dbc91a78a0d8f039bed3e0e9796ca4f","unresolved":false,"context_lines":[{"line_number":588,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue, autoincrement\u003dTrue)"},{"line_number":589,"context_line":""},{"line_number":590,"context_line":"    instance_uuid \u003d Column(String(36), ForeignKey(\u0027instances.uuid\u0027))"},{"line_number":591,"context_line":"    # NOTE(mdbooth): The REST API for BDMs includes a UUID field. That uuid"},{"line_number":592,"context_line":"    # refers to an object which will be used in the initialisation of the BDM."},{"line_number":593,"context_line":"    # It is only relevant during the API call, and is never persisted. This is"},{"line_number":594,"context_line":"    # the UUID of the BDM itself."},{"line_number":595,"context_line":"    # FIXME(danms): This should eventually be non-nullable, but we need a"},{"line_number":596,"context_line":"    # transition period first."},{"line_number":597,"context_line":"    uuid \u003d Column(String(36))"}],"source_content_type":"text/x-python","patch_set":24,"id":"df87a7cf_e5b34009","line":594,"range":{"start_line":591,"start_character":6,"end_line":594,"end_character":33},"updated":"2017-12-07 15:47:16.000000000","message":"heh, that\u0027s not confusing at ALL.","commit_id":"ff938da863251ebdc46bc6765200b4c64cf06524"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7684e564e3ceb4ab438ba4d6db9333126cdb70d6","unresolved":false,"context_lines":[{"line_number":589,"context_line":""},{"line_number":590,"context_line":"    instance_uuid \u003d Column(String(36), ForeignKey(\u0027instances.uuid\u0027))"},{"line_number":591,"context_line":"    # NOTE(mdbooth): The REST API for BDMs includes a UUID field. That uuid"},{"line_number":592,"context_line":"    # refers to an object which will be used in the initialisation of the BDM."},{"line_number":593,"context_line":"    # It is only relevant during the API call, and is never persisted. This is"},{"line_number":594,"context_line":"    # the UUID of the BDM itself."},{"line_number":595,"context_line":"    # FIXME(danms): This should eventually be non-nullable, but we need a"}],"source_content_type":"text/x-python","patch_set":27,"id":"bf8cb3f7_593b60d0","line":592,"range":{"start_line":592,"start_character":19,"end_line":592,"end_character":25},"updated":"2017-12-21 22:43:23.000000000","message":"This would be more clear if you pointed out the uuid is for an image, volume, or volume snapshot, based on the source_type.","commit_id":"de4d4bf098fe8c2cf24bd81df674e1ba44753a73"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"a9b6f4285f7df23a515b55c87fd468505612cd27","unresolved":false,"context_lines":[{"line_number":589,"context_line":""},{"line_number":590,"context_line":"    instance_uuid \u003d Column(String(36), ForeignKey(\u0027instances.uuid\u0027))"},{"line_number":591,"context_line":"    # NOTE(mdbooth): The REST API for BDMs includes a UUID field. That uuid"},{"line_number":592,"context_line":"    # refers to an object which will be used in the initialisation of the BDM."},{"line_number":593,"context_line":"    # It is only relevant during the API call, and is never persisted. This is"},{"line_number":594,"context_line":"    # the UUID of the BDM itself."},{"line_number":595,"context_line":"    # FIXME(danms): This should eventually be non-nullable, but we need a"}],"source_content_type":"text/x-python","patch_set":27,"id":"bf8cb3f7_f7691425","line":592,"range":{"start_line":592,"start_character":19,"end_line":592,"end_character":25},"in_reply_to":"bf8cb3f7_593b60d0","updated":"2017-12-22 13:24:48.000000000","message":"Agreed.","commit_id":"de4d4bf098fe8c2cf24bd81df674e1ba44753a73"}],"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":"58adc2b61dbf99d8650c83aa0a6bd12d7c346c36","unresolved":false,"context_lines":[{"line_number":5771,"context_line":"        values.setdefault(\u0027device_name\u0027, \u0027fake_device\u0027)"},{"line_number":5772,"context_line":"        values.setdefault(\u0027source_type\u0027, \u0027volume\u0027)"},{"line_number":5773,"context_line":"        values.setdefault(\u0027destination_type\u0027, \u0027volume\u0027)"},{"line_number":5774,"context_line":""},{"line_number":5775,"context_line":"        block_dev \u003d block_device.BlockDeviceDict(values)"},{"line_number":5776,"context_line":"        db.block_device_mapping_create(self.ctxt, block_dev, legacy\u003dFalse)"},{"line_number":5777,"context_line":"        uuid \u003d block_dev[\u0027instance_uuid\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa80f949_b9093c86","line":5774,"updated":"2015-11-06 19:51:01.000000000","message":"unrelated","commit_id":"bd65c41a44601e98b6235a9aaf5f7d4fc63303b5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"58adc2b61dbf99d8650c83aa0a6bd12d7c346c36","unresolved":false,"context_lines":[{"line_number":6010,"context_line":"        bdms \u003d db.block_device_mapping_get_all_by_instance("},{"line_number":6011,"context_line":"            self.ctxt, bdm1[\u0027instance_uuid\u0027])"},{"line_number":6012,"context_line":"        self.assertEqual(len(bdms), 1)"},{"line_number":6013,"context_line":"        self.assertEqual(bdms[0][\u0027device_name\u0027], \u0027/dev/vdb\u0027)"},{"line_number":6014,"context_line":"        self.assertEqual(bdms[0][\u0027uuid\u0027], bdm2[\u0027uuid\u0027])"},{"line_number":6015,"context_line":""},{"line_number":6016,"context_line":"    def test_block_device_mapping_get_by_volume_id(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa80f949_79043449","line":6013,"updated":"2015-11-06 19:51:01.000000000","message":"nit: assertEqual(expected, observed)","commit_id":"bd65c41a44601e98b6235a9aaf5f7d4fc63303b5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"2fe1dae3256cb5209399870282cfaac5a518ab7a","unresolved":false,"context_lines":[{"line_number":6010,"context_line":"        bdms \u003d db.block_device_mapping_get_all_by_instance("},{"line_number":6011,"context_line":"            self.ctxt, bdm1[\u0027instance_uuid\u0027])"},{"line_number":6012,"context_line":"        self.assertEqual(len(bdms), 1)"},{"line_number":6013,"context_line":"        self.assertEqual(bdms[0][\u0027device_name\u0027], \u0027/dev/vdb\u0027)"},{"line_number":6014,"context_line":"        self.assertEqual(bdms[0][\u0027uuid\u0027], bdm2[\u0027uuid\u0027])"},{"line_number":6015,"context_line":""},{"line_number":6016,"context_line":"    def test_block_device_mapping_get_by_volume_id(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa80f949_542fb587","line":6013,"in_reply_to":"fa80f949_79043449","updated":"2015-11-06 19:56:03.000000000","message":"Yeah, copied from above.","commit_id":"bd65c41a44601e98b6235a9aaf5f7d4fc63303b5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f39c3d433f27aeed2a54193a7b7f2faa8efa3a1f","unresolved":false,"context_lines":[{"line_number":5881,"context_line":"                         \u0027expected 2 bdms without device_name, found %d\u0027 %"},{"line_number":5882,"context_line":"                         len(without_device_name))"},{"line_number":5883,"context_line":""},{"line_number":5884,"context_line":"    def test_block_device_mapping_update_with_uuid(self):"},{"line_number":5885,"context_line":"        bdm \u003d self._create_bdm({})"},{"line_number":5886,"context_line":"        values \u003d {"},{"line_number":5887,"context_line":"            \u0027uuid\u0027: bdm[\u0027uuid\u0027],"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_5441a238","line":5884,"updated":"2015-11-06 21:13:46.000000000","message":"nit: call this:\n\ntest_block_device_mapping_update_or_create_with_uuid\n\nSo it\u0027s not confused with:\n\ntest_block_device_mapping_update_by_uuid\n\nabove.","commit_id":"c2adaa0a0b3ffb0480e05132cfd6c1507a914d70"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f39c3d433f27aeed2a54193a7b7f2faa8efa3a1f","unresolved":false,"context_lines":[{"line_number":6007,"context_line":""},{"line_number":6008,"context_line":"        bdms \u003d db.block_device_mapping_get_all_by_instance("},{"line_number":6009,"context_line":"            self.ctxt, bdm1[\u0027instance_uuid\u0027])"},{"line_number":6010,"context_line":"        self.assertEqual(len(bdms), 1)"},{"line_number":6011,"context_line":"        self.assertEqual(bdms[0][\u0027device_name\u0027], \u0027/dev/vdb\u0027)"},{"line_number":6012,"context_line":"        self.assertEqual(bdm2[\u0027uuid\u0027], bdms[0][\u0027uuid\u0027])"},{"line_number":6013,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_5468c2ba","line":6010,"updated":"2015-11-06 21:13:46.000000000","message":"Usual nits on (expected, observed) but not a big deal.","commit_id":"c2adaa0a0b3ffb0480e05132cfd6c1507a914d70"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f4cf868fc74aed5ad2a99962749a1c3f867c59e8","unresolved":false,"context_lines":[{"line_number":6399,"context_line":"            \u0027destination_type\u0027: \u0027volume\u0027"},{"line_number":6400,"context_line":"        }"},{"line_number":6401,"context_line":"        # check create"},{"line_number":6402,"context_line":"        bdm \u003d db.block_device_mapping_update_or_create(self.ctxt, dict(values),"},{"line_number":6403,"context_line":"                                                       legacy\u003dFalse)"},{"line_number":6404,"context_line":"        self.assertTrue(uuidutils.is_uuid_like(bdm[\u0027uuid\u0027]))"},{"line_number":6405,"context_line":"        uuid \u003d values[\u0027instance_uuid\u0027]"}],"source_content_type":"text/x-python","patch_set":17,"id":"da36d5c6_88c38656","line":6402,"updated":"2017-02-23 19:09:22.000000000","message":"here and below, you\u0027re using dict(values), even though value is already a dict. I gather you\u0027re doing this in order to make a copy of values. If that\u0027s the case, why not be explicit and just do:\n\n copy.deepcopy(values)\n\n?","commit_id":"01c9226d57f0e5faf8351e05d6dbda9d9a4e77e1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ec5036a5a61e2c920e73fe3f8e3b9be9025fb7ce","unresolved":false,"context_lines":[{"line_number":6608,"context_line":"        self.assertEqual(\u0027/dev/vdb\u0027, bdms[0][\u0027device_name\u0027])"},{"line_number":6609,"context_line":"        self.assertEqual(bdm2[\u0027uuid\u0027], bdms[0][\u0027uuid\u0027])"},{"line_number":6610,"context_line":""},{"line_number":6611,"context_line":"    def test_block_device_mapping_get_all_by_uuid(self):"},{"line_number":6612,"context_line":"        bdm1 \u003d self._create_bdm({\u0027uuid\u0027: uuidsentinel.bdm_1,"},{"line_number":6613,"context_line":"                                 \u0027volume_id\u0027: uuidsentinel.volume_1})"},{"line_number":6614,"context_line":"        bdm2 \u003d self._create_bdm({\u0027uuid\u0027: uuidsentinel.bdm_2,"}],"source_content_type":"text/x-python","patch_set":20,"id":"ba2be162_f0bbffe2","line":6611,"range":{"start_line":6611,"start_character":38,"end_line":6611,"end_character":42},"updated":"2017-03-03 17:08:39.000000000","message":"s/all_// - subtle but confusing since this method returns 0 or 1 rather than a list.","commit_id":"b47133402dd567313298e790157a18bd1d516f1a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ec5036a5a61e2c920e73fe3f8e3b9be9025fb7ce","unresolved":false,"context_lines":[{"line_number":6615,"context_line":"                                 \u0027volume_id\u0027: uuidsentinel.volume_2})"},{"line_number":6616,"context_line":"        db_bdm1 \u003d db.block_device_mapping_get_by_uuid(self.ctxt,"},{"line_number":6617,"context_line":"                                                      uuidsentinel.bdm_1)"},{"line_number":6618,"context_line":"        db_bdm2 \u003d db.block_device_mapping_get_by_uuid(self.ctxt,"},{"line_number":6619,"context_line":"                                                      uuidsentinel.bdm_2)"},{"line_number":6620,"context_line":""},{"line_number":6621,"context_line":"        self.assertEqual(bdm1.uuid, db_bdm1.uuid)"},{"line_number":6622,"context_line":"        self.assertEqual(bdm1.volume_id, db_bdm1.volume_id)"}],"source_content_type":"text/x-python","patch_set":20,"id":"ba2be162_108fb32a","line":6619,"range":{"start_line":6618,"start_character":8,"end_line":6619,"end_character":73},"updated":"2017-03-03 17:08:39.000000000","message":"A nice wrinkle on this test would be to pass through columns_to_join.","commit_id":"b47133402dd567313298e790157a18bd1d516f1a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7f030b6987eff44abaeafb346d48cf5b861ceaad","unresolved":false,"context_lines":[{"line_number":6602,"context_line":"        self.assertEqual(\u0027/dev/vdb\u0027, bdms[0][\u0027device_name\u0027])"},{"line_number":6603,"context_line":"        self.assertEqual(bdm2[\u0027uuid\u0027], bdms[0][\u0027uuid\u0027])"},{"line_number":6604,"context_line":""},{"line_number":6605,"context_line":"    def test_block_device_mapping_get_all_by_uuid(self):"},{"line_number":6606,"context_line":"        self._create_bdm({\u0027uuid\u0027: uuidsentinel.bdm_1})"},{"line_number":6607,"context_line":"        self._create_bdm({\u0027uuid\u0027: uuidsentinel.bdm_2})"},{"line_number":6608,"context_line":"        db_bdm1 \u003d db.block_device_mapping_get_by_uuid(self.ctxt,"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba2be162_f7b9ea7a","line":6605,"range":{"start_line":6605,"start_character":38,"end_line":6605,"end_character":42},"updated":"2017-03-06 17:48:53.000000000","message":"There is no \u0027all\u0027 in the name of the method, it doesn\u0027t return a list. Let\u0027s fix the test name.","commit_id":"574041202116b70910e8590a45c7d61ffb163dbf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7f030b6987eff44abaeafb346d48cf5b861ceaad","unresolved":false,"context_lines":[{"line_number":6607,"context_line":"        self._create_bdm({\u0027uuid\u0027: uuidsentinel.bdm_2})"},{"line_number":6608,"context_line":"        db_bdm1 \u003d db.block_device_mapping_get_by_uuid(self.ctxt,"},{"line_number":6609,"context_line":"                                                      uuidsentinel.bdm_1)"},{"line_number":6610,"context_line":"        db_bdm2 \u003d db.block_device_mapping_get_by_uuid(self.ctxt,"},{"line_number":6611,"context_line":"                                                      uuidsentinel.bdm_2)"},{"line_number":6612,"context_line":""},{"line_number":6613,"context_line":"        self.assertEqual(db_bdm1.uuid, uuidsentinel.bdm_1)"},{"line_number":6614,"context_line":"        self.assertEqual(db_bdm2.uuid, uuidsentinel.bdm_2)"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba2be162_b7669227","line":6611,"range":{"start_line":6610,"start_character":8,"end_line":6611,"end_character":73},"updated":"2017-03-06 17:48:53.000000000","message":"A nice wrinkle on this test would be to pass through columns_to_join.","commit_id":"574041202116b70910e8590a45c7d61ffb163dbf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7f030b6987eff44abaeafb346d48cf5b861ceaad","unresolved":false,"context_lines":[{"line_number":6610,"context_line":"        db_bdm2 \u003d db.block_device_mapping_get_by_uuid(self.ctxt,"},{"line_number":6611,"context_line":"                                                      uuidsentinel.bdm_2)"},{"line_number":6612,"context_line":""},{"line_number":6613,"context_line":"        self.assertEqual(db_bdm1.uuid, uuidsentinel.bdm_1)"},{"line_number":6614,"context_line":"        self.assertEqual(db_bdm2.uuid, uuidsentinel.bdm_2)"},{"line_number":6615,"context_line":""},{"line_number":6616,"context_line":"    def test_block_device_mapping_get_all_by_volume_id(self):"},{"line_number":6617,"context_line":"        self._create_bdm({\u0027volume_id\u0027: \u0027fake_id\u0027})"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba2be162_375aa251","line":6614,"range":{"start_line":6613,"start_character":8,"end_line":6614,"end_character":58},"updated":"2017-03-06 17:48:53.000000000","message":"The args should be reserved here: (expected, actual)","commit_id":"574041202116b70910e8590a45c7d61ffb163dbf"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"5ec4841d9c87e713b35a77d3d10d99a4d35fcc9b","unresolved":false,"context_lines":[{"line_number":6378,"context_line":"        self.assertEqual(dict(bdm_real[0]),"},{"line_number":6379,"context_line":"                         dict(result))"},{"line_number":6380,"context_line":""},{"line_number":6381,"context_line":"    def test_block_device_mapping_update_by_uuid(self):"},{"line_number":6382,"context_line":"        bdm \u003d self._create_bdm({})"},{"line_number":6383,"context_line":"        result \u003d db.block_device_mapping_update("},{"line_number":6384,"context_line":"                self.ctxt, bdm[\u0027uuid\u0027], {\u0027destination_type\u0027: \u0027moon\u0027},"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a1ff146_23631d1c","line":6381,"updated":"2017-03-15 11:58:13.000000000","message":"Can we please share common code with the test above?","commit_id":"c5a90a6bc03bde2bc1c45dfebecaca5b477021ab"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"5ec4841d9c87e713b35a77d3d10d99a4d35fcc9b","unresolved":false,"context_lines":[{"line_number":6381,"context_line":"    def test_block_device_mapping_update_by_uuid(self):"},{"line_number":6382,"context_line":"        bdm \u003d self._create_bdm({})"},{"line_number":6383,"context_line":"        result \u003d db.block_device_mapping_update("},{"line_number":6384,"context_line":"                self.ctxt, bdm[\u0027uuid\u0027], {\u0027destination_type\u0027: \u0027moon\u0027},"},{"line_number":6385,"context_line":"                legacy\u003dFalse)"},{"line_number":6386,"context_line":"        uuid \u003d bdm[\u0027instance_uuid\u0027]"},{"line_number":6387,"context_line":"        bdm_real \u003d db.block_device_mapping_get_all_by_instance(self.ctxt, uuid)"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a1ff146_4363b9b1","line":6384,"range":{"start_line":6384,"start_character":40,"end_line":6384,"end_character":68},"updated":"2017-03-15 11:58:13.000000000","message":"Can we please have another test where we call a bdm object in here? (cellsv1)","commit_id":"c5a90a6bc03bde2bc1c45dfebecaca5b477021ab"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"5ec4841d9c87e713b35a77d3d10d99a4d35fcc9b","unresolved":false,"context_lines":[{"line_number":6383,"context_line":"        result \u003d db.block_device_mapping_update("},{"line_number":6384,"context_line":"                self.ctxt, bdm[\u0027uuid\u0027], {\u0027destination_type\u0027: \u0027moon\u0027},"},{"line_number":6385,"context_line":"                legacy\u003dFalse)"},{"line_number":6386,"context_line":"        uuid \u003d bdm[\u0027instance_uuid\u0027]"},{"line_number":6387,"context_line":"        bdm_real \u003d db.block_device_mapping_get_all_by_instance(self.ctxt, uuid)"},{"line_number":6388,"context_line":"        self.assertEqual(\u0027moon\u0027, bdm_real[0][\u0027destination_type\u0027])"},{"line_number":6389,"context_line":"        # Also make sure the update call returned correct data"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a1ff146_43d81954","line":6386,"range":{"start_line":6386,"start_character":8,"end_line":6386,"end_character":12},"updated":"2017-03-15 11:58:13.000000000","message":"nit: instance_uuid. We\u0027re overloading uuid here.","commit_id":"c5a90a6bc03bde2bc1c45dfebecaca5b477021ab"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"5ec4841d9c87e713b35a77d3d10d99a4d35fcc9b","unresolved":false,"context_lines":[{"line_number":6398,"context_line":"        }"},{"line_number":6399,"context_line":"        # check create"},{"line_number":6400,"context_line":"        bdm \u003d db.block_device_mapping_update_or_create(self.ctxt,"},{"line_number":6401,"context_line":"                                                       copy.deepcopy(values),"},{"line_number":6402,"context_line":"                                                       legacy\u003dFalse)"},{"line_number":6403,"context_line":"        self.assertTrue(uuidutils.is_uuid_like(bdm[\u0027uuid\u0027]))"},{"line_number":6404,"context_line":"        uuid \u003d values[\u0027instance_uuid\u0027]"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a1ff146_fee43a3c","line":6401,"updated":"2017-03-15 11:58:13.000000000","message":"Eww. This is what we get for modifying arguments :(\n\nStill, it\u0027s a pattern in that module, so whatever..","commit_id":"c5a90a6bc03bde2bc1c45dfebecaca5b477021ab"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"5ec4841d9c87e713b35a77d3d10d99a4d35fcc9b","unresolved":false,"context_lines":[{"line_number":6453,"context_line":"            \u0027instance_uuid\u0027: bdm[\u0027instance_uuid\u0027],"},{"line_number":6454,"context_line":"            \u0027device_name\u0027: \u0027foobar\u0027,"},{"line_number":6455,"context_line":"        }"},{"line_number":6456,"context_line":"        db.block_device_mapping_update_or_create(self.ctxt, values,"},{"line_number":6457,"context_line":"                                                 legacy\u003dFalse)"},{"line_number":6458,"context_line":"        real_bdms \u003d db.block_device_mapping_get_all_by_instance("},{"line_number":6459,"context_line":"            self.ctxt, bdm[\u0027instance_uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a1ff146_7eb04af5","line":6456,"range":{"start_line":6456,"start_character":60,"end_line":6456,"end_character":66},"updated":"2017-03-15 11:58:13.000000000","message":"ditto object test.","commit_id":"c5a90a6bc03bde2bc1c45dfebecaca5b477021ab"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"b9e746dc9dbc91a78a0d8f039bed3e0e9796ca4f","unresolved":false,"context_lines":[{"line_number":6336,"context_line":"        self.assertEqual(bdm_real[0][\u0027device_name\u0027], \u0027fake_name\u0027)"},{"line_number":6337,"context_line":""},{"line_number":6338,"context_line":"        # check update"},{"line_number":6339,"context_line":"        bdm0 \u003d dict(values)"},{"line_number":6340,"context_line":"        bdm0[\u0027destination_type\u0027] \u003d \u0027camelot\u0027"},{"line_number":6341,"context_line":"        db.block_device_mapping_update_or_create(self.ctxt, bdm0,"},{"line_number":6342,"context_line":"                                                 legacy\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":24,"id":"df87a7cf_05874411","line":6339,"range":{"start_line":6339,"start_character":15,"end_line":6339,"end_character":19},"updated":"2017-12-07 15:47:16.000000000","message":"why not use copy.deepcopy() here, like is done on line 6330 and 6350?","commit_id":"ff938da863251ebdc46bc6765200b4c64cf06524"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"dfa1953fbb7e997a0061884337d5113acbf71005","unresolved":false,"context_lines":[{"line_number":6336,"context_line":"        self.assertEqual(bdm_real[0][\u0027device_name\u0027], \u0027fake_name\u0027)"},{"line_number":6337,"context_line":""},{"line_number":6338,"context_line":"        # check update"},{"line_number":6339,"context_line":"        bdm0 \u003d dict(values)"},{"line_number":6340,"context_line":"        bdm0[\u0027destination_type\u0027] \u003d \u0027camelot\u0027"},{"line_number":6341,"context_line":"        db.block_device_mapping_update_or_create(self.ctxt, bdm0,"},{"line_number":6342,"context_line":"                                                 legacy\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":24,"id":"df87a7cf_d9c6129b","line":6339,"range":{"start_line":6339,"start_character":15,"end_line":6339,"end_character":19},"in_reply_to":"df87a7cf_05874411","updated":"2017-12-08 09:55:12.000000000","message":"Looks like a quirk. I\u0027ll fix this up if I have to respin for any reason.","commit_id":"ff938da863251ebdc46bc6765200b4c64cf06524"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"2a01d07f69cd8e6e1b32ad36fed7a6a4d7f2874c","unresolved":false,"context_lines":[{"line_number":6336,"context_line":"        self.assertEqual(bdm_real[0][\u0027device_name\u0027], \u0027fake_name\u0027)"},{"line_number":6337,"context_line":""},{"line_number":6338,"context_line":"        # check update"},{"line_number":6339,"context_line":"        bdm0 \u003d dict(values)"},{"line_number":6340,"context_line":"        bdm0[\u0027destination_type\u0027] \u003d \u0027camelot\u0027"},{"line_number":6341,"context_line":"        db.block_device_mapping_update_or_create(self.ctxt, bdm0,"},{"line_number":6342,"context_line":"                                                 legacy\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":24,"id":"df87a7cf_2c70ed07","line":6339,"range":{"start_line":6339,"start_character":15,"end_line":6339,"end_character":19},"in_reply_to":"df87a7cf_d9c6129b","updated":"2017-12-11 13:45:25.000000000","message":"Done","commit_id":"ff938da863251ebdc46bc6765200b4c64cf06524"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"b9e746dc9dbc91a78a0d8f039bed3e0e9796ca4f","unresolved":false,"context_lines":[{"line_number":6387,"context_line":"        real_bdms \u003d db.block_device_mapping_get_all_by_instance("},{"line_number":6388,"context_line":"            self.ctxt, bdm[\u0027instance_uuid\u0027])"},{"line_number":6389,"context_line":"        self.assertEqual(1, len(real_bdms))"},{"line_number":6390,"context_line":"        self.assertEqual(\u0027foobar\u0027, real_bdms[0][\u0027device_name\u0027])"},{"line_number":6391,"context_line":""},{"line_number":6392,"context_line":"    def test_block_device_mapping_update_or_create_multiple_ephemeral(self):"},{"line_number":6393,"context_line":"        uuid \u003d self.instance[\u0027uuid\u0027]"}],"source_content_type":"text/x-python","patch_set":24,"id":"df87a7cf_a5d218ff","line":6390,"updated":"2017-12-07 15:47:16.000000000","message":"did we want to assert something about the uuid field of the real_bdms?","commit_id":"ff938da863251ebdc46bc6765200b4c64cf06524"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"2a01d07f69cd8e6e1b32ad36fed7a6a4d7f2874c","unresolved":false,"context_lines":[{"line_number":6387,"context_line":"        real_bdms \u003d db.block_device_mapping_get_all_by_instance("},{"line_number":6388,"context_line":"            self.ctxt, bdm[\u0027instance_uuid\u0027])"},{"line_number":6389,"context_line":"        self.assertEqual(1, len(real_bdms))"},{"line_number":6390,"context_line":"        self.assertEqual(\u0027foobar\u0027, real_bdms[0][\u0027device_name\u0027])"},{"line_number":6391,"context_line":""},{"line_number":6392,"context_line":"    def test_block_device_mapping_update_or_create_multiple_ephemeral(self):"},{"line_number":6393,"context_line":"        uuid \u003d self.instance[\u0027uuid\u0027]"}],"source_content_type":"text/x-python","patch_set":24,"id":"df87a7cf_4c069154","line":6390,"in_reply_to":"df87a7cf_39dffe3a","updated":"2017-12-11 13:45:25.000000000","message":"Done","commit_id":"ff938da863251ebdc46bc6765200b4c64cf06524"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"dfa1953fbb7e997a0061884337d5113acbf71005","unresolved":false,"context_lines":[{"line_number":6387,"context_line":"        real_bdms \u003d db.block_device_mapping_get_all_by_instance("},{"line_number":6388,"context_line":"            self.ctxt, bdm[\u0027instance_uuid\u0027])"},{"line_number":6389,"context_line":"        self.assertEqual(1, len(real_bdms))"},{"line_number":6390,"context_line":"        self.assertEqual(\u0027foobar\u0027, real_bdms[0][\u0027device_name\u0027])"},{"line_number":6391,"context_line":""},{"line_number":6392,"context_line":"    def test_block_device_mapping_update_or_create_multiple_ephemeral(self):"},{"line_number":6393,"context_line":"        uuid \u003d self.instance[\u0027uuid\u0027]"}],"source_content_type":"text/x-python","patch_set":24,"id":"df87a7cf_39dffe3a","line":6390,"in_reply_to":"df87a7cf_a5d218ff","updated":"2017-12-08 09:55:12.000000000","message":"I had to read this a couple of times myself (I don\u0027t think I wrote this one)...\n\nI don\u0027t think so. This is testing that we\u0027re correctly looking up the existing bdm for update by uuid. There\u0027s only 1 BDM in the db, because we only created one in this test, so we know we were returned the correct one. The interesting thing here is that we changed device_name, which previously wouldn\u0027t have been possible because it effectively formed part of the key.\n\nI\u0027ll add a comment if I have to respin, because I agree this isn\u0027t obvious at first glance.","commit_id":"ff938da863251ebdc46bc6765200b4c64cf06524"}]}
