)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b8c9e45b4b0e3f9c9a29752ddd9e8374d2b9883b","unresolved":false,"context_lines":[{"line_number":24,"context_line":"ensure this hierarchy was maintained. Stop doing this, preferring to"},{"line_number":25,"context_line":"centralize everything in one location. This results in fewer LoC and a"},{"line_number":26,"context_line":"more grokable implementation, and will make things much easier when we"},{"line_number":27,"context_line":"start handling \u0027PCPU\u0027s here."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Part of blueprint cpu-resources"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"7faddb67_9a7e9268","line":27,"updated":"2019-08-27 15:04:43.000000000","message":"Also, we don\u0027t plan to modify the ResourceRequest \"on the fly\" based on other flavor or image (and this object isn\u0027t persisted)\nAs an instance resize will consequently generate a new in-memory object, we don\u0027t really care of recreating a new object instead of reusing the original one.","commit_id":"2300c3b82b1a25dbefb14283fad41b5e07ce393b"}],"nova/objects/flavor.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9ef0cb6a531ec12e087c4d7ff3d1585b506c6889","unresolved":false,"context_lines":[{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    @property"},{"line_number":232,"context_line":"    def swap_gb(self):"},{"line_number":233,"context_line":"        return int(math.ceil(self.swap / 1024.0)) if self.swap else 0"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":236,"context_line":"        super(Flavor, self).obj_make_compatible(primitive, target_version)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_4a966140","line":233,"range":{"start_line":233,"start_character":50,"end_line":233,"end_character":69},"updated":"2019-08-06 17:59:27.000000000","message":"should this be:\n\n  if \u0027swap\u0027 in self else 0\n\n?","commit_id":"23357650b29f16113320fcbd3cd29e816617351f"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b62bf6070a4223e2df7ad30cdb2acc63d79a7225","unresolved":false,"context_lines":[{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    @property"},{"line_number":232,"context_line":"    def swap_gb(self):"},{"line_number":233,"context_line":"        return int(math.ceil(self.swap / 1024.0)) if self.swap else 0"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":236,"context_line":"        super(Flavor, self).obj_make_compatible(primitive, target_version)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_8de1d0d2","line":233,"range":{"start_line":233,"start_character":50,"end_line":233,"end_character":69},"in_reply_to":"7faddb67_4a966140","updated":"2019-08-06 22:19:54.000000000","message":"I like this just fine. It defensively covers None (even though the field is not nullable, right?) and evaluates the same either way.","commit_id":"23357650b29f16113320fcbd3cd29e816617351f"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b62bf6070a4223e2df7ad30cdb2acc63d79a7225","unresolved":false,"context_lines":[{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    @property"},{"line_number":232,"context_line":"    def swap_gb(self):"},{"line_number":233,"context_line":"        return int(math.ceil(self.swap / 1024.0)) if self.swap else 0"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":236,"context_line":"        super(Flavor, self).obj_make_compatible(primitive, target_version)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_f074db69","line":233,"range":{"start_line":233,"start_character":8,"end_line":233,"end_character":69},"updated":"2019-08-06 22:19:54.000000000","message":"What was wrong with compute_utils.convert_mb_to_ceil_gb?\n\nDoes adding a @property require a version bump?\n\nPerhaps this should be a separate change, as it doesn\u0027t really seem related to the refactor.","commit_id":"5b53fc84603033a496396279195e770a1efdc2a5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"22c1f668d9a2f5b1184c9c283522ce83878d2488","unresolved":false,"context_lines":[{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    @property"},{"line_number":232,"context_line":"    def swap_gb(self):"},{"line_number":233,"context_line":"        return int(math.ceil(self.swap / 1024.0)) if self.swap else 0"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":236,"context_line":"        super(Flavor, self).obj_make_compatible(primitive, target_version)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_bafcf9b5","line":233,"range":{"start_line":233,"start_character":8,"end_line":233,"end_character":69},"in_reply_to":"7faddb67_f074db69","updated":"2019-08-07 10:16:58.000000000","message":"nova.compute.utils imports a load of stuff from nova.objects, so I\u0027ll get recursive imports. It seemed minimal enough to just duplicate. Could be a separate change though, yeah","commit_id":"5b53fc84603033a496396279195e770a1efdc2a5"}],"nova/scheduler/utils.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9ef0cb6a531ec12e087c4d7ff3d1585b506c6889","unresolved":false,"context_lines":[{"line_number":387,"context_line":"    \"\"\""},{"line_number":388,"context_line":"    is_bfv \u003d compute_utils.is_volume_backed_instance(instance._context,"},{"line_number":389,"context_line":"                                                     instance)"},{"line_number":390,"context_line":"    # TODO(stephenfin): We should be passing through image metadata properties"},{"line_number":391,"context_line":"    # here"},{"line_number":392,"context_line":"    res_req \u003d ResourceRequest(flavor, None, is_bfv)"},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"    return res_req.merged_resources()"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_caa9f17b","line":391,"range":{"start_line":390,"start_character":0,"end_line":391,"end_character":10},"updated":"2019-08-06 17:59:27.000000000","message":"Not true. There\u0027s only one caller and it doesn\u0027t care about image metadata. Remove","commit_id":"23357650b29f16113320fcbd3cd29e816617351f"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b62bf6070a4223e2df7ad30cdb2acc63d79a7225","unresolved":false,"context_lines":[{"line_number":140,"context_line":"            return"},{"line_number":141,"context_line":"        self._group_policy \u003d policy"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    @classmethod"},{"line_number":144,"context_line":"    def from_extra_specs(cls, extra_specs, req\u003dNone):"},{"line_number":145,"context_line":"        \"\"\"Processes resources and traits in numbered groupings in extra_specs."},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        Examines extra_specs for items of the following forms:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_b0ed03f1","side":"PARENT","line":144,"range":{"start_line":143,"start_character":0,"end_line":144,"end_character":24},"updated":"2019-08-06 22:19:54.000000000","message":"Prefer if you made this a non-@classmethod named e.g. _process_extra_specs and invoked it from __init__ instead.","commit_id":"ad2eadf943d9f0d5de2ea485962d675263c6bb87"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"22c1f668d9a2f5b1184c9c283522ce83878d2488","unresolved":false,"context_lines":[{"line_number":140,"context_line":"            return"},{"line_number":141,"context_line":"        self._group_policy \u003d policy"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    @classmethod"},{"line_number":144,"context_line":"    def from_extra_specs(cls, extra_specs, req\u003dNone):"},{"line_number":145,"context_line":"        \"\"\"Processes resources and traits in numbered groupings in extra_specs."},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        Examines extra_specs for items of the following forms:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_fac91179","side":"PARENT","line":144,"range":{"start_line":143,"start_character":0,"end_line":144,"end_character":24},"in_reply_to":"7faddb67_b0ed03f1","updated":"2019-08-07 10:16:58.000000000","message":"I didn\u0027t bother doing this first go round because the resulting methods were (a) small and (b) rather tightly coupled __init__. I\u0027ve done it but I prefer them folded in, personally.","commit_id":"ad2eadf943d9f0d5de2ea485962d675263c6bb87"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b62bf6070a4223e2df7ad30cdb2acc63d79a7225","unresolved":false,"context_lines":[{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        return ret"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    @classmethod"},{"line_number":194,"context_line":"    def from_image_props(cls, image_meta_props, req\u003dNone):"},{"line_number":195,"context_line":"        \"\"\"Processes image properties and adds trait requirements to the"},{"line_number":196,"context_line":"           ResourceRequest"},{"line_number":197,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_70bd4bd6","side":"PARENT","line":194,"range":{"start_line":193,"start_character":0,"end_line":194,"end_character":25},"updated":"2019-08-06 22:19:54.000000000","message":"Prefer if you made this a non-@classmethod named e.g. _process_image_props and invaked it from __init__ instead.","commit_id":"ad2eadf943d9f0d5de2ea485962d675263c6bb87"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b62bf6070a4223e2df7ad30cdb2acc63d79a7225","unresolved":false,"context_lines":[{"line_number":406,"context_line":"        orc.DISK_GB: disk,"},{"line_number":407,"context_line":"    }"},{"line_number":408,"context_line":"    if \"extra_specs\" in flavor:"},{"line_number":409,"context_line":"        # TODO(efried): This method is currently only used from places that"},{"line_number":410,"context_line":"        # assume the compute node is the only resource provider.  So for now,"},{"line_number":411,"context_line":"        # we just merge together all the resources specified in the flavor and"},{"line_number":412,"context_line":"        # pass them along.  This will need to be adjusted when nested and/or"},{"line_number":413,"context_line":"        # shared RPs are in play."},{"line_number":414,"context_line":"        rreq \u003d ResourceRequest.from_extra_specs(flavor.extra_specs)"},{"line_number":415,"context_line":"        resources \u003d rreq.merged_resources(flavor_resources\u003dresources)"},{"line_number":416,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_d0899f6e","side":"PARENT","line":413,"range":{"start_line":409,"start_character":0,"end_line":413,"end_character":33},"updated":"2019-08-06 22:19:54.000000000","message":"This TODO needs to *not* go away.\n\nSince you got rid of _instance_to_allocations_dict, we\u0027re only using this method to heal allocations in nova manage. That code has special handling for port resources. But if we tried to use it on an instance with VGPU allocations, it would puke. Ditto for future accelerators, NUMA, etc.","commit_id":"ad2eadf943d9f0d5de2ea485962d675263c6bb87"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"22c1f668d9a2f5b1184c9c283522ce83878d2488","unresolved":false,"context_lines":[{"line_number":406,"context_line":"        orc.DISK_GB: disk,"},{"line_number":407,"context_line":"    }"},{"line_number":408,"context_line":"    if \"extra_specs\" in flavor:"},{"line_number":409,"context_line":"        # TODO(efried): This method is currently only used from places that"},{"line_number":410,"context_line":"        # assume the compute node is the only resource provider.  So for now,"},{"line_number":411,"context_line":"        # we just merge together all the resources specified in the flavor and"},{"line_number":412,"context_line":"        # pass them along.  This will need to be adjusted when nested and/or"},{"line_number":413,"context_line":"        # shared RPs are in play."},{"line_number":414,"context_line":"        rreq \u003d ResourceRequest.from_extra_specs(flavor.extra_specs)"},{"line_number":415,"context_line":"        resources \u003d rreq.merged_resources(flavor_resources\u003dresources)"},{"line_number":416,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_da7a1524","side":"PARENT","line":413,"range":{"start_line":409,"start_character":0,"end_line":413,"end_character":33},"in_reply_to":"7faddb67_d0899f6e","updated":"2019-08-07 10:16:58.000000000","message":"Done","commit_id":"ad2eadf943d9f0d5de2ea485962d675263c6bb87"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b62bf6070a4223e2df7ad30cdb2acc63d79a7225","unresolved":false,"context_lines":[{"line_number":136,"context_line":"            self._add_resource(None, orc.MEMORY_MB, flavor.memory_mb)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        if orc.DISK_GB not in merged_resources:"},{"line_number":139,"context_line":"            disk \u003d ((0 if is_bfv else flavor.root_gb) +"},{"line_number":140,"context_line":"                    flavor.swap_gb + flavor.ephemeral_gb)"},{"line_number":141,"context_line":"            if disk:"},{"line_number":142,"context_line":"                self._add_resource(None, orc.DISK_GB, disk)"},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_3025935c","line":140,"range":{"start_line":139,"start_character":12,"end_line":140,"end_character":57},"updated":"2019-08-06 22:19:54.000000000","message":"Wouldn\u0027t offend me if this was blown out into multiple statements (including leaving the calculation of swap_gb via convert_mb_to_ceil_gb).","commit_id":"5b53fc84603033a496396279195e770a1efdc2a5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"22c1f668d9a2f5b1184c9c283522ce83878d2488","unresolved":false,"context_lines":[{"line_number":136,"context_line":"            self._add_resource(None, orc.MEMORY_MB, flavor.memory_mb)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        if orc.DISK_GB not in merged_resources:"},{"line_number":139,"context_line":"            disk \u003d ((0 if is_bfv else flavor.root_gb) +"},{"line_number":140,"context_line":"                    flavor.swap_gb + flavor.ephemeral_gb)"},{"line_number":141,"context_line":"            if disk:"},{"line_number":142,"context_line":"                self._add_resource(None, orc.DISK_GB, disk)"},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_3a2a492c","line":140,"range":{"start_line":139,"start_character":12,"end_line":140,"end_character":57},"in_reply_to":"7faddb67_3025935c","updated":"2019-08-07 10:16:58.000000000","message":"Heh, it was and I folded it back in based on the \u0027resources_from_flavor\u0027 implementation","commit_id":"5b53fc84603033a496396279195e770a1efdc2a5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"809dd7ea84e65456fea7c4e979a2153b43c36813","unresolved":false,"context_lines":[{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    def __str__(self):"},{"line_number":333,"context_line":"        return \u0027, \u0027.join(sorted("},{"line_number":334,"context_line":"            list(str(rg) for rg in list(self._rg_by_id.values()))))"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"def build_request_spec(image, instances, instance_type\u003dNone):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_9c4d729b","line":334,"range":{"start_line":334,"start_character":35,"end_line":334,"end_character":39},"updated":"2019-08-22 19:34:41.000000000","message":"I think this should go away. It\u0027s creating an unnecessary extra list in memory.","commit_id":"d76dc725bbd1f30cc67af4204606eee3f1610e32"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"809dd7ea84e65456fea7c4e979a2153b43c36813","unresolved":false,"context_lines":[{"line_number":422,"context_line":"    :raises NoValidHost: If the specified host/node is not found in the DB."},{"line_number":423,"context_line":"    \"\"\""},{"line_number":424,"context_line":"    flavor \u003d spec_obj.flavor"},{"line_number":425,"context_line":"    image \u003d \u0027image\u0027 in spec_obj and spec_obj.image"},{"line_number":426,"context_line":"    is_bfv \u003d \u0027is_bfv\u0027 in spec_obj and spec_obj.is_bfv"},{"line_number":427,"context_line":""},{"line_number":428,"context_line":"    res_req \u003d ResourceRequest(flavor, image, is_bfv)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_9c1b327f","line":425,"range":{"start_line":425,"start_character":12,"end_line":425,"end_character":50},"updated":"2019-08-22 19:34:41.000000000","message":"This will evaluate to False if \u0027image\u0027 is not in spec_obj. Which works as written, because two layers down in the call stack we\u0027re using \u0027if not image\u0027 rather than \u0027if image is not None\u0027. But I slightly don\u0027t like the coupling. Would prefer something like\n\n image \u003d spec_obj.image if \u0027image\u0027 in spec_obj else None","commit_id":"d76dc725bbd1f30cc67af4204606eee3f1610e32"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"809dd7ea84e65456fea7c4e979a2153b43c36813","unresolved":false,"context_lines":[{"line_number":423,"context_line":"    \"\"\""},{"line_number":424,"context_line":"    flavor \u003d spec_obj.flavor"},{"line_number":425,"context_line":"    image \u003d \u0027image\u0027 in spec_obj and spec_obj.image"},{"line_number":426,"context_line":"    is_bfv \u003d \u0027is_bfv\u0027 in spec_obj and spec_obj.is_bfv"},{"line_number":427,"context_line":""},{"line_number":428,"context_line":"    res_req \u003d ResourceRequest(flavor, image, is_bfv)"},{"line_number":429,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_3c10fe59","line":426,"range":{"start_line":426,"start_character":22,"end_line":426,"end_character":25},"updated":"2019-08-22 19:34:41.000000000","message":"This one makes a little more sense because is_bfv is supposed to be boolean.","commit_id":"d76dc725bbd1f30cc67af4204606eee3f1610e32"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b8c9e45b4b0e3f9c9a29752ddd9e8374d2b9883b","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    XS_KEYPAT \u003d re.compile(r\"^(%s)([1-9][0-9]*)?:(.*)$\" %"},{"line_number":55,"context_line":"                           \u0027|\u0027.join((XS_RES_PREFIX, XS_TRAIT_PREFIX)))"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def __init__(self, flavor, image, is_bfv):"},{"line_number":58,"context_line":"        \"\"\"Create a new instance of RequestSpec."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        Examines the flavor, flavor extra specs, and (optional) image metadata."}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_1afb82be","line":57,"range":{"start_line":57,"start_character":23,"end_line":57,"end_character":45},"updated":"2019-08-27 15:04:43.000000000","message":"I\u0027m not super happy with those parameters. Can\u0027t we just assume we take a RequestSpec as a parameter ? Of course, we need to special-case L408 but I just feel we we will make things clearer if we just assume the above.","commit_id":"2300c3b82b1a25dbefb14283fad41b5e07ce393b"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b8c9e45b4b0e3f9c9a29752ddd9e8374d2b9883b","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                           \u0027|\u0027.join((XS_RES_PREFIX, XS_TRAIT_PREFIX)))"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def __init__(self, flavor, image, is_bfv):"},{"line_number":58,"context_line":"        \"\"\"Create a new instance of RequestSpec."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        Examines the flavor, flavor extra specs, and (optional) image metadata."},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_da2e4a41","line":58,"range":{"start_line":58,"start_character":36,"end_line":58,"end_character":47},"updated":"2019-08-27 15:04:43.000000000","message":"no, it creates a ResourceRequest, based on some fields from RequestSpec.","commit_id":"2300c3b82b1a25dbefb14283fad41b5e07ce393b"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b8c9e45b4b0e3f9c9a29752ddd9e8374d2b9883b","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        :param flavor: An instance of ``objects.Flavor``."},{"line_number":79,"context_line":"        :param image: An instance of ``objects.Image``, else None."},{"line_number":80,"context_line":"        :param is_bfv: True if the instance is a boot-from-volume instance,"},{"line_number":81,"context_line":"            else False."},{"line_number":82,"context_line":"        \"\"\""},{"line_number":83,"context_line":"        # { ident: RequestGroup }"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_3ae43e0e","line":80,"updated":"2019-08-27 15:04:43.000000000","message":"See, this is very techy : you need to pass that argument in order to calculate the DISK_GB resource request correctly, but if you were getting a plain RequestSpec, you\u0027d get all of what you\u0027d need.\n\nSince Placement is very abstractional, the less we make this code to be \"corned-case\", the better it will be.","commit_id":"2300c3b82b1a25dbefb14283fad41b5e07ce393b"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b8c9e45b4b0e3f9c9a29752ddd9e8374d2b9883b","unresolved":false,"context_lines":[{"line_number":390,"context_line":"    return jsonutils.to_primitive(request_spec)"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"def resources_from_flavor(instance, flavor):"},{"line_number":394,"context_line":"    \"\"\"Convert a flavor into a set of resources for placement, taking into"},{"line_number":395,"context_line":"    account boot-from-volume instances."},{"line_number":396,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_daa16aaa","line":393,"updated":"2019-08-27 15:04:43.000000000","message":"honestly, I get why we need this method, but we could also just pass down the requestspec too...","commit_id":"2300c3b82b1a25dbefb14283fad41b5e07ce393b"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b8c9e45b4b0e3f9c9a29752ddd9e8374d2b9883b","unresolved":false,"context_lines":[{"line_number":425,"context_line":"    image \u003d \u0027image\u0027 in spec_obj and spec_obj.image"},{"line_number":426,"context_line":"    is_bfv \u003d \u0027is_bfv\u0027 in spec_obj and spec_obj.is_bfv"},{"line_number":427,"context_line":""},{"line_number":428,"context_line":"    res_req \u003d ResourceRequest(flavor, image, is_bfv)"},{"line_number":429,"context_line":""},{"line_number":430,"context_line":"    requested_resources \u003d (spec_obj.requested_resources"},{"line_number":431,"context_line":"                           if \u0027requested_resources\u0027 in spec_obj and"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_9ab692f9","line":428,"updated":"2019-08-27 15:04:43.000000000","message":"here, that would be so simple to just pass down the RequestSpec, right?","commit_id":"2300c3b82b1a25dbefb14283fad41b5e07ce393b"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"9debca40b48ad0d1e325fc47552b94a50be5b660","unresolved":false,"context_lines":[{"line_number":402,"context_line":"    is_bfv \u003d compute_utils.is_volume_backed_instance(instance._context,"},{"line_number":403,"context_line":"                                                     instance)"},{"line_number":404,"context_line":"    # create a fake RequestSpec as a wrapper to the caller"},{"line_number":405,"context_line":"    req_spec \u003d objects.RequestSpec(flavor\u003dflavor, is_bfv\u003dis_bfv)"},{"line_number":406,"context_line":""},{"line_number":407,"context_line":"    # TODO(efried): This method is currently only used from places that"},{"line_number":408,"context_line":"    # assume the compute node is the only resource provider.  So for now, we"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_46fd8e06","line":405,"updated":"2019-08-28 13:37:45.000000000","message":"*nods*","commit_id":"7abe83f6460b053985c45d5b7af2b0ed5b17b66a"}],"nova/tests/functional/test_report_client.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9ef0cb6a531ec12e087c4d7ff3d1585b506c6889","unresolved":false,"context_lines":[{"line_number":1147,"context_line":"            # care to check."},{"line_number":1148,"context_line":"            for k, expected in pdict.items():"},{"line_number":1149,"context_line":"                # For inventories, we\u0027re only validating totals"},{"line_number":1150,"context_line":"                if k \u003d\u003d \u0027inventory\u0027:"},{"line_number":1151,"context_line":"                    self.assertEqual("},{"line_number":1152,"context_line":"                        set(expected), set(actual_data.inventory),"},{"line_number":1153,"context_line":"                        \"Mismatched inventory keys for provider %s\" % uuid)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_eaa4eda4","line":1150,"updated":"2019-08-06 17:59:27.000000000","message":"Unrelated by flake8 in my editor was b****ing, and it\u0027s correct","commit_id":"23357650b29f16113320fcbd3cd29e816617351f"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b8c9e45b4b0e3f9c9a29752ddd9e8374d2b9883b","unresolved":false,"context_lines":[{"line_number":1147,"context_line":"            # care to check."},{"line_number":1148,"context_line":"            for k, expected in pdict.items():"},{"line_number":1149,"context_line":"                # For inventories, we\u0027re only validating totals"},{"line_number":1150,"context_line":"                if k \u003d\u003d \u0027inventory\u0027:"},{"line_number":1151,"context_line":"                    self.assertEqual("},{"line_number":1152,"context_line":"                        set(expected), set(actual_data.inventory),"},{"line_number":1153,"context_line":"                        \"Mismatched inventory keys for provider %s\" % uuid)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_fa9b0670","line":1150,"updated":"2019-08-27 15:04:43.000000000","message":"not sure I get why you need this but okay.","commit_id":"2300c3b82b1a25dbefb14283fad41b5e07ce393b"}],"nova/tests/unit/scheduler/test_utils.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"809dd7ea84e65456fea7c4e979a2153b43c36813","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from nova.tests.unit.scheduler import fakes"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class FakeResourceRequest(object):"},{"line_number":29,"context_line":"    \"\"\"A fake of ``nova.scheduler.utils.ResourceRequest``."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    Allows us to assert that various properties of a real ResourceRequest"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_572353a8","line":28,"range":{"start_line":28,"start_character":26,"end_line":28,"end_character":32},"updated":"2019-08-22 19:34:41.000000000","message":"I would prefer if this inherited from ResourceRequest, though I can\u0027t completely tell you why.","commit_id":"d76dc725bbd1f30cc67af4204606eee3f1610e32"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"809dd7ea84e65456fea7c4e979a2153b43c36813","unresolved":false,"context_lines":[{"line_number":916,"context_line":"        req \u003d utils.ResourceRequest(flavor, None, False)"},{"line_number":917,"context_line":""},{"line_number":918,"context_line":"        # this implicitly creates the specified group"},{"line_number":919,"context_line":"        unnumbered_rg \u003d req.get_request_group(42)"},{"line_number":920,"context_line":""},{"line_number":921,"context_line":"        rg1 \u003d objects.RequestGroup()"},{"line_number":922,"context_line":"        req.add_request_group(rg1)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_b7464750","line":919,"range":{"start_line":919,"start_character":8,"end_line":919,"end_character":21},"updated":"2019-08-22 19:34:41.000000000","message":"then it\u0027s not unnumbered anymore.","commit_id":"d76dc725bbd1f30cc67af4204606eee3f1610e32"}]}
