)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"6be0a5d60afc0690436cd60c08c8439f926c643d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"ed35d061_04743bd9","updated":"2022-02-08 03:02:17.000000000","message":"Inline things can be in a followup.","commit_id":"a4ff8ec9fb809dd2d9bb546f5b4dcf9a61949333"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0e7a4d9744a376f5f8f08dad34a8746e59f59154","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"dfc17da8_d3b36ba5","updated":"2022-02-07 23:12:33.000000000","message":"Nice doc and tests. Just some typos.","commit_id":"a4ff8ec9fb809dd2d9bb546f5b4dcf9a61949333"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"ed3c158a93ed1f9a25b440825066bdd09eaef245","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"c1f52bcb_3ac7b5ab","updated":"2022-02-08 21:46:23.000000000","message":"LGTM","commit_id":"849c9afd2eb539ada2f8dd86f530fe52d2f98251"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"d2cc0907564743c9208879b15a87c6e9db91916c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"5d8e93e9_f084ab72","updated":"2022-02-22 10:15:29.000000000","message":"Simple","commit_id":"849c9afd2eb539ada2f8dd86f530fe52d2f98251"}],"placement/objects/research_context.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0e7a4d9744a376f5f8f08dad34a8746e59f59154","unresolved":true,"context_lines":[{"line_number":747,"context_line":"    (provider ID, root provider ID) of providers which belong to a tree that"},{"line_number":748,"context_line":"    can satisfy trait requirements."},{"line_number":749,"context_line":""},{"line_number":750,"context_line":"    This returns trees that still has the possibility to be a match according"},{"line_number":751,"context_line":"    to the required and forbidden traits. It returns ever rp from"},{"line_number":752,"context_line":"    the tree, that is in rp_ids, even if some of those rps are providing"},{"line_number":753,"context_line":"    forbidden traits."}],"source_content_type":"text/x-python","patch_set":7,"id":"5ce296e2_38430fa1","line":750,"range":{"start_line":750,"start_character":34,"end_line":750,"end_character":37},"updated":"2022-02-07 23:12:33.000000000","message":"have","commit_id":"a4ff8ec9fb809dd2d9bb546f5b4dcf9a61949333"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"074cd401bf7d57808360c59c356742678bd19545","unresolved":false,"context_lines":[{"line_number":747,"context_line":"    (provider ID, root provider ID) of providers which belong to a tree that"},{"line_number":748,"context_line":"    can satisfy trait requirements."},{"line_number":749,"context_line":""},{"line_number":750,"context_line":"    This returns trees that still has the possibility to be a match according"},{"line_number":751,"context_line":"    to the required and forbidden traits. It returns ever rp from"},{"line_number":752,"context_line":"    the tree, that is in rp_ids, even if some of those rps are providing"},{"line_number":753,"context_line":"    forbidden traits."}],"source_content_type":"text/x-python","patch_set":7,"id":"02175965_38c265dc","line":750,"range":{"start_line":750,"start_character":34,"end_line":750,"end_character":37},"in_reply_to":"5ce296e2_38430fa1","updated":"2022-02-08 14:51:13.000000000","message":"Done","commit_id":"a4ff8ec9fb809dd2d9bb546f5b4dcf9a61949333"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0e7a4d9744a376f5f8f08dad34a8746e59f59154","unresolved":true,"context_lines":[{"line_number":748,"context_line":"    can satisfy trait requirements."},{"line_number":749,"context_line":""},{"line_number":750,"context_line":"    This returns trees that still has the possibility to be a match according"},{"line_number":751,"context_line":"    to the required and forbidden traits. It returns ever rp from"},{"line_number":752,"context_line":"    the tree, that is in rp_ids, even if some of those rps are providing"},{"line_number":753,"context_line":"    forbidden traits."},{"line_number":754,"context_line":"    This filters out a whole tree if either:"}],"source_content_type":"text/x-python","patch_set":7,"id":"70fbf742_73993e9b","line":751,"range":{"start_line":751,"start_character":53,"end_line":751,"end_character":57},"updated":"2022-02-07 23:12:33.000000000","message":"every?","commit_id":"a4ff8ec9fb809dd2d9bb546f5b4dcf9a61949333"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"074cd401bf7d57808360c59c356742678bd19545","unresolved":false,"context_lines":[{"line_number":748,"context_line":"    can satisfy trait requirements."},{"line_number":749,"context_line":""},{"line_number":750,"context_line":"    This returns trees that still has the possibility to be a match according"},{"line_number":751,"context_line":"    to the required and forbidden traits. It returns ever rp from"},{"line_number":752,"context_line":"    the tree, that is in rp_ids, even if some of those rps are providing"},{"line_number":753,"context_line":"    forbidden traits."},{"line_number":754,"context_line":"    This filters out a whole tree if either:"}],"source_content_type":"text/x-python","patch_set":7,"id":"89e4657f_f389b16e","line":751,"range":{"start_line":751,"start_character":53,"end_line":751,"end_character":57},"in_reply_to":"70fbf742_73993e9b","updated":"2022-02-08 14:51:13.000000000","message":"yes. done.","commit_id":"a4ff8ec9fb809dd2d9bb546f5b4dcf9a61949333"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0e7a4d9744a376f5f8f08dad34a8746e59f59154","unresolved":true,"context_lines":[{"line_number":749,"context_line":""},{"line_number":750,"context_line":"    This returns trees that still has the possibility to be a match according"},{"line_number":751,"context_line":"    to the required and forbidden traits. It returns ever rp from"},{"line_number":752,"context_line":"    the tree, that is in rp_ids, even if some of those rps are providing"},{"line_number":753,"context_line":"    forbidden traits."},{"line_number":754,"context_line":"    This filters out a whole tree if either:"},{"line_number":755,"context_line":"    * every RPs of the tree from rp_ids having a forbidden trait (see"}],"source_content_type":"text/x-python","patch_set":7,"id":"2984911e_fcbace78","line":752,"range":{"start_line":752,"start_character":12,"end_line":752,"end_character":13},"updated":"2022-02-07 23:12:33.000000000","message":"Note: doesn\u0027t seem like this is needed.","commit_id":"a4ff8ec9fb809dd2d9bb546f5b4dcf9a61949333"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"074cd401bf7d57808360c59c356742678bd19545","unresolved":false,"context_lines":[{"line_number":749,"context_line":""},{"line_number":750,"context_line":"    This returns trees that still has the possibility to be a match according"},{"line_number":751,"context_line":"    to the required and forbidden traits. It returns ever rp from"},{"line_number":752,"context_line":"    the tree, that is in rp_ids, even if some of those rps are providing"},{"line_number":753,"context_line":"    forbidden traits."},{"line_number":754,"context_line":"    This filters out a whole tree if either:"},{"line_number":755,"context_line":"    * every RPs of the tree from rp_ids having a forbidden trait (see"}],"source_content_type":"text/x-python","patch_set":7,"id":"01576a4f_49d6a729","line":752,"range":{"start_line":752,"start_character":12,"end_line":752,"end_character":13},"in_reply_to":"2984911e_fcbace78","updated":"2022-02-08 14:51:13.000000000","message":"Done","commit_id":"a4ff8ec9fb809dd2d9bb546f5b4dcf9a61949333"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0e7a4d9744a376f5f8f08dad34a8746e59f59154","unresolved":true,"context_lines":[{"line_number":755,"context_line":"    * every RPs of the tree from rp_ids having a forbidden trait (see"},{"line_number":756,"context_line":"      test_get_trees_with_traits_forbidden_1 and _2)"},{"line_number":757,"context_line":"    * there is a required trait that none of the RPs of the tree from rp_ids"},{"line_number":758,"context_line":"      provides (see test_get_trees_with_traits) or there is an RP providing"},{"line_number":759,"context_line":"      the required trait but that also provides a forbidden trait"},{"line_number":760,"context_line":"      (see test_get_trees_with_traits_forbidden_3)"},{"line_number":761,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"be4fb390_e4a08490","line":758,"range":{"start_line":758,"start_character":6,"end_line":758,"end_character":14},"updated":"2022-02-07 23:12:33.000000000","message":"provide","commit_id":"a4ff8ec9fb809dd2d9bb546f5b4dcf9a61949333"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"074cd401bf7d57808360c59c356742678bd19545","unresolved":false,"context_lines":[{"line_number":755,"context_line":"    * every RPs of the tree from rp_ids having a forbidden trait (see"},{"line_number":756,"context_line":"      test_get_trees_with_traits_forbidden_1 and _2)"},{"line_number":757,"context_line":"    * there is a required trait that none of the RPs of the tree from rp_ids"},{"line_number":758,"context_line":"      provides (see test_get_trees_with_traits) or there is an RP providing"},{"line_number":759,"context_line":"      the required trait but that also provides a forbidden trait"},{"line_number":760,"context_line":"      (see test_get_trees_with_traits_forbidden_3)"},{"line_number":761,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"f42a2da1_2c2ffd7c","line":758,"range":{"start_line":758,"start_character":6,"end_line":758,"end_character":14},"in_reply_to":"be4fb390_e4a08490","updated":"2022-02-08 14:51:13.000000000","message":"Done","commit_id":"a4ff8ec9fb809dd2d9bb546f5b4dcf9a61949333"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0e7a4d9744a376f5f8f08dad34a8746e59f59154","unresolved":true,"context_lines":[{"line_number":760,"context_line":"      (see test_get_trees_with_traits_forbidden_3)"},{"line_number":761,"context_line":""},{"line_number":762,"context_line":"    The returned tree still might not be a valid tree as this function"},{"line_number":763,"context_line":"    returns a tree even if some providers needs to be ignored due to forbidden"},{"line_number":764,"context_line":"    traits. So if those RPs are needed from resource perspective then the tree"},{"line_number":765,"context_line":"    will be filtered out later by"},{"line_number":766,"context_line":"    objects.allocation_candidate._check_traits_for_alloc_request"}],"source_content_type":"text/x-python","patch_set":7,"id":"d300af0b_39b5d33d","line":763,"range":{"start_line":763,"start_character":42,"end_line":763,"end_character":47},"updated":"2022-02-07 23:12:33.000000000","message":"need","commit_id":"a4ff8ec9fb809dd2d9bb546f5b4dcf9a61949333"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"074cd401bf7d57808360c59c356742678bd19545","unresolved":false,"context_lines":[{"line_number":760,"context_line":"      (see test_get_trees_with_traits_forbidden_3)"},{"line_number":761,"context_line":""},{"line_number":762,"context_line":"    The returned tree still might not be a valid tree as this function"},{"line_number":763,"context_line":"    returns a tree even if some providers needs to be ignored due to forbidden"},{"line_number":764,"context_line":"    traits. So if those RPs are needed from resource perspective then the tree"},{"line_number":765,"context_line":"    will be filtered out later by"},{"line_number":766,"context_line":"    objects.allocation_candidate._check_traits_for_alloc_request"}],"source_content_type":"text/x-python","patch_set":7,"id":"6a867c7f_9bbd4dd0","line":763,"range":{"start_line":763,"start_character":42,"end_line":763,"end_character":47},"in_reply_to":"d300af0b_39b5d33d","updated":"2022-02-08 14:51:13.000000000","message":"Thank you for fixing my language issues. Done.","commit_id":"a4ff8ec9fb809dd2d9bb546f5b4dcf9a61949333"}],"placement/tests/functional/db/test_allocation_candidates.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0e7a4d9744a376f5f8f08dad34a8746e59f59154","unresolved":true,"context_lines":[{"line_number":2928,"context_line":""},{"line_number":2929,"context_line":"            cn2 VCPU\u003d2"},{"line_number":2930,"context_line":"            |"},{"line_number":2931,"context_line":"            cn1_c1 SRIOV_NET_VF\u003d2"},{"line_number":2932,"context_line":"        \"\"\""},{"line_number":2933,"context_line":"        cn1 \u003d self._create_provider(\u0027cn1\u0027)"},{"line_number":2934,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"b4813351_8a62bdc8","line":2931,"range":{"start_line":2931,"start_character":14,"end_line":2931,"end_character":15},"updated":"2022-02-07 23:12:33.000000000","message":"2","commit_id":"a4ff8ec9fb809dd2d9bb546f5b4dcf9a61949333"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"074cd401bf7d57808360c59c356742678bd19545","unresolved":false,"context_lines":[{"line_number":2928,"context_line":""},{"line_number":2929,"context_line":"            cn2 VCPU\u003d2"},{"line_number":2930,"context_line":"            |"},{"line_number":2931,"context_line":"            cn1_c1 SRIOV_NET_VF\u003d2"},{"line_number":2932,"context_line":"        \"\"\""},{"line_number":2933,"context_line":"        cn1 \u003d self._create_provider(\u0027cn1\u0027)"},{"line_number":2934,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"fa864da1_401f4cf6","line":2931,"range":{"start_line":2931,"start_character":14,"end_line":2931,"end_character":15},"in_reply_to":"b4813351_8a62bdc8","updated":"2022-02-08 14:51:13.000000000","message":"Done","commit_id":"a4ff8ec9fb809dd2d9bb546f5b4dcf9a61949333"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0e7a4d9744a376f5f8f08dad34a8746e59f59154","unresolved":true,"context_lines":[{"line_number":2973,"context_line":""},{"line_number":2974,"context_line":"            cn2 VCPU\u003d2"},{"line_number":2975,"context_line":"            |"},{"line_number":2976,"context_line":"            cn1_c1 SRIOV_NET_VF\u003d2"},{"line_number":2977,"context_line":"        \"\"\""},{"line_number":2978,"context_line":"        cn1 \u003d self._create_provider(\u0027cn1\u0027)"},{"line_number":2979,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3b6ffa4d_ed92f363","line":2976,"range":{"start_line":2976,"start_character":14,"end_line":2976,"end_character":15},"updated":"2022-02-07 23:12:33.000000000","message":"2","commit_id":"a4ff8ec9fb809dd2d9bb546f5b4dcf9a61949333"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"074cd401bf7d57808360c59c356742678bd19545","unresolved":false,"context_lines":[{"line_number":2973,"context_line":""},{"line_number":2974,"context_line":"            cn2 VCPU\u003d2"},{"line_number":2975,"context_line":"            |"},{"line_number":2976,"context_line":"            cn1_c1 SRIOV_NET_VF\u003d2"},{"line_number":2977,"context_line":"        \"\"\""},{"line_number":2978,"context_line":"        cn1 \u003d self._create_provider(\u0027cn1\u0027)"},{"line_number":2979,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"e0d7d24f_5659129b","line":2976,"range":{"start_line":2976,"start_character":14,"end_line":2976,"end_character":15},"in_reply_to":"3b6ffa4d_ed92f363","updated":"2022-02-08 14:51:13.000000000","message":"Done","commit_id":"a4ff8ec9fb809dd2d9bb546f5b4dcf9a61949333"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0e7a4d9744a376f5f8f08dad34a8746e59f59154","unresolved":true,"context_lines":[{"line_number":2999,"context_line":"            )}"},{"line_number":3000,"context_line":"        )"},{"line_number":3001,"context_line":""},{"line_number":3002,"context_line":"        # both CN1 and CN2 is returned. CN1 has the forbidden trait"},{"line_number":3003,"context_line":"        # in its tree but there is no RC requested from that RP providing the"},{"line_number":3004,"context_line":"        # forbidden trait. The general rule is"},{"line_number":3005,"context_line":"        # \"traits on resource providers never span other resource providers.\""}],"source_content_type":"text/x-python","patch_set":7,"id":"ad75d8f7_4acddf73","line":3002,"range":{"start_line":3002,"start_character":27,"end_line":3002,"end_character":29},"updated":"2022-02-07 23:12:33.000000000","message":"are","commit_id":"a4ff8ec9fb809dd2d9bb546f5b4dcf9a61949333"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"074cd401bf7d57808360c59c356742678bd19545","unresolved":false,"context_lines":[{"line_number":2999,"context_line":"            )}"},{"line_number":3000,"context_line":"        )"},{"line_number":3001,"context_line":""},{"line_number":3002,"context_line":"        # both CN1 and CN2 is returned. CN1 has the forbidden trait"},{"line_number":3003,"context_line":"        # in its tree but there is no RC requested from that RP providing the"},{"line_number":3004,"context_line":"        # forbidden trait. The general rule is"},{"line_number":3005,"context_line":"        # \"traits on resource providers never span other resource providers.\""}],"source_content_type":"text/x-python","patch_set":7,"id":"7009eebb_425edb5a","line":3002,"range":{"start_line":3002,"start_character":27,"end_line":3002,"end_character":29},"in_reply_to":"ad75d8f7_4acddf73","updated":"2022-02-08 14:51:13.000000000","message":"Done","commit_id":"a4ff8ec9fb809dd2d9bb546f5b4dcf9a61949333"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"4e9b5297d65ea002130efa7f9ccc86ee8e539b07","unresolved":true,"context_lines":[{"line_number":889,"context_line":"        expect_root_ids \u003d self._get_rp_ids_matching_names(provider_names)"},{"line_number":890,"context_line":"        self.assertEqual(expect_root_ids, tree_root_ids)"},{"line_number":891,"context_line":""},{"line_number":892,"context_line":"    def test_get_trees_with_traits_forbidden_1(self):"},{"line_number":893,"context_line":"        \"\"\"Using the following tree"},{"line_number":894,"context_line":"               cn1 CUSTOM_FOO"},{"line_number":895,"context_line":"                |"}],"source_content_type":"text/x-python","patch_set":8,"id":"3ef623ee_6d4287df","line":892,"range":{"start_line":892,"start_character":8,"end_line":892,"end_character":46},"updated":"2022-02-17 04:10:05.000000000","message":"just a general tought shoudl i be concerned that ther emight be different\nbehavior with resoucelsss PRs vs ones wiht inventories.\n\nas we read over the docs we notcied some edgecases. i guess in this case its fine since these method done deal with resouce requests jus with traits.","commit_id":"849c9afd2eb539ada2f8dd86f530fe52d2f98251"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"4e9b5297d65ea002130efa7f9ccc86ee8e539b07","unresolved":true,"context_lines":[{"line_number":926,"context_line":"        # the tree is not returned any more as the only considered rp is cn1"},{"line_number":927,"context_line":"        # but that has a forbidden trait"},{"line_number":928,"context_line":"        self.assertEqual(set(), rp_tuples_with_trait)"},{"line_number":929,"context_line":""},{"line_number":930,"context_line":"    def test_get_trees_with_traits_forbidden_2(self):"},{"line_number":931,"context_line":"        \"\"\"Using the following tree"},{"line_number":932,"context_line":"               cn1 CUSTOM_FOO"}],"source_content_type":"text/x-python","patch_set":8,"id":"398282eb_d32d2a85","line":929,"updated":"2022-02-17 04:10:05.000000000","message":"os ^ is testing the parent has the forbidden trait\nand v is testing both \n\ndo we want another one which just has the forbidden trait on the child?\n\nI think it is isomorphic to test_get_trees_with_traits_forbidden_1 I just said I would ask in case you can think of a reason it would not be.","commit_id":"849c9afd2eb539ada2f8dd86f530fe52d2f98251"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"4e9b5297d65ea002130efa7f9ccc86ee8e539b07","unresolved":false,"context_lines":[{"line_number":952,"context_line":"        # so the tree is filtered out"},{"line_number":953,"context_line":"        self.assertEqual(set(), rp_tuples_with_trait)"},{"line_number":954,"context_line":""},{"line_number":955,"context_line":"    def test_get_trees_with_traits_forbidden_3(self):"},{"line_number":956,"context_line":"        \"\"\"Using the following tree"},{"line_number":957,"context_line":"               cn1 CUSTOM_FOO, CUSTOM_BAR"},{"line_number":958,"context_line":"                |"}],"source_content_type":"text/x-python","patch_set":8,"id":"8a1f7473_58b2ab7b","line":955,"range":{"start_line":955,"start_character":8,"end_line":955,"end_character":46},"updated":"2022-02-17 04:10:05.000000000","message":"so in this case the rp has both the required and forbinden trait,\nnormally we would expect this to return no result but as you mention in the commit message forbidden traits are only partly filtered in this fucntion currently where all nodes have the forbidden trait so ya this looks correct based on the current implenetation","commit_id":"849c9afd2eb539ada2f8dd86f530fe52d2f98251"}]}
