)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8054451b4ad4558962df4b7951ac97a4ff7f2de","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2018-01-02 13:39:06 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add an online migration for PciDevice.uuid"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I47a27c17ec789a96e33c2e5ff8dd8b09ac74f600"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"9f91af0f_78dc1c74","line":8,"updated":"2018-01-02 16:39:00.000000000","message":"This should be part of blueprint: nested-resource-providers","commit_id":"235ae5c58c114a0e1ad2f8eaed26fdb7a3a3618f"}],"nova/objects/pci_device.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"59b399d8c65c3c1087a5fe79810c38c0ea226325","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        @db_api.pick_context_manager_reader"},{"line_number":197,"context_line":"        def get_devs_no_uuid(context):"},{"line_number":198,"context_line":"            return context.session.query(db_models.PciDevice).\\"},{"line_number":199,"context_line":"                    filter_by(uuid\u003dNone).limit(count).all()"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        db_devs \u003d get_devs_no_uuid(context)"},{"line_number":202,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9f91af0f_f8758c99","line":199,"updated":"2018-01-02 16:35:52.000000000","message":"Don\u0027t we need to filter out (soft) deleted records where deleted !\u003d 0? Can you load and save a deleted PciDevice object? At least requires a test if you\u0027re not going to filter out deleted records.","commit_id":"235ae5c58c114a0e1ad2f8eaed26fdb7a3a3618f"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"bd882b9399d49332a2aec007e401131ccb36a299","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        @db_api.pick_context_manager_reader"},{"line_number":197,"context_line":"        def get_devs_no_uuid(context):"},{"line_number":198,"context_line":"            return context.session.query(db_models.PciDevice).\\"},{"line_number":199,"context_line":"                    filter_by(uuid\u003dNone).limit(count).all()"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        db_devs \u003d get_devs_no_uuid(context)"},{"line_number":202,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9f91af0f_d84a087f","line":199,"in_reply_to":"9f91af0f_18ee3022","updated":"2018-01-02 17:10:54.000000000","message":"Hehe.\n\nAssuming that you\u0027re eventually planning to add a not null constraint to this column you actually need to populated deleted records. I\u0027ve added a test for it in the bdm uuid case: https://review.openstack.org/530774","commit_id":"235ae5c58c114a0e1ad2f8eaed26fdb7a3a3618f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7e21bba631f0169e9e639c17d15aa95510f4a439","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        @db_api.pick_context_manager_reader"},{"line_number":197,"context_line":"        def get_devs_no_uuid(context):"},{"line_number":198,"context_line":"            return context.session.query(db_models.PciDevice).\\"},{"line_number":199,"context_line":"                    filter_by(uuid\u003dNone).limit(count).all()"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        db_devs \u003d get_devs_no_uuid(context)"},{"line_number":202,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9f91af0f_18ee3022","line":199,"in_reply_to":"9f91af0f_f8758c99","updated":"2018-01-02 16:38:50.000000000","message":"Yup, I\u0027ll wait and copy what mdbooth does...er, I mean, figure this out","commit_id":"235ae5c58c114a0e1ad2f8eaed26fdb7a3a3618f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"2f24bd2cdc7ab06131b5ee71a014df90755c8040","unresolved":false,"context_lines":[{"line_number":24,"context_line":"import six"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"from nova.db import api as db"},{"line_number":27,"context_line":"from nova.db.sqlalchemy import api as db_api"},{"line_number":28,"context_line":"from nova.db.sqlalchemy import models as db_models"},{"line_number":29,"context_line":"from nova import exception"},{"line_number":30,"context_line":"from nova import objects"},{"line_number":31,"context_line":"from nova.objects import base"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f79a3b5_3778f52a","line":28,"range":{"start_line":27,"start_character":0,"end_line":28,"end_character":50},"updated":"2018-10-05 17:46:08.000000000","message":"At one point we said we would only violate this layering for api models, since all that code would be fresh and we wouldn\u0027t have a mix of calling into the db api and direct manipulation like this. I\u0027ve seen a couple places recently where we haven\u0027t done that, so I guess we\u0027re just going direct everywhere now.","commit_id":"7b65053f9f5a557fb007ad5d0ded1a9184e4aa2a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"2f24bd2cdc7ab06131b5ee71a014df90755c8040","unresolved":false,"context_lines":[{"line_number":241,"context_line":"            try:"},{"line_number":242,"context_line":"                query.update_on_match(compare, \u0027id\u0027, values)"},{"line_number":243,"context_line":"            except update_match.NoRowsMatched:"},{"line_number":244,"context_line":"                # We can only get here if we raced, and another writer already"},{"line_number":245,"context_line":"                # gave this bdm a uuid"},{"line_number":246,"context_line":"                result \u003d query.one()"},{"line_number":247,"context_line":"                uuid \u003d result[\u0027uuid\u0027]"},{"line_number":248,"context_line":"                assert(uuid is not None)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f79a3b5_97e6a9e7","line":245,"range":{"start_line":244,"start_character":16,"end_line":245,"end_character":38},"updated":"2018-10-05 17:46:08.000000000","message":"If this is true (and I think it is)...","commit_id":"7b65053f9f5a557fb007ad5d0ded1a9184e4aa2a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"2f24bd2cdc7ab06131b5ee71a014df90755c8040","unresolved":false,"context_lines":[{"line_number":245,"context_line":"                # gave this bdm a uuid"},{"line_number":246,"context_line":"                result \u003d query.one()"},{"line_number":247,"context_line":"                uuid \u003d result[\u0027uuid\u0027]"},{"line_number":248,"context_line":"                assert(uuid is not None)"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"        return uuid"},{"line_number":251,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3f79a3b5_17eb79a4","line":248,"updated":"2018-10-05 17:46:08.000000000","message":"...then we don\u0027t need this right?\n\nAnd, if there is some reason, don\u0027t we want to provide a reason? Otherwise we get something pretty unhelpful raised.","commit_id":"7b65053f9f5a557fb007ad5d0ded1a9184e4aa2a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ed4468f33653229b2015827d341e7db9f67e96af","unresolved":false,"context_lines":[{"line_number":245,"context_line":"                # gave this bdm a uuid"},{"line_number":246,"context_line":"                result \u003d query.one()"},{"line_number":247,"context_line":"                uuid \u003d result[\u0027uuid\u0027]"},{"line_number":248,"context_line":"                assert(uuid is not None)"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"        return uuid"},{"line_number":251,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3f79a3b5_05d4dce8","line":248,"in_reply_to":"3f79a3b5_17eb79a4","updated":"2018-10-16 09:27:22.000000000","message":"Good point. I\u0027m not aware of anything that could/would unset this attribute so this is essentially a no-op","commit_id":"7b65053f9f5a557fb007ad5d0ded1a9184e4aa2a"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2ea3de08d7d69966b7ebb341e17fa079d4566ed3","unresolved":false,"context_lines":[{"line_number":238,"context_line":"        # NOTE(mdbooth): We explicitly use an independent transaction context"},{"line_number":239,"context_line":"        # here so as not to fail if:"},{"line_number":240,"context_line":"        # 1. We retry."},{"line_number":241,"context_line":"        # 2. We\u0027re in a read transaction.This is an edge case of what\u0027s"},{"line_number":242,"context_line":"        #    normally a read operation. Forcing everything (transitively)"},{"line_number":243,"context_line":"        #    which reads a BDM to be in a write transaction for a narrow"},{"line_number":244,"context_line":"        #    temporary edge case is undesirable."}],"source_content_type":"text/x-python","patch_set":11,"id":"1f493fa4_d2515238","line":241,"range":{"start_line":241,"start_character":40,"end_line":241,"end_character":42},"updated":"2020-04-29 12:20:41.000000000","message":"nit missing space","commit_id":"5c42728326d5645c90d6a5702e1a10d7aaba0c3c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"469f76dbb8a6d81100a2aaefe639a50f7c614a04","unresolved":false,"context_lines":[{"line_number":238,"context_line":"        # NOTE(mdbooth): We explicitly use an independent transaction context"},{"line_number":239,"context_line":"        # here so as not to fail if:"},{"line_number":240,"context_line":"        # 1. We retry."},{"line_number":241,"context_line":"        # 2. We\u0027re in a read transaction.This is an edge case of what\u0027s"},{"line_number":242,"context_line":"        #    normally a read operation. Forcing everything (transitively)"},{"line_number":243,"context_line":"        #    which reads a BDM to be in a write transaction for a narrow"},{"line_number":244,"context_line":"        #    temporary edge case is undesirable."}],"source_content_type":"text/x-python","patch_set":11,"id":"1f493fa4_8d9791ec","line":241,"range":{"start_line":241,"start_character":40,"end_line":241,"end_character":42},"in_reply_to":"1f493fa4_d2515238","updated":"2020-04-30 13:49:37.000000000","message":"Done","commit_id":"5c42728326d5645c90d6a5702e1a10d7aaba0c3c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2ea3de08d7d69966b7ebb341e17fa079d4566ed3","unresolved":false,"context_lines":[{"line_number":240,"context_line":"        # 1. We retry."},{"line_number":241,"context_line":"        # 2. We\u0027re in a read transaction.This is an edge case of what\u0027s"},{"line_number":242,"context_line":"        #    normally a read operation. Forcing everything (transitively)"},{"line_number":243,"context_line":"        #    which reads a BDM to be in a write transaction for a narrow"},{"line_number":244,"context_line":"        #    temporary edge case is undesirable."},{"line_number":245,"context_line":"        tctxt \u003d db_api.get_context_manager(context).writer.independent"},{"line_number":246,"context_line":"        with tctxt.using(context):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f493fa4_32451671","line":243,"range":{"start_line":243,"start_character":27,"end_line":243,"end_character":30},"updated":"2020-04-29 12:20:41.000000000","message":"PciDevice","commit_id":"5c42728326d5645c90d6a5702e1a10d7aaba0c3c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"469f76dbb8a6d81100a2aaefe639a50f7c614a04","unresolved":false,"context_lines":[{"line_number":240,"context_line":"        # 1. We retry."},{"line_number":241,"context_line":"        # 2. We\u0027re in a read transaction.This is an edge case of what\u0027s"},{"line_number":242,"context_line":"        #    normally a read operation. Forcing everything (transitively)"},{"line_number":243,"context_line":"        #    which reads a BDM to be in a write transaction for a narrow"},{"line_number":244,"context_line":"        #    temporary edge case is undesirable."},{"line_number":245,"context_line":"        tctxt \u003d db_api.get_context_manager(context).writer.independent"},{"line_number":246,"context_line":"        with tctxt.using(context):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f493fa4_ada08d43","line":243,"range":{"start_line":243,"start_character":27,"end_line":243,"end_character":30},"in_reply_to":"1f493fa4_32451671","updated":"2020-04-30 13:49:37.000000000","message":"Done","commit_id":"5c42728326d5645c90d6a5702e1a10d7aaba0c3c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2ea3de08d7d69966b7ebb341e17fa079d4566ed3","unresolved":false,"context_lines":[{"line_number":251,"context_line":"                query.update_on_match(compare, \u0027id\u0027, values)"},{"line_number":252,"context_line":"            except update_match.NoRowsMatched:"},{"line_number":253,"context_line":"                # We can only get here if we raced, and another writer already"},{"line_number":254,"context_line":"                # gave this bdm a uuid"},{"line_number":255,"context_line":"                result \u003d query.one()"},{"line_number":256,"context_line":"                uuid \u003d result[\u0027uuid\u0027]"},{"line_number":257,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1f493fa4_72795ec6","line":254,"range":{"start_line":254,"start_character":28,"end_line":254,"end_character":31},"updated":"2020-04-29 12:20:41.000000000","message":"pci device","commit_id":"5c42728326d5645c90d6a5702e1a10d7aaba0c3c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"469f76dbb8a6d81100a2aaefe639a50f7c614a04","unresolved":false,"context_lines":[{"line_number":251,"context_line":"                query.update_on_match(compare, \u0027id\u0027, values)"},{"line_number":252,"context_line":"            except update_match.NoRowsMatched:"},{"line_number":253,"context_line":"                # We can only get here if we raced, and another writer already"},{"line_number":254,"context_line":"                # gave this bdm a uuid"},{"line_number":255,"context_line":"                result \u003d query.one()"},{"line_number":256,"context_line":"                uuid \u003d result[\u0027uuid\u0027]"},{"line_number":257,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1f493fa4_cdb6b98a","line":254,"range":{"start_line":254,"start_character":28,"end_line":254,"end_character":31},"in_reply_to":"1f493fa4_72795ec6","updated":"2020-04-30 13:49:37.000000000","message":"Done","commit_id":"5c42728326d5645c90d6a5702e1a10d7aaba0c3c"}],"nova/tests/unit/objects/test_pci_device.py":[{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"c67902cf7599ad35ec855a23dec33a0bf6797750","unresolved":false,"context_lines":[{"line_number":724,"context_line":"    @mock.patch.object(objects.PciDevice, \u0027_create_uuid\u0027,"},{"line_number":725,"context_line":"            wraps\u003dobjects.PciDevice._create_uuid)"},{"line_number":726,"context_line":"    def test_populate_uuid(self, mock_create_uuid):"},{"line_number":727,"context_line":"        dev \u003d self._create_legacy_dev(self.context)"},{"line_number":728,"context_line":"        devs \u003d objects.PciDeviceList.get_by_instance_uuid("},{"line_number":729,"context_line":"            self.context, uuids.instance_uuid)"},{"line_number":730,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9f91af0f_c40d5091","line":727,"range":{"start_line":727,"start_character":8,"end_line":727,"end_character":51},"updated":"2018-01-02 06:44:27.000000000","message":"local variable \u0027dev\u0027 is assigned to but never used","commit_id":"e2155a7d05899d8db07611003fd9041d7bf7fc81"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"2f24bd2cdc7ab06131b5ee71a014df90755c8040","unresolved":false,"context_lines":[{"line_number":729,"context_line":"            self.context, uuids.instance_uuid)"},{"line_number":730,"context_line":""},{"line_number":731,"context_line":"        # UUID should have been populated"},{"line_number":732,"context_line":"        uuid \u003d devs[0].uuid"},{"line_number":733,"context_line":"        self.assertIsNotNone(uuid)"},{"line_number":734,"context_line":""},{"line_number":735,"context_line":"        devs \u003d objects.PciDeviceList.get_by_instance_uuid("}],"source_content_type":"text/x-python","patch_set":7,"id":"3f79a3b5_b70e458d","line":732,"updated":"2018-10-05 17:46:08.000000000","message":"I think you want to assert it\u0027s in devs[0], so there is no question about a lazy load fixing it for you in this line.","commit_id":"7b65053f9f5a557fb007ad5d0ded1a9184e4aa2a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ed4468f33653229b2015827d341e7db9f67e96af","unresolved":false,"context_lines":[{"line_number":729,"context_line":"            self.context, uuids.instance_uuid)"},{"line_number":730,"context_line":""},{"line_number":731,"context_line":"        # UUID should have been populated"},{"line_number":732,"context_line":"        uuid \u003d devs[0].uuid"},{"line_number":733,"context_line":"        self.assertIsNotNone(uuid)"},{"line_number":734,"context_line":""},{"line_number":735,"context_line":"        devs \u003d objects.PciDeviceList.get_by_instance_uuid("}],"source_content_type":"text/x-python","patch_set":7,"id":"3f79a3b5_456ad41a","line":732,"in_reply_to":"3f79a3b5_b70e458d","updated":"2018-10-16 09:27:22.000000000","message":"Done","commit_id":"7b65053f9f5a557fb007ad5d0ded1a9184e4aa2a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"2f24bd2cdc7ab06131b5ee71a014df90755c8040","unresolved":false,"context_lines":[{"line_number":730,"context_line":""},{"line_number":731,"context_line":"        # UUID should have been populated"},{"line_number":732,"context_line":"        uuid \u003d devs[0].uuid"},{"line_number":733,"context_line":"        self.assertIsNotNone(uuid)"},{"line_number":734,"context_line":""},{"line_number":735,"context_line":"        devs \u003d objects.PciDeviceList.get_by_instance_uuid("},{"line_number":736,"context_line":"            self.context, uuids.instance_uuid)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f79a3b5_d713c1b6","line":733,"updated":"2018-10-05 17:46:08.000000000","message":"Also assert it\u0027s non-dirty? We have some other generation methods that just generate a thing and leave it dirty for the first save...","commit_id":"7b65053f9f5a557fb007ad5d0ded1a9184e4aa2a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"f08c84308efcd15c3e0f3015bf7dcf5f8e824e8f","unresolved":false,"context_lines":[{"line_number":730,"context_line":""},{"line_number":731,"context_line":"        # UUID should have been populated"},{"line_number":732,"context_line":"        uuid \u003d devs[0].uuid"},{"line_number":733,"context_line":"        self.assertIsNotNone(uuid)"},{"line_number":734,"context_line":""},{"line_number":735,"context_line":"        devs \u003d objects.PciDeviceList.get_by_instance_uuid("},{"line_number":736,"context_line":"            self.context, uuids.instance_uuid)"}],"source_content_type":"text/x-python","patch_set":7,"id":"dfbec78f_78549bfe","line":733,"in_reply_to":"3f79a3b5_21ac65ec","updated":"2019-05-14 15:51:50.000000000","message":"Aha, gotcha. Done","commit_id":"7b65053f9f5a557fb007ad5d0ded1a9184e4aa2a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4b644720dfd0bf33a3c8a48dc3a0173209c792cd","unresolved":false,"context_lines":[{"line_number":730,"context_line":""},{"line_number":731,"context_line":"        # UUID should have been populated"},{"line_number":732,"context_line":"        uuid \u003d devs[0].uuid"},{"line_number":733,"context_line":"        self.assertIsNotNone(uuid)"},{"line_number":734,"context_line":""},{"line_number":735,"context_line":"        devs \u003d objects.PciDeviceList.get_by_instance_uuid("},{"line_number":736,"context_line":"            self.context, uuids.instance_uuid)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f79a3b5_21ac65ec","line":733,"in_reply_to":"3f79a3b5_a5588888","updated":"2018-10-16 14:07:27.000000000","message":"In some id-generating translations, we have just set it on the object we\u0027re returning from a get, assuming that if the caller does anything meaningful with it, they will do a .save() on it eventually. So, since you\u0027re not doing that here, it just seems like it\u0027s worth asserting that it comes back non-dirty. So something like:\n\n self.assertNotIn(\u0027uuid\u0027, devs[0].obj_what_changed())","commit_id":"7b65053f9f5a557fb007ad5d0ded1a9184e4aa2a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ed4468f33653229b2015827d341e7db9f67e96af","unresolved":false,"context_lines":[{"line_number":730,"context_line":""},{"line_number":731,"context_line":"        # UUID should have been populated"},{"line_number":732,"context_line":"        uuid \u003d devs[0].uuid"},{"line_number":733,"context_line":"        self.assertIsNotNone(uuid)"},{"line_number":734,"context_line":""},{"line_number":735,"context_line":"        devs \u003d objects.PciDeviceList.get_by_instance_uuid("},{"line_number":736,"context_line":"            self.context, uuids.instance_uuid)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f79a3b5_a5588888","line":733,"in_reply_to":"3f79a3b5_d713c1b6","updated":"2018-10-16 09:27:22.000000000","message":"How does one assert it\u0027s non-dirty, assuming the retrieval function (get_by_instance_uuid) is the thing doing the dirtying?","commit_id":"7b65053f9f5a557fb007ad5d0ded1a9184e4aa2a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"2f24bd2cdc7ab06131b5ee71a014df90755c8040","unresolved":false,"context_lines":[{"line_number":762,"context_line":"        # existing uuid if we hit that race."},{"line_number":763,"context_line":"        uuid2 \u003d objects.PciDevice._create_uuid(self.context, dev.id)"},{"line_number":764,"context_line":""},{"line_number":765,"context_line":"        self.assertEqual(uuid1, uuid2)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f79a3b5_b75c0581","line":765,"updated":"2018-10-05 17:46:08.000000000","message":"This tests the creation routine, but AFAICT, if I replace the call to that routine with something else trivial, we won\u0027t fail to notice that we\u0027re no longer creating it and setting it in the DB before we return on get right?","commit_id":"7b65053f9f5a557fb007ad5d0ded1a9184e4aa2a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4b644720dfd0bf33a3c8a48dc3a0173209c792cd","unresolved":false,"context_lines":[{"line_number":762,"context_line":"        # existing uuid if we hit that race."},{"line_number":763,"context_line":"        uuid2 \u003d objects.PciDevice._create_uuid(self.context, dev.id)"},{"line_number":764,"context_line":""},{"line_number":765,"context_line":"        self.assertEqual(uuid1, uuid2)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f79a3b5_a1e63549","line":765,"in_reply_to":"3f79a3b5_258798b5","updated":"2018-10-16 14:07:27.000000000","message":"What I\u0027m saying is that this tests that _create_uuid() does the right thing, but we have no assertions anywhere else that asserts we ever call that from anywhere we expect. So, just add something that does a trivial call to _from_db_obj() with _create_uuid() mocked out to make sure we do (and continue to) call it.","commit_id":"7b65053f9f5a557fb007ad5d0ded1a9184e4aa2a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"f08c84308efcd15c3e0f3015bf7dcf5f8e824e8f","unresolved":false,"context_lines":[{"line_number":762,"context_line":"        # existing uuid if we hit that race."},{"line_number":763,"context_line":"        uuid2 \u003d objects.PciDevice._create_uuid(self.context, dev.id)"},{"line_number":764,"context_line":""},{"line_number":765,"context_line":"        self.assertEqual(uuid1, uuid2)"}],"source_content_type":"text/x-python","patch_set":7,"id":"dfbec78f_583f57b3","line":765,"in_reply_to":"3f79a3b5_a1e63549","updated":"2019-05-14 15:51:50.000000000","message":"Done","commit_id":"7b65053f9f5a557fb007ad5d0ded1a9184e4aa2a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ed4468f33653229b2015827d341e7db9f67e96af","unresolved":false,"context_lines":[{"line_number":762,"context_line":"        # existing uuid if we hit that race."},{"line_number":763,"context_line":"        uuid2 \u003d objects.PciDevice._create_uuid(self.context, dev.id)"},{"line_number":764,"context_line":""},{"line_number":765,"context_line":"        self.assertEqual(uuid1, uuid2)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f79a3b5_258798b5","line":765,"in_reply_to":"3f79a3b5_b75c0581","updated":"2018-10-16 09:27:22.000000000","message":"If I\u0027m understanding you correctly, you\u0027re suggesting it would be better to test the \u0027_from_db_object\u0027 function (i.e. what calls \u0027_create_uuid\u0027) rather than \u0027_create_uuid\u0027 directly? If so, that\u0027s true but I think this is as good as we can get. The check we have in that function [1] would prevent us from ever running this twice unless we were able to reproduce the race via some complicated, highly fallible threading.\n\n[1] https://review.openstack.org/#/c/530487/7/nova/objects/pci_device.py@197","commit_id":"7b65053f9f5a557fb007ad5d0ded1a9184e4aa2a"}]}
