)]}'
{"placement/objects/resource_provider.py":[{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"6fb6a0d3401fe5a79c0b50a5c0bc4fd0cac2e799","unresolved":false,"context_lines":[{"line_number":1938,"context_line":"        provs_with_inv.filter_by_rp_nor_tree(rps_bad_aggs)"},{"line_number":1939,"context_line":"        LOG.debug(\"found %d providers under %d trees after applying \""},{"line_number":1940,"context_line":"                  \"negative aggregate filter %s\","},{"line_number":1941,"context_line":"                  len(provs_with_inv.rps), len(provs_with_inv_rc.trees),"},{"line_number":1942,"context_line":"                  forbidden_aggs)"},{"line_number":1943,"context_line":""},{"line_number":1944,"context_line":"    if (not required_traits and not forbidden_traits) or ("}],"source_content_type":"text/x-python","patch_set":4,"id":"5fc1f717_6d24b10d","line":1941,"range":{"start_line":1941,"start_character":47,"end_line":1941,"end_character":64},"updated":"2019-03-28 09:36:13.000000000","message":"oops","commit_id":"20b727299bea25bd4bc716aaeccb468f9751d5e7"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"4aa95359baf4f27152736ed36990fda778ab65c9","unresolved":false,"context_lines":[{"line_number":1938,"context_line":"        provs_with_inv.filter_by_rp_nor_tree(rps_bad_aggs)"},{"line_number":1939,"context_line":"        LOG.debug(\"found %d providers under %d trees after applying \""},{"line_number":1940,"context_line":"                  \"negative aggregate filter %s\","},{"line_number":1941,"context_line":"                  len(provs_with_inv.rps), len(provs_with_inv_rc.trees),"},{"line_number":1942,"context_line":"                  forbidden_aggs)"},{"line_number":1943,"context_line":""},{"line_number":1944,"context_line":"    if (not required_traits and not forbidden_traits) or ("}],"source_content_type":"text/x-python","patch_set":4,"id":"5fc1f717_d1d77b22","line":1941,"range":{"start_line":1941,"start_character":47,"end_line":1941,"end_character":64},"in_reply_to":"5fc1f717_6d24b10d","updated":"2019-03-28 15:54:38.000000000","message":"Since we\u0027re in no hurry with this, let\u0027s fix it.","commit_id":"20b727299bea25bd4bc716aaeccb468f9751d5e7"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"dc2e507bbcd3c5932d1bfc4a15389da532f36e1b","unresolved":false,"context_lines":[{"line_number":1938,"context_line":"        provs_with_inv.filter_by_rp_nor_tree(rps_bad_aggs)"},{"line_number":1939,"context_line":"        LOG.debug(\"found %d providers under %d trees after applying \""},{"line_number":1940,"context_line":"                  \"negative aggregate filter %s\","},{"line_number":1941,"context_line":"                  len(provs_with_inv.rps), len(provs_with_inv_rc.trees),"},{"line_number":1942,"context_line":"                  forbidden_aggs)"},{"line_number":1943,"context_line":""},{"line_number":1944,"context_line":"    if (not required_traits and not forbidden_traits) or ("}],"source_content_type":"text/x-python","patch_set":4,"id":"5fc1f717_e747554b","line":1941,"range":{"start_line":1941,"start_character":47,"end_line":1941,"end_character":64},"in_reply_to":"5fc1f717_d1d77b22","updated":"2019-03-28 16:53:19.000000000","message":"I *think* it\u0027s resolved later in the series [1] where these blocks are moved into the loop and this variable makes sense.\n\nIn case that changes your thinking...\n\n[1] https://review.openstack.org/#/c/648363/","commit_id":"20b727299bea25bd4bc716aaeccb468f9751d5e7"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"659cb454da32a1c76bd9a25a0db8965016adf73a","unresolved":false,"context_lines":[{"line_number":1917,"context_line":"    # If \u0027member_of\u0027 has values, do a separate lookup to identify the"},{"line_number":1918,"context_line":"    # resource providers that meet the member_of constraints."},{"line_number":1919,"context_line":"    if member_of:"},{"line_number":1920,"context_line":"        rps_in_aggs \u003d provider_ids_matching_aggregates("},{"line_number":1921,"context_line":"            ctx, member_of, rp_ids\u003dprovs_with_inv.all_rps)"},{"line_number":1922,"context_line":"        if not rps_in_aggs:"},{"line_number":1923,"context_line":"            # Short-circuit. The user either asked for a non-existing"},{"line_number":1924,"context_line":"            # aggregate or there were no resource providers that matched"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_e86e0195","line":1921,"range":{"start_line":1920,"start_character":8,"end_line":1921,"end_character":58},"updated":"2019-04-02 12:52:05.000000000","message":"we should be able merge the member_of and forbidden_args with one sql I guess? but that is can be done later.","commit_id":"69a700041d9d89c46943e1532270cbd262878ffb"}],"placement/objects/rp_candidates.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f9a84b7ecc13fec8d525e5ae2bedee1837c36858","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        self.rp_candidates \u003d set("},{"line_number":71,"context_line":"            p for p in self.rp_candidates if (p.id, p.root_id) in rptuples)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def filter_by_rp_or_tree(self, rp_ids):"},{"line_number":74,"context_line":"        \"\"\"Filter the candidates out if neither itself nor its root is in"},{"line_number":75,"context_line":"        given resource providers"},{"line_number":76,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_231dc765","line":73,"range":{"start_line":73,"start_character":8,"end_line":73,"end_character":28},"updated":"2019-03-11 22:25:30.000000000","message":"this was a slightly confusing name before...","commit_id":"bf856c731a4d7a21971f08180346bf3611fa2710"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f9a84b7ecc13fec8d525e5ae2bedee1837c36858","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        self.rp_candidates \u003d set("},{"line_number":78,"context_line":"            p for p in self.rp_candidates if set([p.id, p.root_id]) \u0026 rp_ids)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def filter_by_rp_nor_tree(self, rp_ids):"},{"line_number":81,"context_line":"        \"\"\"Filter the candidates out if either itself or its root is in"},{"line_number":82,"context_line":"        given resource providers"},{"line_number":83,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_a3577702","line":80,"range":{"start_line":80,"start_character":8,"end_line":80,"end_character":29},"updated":"2019-03-11 22:25:30.000000000","message":"...but now it\u0027s really confusing.\n\nI\u0027m trying to think of better names for these.\n\n {include|exclude}_if_rp_or_tree\n\n? Other reviewers, opinions?","commit_id":"bf856c731a4d7a21971f08180346bf3611fa2710"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"76f3ecf34151fb451688c5c63d5871f4c4dfb0d5","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        self.rp_candidates \u003d set("},{"line_number":78,"context_line":"            p for p in self.rp_candidates if set([p.id, p.root_id]) \u0026 rp_ids)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def filter_by_rp_nor_tree(self, rp_ids):"},{"line_number":81,"context_line":"        \"\"\"Filter the candidates out if either itself or its root is in"},{"line_number":82,"context_line":"        given resource providers"},{"line_number":83,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_590a1220","line":80,"range":{"start_line":80,"start_character":8,"end_line":80,"end_character":29},"in_reply_to":"5fc1f717_a3577702","updated":"2019-03-26 07:57:35.000000000","message":"Not done, but right. I can do that in a follow up. Still open for better names.","commit_id":"bf856c731a4d7a21971f08180346bf3611fa2710"}],"placement/tests/functional/db/test_allocation_candidates.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f9a84b7ecc13fec8d525e5ae2bedee1837c36858","unresolved":false,"context_lines":[{"line_number":2388,"context_line":"            # Associate the first compute node with agg1"},{"line_number":2389,"context_line":"            if x \u003d\u003d \u00271\u0027:"},{"line_number":2390,"context_line":"                cn.set_aggregates([uuids.agg1])"},{"line_number":2391,"context_line":"            # Associate the second PF on the second compute node with agg1"},{"line_number":2392,"context_line":"            if x \u003d\u003d \u00272\u0027:"},{"line_number":2393,"context_line":"                pf1.set_aggregates([uuids.agg2])"},{"line_number":2394,"context_line":"            # Mark only the second PF on the third compute node as having"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_833cbbbf","line":2391,"range":{"start_line":2391,"start_character":70,"end_line":2391,"end_character":74},"updated":"2019-03-11 22:25:30.000000000","message":"agg2","commit_id":"bf856c731a4d7a21971f08180346bf3611fa2710"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"76f3ecf34151fb451688c5c63d5871f4c4dfb0d5","unresolved":false,"context_lines":[{"line_number":2388,"context_line":"            # Associate the first compute node with agg1"},{"line_number":2389,"context_line":"            if x \u003d\u003d \u00271\u0027:"},{"line_number":2390,"context_line":"                cn.set_aggregates([uuids.agg1])"},{"line_number":2391,"context_line":"            # Associate the second PF on the second compute node with agg1"},{"line_number":2392,"context_line":"            if x \u003d\u003d \u00272\u0027:"},{"line_number":2393,"context_line":"                pf1.set_aggregates([uuids.agg2])"},{"line_number":2394,"context_line":"            # Mark only the second PF on the third compute node as having"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_f912de57","line":2391,"range":{"start_line":2391,"start_character":70,"end_line":2391,"end_character":74},"in_reply_to":"5fc1f717_833cbbbf","updated":"2019-03-26 07:57:35.000000000","message":"Done","commit_id":"bf856c731a4d7a21971f08180346bf3611fa2710"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"76f3ecf34151fb451688c5c63d5871f4c4dfb0d5","unresolved":false,"context_lines":[{"line_number":2444,"context_line":"        self.assertEqual(2, len(tree_root_ids))"},{"line_number":2445,"context_line":""},{"line_number":2446,"context_line":"        # Let\u0027s validate providers in tree as well"},{"line_number":2447,"context_line":"        # All rps under cn2 should be excluded because aggregate on"},{"line_number":2448,"context_line":"        # a root spans the whole tree"},{"line_number":2449,"context_line":"        provider_ids \u003d trees.rps"},{"line_number":2450,"context_line":"        provider_names \u003d [\u0027cn2\u0027, \u0027cn3\u0027] + [\u0027cn2_numa0_pf0\u0027, \u0027cn2_numa1_pf1\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_59a69211","line":2447,"range":{"start_line":2447,"start_character":24,"end_line":2447,"end_character":27},"updated":"2019-03-26 07:57:35.000000000","message":"cn1. Done.","commit_id":"bf856c731a4d7a21971f08180346bf3611fa2710"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f9a84b7ecc13fec8d525e5ae2bedee1837c36858","unresolved":false,"context_lines":[{"line_number":2452,"context_line":"        expect_provider_ids \u003d self._get_rp_ids_matching_names(provider_names)"},{"line_number":2453,"context_line":"        self.assertEqual(expect_provider_ids, provider_ids)"},{"line_number":2454,"context_line":""},{"line_number":2455,"context_line":"        # Let\u0027s see if the forbidden aggregate filter works"},{"line_number":2456,"context_line":"        # Second, aggregate on child case"},{"line_number":2457,"context_line":"        forbidden_aggs \u003d [uuids.agg2]"},{"line_number":2458,"context_line":"        trees \u003d rp_obj._get_trees_matching_all("}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_e39b3fc6","line":2455,"range":{"start_line":2455,"start_character":0,"end_line":2455,"end_character":59},"updated":"2019-03-11 22:25:30.000000000","message":"strike","commit_id":"bf856c731a4d7a21971f08180346bf3611fa2710"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"76f3ecf34151fb451688c5c63d5871f4c4dfb0d5","unresolved":false,"context_lines":[{"line_number":2452,"context_line":"        expect_provider_ids \u003d self._get_rp_ids_matching_names(provider_names)"},{"line_number":2453,"context_line":"        self.assertEqual(expect_provider_ids, provider_ids)"},{"line_number":2454,"context_line":""},{"line_number":2455,"context_line":"        # Let\u0027s see if the forbidden aggregate filter works"},{"line_number":2456,"context_line":"        # Second, aggregate on child case"},{"line_number":2457,"context_line":"        forbidden_aggs \u003d [uuids.agg2]"},{"line_number":2458,"context_line":"        trees \u003d rp_obj._get_trees_matching_all("}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_f9ae5ee5","line":2455,"range":{"start_line":2455,"start_character":0,"end_line":2455,"end_character":59},"in_reply_to":"5fc1f717_e39b3fc6","updated":"2019-03-26 07:57:35.000000000","message":"Done","commit_id":"bf856c731a4d7a21971f08180346bf3611fa2710"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f9a84b7ecc13fec8d525e5ae2bedee1837c36858","unresolved":false,"context_lines":[{"line_number":2470,"context_line":"                                     \u0027cn3_numa0_pf0\u0027, \u0027cn3_numa1_pf1\u0027]"},{"line_number":2471,"context_line":"        expect_provider_ids \u003d self._get_rp_ids_matching_names(provider_names)"},{"line_number":2472,"context_line":"        self.assertEqual(expect_provider_ids, provider_ids)"},{"line_number":2473,"context_line":""},{"line_number":2474,"context_line":"        # OK, now consume all the VFs in the second compute node and verify"},{"line_number":2475,"context_line":"        # only the first and third computes are returned as root providers from"},{"line_number":2476,"context_line":"        # _get_trees_matching_all()"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_63af4fe3","line":2473,"updated":"2019-03-11 22:25:30.000000000","message":"I would like to see some more complex scenarios here, including multiple member_of/forbidden_aggs combinations, like you did in the previous patch.","commit_id":"bf856c731a4d7a21971f08180346bf3611fa2710"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"76f3ecf34151fb451688c5c63d5871f4c4dfb0d5","unresolved":false,"context_lines":[{"line_number":2470,"context_line":"                                     \u0027cn3_numa0_pf0\u0027, \u0027cn3_numa1_pf1\u0027]"},{"line_number":2471,"context_line":"        expect_provider_ids \u003d self._get_rp_ids_matching_names(provider_names)"},{"line_number":2472,"context_line":"        self.assertEqual(expect_provider_ids, provider_ids)"},{"line_number":2473,"context_line":""},{"line_number":2474,"context_line":"        # OK, now consume all the VFs in the second compute node and verify"},{"line_number":2475,"context_line":"        # only the first and third computes are returned as root providers from"},{"line_number":2476,"context_line":"        # _get_trees_matching_all()"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_9952ba12","line":2473,"in_reply_to":"5fc1f717_63af4fe3","updated":"2019-03-26 07:57:35.000000000","message":"Not done. will do.","commit_id":"bf856c731a4d7a21971f08180346bf3611fa2710"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"214f4551c677829697876ac215ddccdcdf7d5582","unresolved":false,"context_lines":[{"line_number":568,"context_line":"        expected_rps \u003d []"},{"line_number":569,"context_line":"        _run_test(expected_trees, expected_rps, member_of\u003dmember_of,"},{"line_number":570,"context_line":"                  forbidden_aggs\u003dforbidden_aggs)"},{"line_number":571,"context_line":""},{"line_number":572,"context_line":"        # OK, now consume all the VFs in the second compute node and verify"},{"line_number":573,"context_line":"        # only the first and third computes are returned as root providers from"},{"line_number":574,"context_line":"        # get_trees_matching_all()"}],"source_content_type":"text/x-python","patch_set":4,"id":"5fc1f717_c557c7c9","line":571,"updated":"2019-03-27 20:45:51.000000000","message":"Nice.","commit_id":"20b727299bea25bd4bc716aaeccb468f9751d5e7"}]}
