)]}'
{"nova/db/sqlalchemy/migrate_repo/versions/391_add_volume_type_to_bdm.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1afc9bf7dbcffd75566734e15cf90d53fe967bc0","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    for prefix in (\u0027\u0027, \u0027shadow_\u0027):"},{"line_number":29,"context_line":"        table \u003d Table(prefix + BASE_TABLE_NAME, meta, autoload\u003dTrue)"},{"line_number":30,"context_line":"        new_column \u003d Column(NEW_COLUMN_NAME, String(255), nullable\u003dTrue)"},{"line_number":31,"context_line":"        if not hasattr(table.c, NEW_COLUMN_NAME):"},{"line_number":32,"context_line":"            table.create_column(new_column)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_9b29fd3b","line":30,"range":{"start_line":30,"start_character":52,"end_line":30,"end_character":55},"updated":"2018-09-24 13:59:13.000000000","message":"This should be 255 to allow passing the volume type name to nova, and that\u0027s the restriction on the volume type name in Cinder\u0027s API and DB model. Looking at the volume create API in cinder, they actually allow passing the volume type name or ID, so I\u0027m not sure what we should allow in the compute API - the name or the ID (or either)? I was initially thinking the name.","commit_id":"9f40db4de317c67a52200bbece5b7786d479c432"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d810f7e9f1c7b2dc705e627c846e2b6dbcdd8d07","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    for prefix in (\u0027\u0027, \u0027shadow_\u0027):"},{"line_number":29,"context_line":"        table \u003d Table(prefix + BASE_TABLE_NAME, meta, autoload\u003dTrue)"},{"line_number":30,"context_line":"        new_column \u003d Column(NEW_COLUMN_NAME, String(255), nullable\u003dTrue)"},{"line_number":31,"context_line":"        if not hasattr(table.c, NEW_COLUMN_NAME):"},{"line_number":32,"context_line":"            table.create_column(new_column)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_8679a183","line":30,"range":{"start_line":30,"start_character":52,"end_line":30,"end_character":55},"in_reply_to":"3f79a3b5_9b29fd3b","updated":"2018-09-24 15:57:58.000000000","message":"In talking with dansmith about this, he thinks nova should handle the user passing the volume type name or ID, so this would work in both cases, we just need to make sure we are properly documenting and handling that in the compute API code.","commit_id":"9f40db4de317c67a52200bbece5b7786d479c432"}],"nova/objects/block_device.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d810f7e9f1c7b2dc705e627c846e2b6dbcdd8d07","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        \u0027connection_info\u0027: fields.SensitiveStringField(nullable\u003dTrue),"},{"line_number":95,"context_line":"        \u0027tag\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":96,"context_line":"        \u0027attachment_id\u0027: fields.UUIDField(nullable\u003dTrue),"},{"line_number":97,"context_line":"        \u0027volume_type\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":98,"context_line":"    }"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_66900598","line":97,"updated":"2018-09-24 15:57:58.000000000","message":"Might be good to leave a comment that this field can be a volume type name or ID (UUID).","commit_id":"9f40db4de317c67a52200bbece5b7786d479c432"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"73ce29cf038f80cf9e5b9e15e4f13229e4af71d4","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        \u0027connection_info\u0027: fields.SensitiveStringField(nullable\u003dTrue),"},{"line_number":95,"context_line":"        \u0027tag\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":96,"context_line":"        \u0027attachment_id\u0027: fields.UUIDField(nullable\u003dTrue),"},{"line_number":97,"context_line":"        \u0027volume_type\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":98,"context_line":"    }"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_7cb4e682","line":97,"in_reply_to":"3f79a3b5_0bc1f14e","updated":"2018-09-26 13:20:43.000000000","message":"\u003e Don\u0027t do that, this will make things complicated.\n\nDon\u0027t do what? Store the name or the ID? I\u0027m proposing that the compute API just stores whatever the user requesetd, sort of like a request spec.","commit_id":"9f40db4de317c67a52200bbece5b7786d479c432"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"5d451b360ee904c7e8e1f8b1e764495976690f5f","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        \u0027connection_info\u0027: fields.SensitiveStringField(nullable\u003dTrue),"},{"line_number":95,"context_line":"        \u0027tag\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":96,"context_line":"        \u0027attachment_id\u0027: fields.UUIDField(nullable\u003dTrue),"},{"line_number":97,"context_line":"        \u0027volume_type\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":98,"context_line":"    }"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_72975447","line":97,"in_reply_to":"3f79a3b5_2790c042","updated":"2018-09-25 03:44:49.000000000","message":"I agree with this method. If there is only one id or name in DB, I prefer to store the name, I think which is more intuitive for nova. Or does the volume type id have other uses in nova?\n#TODO：These will be processed in the compute api.","commit_id":"9f40db4de317c67a52200bbece5b7786d479c432"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"5029d53eba7cfd9206d2a70266fd51be0ebc43c2","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        \u0027connection_info\u0027: fields.SensitiveStringField(nullable\u003dTrue),"},{"line_number":95,"context_line":"        \u0027tag\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":96,"context_line":"        \u0027attachment_id\u0027: fields.UUIDField(nullable\u003dTrue),"},{"line_number":97,"context_line":"        \u0027volume_type\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":98,"context_line":"    }"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_2790c042","line":97,"in_reply_to":"3f79a3b5_66900598","updated":"2018-09-25 02:22:46.000000000","message":"Are we going to save name or ID or do we save id only and do the transfer in API？ I mean if user provided type name, we check what the ID is, and only save the ID in DB?","commit_id":"9f40db4de317c67a52200bbece5b7786d479c432"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f7a11e48c5e227327c43a34ef91585ce4a3b334","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        \u0027connection_info\u0027: fields.SensitiveStringField(nullable\u003dTrue),"},{"line_number":95,"context_line":"        \u0027tag\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":96,"context_line":"        \u0027attachment_id\u0027: fields.UUIDField(nullable\u003dTrue),"},{"line_number":97,"context_line":"        \u0027volume_type\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":98,"context_line":"    }"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_477cdcb5","line":97,"in_reply_to":"3f79a3b5_66900598","updated":"2018-09-25 03:33:27.000000000","message":"Done","commit_id":"9f40db4de317c67a52200bbece5b7786d479c432"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e86236f1d492833decf4df04d368d677efc359a5","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        \u0027connection_info\u0027: fields.SensitiveStringField(nullable\u003dTrue),"},{"line_number":95,"context_line":"        \u0027tag\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":96,"context_line":"        \u0027attachment_id\u0027: fields.UUIDField(nullable\u003dTrue),"},{"line_number":97,"context_line":"        \u0027volume_type\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":98,"context_line":"    }"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_aa232206","line":97,"in_reply_to":"3f79a3b5_72975447","updated":"2018-09-25 21:34:40.000000000","message":"Storing the ID is probably a bad idea in case a volume type can be deleted and then recreated with the same name, we\u0027ll have a reference to a volume type that no longer exists. Think of this like the old problem in nova of creating a server with a given flavor, then deleting that flavor and recreating it - the ID would change but the flavor name would be the same. That\u0027s why we store a copy of the flavor within the instance so we don\u0027t have those lookup problems later. Anyway, we\u0027ll see what we need to do in the API - we don\u0027t need to worry about that in this change.","commit_id":"9f40db4de317c67a52200bbece5b7786d479c432"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"ce1710f2a8683fac57ec34865ebeed312b0dd22a","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        \u0027connection_info\u0027: fields.SensitiveStringField(nullable\u003dTrue),"},{"line_number":95,"context_line":"        \u0027tag\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":96,"context_line":"        \u0027attachment_id\u0027: fields.UUIDField(nullable\u003dTrue),"},{"line_number":97,"context_line":"        \u0027volume_type\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":98,"context_line":"    }"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_0bc1f14e","line":97,"in_reply_to":"3f79a3b5_7b415aa6","updated":"2018-09-26 08:30:47.000000000","message":"Don\u0027t do that, this will make things complicated.","commit_id":"9f40db4de317c67a52200bbece5b7786d479c432"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"eb43f82eda502a550009a5705ecaf68497e5cf6f","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        \u0027connection_info\u0027: fields.SensitiveStringField(nullable\u003dTrue),"},{"line_number":95,"context_line":"        \u0027tag\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":96,"context_line":"        \u0027attachment_id\u0027: fields.UUIDField(nullable\u003dTrue),"},{"line_number":97,"context_line":"        \u0027volume_type\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":98,"context_line":"    }"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_7b415aa6","line":97,"in_reply_to":"3f79a3b5_855c171a","updated":"2018-09-26 00:59:51.000000000","message":"Yeah, Also can be store both name and ID, like this \"name(ID)\". :P","commit_id":"9f40db4de317c67a52200bbece5b7786d479c432"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a981cb05bf31d6f67f4748f6ca6c158a88bee135","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        \u0027connection_info\u0027: fields.SensitiveStringField(nullable\u003dTrue),"},{"line_number":95,"context_line":"        \u0027tag\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":96,"context_line":"        \u0027attachment_id\u0027: fields.UUIDField(nullable\u003dTrue),"},{"line_number":97,"context_line":"        \u0027volume_type\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":98,"context_line":"    }"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_855c171a","line":97,"in_reply_to":"3f79a3b5_aa232206","updated":"2018-09-25 21:59:24.000000000","message":"Looking in the cinder code, you can\u0027t delete a volume type that is referenced by volumes (and by extension snapshots), group mappings or consistency groups, so we should be OK to store either the ID or name, in other words - whatever the user requested.","commit_id":"9f40db4de317c67a52200bbece5b7786d479c432"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d810f7e9f1c7b2dc705e627c846e2b6dbcdd8d07","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":101,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":102,"context_line":"        if target_version \u003c (1, 20) and \u0027volume_type\u0027 in primitive:"},{"line_number":103,"context_line":"            del primitive[\u0027volume_type\u0027]"},{"line_number":104,"context_line":"        if target_version \u003c (1, 19) and \u0027uuid\u0027 in primitive:"},{"line_number":105,"context_line":"            del primitive[\u0027uuid\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_26df6d67","line":102,"updated":"2018-09-24 15:57:58.000000000","message":"We should probably have a simple unit test for this.","commit_id":"9f40db4de317c67a52200bbece5b7786d479c432"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f7a11e48c5e227327c43a34ef91585ce4a3b334","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":101,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":102,"context_line":"        if target_version \u003c (1, 20) and \u0027volume_type\u0027 in primitive:"},{"line_number":103,"context_line":"            del primitive[\u0027volume_type\u0027]"},{"line_number":104,"context_line":"        if target_version \u003c (1, 19) and \u0027uuid\u0027 in primitive:"},{"line_number":105,"context_line":"            del primitive[\u0027uuid\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_a76ff0f8","line":102,"in_reply_to":"3f79a3b5_26df6d67","updated":"2018-09-25 03:33:27.000000000","message":"Done","commit_id":"9f40db4de317c67a52200bbece5b7786d479c432"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dff058f7ebb79be1289d33d43da87e9ec0dd59a9","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    # Version 1.17: Added tag field"},{"line_number":70,"context_line":"    # Version 1.18: Added attachment_id"},{"line_number":71,"context_line":"    # Version 1.19: Added uuid"},{"line_number":72,"context_line":"    # Version 1.20: Added volume_type field to BlockDeviceMapping."},{"line_number":73,"context_line":"    VERSION \u003d \u00271.20\u0027"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_65b45b37","line":72,"range":{"start_line":72,"start_character":37,"end_line":72,"end_character":66},"updated":"2018-09-25 22:02:33.000000000","message":"nit: this is redundant","commit_id":"5157d174af2dab329f925a82ad5ffd4115f4bb07"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"eb43f82eda502a550009a5705ecaf68497e5cf6f","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    # Version 1.17: Added tag field"},{"line_number":70,"context_line":"    # Version 1.18: Added attachment_id"},{"line_number":71,"context_line":"    # Version 1.19: Added uuid"},{"line_number":72,"context_line":"    # Version 1.20: Added volume_type field to BlockDeviceMapping."},{"line_number":73,"context_line":"    VERSION \u003d \u00271.20\u0027"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_3b63e243","line":72,"range":{"start_line":72,"start_character":37,"end_line":72,"end_character":66},"in_reply_to":"3f79a3b5_65b45b37","updated":"2018-09-26 00:59:51.000000000","message":"Done","commit_id":"5157d174af2dab329f925a82ad5ffd4115f4bb07"}],"nova/tests/unit/compute/test_compute_api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d810f7e9f1c7b2dc705e627c846e2b6dbcdd8d07","unresolved":false,"context_lines":[{"line_number":3202,"context_line":"                {\u0027no_device\u0027: False, \u0027volume_id\u0027: \u00271\u0027, \u0027boot_index\u0027: 0,"},{"line_number":3203,"context_line":"                 \u0027connection_info\u0027: \u0027inf\u0027, \u0027device_name\u0027: \u0027/dev/vda\u0027,"},{"line_number":3204,"context_line":"                 \u0027source_type\u0027: \u0027volume\u0027, \u0027destination_type\u0027: \u0027volume\u0027,"},{"line_number":3205,"context_line":"                 \u0027tag\u0027: None, \u0027volume_type\u0027: None})"},{"line_number":3206,"context_line":"        instance_bdms.append(bdm)"},{"line_number":3207,"context_line":""},{"line_number":3208,"context_line":"        expect_meta[\u0027properties\u0027][\u0027bdm_v2\u0027] \u003d True"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_86ee811f","line":3205,"updated":"2018-09-24 15:57:58.000000000","message":"The changes like this in this test module don\u0027t seem necessary for this patch which is just adding the DB model changes and versioned object field. Let\u0027s keep test_compute_api changes to the patch that actually updates the REST API.","commit_id":"9f40db4de317c67a52200bbece5b7786d479c432"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f7a11e48c5e227327c43a34ef91585ce4a3b334","unresolved":false,"context_lines":[{"line_number":3202,"context_line":"                {\u0027no_device\u0027: False, \u0027volume_id\u0027: \u00271\u0027, \u0027boot_index\u0027: 0,"},{"line_number":3203,"context_line":"                 \u0027connection_info\u0027: \u0027inf\u0027, \u0027device_name\u0027: \u0027/dev/vda\u0027,"},{"line_number":3204,"context_line":"                 \u0027source_type\u0027: \u0027volume\u0027, \u0027destination_type\u0027: \u0027volume\u0027,"},{"line_number":3205,"context_line":"                 \u0027tag\u0027: None, \u0027volume_type\u0027: None})"},{"line_number":3206,"context_line":"        instance_bdms.append(bdm)"},{"line_number":3207,"context_line":""},{"line_number":3208,"context_line":"        expect_meta[\u0027properties\u0027][\u0027bdm_v2\u0027] \u003d True"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_722e748d","line":3205,"in_reply_to":"3f79a3b5_86ee811f","updated":"2018-09-25 03:33:27.000000000","message":"Ok, remove it.","commit_id":"9f40db4de317c67a52200bbece5b7786d479c432"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dff058f7ebb79be1289d33d43da87e9ec0dd59a9","unresolved":false,"context_lines":[{"line_number":3214,"context_line":"             \u0027device_type\u0027: None, \u0027snapshot_id\u0027: \u00271-snapshot\u0027,"},{"line_number":3215,"context_line":"             \u0027device_name\u0027: \u0027/dev/vda\u0027,"},{"line_number":3216,"context_line":"             \u0027destination_type\u0027: \u0027volume\u0027, \u0027delete_on_termination\u0027: False,"},{"line_number":3217,"context_line":"             \u0027tag\u0027: None, \u0027volume_type\u0027: None})"},{"line_number":3218,"context_line":""},{"line_number":3219,"context_line":"        limits_patcher \u003d mock.patch.object("},{"line_number":3220,"context_line":"            self.compute_api.volume_api, \u0027get_absolute_limits\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_057fa766","line":3217,"updated":"2018-09-25 22:02:33.000000000","message":"Can\u0027t we remove all changes to this file? You removed one unnecessary change from this patch, but can\u0027t we just remove all changes from this module in this change and leave any test changes needed to this module until the actual patch that adds the API support?","commit_id":"5157d174af2dab329f925a82ad5ffd4115f4bb07"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0292ed3824102ae25db0aad408dd85936d800320","unresolved":false,"context_lines":[{"line_number":3214,"context_line":"             \u0027device_type\u0027: None, \u0027snapshot_id\u0027: \u00271-snapshot\u0027,"},{"line_number":3215,"context_line":"             \u0027device_name\u0027: \u0027/dev/vda\u0027,"},{"line_number":3216,"context_line":"             \u0027destination_type\u0027: \u0027volume\u0027, \u0027delete_on_termination\u0027: False,"},{"line_number":3217,"context_line":"             \u0027tag\u0027: None, \u0027volume_type\u0027: None})"},{"line_number":3218,"context_line":""},{"line_number":3219,"context_line":"        limits_patcher \u003d mock.patch.object("},{"line_number":3220,"context_line":"            self.compute_api.volume_api, \u0027get_absolute_limits\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_25ce63b7","line":3217,"in_reply_to":"3f79a3b5_057fa766","updated":"2018-09-25 22:07:00.000000000","message":"Hmm, in removing the changes to this module I am seeing some tests failing, e.g.:\n\nnova.tests.unit.compute.test_compute_api.ComputeAPIUnitTestCase.test_snapshot_volume_backed_with_quiesce_stopped\n----------------------------------------------------------------------------------------------------------------\n\nCaptured stderr:\n~~~~~~~~~~~~~~~~\n    b\"/home/osboxes/git/nova/nova/test.py:299: DeprecationWarning: Using class \u0027MoxStubout\u0027 (either directly or via inheritance) is deprecated in version \u00273.5.0\u0027\"\n    b\u0027  mox_fixture \u003d self.useFixture(moxstubout.MoxStubout())\u0027\n    b\u0027\u0027\n\nCaptured traceback:\n~~~~~~~~~~~~~~~~~~~\n    b\u0027Traceback (most recent call last):\u0027\n    b\u0027  File \"/home/osboxes/git/nova/nova/tests/unit/compute/test_compute_api.py\", line 3355, in test_snapshot_volume_backed_with_quiesce_stopped\u0027\n    b\u0027    vm_state\u003dvm_states.STOPPED)\u0027\n    b\u0027  File \"/home/osboxes/git/nova/nova/tests/unit/compute/test_compute_api.py\", line 3236, in _test_snapshot_volume_backed\u0027\n    b\"    self.context, instance, \u0027test-snapshot\u0027)\"\n    b\u0027  File \"/home/osboxes/git/nova/nova/compute/api.py\", line 152, in inner\u0027\n    b\u0027    return f(self, context, instance, *args, **kw)\u0027\n    b\u0027  File \"/home/osboxes/git/nova/nova/compute/api.py\", line 3030, in snapshot_volume_backed\u0027\n    b\u0027    return self.image_api.create(context, image_meta)\u0027\n    b\u0027  File \"/home/osboxes/git/nova/.tox/py35/lib/python3.5/site-packages/fixtures/_fixtures/monkeypatch.py\", line 89, in avoid_get\u0027\n    b\u0027    return captured_method(*args, **kwargs)\u0027\n    b\u0027  File \"/home/osboxes/git/nova/nova/tests/unit/compute/test_compute_api.py\", line 3144, in fake_image_create\u0027\n    b\u0027    self.assertThat(image_meta, matchers.DictMatches(expect_meta))\u0027\n    b\u0027  File \"/home/osboxes/git/nova/.tox/py35/lib/python3.5/site-packages/testtools/testcase.py\", line 498, in assertThat\u0027\n    b\u0027    raise mismatch_error\u0027\n    b\"testtools.matchers._impl.MismatchError: Dictionaries do not match at block_device_mapping. d1: [{\u0027boot_index\u0027: 0, \u0027delete_on_termination\u0027: False, \u0027device_type\u0027: None, \u0027destination_type\u0027: \u0027volume\u0027, \u0027device_name\u0027: \u0027/dev/vda\u0027, \u0027tag\u0027: None, \u0027no_device\u0027: None, \u0027volume_id\u0027: None, \u0027image_id\u0027: None, \u0027volume_size\u0027: None, \u0027disk_bus\u0027: None, \u0027snapshot_id\u0027: \u00271-snapshot\u0027, \u0027source_type\u0027: \u0027snapshot\u0027, \u0027guest_format\u0027: None}] d2: [{\u0027boot_index\u0027: 0, \u0027tag\u0027: None, \u0027no_device\u0027: None, \u0027volume_type\u0027: None, \u0027image_id\u0027: None, \u0027source_type\u0027: \u0027snapshot\u0027, \u0027device_name\u0027: \u0027/dev/vda\u0027, \u0027delete_on_termination\u0027: False, \u0027device_type\u0027: None, \u0027volume_id\u0027: None, \u0027volume_size\u0027: None, \u0027disk_bus\u0027: None, \u0027snapshot_id\u0027: \u00271-snapshot\u0027, \u0027destination_type\u0027: \u0027volume\u0027, \u0027guest_format\u0027: None}]\"\n    b\u0027\u0027","commit_id":"5157d174af2dab329f925a82ad5ffd4115f4bb07"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"eb43f82eda502a550009a5705ecaf68497e5cf6f","unresolved":false,"context_lines":[{"line_number":3214,"context_line":"             \u0027device_type\u0027: None, \u0027snapshot_id\u0027: \u00271-snapshot\u0027,"},{"line_number":3215,"context_line":"             \u0027device_name\u0027: \u0027/dev/vda\u0027,"},{"line_number":3216,"context_line":"             \u0027destination_type\u0027: \u0027volume\u0027, \u0027delete_on_termination\u0027: False,"},{"line_number":3217,"context_line":"             \u0027tag\u0027: None, \u0027volume_type\u0027: None})"},{"line_number":3218,"context_line":""},{"line_number":3219,"context_line":"        limits_patcher \u003d mock.patch.object("},{"line_number":3220,"context_line":"            self.compute_api.volume_api, \u0027get_absolute_limits\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_1b5e2679","line":3217,"in_reply_to":"3f79a3b5_25ce63b7","updated":"2018-09-26 00:59:51.000000000","message":"Yeah, there are some tests need to change, so only the key ones are modified in this patch, and others are modified in the compute API.","commit_id":"5157d174af2dab329f925a82ad5ffd4115f4bb07"}],"nova/tests/unit/db/test_migrations.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d810f7e9f1c7b2dc705e627c846e2b6dbcdd8d07","unresolved":false,"context_lines":[{"line_number":1010,"context_line":"                                \u0027trusted_certs\u0027)"},{"line_number":1011,"context_line":""},{"line_number":1012,"context_line":"    def _check_391(self, engine, data):"},{"line_number":1013,"context_line":"        self.assertColumnExists(engine, \u0027block_device_mapping\u0027, \u0027volume_type\u0027)"},{"line_number":1014,"context_line":""},{"line_number":1015,"context_line":""},{"line_number":1016,"context_line":"class TestNovaMigrationsSQLite(NovaMigrationsCheckers,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_a6f37d09","line":1013,"updated":"2018-09-24 15:57:58.000000000","message":"Also assert the column exists in shadow_block_device_mapping.","commit_id":"9f40db4de317c67a52200bbece5b7786d479c432"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f7a11e48c5e227327c43a34ef91585ce4a3b334","unresolved":false,"context_lines":[{"line_number":1010,"context_line":"                                \u0027trusted_certs\u0027)"},{"line_number":1011,"context_line":""},{"line_number":1012,"context_line":"    def _check_391(self, engine, data):"},{"line_number":1013,"context_line":"        self.assertColumnExists(engine, \u0027block_device_mapping\u0027, \u0027volume_type\u0027)"},{"line_number":1014,"context_line":""},{"line_number":1015,"context_line":""},{"line_number":1016,"context_line":"class TestNovaMigrationsSQLite(NovaMigrationsCheckers,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_1297009f","line":1013,"in_reply_to":"3f79a3b5_a6f37d09","updated":"2018-09-25 03:33:27.000000000","message":"Done","commit_id":"9f40db4de317c67a52200bbece5b7786d479c432"}]}
