)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b8ce308fcd4483c46abe88d9ba9cdc9c1de48cb8","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add a new request filter to forbidden aggregates"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Added a new request filter \u0027forbidden_aggregates\u0027 for filtering of hosts by"},{"line_number":10,"context_line":"forbidden aggregates. This filter prepares a list of aggregates that should"},{"line_number":11,"context_line":"be ignored by the placement service. It checks if aggregates has metadata"},{"line_number":12,"context_line":"\u0027trait:\u003ctrait_name\u003e\u003d\u0027required\u0027 and if these traits \u003ctrait_name\u003e are present"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7faddb67_c8f61664","line":9,"updated":"2019-07-16 16:26:47.000000000","message":"nit: long lines","commit_id":"74b48f6f43e6ffcc49048c03cb11de71a0c6affc"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b8ce308fcd4483c46abe88d9ba9cdc9c1de48cb8","unresolved":false,"context_lines":[{"line_number":11,"context_line":"be ignored by the placement service. It checks if aggregates has metadata"},{"line_number":12,"context_line":"\u0027trait:\u003ctrait_name\u003e\u003d\u0027required\u0027 and if these traits \u003ctrait_name\u003e are present"},{"line_number":13,"context_line":"in flavor extra specs or image properties of the request otherwise all those"},{"line_number":14,"context_line":"aggregates will be included in the list of forbidden aggregates."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: I9ab9d7d65378be564b3731b5227ede8cece71bef"},{"line_number":17,"context_line":"Implements: blueprint placement-req-filter-forbidden-aggregates"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7faddb67_488786b6","line":14,"updated":"2019-07-16 16:26:47.000000000","message":"This commit message should mention that the filter is not yet enabled -- a subsequent patch will enable it conditionally via a conf option.","commit_id":"74b48f6f43e6ffcc49048c03cb11de71a0c6affc"}],"nova/scheduler/request_filter.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1c4b8e2ee2f2dc12252d6e3580f5aaa71752ded9","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    flavor_required_traits \u003d resource_req.extract_required_traits()"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    # Get required traits set in image"},{"line_number":68,"context_line":"    resource_req \u003d utils.ResourceRequest.from_image_props(image_properties)"},{"line_number":69,"context_line":"    image_required_traits \u003d resource_req.extract_required_traits()"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    # Combine and prepare unique traits set in flavor and image"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_9b1be3c8","line":68,"range":{"start_line":68,"start_character":0,"end_line":68,"end_character":75},"updated":"2019-08-13 10:01:50.000000000","message":"Can\u0027t you call this with an existing resource request object (from above)...","commit_id":"20bff05402e132156c7664c63dd44d48f1c7e083"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"1036c8b447f8a4b21f366eca56baf4a1da1ef9bf","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    flavor_required_traits \u003d resource_req.extract_required_traits()"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    # Get required traits set in image"},{"line_number":68,"context_line":"    resource_req \u003d utils.ResourceRequest.from_image_props(image_properties)"},{"line_number":69,"context_line":"    image_required_traits \u003d resource_req.extract_required_traits()"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    # Combine and prepare unique traits set in flavor and image"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_b20cb939","line":68,"range":{"start_line":68,"start_character":0,"end_line":68,"end_character":75},"in_reply_to":"7faddb67_9b1be3c8","updated":"2019-08-13 16:00:39.000000000","message":"Done","commit_id":"20bff05402e132156c7664c63dd44d48f1c7e083"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1c4b8e2ee2f2dc12252d6e3580f5aaa71752ded9","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    resource_req \u003d utils.ResourceRequest.from_image_props(image_properties)"},{"line_number":69,"context_line":"    image_required_traits \u003d resource_req.extract_required_traits()"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    # Combine and prepare unique traits set in flavor and image"},{"line_number":72,"context_line":"    image_flavor_traits \u003d flavor_required_traits.union(image_required_traits)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    keys \u003d [\u0027trait:%s\u0027 % trait for trait in image_flavor_traits]"},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_3b78aff6","line":72,"range":{"start_line":71,"start_character":0,"end_line":72,"end_character":77},"updated":"2019-08-13 10:01:50.000000000","message":"And avoid this?\n\nOn an aside, it feels like the Image and Flavor objects should probably gain properties to extract this information rather than having to create ResourceRequest objects only to throw away 90% of the work after. That can be a follow-up though","commit_id":"20bff05402e132156c7664c63dd44d48f1c7e083"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"1036c8b447f8a4b21f366eca56baf4a1da1ef9bf","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    resource_req \u003d utils.ResourceRequest.from_image_props(image_properties)"},{"line_number":69,"context_line":"    image_required_traits \u003d resource_req.extract_required_traits()"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    # Combine and prepare unique traits set in flavor and image"},{"line_number":72,"context_line":"    image_flavor_traits \u003d flavor_required_traits.union(image_required_traits)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    keys \u003d [\u0027trait:%s\u0027 % trait for trait in image_flavor_traits]"},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_7216414c","line":72,"range":{"start_line":71,"start_character":0,"end_line":72,"end_character":77},"in_reply_to":"7faddb67_3b78aff6","updated":"2019-08-13 16:00:39.000000000","message":"Done","commit_id":"20bff05402e132156c7664c63dd44d48f1c7e083"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1c4b8e2ee2f2dc12252d6e3580f5aaa71752ded9","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            ctxt, keys, \u0027trait:\u0027, value\u003d\u0027required\u0027))"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    # Set list of isolated aggregates to destination object of request_spec"},{"line_number":81,"context_line":"    if len(isolated_aggregates) \u003e 0:"},{"line_number":82,"context_line":"        if (\u0027requested_destination\u0027 not in request_spec or"},{"line_number":83,"context_line":"                request_spec.requested_destination is None):"},{"line_number":84,"context_line":"            request_spec.requested_destination \u003d objects.Destination()"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_5b7b2bf3","line":81,"range":{"start_line":81,"start_character":31,"end_line":81,"end_character":36},"updated":"2019-08-13 10:01:50.000000000","message":"nit: don\u0027t need this","commit_id":"20bff05402e132156c7664c63dd44d48f1c7e083"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"1036c8b447f8a4b21f366eca56baf4a1da1ef9bf","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            ctxt, keys, \u0027trait:\u0027, value\u003d\u0027required\u0027))"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    # Set list of isolated aggregates to destination object of request_spec"},{"line_number":81,"context_line":"    if len(isolated_aggregates) \u003e 0:"},{"line_number":82,"context_line":"        if (\u0027requested_destination\u0027 not in request_spec or"},{"line_number":83,"context_line":"                request_spec.requested_destination is None):"},{"line_number":84,"context_line":"            request_spec.requested_destination \u003d objects.Destination()"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_322a097e","line":81,"range":{"start_line":81,"start_character":31,"end_line":81,"end_character":36},"in_reply_to":"7faddb67_5b7b2bf3","updated":"2019-08-13 16:00:39.000000000","message":"Done","commit_id":"20bff05402e132156c7664c63dd44d48f1c7e083"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"7dbf6069a141c6d780c192bb183a3ccec121d5f9","unresolved":false,"context_lines":[{"line_number":50,"context_line":"def isolate_aggregates(ctxt, request_spec):"},{"line_number":51,"context_line":"    \"\"\"Prepare list of aggregates that should be isolated."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    This filter will prepare the list of aggregates that should be"},{"line_number":54,"context_line":"    ignored by the placement service. It checks if aggregates has metadata"},{"line_number":55,"context_line":"    \u0027trait:\u003ctrait_name\u003e\u003d\u0027required\u0027 and if \u003ctrait_name\u003e is not present in"},{"line_number":56,"context_line":"    either of flavor extra specs or image properties, then those aggregates"},{"line_number":57,"context_line":"    will be included in the list of isolated aggregates."},{"line_number":58,"context_line":"    \"\"\""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    flavor_extra_spec \u003d request_spec.flavor.extra_specs"},{"line_number":61,"context_line":"    image_properties \u003d request_spec.image.properties"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_29a377b3","line":58,"range":{"start_line":53,"start_character":3,"end_line":58,"end_character":7},"updated":"2019-08-14 01:22:42.000000000","message":"i want to be 100% confident that that is what this code does.\n\nthis code gets the trait request form the image and flavour and unions them.\n\nthen it accumulates the set of aggregates that request traits that are \"non_matching_by_metadata_keys\" and uses that to produce the list of isolated aggrates.\n\nso this comes down two what the behaviour of .get_non_matching_by_metadata is.\nthis name is really not in tunitive and i dont really know if you are checking if all the traits in the host aggregate are a subset of image_flavor_traits or if you are checking if all the traits in image_flavor_traits are a subeset of the keys in the aggregate.\n\nwhat this code should be doing logiclaly is as follows.\nconstruct the union of the image and metadata traits.\nretiving all host aggregate and there metadata.\nfor each host check if its traits are  a sub set of image_flavor_traits\nif the aggregates required traits are not a subset then it should be added to the isolated_aggregates.\n\nbased on the doc string of get_non_matching_by_metadata i think it should be doing the correct thing but i find sqlalcames abstration to be less readable the raw sql.\n\ncan you confim that the behavior of objects.AggregateList.get_non_matching_by_metadata_keys\nis effectively.\n\nisolated_aggregates \u003d [aggregates for aggregate in aggregates if aggregate.traits not in image_flavor_traits]","commit_id":"695922bfb40dab756a8a6a54433c2293e877ba82"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"892aedd1da4ef810def936887afc6231a15b920f","unresolved":false,"context_lines":[{"line_number":50,"context_line":"def isolate_aggregates(ctxt, request_spec):"},{"line_number":51,"context_line":"    \"\"\"Prepare list of aggregates that should be isolated."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    This filter will prepare the list of aggregates that should be"},{"line_number":54,"context_line":"    ignored by the placement service. It checks if aggregates has metadata"},{"line_number":55,"context_line":"    \u0027trait:\u003ctrait_name\u003e\u003d\u0027required\u0027 and if \u003ctrait_name\u003e is not present in"},{"line_number":56,"context_line":"    either of flavor extra specs or image properties, then those aggregates"},{"line_number":57,"context_line":"    will be included in the list of isolated aggregates."},{"line_number":58,"context_line":"    \"\"\""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    flavor_extra_spec \u003d request_spec.flavor.extra_specs"},{"line_number":61,"context_line":"    image_properties \u003d request_spec.image.properties"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_34ef4eea","line":58,"range":{"start_line":53,"start_character":3,"end_line":58,"end_character":7},"in_reply_to":"7faddb67_29a377b3","updated":"2019-08-14 02:34:41.000000000","message":"I can confirm that\u0027s effectively what it does, yes. (Good luck coming up with a name that makes that obvious - without being trait specific.)\n\nIt is unfortunate that the algorithm is so complex and non intuitive here, but what\u0027s nice is that it makes for a very intuitive user experience.","commit_id":"695922bfb40dab756a8a6a54433c2293e877ba82"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"606a9bcf1721ed685ee7dae95cac7460987e71c2","unresolved":false,"context_lines":[{"line_number":50,"context_line":"def isolate_aggregates(ctxt, request_spec):"},{"line_number":51,"context_line":"    \"\"\"Prepare list of aggregates that should be isolated."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    This filter will prepare the list of aggregates that should be"},{"line_number":54,"context_line":"    ignored by the placement service. It checks if aggregates has metadata"},{"line_number":55,"context_line":"    \u0027trait:\u003ctrait_name\u003e\u003d\u0027required\u0027 and if \u003ctrait_name\u003e is not present in"},{"line_number":56,"context_line":"    either of flavor extra specs or image properties, then those aggregates"},{"line_number":57,"context_line":"    will be included in the list of isolated aggregates."},{"line_number":58,"context_line":"    \"\"\""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    flavor_extra_spec \u003d request_spec.flavor.extra_specs"},{"line_number":61,"context_line":"    image_properties \u003d request_spec.image.properties"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_607c1920","line":58,"range":{"start_line":53,"start_character":3,"end_line":58,"end_character":7},"in_reply_to":"7faddb67_34ef4eea","updated":"2019-08-14 12:41:42.000000000","message":"yes i know i impleted desgined a filter that implements a superset of this algorithm matching on flavor extra specs 3?4? years ago before placement was created. so im glad it finally will be supproted again.\n\nthe out of tree aggregate-instance-type-filter supports this usecase already infact if you enable that filter today\n\nhttps://github.com/openstack/nfv-filters/blob/master/nfv_filters/nova/scheduler/filters/aggregate_instance_type_filter.py\n\nit will work with the exact same metadata values as this will be using and have the same behaviour without requrieing hte placment negitive member of feature although it happens after plamce so its slower in theory as its matching in python not sql.\n\nthe doc are here if you are intersted.\nhttps://github.com/openstack/nfv-filters/blob/master/doc/source/scheduler_filters/aggregate-instance-type-filter.rst\n\nit would allow people using older release to get the same functionality more or less although it only check the flavor.\n\nno reason it could not check the image beyond the fact we dont allow custom medata in the image it has to be for the predfiend set since so we didnt see the use in adding it to the filter at the time.","commit_id":"695922bfb40dab756a8a6a54433c2293e877ba82"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"de40f9e7f39c271ff1fffd79c07d0345bea289c1","unresolved":false,"context_lines":[{"line_number":50,"context_line":"def isolate_aggregates(ctxt, request_spec):"},{"line_number":51,"context_line":"    \"\"\"Prepare list of aggregates that should be isolated."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    This filter will prepare the list of aggregates that should be"},{"line_number":54,"context_line":"    ignored by the placement service. It checks if aggregates has metadata"},{"line_number":55,"context_line":"    \u0027trait:\u003ctrait_name\u003e\u003d\u0027required\u0027 and if \u003ctrait_name\u003e is not present in"},{"line_number":56,"context_line":"    either of flavor extra specs or image properties, then those aggregates"},{"line_number":57,"context_line":"    will be included in the list of isolated aggregates."},{"line_number":58,"context_line":"    \"\"\""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    flavor_extra_spec \u003d request_spec.flavor.extra_specs"},{"line_number":61,"context_line":"    image_properties \u003d request_spec.image.properties"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_20a053f4","line":58,"range":{"start_line":53,"start_character":3,"end_line":58,"end_character":7},"in_reply_to":"7faddb67_607c1920","updated":"2019-08-15 00:21:09.000000000","message":"Done, added more description @ what exactly method is doing.","commit_id":"695922bfb40dab756a8a6a54433c2293e877ba82"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f9bbe785a7f554cdb76b5475e455a225b384eae8","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    # Get required traits set in flavor and image"},{"line_number":64,"context_line":"    resource_req \u003d utils.ResourceRequest.from_extra_specs(flavor_extra_spec)"},{"line_number":65,"context_line":"    resource_req \u003d utils.ResourceRequest.from_image_props(image_properties,"},{"line_number":66,"context_line":"                                                          req\u003dresource_req)"},{"line_number":67,"context_line":"    image_flavor_traits \u003d resource_req.extract_required_traits()"},{"line_number":68,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_03a1bd46","line":65,"range":{"start_line":65,"start_character":4,"end_line":65,"end_character":18},"updated":"2019-08-13 18:51:58.000000000","message":"This is redundant, since you are passing in req\u003d and it modifies that in place. It\u0027s weird behavior for that method (seems like it should be an instance and not class method, but alas).","commit_id":"695922bfb40dab756a8a6a54433c2293e877ba82"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"de40f9e7f39c271ff1fffd79c07d0345bea289c1","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    # Get required traits set in flavor and image"},{"line_number":64,"context_line":"    resource_req \u003d utils.ResourceRequest.from_extra_specs(flavor_extra_spec)"},{"line_number":65,"context_line":"    resource_req \u003d utils.ResourceRequest.from_image_props(image_properties,"},{"line_number":66,"context_line":"                                                          req\u003dresource_req)"},{"line_number":67,"context_line":"    image_flavor_traits \u003d resource_req.extract_required_traits()"},{"line_number":68,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_c0a05ff6","line":65,"range":{"start_line":65,"start_character":4,"end_line":65,"end_character":18},"in_reply_to":"7faddb67_03a1bd46","updated":"2019-08-15 00:21:09.000000000","message":"Done, reverting changes","commit_id":"695922bfb40dab756a8a6a54433c2293e877ba82"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cdb67112eb8a32aa8652d414b8918ff1ab08ccd1","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    # Get required traits set in flavor and image"},{"line_number":64,"context_line":"    resource_req \u003d utils.ResourceRequest.from_extra_specs(flavor_extra_spec)"},{"line_number":65,"context_line":"    resource_req \u003d utils.ResourceRequest.from_image_props(image_properties,"},{"line_number":66,"context_line":"                                                          req\u003dresource_req)"},{"line_number":67,"context_line":"    image_flavor_traits \u003d resource_req.extract_required_traits()"},{"line_number":68,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_e60fcc85","line":65,"range":{"start_line":65,"start_character":4,"end_line":65,"end_character":18},"in_reply_to":"7faddb67_03a1bd46","updated":"2019-08-14 00:17:20.000000000","message":"it would be bettter if it did not mofiy it in place in my opinion. modification of input args is always harder to test since we normally avoid that and it can be missed depending on how we mock things.","commit_id":"695922bfb40dab756a8a6a54433c2293e877ba82"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cdb67112eb8a32aa8652d414b8918ff1ab08ccd1","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    keys \u003d [\u0027trait:%s\u0027 % trait for trait in image_flavor_traits]"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    isolated_aggregates \u003d ("},{"line_number":72,"context_line":"        objects.AggregateList.get_non_matching_by_metadata_keys("},{"line_number":73,"context_line":"            ctxt, keys, \u0027trait:\u0027, value\u003d\u0027required\u0027))"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    # Set list of isolated aggregates to destination object of request_spec"},{"line_number":76,"context_line":"    if len(isolated_aggregates):"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_863db82d","line":73,"range":{"start_line":71,"start_character":5,"end_line":73,"end_character":52},"updated":"2019-08-14 00:17:20.000000000","message":"this seams like it could be quite expensive.\n\npart of me want to say we should be cachieing this some way but then we would have to deal with cache invalidation.\n\ni dont really see anothger way around this however but the performace of this extra db query is certenly something i think we will want to get feedback form larger deployment on . i suspect it might be a limiting factor in how widely this can be used if you have alot of build requst or a lot of aggretates with metadata.","commit_id":"695922bfb40dab756a8a6a54433c2293e877ba82"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5c112c4bbf495df5f2a386122f4ac0b089184366","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            ctxt, keys, \u0027trait:\u0027, value\u003d\u0027required\u0027))"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    # Set list of isolated aggregates to destination object of request_spec"},{"line_number":76,"context_line":"    if len(isolated_aggregates):"},{"line_number":77,"context_line":"        if (\u0027requested_destination\u0027 not in request_spec or"},{"line_number":78,"context_line":"                request_spec.requested_destination is None):"},{"line_number":79,"context_line":"            request_spec.requested_destination \u003d objects.Destination()"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_ddc5ba0b","line":76,"range":{"start_line":76,"start_character":4,"end_line":76,"end_character":31},"updated":"2019-08-14 11:38:39.000000000","message":"could be simply:\n\n    if isolated_aggregates:","commit_id":"695922bfb40dab756a8a6a54433c2293e877ba82"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"de40f9e7f39c271ff1fffd79c07d0345bea289c1","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            ctxt, keys, \u0027trait:\u0027, value\u003d\u0027required\u0027))"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    # Set list of isolated aggregates to destination object of request_spec"},{"line_number":76,"context_line":"    if len(isolated_aggregates):"},{"line_number":77,"context_line":"        if (\u0027requested_destination\u0027 not in request_spec or"},{"line_number":78,"context_line":"                request_spec.requested_destination is None):"},{"line_number":79,"context_line":"            request_spec.requested_destination \u003d objects.Destination()"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_40b46f36","line":76,"range":{"start_line":76,"start_character":4,"end_line":76,"end_character":31},"in_reply_to":"7faddb67_60265919","updated":"2019-08-15 00:21:09.000000000","message":"Done","commit_id":"695922bfb40dab756a8a6a54433c2293e877ba82"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"606a9bcf1721ed685ee7dae95cac7460987e71c2","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            ctxt, keys, \u0027trait:\u0027, value\u003d\u0027required\u0027))"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    # Set list of isolated aggregates to destination object of request_spec"},{"line_number":76,"context_line":"    if len(isolated_aggregates):"},{"line_number":77,"context_line":"        if (\u0027requested_destination\u0027 not in request_spec or"},{"line_number":78,"context_line":"                request_spec.requested_destination is None):"},{"line_number":79,"context_line":"            request_spec.requested_destination \u003d objects.Destination()"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_60265919","line":76,"range":{"start_line":76,"start_character":4,"end_line":76,"end_character":31},"in_reply_to":"7faddb67_ddc5ba0b","updated":"2019-08-14 12:41:42.000000000","message":"+1","commit_id":"695922bfb40dab756a8a6a54433c2293e877ba82"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5c112c4bbf495df5f2a386122f4ac0b089184366","unresolved":false,"context_lines":[{"line_number":79,"context_line":"            request_spec.requested_destination \u003d objects.Destination()"},{"line_number":80,"context_line":"        destination \u003d request_spec.requested_destination"},{"line_number":81,"context_line":"        destination.set_isolated_aggregates("},{"line_number":82,"context_line":"            set([agg.uuid for agg in isolated_aggregates]))"},{"line_number":83,"context_line":"        return True"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    return False"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_dd937aff","line":82,"range":{"start_line":82,"start_character":12,"end_line":82,"end_character":57},"updated":"2019-08-14 11:38:39.000000000","message":"simply:\n\n    {agg.uuid for agg in isolated_aggregates}","commit_id":"695922bfb40dab756a8a6a54433c2293e877ba82"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"de40f9e7f39c271ff1fffd79c07d0345bea289c1","unresolved":false,"context_lines":[{"line_number":79,"context_line":"            request_spec.requested_destination \u003d objects.Destination()"},{"line_number":80,"context_line":"        destination \u003d request_spec.requested_destination"},{"line_number":81,"context_line":"        destination.set_isolated_aggregates("},{"line_number":82,"context_line":"            set([agg.uuid for agg in isolated_aggregates]))"},{"line_number":83,"context_line":"        return True"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    return False"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_0084375d","line":82,"range":{"start_line":82,"start_character":12,"end_line":82,"end_character":57},"in_reply_to":"7faddb67_dd937aff","updated":"2019-08-15 00:21:09.000000000","message":"Done","commit_id":"695922bfb40dab756a8a6a54433c2293e877ba82"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"606a9bcf1721ed685ee7dae95cac7460987e71c2","unresolved":false,"context_lines":[{"line_number":79,"context_line":"            request_spec.requested_destination \u003d objects.Destination()"},{"line_number":80,"context_line":"        destination \u003d request_spec.requested_destination"},{"line_number":81,"context_line":"        destination.set_isolated_aggregates("},{"line_number":82,"context_line":"            set([agg.uuid for agg in isolated_aggregates]))"},{"line_number":83,"context_line":"        return True"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    return False"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_40ed5db5","line":82,"range":{"start_line":82,"start_character":12,"end_line":82,"end_character":57},"in_reply_to":"7faddb67_dd937aff","updated":"2019-08-14 12:41:42.000000000","message":"ya this is also faster as you are not generating a list the converting that list to a set.","commit_id":"695922bfb40dab756a8a6a54433c2293e877ba82"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"12f13596ec5b2c34be54b0719ded320ac2e83d46","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    \"\"\""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    resource_req \u003d utils.ResourceRequest(request_spec)"},{"line_number":66,"context_line":"    image_flavor_traits \u003d resource_req.extract_required_traits()"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    keys \u003d [\u0027trait:%s\u0027 % trait for trait in image_flavor_traits]"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_5bda3279","line":66,"range":{"start_line":66,"start_character":4,"end_line":66,"end_character":23},"updated":"2019-08-29 16:18:01.000000000","message":"required_traits would have been a better name for this, no?","commit_id":"11651ea8c035fe37c4449f8513efadc8ef07a873"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"dd79a973a65ea9022292e8d310cb94f51c449156","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    \"\"\""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    resource_req \u003d utils.ResourceRequest(request_spec)"},{"line_number":66,"context_line":"    image_flavor_traits \u003d resource_req.extract_required_traits()"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    keys \u003d [\u0027trait:%s\u0027 % trait for trait in image_flavor_traits]"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_133573f7","line":66,"range":{"start_line":66,"start_character":4,"end_line":66,"end_character":23},"in_reply_to":"7faddb67_5bda3279","updated":"2019-08-30 11:06:42.000000000","message":"Done","commit_id":"11651ea8c035fe37c4449f8513efadc8ef07a873"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"13c87384c953adc432cfc9871a752204260e0f69","unresolved":false,"context_lines":[{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    isolated_aggregates \u003d ("},{"line_number":72,"context_line":"        objects.aggregate.AggregateList.get_non_matching_by_metadata_keys("},{"line_number":73,"context_line":"            ctxt, keys, \u0027trait:\u0027, value\u003d\u0027required\u0027))"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    # Set list of isolated aggregates to destination object of request_spec"},{"line_number":76,"context_line":"    if isolated_aggregates:"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_c94fce67","line":73,"updated":"2019-09-05 15:33:06.000000000","message":"I think this should have a config knob like everything else in this file. Default to off, allowed to enable. Since the user can control things in the image metadata, I imagine that there\u0027s a potential for exploitation if the operator hasn\u0027t prepared their deployment for such a thing.","commit_id":"ab3f43f8f3eacd004d4f4eec9319c5826ebc6955"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"9f04f52486f6159db64e34134aa642ecd269ddd6","unresolved":false,"context_lines":[{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    isolated_aggregates \u003d ("},{"line_number":72,"context_line":"        objects.aggregate.AggregateList.get_non_matching_by_metadata_keys("},{"line_number":73,"context_line":"            ctxt, keys, \u0027trait:\u0027, value\u003d\u0027required\u0027))"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    # Set list of isolated aggregates to destination object of request_spec"},{"line_number":76,"context_line":"    if isolated_aggregates:"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_e972ca49","line":73,"in_reply_to":"7faddb67_c94fce67","updated":"2019-09-05 15:48:06.000000000","message":"yes, taken care in [1]\n\n[1]: https://review.opendev.org/#/c/667952/21/nova/scheduler/request_filter.py@65","commit_id":"ab3f43f8f3eacd004d4f4eec9319c5826ebc6955"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"13c87384c953adc432cfc9871a752204260e0f69","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                request_spec.requested_destination is None):"},{"line_number":79,"context_line":"            request_spec.requested_destination \u003d objects.Destination()"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        request_spec.requested_destination.isolated_aggregates |\u003d ("},{"line_number":82,"context_line":"            agg.uuid for agg in isolated_aggregates)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_a9fe1202","line":81,"range":{"start_line":81,"start_character":8,"end_line":81,"end_character":62},"updated":"2019-09-05 15:33:06.000000000","message":"I\u0027m guessing this is where the isolated vs forbidden distinction comes from. You want nova to support \"aggregate isolation\" and placement provides \"forbidden aggregates\". It seems to me like the isolation name is just the fascia and that everything internal should be called \"forbidden\", since that\u0027s actually what we\u0027re doing.","commit_id":"ab3f43f8f3eacd004d4f4eec9319c5826ebc6955"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"13c87384c953adc432cfc9871a752204260e0f69","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        request_spec.requested_destination.isolated_aggregates |\u003d ("},{"line_number":82,"context_line":"            agg.uuid for agg in isolated_aggregates)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        return True"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    return False"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_c99d8ebb","line":84,"range":{"start_line":84,"start_character":8,"end_line":84,"end_character":19},"updated":"2019-09-05 15:33:06.000000000","message":"I think this is the wrong interpretation of the meaning of the return value for these. If the request contained no required traits, then we didn\u0027t run. Otherwise, we ran something, even if nothing matched. Since this is used to determine if we should log timing information, we do a potentially expensive query on L71, which may return nothing. Even if that\u0027s the case, this filter did work and thus should be considered to have run, IMHO.","commit_id":"ab3f43f8f3eacd004d4f4eec9319c5826ebc6955"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d25d499de4836cadb6f521a8d0dac25184b95700","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        request_spec.requested_destination.isolated_aggregates |\u003d ("},{"line_number":82,"context_line":"            agg.uuid for agg in isolated_aggregates)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        return True"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    return False"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_cc2a7c7c","line":84,"range":{"start_line":84,"start_character":8,"end_line":84,"end_character":19},"in_reply_to":"7faddb67_c99d8ebb","updated":"2019-09-05 16:10:01.000000000","message":"Are you saying we should only return False if `keys` is empty after L69, else return True even if we don\u0027t add isolated agg filters to the request?","commit_id":"ab3f43f8f3eacd004d4f4eec9319c5826ebc6955"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"386ba5cfaf56e939d3a9c62cba4167219dd36016","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        request_spec.requested_destination.isolated_aggregates |\u003d ("},{"line_number":82,"context_line":"            agg.uuid for agg in isolated_aggregates)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        return True"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    return False"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"5faad753_650a668b","line":84,"range":{"start_line":84,"start_character":8,"end_line":84,"end_character":19},"in_reply_to":"7faddb67_cc2a7c7c","updated":"2019-09-05 21:37:51.000000000","message":"I fixed this. If `keys` is empty, the AggregateList db func still runs and is just as expensive, so I made it only return False if the conf knob is off, True otherwise.","commit_id":"ab3f43f8f3eacd004d4f4eec9319c5826ebc6955"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"13c87384c953adc432cfc9871a752204260e0f69","unresolved":false,"context_lines":[{"line_number":221,"context_line":"    map_az_to_placement_aggregate,"},{"line_number":222,"context_line":"    require_image_type_support,"},{"line_number":223,"context_line":"    compute_status_filter,"},{"line_number":224,"context_line":"]"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"def process_reqspec(ctxt, request_spec):"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_09af26e0","line":224,"updated":"2019-09-05 15:33:06.000000000","message":"You didn\u0027t add the filter to the list here.","commit_id":"ab3f43f8f3eacd004d4f4eec9319c5826ebc6955"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"9f04f52486f6159db64e34134aa642ecd269ddd6","unresolved":false,"context_lines":[{"line_number":221,"context_line":"    map_az_to_placement_aggregate,"},{"line_number":222,"context_line":"    require_image_type_support,"},{"line_number":223,"context_line":"    compute_status_filter,"},{"line_number":224,"context_line":"]"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"def process_reqspec(ctxt, request_spec):"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_89a9d68f","line":224,"in_reply_to":"7faddb67_09af26e0","updated":"2019-09-05 15:48:06.000000000","message":"Its added in later patch [1]\n\n[1]: https://review.opendev.org/#/c/667952/21/nova/scheduler/request_filter.py","commit_id":"ab3f43f8f3eacd004d4f4eec9319c5826ebc6955"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a5ffe4921f7453af987ff870f22c00f68b06b1ca","unresolved":false,"context_lines":[{"line_number":82,"context_line":"            request_spec.requested_destination \u003d objects.Destination()"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        destination \u003d request_spec.requested_destination"},{"line_number":85,"context_line":"        destination.append_forbidden_aggregates("},{"line_number":86,"context_line":"            agg.uuid for agg in isolated_aggregates)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    return True"}],"source_content_type":"text/x-python","patch_set":20,"id":"5faad753_76e1879a","line":85,"updated":"2019-09-09 20:25:19.000000000","message":"This looks cleaner to me than what you had before anyway, so...++","commit_id":"bb35f76b4f92fc6acadc3264004a0afb94cc9b8c"}],"nova/scheduler/utils.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f9bbe785a7f554cdb76b5475e455a225b384eae8","unresolved":false,"context_lines":[{"line_number":273,"context_line":"        for rg in self._rg_by_id.values():"},{"line_number":274,"context_line":"            required_traits.update(rg.required_traits)"},{"line_number":275,"context_line":"        return required_traits"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"    def to_querystring(self):"},{"line_number":278,"context_line":"        \"\"\"Produce a querystring of the form expected by"},{"line_number":279,"context_line":"        GET /allocation_candidates."}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_03ba1d6d","line":276,"updated":"2019-08-13 18:51:58.000000000","message":"Where is the test for this? It\u0027s tested implicitly by the object test, but confirming things like that this returns a set instead of a list with dupes would be good, at a minimum.","commit_id":"695922bfb40dab756a8a6a54433c2293e877ba82"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"de40f9e7f39c271ff1fffd79c07d0345bea289c1","unresolved":false,"context_lines":[{"line_number":273,"context_line":"        for rg in self._rg_by_id.values():"},{"line_number":274,"context_line":"            required_traits.update(rg.required_traits)"},{"line_number":275,"context_line":"        return required_traits"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"    def to_querystring(self):"},{"line_number":278,"context_line":"        \"\"\"Produce a querystring of the form expected by"},{"line_number":279,"context_line":"        GET /allocation_candidates."}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_20ee1322","line":276,"in_reply_to":"7faddb67_03ba1d6d","updated":"2019-08-15 00:21:09.000000000","message":"Done","commit_id":"695922bfb40dab756a8a6a54433c2293e877ba82"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"12f13596ec5b2c34be54b0719ded320ac2e83d46","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        - ``resources:$RESOURCE_CLASS``: $AMOUNT"},{"line_number":66,"context_line":"        - ``resources$N:$RESOURCE_CLASS``: $AMOUNT"},{"line_number":67,"context_line":"        - ``trait:$TRAIT_NAME``: \"required\""},{"line_number":68,"context_line":"        - ``trait$N:$TRAIT_NAME``: \"required\""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        .. note::"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_7bf12ede","line":68,"updated":"2019-08-29 16:18:01.000000000","message":"here","commit_id":"11651ea8c035fe37c4449f8513efadc8ef07a873"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"12f13596ec5b2c34be54b0719ded320ac2e83d46","unresolved":false,"context_lines":[{"line_number":268,"context_line":"                    resource_dict.pop(rclass)"},{"line_number":269,"context_line":"        self._clean_empties()"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"    def extract_required_traits(self):"},{"line_number":272,"context_line":"        \"\"\"Return total set of required traits for request.\"\"\""},{"line_number":273,"context_line":"        return self._rg_by_id[None].required_traits"},{"line_number":274,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_fbd3de35","line":271,"updated":"2019-08-29 16:18:01.000000000","message":"Any reason not to make this a property, perhaps dropping the \u0027extract_\u0027 prefix in the process?","commit_id":"11651ea8c035fe37c4449f8513efadc8ef07a873"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"dd79a973a65ea9022292e8d310cb94f51c449156","unresolved":false,"context_lines":[{"line_number":268,"context_line":"                    resource_dict.pop(rclass)"},{"line_number":269,"context_line":"        self._clean_empties()"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"    def extract_required_traits(self):"},{"line_number":272,"context_line":"        \"\"\"Return total set of required traits for request.\"\"\""},{"line_number":273,"context_line":"        return self._rg_by_id[None].required_traits"},{"line_number":274,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_93096332","line":271,"in_reply_to":"7faddb67_fbd3de35","updated":"2019-08-30 11:06:42.000000000","message":"Removing this, since we have similar def all_required_traits() at [1]\n\n[1]: https://opendev.org/openstack/nova/src/branch/master/nova/scheduler/utils.py#L327","commit_id":"11651ea8c035fe37c4449f8513efadc8ef07a873"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"12f13596ec5b2c34be54b0719ded320ac2e83d46","unresolved":false,"context_lines":[{"line_number":270,"context_line":""},{"line_number":271,"context_line":"    def extract_required_traits(self):"},{"line_number":272,"context_line":"        \"\"\"Return total set of required traits for request.\"\"\""},{"line_number":273,"context_line":"        return self._rg_by_id[None].required_traits"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"    def to_querystring(self):"},{"line_number":276,"context_line":"        \"\"\"Produce a querystring of the form expected by"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_bb0fa6de","line":273,"range":{"start_line":273,"start_character":0,"end_line":273,"end_character":51},"updated":"2019-08-29 16:18:01.000000000","message":"Based on [1], it seems traits can be requested against multiple resource providers. Don\u0027t we need to handle those? If so, we should be doing something like \u0027merged_resources\u0027 (perhaps \u0027merged_traits\u0027?)\n\n[1] https://review.opendev.org/#/c/671075/11/nova/scheduler/utils.py@68","commit_id":"11651ea8c035fe37c4449f8513efadc8ef07a873"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"51e9731483ad88dbb0c31941e91e32292e98166f","unresolved":false,"context_lines":[{"line_number":268,"context_line":"                    resource_dict.pop(rclass)"},{"line_number":269,"context_line":"        self._clean_empties()"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"    def extract_required_traits(self):"},{"line_number":272,"context_line":"        \"\"\"Return total set of required traits for request.\"\"\""},{"line_number":273,"context_line":"        return self._rg_by_id[None].required_traits"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"    def to_querystring(self):"},{"line_number":276,"context_line":"        \"\"\"Produce a querystring of the form expected by"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_15324c10","line":273,"range":{"start_line":271,"start_character":4,"end_line":273,"end_character":51},"updated":"2019-08-29 13:28:33.000000000","message":"Retrieved required traits from self._rg_by_id\nSince flatten \u0027ResourceRequest.from_extra_specs\u0027, \u0027from_image_props\u0027 at [1]\n\n[1]: https://review.opendev.org/#/c/674894/","commit_id":"11651ea8c035fe37c4449f8513efadc8ef07a873"}],"nova/tests/functional/test_aggregates.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7bd2bba897198dffadded18f33bacd25107b347c","unresolved":false,"context_lines":[{"line_number":457,"context_line":""},{"line_number":458,"context_line":"        # NOTE(shilpasd): To test `isolate_aggregates` request filter, removed"},{"line_number":459,"context_line":"        # following filters which also filters hosts based on aggregate"},{"line_number":460,"context_line":"        # metadata."},{"line_number":461,"context_line":"        if \u0027AggregateImagePropertiesIsolation\u0027 in filters:"},{"line_number":462,"context_line":"            filters.remove(\u0027AggregateImagePropertiesIsolation\u0027)"},{"line_number":463,"context_line":"        if \u0027AggregateInstanceExtraSpecsFilter\u0027 in filters:"}],"source_content_type":"text/x-python","patch_set":17,"id":"5faad753_a87a5d85","line":460,"updated":"2019-09-06 20:06:16.000000000","message":"Why is this necessary? Don\u0027t these filter based on things that are in instance/image such that if they\u0027re empty we\u0027ll just select all of them? I\u0027d just hate to merge this only to find out that they\u0027re not compatible in some way.","commit_id":"bb7a931d10ad4425406685ff3d82a62e7bf9c662"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"8a3b695746f8030b504dd492d7c122eca6b62516","unresolved":false,"context_lines":[{"line_number":457,"context_line":""},{"line_number":458,"context_line":"        # NOTE(shilpasd): To test `isolate_aggregates` request filter, removed"},{"line_number":459,"context_line":"        # following filters which also filters hosts based on aggregate"},{"line_number":460,"context_line":"        # metadata."},{"line_number":461,"context_line":"        if \u0027AggregateImagePropertiesIsolation\u0027 in filters:"},{"line_number":462,"context_line":"            filters.remove(\u0027AggregateImagePropertiesIsolation\u0027)"},{"line_number":463,"context_line":"        if \u0027AggregateInstanceExtraSpecsFilter\u0027 in filters:"}],"source_content_type":"text/x-python","patch_set":17,"id":"5faad753_9cbc866a","line":460,"in_reply_to":"5faad753_3c6c7235","updated":"2019-09-06 21:36:44.000000000","message":"No, in scheduler stuff I want as few things different from the standard config as possible. So, if you really want tests with these disabled, then also give me tests with them enabled and show that the exact same actual test works either way. Otherwise, I don\u0027t know about interactions.","commit_id":"bb7a931d10ad4425406685ff3d82a62e7bf9c662"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"67f4416308c1849ee2fee87f29917a1dacaf9708","unresolved":false,"context_lines":[{"line_number":457,"context_line":""},{"line_number":458,"context_line":"        # NOTE(shilpasd): To test `isolate_aggregates` request filter, removed"},{"line_number":459,"context_line":"        # following filters which also filters hosts based on aggregate"},{"line_number":460,"context_line":"        # metadata."},{"line_number":461,"context_line":"        if \u0027AggregateImagePropertiesIsolation\u0027 in filters:"},{"line_number":462,"context_line":"            filters.remove(\u0027AggregateImagePropertiesIsolation\u0027)"},{"line_number":463,"context_line":"        if \u0027AggregateInstanceExtraSpecsFilter\u0027 in filters:"}],"source_content_type":"text/x-python","patch_set":17,"id":"5faad753_c1c0cf53","line":460,"in_reply_to":"5faad753_9cbc866a","updated":"2019-09-07 15:10:09.000000000","message":"If the test work without the filters removed, then let\u0027s not remove them to get better coverage.\n\nI run these tests with all the default filters and they are passing.","commit_id":"bb7a931d10ad4425406685ff3d82a62e7bf9c662"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d56efe983c3a419d3f8a8c14650e1694e6c04141","unresolved":false,"context_lines":[{"line_number":457,"context_line":""},{"line_number":458,"context_line":"        # NOTE(shilpasd): To test `isolate_aggregates` request filter, removed"},{"line_number":459,"context_line":"        # following filters which also filters hosts based on aggregate"},{"line_number":460,"context_line":"        # metadata."},{"line_number":461,"context_line":"        if \u0027AggregateImagePropertiesIsolation\u0027 in filters:"},{"line_number":462,"context_line":"            filters.remove(\u0027AggregateImagePropertiesIsolation\u0027)"},{"line_number":463,"context_line":"        if \u0027AggregateInstanceExtraSpecsFilter\u0027 in filters:"}],"source_content_type":"text/x-python","patch_set":17,"id":"5faad753_3c6c7235","line":460,"in_reply_to":"5faad753_a87a5d85","updated":"2019-09-06 21:32:45.000000000","message":"I tried commenting out these lines and the tests still pass. But I would probably have done the same if I were writing these, just to make sure the other filters weren\u0027t interfering with my results by removing other things \"accidentally\" due to some incidental part of the setup.\n\nAre you asking for a test case that combines forbidden aggregates with these filters (when they\u0027re actually doing something) to make sure they work in concert?","commit_id":"bb7a931d10ad4425406685ff3d82a62e7bf9c662"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"31b67a3db7660146e4341a2206a1623066c8f7b5","unresolved":false,"context_lines":[{"line_number":457,"context_line":""},{"line_number":458,"context_line":"        # NOTE(shilpasd): To test `isolate_aggregates` request filter, removed"},{"line_number":459,"context_line":"        # following filters which also filters hosts based on aggregate"},{"line_number":460,"context_line":"        # metadata."},{"line_number":461,"context_line":"        if \u0027AggregateImagePropertiesIsolation\u0027 in filters:"},{"line_number":462,"context_line":"            filters.remove(\u0027AggregateImagePropertiesIsolation\u0027)"},{"line_number":463,"context_line":"        if \u0027AggregateInstanceExtraSpecsFilter\u0027 in filters:"}],"source_content_type":"text/x-python","patch_set":17,"id":"5faad753_e374ea9b","line":460,"in_reply_to":"5faad753_c1c0cf53","updated":"2019-09-08 17:59:16.000000000","message":"Done, as suggested added \u0027IsolateAggregateFilterConsolidatedTest\u0027 where enabled AggregateImagePropertiesIsolation and AggregateInstanceExtraSpecsFilterfilters along with isolate aggregate filter.","commit_id":"bb7a931d10ad4425406685ff3d82a62e7bf9c662"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7bd2bba897198dffadded18f33bacd25107b347c","unresolved":false,"context_lines":[{"line_number":498,"context_line":"        self._set_provider_traits(rp_uuid1, [\u0027HW_CPU_X86_VMX\u0027,"},{"line_number":499,"context_line":"                                             \u0027HW_CPU_X86_SGX\u0027])"},{"line_number":500,"context_line":"        self._set_traits_on_aggregate(\u0027only-host1\u0027, [\u0027HW_CPU_X86_VMX\u0027,"},{"line_number":501,"context_line":"                                      \u0027HW_CPU_X86_SGX\u0027])"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"        rp_uuid2 \u003d self._get_provider_uuid_by_host(\u0027host2\u0027)"},{"line_number":504,"context_line":"        self._set_provider_traits(rp_uuid2, [\u0027HW_CPU_X86_VMX\u0027,"}],"source_content_type":"text/x-python","patch_set":17,"id":"5faad753_c8b7993a","line":501,"range":{"start_line":501,"start_character":37,"end_line":501,"end_character":39},"updated":"2019-09-06 20:06:16.000000000","message":"This should align with the trait above it. I\u0027m surprised pep8 isn\u0027t complaining.","commit_id":"bb7a931d10ad4425406685ff3d82a62e7bf9c662"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"31b67a3db7660146e4341a2206a1623066c8f7b5","unresolved":false,"context_lines":[{"line_number":498,"context_line":"        self._set_provider_traits(rp_uuid1, [\u0027HW_CPU_X86_VMX\u0027,"},{"line_number":499,"context_line":"                                             \u0027HW_CPU_X86_SGX\u0027])"},{"line_number":500,"context_line":"        self._set_traits_on_aggregate(\u0027only-host1\u0027, [\u0027HW_CPU_X86_VMX\u0027,"},{"line_number":501,"context_line":"                                      \u0027HW_CPU_X86_SGX\u0027])"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"        rp_uuid2 \u003d self._get_provider_uuid_by_host(\u0027host2\u0027)"},{"line_number":504,"context_line":"        self._set_provider_traits(rp_uuid2, [\u0027HW_CPU_X86_VMX\u0027,"}],"source_content_type":"text/x-python","patch_set":17,"id":"5faad753_039b46c9","line":501,"range":{"start_line":501,"start_character":37,"end_line":501,"end_character":39},"in_reply_to":"5faad753_1c4c16c6","updated":"2019-09-08 17:59:16.000000000","message":"Done","commit_id":"bb7a931d10ad4425406685ff3d82a62e7bf9c662"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d56efe983c3a419d3f8a8c14650e1694e6c04141","unresolved":false,"context_lines":[{"line_number":498,"context_line":"        self._set_provider_traits(rp_uuid1, [\u0027HW_CPU_X86_VMX\u0027,"},{"line_number":499,"context_line":"                                             \u0027HW_CPU_X86_SGX\u0027])"},{"line_number":500,"context_line":"        self._set_traits_on_aggregate(\u0027only-host1\u0027, [\u0027HW_CPU_X86_VMX\u0027,"},{"line_number":501,"context_line":"                                      \u0027HW_CPU_X86_SGX\u0027])"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"        rp_uuid2 \u003d self._get_provider_uuid_by_host(\u0027host2\u0027)"},{"line_number":504,"context_line":"        self._set_provider_traits(rp_uuid2, [\u0027HW_CPU_X86_VMX\u0027,"}],"source_content_type":"text/x-python","patch_set":17,"id":"5faad753_1c4c16c6","line":501,"range":{"start_line":501,"start_character":37,"end_line":501,"end_character":39},"in_reply_to":"5faad753_c8b7993a","updated":"2019-09-06 21:32:45.000000000","message":"Hm, I thought this would be one of the E1xx whitespace rules we\u0027re ignoring [1], but I tried reinstating those and flake8 still doesn\u0027t complain about this.\n\nIn any case, I agree the alignment could be improved. (I would do it like\n\n self._set_traits_on_aggregate(\n      \u0027only-host1\u0027,\n      [\u0027HW_CPU_X86_VMX\u0027, \u0027HW_CPU_X86_SGX\u0027])\n\nor similar, personally.)\n\n[1] https://opendev.org/openstack/nova/src/branch/master/tox.ini#L243","commit_id":"bb7a931d10ad4425406685ff3d82a62e7bf9c662"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7bd2bba897198dffadded18f33bacd25107b347c","unresolved":false,"context_lines":[{"line_number":504,"context_line":"        self._set_provider_traits(rp_uuid2, [\u0027HW_CPU_X86_VMX\u0027,"},{"line_number":505,"context_line":"                                             \u0027HW_CPU_X86_SGX\u0027])"},{"line_number":506,"context_line":"        self._set_traits_on_aggregate(\u0027only-host2\u0027, [\u0027HW_CPU_X86_VMX\u0027,"},{"line_number":507,"context_line":"                                      \u0027HW_CPU_X86_SGX\u0027])"},{"line_number":508,"context_line":""},{"line_number":509,"context_line":"        server \u003d self._boot_server("},{"line_number":510,"context_line":"            flavor_id\u003dself.flavor_without_trait[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":17,"id":"5faad753_a8881d71","line":507,"range":{"start_line":507,"start_character":38,"end_line":507,"end_character":39},"updated":"2019-09-06 20:06:16.000000000","message":"This too. Your _set_provider_traits() lines are correct.","commit_id":"bb7a931d10ad4425406685ff3d82a62e7bf9c662"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"31b67a3db7660146e4341a2206a1623066c8f7b5","unresolved":false,"context_lines":[{"line_number":504,"context_line":"        self._set_provider_traits(rp_uuid2, [\u0027HW_CPU_X86_VMX\u0027,"},{"line_number":505,"context_line":"                                             \u0027HW_CPU_X86_SGX\u0027])"},{"line_number":506,"context_line":"        self._set_traits_on_aggregate(\u0027only-host2\u0027, [\u0027HW_CPU_X86_VMX\u0027,"},{"line_number":507,"context_line":"                                      \u0027HW_CPU_X86_SGX\u0027])"},{"line_number":508,"context_line":""},{"line_number":509,"context_line":"        server \u003d self._boot_server("},{"line_number":510,"context_line":"            flavor_id\u003dself.flavor_without_trait[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":17,"id":"5faad753_23a0c2f4","line":507,"range":{"start_line":507,"start_character":38,"end_line":507,"end_character":39},"in_reply_to":"5faad753_a8881d71","updated":"2019-09-08 17:59:16.000000000","message":"Done","commit_id":"bb7a931d10ad4425406685ff3d82a62e7bf9c662"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"67f4416308c1849ee2fee87f29917a1dacaf9708","unresolved":false,"context_lines":[{"line_number":511,"context_line":"            image_id\u003dself.image_id_without_trait)"},{"line_number":512,"context_line":"        self.assertIsNone(self._get_instance_host(server))"},{"line_number":513,"context_line":"        server \u003d self.api.get_server(server[\u0027id\u0027])"},{"line_number":514,"context_line":"        self.assertEqual(\u0027ERROR\u0027, server[\u0027status\u0027])"},{"line_number":515,"context_line":""},{"line_number":516,"context_line":"    def test_filter_without_trait(self):"},{"line_number":517,"context_line":"        \"\"\"Test \u0027isolate_aggregates\u0027 filter with valid hosts."}],"source_content_type":"text/x-python","patch_set":17,"id":"5faad753_6198fb69","line":514,"updated":"2019-09-07 15:10:09.000000000","message":"nit: I would assert that the ERROR is really a NoValidHost.\n\n  self.assertIn(\u0027No valid host\u0027, server[\u0027fault\u0027][\u0027message\u0027])","commit_id":"bb7a931d10ad4425406685ff3d82a62e7bf9c662"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"31b67a3db7660146e4341a2206a1623066c8f7b5","unresolved":false,"context_lines":[{"line_number":511,"context_line":"            image_id\u003dself.image_id_without_trait)"},{"line_number":512,"context_line":"        self.assertIsNone(self._get_instance_host(server))"},{"line_number":513,"context_line":"        server \u003d self.api.get_server(server[\u0027id\u0027])"},{"line_number":514,"context_line":"        self.assertEqual(\u0027ERROR\u0027, server[\u0027status\u0027])"},{"line_number":515,"context_line":""},{"line_number":516,"context_line":"    def test_filter_without_trait(self):"},{"line_number":517,"context_line":"        \"\"\"Test \u0027isolate_aggregates\u0027 filter with valid hosts."}],"source_content_type":"text/x-python","patch_set":17,"id":"5faad753_c3a44e0b","line":514,"in_reply_to":"5faad753_6198fb69","updated":"2019-09-08 17:59:16.000000000","message":"Done","commit_id":"bb7a931d10ad4425406685ff3d82a62e7bf9c662"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7bd2bba897198dffadded18f33bacd25107b347c","unresolved":false,"context_lines":[{"line_number":538,"context_line":"        booted on host with matching required traits set on aggregates."},{"line_number":539,"context_line":"        \"\"\""},{"line_number":540,"context_line":""},{"line_number":541,"context_line":"        rp_uuid \u003d self._get_provider_uuid_by_host(\u0027host2\u0027)"},{"line_number":542,"context_line":"        self._set_provider_traits(rp_uuid, [\u0027HW_GPU_API_DXVA\u0027])"},{"line_number":543,"context_line":""},{"line_number":544,"context_line":"        rp_uuid1 \u003d self._get_provider_uuid_by_host(\u0027host1\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"5faad753_a8ed7d26","line":541,"range":{"start_line":541,"start_character":8,"end_line":541,"end_character":15},"updated":"2019-09-06 20:06:16.000000000","message":"This is confusing. Do what you do above and make these rp_uuid1 and rp_uuid2, but corresponding to the host1 and host2. Right now you have rp_uuid for host2, and ro_uuid1 for host1.","commit_id":"bb7a931d10ad4425406685ff3d82a62e7bf9c662"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"31b67a3db7660146e4341a2206a1623066c8f7b5","unresolved":false,"context_lines":[{"line_number":538,"context_line":"        booted on host with matching required traits set on aggregates."},{"line_number":539,"context_line":"        \"\"\""},{"line_number":540,"context_line":""},{"line_number":541,"context_line":"        rp_uuid \u003d self._get_provider_uuid_by_host(\u0027host2\u0027)"},{"line_number":542,"context_line":"        self._set_provider_traits(rp_uuid, [\u0027HW_GPU_API_DXVA\u0027])"},{"line_number":543,"context_line":""},{"line_number":544,"context_line":"        rp_uuid1 \u003d self._get_provider_uuid_by_host(\u0027host1\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"5faad753_e3a94adf","line":541,"range":{"start_line":541,"start_character":8,"end_line":541,"end_character":15},"in_reply_to":"5faad753_a8ed7d26","updated":"2019-09-08 17:59:16.000000000","message":"Done","commit_id":"bb7a931d10ad4425406685ff3d82a62e7bf9c662"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7bd2bba897198dffadded18f33bacd25107b347c","unresolved":false,"context_lines":[{"line_number":561,"context_line":"        booted on host with exact matching required traits set on aggregates."},{"line_number":562,"context_line":"        \"\"\""},{"line_number":563,"context_line":""},{"line_number":564,"context_line":"        rp_uuid \u003d self._get_provider_uuid_by_host(\u0027host2\u0027)"},{"line_number":565,"context_line":"        self._set_provider_traits(rp_uuid, [\u0027HW_CPU_X86_SGX\u0027])"},{"line_number":566,"context_line":""},{"line_number":567,"context_line":"        rp_uuid1 \u003d self._get_provider_uuid_by_host(\u0027host1\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"5faad753_48f2c908","line":564,"updated":"2019-09-06 20:06:16.000000000","message":"Here too","commit_id":"bb7a931d10ad4425406685ff3d82a62e7bf9c662"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"31b67a3db7660146e4341a2206a1623066c8f7b5","unresolved":false,"context_lines":[{"line_number":561,"context_line":"        booted on host with exact matching required traits set on aggregates."},{"line_number":562,"context_line":"        \"\"\""},{"line_number":563,"context_line":""},{"line_number":564,"context_line":"        rp_uuid \u003d self._get_provider_uuid_by_host(\u0027host2\u0027)"},{"line_number":565,"context_line":"        self._set_provider_traits(rp_uuid, [\u0027HW_CPU_X86_SGX\u0027])"},{"line_number":566,"context_line":""},{"line_number":567,"context_line":"        rp_uuid1 \u003d self._get_provider_uuid_by_host(\u0027host1\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"5faad753_83ae56e5","line":564,"in_reply_to":"5faad753_48f2c908","updated":"2019-09-08 17:59:16.000000000","message":"Done","commit_id":"bb7a931d10ad4425406685ff3d82a62e7bf9c662"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"67f4416308c1849ee2fee87f29917a1dacaf9708","unresolved":false,"context_lines":[{"line_number":642,"context_line":""},{"line_number":643,"context_line":"        self.assertIsNone(self._get_instance_host(server))"},{"line_number":644,"context_line":"        server \u003d self.api.get_server(server[\u0027id\u0027])"},{"line_number":645,"context_line":"        self.assertEqual(\u0027ERROR\u0027, server[\u0027status\u0027])"},{"line_number":646,"context_line":""},{"line_number":647,"context_line":"    def test_filter_with_traits_image_flavor_disjoint_of_aggregates(self):"},{"line_number":648,"context_line":"        \"\"\"Test filter with image/flav required traits disjoint of aggregates."}],"source_content_type":"text/x-python","patch_set":17,"id":"5faad753_01a9077a","line":645,"updated":"2019-09-07 15:10:09.000000000","message":"nit: assert that this is really a NoValidHost","commit_id":"bb7a931d10ad4425406685ff3d82a62e7bf9c662"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"31b67a3db7660146e4341a2206a1623066c8f7b5","unresolved":false,"context_lines":[{"line_number":642,"context_line":""},{"line_number":643,"context_line":"        self.assertIsNone(self._get_instance_host(server))"},{"line_number":644,"context_line":"        server \u003d self.api.get_server(server[\u0027id\u0027])"},{"line_number":645,"context_line":"        self.assertEqual(\u0027ERROR\u0027, server[\u0027status\u0027])"},{"line_number":646,"context_line":""},{"line_number":647,"context_line":"    def test_filter_with_traits_image_flavor_disjoint_of_aggregates(self):"},{"line_number":648,"context_line":"        \"\"\"Test filter with image/flav required traits disjoint of aggregates."}],"source_content_type":"text/x-python","patch_set":17,"id":"5faad753_a3ab52d4","line":645,"in_reply_to":"5faad753_01a9077a","updated":"2019-09-08 17:59:16.000000000","message":"Done","commit_id":"bb7a931d10ad4425406685ff3d82a62e7bf9c662"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"67f4416308c1849ee2fee87f29917a1dacaf9708","unresolved":false,"context_lines":[{"line_number":676,"context_line":""},{"line_number":677,"context_line":"        self.assertIsNone(self._get_instance_host(server))"},{"line_number":678,"context_line":"        server \u003d self.api.get_server(server[\u0027id\u0027])"},{"line_number":679,"context_line":"        self.assertEqual(\u0027ERROR\u0027, server[\u0027status\u0027])"},{"line_number":680,"context_line":""},{"line_number":681,"context_line":""},{"line_number":682,"context_line":"class TestAggregateFiltersTogether(AggregateRequestFiltersTest):"}],"source_content_type":"text/x-python","patch_set":17,"id":"5faad753_a1b7d3d8","line":679,"updated":"2019-09-07 15:10:09.000000000","message":"ditto","commit_id":"bb7a931d10ad4425406685ff3d82a62e7bf9c662"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"31b67a3db7660146e4341a2206a1623066c8f7b5","unresolved":false,"context_lines":[{"line_number":676,"context_line":""},{"line_number":677,"context_line":"        self.assertIsNone(self._get_instance_host(server))"},{"line_number":678,"context_line":"        server \u003d self.api.get_server(server[\u0027id\u0027])"},{"line_number":679,"context_line":"        self.assertEqual(\u0027ERROR\u0027, server[\u0027status\u0027])"},{"line_number":680,"context_line":""},{"line_number":681,"context_line":""},{"line_number":682,"context_line":"class TestAggregateFiltersTogether(AggregateRequestFiltersTest):"}],"source_content_type":"text/x-python","patch_set":17,"id":"5faad753_43b85e29","line":679,"in_reply_to":"5faad753_a1b7d3d8","updated":"2019-09-08 17:59:16.000000000","message":"Done","commit_id":"bb7a931d10ad4425406685ff3d82a62e7bf9c662"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"67f4416308c1849ee2fee87f29917a1dacaf9708","unresolved":false,"context_lines":[{"line_number":677,"context_line":"        self.assertIsNone(self._get_instance_host(server))"},{"line_number":678,"context_line":"        server \u003d self.api.get_server(server[\u0027id\u0027])"},{"line_number":679,"context_line":"        self.assertEqual(\u0027ERROR\u0027, server[\u0027status\u0027])"},{"line_number":680,"context_line":""},{"line_number":681,"context_line":""},{"line_number":682,"context_line":"class TestAggregateFiltersTogether(AggregateRequestFiltersTest):"},{"line_number":683,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":17,"id":"5faad753_c1e1afd2","line":680,"updated":"2019-09-07 15:10:09.000000000","message":"Nice comprehensive set of tests","commit_id":"bb7a931d10ad4425406685ff3d82a62e7bf9c662"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d56efe983c3a419d3f8a8c14650e1694e6c04141","unresolved":false,"context_lines":[{"line_number":696,"context_line":"        # NOTE(shilpasd): To test `isolate_aggregates` request filter, removed"},{"line_number":697,"context_line":"        # following filters which also filters hosts based on aggregate"},{"line_number":698,"context_line":"        # metadata."},{"line_number":699,"context_line":"        if \u0027AggregateImagePropertiesIsolation\u0027 in filters:"},{"line_number":700,"context_line":"            filters.remove(\u0027AggregateImagePropertiesIsolation\u0027)"},{"line_number":701,"context_line":"        if \u0027AggregateInstanceExtraSpecsFilter\u0027 in filters:"},{"line_number":702,"context_line":"            filters.remove(\u0027AggregateInstanceExtraSpecsFilter\u0027)"},{"line_number":703,"context_line":"        self.flags(enabled_filters\u003dfilters, group\u003d\u0027filter_scheduler\u0027)"},{"line_number":704,"context_line":""},{"line_number":705,"context_line":"        super(TestAggregateFiltersTogether, self).setUp()"}],"source_content_type":"text/x-python","patch_set":17,"id":"5faad753_7c82eaca","line":702,"range":{"start_line":699,"start_character":0,"end_line":702,"end_character":63},"updated":"2019-09-06 21:32:45.000000000","message":"this suite also passes when these lines are removed","commit_id":"bb7a931d10ad4425406685ff3d82a62e7bf9c662"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"67f4416308c1849ee2fee87f29917a1dacaf9708","unresolved":false,"context_lines":[{"line_number":782,"context_line":"            flavor_id\u003dself.flavor_with_trait_dxva[\u0027id\u0027], az\u003d\u0027myaz\u0027)"},{"line_number":783,"context_line":"        self.assertIsNone(self._get_instance_host(server))"},{"line_number":784,"context_line":"        server \u003d self.api.get_server(server[\u0027id\u0027])"},{"line_number":785,"context_line":"        self.assertEqual(\u0027ERROR\u0027, server[\u0027status\u0027])"},{"line_number":786,"context_line":""},{"line_number":787,"context_line":""},{"line_number":788,"context_line":"class TestAggregateMultiTenancyIsolationFilter("}],"source_content_type":"text/x-python","patch_set":17,"id":"5faad753_21cbe353","line":785,"updated":"2019-09-07 15:10:09.000000000","message":"ditto","commit_id":"bb7a931d10ad4425406685ff3d82a62e7bf9c662"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"31b67a3db7660146e4341a2206a1623066c8f7b5","unresolved":false,"context_lines":[{"line_number":782,"context_line":"            flavor_id\u003dself.flavor_with_trait_dxva[\u0027id\u0027], az\u003d\u0027myaz\u0027)"},{"line_number":783,"context_line":"        self.assertIsNone(self._get_instance_host(server))"},{"line_number":784,"context_line":"        server \u003d self.api.get_server(server[\u0027id\u0027])"},{"line_number":785,"context_line":"        self.assertEqual(\u0027ERROR\u0027, server[\u0027status\u0027])"},{"line_number":786,"context_line":""},{"line_number":787,"context_line":""},{"line_number":788,"context_line":"class TestAggregateMultiTenancyIsolationFilter("}],"source_content_type":"text/x-python","patch_set":17,"id":"5faad753_63b55a31","line":785,"in_reply_to":"5faad753_21cbe353","updated":"2019-09-08 17:59:16.000000000","message":"Done","commit_id":"bb7a931d10ad4425406685ff3d82a62e7bf9c662"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e263f968028bbbdee1186740926a14f5bbcc3c63","unresolved":false,"context_lines":[{"line_number":511,"context_line":"            image_id\u003dself.image_id_without_trait)"},{"line_number":512,"context_line":"        self.assertIsNone(self._get_instance_host(server))"},{"line_number":513,"context_line":"        server \u003d self.api.get_server(server[\u0027id\u0027])"},{"line_number":514,"context_line":"        self.assertIn(\u0027No valid host\u0027, server[\u0027fault\u0027][\u0027message\u0027])"},{"line_number":515,"context_line":""},{"line_number":516,"context_line":"    def test_filter_without_trait(self):"},{"line_number":517,"context_line":"        \"\"\"Test \u0027isolate_aggregates\u0027 filter with valid hosts."}],"source_content_type":"text/x-python","patch_set":18,"id":"5faad753_cb8ea026","line":514,"updated":"2019-09-09 08:35:54.000000000","message":"Sorry I wasn\u0027t precise enough. I would like to see both asserts. \n\n  self.assertEqual(\u0027ERROR\u0027, server[\u0027status\u0027])\n  self.assertIn(\u0027No valid host\u0027, server[\u0027fault\u0027][\u0027message\u0027])","commit_id":"fd7075939f129219d787a9787b822fcf1aa308ba"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"a1bbe8c06dbe159757a274abd94169e49a18b51a","unresolved":false,"context_lines":[{"line_number":511,"context_line":"            image_id\u003dself.image_id_without_trait)"},{"line_number":512,"context_line":"        self.assertIsNone(self._get_instance_host(server))"},{"line_number":513,"context_line":"        server \u003d self.api.get_server(server[\u0027id\u0027])"},{"line_number":514,"context_line":"        self.assertIn(\u0027No valid host\u0027, server[\u0027fault\u0027][\u0027message\u0027])"},{"line_number":515,"context_line":""},{"line_number":516,"context_line":"    def test_filter_without_trait(self):"},{"line_number":517,"context_line":"        \"\"\"Test \u0027isolate_aggregates\u0027 filter with valid hosts."}],"source_content_type":"text/x-python","patch_set":18,"id":"5faad753_7673c716","line":514,"in_reply_to":"5faad753_cb8ea026","updated":"2019-09-09 20:24:54.000000000","message":"Done","commit_id":"fd7075939f129219d787a9787b822fcf1aa308ba"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e263f968028bbbdee1186740926a14f5bbcc3c63","unresolved":false,"context_lines":[{"line_number":642,"context_line":""},{"line_number":643,"context_line":"        self.assertIsNone(self._get_instance_host(server))"},{"line_number":644,"context_line":"        server \u003d self.api.get_server(server[\u0027id\u0027])"},{"line_number":645,"context_line":"        self.assertIn(\u0027No valid host\u0027, server[\u0027fault\u0027][\u0027message\u0027])"},{"line_number":646,"context_line":""},{"line_number":647,"context_line":"    def test_filter_with_traits_image_flavor_disjoint_of_aggregates(self):"},{"line_number":648,"context_line":"        \"\"\"Test filter with image/flav required traits disjoint of aggregates."}],"source_content_type":"text/x-python","patch_set":18,"id":"5faad753_4ba2b09c","line":645,"updated":"2019-09-09 08:35:54.000000000","message":"ditto","commit_id":"fd7075939f129219d787a9787b822fcf1aa308ba"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"a1bbe8c06dbe159757a274abd94169e49a18b51a","unresolved":false,"context_lines":[{"line_number":642,"context_line":""},{"line_number":643,"context_line":"        self.assertIsNone(self._get_instance_host(server))"},{"line_number":644,"context_line":"        server \u003d self.api.get_server(server[\u0027id\u0027])"},{"line_number":645,"context_line":"        self.assertIn(\u0027No valid host\u0027, server[\u0027fault\u0027][\u0027message\u0027])"},{"line_number":646,"context_line":""},{"line_number":647,"context_line":"    def test_filter_with_traits_image_flavor_disjoint_of_aggregates(self):"},{"line_number":648,"context_line":"        \"\"\"Test filter with image/flav required traits disjoint of aggregates."}],"source_content_type":"text/x-python","patch_set":18,"id":"5faad753_d65b9b84","line":645,"in_reply_to":"5faad753_4ba2b09c","updated":"2019-09-09 20:24:54.000000000","message":"Done","commit_id":"fd7075939f129219d787a9787b822fcf1aa308ba"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e263f968028bbbdee1186740926a14f5bbcc3c63","unresolved":false,"context_lines":[{"line_number":676,"context_line":""},{"line_number":677,"context_line":"        self.assertIsNone(self._get_instance_host(server))"},{"line_number":678,"context_line":"        server \u003d self.api.get_server(server[\u0027id\u0027])"},{"line_number":679,"context_line":"        self.assertIn(\u0027No valid host\u0027, server[\u0027fault\u0027][\u0027message\u0027])"},{"line_number":680,"context_line":""},{"line_number":681,"context_line":""},{"line_number":682,"context_line":"class IsolateAggregateFilterConsolidatedTest(IsolateAggregateFilterTest):"}],"source_content_type":"text/x-python","patch_set":18,"id":"5faad753_6b9f6c50","line":679,"updated":"2019-09-09 08:35:54.000000000","message":"ditto","commit_id":"fd7075939f129219d787a9787b822fcf1aa308ba"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"a1bbe8c06dbe159757a274abd94169e49a18b51a","unresolved":false,"context_lines":[{"line_number":676,"context_line":""},{"line_number":677,"context_line":"        self.assertIsNone(self._get_instance_host(server))"},{"line_number":678,"context_line":"        server \u003d self.api.get_server(server[\u0027id\u0027])"},{"line_number":679,"context_line":"        self.assertIn(\u0027No valid host\u0027, server[\u0027fault\u0027][\u0027message\u0027])"},{"line_number":680,"context_line":""},{"line_number":681,"context_line":""},{"line_number":682,"context_line":"class IsolateAggregateFilterConsolidatedTest(IsolateAggregateFilterTest):"}],"source_content_type":"text/x-python","patch_set":18,"id":"5faad753_f6601735","line":679,"in_reply_to":"5faad753_6b9f6c50","updated":"2019-09-09 20:24:54.000000000","message":"Done","commit_id":"fd7075939f129219d787a9787b822fcf1aa308ba"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d73b4f624d075ebdeb5a3e92ebe1a1ea01509f5d","unresolved":false,"context_lines":[{"line_number":642,"context_line":""},{"line_number":643,"context_line":"        self.assertIsNone(self._get_instance_host(server))"},{"line_number":644,"context_line":"        server \u003d self.api.get_server(server[\u0027id\u0027])"},{"line_number":645,"context_line":"        self.assertIn(\u0027No valid host\u0027, server[\u0027fault\u0027][\u0027message\u0027])"},{"line_number":646,"context_line":""},{"line_number":647,"context_line":"    def test_filter_with_traits_image_flavor_disjoint_of_aggregates(self):"},{"line_number":648,"context_line":"        \"\"\"Test filter with image/flav required traits disjoint of aggregates."}],"source_content_type":"text/x-python","patch_set":19,"id":"5faad753_dd00a137","line":645,"updated":"2019-09-09 14:42:09.000000000","message":"I definitely prefer that you check the message, but I wouldn\u0027t have removed the ERROR assertion.","commit_id":"f03251cb6908dd529472d02e610056fb849014f9"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"a1bbe8c06dbe159757a274abd94169e49a18b51a","unresolved":false,"context_lines":[{"line_number":642,"context_line":""},{"line_number":643,"context_line":"        self.assertIsNone(self._get_instance_host(server))"},{"line_number":644,"context_line":"        server \u003d self.api.get_server(server[\u0027id\u0027])"},{"line_number":645,"context_line":"        self.assertIn(\u0027No valid host\u0027, server[\u0027fault\u0027][\u0027message\u0027])"},{"line_number":646,"context_line":""},{"line_number":647,"context_line":"    def test_filter_with_traits_image_flavor_disjoint_of_aggregates(self):"},{"line_number":648,"context_line":"        \"\"\"Test filter with image/flav required traits disjoint of aggregates."}],"source_content_type":"text/x-python","patch_set":19,"id":"5faad753_564fabbc","line":645,"in_reply_to":"5faad753_dd00a137","updated":"2019-09-09 20:24:54.000000000","message":"Done","commit_id":"f03251cb6908dd529472d02e610056fb849014f9"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d73b4f624d075ebdeb5a3e92ebe1a1ea01509f5d","unresolved":false,"context_lines":[{"line_number":690,"context_line":"            filters.append(\u0027AggregateImagePropertiesIsolation\u0027)"},{"line_number":691,"context_line":"        if \u0027AggregateInstanceExtraSpecsFilter\u0027 not in filters:"},{"line_number":692,"context_line":"            filters.append(\u0027AggregateInstanceExtraSpecsFilter\u0027)"},{"line_number":693,"context_line":"        self.flags(enabled_filters\u003dfilters, group\u003d\u0027filter_scheduler\u0027)"},{"line_number":694,"context_line":""},{"line_number":695,"context_line":"        super(IsolateAggregateFilterConsolidatedTest, self).setUp()"},{"line_number":696,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"5faad753_ddae612d","line":693,"updated":"2019-09-09 14:42:09.000000000","message":"I would have preferred to have the base case just be the default config and optionally a subclass with a different config. With these, you\u0027re kinda modifying (or potentially modifying) the base config in each. It\u0027s better (IMHO) to have tests that don\u0027t try to adapt to changes in the code in this way, because it\u0027s harder to see what breaks or might break when making a change in the functional part of the code if tests don\u0027t fail as a result.\n\nBut anyway.","commit_id":"f03251cb6908dd529472d02e610056fb849014f9"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"a1bbe8c06dbe159757a274abd94169e49a18b51a","unresolved":false,"context_lines":[{"line_number":690,"context_line":"            filters.append(\u0027AggregateImagePropertiesIsolation\u0027)"},{"line_number":691,"context_line":"        if \u0027AggregateInstanceExtraSpecsFilter\u0027 not in filters:"},{"line_number":692,"context_line":"            filters.append(\u0027AggregateInstanceExtraSpecsFilter\u0027)"},{"line_number":693,"context_line":"        self.flags(enabled_filters\u003dfilters, group\u003d\u0027filter_scheduler\u0027)"},{"line_number":694,"context_line":""},{"line_number":695,"context_line":"        super(IsolateAggregateFilterConsolidatedTest, self).setUp()"},{"line_number":696,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"5faad753_f6d577ba","line":693,"in_reply_to":"5faad753_ddae612d","updated":"2019-09-09 20:24:54.000000000","message":"Done, added IsolateAggregateFilterTest / \nIsolateAggregateFilterTestWithConcernFilters /\nIsolateAggregateFilterTestWOConcernFilters","commit_id":"f03251cb6908dd529472d02e610056fb849014f9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ebc5e2f28dbc3b4435ec108d6e6368cc6c72a6df","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        self.flags(compute_driver\u003dself.compute_driver)"},{"line_number":70,"context_line":"        super(AggregateRequestFiltersTest, self).setUp()"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        self.useFixture(policy_fixture.RealPolicyFixture())"},{"line_number":73,"context_line":"        self.useFixture(nova_fixtures.NeutronFixture(self))"},{"line_number":74,"context_line":"        self.useFixture(nova_fixtures.AllServicesCurrent())"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        placement \u003d self.useFixture(func_fixtures.PlacementFixture())"},{"line_number":77,"context_line":"        self.placement_api \u003d placement.api"},{"line_number":78,"context_line":"        api_fixture \u003d self.useFixture(nova_fixtures.OSAPIFixture("},{"line_number":79,"context_line":"            api_version\u003d\u0027v2.1\u0027))"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        self.admin_api \u003d api_fixture.admin_api"},{"line_number":82,"context_line":"        self.admin_api.microversion \u003d self.microversion"},{"line_number":83,"context_line":"        self.api \u003d self.admin_api"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        # the image fake backend needed for image discovery"},{"line_number":86,"context_line":"        nova.tests.unit.image.fake.stub_out_image_service(self)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        self.start_service(\u0027conductor\u0027)"},{"line_number":89,"context_line":"        self.scheduler_service \u003d self.start_service(\u0027scheduler\u0027)"}],"source_content_type":"text/x-python","patch_set":21,"id":"3fa7e38b_99e347a5","line":86,"range":{"start_line":72,"start_character":8,"end_line":86,"end_character":63},"updated":"2019-09-16 20:28:07.000000000","message":"A bunch of this fixture stuff is probably no longer necessary since the ProviderUsageBaseTestCase base class is probably doing those already.","commit_id":"1db3b89caee05c84a119b99aa2aec494f90c3c36"}],"nova/tests/unit/scheduler/test_request_filter.py":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"c7b7b816632f400e39007c7e7b2e48c4430538e7","unresolved":false,"context_lines":[{"line_number":122,"context_line":"            properties\u003dobjects.ImageMetaProps("},{"line_number":123,"context_line":"                traits_required\u003d[]))"},{"line_number":124,"context_line":"        reqspec \u003d objects.RequestSpec(flavor\u003dfake_flavor, image\u003dfake_image)"},{"line_number":125,"context_line":"        request_filter.isolate_aggregates(self.context, reqspec)"},{"line_number":126,"context_line":"        self.assertEqual("},{"line_number":127,"context_line":"            \u0027,\u0027.join(sorted([uuids.agg1, uuids.agg2, uuids.agg4])),"},{"line_number":128,"context_line":"            \u0027,\u0027.join(sorted("}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_808f232d","line":125,"range":{"start_line":125,"start_character":23,"end_line":125,"end_character":41},"updated":"2019-08-09 05:20:28.000000000","message":"nit: This method returns True or False.\nIt should be checked.","commit_id":"7d3d3ecfb513558e1ff4d13d7a7effec5dabf8f0"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"d6c6f393e58dd0b99f1e98ec6291a44196e29fa3","unresolved":false,"context_lines":[{"line_number":122,"context_line":"            properties\u003dobjects.ImageMetaProps("},{"line_number":123,"context_line":"                traits_required\u003d[]))"},{"line_number":124,"context_line":"        reqspec \u003d objects.RequestSpec(flavor\u003dfake_flavor, image\u003dfake_image)"},{"line_number":125,"context_line":"        request_filter.isolate_aggregates(self.context, reqspec)"},{"line_number":126,"context_line":"        self.assertEqual("},{"line_number":127,"context_line":"            \u0027,\u0027.join(sorted([uuids.agg1, uuids.agg2, uuids.agg4])),"},{"line_number":128,"context_line":"            \u0027,\u0027.join(sorted("}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_146844b8","line":125,"range":{"start_line":125,"start_character":23,"end_line":125,"end_character":41},"in_reply_to":"7faddb67_808f232d","updated":"2019-08-10 09:24:47.000000000","message":"Done","commit_id":"7d3d3ecfb513558e1ff4d13d7a7effec5dabf8f0"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"c7b7b816632f400e39007c7e7b2e48c4430538e7","unresolved":false,"context_lines":[{"line_number":143,"context_line":"            properties\u003dobjects.ImageMetaProps("},{"line_number":144,"context_line":"                traits_required\u003d[]))"},{"line_number":145,"context_line":"        reqspec \u003d objects.RequestSpec(flavor\u003dfake_flavor, image\u003dfake_image)"},{"line_number":146,"context_line":"        request_filter.isolate_aggregates(self.context, reqspec)"},{"line_number":147,"context_line":"        self.assertNotIn(\u0027requested_destination\u0027, reqspec)"},{"line_number":148,"context_line":"        keys \u003d [\u0027trait:%s\u0027 % trait for trait in traits]"},{"line_number":149,"context_line":"        getnotmd.assert_called_once_with(self.context, mock.ANY, \u0027trait:\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_209c2f69","line":146,"range":{"start_line":146,"start_character":23,"end_line":146,"end_character":41},"updated":"2019-08-09 05:20:28.000000000","message":"ditto","commit_id":"7d3d3ecfb513558e1ff4d13d7a7effec5dabf8f0"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"d6c6f393e58dd0b99f1e98ec6291a44196e29fa3","unresolved":false,"context_lines":[{"line_number":143,"context_line":"            properties\u003dobjects.ImageMetaProps("},{"line_number":144,"context_line":"                traits_required\u003d[]))"},{"line_number":145,"context_line":"        reqspec \u003d objects.RequestSpec(flavor\u003dfake_flavor, image\u003dfake_image)"},{"line_number":146,"context_line":"        request_filter.isolate_aggregates(self.context, reqspec)"},{"line_number":147,"context_line":"        self.assertNotIn(\u0027requested_destination\u0027, reqspec)"},{"line_number":148,"context_line":"        keys \u003d [\u0027trait:%s\u0027 % trait for trait in traits]"},{"line_number":149,"context_line":"        getnotmd.assert_called_once_with(self.context, mock.ANY, \u0027trait:\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_346300e0","line":146,"range":{"start_line":146,"start_character":23,"end_line":146,"end_character":41},"in_reply_to":"7faddb67_209c2f69","updated":"2019-08-10 09:24:47.000000000","message":"Done","commit_id":"7d3d3ecfb513558e1ff4d13d7a7effec5dabf8f0"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"c7b7b816632f400e39007c7e7b2e48c4430538e7","unresolved":false,"context_lines":[{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    @mock.patch(\u0027nova.objects.AggregateList.\u0027"},{"line_number":154,"context_line":"                \u0027get_non_matching_by_metadata_keys\u0027)"},{"line_number":155,"context_line":"    def test_isolate_aggregates_no_aggregates(self, getnotmd):"},{"line_number":156,"context_line":"        getnotmd.return_value \u003d []"},{"line_number":157,"context_line":"        flavor_traits \u003d set([\u0027HW_GPU_API_DXVA\u0027])"},{"line_number":158,"context_line":"        image_traits \u003d set([\u0027HW_NIC_DCB_ETS\u0027])"}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_c0ad1b9c","line":155,"range":{"start_line":155,"start_character":0,"end_line":155,"end_character":45},"updated":"2019-08-09 05:20:28.000000000","message":"nit:\nWhat is a difference between this test and test_isolate_aggregates_destination_not_set (line 137)?\n\nThe one set traits in a flavor only, but the other set traits in a flavor and an image?\nIMO, test method names are not appropriate.","commit_id":"7d3d3ecfb513558e1ff4d13d7a7effec5dabf8f0"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"d6c6f393e58dd0b99f1e98ec6291a44196e29fa3","unresolved":false,"context_lines":[{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    @mock.patch(\u0027nova.objects.AggregateList.\u0027"},{"line_number":154,"context_line":"                \u0027get_non_matching_by_metadata_keys\u0027)"},{"line_number":155,"context_line":"    def test_isolate_aggregates_no_aggregates(self, getnotmd):"},{"line_number":156,"context_line":"        getnotmd.return_value \u003d []"},{"line_number":157,"context_line":"        flavor_traits \u003d set([\u0027HW_GPU_API_DXVA\u0027])"},{"line_number":158,"context_line":"        image_traits \u003d set([\u0027HW_NIC_DCB_ETS\u0027])"}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_f45c881a","line":155,"range":{"start_line":155,"start_character":0,"end_line":155,"end_character":45},"in_reply_to":"7faddb67_c0ad1b9c","updated":"2019-08-10 09:24:47.000000000","message":"Done, renamed appropriate.","commit_id":"7d3d3ecfb513558e1ff4d13d7a7effec5dabf8f0"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"c7b7b816632f400e39007c7e7b2e48c4430538e7","unresolved":false,"context_lines":[{"line_number":163,"context_line":"            properties\u003dobjects.ImageMetaProps("},{"line_number":164,"context_line":"                traits_required\u003d[trait for trait in image_traits]))"},{"line_number":165,"context_line":"        reqspec \u003d objects.RequestSpec(flavor\u003dfake_flavor, image\u003dfake_image)"},{"line_number":166,"context_line":"        request_filter.isolate_aggregates(self.context, reqspec)"},{"line_number":167,"context_line":"        self.assertNotIn(\u0027requested_destination\u0027, reqspec)"},{"line_number":168,"context_line":"        keys \u003d [\u0027trait:%s\u0027 % trait for trait in flavor_traits.union("},{"line_number":169,"context_line":"            image_traits)]"}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_40992b77","line":166,"range":{"start_line":166,"start_character":23,"end_line":166,"end_character":41},"updated":"2019-08-09 05:20:28.000000000","message":"ditto","commit_id":"7d3d3ecfb513558e1ff4d13d7a7effec5dabf8f0"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"d6c6f393e58dd0b99f1e98ec6291a44196e29fa3","unresolved":false,"context_lines":[{"line_number":163,"context_line":"            properties\u003dobjects.ImageMetaProps("},{"line_number":164,"context_line":"                traits_required\u003d[trait for trait in image_traits]))"},{"line_number":165,"context_line":"        reqspec \u003d objects.RequestSpec(flavor\u003dfake_flavor, image\u003dfake_image)"},{"line_number":166,"context_line":"        request_filter.isolate_aggregates(self.context, reqspec)"},{"line_number":167,"context_line":"        self.assertNotIn(\u0027requested_destination\u0027, reqspec)"},{"line_number":168,"context_line":"        keys \u003d [\u0027trait:%s\u0027 % trait for trait in flavor_traits.union("},{"line_number":169,"context_line":"            image_traits)]"}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_d4614cd5","line":166,"range":{"start_line":166,"start_character":23,"end_line":166,"end_character":41},"in_reply_to":"7faddb67_40992b77","updated":"2019-08-10 09:24:47.000000000","message":"Done","commit_id":"7d3d3ecfb513558e1ff4d13d7a7effec5dabf8f0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5c112c4bbf495df5f2a386122f4ac0b089184366","unresolved":false,"context_lines":[{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    @mock.patch(\u0027nova.objects.AggregateList.\u0027"},{"line_number":103,"context_line":"                \u0027get_non_matching_by_metadata_keys\u0027)"},{"line_number":104,"context_line":"    def test_isolate_aggregates(self, getnotmd):"},{"line_number":105,"context_line":"        getnotmd.return_value \u003d ["},{"line_number":106,"context_line":"            objects.Aggregate("},{"line_number":107,"context_line":"                uuid\u003duuids.agg1,"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_1d583254","line":104,"range":{"start_line":104,"start_character":38,"end_line":104,"end_character":46},"updated":"2019-08-14 11:38:39.000000000","message":"mock_ prefix seems to be a convention for mock test params","commit_id":"695922bfb40dab756a8a6a54433c2293e877ba82"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"de40f9e7f39c271ff1fffd79c07d0345bea289c1","unresolved":false,"context_lines":[{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    @mock.patch(\u0027nova.objects.AggregateList.\u0027"},{"line_number":103,"context_line":"                \u0027get_non_matching_by_metadata_keys\u0027)"},{"line_number":104,"context_line":"    def test_isolate_aggregates(self, getnotmd):"},{"line_number":105,"context_line":"        getnotmd.return_value \u003d ["},{"line_number":106,"context_line":"            objects.Aggregate("},{"line_number":107,"context_line":"                uuid\u003duuids.agg1,"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_c0793f82","line":104,"range":{"start_line":104,"start_character":38,"end_line":104,"end_character":46},"in_reply_to":"7faddb67_1d583254","updated":"2019-08-15 00:21:09.000000000","message":"Done","commit_id":"695922bfb40dab756a8a6a54433c2293e877ba82"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f9bbe785a7f554cdb76b5475e455a225b384eae8","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        fake_image \u003d objects.ImageMeta("},{"line_number":122,"context_line":"            properties\u003dobjects.ImageMetaProps("},{"line_number":123,"context_line":"                traits_required\u003d[]))"},{"line_number":124,"context_line":"        reqspec \u003d objects.RequestSpec(flavor\u003dfake_flavor, image\u003dfake_image)"},{"line_number":125,"context_line":"        result \u003d request_filter.isolate_aggregates(self.context, reqspec)"},{"line_number":126,"context_line":"        self.assertTrue(result)"},{"line_number":127,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_c359655b","line":124,"updated":"2019-08-13 18:51:58.000000000","message":"Need a test case to cover the scenario where destination is already set, as well as when it\u0027s set to None. Also a scenario where destination is already set, plus it already has some isolated_aggregates set, and that the new ones are OR\u0027d in.","commit_id":"695922bfb40dab756a8a6a54433c2293e877ba82"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"de40f9e7f39c271ff1fffd79c07d0345bea289c1","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        fake_image \u003d objects.ImageMeta("},{"line_number":122,"context_line":"            properties\u003dobjects.ImageMetaProps("},{"line_number":123,"context_line":"                traits_required\u003d[]))"},{"line_number":124,"context_line":"        reqspec \u003d objects.RequestSpec(flavor\u003dfake_flavor, image\u003dfake_image)"},{"line_number":125,"context_line":"        result \u003d request_filter.isolate_aggregates(self.context, reqspec)"},{"line_number":126,"context_line":"        self.assertTrue(result)"},{"line_number":127,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_8097c790","line":124,"in_reply_to":"7faddb67_c359655b","updated":"2019-08-15 00:21:09.000000000","message":"Done, added test_isolate_aggregates_union","commit_id":"695922bfb40dab756a8a6a54433c2293e877ba82"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f9bbe785a7f554cdb76b5475e455a225b384eae8","unresolved":false,"context_lines":[{"line_number":129,"context_line":"            \u0027,\u0027.join(sorted("},{"line_number":130,"context_line":"                reqspec.requested_destination.isolated_aggregates)))"},{"line_number":131,"context_line":"        keys \u003d [\u0027trait:%s\u0027 % trait for trait in traits]"},{"line_number":132,"context_line":"        getnotmd.assert_called_once_with(self.context, mock.ANY, \u0027trait:\u0027,"},{"line_number":133,"context_line":"                                         value\u003d\u0027required\u0027)"},{"line_number":134,"context_line":"        self.assertItemsEqual(keys, getnotmd.call_args[0][1])"},{"line_number":135,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_837a8db7","line":132,"range":{"start_line":132,"start_character":55,"end_line":132,"end_character":63},"updated":"2019-08-13 18:51:58.000000000","message":"I assume there\u0027s some reason you can\u0027t use keys here?","commit_id":"695922bfb40dab756a8a6a54433c2293e877ba82"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"de40f9e7f39c271ff1fffd79c07d0345bea289c1","unresolved":false,"context_lines":[{"line_number":129,"context_line":"            \u0027,\u0027.join(sorted("},{"line_number":130,"context_line":"                reqspec.requested_destination.isolated_aggregates)))"},{"line_number":131,"context_line":"        keys \u003d [\u0027trait:%s\u0027 % trait for trait in traits]"},{"line_number":132,"context_line":"        getnotmd.assert_called_once_with(self.context, mock.ANY, \u0027trait:\u0027,"},{"line_number":133,"context_line":"                                         value\u003d\u0027required\u0027)"},{"line_number":134,"context_line":"        self.assertItemsEqual(keys, getnotmd.call_args[0][1])"},{"line_number":135,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_00e99718","line":132,"range":{"start_line":132,"start_character":55,"end_line":132,"end_character":63},"in_reply_to":"7faddb67_837a8db7","updated":"2019-08-15 00:21:09.000000000","message":"yes, keys are set here","commit_id":"695922bfb40dab756a8a6a54433c2293e877ba82"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"12f13596ec5b2c34be54b0719ded320ac2e83d46","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                          \u0027trait:CUSTOM_XYZ_TRAIT\u0027: \u0027required\u0027}),"},{"line_number":113,"context_line":"            objects.Aggregate("},{"line_number":114,"context_line":"                uuid\u003duuids.agg4,"},{"line_number":115,"context_line":"                metadata\u003d{\u0027trait:HW_GPU_API_DXVA\u0027: \u0027required\u0027,"},{"line_number":116,"context_line":"                          \u0027trait:HW_NIC_DCB_ETS\u0027: \u0027required\u0027}),"},{"line_number":117,"context_line":"        ]"},{"line_number":118,"context_line":"        traits \u003d set([\u0027HW_GPU_API_DXVA\u0027, \u0027CUSTOM_XYZ_TRAIT\u0027])"},{"line_number":119,"context_line":"        fake_flavor \u003d objects.Flavor("}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_9bb3ca0a","line":116,"range":{"start_line":115,"start_character":0,"end_line":116,"end_character":63},"updated":"2019-08-29 16:18:01.000000000","message":"This","commit_id":"11651ea8c035fe37c4449f8513efadc8ef07a873"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"12f13596ec5b2c34be54b0719ded320ac2e83d46","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        traits \u003d set([\u0027HW_GPU_API_DXVA\u0027, \u0027CUSTOM_XYZ_TRAIT\u0027])"},{"line_number":119,"context_line":"        fake_flavor \u003d objects.Flavor("},{"line_number":120,"context_line":"            vcpus\u003d1, memory_mb\u003d1024, root_gb\u003d10, ephemeral_gb\u003d5, swap\u003d0,"},{"line_number":121,"context_line":"            extra_specs\u003d{\u0027trait:\u0027 + trait: \u0027required\u0027 for trait in traits})"},{"line_number":122,"context_line":"        fake_image \u003d objects.ImageMeta("},{"line_number":123,"context_line":"            properties\u003dobjects.ImageMetaProps("},{"line_number":124,"context_line":"                traits_required\u003d[]))"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_db9e2268","line":121,"range":{"start_line":121,"start_character":24,"end_line":121,"end_character":74},"updated":"2019-08-29 16:18:01.000000000","message":"Is the same as this","commit_id":"11651ea8c035fe37c4449f8513efadc8ef07a873"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"12f13596ec5b2c34be54b0719ded320ac2e83d46","unresolved":false,"context_lines":[{"line_number":129,"context_line":"            \u0027,\u0027.join(sorted([uuids.agg1, uuids.agg2, uuids.agg4])),"},{"line_number":130,"context_line":"            \u0027,\u0027.join(sorted("},{"line_number":131,"context_line":"                reqspec.requested_destination.isolated_aggregates)))"},{"line_number":132,"context_line":"        keys \u003d [\u0027trait:%s\u0027 % trait for trait in traits]"},{"line_number":133,"context_line":"        mock_getnotmd.assert_called_once_with(self.context, mock.ANY,"},{"line_number":134,"context_line":"                                              \u0027trait:\u0027, value\u003d\u0027required\u0027)"},{"line_number":135,"context_line":"        self.assertItemsEqual(keys, mock_getnotmd.call_args[0][1])"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_3b709640","line":132,"range":{"start_line":132,"start_character":8,"end_line":132,"end_character":55},"updated":"2019-08-29 16:18:01.000000000","message":"and could be used to generate this.\n\nCould you drag those out to their own variable?\n\n    agg4_traits \u003d {\u0027trait:HW_GPU_API_DXVA\u0027: \u0027required\u0027,\n                   \u0027trait:HW_NIC_DCB_ETS\u0027: \u0027required\u0027}\n\nand just reuse everywhere","commit_id":"11651ea8c035fe37c4449f8513efadc8ef07a873"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"dd79a973a65ea9022292e8d310cb94f51c449156","unresolved":false,"context_lines":[{"line_number":129,"context_line":"            \u0027,\u0027.join(sorted([uuids.agg1, uuids.agg2, uuids.agg4])),"},{"line_number":130,"context_line":"            \u0027,\u0027.join(sorted("},{"line_number":131,"context_line":"                reqspec.requested_destination.isolated_aggregates)))"},{"line_number":132,"context_line":"        keys \u003d [\u0027trait:%s\u0027 % trait for trait in traits]"},{"line_number":133,"context_line":"        mock_getnotmd.assert_called_once_with(self.context, mock.ANY,"},{"line_number":134,"context_line":"                                              \u0027trait:\u0027, value\u003d\u0027required\u0027)"},{"line_number":135,"context_line":"        self.assertItemsEqual(keys, mock_getnotmd.call_args[0][1])"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_f62685ba","line":132,"range":{"start_line":132,"start_character":8,"end_line":132,"end_character":55},"in_reply_to":"7faddb67_3b709640","updated":"2019-08-30 11:06:42.000000000","message":"Done","commit_id":"11651ea8c035fe37c4449f8513efadc8ef07a873"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"12f13596ec5b2c34be54b0719ded320ac2e83d46","unresolved":false,"context_lines":[{"line_number":144,"context_line":"                          \u0027trait:CUSTOM_XYZ_TRAIT\u0027: \u0027required\u0027}),"},{"line_number":145,"context_line":"            objects.Aggregate("},{"line_number":146,"context_line":"                uuid\u003duuids.agg4,"},{"line_number":147,"context_line":"                metadata\u003d{\u0027trait:HW_GPU_API_DXVA\u0027: \u0027required\u0027,"},{"line_number":148,"context_line":"                          \u0027trait:HW_NIC_DCB_ETS\u0027: \u0027required\u0027}),"},{"line_number":149,"context_line":"        ]"},{"line_number":150,"context_line":"        traits \u003d set([\u0027HW_GPU_API_DXVA\u0027, \u0027CUSTOM_XYZ_TRAIT\u0027])"},{"line_number":151,"context_line":"        fake_flavor \u003d objects.Flavor("}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_1baa7a70","line":148,"range":{"start_line":147,"start_character":0,"end_line":148,"end_character":63},"updated":"2019-08-29 16:18:01.000000000","message":"Same comment as above","commit_id":"11651ea8c035fe37c4449f8513efadc8ef07a873"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"dd79a973a65ea9022292e8d310cb94f51c449156","unresolved":false,"context_lines":[{"line_number":144,"context_line":"                          \u0027trait:CUSTOM_XYZ_TRAIT\u0027: \u0027required\u0027}),"},{"line_number":145,"context_line":"            objects.Aggregate("},{"line_number":146,"context_line":"                uuid\u003duuids.agg4,"},{"line_number":147,"context_line":"                metadata\u003d{\u0027trait:HW_GPU_API_DXVA\u0027: \u0027required\u0027,"},{"line_number":148,"context_line":"                          \u0027trait:HW_NIC_DCB_ETS\u0027: \u0027required\u0027}),"},{"line_number":149,"context_line":"        ]"},{"line_number":150,"context_line":"        traits \u003d set([\u0027HW_GPU_API_DXVA\u0027, \u0027CUSTOM_XYZ_TRAIT\u0027])"},{"line_number":151,"context_line":"        fake_flavor \u003d objects.Flavor("}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_162c8197","line":148,"range":{"start_line":147,"start_character":0,"end_line":148,"end_character":63},"in_reply_to":"7faddb67_1baa7a70","updated":"2019-08-30 11:06:42.000000000","message":"Done","commit_id":"11651ea8c035fe37c4449f8513efadc8ef07a873"}],"nova/tests/unit/scheduler/test_utils.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"12f13596ec5b2c34be54b0719ded320ac2e83d46","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        self._test_resources_from_request_spec(expected_resources, flavor)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def test_resources_from_request_spec_flavor_req_traits(self):"},{"line_number":96,"context_line":"        flavor \u003d objects.Flavor(vcpus\u003d1,"},{"line_number":97,"context_line":"                                memory_mb\u003d1024,"},{"line_number":98,"context_line":"                                root_gb\u003d10,"},{"line_number":99,"context_line":"                                ephemeral_gb\u003d5,"},{"line_number":100,"context_line":"                                swap\u003d0,"},{"line_number":101,"context_line":"                                extra_specs\u003d{"},{"line_number":102,"context_line":"                                    \u0027trait:CUSTOM_FLAVOR_TRAIT\u0027: \u0027required\u0027})"},{"line_number":103,"context_line":"        expected_resources \u003d FakeResourceRequest()"},{"line_number":104,"context_line":"        expected_resources._rg_by_id[None] \u003d objects.RequestGroup("},{"line_number":105,"context_line":"            use_same_provider\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_5bc9d257","line":102,"range":{"start_line":96,"start_character":32,"end_line":102,"end_character":77},"updated":"2019-08-29 16:18:01.000000000","message":"style nit: Could you dedent this whole thing if you need to respin?\n\n  flavor \u003d objects.Flavor(\n      vcpus\u003d1, ...)","commit_id":"11651ea8c035fe37c4449f8513efadc8ef07a873"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"dd79a973a65ea9022292e8d310cb94f51c449156","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        self._test_resources_from_request_spec(expected_resources, flavor)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def test_resources_from_request_spec_flavor_req_traits(self):"},{"line_number":96,"context_line":"        flavor \u003d objects.Flavor(vcpus\u003d1,"},{"line_number":97,"context_line":"                                memory_mb\u003d1024,"},{"line_number":98,"context_line":"                                root_gb\u003d10,"},{"line_number":99,"context_line":"                                ephemeral_gb\u003d5,"},{"line_number":100,"context_line":"                                swap\u003d0,"},{"line_number":101,"context_line":"                                extra_specs\u003d{"},{"line_number":102,"context_line":"                                    \u0027trait:CUSTOM_FLAVOR_TRAIT\u0027: \u0027required\u0027})"},{"line_number":103,"context_line":"        expected_resources \u003d FakeResourceRequest()"},{"line_number":104,"context_line":"        expected_resources._rg_by_id[None] \u003d objects.RequestGroup("},{"line_number":105,"context_line":"            use_same_provider\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_d6082928","line":102,"range":{"start_line":96,"start_character":32,"end_line":102,"end_character":77},"in_reply_to":"7faddb67_5bc9d257","updated":"2019-08-30 11:06:42.000000000","message":"Done","commit_id":"11651ea8c035fe37c4449f8513efadc8ef07a873"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"12f13596ec5b2c34be54b0719ded320ac2e83d46","unresolved":false,"context_lines":[{"line_number":108,"context_line":"                \u0027MEMORY_MB\u0027: 1024,"},{"line_number":109,"context_line":"                \u0027DISK_GB\u0027: 15,"},{"line_number":110,"context_line":"            },"},{"line_number":111,"context_line":"            required_traits\u003d{\u0027CUSTOM_FLAVOR_TRAIT\u0027}"},{"line_number":112,"context_line":"        )"},{"line_number":113,"context_line":"        resources \u003d self._test_resources_from_request_spec("},{"line_number":114,"context_line":"                expected_resources, flavor)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_9bfd0a70","line":111,"range":{"start_line":111,"start_character":28,"end_line":111,"end_character":29},"updated":"2019-08-29 16:18:01.000000000","message":"we tend to avoid the set literal syntax since it\u0027s easy to mix up with dictionaries. Perhaps use \u0027set([])\u0027 here","commit_id":"11651ea8c035fe37c4449f8513efadc8ef07a873"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"dd79a973a65ea9022292e8d310cb94f51c449156","unresolved":false,"context_lines":[{"line_number":108,"context_line":"                \u0027MEMORY_MB\u0027: 1024,"},{"line_number":109,"context_line":"                \u0027DISK_GB\u0027: 15,"},{"line_number":110,"context_line":"            },"},{"line_number":111,"context_line":"            required_traits\u003d{\u0027CUSTOM_FLAVOR_TRAIT\u0027}"},{"line_number":112,"context_line":"        )"},{"line_number":113,"context_line":"        resources \u003d self._test_resources_from_request_spec("},{"line_number":114,"context_line":"                expected_resources, flavor)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_76113553","line":111,"range":{"start_line":111,"start_character":28,"end_line":111,"end_character":29},"in_reply_to":"7faddb67_9bfd0a70","updated":"2019-08-30 11:06:42.000000000","message":"Done","commit_id":"11651ea8c035fe37c4449f8513efadc8ef07a873"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"12f13596ec5b2c34be54b0719ded320ac2e83d46","unresolved":false,"context_lines":[{"line_number":111,"context_line":"            required_traits\u003d{\u0027CUSTOM_FLAVOR_TRAIT\u0027}"},{"line_number":112,"context_line":"        )"},{"line_number":113,"context_line":"        resources \u003d self._test_resources_from_request_spec("},{"line_number":114,"context_line":"                expected_resources, flavor)"},{"line_number":115,"context_line":"        expected_result \u003d set([\u0027CUSTOM_FLAVOR_TRAIT\u0027])"},{"line_number":116,"context_line":"        self.assertEqual(expected_result,"},{"line_number":117,"context_line":"                resources.extract_required_traits())"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_dbdaa21b","line":114,"range":{"start_line":114,"start_character":12,"end_line":114,"end_character":16},"updated":"2019-08-29 16:18:01.000000000","message":"nit","commit_id":"11651ea8c035fe37c4449f8513efadc8ef07a873"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"dd79a973a65ea9022292e8d310cb94f51c449156","unresolved":false,"context_lines":[{"line_number":111,"context_line":"            required_traits\u003d{\u0027CUSTOM_FLAVOR_TRAIT\u0027}"},{"line_number":112,"context_line":"        )"},{"line_number":113,"context_line":"        resources \u003d self._test_resources_from_request_spec("},{"line_number":114,"context_line":"                expected_resources, flavor)"},{"line_number":115,"context_line":"        expected_result \u003d set([\u0027CUSTOM_FLAVOR_TRAIT\u0027])"},{"line_number":116,"context_line":"        self.assertEqual(expected_result,"},{"line_number":117,"context_line":"                resources.extract_required_traits())"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_960e3130","line":114,"range":{"start_line":114,"start_character":12,"end_line":114,"end_character":16},"in_reply_to":"7faddb67_dbdaa21b","updated":"2019-08-30 11:06:42.000000000","message":"Done","commit_id":"11651ea8c035fe37c4449f8513efadc8ef07a873"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"12f13596ec5b2c34be54b0719ded320ac2e83d46","unresolved":false,"context_lines":[{"line_number":114,"context_line":"                expected_resources, flavor)"},{"line_number":115,"context_line":"        expected_result \u003d set([\u0027CUSTOM_FLAVOR_TRAIT\u0027])"},{"line_number":116,"context_line":"        self.assertEqual(expected_result,"},{"line_number":117,"context_line":"                resources.extract_required_traits())"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def test_resources_from_request_spec_flavor_and_image_traits(self):"},{"line_number":120,"context_line":"        image \u003d self._get_image_with_traits()"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_fbdd1e13","line":117,"range":{"start_line":117,"start_character":12,"end_line":117,"end_character":16},"updated":"2019-08-29 16:18:01.000000000","message":"nit","commit_id":"11651ea8c035fe37c4449f8513efadc8ef07a873"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"dd79a973a65ea9022292e8d310cb94f51c449156","unresolved":false,"context_lines":[{"line_number":114,"context_line":"                expected_resources, flavor)"},{"line_number":115,"context_line":"        expected_result \u003d set([\u0027CUSTOM_FLAVOR_TRAIT\u0027])"},{"line_number":116,"context_line":"        self.assertEqual(expected_result,"},{"line_number":117,"context_line":"                resources.extract_required_traits())"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def test_resources_from_request_spec_flavor_and_image_traits(self):"},{"line_number":120,"context_line":"        image \u003d self._get_image_with_traits()"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_36173d49","line":117,"range":{"start_line":117,"start_character":12,"end_line":117,"end_character":16},"in_reply_to":"7faddb67_fbdd1e13","updated":"2019-08-30 11:06:42.000000000","message":"Done","commit_id":"11651ea8c035fe37c4449f8513efadc8ef07a873"}]}
