)]}'
{"nova/tests/functional/db/test_allocation_candidates.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f4756cdbf6379c047f669fca7776a3f7885eaa25","unresolved":false,"context_lines":[{"line_number":1602,"context_line":"        self.assertEqual(1, len(trees))"},{"line_number":1603,"context_line":""},{"line_number":1604,"context_line":"        # OK, now consume one VF on each of the PF providers"},{"line_number":1605,"context_line":"        alloc \u003d rp_obj.Allocation("},{"line_number":1606,"context_line":"            resource_provider\u003dpf0,"},{"line_number":1607,"context_line":"            resource_class\u003dfields.ResourceClass.SRIOV_NET_VF,"},{"line_number":1608,"context_line":"            consumer_id\u003duuids.instance1,"},{"line_number":1609,"context_line":"            used\u003d1)"},{"line_number":1610,"context_line":"        alloc_list \u003d rp_obj.AllocationList(self.ctx, objects\u003d[alloc])"},{"line_number":1611,"context_line":"        alloc_list.create_all()"},{"line_number":1612,"context_line":""},{"line_number":1613,"context_line":"        alloc \u003d rp_obj.Allocation("},{"line_number":1614,"context_line":"            resource_provider\u003dpf1,"},{"line_number":1615,"context_line":"            resource_class\u003dfields.ResourceClass.SRIOV_NET_VF,"},{"line_number":1616,"context_line":"            consumer_id\u003duuids.instance2,"},{"line_number":1617,"context_line":"            used\u003d1)"},{"line_number":1618,"context_line":"        alloc_list \u003d rp_obj.AllocationList(self.ctx, objects\u003d[alloc])"},{"line_number":1619,"context_line":"        alloc_list.create_all()"},{"line_number":1620,"context_line":""},{"line_number":1621,"context_line":"        # We should still get the tree returned"},{"line_number":1622,"context_line":"        trees \u003d rp_obj._get_trees_matching_all(self.ctx, resources, traits)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_c3a4f3a8","line":1619,"range":{"start_line":1605,"start_character":0,"end_line":1619,"end_character":31},"updated":"2018-01-16 15:27:32.000000000","message":"Use the _allocate_from_provider helper.","commit_id":"ce4b31815eaaa93b78748eab1527318c0cc7c71a"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bb99cbded3dee00d87b42316ed7fac21f1909652","unresolved":false,"context_lines":[{"line_number":1602,"context_line":"        self.assertEqual(1, len(trees))"},{"line_number":1603,"context_line":""},{"line_number":1604,"context_line":"        # OK, now consume one VF on each of the PF providers"},{"line_number":1605,"context_line":"        alloc \u003d rp_obj.Allocation("},{"line_number":1606,"context_line":"            resource_provider\u003dpf0,"},{"line_number":1607,"context_line":"            resource_class\u003dfields.ResourceClass.SRIOV_NET_VF,"},{"line_number":1608,"context_line":"            consumer_id\u003duuids.instance1,"},{"line_number":1609,"context_line":"            used\u003d1)"},{"line_number":1610,"context_line":"        alloc_list \u003d rp_obj.AllocationList(self.ctx, objects\u003d[alloc])"},{"line_number":1611,"context_line":"        alloc_list.create_all()"},{"line_number":1612,"context_line":""},{"line_number":1613,"context_line":"        alloc \u003d rp_obj.Allocation("},{"line_number":1614,"context_line":"            resource_provider\u003dpf1,"},{"line_number":1615,"context_line":"            resource_class\u003dfields.ResourceClass.SRIOV_NET_VF,"},{"line_number":1616,"context_line":"            consumer_id\u003duuids.instance2,"},{"line_number":1617,"context_line":"            used\u003d1)"},{"line_number":1618,"context_line":"        alloc_list \u003d rp_obj.AllocationList(self.ctx, objects\u003d[alloc])"},{"line_number":1619,"context_line":"        alloc_list.create_all()"},{"line_number":1620,"context_line":""},{"line_number":1621,"context_line":"        # We should still get the tree returned"},{"line_number":1622,"context_line":"        trees \u003d rp_obj._get_trees_matching_all(self.ctx, resources, traits)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_72bda700","line":1619,"range":{"start_line":1605,"start_character":0,"end_line":1619,"end_character":31},"in_reply_to":"7f96bb07_c3a4f3a8","updated":"2018-01-16 18:16:57.000000000","message":"Done","commit_id":"ce4b31815eaaa93b78748eab1527318c0cc7c71a"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f4756cdbf6379c047f669fca7776a3f7885eaa25","unresolved":false,"context_lines":[{"line_number":1630,"context_line":"        # representing the compute node no longer is returned by"},{"line_number":1631,"context_line":"        # _get_trees_matching_all() since there are no longer 2 VF resources"},{"line_number":1632,"context_line":"        # available."},{"line_number":1633,"context_line":"        alloc \u003d rp_obj.Allocation("},{"line_number":1634,"context_line":"            resource_provider\u003dpf0,"},{"line_number":1635,"context_line":"            resource_class\u003dfields.ResourceClass.SRIOV_NET_VF,"},{"line_number":1636,"context_line":"            consumer_id\u003duuids.instance3,"},{"line_number":1637,"context_line":"            used\u003d1)"},{"line_number":1638,"context_line":"        alloc_list \u003d rp_obj.AllocationList(self.ctx, objects\u003d[alloc])"},{"line_number":1639,"context_line":"        alloc_list.create_all()"},{"line_number":1640,"context_line":""},{"line_number":1641,"context_line":"        trees \u003d rp_obj._get_trees_matching_all(self.ctx, resources, traits)"},{"line_number":1642,"context_line":"        self.assertEqual(0, len(trees))"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_43ba23c1","line":1639,"range":{"start_line":1633,"start_character":0,"end_line":1639,"end_character":31},"updated":"2018-01-16 15:27:32.000000000","message":"ditto","commit_id":"ce4b31815eaaa93b78748eab1527318c0cc7c71a"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bb99cbded3dee00d87b42316ed7fac21f1909652","unresolved":false,"context_lines":[{"line_number":1630,"context_line":"        # representing the compute node no longer is returned by"},{"line_number":1631,"context_line":"        # _get_trees_matching_all() since there are no longer 2 VF resources"},{"line_number":1632,"context_line":"        # available."},{"line_number":1633,"context_line":"        alloc \u003d rp_obj.Allocation("},{"line_number":1634,"context_line":"            resource_provider\u003dpf0,"},{"line_number":1635,"context_line":"            resource_class\u003dfields.ResourceClass.SRIOV_NET_VF,"},{"line_number":1636,"context_line":"            consumer_id\u003duuids.instance3,"},{"line_number":1637,"context_line":"            used\u003d1)"},{"line_number":1638,"context_line":"        alloc_list \u003d rp_obj.AllocationList(self.ctx, objects\u003d[alloc])"},{"line_number":1639,"context_line":"        alloc_list.create_all()"},{"line_number":1640,"context_line":""},{"line_number":1641,"context_line":"        trees \u003d rp_obj._get_trees_matching_all(self.ctx, resources, traits)"},{"line_number":1642,"context_line":"        self.assertEqual(0, len(trees))"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_523e6b8c","line":1639,"range":{"start_line":1633,"start_character":0,"end_line":1639,"end_character":31},"in_reply_to":"7f96bb07_43ba23c1","updated":"2018-01-16 18:16:57.000000000","message":"Done","commit_id":"ce4b31815eaaa93b78748eab1527318c0cc7c71a"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5c80672c00ca61ac652fd12fe0a2dba249867a30","unresolved":false,"context_lines":[{"line_number":1776,"context_line":"        pf1 \u003d self._create_provider(\u0027cn_numa1_pf1\u0027, parent\u003dnuma_cell1.uuid)"},{"line_number":1777,"context_line":"        _add_inventory(pf1, fields.ResourceClass.SRIOV_NET_VF, 2)"},{"line_number":1778,"context_line":""},{"line_number":1779,"context_line":"        # NOTE(jaypipes): _get_trees_matching_all() expects a dict of resource"},{"line_number":1780,"context_line":"        # class internal identifiers, not string names"},{"line_number":1781,"context_line":"        resources \u003d {"},{"line_number":1782,"context_line":"            fields.ResourceClass.STANDARD.index("}],"source_content_type":"text/x-python","patch_set":3,"id":"7f96bb07_debd61b7","line":1779,"range":{"start_line":1779,"start_character":26,"end_line":1779,"end_character":49},"updated":"2018-01-18 13:31:20.000000000","message":"nit: _get_trees_matching_all_resources","commit_id":"697078af9a66fbce2065eb22812cb4dddd46273b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5c80672c00ca61ac652fd12fe0a2dba249867a30","unresolved":false,"context_lines":[{"line_number":1795,"context_line":""},{"line_number":1796,"context_line":"        # We should still get the tree returned"},{"line_number":1797,"context_line":"        trees \u003d rp_obj._get_trees_matching_all_resources(self.ctx, resources)"},{"line_number":1798,"context_line":"        # TODO(jaypipes): _get_trees_matching_all() is not working properly for"},{"line_number":1799,"context_line":"        # this assumption. Need to fix it, but for now, mark this assertion as"},{"line_number":1800,"context_line":"        # needing fixed."},{"line_number":1801,"context_line":"        # self.assertEqual(1, len(trees))"}],"source_content_type":"text/x-python","patch_set":3,"id":"7f96bb07_3ecec562","line":1798,"range":{"start_line":1798,"start_character":26,"end_line":1798,"end_character":49},"updated":"2018-01-18 13:31:20.000000000","message":"nit: _get_trees_matching_all_resources","commit_id":"697078af9a66fbce2065eb22812cb4dddd46273b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5c80672c00ca61ac652fd12fe0a2dba249867a30","unresolved":false,"context_lines":[{"line_number":1803,"context_line":""},{"line_number":1804,"context_line":"        # And now consume one VF on the first PF provider and verify the tree"},{"line_number":1805,"context_line":"        # representing the compute node no longer is returned by"},{"line_number":1806,"context_line":"        # _get_trees_matching_all() since there are no longer 2 VF resources"},{"line_number":1807,"context_line":"        # available."},{"line_number":1808,"context_line":"        _allocate_from_provider(pf0, fields.ResourceClass.SRIOV_NET_VF, 1)"},{"line_number":1809,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7f96bb07_fec37d36","line":1806,"range":{"start_line":1806,"start_character":10,"end_line":1806,"end_character":33},"updated":"2018-01-18 13:31:20.000000000","message":"nit: _get_trees_matching_all_resources","commit_id":"697078af9a66fbce2065eb22812cb4dddd46273b"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"430bda0d5d91a4142e3aa59e60cd0f66e54cf4a7","unresolved":false,"context_lines":[{"line_number":1874,"context_line":"        }"},{"line_number":1875,"context_line":""},{"line_number":1876,"context_line":"        trees \u003d rp_obj._get_trees_matching_all_resources(self.ctx, resources)"},{"line_number":1877,"context_line":"        self.assertEqual(0, len(trees))"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f93b717_7cd915f1","line":1877,"range":{"start_line":1877,"start_character":0,"end_line":1877,"end_character":39},"updated":"2018-01-30 07:14:53.000000000","message":"Thanks for the cases updating. : )\n\nYeah, that\u0027s what i mean, but is this an our expected behavior? My previous consideration is: If we request 1384 MEMORY_MB, the numa cell0(256~2048) can meets our demands and then len(trees)\u003d\u003d1.\n\nSo, like this case, the numa_cell0 are limited by numa_cell1 max_unit, it seems our nested models assume the max unit is a global limit, have same strict limitation on the others with same resource class, right?","commit_id":"49444a14d2efddb614c8d148e087dba71caa490b"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"205d0aa2d92643f9c2228f8163b1dbb5432ad8b6","unresolved":false,"context_lines":[{"line_number":1874,"context_line":"        }"},{"line_number":1875,"context_line":""},{"line_number":1876,"context_line":"        trees \u003d rp_obj._get_trees_matching_all_resources(self.ctx, resources)"},{"line_number":1877,"context_line":"        self.assertEqual(0, len(trees))"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f93b717_a05e8741","line":1877,"range":{"start_line":1877,"start_character":0,"end_line":1877,"end_character":39},"in_reply_to":"5f93b717_7cd915f1","updated":"2018-01-30 13:23:57.000000000","message":"Yeah, so unfortunately this is the only expected behaviour that I believe we can *safely* enforce for this scenario. For these situations where there are heteregeneous inventory records for the same resource class on two different child providers, we need to be conservative.\n\nThe granular resource requests functionality that @efried is working on will allow the ability to better utilize this kind of unbalanced resource provider tree, since the user will be able to say \"ok, give me 1024M from one node and 512M from another node in the tree\".\n\nBut for the non-granular resource request (which this is), this is the only safe way I think.","commit_id":"49444a14d2efddb614c8d148e087dba71caa490b"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"08779a84ed273eb743ecf49751d8564d3ddaa6a4","unresolved":false,"context_lines":[{"line_number":1874,"context_line":"        }"},{"line_number":1875,"context_line":""},{"line_number":1876,"context_line":"        trees \u003d rp_obj._get_trees_matching_all_resources(self.ctx, resources)"},{"line_number":1877,"context_line":"        self.assertEqual(0, len(trees))"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f93b717_3a59318d","line":1877,"range":{"start_line":1877,"start_character":0,"end_line":1877,"end_character":39},"in_reply_to":"5f93b717_a05e8741","updated":"2018-01-31 04:05:54.000000000","message":"Got it, thanks for explanation.","commit_id":"49444a14d2efddb614c8d148e087dba71caa490b"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"9228fd35173ed112b057b5d0e882153db849db19","unresolved":false,"context_lines":[{"line_number":1844,"context_line":"        # We should not get the compute node back, since we are requesting an"},{"line_number":1845,"context_line":"        # amount that is less than the maximum min_unit (512)"},{"line_number":1846,"context_line":"        # TODO(jaypipes): This is currently broken and should really be:"},{"line_number":1847,"context_line":"        # self.assertEqual(0, len(trees))"},{"line_number":1848,"context_line":"        self.assertEqual(1, len(trees))"},{"line_number":1849,"context_line":""},{"line_number":1850,"context_line":"        # OK, now consume all the RAM on the first NUMA cell"}],"source_content_type":"text/x-python","patch_set":7,"id":"df7087c5_b665cfe3","line":1847,"updated":"2018-03-20 12:00:43.000000000","message":"Can you explain this one a bit more? My mental model here is that since numa0 can support this we should get it back. There is _somewhere_ for the resources to go.\n\nWhy is maximum min_unit the concern instead of the minimum min_unit?\n\nThe docstring on _get_trees* says \"the nodes in the tree collectively have available inventory\"\n\nCollectively, the inventory is there?","commit_id":"33cbe4e31e437edebea7b7e074fae68483950bce"}]}
