)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"4c62a2bba345fd7f6b2ed63208921ec043a8a47b","unresolved":false,"context_lines":[{"line_number":11,"context_line":"dict."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Update the virt drivers to convert the dict into an ImageMeta"},{"line_number":14,"context_line":"module, as a stepping stone, until they to are converted to"},{"line_number":15,"context_line":"use ImageMeta throughout."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: Iac034d864cd0265759aaa7c8049fafa276763cc0"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"3a50d1a3_7faa4e1b","line":14,"updated":"2015-07-20 11:28:48.000000000","message":"s/module/object :)","commit_id":"3a6747d52454b964b2a4f02a4326921e843df29c"}],"nova/compute/claims.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d54387f50a6995bfa02e79a996b8cf467a00dcd7","unresolved":false,"context_lines":[{"line_number":267,"context_line":"                 resources, overhead\u003dNone, limits\u003dNone):"},{"line_number":268,"context_line":"        self.context \u003d context"},{"line_number":269,"context_line":"        self.instance_type \u003d instance_type"},{"line_number":270,"context_line":"        self.image_meta \u003d image_meta"},{"line_number":271,"context_line":"        super(ResizeClaim, self).__init__(context, instance, tracker,"},{"line_number":272,"context_line":"                                          resources, overhead\u003doverhead,"},{"line_number":273,"context_line":"                                          limits\u003dlimits)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3afb71cf_1c4e02c1","line":270,"updated":"2015-06-10 13:47:21.000000000","message":"would it be worthwhile considering changing this to the object? insetad of in line 287","commit_id":"faf8750c6b2c72a7a06d9d4173a62596323ad98f"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"c742c758e70b857613006edad0b5d71757d7d12b","unresolved":false,"context_lines":[{"line_number":267,"context_line":"                 resources, overhead\u003dNone, limits\u003dNone):"},{"line_number":268,"context_line":"        self.context \u003d context"},{"line_number":269,"context_line":"        self.instance_type \u003d instance_type"},{"line_number":270,"context_line":"        self.image_meta \u003d image_meta"},{"line_number":271,"context_line":"        super(ResizeClaim, self).__init__(context, instance, tracker,"},{"line_number":272,"context_line":"                                          resources, overhead\u003doverhead,"},{"line_number":273,"context_line":"                                          limits\u003dlimits)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3afb71cf_f7d69f26","line":270,"in_reply_to":"3afb71cf_1c4e02c1","updated":"2015-06-10 13:51:58.000000000","message":"I felt it preferrable to delay it, so if the conversion to an object raises an exception (eg due to illegal user data), we see the exception at the time we use the data, rather than when we instantiate the ResizeClaim","commit_id":"faf8750c6b2c72a7a06d9d4173a62596323ad98f"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"50afe9ab9a635f96d00d8d48d676cd5b68fb1b41","unresolved":false,"context_lines":[{"line_number":267,"context_line":"                 resources, overhead\u003dNone, limits\u003dNone):"},{"line_number":268,"context_line":"        self.context \u003d context"},{"line_number":269,"context_line":"        self.instance_type \u003d instance_type"},{"line_number":270,"context_line":"        self.image_meta \u003d image_meta"},{"line_number":271,"context_line":"        super(ResizeClaim, self).__init__(context, instance, tracker,"},{"line_number":272,"context_line":"                                          resources, overhead\u003doverhead,"},{"line_number":273,"context_line":"                                          limits\u003dlimits)"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa32b979_68446c1a","line":270,"in_reply_to":"3afb71cf_f7d69f26","updated":"2015-06-17 05:09:34.000000000","message":"Readability and aesthetics-wise, I think I\u0027m with Gary, but I don\u0027t have a problem if it\u0027s kept this way too.","commit_id":"faf8750c6b2c72a7a06d9d4173a62596323ad98f"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"ad6650064f0d8f7aaddb472f57ed26988dcbbeb6","unresolved":false,"context_lines":[{"line_number":267,"context_line":"                 resources, overhead\u003dNone, limits\u003dNone):"},{"line_number":268,"context_line":"        self.context \u003d context"},{"line_number":269,"context_line":"        self.instance_type \u003d instance_type"},{"line_number":270,"context_line":"        self.image_meta \u003d image_meta"},{"line_number":271,"context_line":"        super(ResizeClaim, self).__init__(context, instance, tracker,"},{"line_number":272,"context_line":"                                          resources, overhead\u003doverhead,"},{"line_number":273,"context_line":"                                          limits\u003dlimits)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba3cc151_f170e7de","line":270,"updated":"2015-07-05 06:36:14.000000000","message":"I think that is would be better to do the conversions here\nself.image_meta \u003d objects.ImageMeta.from_dict(image_meta)\n\nThe we only need to do it when the object is created and not every time that the numa_topology is accessed.","commit_id":"3a6747d52454b964b2a4f02a4326921e843df29c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"4c62a2bba345fd7f6b2ed63208921ec043a8a47b","unresolved":false,"context_lines":[{"line_number":267,"context_line":"                 resources, overhead\u003dNone, limits\u003dNone):"},{"line_number":268,"context_line":"        self.context \u003d context"},{"line_number":269,"context_line":"        self.instance_type \u003d instance_type"},{"line_number":270,"context_line":"        self.image_meta \u003d image_meta"},{"line_number":271,"context_line":"        super(ResizeClaim, self).__init__(context, instance, tracker,"},{"line_number":272,"context_line":"                                          resources, overhead\u003doverhead,"},{"line_number":273,"context_line":"                                          limits\u003dlimits)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a50d1a3_5f1d1272","line":270,"in_reply_to":"ba3cc151_f170e7de","updated":"2015-07-20 11:28:48.000000000","message":"Actually, it would be better to just pass image_meta as an ImageMeta object. But, as Dan mentioned in the commit message, this is just a stepping stone until proper conversion can be done at the top level..","commit_id":"3a6747d52454b964b2a4f02a4326921e843df29c"}],"nova/compute/resource_tracker.py":[{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"ec2219b321ebb65cecc21b48e60325154e99f26a","unresolved":false,"context_lines":[{"line_number":246,"context_line":"                instance_type \u003d self._get_instance_type(ctxt, instance, prefix)"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"            if image_meta is None:"},{"line_number":249,"context_line":"                image_meta \u003d utils.get_image_from_system_metadata("},{"line_number":250,"context_line":"                        instance[\u0027system_metadata\u0027])"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"            if (instance_type is not None and"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa32b979_d200c904","side":"PARENT","line":249,"updated":"2015-06-23 15:48:23.000000000","message":"It\u0027s probably better to get image meta directly from instance here.\n\n  image_meta \u003d objects.ImageMeta.from_instance(instance)\n\nThen you can remove the line 254","commit_id":"e3ec26434da490af2ea02bb9918a48b40b62ac40"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"d08c587c95c015b3a3773c834909693354a8e73e","unresolved":false,"context_lines":[{"line_number":246,"context_line":"                instance_type \u003d self._get_instance_type(ctxt, instance, prefix)"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"            if image_meta is None:"},{"line_number":249,"context_line":"                image_meta \u003d utils.get_image_from_system_metadata("},{"line_number":250,"context_line":"                        instance[\u0027system_metadata\u0027])"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"            if (instance_type is not None and"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa32b979_cc8697b8","side":"PARENT","line":249,"in_reply_to":"fa32b979_8e172aa2","updated":"2015-06-25 08:43:25.000000000","message":"I think it makes difference - We probably want to avoid using this method in future and perhaps move it to be private of the class objects.ImageMeta at the end.","commit_id":"e3ec26434da490af2ea02bb9918a48b40b62ac40"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"1424381e0db527f19b1dc0373a1f2894166fd954","unresolved":false,"context_lines":[{"line_number":246,"context_line":"                instance_type \u003d self._get_instance_type(ctxt, instance, prefix)"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"            if image_meta is None:"},{"line_number":249,"context_line":"                image_meta \u003d utils.get_image_from_system_metadata("},{"line_number":250,"context_line":"                        instance[\u0027system_metadata\u0027])"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"            if (instance_type is not None and"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa32b979_8e172aa2","side":"PARENT","line":249,"in_reply_to":"fa32b979_d200c904","updated":"2015-06-25 06:04:23.000000000","message":"i am not sure that this actually makes a different now.","commit_id":"e3ec26434da490af2ea02bb9918a48b40b62ac40"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"ec2219b321ebb65cecc21b48e60325154e99f26a","unresolved":false,"context_lines":[{"line_number":700,"context_line":"                    migration.old_instance_type_id)"},{"line_number":701,"context_line":""},{"line_number":702,"context_line":"        if image_meta is None:"},{"line_number":703,"context_line":"            image_meta \u003d utils.get_image_from_system_metadata("},{"line_number":704,"context_line":"                    instance[\u0027system_metadata\u0027])"},{"line_number":705,"context_line":""},{"line_number":706,"context_line":"        if itype:"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa32b979_ad05a611","side":"PARENT","line":703,"updated":"2015-06-23 15:48:23.000000000","message":"ditto","commit_id":"e3ec26434da490af2ea02bb9918a48b40b62ac40"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0fc479b1dc46a194354794e60e9d07158ef66d40","unresolved":false,"context_lines":[{"line_number":245,"context_line":"            if image_meta is None:"},{"line_number":246,"context_line":"                image_meta \u003d objects.ImageMeta.from_instance(instance)"},{"line_number":247,"context_line":"            else:"},{"line_number":248,"context_line":"                image_meta \u003d objects.ImageMeta.from_dict(image_meta)"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"            if (instance_type is not None and"},{"line_number":251,"context_line":"                instance_type.id \u003d\u003d itype[\u0027id\u0027]):"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a50d1a3_52a08b90","line":248,"updated":"2015-07-24 20:14:46.000000000","message":"Couldn\u0027t image_meta passed in here at some point be an ImageMeta object?  Shouldn\u0027t we have a type check shim until the RT is converted to objects?","commit_id":"58196e2f705b38f7509348a67230e7f91e3276a2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"93a9ba5d7966a520d91d7732b05db8b86c4b6267","unresolved":false,"context_lines":[{"line_number":245,"context_line":"            if image_meta is None:"},{"line_number":246,"context_line":"                image_meta \u003d objects.ImageMeta.from_instance(instance)"},{"line_number":247,"context_line":"            else:"},{"line_number":248,"context_line":"                image_meta \u003d objects.ImageMeta.from_dict(image_meta)"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"            if (instance_type is not None and"},{"line_number":251,"context_line":"                instance_type.id \u003d\u003d itype[\u0027id\u0027]):"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a50d1a3_92ecd390","line":248,"in_reply_to":"3a50d1a3_52a08b90","updated":"2015-07-24 20:24:07.000000000","message":"BTW, those are rhetorical questions.  I realize there are later changes in the series to pass in ImageMeta objects, but until those land we should have compat shims in here that do type checking with a TODO to remove the shim in the change that converts to passing in objects.  We can\u0027t assume this stuff is all going to land bang bang bang in order, and in the meantime people can introduce bugs by passing in the wrong thing and making the wrong assumptions.","commit_id":"58196e2f705b38f7509348a67230e7f91e3276a2"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"25420e6136a526173988904e5281b995bc2e40ae","unresolved":false,"context_lines":[{"line_number":245,"context_line":"            if image_meta is None:"},{"line_number":246,"context_line":"                image_meta \u003d objects.ImageMeta.from_instance(instance)"},{"line_number":247,"context_line":"            else:"},{"line_number":248,"context_line":"                image_meta \u003d objects.ImageMeta.from_dict(image_meta)"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"            if (instance_type is not None and"},{"line_number":251,"context_line":"                instance_type.id \u003d\u003d itype[\u0027id\u0027]):"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a50d1a3_63aa9b87","line":248,"in_reply_to":"3a50d1a3_92ecd390","updated":"2015-07-24 22:11:32.000000000","message":"Done","commit_id":"58196e2f705b38f7509348a67230e7f91e3276a2"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"cee5afa6d589c66849d67f8791dd6e802f0aa40f","unresolved":false,"context_lines":[{"line_number":666,"context_line":"        if image_meta is None:"},{"line_number":667,"context_line":"            image_meta \u003d objects.ImageMeta.from_instance(instance)"},{"line_number":668,"context_line":"        else:"},{"line_number":669,"context_line":"            image_meta \u003d objects.ImageMeta.from_dict(image_meta)"},{"line_number":670,"context_line":""},{"line_number":671,"context_line":"        if itype:"},{"line_number":672,"context_line":"            host_topology \u003d self.compute_node.get(\u0027numa_topology\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a50d1a3_ed2f4786","line":669,"updated":"2015-07-27 14:14:30.000000000","message":"does this not have the same issue as above code, where we could already be passed in an image_meta object?\n\nI think it might depend on when the RT gets converted to use the image meta object, which I presume is not now, else this would fail?","commit_id":"5d842f52efe2c3736ed460a14c09ae79aa701bb4"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2b5bd5ee5854003a4ec54c65bcdb1f679d9530af","unresolved":false,"context_lines":[{"line_number":668,"context_line":"        # TODO(jaypipes): Remove when image_meta is always passed"},{"line_number":669,"context_line":"        # as an objects.ImageMeta"},{"line_number":670,"context_line":"        elif not isinstance(image_meta, objects.ImageMeta):"},{"line_number":671,"context_line":"            image_meta \u003d objects.ImageMeta.from_dict(image_meta)"},{"line_number":672,"context_line":""},{"line_number":673,"context_line":"        if itype:"},{"line_number":674,"context_line":"            host_topology \u003d self.compute_node.get(\u0027numa_topology\u0027)"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a50d1a3_51e9c97d","line":671,"updated":"2015-07-29 11:22:41.000000000","message":"ah, sweet, thank you.","commit_id":"36d37a670ea6c82aa37318898c43bb657e47128c"}],"nova/test.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ed7a0ab61de86140d0f4e0252741ec0b94e855cf","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        self.assertEqual(expected_name, func.__hook_name__)"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"class MatchType(object):"},{"line_number":394,"context_line":"    \"\"\"Matches any instance of a specified type"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"    The MatchType class is a helper for use with the"}],"source_content_type":"text/x-python","patch_set":4,"id":"3afb71cf_23e66f44","line":393,"updated":"2015-06-09 15:43:33.000000000","message":"I think I would have put this in a separate patch, just for scope and in case we had to revert this or something.","commit_id":"8593326cb7478e62f0fed9e6eb00626ce9ba3726"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"76d0197465e5ed3b754d4de286d9fbd64450098e","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        self.assertEqual(expected_name, func.__hook_name__)"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"class MatchType(object):"},{"line_number":394,"context_line":"    \"\"\"Matches any instance of a specified type"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"    The MatchType class is a helper for use with the"}],"source_content_type":"text/x-python","patch_set":4,"id":"3afb71cf_96cd3b87","line":393,"in_reply_to":"3afb71cf_23e66f44","updated":"2015-06-10 08:57:53.000000000","message":"Since I have to respin, I\u0027ll split this.","commit_id":"8593326cb7478e62f0fed9e6eb00626ce9ba3726"}],"nova/tests/unit/compute/test_compute.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ed7a0ab61de86140d0f4e0252741ec0b94e855cf","unresolved":false,"context_lines":[{"line_number":7194,"context_line":"                                   security_group_api\u003dself.security_group_api)"},{"line_number":7195,"context_line":"        self.fake_image \u003d {"},{"line_number":7196,"context_line":"            \u0027id\u0027: 1,"},{"line_number":7197,"context_line":"            \u0027name\u0027: \u0027fake_nam111e\u0027,"},{"line_number":7198,"context_line":"            \u0027status\u0027: \u0027active\u0027,"},{"line_number":7199,"context_line":"            \u0027properties\u0027: {\u0027kernel_id\u0027: \u0027fake_kernel_id\u0027,"},{"line_number":7200,"context_line":"                           \u0027ramdisk_id\u0027: \u0027fake_ramdisk_id\u0027},"}],"source_content_type":"text/x-python","patch_set":4,"id":"3afb71cf_43c4cb8f","line":7197,"range":{"start_line":7197,"start_character":29,"end_line":7197,"end_character":32},"updated":"2015-06-09 15:43:33.000000000","message":"Hmm, was this an intentional change? If so, a comment about the, um, oddness about the name would probably be good :)","commit_id":"8593326cb7478e62f0fed9e6eb00626ce9ba3726"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"76d0197465e5ed3b754d4de286d9fbd64450098e","unresolved":false,"context_lines":[{"line_number":7194,"context_line":"                                   security_group_api\u003dself.security_group_api)"},{"line_number":7195,"context_line":"        self.fake_image \u003d {"},{"line_number":7196,"context_line":"            \u0027id\u0027: 1,"},{"line_number":7197,"context_line":"            \u0027name\u0027: \u0027fake_nam111e\u0027,"},{"line_number":7198,"context_line":"            \u0027status\u0027: \u0027active\u0027,"},{"line_number":7199,"context_line":"            \u0027properties\u0027: {\u0027kernel_id\u0027: \u0027fake_kernel_id\u0027,"},{"line_number":7200,"context_line":"                           \u0027ramdisk_id\u0027: \u0027fake_ramdisk_id\u0027},"}],"source_content_type":"text/x-python","patch_set":4,"id":"3afb71cf_b6e957e8","line":7197,"in_reply_to":"3afb71cf_43c4cb8f","updated":"2015-06-10 08:57:53.000000000","message":"Haha, no, this is left over from my trying to debug something bizarre.","commit_id":"8593326cb7478e62f0fed9e6eb00626ce9ba3726"}],"nova/tests/unit/virt/libvirt/test_driver.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"efae8d82ee1ad972462eab6a52107f8edbf605e9","unresolved":false,"context_lines":[{"line_number":2541,"context_line":"        self.assertEqual(\"tcp\", cfg.devices[3].type)"},{"line_number":2542,"context_line":"        self.assertEqual(\"tcp\", cfg.devices[4].type)"},{"line_number":2543,"context_line":""},{"line_number":2544,"context_line":"    def test_get_guest_config_serial_console_invalid_img_meta(self):"},{"line_number":2545,"context_line":"        self.flags(enabled\u003dTrue, group\u003d\u0027serial_console\u0027)"},{"line_number":2546,"context_line":""},{"line_number":2547,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a50d1a3_3047c21e","side":"PARENT","line":2544,"updated":"2015-07-27 14:44:23.000000000","message":"bit worried about why we need to loose these tests","commit_id":"ce556f0938054352343b0c6f9e412d8c44024002"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"01dc8c1a3173e7cf8fde91a00c31c1e4f793893b","unresolved":false,"context_lines":[{"line_number":2541,"context_line":"        self.assertEqual(\"tcp\", cfg.devices[3].type)"},{"line_number":2542,"context_line":"        self.assertEqual(\"tcp\", cfg.devices[4].type)"},{"line_number":2543,"context_line":""},{"line_number":2544,"context_line":"    def test_get_guest_config_serial_console_invalid_img_meta(self):"},{"line_number":2545,"context_line":"        self.flags(enabled\u003dTrue, group\u003d\u0027serial_console\u0027)"},{"line_number":2546,"context_line":""},{"line_number":2547,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a50d1a3_be3403de","side":"PARENT","line":2544,"in_reply_to":"3a50d1a3_3047c21e","updated":"2015-07-27 14:51:04.000000000","message":"These tests were checking behaviour when semantically invalid data is given. Previously this was detected in libvirt driver code, but with the conversion to ImageMeta, this is checked at time of object instantiation. As such, it is impossible for libvirt to ever get semantically invalid data and so it is also correspondingly impossible to test the libvirt driver for invalid data. So we have to delete these three tests. The good news is that we actually improve our code by deleting this, becuase the ImageMeta object field validation is faaaaar superior.","commit_id":"ce556f0938054352343b0c6f9e412d8c44024002"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"6b6a626d5db219a414c26d6a3bf51dd46206d9a1","unresolved":false,"context_lines":[{"line_number":2541,"context_line":"        self.assertEqual(\"tcp\", cfg.devices[3].type)"},{"line_number":2542,"context_line":"        self.assertEqual(\"tcp\", cfg.devices[4].type)"},{"line_number":2543,"context_line":""},{"line_number":2544,"context_line":"    def test_get_guest_config_serial_console_invalid_img_meta(self):"},{"line_number":2545,"context_line":"        self.flags(enabled\u003dTrue, group\u003d\u0027serial_console\u0027)"},{"line_number":2546,"context_line":""},{"line_number":2547,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a50d1a3_a43ab496","side":"PARENT","line":2544,"in_reply_to":"3a50d1a3_be3403de","updated":"2015-07-27 15:30:34.000000000","message":"Oh, I see now.\n\nI was trying to work out why the ImageSerialPortNumberInvalid exception was not being removed from the libvirt code.","commit_id":"ce556f0938054352343b0c6f9e412d8c44024002"}],"nova/tests/unit/virt/test_hardware.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"efae8d82ee1ad972462eab6a52107f8edbf605e9","unresolved":false,"context_lines":[{"line_number":347,"context_line":"                    \"hw:cpu_max_threads\": \"1\","},{"line_number":348,"context_line":"                }),"},{"line_number":349,"context_line":"                \"image\": {"},{"line_number":350,"context_line":"                    \"properties\": {"},{"line_number":351,"context_line":"                        \"hw_cpu_cores\": \"16\","},{"line_number":352,"context_line":"                    }"},{"line_number":353,"context_line":"                },"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a50d1a3_d0769e3d","line":350,"updated":"2015-07-27 14:44:23.000000000","message":"nit: it feels like we should have image_meta added up here rather than sprinkled around.","commit_id":"5d842f52efe2c3736ed460a14c09ae79aa701bb4"}],"nova/virt/hardware.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"300f18724174f2c564e9a4868e64e1f3c50bf92d","unresolved":false,"context_lines":[{"line_number":973,"context_line":"    :param flavor: Flavor object to read extra specs from"},{"line_number":974,"context_line":"    :param image_meta: nova.objects.ImageMeta object instance or dict"},{"line_number":975,"context_line":""},{"line_number":976,"context_line":"    :returns: InstanceNUMATopology or None"},{"line_number":977,"context_line":"    \"\"\""},{"line_number":978,"context_line":""},{"line_number":979,"context_line":"    nodes \u003d flavor.get(\u0027extra_specs\u0027, {}).get(\"hw:numa_nodes\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"3afb71cf_49a637af","line":976,"updated":"2015-06-09 13:21:11.000000000","message":"Might be nice to add some docstrings:\n\n :raises ImageNUMATopologyForbidden ...\n :raises ImageNUMATopologyIncomplete ...\n\nwith brief descriptions of the conditions that raise those exceptions.","commit_id":"8593326cb7478e62f0fed9e6eb00626ce9ba3726"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"606c786b140f7de6b74f59b2f13ab56ba028f15a","unresolved":false,"context_lines":[{"line_number":517,"context_line":""},{"line_number":518,"context_line":""},{"line_number":519,"context_line":"def _threads_requested_by_user(flavor, image_meta):"},{"line_number":520,"context_line":"    keys \u003d (\"cpu_threads\", \"cpu_maxthreads\")"},{"line_number":521,"context_line":"    if any(flavor.extra_specs.get(\"hw:%s\" % key) for key in keys):"},{"line_number":522,"context_line":"        return True"},{"line_number":523,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"ba3cc151_6e5a8a85","side":"PARENT","line":520,"updated":"2015-06-30 07:16:14.000000000","message":"This looks like fixing a bug, it didn\u0027t belong to this patch","commit_id":"26b1f71c5eb373f8ee104139523c49ad010b4601"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"4f4d3f6f913341f362b3b7e52c2014c984ab44b0","unresolved":false,"context_lines":[{"line_number":517,"context_line":""},{"line_number":518,"context_line":""},{"line_number":519,"context_line":"def _threads_requested_by_user(flavor, image_meta):"},{"line_number":520,"context_line":"    keys \u003d (\"cpu_threads\", \"cpu_maxthreads\")"},{"line_number":521,"context_line":"    if any(flavor.extra_specs.get(\"hw:%s\" % key) for key in keys):"},{"line_number":522,"context_line":"        return True"},{"line_number":523,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"ba3cc151_970784c9","side":"PARENT","line":520,"in_reply_to":"ba3cc151_6e5a8a85","updated":"2015-07-01 17:19:25.000000000","message":"Yep, good point.","commit_id":"26b1f71c5eb373f8ee104139523c49ad010b4601"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"606c786b140f7de6b74f59b2f13ab56ba028f15a","unresolved":false,"context_lines":[{"line_number":153,"context_line":"    \"\"\"Get the number of serial consoles from the flavor or image"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    :param flavor: Flavor object to read extra specs from"},{"line_number":156,"context_line":"    :param image_meta: nova.objects.ImageMeta object instance or dict"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    If flavor extra specs is not set, then any image meta value is permitted."},{"line_number":159,"context_line":"    If flavour extra specs *is* set, then this provides the default serial"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba3cc151_ae3732af","line":156,"updated":"2015-06-30 07:16:14.000000000","message":"This won\u0027t accept a dict. As the line 186 treat image_meta as object","commit_id":"aaaee175e1d7565a0044d7066685641b9b0e8e62"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"4f4d3f6f913341f362b3b7e52c2014c984ab44b0","unresolved":false,"context_lines":[{"line_number":153,"context_line":"    \"\"\"Get the number of serial consoles from the flavor or image"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    :param flavor: Flavor object to read extra specs from"},{"line_number":156,"context_line":"    :param image_meta: nova.objects.ImageMeta object instance or dict"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    If flavor extra specs is not set, then any image meta value is permitted."},{"line_number":159,"context_line":"    If flavour extra specs *is* set, then this provides the default serial"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba3cc151_5756dcce","line":156,"in_reply_to":"ba3cc151_ae3732af","updated":"2015-07-01 17:19:25.000000000","message":"Yep, i forgot to change the comment from a previous version of this patch","commit_id":"aaaee175e1d7565a0044d7066685641b9b0e8e62"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"606c786b140f7de6b74f59b2f13ab56ba028f15a","unresolved":false,"context_lines":[{"line_number":876,"context_line":"    else:"},{"line_number":877,"context_line":"        if image_mem_list is not None:"},{"line_number":878,"context_line":"            raise exception.ImageNUMATopologyForbidden("},{"line_number":879,"context_line":"                name\u003d\u0027hw_numa_mem\u0027)"},{"line_number":880,"context_line":"        return flavor_mem_list"},{"line_number":881,"context_line":""},{"line_number":882,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"ba3cc151_6eb60a8c","line":879,"updated":"2015-06-30 07:16:14.000000000","message":"why we not continue reuse _numa_get_flavor_or_image_prop","commit_id":"aaaee175e1d7565a0044d7066685641b9b0e8e62"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"4f4d3f6f913341f362b3b7e52c2014c984ab44b0","unresolved":false,"context_lines":[{"line_number":876,"context_line":"    else:"},{"line_number":877,"context_line":"        if image_mem_list is not None:"},{"line_number":878,"context_line":"            raise exception.ImageNUMATopologyForbidden("},{"line_number":879,"context_line":"                name\u003d\u0027hw_numa_mem\u0027)"},{"line_number":880,"context_line":"        return flavor_mem_list"},{"line_number":881,"context_line":""},{"line_number":882,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"ba3cc151_3720f847","line":879,"in_reply_to":"ba3cc151_6eb60a8c","updated":"2015-07-01 17:19:25.000000000","message":"The _numa_get_flavor_or_image_prop method is based on the idea that you have exactly the same representation for properties in both the image and flavour. Now that we use a structured field for numa mem/cpu mapping, this design assumption does not hold. So that method has to go.","commit_id":"aaaee175e1d7565a0044d7066685641b9b0e8e62"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"606c786b140f7de6b74f59b2f13ab56ba028f15a","unresolved":false,"context_lines":[{"line_number":971,"context_line":"    \"\"\"Return topology related to input request"},{"line_number":972,"context_line":""},{"line_number":973,"context_line":"    :param flavor: Flavor object to read extra specs from"},{"line_number":974,"context_line":"    :param image_meta: nova.objects.ImageMeta object instance or dict"},{"line_number":975,"context_line":""},{"line_number":976,"context_line":"    May raise exception.ImageNUMATopologyIncomplete() if the"},{"line_number":977,"context_line":"    image properties are not correctly specified, or"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba3cc151_4e522669","line":974,"updated":"2015-06-30 07:16:14.000000000","message":"ditto","commit_id":"aaaee175e1d7565a0044d7066685641b9b0e8e62"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"ad6650064f0d8f7aaddb472f57ed26988dcbbeb6","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        return num_ports"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    flavor_num_ports \u003d get_number(flavor.extra_specs, \"hw:serial_port_count\")"},{"line_number":186,"context_line":"    image_num_ports \u003d image_meta.properties.get(\"hw_serial_port_count\", None)"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    if (flavor_num_ports and image_num_ports) is not None:"},{"line_number":189,"context_line":"        if image_num_ports \u003e flavor_num_ports:"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba3cc151_717db7b0","line":186,"updated":"2015-07-05 06:36:14.000000000","message":"The get should return None as default.","commit_id":"3a6747d52454b964b2a4f02a4326921e843df29c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"4c62a2bba345fd7f6b2ed63208921ec043a8a47b","unresolved":false,"context_lines":[{"line_number":865,"context_line":"        hw_numa_cpus_set \u003d True"},{"line_number":866,"context_line":""},{"line_number":867,"context_line":"    if hw_numa_cpus_set:"},{"line_number":868,"context_line":"        return hw_numa_cpus"},{"line_number":869,"context_line":""},{"line_number":870,"context_line":""},{"line_number":871,"context_line":"def _numa_get_cpu_map_list(flavor, image_meta):"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a50d1a3_3a37f4b1","line":868,"updated":"2015-07-20 11:28:48.000000000","message":"Instead of using the extra hw_numa_cpus_set variable, you could just do this instead:\n\n return hw_numa_cpus or None\n\nDitto for below similar usage.","commit_id":"3a6747d52454b964b2a4f02a4326921e843df29c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"df0615f79811f17cf4bfeba67105096eb3100ee5","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        return num_ports"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    flavor_num_ports \u003d get_number(flavor.extra_specs, \"hw:serial_port_count\")"},{"line_number":186,"context_line":"    image_num_ports \u003d image_meta.properties.get(\"hw_serial_port_count\", None)"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    if (flavor_num_ports and image_num_ports) is not None:"},{"line_number":189,"context_line":"        if image_num_ports \u003e flavor_num_ports:"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a50d1a3_526acb1b","line":186,"updated":"2015-07-24 20:19:46.000000000","message":"I\u0027m not crazy about the image_meta.properties.get pattern everywhere.  How do I know it\u0027s in image_meta or image_meta.properties?  I guess just doing image_meta.get(\"hw_serial_port_count\", None) is not possible right now since we don\u0027t know if that\u0027s on image_meta or image_meta.properties, but couldn\u0027t we override image_meta.get to check it\u0027s own fields first and if not there, call self.properties.get?  Or does that break down?","commit_id":"58196e2f705b38f7509348a67230e7f91e3276a2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"356ff2fde336a41bfc76a2d7f3f88ec46d3a2773","unresolved":false,"context_lines":[{"line_number":307,"context_line":"               \"threads\": flvmaxthreads})"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"    # Get any customized limits from the image"},{"line_number":310,"context_line":"    maxsockets \u003d image_meta.properties.get(\"hw_cpu_max_sockets\","},{"line_number":311,"context_line":"                                           flvmaxsockets)"},{"line_number":312,"context_line":"    maxcores \u003d image_meta.properties.get(\"hw_cpu_max_cores\","},{"line_number":313,"context_line":"                                         flvmaxcores)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a50d1a3_52096b30","line":310,"updated":"2015-07-24 20:29:30.000000000","message":"If we can\u0027t make image_meta.properties.get more sane, I\u0027d at least prefer to see a pattern like this where it\u0027s used multiple times:\n\nprops \u003d image_meta.properties\n\nprops.get(\u0027foo\u0027)\n\nBut that\u0027s more or less personal preference.  I still wish this delegated through as noted above.","commit_id":"58196e2f705b38f7509348a67230e7f91e3276a2"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"25420e6136a526173988904e5281b995bc2e40ae","unresolved":false,"context_lines":[{"line_number":307,"context_line":"               \"threads\": flvmaxthreads})"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"    # Get any customized limits from the image"},{"line_number":310,"context_line":"    maxsockets \u003d image_meta.properties.get(\"hw_cpu_max_sockets\","},{"line_number":311,"context_line":"                                           flvmaxsockets)"},{"line_number":312,"context_line":"    maxcores \u003d image_meta.properties.get(\"hw_cpu_max_cores\","},{"line_number":313,"context_line":"                                         flvmaxcores)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a50d1a3_c3a5afb5","line":310,"in_reply_to":"3a50d1a3_52096b30","updated":"2015-07-24 22:11:32.000000000","message":"Done","commit_id":"58196e2f705b38f7509348a67230e7f91e3276a2"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2b5bd5ee5854003a4ec54c65bcdb1f679d9530af","unresolved":false,"context_lines":[{"line_number":850,"context_line":"    return pagesize"},{"line_number":851,"context_line":""},{"line_number":852,"context_line":""},{"line_number":853,"context_line":"def _numa_get_flavor_cpu_map_list(flavor):"},{"line_number":854,"context_line":"    hw_numa_cpus \u003d []"},{"line_number":855,"context_line":"    hw_numa_cpus_set \u003d False"},{"line_number":856,"context_line":"    extra_specs \u003d flavor.get(\"extra_specs\", {})"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a50d1a3_919af112","line":853,"updated":"2015-07-29 11:22:41.000000000","message":"Part of me thinks we should push these methods into the object, but thats a bad coupling, so maybe here is best.\n\nAnyways, we can sort that later as the pattern becomes clearer, so I will not block on that.","commit_id":"36d37a670ea6c82aa37318898c43bb657e47128c"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2b5bd5ee5854003a4ec54c65bcdb1f679d9530af","unresolved":false,"context_lines":[{"line_number":1008,"context_line":"    :returns: InstanceNUMATopology or None"},{"line_number":1009,"context_line":"    \"\"\""},{"line_number":1010,"context_line":""},{"line_number":1011,"context_line":"    nodes \u003d flavor.get(\u0027extra_specs\u0027, {}).get(\"hw:numa_nodes\")"},{"line_number":1012,"context_line":"    props \u003d image_meta.properties"},{"line_number":1013,"context_line":"    if nodes is not None:"},{"line_number":1014,"context_line":"        if props.obj_attr_is_set(\"hw_numa_nodes\"):"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a50d1a3_71be4566","line":1011,"updated":"2015-07-29 11:22:41.000000000","message":"I kinda want to see these all in constants at some points, so we have a central list of all possible options, maybe as an enum. Maybe thats overkill, but anyways, thats for later.","commit_id":"36d37a670ea6c82aa37318898c43bb657e47128c"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"6e2b7799cc869c5d2dbe48c4519ee94a6321e6cb","unresolved":false,"context_lines":[{"line_number":1008,"context_line":"    :returns: InstanceNUMATopology or None"},{"line_number":1009,"context_line":"    \"\"\""},{"line_number":1010,"context_line":""},{"line_number":1011,"context_line":"    nodes \u003d flavor.get(\u0027extra_specs\u0027, {}).get(\"hw:numa_nodes\")"},{"line_number":1012,"context_line":"    props \u003d image_meta.properties"},{"line_number":1013,"context_line":"    if nodes is not None:"},{"line_number":1014,"context_line":"        if props.obj_attr_is_set(\"hw_numa_nodes\"):"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a50d1a3_31399df2","line":1011,"in_reply_to":"3a50d1a3_71be4566","updated":"2015-07-29 11:24:40.000000000","message":"Absolutely agree. When we\u0027ve finished converting the code to use ImageMeta / ImageMetaProps objects, we should definitely look todo the same objectification of Flavor extra specs to stop the total free-for-all there too.","commit_id":"36d37a670ea6c82aa37318898c43bb657e47128c"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d54387f50a6995bfa02e79a996b8cf467a00dcd7","unresolved":false,"context_lines":[{"line_number":3150,"context_line":"        if cpu is None:"},{"line_number":3151,"context_line":"            return None"},{"line_number":3152,"context_line":""},{"line_number":3153,"context_line":"        image_meta \u003d objects.ImageMeta.from_dict(image_meta)"},{"line_number":3154,"context_line":"        topology \u003d hardware.get_best_cpu_topology("},{"line_number":3155,"context_line":"                flavor, image_meta, numa_topology\u003dinstance_numa_topology)"},{"line_number":3156,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3afb71cf_773e2fc2","line":3153,"updated":"2015-06-10 13:47:21.000000000","message":"both _get_guest_cpu_config and _create_serial_console_devices (via _create_consoles) are called by _get_guest_config\nSo it would be better to convert to an object there.\n\nhttps://github.com/openstack/nova/blob/master/nova/virt/libvirt/driver.py#L4033","commit_id":"faf8750c6b2c72a7a06d9d4173a62596323ad98f"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"c742c758e70b857613006edad0b5d71757d7d12b","unresolved":false,"context_lines":[{"line_number":3150,"context_line":"        if cpu is None:"},{"line_number":3151,"context_line":"            return None"},{"line_number":3152,"context_line":""},{"line_number":3153,"context_line":"        image_meta \u003d objects.ImageMeta.from_dict(image_meta)"},{"line_number":3154,"context_line":"        topology \u003d hardware.get_best_cpu_topology("},{"line_number":3155,"context_line":"                flavor, image_meta, numa_topology\u003dinstance_numa_topology)"},{"line_number":3156,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3afb71cf_17c37b58","line":3153,"in_reply_to":"3afb71cf_773e2fc2","updated":"2015-06-10 13:51:58.000000000","message":"It doesn\u0027t really make a difference - this is all changing in the following patch which converts the entire libvirt driver, and then after that it in fact gets pushed into the compute manager itself.","commit_id":"faf8750c6b2c72a7a06d9d4173a62596323ad98f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"be76426728bbbf17faee1f89298b5d4cf0fbf05e","unresolved":false,"context_lines":[{"line_number":3097,"context_line":"        if cpu is None:"},{"line_number":3098,"context_line":"            return None"},{"line_number":3099,"context_line":""},{"line_number":3100,"context_line":"        image_meta \u003d objects.ImageMeta.from_dict(image_meta)"},{"line_number":3101,"context_line":"        topology \u003d hardware.get_best_cpu_topology("},{"line_number":3102,"context_line":"                flavor, image_meta, numa_topology\u003dinstance_numa_topology)"},{"line_number":3103,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3a50d1a3_f2c3d736","line":3100,"updated":"2015-07-24 20:16:01.000000000","message":"Same comment as in the resource tracker, shouldn\u0027t we have a type check for a temporary compat shim until this is getting an actual object?","commit_id":"58196e2f705b38f7509348a67230e7f91e3276a2"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"25420e6136a526173988904e5281b995bc2e40ae","unresolved":false,"context_lines":[{"line_number":3097,"context_line":"        if cpu is None:"},{"line_number":3098,"context_line":"            return None"},{"line_number":3099,"context_line":""},{"line_number":3100,"context_line":"        image_meta \u003d objects.ImageMeta.from_dict(image_meta)"},{"line_number":3101,"context_line":"        topology \u003d hardware.get_best_cpu_topology("},{"line_number":3102,"context_line":"                flavor, image_meta, numa_topology\u003dinstance_numa_topology)"},{"line_number":3103,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3a50d1a3_23d1f3fb","line":3100,"in_reply_to":"3a50d1a3_f2c3d736","updated":"2015-07-24 22:11:32.000000000","message":"Done","commit_id":"58196e2f705b38f7509348a67230e7f91e3276a2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"be76426728bbbf17faee1f89298b5d4cf0fbf05e","unresolved":false,"context_lines":[{"line_number":3690,"context_line":"        guest_arch \u003d libvirt_utils.get_arch(image_meta)"},{"line_number":3691,"context_line":""},{"line_number":3692,"context_line":"        if CONF.serial_console.enabled:"},{"line_number":3693,"context_line":"            image_meta \u003d objects.ImageMeta.from_dict(image_meta)"},{"line_number":3694,"context_line":"            num_ports \u003d hardware.get_number_of_serial_ports("},{"line_number":3695,"context_line":"                flavor, image_meta)"},{"line_number":3696,"context_line":"            for port in six.moves.range(num_ports):"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a50d1a3_b2dc6f19","line":3693,"updated":"2015-07-24 20:16:01.000000000","message":"ditto","commit_id":"58196e2f705b38f7509348a67230e7f91e3276a2"}]}
