)]}'
{"nova/objects/request_spec.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"72aaf73923ae9be7719143783cb87db9eccba8dd","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"@base.NovaObjectRegistry.register"},{"line_number":42,"context_line":"class RequestLevelParams(base.NovaObject):"},{"line_number":43,"context_line":"    \"\"\"Options destined for the \"top level\" of the placement allocation"},{"line_number":44,"context_line":"    candidates query (parallel to, but not including, the list of"},{"line_number":45,"context_line":"    RequestGroup)."}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_761c4366","line":42,"updated":"2019-12-16 20:30:14.000000000","message":"nit: in a module called request_spec.py I\u0027d expect to see the RequestSpec class first with any sub-objects, like Destination and RequestGroup, to come later. So move this to the end.","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"50cbf255c5e0301006c9c57cfe82777a95f863c7","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"@base.NovaObjectRegistry.register"},{"line_number":42,"context_line":"class RequestLevelParams(base.NovaObject):"},{"line_number":43,"context_line":"    \"\"\"Options destined for the \"top level\" of the placement allocation"},{"line_number":44,"context_line":"    candidates query (parallel to, but not including, the list of"},{"line_number":45,"context_line":"    RequestGroup)."}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_b01f7807","line":42,"in_reply_to":"3fa7e38b_761c4366","updated":"2020-01-07 19:03:17.000000000","message":"Agree.","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c37fe9158e291756454667581722396749e4a465","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"@base.NovaObjectRegistry.register"},{"line_number":42,"context_line":"class RequestLevelParams(base.NovaObject):"},{"line_number":43,"context_line":"    \"\"\"Options destined for the \"top level\" of the placement allocation"},{"line_number":44,"context_line":"    candidates query (parallel to, but not including, the list of"},{"line_number":45,"context_line":"    RequestGroup)."}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_30db8821","line":42,"in_reply_to":"3fa7e38b_b01f7807","updated":"2020-01-07 20:20:24.000000000","message":"Done. (I started with that. It broke because the default for RequestSpec.request_level_params is evaluated at compile time. But since we\u0027re redoing the way the default works, that problem should go away.)","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"72aaf73923ae9be7719143783cb87db9eccba8dd","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        \u0027requested_resources\u0027: fields.ListOfObjectsField(\u0027RequestGroup\u0027,"},{"line_number":126,"context_line":"                                                         nullable\u003dTrue,"},{"line_number":127,"context_line":"                                                         default\u003dNone),"},{"line_number":128,"context_line":"        \u0027request_level_params\u0027: fields.ObjectField("},{"line_number":129,"context_line":"            \u0027RequestLevelParams\u0027, default\u003dRequestLevelParams()),"},{"line_number":130,"context_line":"    }"},{"line_number":131,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_d64c1777","line":128,"updated":"2019-12-16 20:30:14.000000000","message":"Is this something that should be persisted or only live per-scheduling request? I\u0027m assuming the latter. If so, you should add a comment like for the ones above saying it won\u0027t be persisted because we\u0027ve had a lot of these over the years slip through, get persisted between move operations, and cause problems later.","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c37fe9158e291756454667581722396749e4a465","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        \u0027requested_resources\u0027: fields.ListOfObjectsField(\u0027RequestGroup\u0027,"},{"line_number":126,"context_line":"                                                         nullable\u003dTrue,"},{"line_number":127,"context_line":"                                                         default\u003dNone),"},{"line_number":128,"context_line":"        \u0027request_level_params\u0027: fields.ObjectField("},{"line_number":129,"context_line":"            \u0027RequestLevelParams\u0027, default\u003dRequestLevelParams()),"},{"line_number":130,"context_line":"    }"},{"line_number":131,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_b0f7788c","line":128,"in_reply_to":"3fa7e38b_d64c1777","updated":"2020-01-07 20:20:24.000000000","message":"Done. (I\u0027m not swapped in enough right now to understand all the implications, but IIRC I thought it seemed like it should do the same thing as requested_resources, which doesn\u0027t persist.)","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"72aaf73923ae9be7719143783cb87db9eccba8dd","unresolved":false,"context_lines":[{"line_number":126,"context_line":"                                                         nullable\u003dTrue,"},{"line_number":127,"context_line":"                                                         default\u003dNone),"},{"line_number":128,"context_line":"        \u0027request_level_params\u0027: fields.ObjectField("},{"line_number":129,"context_line":"            \u0027RequestLevelParams\u0027, default\u003dRequestLevelParams()),"},{"line_number":130,"context_line":"    }"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_b6471b53","line":129,"range":{"start_line":129,"start_character":42,"end_line":129,"end_character":62},"updated":"2019-12-16 20:30:14.000000000","message":"I don\u0027t think we\u0027ve ever provided a default that\u0027s an object, so this should probably just be None, like for requested_destination and requested_resources. I\u0027m pretty sure Dan wouldn\u0027t be cool with this anyway. Your helper properties below will have to account for None but that should be trivial.\n\n(later)\n\nI guess you\u0027re doing a default object instance because of how the pre-request filters are adding things to this:\n\nhttps://review.opendev.org/#/c/699050/3/nova/scheduler/request_filter.py@188\n\nStill, I don\u0027t think it should go in the field definition. It\u0027s likely better to just handle that in obj_load_attr. My fear (and I think Dan has said this before) is you could have multiple instances of RequestSpec using the same default RequestLevelParams instance which would be bad.","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c37fe9158e291756454667581722396749e4a465","unresolved":false,"context_lines":[{"line_number":126,"context_line":"                                                         nullable\u003dTrue,"},{"line_number":127,"context_line":"                                                         default\u003dNone),"},{"line_number":128,"context_line":"        \u0027request_level_params\u0027: fields.ObjectField("},{"line_number":129,"context_line":"            \u0027RequestLevelParams\u0027, default\u003dRequestLevelParams()),"},{"line_number":130,"context_line":"    }"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_5063a441","line":129,"range":{"start_line":129,"start_character":42,"end_line":129,"end_character":62},"in_reply_to":"3fa7e38b_50d4041f","updated":"2020-01-07 20:20:24.000000000","message":"\u003e Yep, agreed. I think we (Eric and I) discussed the defaults\n \u003e behavior in Dec and I said that these defaults are\n \u003e copy.deepcopy()\u0027d to avoid some weirdness.\n\nYes: https://opendev.org/openstack/oslo.versionedobjects/src/branch/master/oslo_versionedobjects/base.py#L593\n\n \u003e I agree that we should be setting the field\n \u003e either before we get into the request_filter stuff, or on\n \u003e obj_load_attr() like mriedem says.\n\nDid the latter.","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"50cbf255c5e0301006c9c57cfe82777a95f863c7","unresolved":false,"context_lines":[{"line_number":126,"context_line":"                                                         nullable\u003dTrue,"},{"line_number":127,"context_line":"                                                         default\u003dNone),"},{"line_number":128,"context_line":"        \u0027request_level_params\u0027: fields.ObjectField("},{"line_number":129,"context_line":"            \u0027RequestLevelParams\u0027, default\u003dRequestLevelParams()),"},{"line_number":130,"context_line":"    }"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_50d4041f","line":129,"range":{"start_line":129,"start_character":42,"end_line":129,"end_character":62},"in_reply_to":"3fa7e38b_b6471b53","updated":"2020-01-07 19:03:17.000000000","message":"Yep, agreed. I think we (Eric and I) discussed the defaults behavior in Dec and I said that these defaults are copy.deepcopy()\u0027d to avoid some weirdness. So this probably technically works, but I agree that we should be setting the field either before we get into the request_filter stuff, or on obj_load_attr() like mriedem says.","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"72aaf73923ae9be7719143783cb87db9eccba8dd","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        \"\"\"Convenience prop that lazy-loads root_required from"},{"line_number":198,"context_line":"        request_level_params."},{"line_number":199,"context_line":"        \"\"\""},{"line_number":200,"context_line":"        self.obj_set_defaults(\u0027request_level_params\u0027)"},{"line_number":201,"context_line":"        self.request_level_params.obj_set_defaults(\u0027root_required\u0027)"},{"line_number":202,"context_line":"        return self.request_level_params.root_required"},{"line_number":203,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_36648be6","line":200,"updated":"2019-12-16 20:30:14.000000000","message":"This would be better handled in obj_load_attr IMO. That\u0027s the typical pattern for whenever you need to load up an attribute that isn\u0027t set.","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c37fe9158e291756454667581722396749e4a465","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        \"\"\"Convenience prop that lazy-loads root_required from"},{"line_number":198,"context_line":"        request_level_params."},{"line_number":199,"context_line":"        \"\"\""},{"line_number":200,"context_line":"        self.obj_set_defaults(\u0027request_level_params\u0027)"},{"line_number":201,"context_line":"        self.request_level_params.obj_set_defaults(\u0027root_required\u0027)"},{"line_number":202,"context_line":"        return self.request_level_params.root_required"},{"line_number":203,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_6b5d9514","line":200,"in_reply_to":"3fa7e38b_10da0c49","updated":"2020-01-07 20:20:24.000000000","message":"Okay, with the obj_load_attr change this collapses to just L202.\n\n(That\u0027s still side-effecty, though, isn\u0027t it? Just hidden by the implicitness of obj_load_attr when self.request_level_params is referenced.)","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"50cbf255c5e0301006c9c57cfe82777a95f863c7","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        \"\"\"Convenience prop that lazy-loads root_required from"},{"line_number":198,"context_line":"        request_level_params."},{"line_number":199,"context_line":"        \"\"\""},{"line_number":200,"context_line":"        self.obj_set_defaults(\u0027request_level_params\u0027)"},{"line_number":201,"context_line":"        self.request_level_params.obj_set_defaults(\u0027root_required\u0027)"},{"line_number":202,"context_line":"        return self.request_level_params.root_required"},{"line_number":203,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_10da0c49","line":200,"in_reply_to":"3fa7e38b_36648be6","updated":"2020-01-07 19:03:17.000000000","message":"Yes, and also side effects in property getters are pretty evil.","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b3beeeaae9dbd52e85986112a9c7dfc3210c1beb","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        \"\"\"Convenience prop that lazy-loads root_required from"},{"line_number":198,"context_line":"        request_level_params."},{"line_number":199,"context_line":"        \"\"\""},{"line_number":200,"context_line":"        self.obj_set_defaults(\u0027request_level_params\u0027)"},{"line_number":201,"context_line":"        self.request_level_params.obj_set_defaults(\u0027root_required\u0027)"},{"line_number":202,"context_line":"        return self.request_level_params.root_required"},{"line_number":203,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_f1fc080d","line":200,"in_reply_to":"3fa7e38b_6b5d9514","updated":"2020-01-08 14:39:33.000000000","message":"I suppose it\u0027s roughly equivalent, yeah. We (should) know that the behavior of an ovo means that dereferencing a named field (i.e. in fields) will result in magic. We\u0027ve been using these @property things as aliases to help reduce typing, which is maybe not the best plan. But like above, if flavor wasn\u0027t set and was defaultable/loadable, then we\u0027d hit the magic when we check req.swap.\n\nSo yeah, you\u0027re right.","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"72aaf73923ae9be7719143783cb87db9eccba8dd","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        request_level_params."},{"line_number":199,"context_line":"        \"\"\""},{"line_number":200,"context_line":"        self.obj_set_defaults(\u0027request_level_params\u0027)"},{"line_number":201,"context_line":"        self.request_level_params.obj_set_defaults(\u0027root_required\u0027)"},{"line_number":202,"context_line":"        return self.request_level_params.root_required"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_d69ad7c2","line":201,"updated":"2019-12-16 20:30:14.000000000","message":"If you did like Destination below and implemented obj_load_attr on RequestLevelParams to just call self.obj_set_defaluts() then you wouldn\u0027t need this here or below in root_forbidden.","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c37fe9158e291756454667581722396749e4a465","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        request_level_params."},{"line_number":199,"context_line":"        \"\"\""},{"line_number":200,"context_line":"        self.obj_set_defaults(\u0027request_level_params\u0027)"},{"line_number":201,"context_line":"        self.request_level_params.obj_set_defaults(\u0027root_required\u0027)"},{"line_number":202,"context_line":"        return self.request_level_params.root_required"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_6bb2754c","line":201,"in_reply_to":"3fa7e38b_d69ad7c2","updated":"2020-01-07 20:20:24.000000000","message":"Ack, done.","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"72aaf73923ae9be7719143783cb87db9eccba8dd","unresolved":false,"context_lines":[{"line_number":206,"context_line":"        \"\"\"Convenience prop that lazy-loads root_forbidden from"},{"line_number":207,"context_line":"        request_level_params."},{"line_number":208,"context_line":"        \"\"\""},{"line_number":209,"context_line":"        self.obj_set_defaults(\u0027request_level_params\u0027)"},{"line_number":210,"context_line":"        self.request_level_params.obj_set_defaults(\u0027root_forbidden\u0027)"},{"line_number":211,"context_line":"        return self.request_level_params.root_forbidden"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def _image_meta_from_image(self, image):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_96a45f09","line":210,"range":{"start_line":209,"start_character":8,"end_line":210,"end_character":68},"updated":"2019-12-16 20:30:14.000000000","message":"same","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c37fe9158e291756454667581722396749e4a465","unresolved":false,"context_lines":[{"line_number":206,"context_line":"        \"\"\"Convenience prop that lazy-loads root_forbidden from"},{"line_number":207,"context_line":"        request_level_params."},{"line_number":208,"context_line":"        \"\"\""},{"line_number":209,"context_line":"        self.obj_set_defaults(\u0027request_level_params\u0027)"},{"line_number":210,"context_line":"        self.request_level_params.obj_set_defaults(\u0027root_forbidden\u0027)"},{"line_number":211,"context_line":"        return self.request_level_params.root_forbidden"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def _image_meta_from_image(self, image):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_8bad71e8","line":210,"range":{"start_line":209,"start_character":8,"end_line":210,"end_character":68},"in_reply_to":"3fa7e38b_96a45f09","updated":"2020-01-07 20:20:24.000000000","message":"Done","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"72aaf73923ae9be7719143783cb87db9eccba8dd","unresolved":false,"context_lines":[{"line_number":478,"context_line":"        return filt_props"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"    @classmethod"},{"line_number":481,"context_line":"    def from_components(cls, context, instance_uuid, image, flavor,"},{"line_number":482,"context_line":"            numa_topology, pci_requests, filter_properties, instance_group,"},{"line_number":483,"context_line":"            availability_zone, security_groups\u003dNone, project_id\u003dNone,"},{"line_number":484,"context_line":"            user_id\u003dNone, port_resource_requests\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_568fc775","line":481,"range":{"start_line":481,"start_character":8,"end_line":481,"end_character":23},"updated":"2019-12-16 20:30:14.000000000","message":"Don\u0027t have to do anything with this method? I guess as long as the API doesn\u0027t need to use the request_level_params you\u0027re fine. This is also used during resize/cold migrate reschedules though if the compute is really old or the conductor RPC API is pinned to an older version:\n\nhttps://github.com/openstack/nova/blob/d052e72040258b6ab91f53b43e8d45b330b898e1/nova/conductor/manager.py#L320\n\nSemi related to this, the conductor RPC API sorely needs to be bumped to 2.0 to drop a lot of this cold compat stuff that holds things back like this:\n\nhttps://review.opendev.org/#/c/697697/","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"812fd2479fd7a84e1a80edb047f9d498ba916cfe","unresolved":false,"context_lines":[{"line_number":478,"context_line":"        return filt_props"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"    @classmethod"},{"line_number":481,"context_line":"    def from_components(cls, context, instance_uuid, image, flavor,"},{"line_number":482,"context_line":"            numa_topology, pci_requests, filter_properties, instance_group,"},{"line_number":483,"context_line":"            availability_zone, security_groups\u003dNone, project_id\u003dNone,"},{"line_number":484,"context_line":"            user_id\u003dNone, port_resource_requests\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_d6bbb7e1","line":481,"range":{"start_line":481,"start_character":8,"end_line":481,"end_character":23},"in_reply_to":"3fa7e38b_568fc775","updated":"2019-12-16 20:33:14.000000000","message":"Coming back on this for the resize reschedule case - I think we\u0027re OK with not handling request_level_params in that case for the most part because we should have alternative hosts from the initial scheduling request in that case so we don\u0027t need the request_level_params information anymore. That\u0027s assuming (1) the computes are sending the alternate host_list param and (2) conductor isn\u0027t pinned below the version that accepts host_list - again, need to make all of that crap mandatory because we have a lot of assumptions in code about that stuff working a certain way.","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5896e18f0e7edd673dfa9abdd08a685da3371d21","unresolved":false,"context_lines":[{"line_number":478,"context_line":"        return filt_props"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"    @classmethod"},{"line_number":481,"context_line":"    def from_components(cls, context, instance_uuid, image, flavor,"},{"line_number":482,"context_line":"            numa_topology, pci_requests, filter_properties, instance_group,"},{"line_number":483,"context_line":"            availability_zone, security_groups\u003dNone, project_id\u003dNone,"},{"line_number":484,"context_line":"            user_id\u003dNone, port_resource_requests\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_cbaa8918","line":481,"range":{"start_line":481,"start_character":8,"end_line":481,"end_character":23},"in_reply_to":"3fa7e38b_d0c8f475","updated":"2020-01-07 20:27:55.000000000","message":"\u003e Yeah, but also, saying we don\u0027t need it for reschedule because\n \u003e we\u0027ve already pre-picked the alternates is begging to be broken or\n \u003e forgotten in the future. I\u0027m not really saying we should do\n \u003e anything differently here, but ... I guess, just calling dibs on\n \u003e the \"told ya so\" moment in the future.\n\nYup, I know. Just thinking of lots of the brittleness of some of the things I commented on in here:\n\nhttps://review.opendev.org/#/c/697697/\n\ntl;dr getting conductor to 2.0 and making some things required like request spec everywhere during a reschedule would go toward cleaning up a lot of broken assumptions, e.g.:\n\nI188b7aa9cb220f93e69a68f0c3592b28d41ba5b6","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c37fe9158e291756454667581722396749e4a465","unresolved":false,"context_lines":[{"line_number":478,"context_line":"        return filt_props"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"    @classmethod"},{"line_number":481,"context_line":"    def from_components(cls, context, instance_uuid, image, flavor,"},{"line_number":482,"context_line":"            numa_topology, pci_requests, filter_properties, instance_group,"},{"line_number":483,"context_line":"            availability_zone, security_groups\u003dNone, project_id\u003dNone,"},{"line_number":484,"context_line":"            user_id\u003dNone, port_resource_requests\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_4b0699cf","line":481,"range":{"start_line":481,"start_character":8,"end_line":481,"end_character":23},"in_reply_to":"3fa7e38b_d0c8f475","updated":"2020-01-07 20:20:24.000000000","message":"I added a NOTE fwiw","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"50cbf255c5e0301006c9c57cfe82777a95f863c7","unresolved":false,"context_lines":[{"line_number":478,"context_line":"        return filt_props"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"    @classmethod"},{"line_number":481,"context_line":"    def from_components(cls, context, instance_uuid, image, flavor,"},{"line_number":482,"context_line":"            numa_topology, pci_requests, filter_properties, instance_group,"},{"line_number":483,"context_line":"            availability_zone, security_groups\u003dNone, project_id\u003dNone,"},{"line_number":484,"context_line":"            user_id\u003dNone, port_resource_requests\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_d0c8f475","line":481,"range":{"start_line":481,"start_character":8,"end_line":481,"end_character":23},"in_reply_to":"3fa7e38b_d6bbb7e1","updated":"2020-01-07 19:03:17.000000000","message":"\u003e Coming back on this for the resize reschedule case - I think we\u0027re\n \u003e OK with not handling request_level_params in that case for the most\n \u003e part because we should have alternative hosts from the initial\n \u003e scheduling request in that case so we don\u0027t need the\n \u003e request_level_params information anymore. That\u0027s assuming (1) the\n \u003e computes are sending the alternate host_list param and (2)\n \u003e conductor isn\u0027t pinned below the version that accepts host_list -\n \u003e again, need to make all of that crap mandatory because we have a\n \u003e lot of assumptions in code about that stuff working a certain way.\n\nYeah, but also, saying we don\u0027t need it for reschedule because we\u0027ve already pre-picked the alternates is begging to be broken or forgotten in the future. I\u0027m not really saying we should do anything differently here, but ... I guess, just calling dibs on the \"told ya so\" moment in the future.","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"72aaf73923ae9be7719143783cb87db9eccba8dd","unresolved":false,"context_lines":[{"line_number":582,"context_line":"            elif key in (\u0027requested_destination\u0027, \u0027requested_resources\u0027,"},{"line_number":583,"context_line":"                         \u0027network_metadata\u0027, \u0027request_level_params\u0027):"},{"line_number":584,"context_line":"                # Do not override what we already have in the object as this"},{"line_number":585,"context_line":"                # field is not persisted. If save() is called after"},{"line_number":586,"context_line":"                # one of these fields is populated, it will reset the field to"},{"line_number":587,"context_line":"                # None and we\u0027ll lose what is set (but not persisted) on the"},{"line_number":588,"context_line":"                # object."}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_b6ccfbbe","line":585,"range":{"start_line":585,"start_character":24,"end_line":585,"end_character":40},"updated":"2019-12-16 20:30:14.000000000","message":"OK so you do intend for request_level_params to not be persisted - good - but make sure it\u0027s commented as such by the field definition like the rest.","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c37fe9158e291756454667581722396749e4a465","unresolved":false,"context_lines":[{"line_number":582,"context_line":"            elif key in (\u0027requested_destination\u0027, \u0027requested_resources\u0027,"},{"line_number":583,"context_line":"                         \u0027network_metadata\u0027, \u0027request_level_params\u0027):"},{"line_number":584,"context_line":"                # Do not override what we already have in the object as this"},{"line_number":585,"context_line":"                # field is not persisted. If save() is called after"},{"line_number":586,"context_line":"                # one of these fields is populated, it will reset the field to"},{"line_number":587,"context_line":"                # None and we\u0027ll lose what is set (but not persisted) on the"},{"line_number":588,"context_line":"                # object."}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_eb08a5d8","line":585,"range":{"start_line":585,"start_character":24,"end_line":585,"end_character":40},"in_reply_to":"3fa7e38b_b6ccfbbe","updated":"2020-01-07 20:20:24.000000000","message":"Done","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"72aaf73923ae9be7719143783cb87db9eccba8dd","unresolved":false,"context_lines":[{"line_number":660,"context_line":"            if \u0027instance_group\u0027 in spec and spec.instance_group:"},{"line_number":661,"context_line":"                spec.instance_group.members \u003d None"},{"line_number":662,"context_line":"                spec.instance_group.hosts \u003d None"},{"line_number":663,"context_line":"            # NOTE(mriedem): Don\u0027t persist these since those are per-request"},{"line_number":664,"context_line":"            for excluded in (\u0027retry\u0027, \u0027requested_destination\u0027,"},{"line_number":665,"context_line":"                             \u0027requested_resources\u0027, \u0027ignore_hosts\u0027,"},{"line_number":666,"context_line":"                             \u0027request_level_params\u0027):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_96cbffa2","line":663,"range":{"start_line":663,"start_character":55,"end_line":663,"end_character":60},"updated":"2019-12-16 20:30:14.000000000","message":"they","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c37fe9158e291756454667581722396749e4a465","unresolved":false,"context_lines":[{"line_number":660,"context_line":"            if \u0027instance_group\u0027 in spec and spec.instance_group:"},{"line_number":661,"context_line":"                spec.instance_group.members \u003d None"},{"line_number":662,"context_line":"                spec.instance_group.hosts \u003d None"},{"line_number":663,"context_line":"            # NOTE(mriedem): Don\u0027t persist these since those are per-request"},{"line_number":664,"context_line":"            for excluded in (\u0027retry\u0027, \u0027requested_destination\u0027,"},{"line_number":665,"context_line":"                             \u0027requested_resources\u0027, \u0027ignore_hosts\u0027,"},{"line_number":666,"context_line":"                             \u0027request_level_params\u0027):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_6b711545","line":663,"range":{"start_line":663,"start_character":55,"end_line":663,"end_character":60},"in_reply_to":"3fa7e38b_96cbffa2","updated":"2020-01-07 20:20:24.000000000","message":"Done","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"72aaf73923ae9be7719143783cb87db9eccba8dd","unresolved":false,"context_lines":[{"line_number":980,"context_line":"            if \u0027cell\u0027 in primitive:"},{"line_number":981,"context_line":"                del primitive[\u0027cell\u0027]"},{"line_number":982,"context_line":""},{"line_number":983,"context_line":"    def obj_load_attr(self, attrname):"},{"line_number":984,"context_line":"        self.obj_set_defaults(attrname)"},{"line_number":985,"context_line":""},{"line_number":986,"context_line":"    def require_aggregates(self, aggregates):"},{"line_number":987,"context_line":"        \"\"\"Add a set of aggregates to the list of required aggregates."}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_f644b34a","line":984,"range":{"start_line":983,"start_character":4,"end_line":984,"end_character":39},"updated":"2019-12-16 20:30:14.000000000","message":"Didn\u0027t you want to do something like this in RequestLevelParams?","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c37fe9158e291756454667581722396749e4a465","unresolved":false,"context_lines":[{"line_number":980,"context_line":"            if \u0027cell\u0027 in primitive:"},{"line_number":981,"context_line":"                del primitive[\u0027cell\u0027]"},{"line_number":982,"context_line":""},{"line_number":983,"context_line":"    def obj_load_attr(self, attrname):"},{"line_number":984,"context_line":"        self.obj_set_defaults(attrname)"},{"line_number":985,"context_line":""},{"line_number":986,"context_line":"    def require_aggregates(self, aggregates):"},{"line_number":987,"context_line":"        \"\"\"Add a set of aggregates to the list of required aggregates."}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_8b6c916b","line":984,"range":{"start_line":983,"start_character":4,"end_line":984,"end_character":39},"in_reply_to":"3fa7e38b_f644b34a","updated":"2020-01-07 20:20:24.000000000","message":"Done","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"75f95e73945c7007284ba863106f3991cc30d302","unresolved":false,"context_lines":[{"line_number":521,"context_line":""},{"line_number":522,"context_line":"        # NOTE(efried): We don\u0027t need to handle request_level_params here yet"},{"line_number":523,"context_line":"        #  because they\u0027re set dynamically by the scheduler. That could change"},{"line_number":524,"context_line":"        #  in the future."},{"line_number":525,"context_line":""},{"line_number":526,"context_line":"        # NOTE(sbauza): Default the other fields that are not part of the"},{"line_number":527,"context_line":"        # original contract"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_80ca1216","line":524,"updated":"2020-01-09 09:25:35.000000000","message":"And the default is good until the scheduler sets something else.","commit_id":"bcc893a2b03550924f7faf788a35d85eeb66dcbb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"75f95e73945c7007284ba863106f3991cc30d302","unresolved":false,"context_lines":[{"line_number":1227,"context_line":"        # we have a use case for it."},{"line_number":1228,"context_line":"    }"},{"line_number":1229,"context_line":""},{"line_number":1230,"context_line":"    def obj_load_attr(self, attrname):"},{"line_number":1231,"context_line":"        self.obj_set_defaults(attrname)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_a0cdce2f","line":1231,"range":{"start_line":1230,"start_character":0,"end_line":1231,"end_character":39},"updated":"2020-01-09 09:25:35.000000000","message":"I see that this was an agreement with Dan so I won\u0027t challenge it. It just feels strange to me that we are not initializing the object\u0027s fields during the __init__ of the object. I always thought about lazy-load in ovo as a db access optimization (do not do extra joins if the fields coming form the joined tables are never accessed). But here being lazy does not spare us anything but in the other hand contributes the magicness of ovo.","commit_id":"bcc893a2b03550924f7faf788a35d85eeb66dcbb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"435622ce3377719335d4a4f33f46ca8af6da96c8","unresolved":false,"context_lines":[{"line_number":1227,"context_line":"        # we have a use case for it."},{"line_number":1228,"context_line":"    }"},{"line_number":1229,"context_line":""},{"line_number":1230,"context_line":"    def obj_load_attr(self, attrname):"},{"line_number":1231,"context_line":"        self.obj_set_defaults(attrname)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_99d35637","line":1231,"range":{"start_line":1230,"start_character":0,"end_line":1231,"end_character":39},"in_reply_to":"3fa7e38b_07f2b169","updated":"2020-01-10 15:29:55.000000000","message":"How about a nova-specific mixin for objects that can load up defaults generically (objects that aren\u0027t using the db persistence mixin class)?","commit_id":"bcc893a2b03550924f7faf788a35d85eeb66dcbb"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"1b55f8ce67c8dc091b3e40adadcd360914617795","unresolved":false,"context_lines":[{"line_number":1227,"context_line":"        # we have a use case for it."},{"line_number":1228,"context_line":"    }"},{"line_number":1229,"context_line":""},{"line_number":1230,"context_line":"    def obj_load_attr(self, attrname):"},{"line_number":1231,"context_line":"        self.obj_set_defaults(attrname)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_fc24b80f","line":1231,"range":{"start_line":1230,"start_character":0,"end_line":1231,"end_character":39},"in_reply_to":"3fa7e38b_99d35637","updated":"2020-01-10 16:31:07.000000000","message":"Man, that\u0027s a damned good idea.\n\nhttps://review.opendev.org/#/c/701795/","commit_id":"bcc893a2b03550924f7faf788a35d85eeb66dcbb"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d34095f3d5824663e521b56cfbc732792f28fa23","unresolved":false,"context_lines":[{"line_number":1227,"context_line":"        # we have a use case for it."},{"line_number":1228,"context_line":"    }"},{"line_number":1229,"context_line":""},{"line_number":1230,"context_line":"    def obj_load_attr(self, attrname):"},{"line_number":1231,"context_line":"        self.obj_set_defaults(attrname)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_07f2b169","line":1231,"range":{"start_line":1230,"start_character":0,"end_line":1231,"end_character":39},"in_reply_to":"3fa7e38b_a0cdce2f","updated":"2020-01-09 17:00:37.000000000","message":"You\u0027re correct that it doesn\u0027t matter as much for this type of object. The problem is, it does matter for objects that we have where fields represent columns in the database. The reason ovo is designed the way it is (where all fields are optionally set, much like SQLA objects) is so that you can have an object that doesn\u0027t specify a field and not clobber that column in the database.\n\nThat doesn\u0027t matter here in the same way, but the distinction is fairly obscure and having things defaulted in __init__ provides examples for others to copy (and yes, we have other examples in the tree, which were copied and referenced here).\n\nIf we had some way to differentiate objects for which this detail doesn\u0027t matter, then I\u0027d be cool with the obviously-easier method of defaulting those things in init (or better yet, making default\u003d on the field behave more like you\u0027d expect). Until we have that (which will likely involve ovo changes), sticking to a convention seems reasonable.","commit_id":"bcc893a2b03550924f7faf788a35d85eeb66dcbb"}],"nova/scheduler/request_filter.py":[{"author":{"_account_id":21672,"name":"Sundar Nadathur","email":"sundar.nadathur@intel.com","username":"nsundar"},"change_message_id":"1f554b2809fc3b97e641eb5934806f2f82e45830","unresolved":false,"context_lines":[{"line_number":203,"context_line":"    by this mandatory pre-filter."},{"line_number":204,"context_line":"    \"\"\""},{"line_number":205,"context_line":"    trait_name \u003d os_traits.COMPUTE_STATUS_DISABLED"},{"line_number":206,"context_line":"    request_spec.root_forbidden.add(trait_name)"},{"line_number":207,"context_line":"    LOG.debug(\u0027compute_status_filter request filter added forbidden \u0027"},{"line_number":208,"context_line":"              \u0027trait %s\u0027, trait_name)"},{"line_number":209,"context_line":"    return True"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_38081126","line":206,"updated":"2019-12-14 01:17:32.000000000","message":"In the nova-cyborg patch series, we could add this here:\n\n request_spec.root_required.add(\u0027COMPUTE_ACCELERATORS\u0027)\n\nIs that the intended usage?","commit_id":"24b354b87f35d80bfade41e72d03f864728a995d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7c71bd9656121488b117478eccaf28cc18308cdb","unresolved":false,"context_lines":[{"line_number":203,"context_line":"    by this mandatory pre-filter."},{"line_number":204,"context_line":"    \"\"\""},{"line_number":205,"context_line":"    trait_name \u003d os_traits.COMPUTE_STATUS_DISABLED"},{"line_number":206,"context_line":"    request_spec.root_forbidden.add(trait_name)"},{"line_number":207,"context_line":"    LOG.debug(\u0027compute_status_filter request filter added forbidden \u0027"},{"line_number":208,"context_line":"              \u0027trait %s\u0027, trait_name)"},{"line_number":209,"context_line":"    return True"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_78752997","line":206,"in_reply_to":"3fa7e38b_38081126","updated":"2019-12-14 01:24:26.000000000","message":"That\u0027s exactly the intended usage, yes. Not sure if you would add it as a request_filter exactly. Would have to look closer at your (updated) series again.","commit_id":"24b354b87f35d80bfade41e72d03f864728a995d"}],"nova/scheduler/utils.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"72aaf73923ae9be7719143783cb87db9eccba8dd","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        on the RequestSpec based on resources specified outside of the flavor/"},{"line_number":95,"context_line":"        image (e.g. from ports) are incorporated as is, but ensuring that they"},{"line_number":96,"context_line":"        get unique group suffixes."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        :param request_spec: An instance of ``objects.RequestSpec``."},{"line_number":99,"context_line":"        :param enable_pinning_translate: True if the CPU policy extra specs"},{"line_number":100,"context_line":"            should be translated to placement resources and traits."}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_b65abbf2","line":97,"updated":"2019-12-16 20:30:14.000000000","message":"Surprised you didn\u0027t mention anything about root/request level params processing in this otherwise very detailed docstring.","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c37fe9158e291756454667581722396749e4a465","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        on the RequestSpec based on resources specified outside of the flavor/"},{"line_number":95,"context_line":"        image (e.g. from ports) are incorporated as is, but ensuring that they"},{"line_number":96,"context_line":"        get unique group suffixes."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        :param request_spec: An instance of ``objects.RequestSpec``."},{"line_number":99,"context_line":"        :param enable_pinning_translate: True if the CPU policy extra specs"},{"line_number":100,"context_line":"            should be translated to placement resources and traits."}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_ebf98581","line":97,"in_reply_to":"3fa7e38b_b65abbf2","updated":"2020-01-07 20:20:24.000000000","message":"Done","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"72aaf73923ae9be7719143783cb87db9eccba8dd","unresolved":false,"context_lines":[{"line_number":451,"context_line":"        if self._group_policy is not None:"},{"line_number":452,"context_line":"            qparams.append((\u0027group_policy\u0027, self._group_policy))"},{"line_number":453,"context_line":"        if self._root_required or self._root_forbidden:"},{"line_number":454,"context_line":"            vals \u003d sorted(self._root_required) + [\u0027!\u0027 + t for t in"},{"line_number":455,"context_line":"                                                  sorted(self._root_forbidden)]"},{"line_number":456,"context_line":"            qparams.append((\u0027root_required\u0027, \u0027,\u0027.join(vals)))"},{"line_number":457,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_765443c7","line":454,"range":{"start_line":454,"start_character":19,"end_line":454,"end_character":25},"updated":"2019-12-16 20:30:14.000000000","message":"Assuming sorted for test predictability?","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c37fe9158e291756454667581722396749e4a465","unresolved":false,"context_lines":[{"line_number":451,"context_line":"        if self._group_policy is not None:"},{"line_number":452,"context_line":"            qparams.append((\u0027group_policy\u0027, self._group_policy))"},{"line_number":453,"context_line":"        if self._root_required or self._root_forbidden:"},{"line_number":454,"context_line":"            vals \u003d sorted(self._root_required) + [\u0027!\u0027 + t for t in"},{"line_number":455,"context_line":"                                                  sorted(self._root_forbidden)]"},{"line_number":456,"context_line":"            qparams.append((\u0027root_required\u0027, \u0027,\u0027.join(vals)))"},{"line_number":457,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_aba06d92","line":454,"range":{"start_line":454,"start_character":19,"end_line":454,"end_character":25},"in_reply_to":"3fa7e38b_765443c7","updated":"2020-01-07 20:20:24.000000000","message":"Yes, as noted on L407-8","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"}],"nova/tests/functional/test_report_client.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ac2258061337164e62d815cbb75536f3d6df98e3","unresolved":false,"context_lines":[{"line_number":1335,"context_line":"                            ot.COMPUTE_STATUS_DISABLED},"},{"line_number":1336,"context_line":"         \u0027expected_acs\u0027: 1},"},{"line_number":1337,"context_line":"    )"},{"line_number":1338,"context_line":"    def test_allocation_candidates_root_traits(self, data):"},{"line_number":1339,"context_line":"        \"\"\"Smoke test to ensure root_{required|forbidden} percolates from the"},{"line_number":1340,"context_line":"        RequestSpec through to the GET /allocation_candidates response."},{"line_number":1341,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_6da00da6","line":1338,"range":{"start_line":1338,"start_character":8,"end_line":1338,"end_character":46},"updated":"2019-12-13 23:46:55.000000000","message":"Note to reviewers: I didn\u0027t add unit test for building the querystring (that would go somewhere near [1]) because I felt this functional test hit enough permutations to make that unnecessary. Let me know if you disagree.\n\n[1] https://review.opendev.org/#/c/699050/1/nova/tests/unit/scheduler/test_utils.py@278","commit_id":"24b354b87f35d80bfade41e72d03f864728a995d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"72aaf73923ae9be7719143783cb87db9eccba8dd","unresolved":false,"context_lines":[{"line_number":1314,"context_line":"         \u0027root_forbidden\u0027: {},"},{"line_number":1315,"context_line":"         \u0027expected_acs\u0027: 3},"},{"line_number":1316,"context_line":"        # Requiring traits that are on our primary compute culls out the result"},{"line_number":1317,"context_line":"        # invoving `othercn`."},{"line_number":1318,"context_line":"        {\u0027root_required\u0027: {ot.COMPUTE_VOLUME_EXTEND, \u0027CUSTOM_FOO\u0027},"},{"line_number":1319,"context_line":"         \u0027root_forbidden\u0027: {},"},{"line_number":1320,"context_line":"         \u0027expected_acs\u0027: 2},"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_b6ff1bb0","line":1317,"range":{"start_line":1317,"start_character":10,"end_line":1317,"end_character":18},"updated":"2019-12-16 20:30:14.000000000","message":"involving","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c37fe9158e291756454667581722396749e4a465","unresolved":false,"context_lines":[{"line_number":1314,"context_line":"         \u0027root_forbidden\u0027: {},"},{"line_number":1315,"context_line":"         \u0027expected_acs\u0027: 3},"},{"line_number":1316,"context_line":"        # Requiring traits that are on our primary compute culls out the result"},{"line_number":1317,"context_line":"        # invoving `othercn`."},{"line_number":1318,"context_line":"        {\u0027root_required\u0027: {ot.COMPUTE_VOLUME_EXTEND, \u0027CUSTOM_FOO\u0027},"},{"line_number":1319,"context_line":"         \u0027root_forbidden\u0027: {},"},{"line_number":1320,"context_line":"         \u0027expected_acs\u0027: 2},"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_8be811a7","line":1317,"range":{"start_line":1317,"start_character":10,"end_line":1317,"end_character":18},"in_reply_to":"3fa7e38b_b6ff1bb0","updated":"2020-01-07 20:20:24.000000000","message":"Done","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"}],"nova/tests/unit/scheduler/test_request_filter.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"72aaf73923ae9be7719143783cb87db9eccba8dd","unresolved":false,"context_lines":[{"line_number":340,"context_line":"                                      is_bfv\u003dFalse)"},{"line_number":341,"context_line":"        # Assert that we completely skip the filter if disabled"},{"line_number":342,"context_line":"        request_filter.require_image_type_support(self.context, reqspec)"},{"line_number":343,"context_line":"        self.assertEqual(set(), reqspec.root_required)"},{"line_number":344,"context_line":"        self.assertEqual(set(), reqspec.root_forbidden)"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"    def test_require_image_type_support_volume_backed(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_76220357","line":343,"updated":"2019-12-16 20:30:14.000000000","message":"nit: alternatively could just test for length being 0 so we don\u0027t have to care about the low-level data structure.","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c37fe9158e291756454667581722396749e4a465","unresolved":false,"context_lines":[{"line_number":340,"context_line":"                                      is_bfv\u003dFalse)"},{"line_number":341,"context_line":"        # Assert that we completely skip the filter if disabled"},{"line_number":342,"context_line":"        request_filter.require_image_type_support(self.context, reqspec)"},{"line_number":343,"context_line":"        self.assertEqual(set(), reqspec.root_required)"},{"line_number":344,"context_line":"        self.assertEqual(set(), reqspec.root_forbidden)"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"    def test_require_image_type_support_volume_backed(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_2b60fd34","line":343,"in_reply_to":"3fa7e38b_76220357","updated":"2020-01-07 20:20:24.000000000","message":"Done","commit_id":"19800d4e8b8822efae4d0e78452fec5580dc0e2e"}]}
