)]}'
{"nova/compute/manager.py":[{"author":{"_account_id":10224,"name":"Feodor Tersin","email":"ftersin@hotmail.com","username":"ftersin"},"change_message_id":"fa5ffb00b9d71db8bf2b62823e0e447e6d3b4ba8","unresolved":false,"context_lines":[{"line_number":3113,"context_line":"            context, self.image_api, rescue_image_ref)"},{"line_number":3114,"context_line":"        # NOTE(belliott) bug #1227350 - xenapi needs the actual image id"},{"line_number":3115,"context_line":"        # TODO(berrange) from_image() could set this for us really"},{"line_number":3116,"context_line":"        setattr(image_meta, \u0027id\u0027, rescue_image_ref)"},{"line_number":3117,"context_line":"        return image_meta"},{"line_number":3118,"context_line":""},{"line_number":3119,"context_line":"    @wrap_exception()"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a50d1a3_64da504d","line":3116,"updated":"2015-07-28 06:04:31.000000000","message":"This should be removed by previous change: https://github.com/openstack/nova/commit/77ecc3d8c5853f5498bc6ed2d22d6ff0dd75a075#diff-77f9348ab09642ba46409b6828af4af0R3123\n\nIIANM, it does nothing. What if to delete it now, rather than convert it to object style and enlarge notes?","commit_id":"32cf9ef8ecc6556b68263a68c1bb742a34ddef65"},{"author":{"_account_id":10224,"name":"Feodor Tersin","email":"ftersin@hotmail.com","username":"ftersin"},"change_message_id":"ed28e4b26f3f99e7ede910c64a157228440214ec","unresolved":false,"context_lines":[{"line_number":3113,"context_line":"            context, self.image_api, rescue_image_ref)"},{"line_number":3114,"context_line":"        # NOTE(belliott) bug #1227350 - xenapi needs the actual image id"},{"line_number":3115,"context_line":"        # TODO(berrange) from_image() could set this for us really"},{"line_number":3116,"context_line":"        setattr(image_meta, \u0027id\u0027, rescue_image_ref)"},{"line_number":3117,"context_line":"        return image_meta"},{"line_number":3118,"context_line":""},{"line_number":3119,"context_line":"    @wrap_exception()"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a4dcd0f_20b4fb32","line":3116,"in_reply_to":"1a4dcd0f_969a0c6d","updated":"2015-08-06 18:51:08.000000000","message":"ok","commit_id":"32cf9ef8ecc6556b68263a68c1bb742a34ddef65"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"8fa2a3b2ae327c9c6728908c0d108d32cd638b93","unresolved":false,"context_lines":[{"line_number":3113,"context_line":"            context, self.image_api, rescue_image_ref)"},{"line_number":3114,"context_line":"        # NOTE(belliott) bug #1227350 - xenapi needs the actual image id"},{"line_number":3115,"context_line":"        # TODO(berrange) from_image() could set this for us really"},{"line_number":3116,"context_line":"        setattr(image_meta, \u0027id\u0027, rescue_image_ref)"},{"line_number":3117,"context_line":"        return image_meta"},{"line_number":3118,"context_line":""},{"line_number":3119,"context_line":"    @wrap_exception()"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a4dcd0f_969a0c6d","line":3116,"in_reply_to":"3a50d1a3_64da504d","updated":"2015-08-06 12:27:56.000000000","message":"We should not mix cleanups with other changes, in a single commit. So removal of this redundant code should be done separately.","commit_id":"32cf9ef8ecc6556b68263a68c1bb742a34ddef65"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"66f27d9218fa9ac64a6b2d418ab1d75aac82e836","unresolved":false,"context_lines":[{"line_number":3264,"context_line":"        image_meta \u003d objects.ImageMeta.from_image("},{"line_number":3265,"context_line":"            context, self.image_api, rescue_image_ref)"},{"line_number":3266,"context_line":"        # NOTE(belliott) bug #1227350 - xenapi needs the actual image id"},{"line_number":3267,"context_line":"        # TODO(berrange) from_image() could set this for us really"},{"line_number":3268,"context_line":"        setattr(image_meta, \u0027id\u0027, rescue_image_ref)"},{"line_number":3269,"context_line":"        return image_meta"},{"line_number":3270,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"da85f559_4ca0f79f","line":3267,"updated":"2015-11-09 17:23:30.000000000","message":"Do you want to do that as part of this change?  It would be cleaner IMO.","commit_id":"5631a9fa0f49053eec794d0f0b161b71aa29181b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"66f27d9218fa9ac64a6b2d418ab1d75aac82e836","unresolved":false,"context_lines":[{"line_number":3285,"context_line":"        rescue_image_meta \u003d self._get_rescue_image(context, instance,"},{"line_number":3286,"context_line":"                                                   rescue_image_ref)"},{"line_number":3287,"context_line":""},{"line_number":3288,"context_line":"        if rescue_image_meta.obj_attr_is_set(\"name\"):"},{"line_number":3289,"context_line":"            extra_usage_info \u003d {\u0027rescue_image_name\u0027: rescue_image_meta.name}"},{"line_number":3290,"context_line":"        else:"},{"line_number":3291,"context_line":"            extra_usage_info \u003d {\u0027rescue_image_name\u0027: \u0027\u0027}"}],"source_content_type":"text/x-python","patch_set":35,"id":"da85f559_8c8a5fbe","line":3288,"updated":"2015-11-09 17:23:30.000000000","message":"nit: We could extract this into a _get_image_name(image_meta) method that contains this logic so we don\u0027t have to duplicate it between rescue and rebuild.","commit_id":"5631a9fa0f49053eec794d0f0b161b71aa29181b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"66f27d9218fa9ac64a6b2d418ab1d75aac82e836","unresolved":false,"context_lines":[{"line_number":3919,"context_line":"        # NOTE(mriedem): If the original vm_state was STOPPED, we don\u0027t"},{"line_number":3920,"context_line":"        # automatically power on the instance after it\u0027s migrated"},{"line_number":3921,"context_line":"        power_on \u003d old_vm_state !\u003d vm_states.STOPPED"},{"line_number":3922,"context_line":"        image_meta \u003d objects.ImageMeta.from_dict(image)"},{"line_number":3923,"context_line":""},{"line_number":3924,"context_line":"        try:"},{"line_number":3925,"context_line":"            self.driver.finish_migration(context, migration, instance,"}],"source_content_type":"text/x-python","patch_set":35,"id":"da85f559_ec3e8bd9","line":3922,"updated":"2015-11-09 17:23:30.000000000","message":"nit: I\u0027d actually prefer doing this conversion in the finish_resize method and then passing it in here, just in case anything ever needs to access this before we\u0027ve done the conversion.","commit_id":"5631a9fa0f49053eec794d0f0b161b71aa29181b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"66f27d9218fa9ac64a6b2d418ab1d75aac82e836","unresolved":false,"context_lines":[{"line_number":4317,"context_line":"        if image:"},{"line_number":4318,"context_line":"            shelved_image_ref \u003d instance.image_ref"},{"line_number":4319,"context_line":"            instance.image_ref \u003d image[\u0027id\u0027]"},{"line_number":4320,"context_line":"            image_meta \u003d image"},{"line_number":4321,"context_line":"        else:"},{"line_number":4322,"context_line":"            image_meta \u003d utils.get_image_from_system_metadata("},{"line_number":4323,"context_line":"                instance.system_metadata)"}],"source_content_type":"text/x-python","patch_set":35,"id":"da85f559_ef5bddf4","line":4320,"updated":"2015-11-09 17:23:30.000000000","message":"This is no longer necessary.","commit_id":"5631a9fa0f49053eec794d0f0b161b71aa29181b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"66f27d9218fa9ac64a6b2d418ab1d75aac82e836","unresolved":false,"context_lines":[{"line_number":4319,"context_line":"            instance.image_ref \u003d image[\u0027id\u0027]"},{"line_number":4320,"context_line":"            image_meta \u003d image"},{"line_number":4321,"context_line":"        else:"},{"line_number":4322,"context_line":"            image_meta \u003d utils.get_image_from_system_metadata("},{"line_number":4323,"context_line":"                instance.system_metadata)"},{"line_number":4324,"context_line":""},{"line_number":4325,"context_line":"        self.network_api.setup_instance_network_on_host(context, instance,"}],"source_content_type":"text/x-python","patch_set":35,"id":"da85f559_cf0ff9df","line":4322,"updated":"2015-11-09 17:23:30.000000000","message":"Hmm, this isn\u0027t used, so the image_meta you get blow from the image would be empty (and wrong).","commit_id":"5631a9fa0f49053eec794d0f0b161b71aa29181b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c7cabb0a914f5e1857bf9aa2cd94e45529f41dd2","unresolved":false,"context_lines":[{"line_number":4946,"context_line":"                          \u0027ports\u0027), {\u0027ports\u0027: len(network_info)})"},{"line_number":4947,"context_line":"            raise exception.InterfaceAttachFailed("},{"line_number":4948,"context_line":"                    instance_uuid\u003dinstance.uuid)"},{"line_number":4949,"context_line":"        image_meta \u003d objects.ImageMeta.from_instance(instance)"},{"line_number":4950,"context_line":""},{"line_number":4951,"context_line":"        try:"},{"line_number":4952,"context_line":"            self.driver.attach_interface(instance, image_meta, network_info[0])"}],"source_content_type":"text/x-python","patch_set":38,"id":"ba63e191_481d74bc","line":4949,"updated":"2016-01-18 20:44:31.000000000","message":"Kinda seems like we should just put the following patch in front of this one and avoid converting these to this when we could just do instance.image_meta here, no?","commit_id":"fbe31e461ac3f16edb795993558a2314b4c16b52"}],"nova/objects/image_meta.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bce26ec95377d4744295914975508d432175e8c4","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        return cls.from_dict(image_meta)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    @classmethod"},{"line_number":136,"context_line":"    def from_image(cls, context, image_api, image_ref):"},{"line_number":137,"context_line":"        \"\"\"Create instance from glance image"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        :param context: the request context"}],"source_content_type":"text/x-python","patch_set":21,"id":"1a4dcd0f_566cfa9b","line":136,"updated":"2015-08-10 13:36:30.000000000","message":"The image API is actually a singleton, and so could be set as a module-level variable instead of passed as a parameter here:\n\n from nova import image\n \n IMAGE_API \u003d image.API()\n\nAlso, how about naming this method \"from_image_ref()\", to make it clear the supplied parameter is a URI or image ID?","commit_id":"fb83998ee1ec4a428bd16b21c65ece1cd43316b5"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"466d7fa8230db499bd2124243b216f76250083a0","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        return cls.from_dict(image_meta)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    @classmethod"},{"line_number":136,"context_line":"    def from_image(cls, context, image_api, image_ref):"},{"line_number":137,"context_line":"        \"\"\"Create instance from glance image"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        :param context: the request context"}],"source_content_type":"text/x-python","patch_set":21,"id":"1a4dcd0f_7f58e256","line":136,"in_reply_to":"1a4dcd0f_566cfa9b","updated":"2015-08-10 15:36:36.000000000","message":"Yeah, that works and would simplify life for the callers \u0026 and/or test suite too probably.","commit_id":"fb83998ee1ec4a428bd16b21c65ece1cd43316b5"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bce26ec95377d4744295914975508d432175e8c4","unresolved":false,"context_lines":[{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        :returns: an ImageMeta instance"},{"line_number":147,"context_line":"        \"\"\""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        image_meta \u003d image_api.get(context, image_ref)"},{"line_number":150,"context_line":"        return cls.from_dict(image_meta)"},{"line_number":151,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"1a4dcd0f_d6f24a06","line":148,"updated":"2015-08-10 13:36:30.000000000","message":"nit: unnecessary whitespace","commit_id":"fb83998ee1ec4a428bd16b21c65ece1cd43316b5"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ca597e31eed2874bcfbf75fd1dcfe6710fd451f6","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        :param image_api: the glance client API"},{"line_number":143,"context_line":"        :param image_ref: the glance image identifier"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        Creates a new object instnace, initializing from the"},{"line_number":146,"context_line":"        properties associated with a glance image"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        :returns: an ImageMeta instance"}],"source_content_type":"text/x-python","patch_set":27,"id":"da20952f_a8c6fe65","line":145,"updated":"2015-08-28 20:47:27.000000000","message":"s/instnace/instance/","commit_id":"87640ecfe32b54c3ba9921e4a71af3e219db184f"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ca597e31eed2874bcfbf75fd1dcfe6710fd451f6","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        :returns: an ImageMeta instance"},{"line_number":149,"context_line":"        \"\"\""},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        image_meta \u003d image_api.get(context, image_ref)"},{"line_number":152,"context_line":"        return cls.from_dict(image_meta)"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"da20952f_48ae4299","line":150,"updated":"2015-08-28 20:47:27.000000000","message":"nit: unnecessary blank line.","commit_id":"87640ecfe32b54c3ba9921e4a71af3e219db184f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bcf2a4c76be15181da6b86e50cafcfd01bc63f06","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        return cls.from_dict(image_meta)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    @classmethod"},{"line_number":127,"context_line":"    def from_image(cls, context, image_api, image_ref):"},{"line_number":128,"context_line":"        \"\"\"Create instance from glance image"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        :param context: the request context"}],"source_content_type":"text/x-python","patch_set":35,"id":"da85f559_879ec354","line":127,"updated":"2015-11-09 15:41:20.000000000","message":"nit: I might have called this from_image_ref since from_image at first sounds very similar to what from_dict does, but this is just the convenience method of getting the image dict from the image API for you.  Anyway, not a huge deal.","commit_id":"5631a9fa0f49053eec794d0f0b161b71aa29181b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bcf2a4c76be15181da6b86e50cafcfd01bc63f06","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        :param image_api: the glance client API"},{"line_number":132,"context_line":"        :param image_ref: the glance image identifier"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        Creates a new object instnace, initializing from the"},{"line_number":135,"context_line":"        properties associated with a glance image"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        :returns: an ImageMeta instance"}],"source_content_type":"text/x-python","patch_set":35,"id":"da85f559_872b2330","line":134,"updated":"2015-11-09 15:41:20.000000000","message":"s/instnace/instance/","commit_id":"5631a9fa0f49053eec794d0f0b161b71aa29181b"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"4ac09e43dfb3543bd217decf54facbdb1417be08","unresolved":false,"context_lines":[{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        :returns: an ImageMeta instance"},{"line_number":141,"context_line":"        \"\"\""},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        image_meta \u003d image_api.get(context, image_ref)"},{"line_number":144,"context_line":"        image \u003d cls.from_dict(image_meta)"},{"line_number":145,"context_line":"        setattr(image, \"id\", image_ref)"}],"source_content_type":"text/x-python","patch_set":38,"id":"ba63e191_03d3dd39","line":142,"updated":"2016-01-18 20:56:33.000000000","message":"nit: unused newline...","commit_id":"fbe31e461ac3f16edb795993558a2314b4c16b52"}],"nova/tests/unit/utils.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bce26ec95377d4744295914975508d432175e8c4","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    image_service, image_id \u003d glance.get_remote_image_service(context,"},{"line_number":48,"context_line":"                                                              image_ref)"},{"line_number":49,"context_line":"    return objects.ImageMeta.from_dict("},{"line_number":50,"context_line":"        image_service.show(context, image_id))"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"def get_test_flavor(context\u003dNone, options\u003dNone):"}],"source_content_type":"text/x-python","patch_set":21,"id":"1a4dcd0f_76a81678","line":50,"updated":"2015-08-10 13:36:30.000000000","message":"Why not use the newly-created objects.ImageMeta.from_image[_ref]() method? Then you could get rid of lines 47-48 entirely (and possibly get rid of the import of the nova.image.glance module.)","commit_id":"fb83998ee1ec4a428bd16b21c65ece1cd43316b5"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"466d7fa8230db499bd2124243b216f76250083a0","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    image_service, image_id \u003d glance.get_remote_image_service(context,"},{"line_number":48,"context_line":"                                                              image_ref)"},{"line_number":49,"context_line":"    return objects.ImageMeta.from_dict("},{"line_number":50,"context_line":"        image_service.show(context, image_id))"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"def get_test_flavor(context\u003dNone, options\u003dNone):"}],"source_content_type":"text/x-python","patch_set":21,"id":"1a4dcd0f_df2016b3","line":50,"in_reply_to":"1a4dcd0f_76a81678","updated":"2015-08-10 15:36:36.000000000","message":"Sure, that should work.","commit_id":"fb83998ee1ec4a428bd16b21c65ece1cd43316b5"}],"nova/tests/unit/virt/ironic/utils.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c7cabb0a914f5e1857bf9aa2cd94e45529f41dd2","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"def get_test_image_meta(**kw):"},{"line_number":76,"context_line":"    return objects.ImageMeta.from_dict("},{"line_number":77,"context_line":"        {\u0027id\u0027: kw.get(\u0027id\u0027, \u0027cccccccc-cccc-cccc-cccc-cccccccccccc\u0027)})"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"class FakePortClient(object):"}],"source_content_type":"text/x-python","patch_set":38,"id":"ba63e191_484b34b1","line":77,"updated":"2016-01-18 20:44:31.000000000","message":"You should use uuidsentinels!","commit_id":"fbe31e461ac3f16edb795993558a2314b4c16b52"}],"nova/virt/driver.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"66f27d9218fa9ac64a6b2d418ab1d75aac82e836","unresolved":false,"context_lines":[{"line_number":727,"context_line":"        \"\"\"Rescue the specified instance."},{"line_number":728,"context_line":""},{"line_number":729,"context_line":"        :param instance: nova.objects.instance.Instance"},{"line_number":730,"context_line":"        :param nova.objects.ImageMeta image_meta:"},{"line_number":731,"context_line":"            The metadata of the image of the instance."},{"line_number":732,"context_line":"        \"\"\""},{"line_number":733,"context_line":"        raise NotImplementedError()"}],"source_content_type":"text/x-python","patch_set":35,"id":"da85f559_6ca61b55","line":730,"updated":"2015-11-09 17:23:30.000000000","message":"nit: I wouldn\u0027t mind documenting all of the parameters while we\u0027re making this change.","commit_id":"5631a9fa0f49053eec794d0f0b161b71aa29181b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bcf2a4c76be15181da6b86e50cafcfd01bc63f06","unresolved":false,"context_lines":[{"line_number":1538,"context_line":"    def default_root_device_name(self, instance, image_meta, root_bdm):"},{"line_number":1539,"context_line":"        \"\"\"Provide a default root device name for the driver."},{"line_number":1540,"context_line":""},{"line_number":1541,"context_line":"        :param nova.objects.ImageMeta image_meta:"},{"line_number":1542,"context_line":"            The metadata of the image of the instance."},{"line_number":1543,"context_line":"        \"\"\""},{"line_number":1544,"context_line":"        raise NotImplementedError()"}],"source_content_type":"text/x-python","patch_set":35,"id":"da85f559_1d3b04d3","line":1541,"updated":"2015-11-09 15:41:20.000000000","message":"Can we document the other parameters if we\u0027re going to add this? Otherwise it looks weird.","commit_id":"5631a9fa0f49053eec794d0f0b161b71aa29181b"}]}
