)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bcf35cc87bb910628772b18079d9eb5085a691e5","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Run ServerMovingTests with nested resources"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch duplicate the functional test from ServerMovingTest twice."},{"line_number":10,"context_line":"First to run them against compute nodes that have nested RP tree. Second"},{"line_number":11,"context_line":"to actually request resource from such nested RPs."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3f79a3b5_5afe6738","line":9,"range":{"start_line":9,"start_character":11,"end_line":9,"end_character":20},"updated":"2018-10-02 12:47:09.000000000","message":"duplicates","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2b8d2b00b7e6539ed86800cb1d3072821e6a0554","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Run ServerMovingTests with nested resources"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch duplicate the functional test from ServerMovingTest twice."},{"line_number":10,"context_line":"First to run them against compute nodes that have nested RP tree. Second"},{"line_number":11,"context_line":"to actually request resource from such nested RPs."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3f79a3b5_01b070db","line":9,"range":{"start_line":9,"start_character":11,"end_line":9,"end_character":20},"in_reply_to":"3f79a3b5_5afe6738","updated":"2018-10-02 15:16:56.000000000","message":"Done","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bcf35cc87bb910628772b18079d9eb5085a691e5","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch duplicate the functional test from ServerMovingTest twice."},{"line_number":10,"context_line":"First to run them against compute nodes that have nested RP tree. Second"},{"line_number":11,"context_line":"to actually request resource from such nested RPs."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: Iefff121640e04abdbb6a4ae546c447f168dc8af9"},{"line_number":14,"context_line":"Blueprint: use-nested-allocation-candidates"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3f79a3b5_faf6535e","line":11,"range":{"start_line":11,"start_character":20,"end_line":11,"end_character":28},"updated":"2018-10-02 12:47:09.000000000","message":"resources","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bcf35cc87bb910628772b18079d9eb5085a691e5","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch duplicate the functional test from ServerMovingTest twice."},{"line_number":10,"context_line":"First to run them against compute nodes that have nested RP tree. Second"},{"line_number":11,"context_line":"to actually request resource from such nested RPs."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: Iefff121640e04abdbb6a4ae546c447f168dc8af9"},{"line_number":14,"context_line":"Blueprint: use-nested-allocation-candidates"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3f79a3b5_1af46f54","line":11,"range":{"start_line":11,"start_character":34,"end_line":11,"end_character":38},"updated":"2018-10-02 12:47:09.000000000","message":"those","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2b8d2b00b7e6539ed86800cb1d3072821e6a0554","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch duplicate the functional test from ServerMovingTest twice."},{"line_number":10,"context_line":"First to run them against compute nodes that have nested RP tree. Second"},{"line_number":11,"context_line":"to actually request resource from such nested RPs."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: Iefff121640e04abdbb6a4ae546c447f168dc8af9"},{"line_number":14,"context_line":"Blueprint: use-nested-allocation-candidates"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3f79a3b5_c1c5983e","line":11,"range":{"start_line":11,"start_character":34,"end_line":11,"end_character":38},"in_reply_to":"3f79a3b5_1af46f54","updated":"2018-10-02 15:16:56.000000000","message":"Done","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2b8d2b00b7e6539ed86800cb1d3072821e6a0554","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch duplicate the functional test from ServerMovingTest twice."},{"line_number":10,"context_line":"First to run them against compute nodes that have nested RP tree. Second"},{"line_number":11,"context_line":"to actually request resource from such nested RPs."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: Iefff121640e04abdbb6a4ae546c447f168dc8af9"},{"line_number":14,"context_line":"Blueprint: use-nested-allocation-candidates"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3f79a3b5_61c0442c","line":11,"range":{"start_line":11,"start_character":20,"end_line":11,"end_character":28},"in_reply_to":"3f79a3b5_faf6535e","updated":"2018-10-02 15:16:56.000000000","message":"Done","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"}],"nova/tests/functional/integrated_helpers.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7fe3ffe7695f09f4493c51cc9f0e0b3c4e4e2f0a","unresolved":false,"context_lines":[{"line_number":555,"context_line":"        self.assertRequestMatchesUsage(resources, root_rp_uuid)"},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"    def _resources_from_flavor(self, flavor):"},{"line_number":558,"context_line":"        import collections"},{"line_number":559,"context_line":"        resources \u003d collections.defaultdict(int)"},{"line_number":560,"context_line":"        resources[\u0027VCPU\u0027] \u003d flavor[\u0027vcpus\u0027]"},{"line_number":561,"context_line":"        resources[\u0027MEMORY_MB\u0027] \u003d flavor[\u0027ram\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_b46be3b6","line":558,"updated":"2018-09-20 13:20:40.000000000","message":"drop it","commit_id":"a6ebe2ec62c6ae6d196caafab48507c720e5f9c8"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bcf35cc87bb910628772b18079d9eb5085a691e5","unresolved":false,"context_lines":[{"line_number":518,"context_line":"                total_usage[rc] +\u003d amount"},{"line_number":519,"context_line":"        # Cannot simply do an assertEqual(expected, actual) as usages always"},{"line_number":520,"context_line":"        # contain every RC even if the usage is 0 and the flavor could also"},{"line_number":521,"context_line":"        # contain explict 0 request for some resources. So if flavor has a"},{"line_number":522,"context_line":"        # request then it shall match with the usage but if the usage has more"},{"line_number":523,"context_line":"        # zeros than it is fine."},{"line_number":524,"context_line":"        for rc, value in requested_resources.items():"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_b59c5a5b","line":521,"range":{"start_line":521,"start_character":18,"end_line":521,"end_character":25},"updated":"2018-10-02 12:47:09.000000000","message":"explicit","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2b8d2b00b7e6539ed86800cb1d3072821e6a0554","unresolved":false,"context_lines":[{"line_number":518,"context_line":"                total_usage[rc] +\u003d amount"},{"line_number":519,"context_line":"        # Cannot simply do an assertEqual(expected, actual) as usages always"},{"line_number":520,"context_line":"        # contain every RC even if the usage is 0 and the flavor could also"},{"line_number":521,"context_line":"        # contain explict 0 request for some resources. So if flavor has a"},{"line_number":522,"context_line":"        # request then it shall match with the usage but if the usage has more"},{"line_number":523,"context_line":"        # zeros than it is fine."},{"line_number":524,"context_line":"        for rc, value in requested_resources.items():"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_33837f58","line":521,"range":{"start_line":521,"start_character":18,"end_line":521,"end_character":25},"in_reply_to":"3f79a3b5_b59c5a5b","updated":"2018-10-02 15:16:56.000000000","message":"Done","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bcf35cc87bb910628772b18079d9eb5085a691e5","unresolved":false,"context_lines":[{"line_number":518,"context_line":"                total_usage[rc] +\u003d amount"},{"line_number":519,"context_line":"        # Cannot simply do an assertEqual(expected, actual) as usages always"},{"line_number":520,"context_line":"        # contain every RC even if the usage is 0 and the flavor could also"},{"line_number":521,"context_line":"        # contain explict 0 request for some resources. So if flavor has a"},{"line_number":522,"context_line":"        # request then it shall match with the usage but if the usage has more"},{"line_number":523,"context_line":"        # zeros than it is fine."},{"line_number":524,"context_line":"        for rc, value in requested_resources.items():"},{"line_number":525,"context_line":"            self.assertIn("},{"line_number":526,"context_line":"                rc, total_usage,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_5a7187dd","line":523,"range":{"start_line":521,"start_character":56,"end_line":523,"end_character":32},"updated":"2018-10-02 12:47:09.000000000","message":"I\u0027m having a hard time understanding this sentence. Perhaps you might rephrase it?","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2b8d2b00b7e6539ed86800cb1d3072821e6a0554","unresolved":false,"context_lines":[{"line_number":518,"context_line":"                total_usage[rc] +\u003d amount"},{"line_number":519,"context_line":"        # Cannot simply do an assertEqual(expected, actual) as usages always"},{"line_number":520,"context_line":"        # contain every RC even if the usage is 0 and the flavor could also"},{"line_number":521,"context_line":"        # contain explict 0 request for some resources. So if flavor has a"},{"line_number":522,"context_line":"        # request then it shall match with the usage but if the usage has more"},{"line_number":523,"context_line":"        # zeros than it is fine."},{"line_number":524,"context_line":"        for rc, value in requested_resources.items():"},{"line_number":525,"context_line":"            self.assertIn("},{"line_number":526,"context_line":"                rc, total_usage,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_93ae13e2","line":523,"range":{"start_line":521,"start_character":56,"end_line":523,"end_character":32},"in_reply_to":"3f79a3b5_5a7187dd","updated":"2018-10-02 15:16:56.000000000","message":"I\u0027ve rephrased it","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bcf35cc87bb910628772b18079d9eb5085a691e5","unresolved":false,"context_lines":[{"line_number":526,"context_line":"                rc, total_usage,"},{"line_number":527,"context_line":"                \u0027The requested resource class not found in the total_usage of \u0027"},{"line_number":528,"context_line":"                \u0027the RP tree\u0027)"},{"line_number":529,"context_line":"            self.assertEqual("},{"line_number":530,"context_line":"                value,"},{"line_number":531,"context_line":"                total_usage[rc],"},{"line_number":532,"context_line":"                \u0027The requested resource amount does not match with the total \u0027"},{"line_number":533,"context_line":"                \u0027resource usage of the RP tree\u0027)"},{"line_number":534,"context_line":"        for rc, value in total_usage.items():"},{"line_number":535,"context_line":"            if value !\u003d 0:"},{"line_number":536,"context_line":"                self.assertEqual("}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_15dc2e16","line":533,"range":{"start_line":529,"start_character":0,"end_line":533,"end_character":48},"updated":"2018-10-02 12:47:09.000000000","message":"Does this assume that there will only ever be a single allocation against the provider tree? If any of the tests ever changes to add multiple allocations, this test will break, right?","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2b8d2b00b7e6539ed86800cb1d3072821e6a0554","unresolved":false,"context_lines":[{"line_number":526,"context_line":"                rc, total_usage,"},{"line_number":527,"context_line":"                \u0027The requested resource class not found in the total_usage of \u0027"},{"line_number":528,"context_line":"                \u0027the RP tree\u0027)"},{"line_number":529,"context_line":"            self.assertEqual("},{"line_number":530,"context_line":"                value,"},{"line_number":531,"context_line":"                total_usage[rc],"},{"line_number":532,"context_line":"                \u0027The requested resource amount does not match with the total \u0027"},{"line_number":533,"context_line":"                \u0027resource usage of the RP tree\u0027)"},{"line_number":534,"context_line":"        for rc, value in total_usage.items():"},{"line_number":535,"context_line":"            if value !\u003d 0:"},{"line_number":536,"context_line":"                self.assertEqual("}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_93dcd371","line":533,"range":{"start_line":529,"start_character":0,"end_line":533,"end_character":48},"in_reply_to":"3f79a3b5_15dc2e16","updated":"2018-10-02 15:16:56.000000000","message":"You are correct, this call only takes a single resource_request and match it against the current total usage in the tree.\nHowever there is a assertFlavorsMatchesUsage() that takes two flavors, sum their requests and call this function with the sum to match it against the current usage. It is used in the same-host resize case where both the migration.uuid and the instance.uuid consumers allocate from the same RP tree.","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bcf35cc87bb910628772b18079d9eb5085a691e5","unresolved":false,"context_lines":[{"line_number":555,"context_line":"        self.assertRequestMatchesUsage(resources, root_rp_uuid)"},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"    def _resources_from_flavor(self, flavor):"},{"line_number":558,"context_line":"        import collections"},{"line_number":559,"context_line":"        resources \u003d collections.defaultdict(int)"},{"line_number":560,"context_line":"        resources[\u0027VCPU\u0027] \u003d flavor[\u0027vcpus\u0027]"},{"line_number":561,"context_line":"        resources[\u0027MEMORY_MB\u0027] \u003d flavor[\u0027ram\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_f5af3279","line":558,"range":{"start_line":558,"start_character":8,"end_line":558,"end_character":26},"updated":"2018-10-02 12:47:09.000000000","message":"unneeded","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2b8d2b00b7e6539ed86800cb1d3072821e6a0554","unresolved":false,"context_lines":[{"line_number":555,"context_line":"        self.assertRequestMatchesUsage(resources, root_rp_uuid)"},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"    def _resources_from_flavor(self, flavor):"},{"line_number":558,"context_line":"        import collections"},{"line_number":559,"context_line":"        resources \u003d collections.defaultdict(int)"},{"line_number":560,"context_line":"        resources[\u0027VCPU\u0027] \u003d flavor[\u0027vcpus\u0027]"},{"line_number":561,"context_line":"        resources[\u0027MEMORY_MB\u0027] \u003d flavor[\u0027ram\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_f3c6679c","line":558,"range":{"start_line":558,"start_character":8,"end_line":558,"end_character":26},"in_reply_to":"3f79a3b5_f5af3279","updated":"2018-10-02 15:16:56.000000000","message":"Done","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bcf35cc87bb910628772b18079d9eb5085a691e5","unresolved":false,"context_lines":[{"line_number":575,"context_line":"        total_allocation \u003d collections.defaultdict(int)"},{"line_number":576,"context_line":"        for rp, alloc in allocations.items():"},{"line_number":577,"context_line":"            self.assertIn(rp, expected_rps, \u0027Unexpected, out of tree RP in the\u0027"},{"line_number":578,"context_line":"                                            \u0027 allocation\u0027)"},{"line_number":579,"context_line":"            for rc, value in alloc[\u0027resources\u0027].items():"},{"line_number":580,"context_line":"                total_allocation[rc] +\u003d value"},{"line_number":581,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_f5fdf26c","line":578,"updated":"2018-10-02 12:47:09.000000000","message":"If/when we add sharing storage providers, this will end up breaking, right? (since the sharing provider will not be part of the provider tree)","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2b8d2b00b7e6539ed86800cb1d3072821e6a0554","unresolved":false,"context_lines":[{"line_number":575,"context_line":"        total_allocation \u003d collections.defaultdict(int)"},{"line_number":576,"context_line":"        for rp, alloc in allocations.items():"},{"line_number":577,"context_line":"            self.assertIn(rp, expected_rps, \u0027Unexpected, out of tree RP in the\u0027"},{"line_number":578,"context_line":"                                            \u0027 allocation\u0027)"},{"line_number":579,"context_line":"            for rc, value in alloc[\u0027resources\u0027].items():"},{"line_number":580,"context_line":"                total_allocation[rc] +\u003d value"},{"line_number":581,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_133f6386","line":578,"in_reply_to":"3f79a3b5_f5fdf26c","updated":"2018-10-02 15:16:56.000000000","message":"You are totally correct. I\u0027m ignoring sharing RPs at the moment. Handling that would need some further refactoring on these assert functions.","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"}],"nova/tests/functional/test_servers.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bcf35cc87bb910628772b18079d9eb5085a691e5","unresolved":false,"context_lines":[{"line_number":4841,"context_line":""},{"line_number":4842,"context_line":""},{"line_number":4843,"context_line":"class ServerMovingTestsWithNestedComputes(ServerMovingTests):"},{"line_number":4844,"context_line":"    \"\"\"Runs all the server moving tests while the computes has nested trees."},{"line_number":4845,"context_line":"    The servers still do not require any nested resources though."},{"line_number":4846,"context_line":"    \"\"\""},{"line_number":4847,"context_line":"    compute_driver \u003d \u0027fake.MediumFakeDriverWithNestedCustomResources\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_15618e39","line":4844,"range":{"start_line":4844,"start_character":59,"end_line":4844,"end_character":62},"updated":"2018-10-02 12:47:09.000000000","message":"have","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2b8d2b00b7e6539ed86800cb1d3072821e6a0554","unresolved":false,"context_lines":[{"line_number":4841,"context_line":""},{"line_number":4842,"context_line":""},{"line_number":4843,"context_line":"class ServerMovingTestsWithNestedComputes(ServerMovingTests):"},{"line_number":4844,"context_line":"    \"\"\"Runs all the server moving tests while the computes has nested trees."},{"line_number":4845,"context_line":"    The servers still do not require any nested resources though."},{"line_number":4846,"context_line":"    \"\"\""},{"line_number":4847,"context_line":"    compute_driver \u003d \u0027fake.MediumFakeDriverWithNestedCustomResources\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_81d000f6","line":4844,"range":{"start_line":4844,"start_character":59,"end_line":4844,"end_character":62},"in_reply_to":"3f79a3b5_15618e39","updated":"2018-10-02 15:16:56.000000000","message":"Done","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bcf35cc87bb910628772b18079d9eb5085a691e5","unresolved":false,"context_lines":[{"line_number":4842,"context_line":""},{"line_number":4843,"context_line":"class ServerMovingTestsWithNestedComputes(ServerMovingTests):"},{"line_number":4844,"context_line":"    \"\"\"Runs all the server moving tests while the computes has nested trees."},{"line_number":4845,"context_line":"    The servers still do not require any nested resources though."},{"line_number":4846,"context_line":"    \"\"\""},{"line_number":4847,"context_line":"    compute_driver \u003d \u0027fake.MediumFakeDriverWithNestedCustomResources\u0027"},{"line_number":4848,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_9554be55","line":4845,"range":{"start_line":4845,"start_character":29,"end_line":4845,"end_character":36},"updated":"2018-10-02 12:47:09.000000000","message":"request","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bcf35cc87bb910628772b18079d9eb5085a691e5","unresolved":false,"context_lines":[{"line_number":4842,"context_line":""},{"line_number":4843,"context_line":"class ServerMovingTestsWithNestedComputes(ServerMovingTests):"},{"line_number":4844,"context_line":"    \"\"\"Runs all the server moving tests while the computes has nested trees."},{"line_number":4845,"context_line":"    The servers still do not require any nested resources though."},{"line_number":4846,"context_line":"    \"\"\""},{"line_number":4847,"context_line":"    compute_driver \u003d \u0027fake.MediumFakeDriverWithNestedCustomResources\u0027"},{"line_number":4848,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_d5e476aa","line":4845,"range":{"start_line":4845,"start_character":37,"end_line":4845,"end_character":57},"updated":"2018-10-02 12:47:09.000000000","message":"s/any nested resources/resources from any child provider/","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2b8d2b00b7e6539ed86800cb1d3072821e6a0554","unresolved":false,"context_lines":[{"line_number":4842,"context_line":""},{"line_number":4843,"context_line":"class ServerMovingTestsWithNestedComputes(ServerMovingTests):"},{"line_number":4844,"context_line":"    \"\"\"Runs all the server moving tests while the computes has nested trees."},{"line_number":4845,"context_line":"    The servers still do not require any nested resources though."},{"line_number":4846,"context_line":"    \"\"\""},{"line_number":4847,"context_line":"    compute_driver \u003d \u0027fake.MediumFakeDriverWithNestedCustomResources\u0027"},{"line_number":4848,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_61ee04b6","line":4845,"range":{"start_line":4845,"start_character":29,"end_line":4845,"end_character":36},"in_reply_to":"3f79a3b5_9554be55","updated":"2018-10-02 15:16:56.000000000","message":"Done","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2b8d2b00b7e6539ed86800cb1d3072821e6a0554","unresolved":false,"context_lines":[{"line_number":4842,"context_line":""},{"line_number":4843,"context_line":"class ServerMovingTestsWithNestedComputes(ServerMovingTests):"},{"line_number":4844,"context_line":"    \"\"\"Runs all the server moving tests while the computes has nested trees."},{"line_number":4845,"context_line":"    The servers still do not require any nested resources though."},{"line_number":4846,"context_line":"    \"\"\""},{"line_number":4847,"context_line":"    compute_driver \u003d \u0027fake.MediumFakeDriverWithNestedCustomResources\u0027"},{"line_number":4848,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_813ec023","line":4845,"range":{"start_line":4845,"start_character":37,"end_line":4845,"end_character":57},"in_reply_to":"3f79a3b5_d5e476aa","updated":"2018-10-02 15:16:56.000000000","message":"Done","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bcf35cc87bb910628772b18079d9eb5085a691e5","unresolved":false,"context_lines":[{"line_number":4849,"context_line":""},{"line_number":4850,"context_line":"class ServerMovingTestsWithNestedResourceRequests("},{"line_number":4851,"context_line":"    ServerMovingTestsWithNestedComputes):"},{"line_number":4852,"context_line":"    \"\"\"Runs all the server moving tests while the computes has nested trees."},{"line_number":4853,"context_line":"    The servers also request resources from the nested RP."},{"line_number":4854,"context_line":"    \"\"\""},{"line_number":4855,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_5571460c","line":4852,"range":{"start_line":4852,"start_character":59,"end_line":4852,"end_character":62},"updated":"2018-10-02 12:47:09.000000000","message":"have","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2b8d2b00b7e6539ed86800cb1d3072821e6a0554","unresolved":false,"context_lines":[{"line_number":4849,"context_line":""},{"line_number":4850,"context_line":"class ServerMovingTestsWithNestedResourceRequests("},{"line_number":4851,"context_line":"    ServerMovingTestsWithNestedComputes):"},{"line_number":4852,"context_line":"    \"\"\"Runs all the server moving tests while the computes has nested trees."},{"line_number":4853,"context_line":"    The servers also request resources from the nested RP."},{"line_number":4854,"context_line":"    \"\"\""},{"line_number":4855,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_611cc4c1","line":4852,"range":{"start_line":4852,"start_character":59,"end_line":4852,"end_character":62},"in_reply_to":"3f79a3b5_5571460c","updated":"2018-10-02 15:16:56.000000000","message":"Done","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bcf35cc87bb910628772b18079d9eb5085a691e5","unresolved":false,"context_lines":[{"line_number":4850,"context_line":"class ServerMovingTestsWithNestedResourceRequests("},{"line_number":4851,"context_line":"    ServerMovingTestsWithNestedComputes):"},{"line_number":4852,"context_line":"    \"\"\"Runs all the server moving tests while the computes has nested trees."},{"line_number":4853,"context_line":"    The servers also request resources from the nested RP."},{"line_number":4854,"context_line":"    \"\"\""},{"line_number":4855,"context_line":""},{"line_number":4856,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_b5fd3a3c","line":4853,"range":{"start_line":4853,"start_character":39,"end_line":4853,"end_character":57},"updated":"2018-10-02 12:47:09.000000000","message":"s/from the nested RP/from child providers/","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2b8d2b00b7e6539ed86800cb1d3072821e6a0554","unresolved":false,"context_lines":[{"line_number":4850,"context_line":"class ServerMovingTestsWithNestedResourceRequests("},{"line_number":4851,"context_line":"    ServerMovingTestsWithNestedComputes):"},{"line_number":4852,"context_line":"    \"\"\"Runs all the server moving tests while the computes has nested trees."},{"line_number":4853,"context_line":"    The servers also request resources from the nested RP."},{"line_number":4854,"context_line":"    \"\"\""},{"line_number":4855,"context_line":""},{"line_number":4856,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_c12118fe","line":4853,"range":{"start_line":4853,"start_character":39,"end_line":4853,"end_character":57},"in_reply_to":"3f79a3b5_b5fd3a3c","updated":"2018-10-02 15:16:56.000000000","message":"Done","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bcf35cc87bb910628772b18079d9eb5085a691e5","unresolved":false,"context_lines":[{"line_number":4861,"context_line":"        for flavor in [self.flavor1, self.flavor2, self.flavor3]:"},{"line_number":4862,"context_line":"            self.api.post_extra_spec("},{"line_number":4863,"context_line":"                flavor[\u0027id\u0027], {\u0027extra_specs\u0027: {\u0027resources:CUSTOM_MAGIC\u0027: 1}})"},{"line_number":4864,"context_line":"            # save the extre_specs in the flavor stored in the test case as"},{"line_number":4865,"context_line":"            # well"},{"line_number":4866,"context_line":"            flavor[\u0027extra_specs\u0027] \u003d {\u0027resources:CUSTOM_MAGIC\u0027: 1}"},{"line_number":4867,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_d5cb161a","line":4864,"range":{"start_line":4864,"start_character":23,"end_line":4864,"end_character":34},"updated":"2018-10-02 12:47:09.000000000","message":"extra specs","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2b8d2b00b7e6539ed86800cb1d3072821e6a0554","unresolved":false,"context_lines":[{"line_number":4861,"context_line":"        for flavor in [self.flavor1, self.flavor2, self.flavor3]:"},{"line_number":4862,"context_line":"            self.api.post_extra_spec("},{"line_number":4863,"context_line":"                flavor[\u0027id\u0027], {\u0027extra_specs\u0027: {\u0027resources:CUSTOM_MAGIC\u0027: 1}})"},{"line_number":4864,"context_line":"            # save the extre_specs in the flavor stored in the test case as"},{"line_number":4865,"context_line":"            # well"},{"line_number":4866,"context_line":"            flavor[\u0027extra_specs\u0027] \u003d {\u0027resources:CUSTOM_MAGIC\u0027: 1}"},{"line_number":4867,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_417bc8f2","line":4864,"range":{"start_line":4864,"start_character":23,"end_line":4864,"end_character":34},"in_reply_to":"3f79a3b5_d5cb161a","updated":"2018-10-02 15:16:56.000000000","message":"Done","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bcf35cc87bb910628772b18079d9eb5085a691e5","unresolved":false,"context_lines":[{"line_number":4874,"context_line":"        source_rps \u003d self._get_all_rp_uuids_in_a_tree(source_root_rp_uuid)"},{"line_number":4875,"context_line":"        dest_rps \u003d self._get_all_rp_uuids_in_a_tree(dest_root_rp_uuid)"},{"line_number":4876,"context_line":""},{"line_number":4877,"context_line":"        self.assertEqual(set(source_rps + dest_rps), set(allocations.keys()))"},{"line_number":4878,"context_line":""},{"line_number":4879,"context_line":"        import collections"},{"line_number":4880,"context_line":"        total_source_allocation \u003d collections.defaultdict(int)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_d5b23696","line":4877,"range":{"start_line":4877,"start_character":68,"end_line":4877,"end_character":75},"updated":"2018-10-02 12:47:09.000000000","message":"unnecessary (set(dict) \u003d\u003d set(dict.keys()))","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2b8d2b00b7e6539ed86800cb1d3072821e6a0554","unresolved":false,"context_lines":[{"line_number":4874,"context_line":"        source_rps \u003d self._get_all_rp_uuids_in_a_tree(source_root_rp_uuid)"},{"line_number":4875,"context_line":"        dest_rps \u003d self._get_all_rp_uuids_in_a_tree(dest_root_rp_uuid)"},{"line_number":4876,"context_line":""},{"line_number":4877,"context_line":"        self.assertEqual(set(source_rps + dest_rps), set(allocations.keys()))"},{"line_number":4878,"context_line":""},{"line_number":4879,"context_line":"        import collections"},{"line_number":4880,"context_line":"        total_source_allocation \u003d collections.defaultdict(int)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_e1cbf419","line":4877,"range":{"start_line":4877,"start_character":68,"end_line":4877,"end_character":75},"in_reply_to":"3f79a3b5_d5b23696","updated":"2018-10-02 15:16:56.000000000","message":"Done","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bcf35cc87bb910628772b18079d9eb5085a691e5","unresolved":false,"context_lines":[{"line_number":4876,"context_line":""},{"line_number":4877,"context_line":"        self.assertEqual(set(source_rps + dest_rps), set(allocations.keys()))"},{"line_number":4878,"context_line":""},{"line_number":4879,"context_line":"        import collections"},{"line_number":4880,"context_line":"        total_source_allocation \u003d collections.defaultdict(int)"},{"line_number":4881,"context_line":"        total_dest_allocation \u003d collections.defaultdict(int)"},{"line_number":4882,"context_line":"        for rp, alloc in allocations.items():"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_9587deb6","line":4879,"range":{"start_line":4879,"start_character":15,"end_line":4879,"end_character":26},"updated":"2018-10-02 12:47:09.000000000","message":"move to top of file imports","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2b8d2b00b7e6539ed86800cb1d3072821e6a0554","unresolved":false,"context_lines":[{"line_number":4876,"context_line":""},{"line_number":4877,"context_line":"        self.assertEqual(set(source_rps + dest_rps), set(allocations.keys()))"},{"line_number":4878,"context_line":""},{"line_number":4879,"context_line":"        import collections"},{"line_number":4880,"context_line":"        total_source_allocation \u003d collections.defaultdict(int)"},{"line_number":4881,"context_line":"        total_dest_allocation \u003d collections.defaultdict(int)"},{"line_number":4882,"context_line":"        for rp, alloc in allocations.items():"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_61dfe4d6","line":4879,"range":{"start_line":4879,"start_character":15,"end_line":4879,"end_character":26},"in_reply_to":"3f79a3b5_9587deb6","updated":"2018-10-02 15:16:56.000000000","message":"Done","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bcf35cc87bb910628772b18079d9eb5085a691e5","unresolved":false,"context_lines":[{"line_number":4891,"context_line":"        self.assertEqual("},{"line_number":4892,"context_line":"            self._resources_from_flavor(flavor), total_dest_allocation)"},{"line_number":4893,"context_line":""},{"line_number":4894,"context_line":"    import unittest"},{"line_number":4895,"context_line":""},{"line_number":4896,"context_line":"    @unittest.expectedFailure"},{"line_number":4897,"context_line":"    def test_live_migrate_force(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_f59c120e","line":4894,"range":{"start_line":4894,"start_character":0,"end_line":4894,"end_character":19},"updated":"2018-10-02 12:47:09.000000000","message":"unneeded (or move to top of file imports)","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2b8d2b00b7e6539ed86800cb1d3072821e6a0554","unresolved":false,"context_lines":[{"line_number":4891,"context_line":"        self.assertEqual("},{"line_number":4892,"context_line":"            self._resources_from_flavor(flavor), total_dest_allocation)"},{"line_number":4893,"context_line":""},{"line_number":4894,"context_line":"    import unittest"},{"line_number":4895,"context_line":""},{"line_number":4896,"context_line":"    @unittest.expectedFailure"},{"line_number":4897,"context_line":"    def test_live_migrate_force(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_e199b41d","line":4894,"range":{"start_line":4894,"start_character":0,"end_line":4894,"end_character":19},"in_reply_to":"3f79a3b5_f59c120e","updated":"2018-10-02 15:16:56.000000000","message":"moved","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bcf35cc87bb910628772b18079d9eb5085a691e5","unresolved":false,"context_lines":[{"line_number":4899,"context_line":"        # only returns the allocation on the compute RP and therefore the"},{"line_number":4900,"context_line":"        # LiveMigrationTask._held_migration only stores and reapplies that"},{"line_number":4901,"context_line":"        # during the move. Therefore the allocation on the child RP is lost"},{"line_number":4902,"context_line":"        # during the force live migration"},{"line_number":4903,"context_line":"        super(ServerMovingTestsWithNestedResourceRequests,"},{"line_number":4904,"context_line":"              self).test_live_migrate_force()"},{"line_number":4905,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_3565aa1d","line":4902,"updated":"2018-10-02 12:47:09.000000000","message":"✓","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bcf35cc87bb910628772b18079d9eb5085a691e5","unresolved":false,"context_lines":[{"line_number":4907,"context_line":"    def test_evacuate(self):"},{"line_number":4908,"context_line":"        # This test shows a bug. It seems that when the source allocation is"},{"line_number":4909,"context_line":"        # dropped after the failed evacuate nova only drops the allocation from"},{"line_number":4910,"context_line":"        # the root RP but not from the child RP."},{"line_number":4911,"context_line":"        super(ServerMovingTestsWithNestedResourceRequests,"},{"line_number":4912,"context_line":"              self).test_evacuate()"},{"line_number":4913,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_f56ad2e9","line":4910,"updated":"2018-10-02 12:47:09.000000000","message":"✓","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bcf35cc87bb910628772b18079d9eb5085a691e5","unresolved":false,"context_lines":[{"line_number":4915,"context_line":"    def test_evacuate_rebuild_on_dest_fails(self):"},{"line_number":4916,"context_line":"        # This test shows a bug. It seems that when the rebuild fails on the"},{"line_number":4917,"context_line":"        # destination host only the root RP allocation is deleted on the dest"},{"line_number":4918,"context_line":"        # host."},{"line_number":4919,"context_line":"        super(ServerMovingTestsWithNestedResourceRequests,"},{"line_number":4920,"context_line":"              self).test_evacuate_rebuild_on_dest_fails()"},{"line_number":4921,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_154bce86","line":4918,"updated":"2018-10-02 12:47:09.000000000","message":"✓","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bcf35cc87bb910628772b18079d9eb5085a691e5","unresolved":false,"context_lines":[{"line_number":4923,"context_line":"    def test_evacuate_claim_on_dest_fails(self):"},{"line_number":4924,"context_line":"        # This test shows a bug. It seems that when the evacuation fails on the"},{"line_number":4925,"context_line":"        # destination host only the root RP allocation is deleted on the dest"},{"line_number":4926,"context_line":"        # host."},{"line_number":4927,"context_line":"        super(ServerMovingTestsWithNestedResourceRequests,"},{"line_number":4928,"context_line":"              self).test_evacuate_claim_on_dest_fails()"},{"line_number":4929,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_354e0a96","line":4926,"updated":"2018-10-02 12:47:09.000000000","message":"✓","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bcf35cc87bb910628772b18079d9eb5085a691e5","unresolved":false,"context_lines":[{"line_number":4932,"context_line":"        # This test shows a bug. When the conductor tries to claim the same"},{"line_number":4933,"context_line":"        # resources on the dest host that was on the source host it only"},{"line_number":4934,"context_line":"        # considers the root RP allocations therefore the child RP allocation"},{"line_number":4935,"context_line":"        # isn\u0027t replicated on the dest host."},{"line_number":4936,"context_line":"        super(ServerMovingTestsWithNestedResourceRequests,"},{"line_number":4937,"context_line":"              self).test_evacuate_forced_host()"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_b559ba5b","line":4935,"updated":"2018-10-02 12:47:09.000000000","message":"✓","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"fcfe4fbf4ffcfd3ebd24c143be84f90c79473ac9","unresolved":false,"context_lines":[{"line_number":4866,"context_line":"                flavor[\u0027id\u0027], {\u0027extra_specs\u0027: {\u0027resources:CUSTOM_MAGIC\u0027: 1}})"},{"line_number":4867,"context_line":"            # save the extra_specs in the flavor stored in the test case as"},{"line_number":4868,"context_line":"            # well"},{"line_number":4869,"context_line":"            flavor[\u0027extra_specs\u0027] \u003d {\u0027resources:CUSTOM_MAGIC\u0027: 1}"},{"line_number":4870,"context_line":""},{"line_number":4871,"context_line":"    def _check_allocation_during_evacuate("},{"line_number":4872,"context_line":"            self, flavor, server_uuid, source_root_rp_uuid, dest_root_rp_uuid):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f79a3b5_496ba785","line":4869,"updated":"2018-10-05 08:31:37.000000000","message":"Tracking my concern here, but I feel it\u0027s a big one that deserves some discussion.\n\nSay we have a tree with a root RP having classic resource classes, but the CUSTOM_MAGIC RC be only on an inventory from a child RP.\n\nIn this case, we will get allocation candidates including two resource provider UUIDs (one being the root RP, and the other being the child RP) as stated in https://developer.openstack.org/api-ref/placement/#list-allocation-candidates\n\nBut, at the very early stages of usage of Placement, we made a very big assumption that the RP UUIDs we were getting were all compute node UUIDs at the exact moment when we lookup the host states for passing them down to the filters.\nhttps://github.com/openstack/nova/blob/c22b53c/nova/scheduler/filter_scheduler.py#L481\n\nThat\u0027s then incorrect. Or at least we should make sure we aren\u0027t having a side effect by looking up the child RP UUID.","commit_id":"2202d7726bb41a2d3228297545327d5b41f35f7e"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"45ca960e8468e3d47e099e9bdc5ba40f3f038998","unresolved":false,"context_lines":[{"line_number":4866,"context_line":"                flavor[\u0027id\u0027], {\u0027extra_specs\u0027: {\u0027resources:CUSTOM_MAGIC\u0027: 1}})"},{"line_number":4867,"context_line":"            # save the extra_specs in the flavor stored in the test case as"},{"line_number":4868,"context_line":"            # well"},{"line_number":4869,"context_line":"            flavor[\u0027extra_specs\u0027] \u003d {\u0027resources:CUSTOM_MAGIC\u0027: 1}"},{"line_number":4870,"context_line":""},{"line_number":4871,"context_line":"    def _check_allocation_during_evacuate("},{"line_number":4872,"context_line":"            self, flavor, server_uuid, source_root_rp_uuid, dest_root_rp_uuid):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f79a3b5_09192fd0","line":4869,"in_reply_to":"3f79a3b5_496ba785","updated":"2018-10-05 08:49:34.000000000","message":"OK, so after thinking more on the impact and the potential issues we could get, I just feel we\u0027re safe *for now*.\n\nSince we only lookup the existing compute nodes by returning the ones which match the UUIDs [1], we only return \u0027real\u0027 compute nodes and we don\u0027t raise exceptions whether what we got is correct or not.\n\nThat said, once we model NUMA with child Resource Providers, a request asking for VCPUs and MEM_MB resource classes could only get a list of \"children resource providers\" (which would be NUMA cells). In that case, [1] would return empty list which would lead to filters having 0 hosts to check (and then raising a NoValidHost).\n\nShould we fix the issue now or leave it for later ? The question is open.\n\n[1] https://github.com/openstack/nova/blob/c22b53c2481bac518a6b32cdee7b7df23d91251e/nova/objects/compute_node.py#L444-L445","commit_id":"2202d7726bb41a2d3228297545327d5b41f35f7e"}],"nova/virt/fake.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bcf35cc87bb910628772b18079d9eb5085a691e5","unresolved":false,"context_lines":[{"line_number":696,"context_line":"        else:"},{"line_number":697,"context_line":"            child_uuid \u003d provider_tree.data(nodename + \u0027-child\u0027).uuid"},{"line_number":698,"context_line":""},{"line_number":699,"context_line":"        provider_tree.update_inventory(child_uuid, self.child_resources)"},{"line_number":700,"context_line":""},{"line_number":701,"context_line":""},{"line_number":702,"context_line":"class FakeRescheduleDriver(FakeDriver):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_950cbe42","line":699,"updated":"2018-10-02 12:47:09.000000000","message":"might be worth doing:\n\n if provider_tree.has_inventory_changed(child_uuid, self.child_resources):\n     provider_tree.update_inventory(child_uuid, self.child_resources)\n\nsince this is used in tests that call the periodics (and changing inventory in update_provider_tree() unnecessarily will call to placement IIANM)","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"71b2c35defac103c7586043f8473243ac90cb226","unresolved":false,"context_lines":[{"line_number":696,"context_line":"        else:"},{"line_number":697,"context_line":"            child_uuid \u003d provider_tree.data(nodename + \u0027-child\u0027).uuid"},{"line_number":698,"context_line":""},{"line_number":699,"context_line":"        provider_tree.update_inventory(child_uuid, self.child_resources)"},{"line_number":700,"context_line":""},{"line_number":701,"context_line":""},{"line_number":702,"context_line":"class FakeRescheduleDriver(FakeDriver):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_dae0fe29","line":699,"in_reply_to":"3f79a3b5_950cbe42","updated":"2018-10-03 18:54:14.000000000","message":"\u003e might be worth doing:\n \u003e \n \u003e if provider_tree.has_inventory_changed(child_uuid,\n \u003e self.child_resources):\n \u003e provider_tree.update_inventory(child_uuid, self.child_resources)\n \u003e \n \u003e since this is used in tests that call the periodics (and changing\n \u003e inventory in update_provider_tree() unnecessarily will call to\n \u003e placement IIANM)\n\nYAM. Both update_inventory and update_from_provider_tree (via _set_inventory_for_provider) already use has_inventory_changed to no-op.","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2b8d2b00b7e6539ed86800cb1d3072821e6a0554","unresolved":false,"context_lines":[{"line_number":696,"context_line":"        else:"},{"line_number":697,"context_line":"            child_uuid \u003d provider_tree.data(nodename + \u0027-child\u0027).uuid"},{"line_number":698,"context_line":""},{"line_number":699,"context_line":"        provider_tree.update_inventory(child_uuid, self.child_resources)"},{"line_number":700,"context_line":""},{"line_number":701,"context_line":""},{"line_number":702,"context_line":"class FakeRescheduleDriver(FakeDriver):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_c11ef872","line":699,"in_reply_to":"3f79a3b5_950cbe42","updated":"2018-10-02 15:16:56.000000000","message":"Done","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8b1a4c524134d1ca9e0ddc5cea634ecaa6189aba","unresolved":false,"context_lines":[{"line_number":696,"context_line":"        else:"},{"line_number":697,"context_line":"            child_uuid \u003d provider_tree.data(nodename + \u0027-child\u0027).uuid"},{"line_number":698,"context_line":""},{"line_number":699,"context_line":"        provider_tree.update_inventory(child_uuid, self.child_resources)"},{"line_number":700,"context_line":""},{"line_number":701,"context_line":""},{"line_number":702,"context_line":"class FakeRescheduleDriver(FakeDriver):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_4b918299","line":699,"in_reply_to":"3f79a3b5_dae0fe29","updated":"2018-10-03 21:03:33.000000000","message":"Ah, good to know. Thanks, Eric :)\n\nIWMI. (I Was Mistaken Indeed)","commit_id":"33e2f9fdce3c3c4e1354f0cc50eeeccab05e20fe"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"71b2c35defac103c7586043f8473243ac90cb226","unresolved":false,"context_lines":[{"line_number":691,"context_line":"                allocations\u003dallocations)"},{"line_number":692,"context_line":""},{"line_number":693,"context_line":"        if not provider_tree.exists(nodename + \u0027-child\u0027):"},{"line_number":694,"context_line":"            child_uuid \u003d provider_tree.new_child(name\u003dnodename + \u0027-child\u0027,"},{"line_number":695,"context_line":"                                                 parent\u003dnodename)"},{"line_number":696,"context_line":"        else:"},{"line_number":697,"context_line":"            child_uuid \u003d provider_tree.data(nodename + \u0027-child\u0027).uuid"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_c5fd8408","line":694,"range":{"start_line":694,"start_character":12,"end_line":694,"end_character":22},"updated":"2018-10-03 18:54:14.000000000","message":"nit: has_inventory_changed accepts the name too, so you could do without this variable and the `else` clause below.","commit_id":"9188ef40b25afb07ef5a0250e8e49ed16a80cdb4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0a176d4c532bdc57259685cdfdfe79c6a868d4aa","unresolved":false,"context_lines":[{"line_number":691,"context_line":"                allocations\u003dallocations)"},{"line_number":692,"context_line":""},{"line_number":693,"context_line":"        if not provider_tree.exists(nodename + \u0027-child\u0027):"},{"line_number":694,"context_line":"            child_uuid \u003d provider_tree.new_child(name\u003dnodename + \u0027-child\u0027,"},{"line_number":695,"context_line":"                                                 parent\u003dnodename)"},{"line_number":696,"context_line":"        else:"},{"line_number":697,"context_line":"            child_uuid \u003d provider_tree.data(nodename + \u0027-child\u0027).uuid"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_58d1442e","line":694,"range":{"start_line":694,"start_character":12,"end_line":694,"end_character":22},"in_reply_to":"3f79a3b5_c5fd8408","updated":"2018-10-04 13:32:32.000000000","message":"Done","commit_id":"9188ef40b25afb07ef5a0250e8e49ed16a80cdb4"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"71b2c35defac103c7586043f8473243ac90cb226","unresolved":false,"context_lines":[{"line_number":696,"context_line":"        else:"},{"line_number":697,"context_line":"            child_uuid \u003d provider_tree.data(nodename + \u0027-child\u0027).uuid"},{"line_number":698,"context_line":""},{"line_number":699,"context_line":"        if provider_tree.has_inventory_changed("},{"line_number":700,"context_line":"                child_uuid, self.child_resources):"},{"line_number":701,"context_line":"            provider_tree.update_inventory(child_uuid, self.child_resources)"},{"line_number":702,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_5ac62e9e","line":699,"range":{"start_line":699,"start_character":8,"end_line":699,"end_character":47},"updated":"2018-10-03 18:54:14.000000000","message":"not necessary (see PS3 comments)","commit_id":"9188ef40b25afb07ef5a0250e8e49ed16a80cdb4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0a176d4c532bdc57259685cdfdfe79c6a868d4aa","unresolved":false,"context_lines":[{"line_number":696,"context_line":"        else:"},{"line_number":697,"context_line":"            child_uuid \u003d provider_tree.data(nodename + \u0027-child\u0027).uuid"},{"line_number":698,"context_line":""},{"line_number":699,"context_line":"        if provider_tree.has_inventory_changed("},{"line_number":700,"context_line":"                child_uuid, self.child_resources):"},{"line_number":701,"context_line":"            provider_tree.update_inventory(child_uuid, self.child_resources)"},{"line_number":702,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_78d4401f","line":699,"range":{"start_line":699,"start_character":8,"end_line":699,"end_character":47},"in_reply_to":"3f79a3b5_5ac62e9e","updated":"2018-10-04 13:32:32.000000000","message":"Done","commit_id":"9188ef40b25afb07ef5a0250e8e49ed16a80cdb4"}]}
