)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"10999e6c158f3a154f1aefc2a08123dc5ab58a2d","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2020-04-11 18:28:01 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"delete sub resource provider when delete resource provider"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Ide8732be6c047ad1b141b89df676783b2fa2f25a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3f4c43b2_7160fa33","line":8,"updated":"2020-04-13 01:36:44.000000000","message":"Add more details for this change.\n\nAnd you should register a bug, and provide more details, than add Closes-Bug: #\u003cbug-id\u003e tag in this commit message.","commit_id":"4820a9395eca1fa3fb06d81b6460c0e7131116a8"}],"nova/scheduler/client/report.py":[{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"10999e6c158f3a154f1aefc2a08123dc5ab58a2d","unresolved":false,"context_lines":[{"line_number":2153,"context_line":"                context, host, nodename)"},{"line_number":2154,"context_line":"            for instance_uuid in instance_uuids:"},{"line_number":2155,"context_line":"                self.delete_allocation_for_instance(context, instance_uuid)"},{"line_number":2156,"context_line":"        rp_in_tree \u003d self.get_providers_in_tree(context, rp_uuid)"},{"line_number":2157,"context_line":"        for rp in rp_in_tree[::-1]:"},{"line_number":2158,"context_line":"            if rp[\"parent_provider_uuid\"] \u003d\u003d rp_uuid or rp[\"uuid\"] \u003d\u003d rp_uuid:"},{"line_number":2159,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f4c43b2_915b0686","line":2156,"updated":"2020-04-13 01:36:44.000000000","message":"Add comments on this change.","commit_id":"4820a9395eca1fa3fb06d81b6460c0e7131116a8"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"10999e6c158f3a154f1aefc2a08123dc5ab58a2d","unresolved":false,"context_lines":[{"line_number":2154,"context_line":"            for instance_uuid in instance_uuids:"},{"line_number":2155,"context_line":"                self.delete_allocation_for_instance(context, instance_uuid)"},{"line_number":2156,"context_line":"        rp_in_tree \u003d self.get_providers_in_tree(context, rp_uuid)"},{"line_number":2157,"context_line":"        for rp in rp_in_tree[::-1]:"},{"line_number":2158,"context_line":"            if rp[\"parent_provider_uuid\"] \u003d\u003d rp_uuid or rp[\"uuid\"] \u003d\u003d rp_uuid:"},{"line_number":2159,"context_line":"                try:"},{"line_number":2160,"context_line":"                    self._delete_provider(rp[\"uuid\"],"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f4c43b2_23e62946","line":2157,"updated":"2020-04-13 01:36:44.000000000","message":"I think this change is make sense.\n\nIf in \u0027rp\u0027 we have some children, that we can not delete the \u0027rp\u0027 in placement [1], it will be raised \u0027CannotDeleteParentResourceProvider\u0027, in this way, we cannot assign this \u0027rp\u0027 to the instance again.\n\nWe can delete \u0027rp\u0027 step by step until you delete the \u0027rp\u0027 resource, but we need to update this again when the Cybrog resource is synchronized, I see that you have dealt with this [2].\n\n[1]https://opendev.org/openstack/placement/src/branch/master/placement/objects/resource_provider.py#L733-L734\n\n[2]https://review.opendev.org/#/c/718662/1/cyborg/conductor/manager.py@181","commit_id":"4820a9395eca1fa3fb06d81b6460c0e7131116a8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8439052016ec030573d8747315515742c8a5fa76","unresolved":false,"context_lines":[{"line_number":2153,"context_line":"                context, host, nodename)"},{"line_number":2154,"context_line":"            for instance_uuid in instance_uuids:"},{"line_number":2155,"context_line":"                self.delete_allocation_for_instance(context, instance_uuid)"},{"line_number":2156,"context_line":"        # delete sub resource provider in tree, otherwise Placement will throw"},{"line_number":2157,"context_line":"        # exception when delete resource provider which has child providers"},{"line_number":2158,"context_line":"        rp_in_tree \u003d self.get_providers_in_tree(context, rp_uuid)"},{"line_number":2159,"context_line":"        for rp in rp_in_tree[::-1]:"},{"line_number":2160,"context_line":"            if rp[\"parent_provider_uuid\"] \u003d\u003d rp_uuid or rp[\"uuid\"] \u003d\u003d rp_uuid:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f4c43b2_0022b400","line":2157,"range":{"start_line":2156,"start_character":58,"end_line":2157,"end_character":19},"updated":"2020-04-16 12:49:50.000000000","message":"to be precise placement will reject the delete request, the report client in nova raises the exception","commit_id":"d71f0fd03170f27f9f060767d3824edec35334ca"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8439052016ec030573d8747315515742c8a5fa76","unresolved":false,"context_lines":[{"line_number":2156,"context_line":"        # delete sub resource provider in tree, otherwise Placement will throw"},{"line_number":2157,"context_line":"        # exception when delete resource provider which has child providers"},{"line_number":2158,"context_line":"        rp_in_tree \u003d self.get_providers_in_tree(context, rp_uuid)"},{"line_number":2159,"context_line":"        for rp in rp_in_tree[::-1]:"},{"line_number":2160,"context_line":"            if rp[\"parent_provider_uuid\"] \u003d\u003d rp_uuid or rp[\"uuid\"] \u003d\u003d rp_uuid:"},{"line_number":2161,"context_line":"                try:"},{"line_number":2162,"context_line":"                    self._delete_provider(rp[\"uuid\"],"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f4c43b2_40f03c68","line":2159,"range":{"start_line":2159,"start_character":18,"end_line":2159,"end_character":34},"updated":"2020-04-16 12:49:50.000000000","message":"do we know if this list in a good order for recursive deletion (e.g is it always contains the child before its ancestors)? The placement API does not define the order in which the RPs are returned.","commit_id":"d71f0fd03170f27f9f060767d3824edec35334ca"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"6436d6781d7374489486882e1d405494547031a2","unresolved":false,"context_lines":[{"line_number":2156,"context_line":"        # delete sub resource provider in tree, otherwise Placement will throw"},{"line_number":2157,"context_line":"        # exception when delete resource provider which has child providers"},{"line_number":2158,"context_line":"        rp_in_tree \u003d self.get_providers_in_tree(context, rp_uuid)"},{"line_number":2159,"context_line":"        for rp in rp_in_tree[::-1]:"},{"line_number":2160,"context_line":"            if rp[\"parent_provider_uuid\"] \u003d\u003d rp_uuid or rp[\"uuid\"] \u003d\u003d rp_uuid:"},{"line_number":2161,"context_line":"                try:"},{"line_number":2162,"context_line":"                    self._delete_provider(rp[\"uuid\"],"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f4c43b2_8d09cd32","line":2159,"range":{"start_line":2159,"start_character":18,"end_line":2159,"end_character":34},"in_reply_to":"3f4c43b2_40f03c68","updated":"2020-04-17 09:15:43.000000000","message":"\u003e do we know if this list in a good order for recursive deletion (e.g\n \u003e is it always contains the child before its ancestors)? The\n \u003e placement API does not define the order in which the RPs are\n \u003e returned.\n\nThe resource data store in ``resource_providers`` table in Placement, the table is stored in a tree structure, and the default storage structure returned by ``rp_uuid`` is, right?","commit_id":"d71f0fd03170f27f9f060767d3824edec35334ca"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"ac0d49c42efc2a02961de31650445ef339361702","unresolved":false,"context_lines":[{"line_number":2156,"context_line":"        # delete sub resource provider in tree, otherwise Placement will throw"},{"line_number":2157,"context_line":"        # exception when delete resource provider which has child providers"},{"line_number":2158,"context_line":"        rp_in_tree \u003d self.get_providers_in_tree(context, rp_uuid)"},{"line_number":2159,"context_line":"        for rp in rp_in_tree[::-1]:"},{"line_number":2160,"context_line":"            if rp[\"parent_provider_uuid\"] \u003d\u003d rp_uuid or rp[\"uuid\"] \u003d\u003d rp_uuid:"},{"line_number":2161,"context_line":"                try:"},{"line_number":2162,"context_line":"                    self._delete_provider(rp[\"uuid\"],"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f4c43b2_8e7ee016","line":2159,"range":{"start_line":2159,"start_character":18,"end_line":2159,"end_character":34},"in_reply_to":"3f4c43b2_7f3ce4c7","updated":"2020-04-17 14:40:56.000000000","message":"Even if the placement storage strategy works this way it feels like an implementation detail in placement that can change without notice. Does nova make the same assumption elsewhere in the code?","commit_id":"d71f0fd03170f27f9f060767d3824edec35334ca"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"131592508bfcac78a9b0cdf9018c0315295a5f24","unresolved":false,"context_lines":[{"line_number":2156,"context_line":"        # delete sub resource provider in tree, otherwise Placement will throw"},{"line_number":2157,"context_line":"        # exception when delete resource provider which has child providers"},{"line_number":2158,"context_line":"        rp_in_tree \u003d self.get_providers_in_tree(context, rp_uuid)"},{"line_number":2159,"context_line":"        for rp in rp_in_tree[::-1]:"},{"line_number":2160,"context_line":"            if rp[\"parent_provider_uuid\"] \u003d\u003d rp_uuid or rp[\"uuid\"] \u003d\u003d rp_uuid:"},{"line_number":2161,"context_line":"                try:"},{"line_number":2162,"context_line":"                    self._delete_provider(rp[\"uuid\"],"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f4c43b2_7f3ce4c7","line":2159,"range":{"start_line":2159,"start_character":18,"end_line":2159,"end_character":34},"in_reply_to":"3f4c43b2_8d09cd32","updated":"2020-04-17 09:20:35.000000000","message":"I saw Cyborg also delete rp by this way https://opendev.org/openstack/cyborg/src/branch/master/cyborg/conductor/manager.py#L336-L345","commit_id":"d71f0fd03170f27f9f060767d3824edec35334ca"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3a716d30d5ee5a4d9c463cb67471f5f0506a2ec9","unresolved":false,"context_lines":[{"line_number":2156,"context_line":"        # delete sub resource provider in tree, otherwise Placement will throw"},{"line_number":2157,"context_line":"        # exception when delete resource provider which has child providers"},{"line_number":2158,"context_line":"        rp_in_tree \u003d self.get_providers_in_tree(context, rp_uuid)"},{"line_number":2159,"context_line":"        for rp in rp_in_tree[::-1]:"},{"line_number":2160,"context_line":"            if rp[\"parent_provider_uuid\"] \u003d\u003d rp_uuid or rp[\"uuid\"] \u003d\u003d rp_uuid:"},{"line_number":2161,"context_line":"                try:"},{"line_number":2162,"context_line":"                    self._delete_provider(rp[\"uuid\"],"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f4c43b2_84dd1f72","line":2159,"range":{"start_line":2159,"start_character":18,"end_line":2159,"end_character":34},"in_reply_to":"3f4c43b2_8e7ee016","updated":"2020-04-17 15:04:49.000000000","message":"Other pieces of nova also uses the result from get_providers_in_tree(). Like _ensure_resource_provider()[1] which then pass the list of provider dicts to populate_from_iterable()[2] which does not make any assumption of the orders of the RPs in the list. Instead it always search for the next RP that can be processed[3].\n\nSo I think we should not make the assumption about the order here either.\n\n\n[1] https://github.com/openstack/nova/blob/10db1d8e55e0fdfa5bfe1a827b7e8aaf9b7feb7c/nova/scheduler/client/report.py#L640\n[2] https://github.com/openstack/nova/blob/10db1d8e55e0fdfa5bfe1a827b7e8aaf9b7feb7c/nova/scheduler/client/report.py#L658\n[3] https://github.com/openstack/nova/blob/10db1d8e55e0fdfa5bfe1a827b7e8aaf9b7feb7c/nova/compute/provider_tree.py#L339","commit_id":"d71f0fd03170f27f9f060767d3824edec35334ca"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8439052016ec030573d8747315515742c8a5fa76","unresolved":false,"context_lines":[{"line_number":2159,"context_line":"        for rp in rp_in_tree[::-1]:"},{"line_number":2160,"context_line":"            if rp[\"parent_provider_uuid\"] \u003d\u003d rp_uuid or rp[\"uuid\"] \u003d\u003d rp_uuid:"},{"line_number":2161,"context_line":"                try:"},{"line_number":2162,"context_line":"                    self._delete_provider(rp[\"uuid\"],"},{"line_number":2163,"context_line":"                                          global_request_id\u003dcontext.global_id)"},{"line_number":2164,"context_line":"                    LOG.info("},{"line_number":2165,"context_line":"                        \"Sucessfully delete resource provider %(rp_uuid)s\","}],"source_content_type":"text/x-python","patch_set":2,"id":"3f4c43b2_00cab46b","line":2162,"updated":"2020-04-16 12:49:50.000000000","message":"note to myself. If there are bandwidth RPs then those are created by neutron. Fortunately this recursive delete will not race with neutron as neutron only try to create / update things in placement if something changes in the neutron agent configuration.","commit_id":"d71f0fd03170f27f9f060767d3824edec35334ca"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"ea1892d617f45c874e6d978bc1724a2ebe51b077","unresolved":false,"context_lines":[{"line_number":2153,"context_line":"                context, host, nodename)"},{"line_number":2154,"context_line":"            for instance_uuid in instance_uuids:"},{"line_number":2155,"context_line":"                self.delete_allocation_for_instance(context, instance_uuid)"},{"line_number":2156,"context_line":"        provider_uuids \u003d self._provider_tree.get_provider_uuids_in_tree("},{"line_number":2157,"context_line":"            rp_uuid)"},{"line_number":2158,"context_line":"        for provider_uuid in provider_uuids[::-1]:"},{"line_number":2159,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff570b3c_6158cc31","line":2156,"range":{"start_line":2156,"start_character":30,"end_line":2156,"end_character":44},"updated":"2020-05-14 05:30:20.000000000","message":"so...I guess provider tree is empty when the service calling this method. But correct me if miss something","commit_id":"85fa922e45299f72079e93077e39b7929fbcf9c8"},{"author":{"_account_id":31412,"name":"Wenping Song","email":"songwenping@inspur.com","username":"songwenping"},"change_message_id":"c1d10cc442aee9259ae1f3192487f541a63557e6","unresolved":false,"context_lines":[{"line_number":2153,"context_line":"                context, host, nodename)"},{"line_number":2154,"context_line":"            for instance_uuid in instance_uuids:"},{"line_number":2155,"context_line":"                self.delete_allocation_for_instance(context, instance_uuid)"},{"line_number":2156,"context_line":"        provider_uuids \u003d self._provider_tree.get_provider_uuids_in_tree("},{"line_number":2157,"context_line":"            rp_uuid)"},{"line_number":2158,"context_line":"        for provider_uuid in provider_uuids[::-1]:"},{"line_number":2159,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff570b3c_ae8c567f","line":2156,"range":{"start_line":2156,"start_character":30,"end_line":2156,"end_character":44},"in_reply_to":"ff570b3c_6158cc31","updated":"2020-05-18 05:52:50.000000000","message":"provider tree is not empty. But the \"roots_by_uuid\" of the provider tree is empty dict, so i init it at next patch, pls review.","commit_id":"85fa922e45299f72079e93077e39b7929fbcf9c8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8da8af2f8592f7986d65e0ddb39614c830d1bd3e","unresolved":false,"context_lines":[{"line_number":2155,"context_line":"                self.delete_allocation_for_instance(context, instance_uuid)"},{"line_number":2156,"context_line":"        rps_to_refresh \u003d self.get_providers_in_tree(context, rp_uuid)"},{"line_number":2157,"context_line":"        self._provider_tree.populate_from_iterable(rps_to_refresh)"},{"line_number":2158,"context_line":"        provider_uuids \u003d self._provider_tree.get_provider_uuids_in_tree("},{"line_number":2159,"context_line":"            rp_uuid)"},{"line_number":2160,"context_line":"        for provider_uuid in provider_uuids[::-1]:"},{"line_number":2161,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff570b3c_ceac78a1","line":2158,"range":{"start_line":2158,"start_character":45,"end_line":2158,"end_character":71},"updated":"2020-06-12 11:04:06.000000000","message":"OK, this is defined to return return the result of a pre-order traversal of the tree so the reversed order below L2160 makes sure that we try to delete children before parent.","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"0cc42e5764f3b7feeb096b74e1fb20d52f440c5d","unresolved":false,"context_lines":[{"line_number":2165,"context_line":"                                      global_request_id\u003dcontext.global_id)"},{"line_number":2166,"context_line":"            except (exception.ResourceProviderInUse,"},{"line_number":2167,"context_line":"                    exception.ResourceProviderDeletionFailed):"},{"line_number":2168,"context_line":"                # TODO(efried): Raise these.  Right now this is being"},{"line_number":2169,"context_line":"                #  left a no-op for backward compatibility."},{"line_number":2170,"context_line":"                pass"},{"line_number":2171,"context_line":""},{"line_number":2172,"context_line":"    def get_provider_by_name(self, context, name):"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf51134e_1407611a","line":2169,"range":{"start_line":2168,"start_character":0,"end_line":2169,"end_character":59},"updated":"2020-06-22 13:41:44.000000000","message":"maybe time to do this?","commit_id":"0ae2a01e61b27ac049b4bb32b71a708ea660f9a8"},{"author":{"_account_id":31412,"name":"Wenping Song","email":"songwenping@inspur.com","username":"songwenping"},"change_message_id":"e9f84e58a340dde63150a99462fdcbd2e9755ac7","unresolved":false,"context_lines":[{"line_number":2165,"context_line":"                                      global_request_id\u003dcontext.global_id)"},{"line_number":2166,"context_line":"            except (exception.ResourceProviderInUse,"},{"line_number":2167,"context_line":"                    exception.ResourceProviderDeletionFailed):"},{"line_number":2168,"context_line":"                # TODO(efried): Raise these.  Right now this is being"},{"line_number":2169,"context_line":"                #  left a no-op for backward compatibility."},{"line_number":2170,"context_line":"                pass"},{"line_number":2171,"context_line":""},{"line_number":2172,"context_line":"    def get_provider_by_name(self, context, name):"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf51134e_8b4ce442","line":2169,"range":{"start_line":2168,"start_character":0,"end_line":2169,"end_character":59},"in_reply_to":"bf51134e_1407611a","updated":"2020-06-23 07:25:36.000000000","message":"Will do it in next patch.","commit_id":"0ae2a01e61b27ac049b4bb32b71a708ea660f9a8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c9814cac5f0919fedbd730aefba71414b6bc6fff","unresolved":false,"context_lines":[{"line_number":2125,"context_line":"        return {consumer: self.get_allocs_for_consumer(context, consumer)"},{"line_number":2126,"context_line":"                for consumer in consumers}"},{"line_number":2127,"context_line":""},{"line_number":2128,"context_line":"    def delete_resource_provider(self, context, compute_node, cascade\u003dFalse):"},{"line_number":2129,"context_line":"        \"\"\"Deletes the ResourceProvider record for the compute_node."},{"line_number":2130,"context_line":""},{"line_number":2131,"context_line":"        :param context: The security context"}],"source_content_type":"text/x-python","patch_set":18,"id":"9f560f44_db6b1e82","line":2128,"range":{"start_line":2128,"start_character":62,"end_line":2128,"end_character":75},"updated":"2020-08-25 11:41:22.000000000","message":"As far as I see all the caller passes cascade \u003d True so we can drop this parameter.","commit_id":"a45daafd3111a6804eb5adafe4860db122cb09b8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c9814cac5f0919fedbd730aefba71414b6bc6fff","unresolved":false,"context_lines":[{"line_number":2163,"context_line":"            try:"},{"line_number":2164,"context_line":"                self._delete_provider(provider_uuid,"},{"line_number":2165,"context_line":"                                      global_request_id\u003dcontext.global_id)"},{"line_number":2166,"context_line":"            except (exception.ResourceProviderInUse,"},{"line_number":2167,"context_line":"                    exception.ResourceProviderDeletionFailed):"},{"line_number":2168,"context_line":"                # TODO(efried): Raise these.  Right now this is being"},{"line_number":2169,"context_line":"                #  left a no-op for backward compatibility."},{"line_number":2170,"context_line":"                pass"},{"line_number":2171,"context_line":""},{"line_number":2172,"context_line":"    def get_provider_by_name(self, context, name):"},{"line_number":2173,"context_line":"        \"\"\"Queries the placement API for resource provider information matching"}],"source_content_type":"text/x-python","patch_set":18,"id":"9f560f44_9ba406a8","line":2170,"range":{"start_line":2166,"start_character":0,"end_line":2170,"end_character":20},"updated":"2020-08-25 11:41:22.000000000","message":"If we raise this up then we have to handle them at the caller side. I see two callers:\n\n1) nova.api.openstack.compute.services.ServiceController.delete()\nIn this case some preconditions are checked before the delete (e.g. no instance or unfinished migration exists on the node) So if we still get a placement error then I think we should fail the service delete and return the error to the user.\n\n2) nova.compute.manager.ComputeManager.update_available_resource()\nThis is a periodic case on the compute side so no user to notify about the error. Just catch these and log an error.","commit_id":"a45daafd3111a6804eb5adafe4860db122cb09b8"}],"nova/tests/unit/api/openstack/compute/test_services.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8da8af2f8592f7986d65e0ddb39614c830d1bd3e","unresolved":false,"context_lines":[{"line_number":1172,"context_line":"    @mock.patch(\u0027nova.scheduler.client.report.SchedulerReportClient.\u0027"},{"line_number":1173,"context_line":"                \u0027get_providers_in_tree\u0027)"},{"line_number":1174,"context_line":"    @mock.patch(\u0027nova.compute.provider_tree.ProviderTree.\u0027"},{"line_number":1175,"context_line":"                \u0027get_provider_uuids_in_tree\u0027)"},{"line_number":1176,"context_line":"    def test_delete_takes_uuid_for_id(self, mock_order_rps, get_rpt_mock):"},{"line_number":1177,"context_line":"        \"\"\"Tests that a DELETE request correctly deletes a service when a valid"},{"line_number":1178,"context_line":"        service uuid is provided for an existing service."}],"source_content_type":"text/x-python","patch_set":9,"id":"ff570b3c_0b8c94d5","line":1175,"updated":"2020-06-12 11:04:06.000000000","message":"This test passes without the mocks","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"},{"author":{"_account_id":31412,"name":"Wenping Song","email":"songwenping@inspur.com","username":"songwenping"},"change_message_id":"417c134558ee6467d46dbe8cae6bd16596653baf","unresolved":false,"context_lines":[{"line_number":1172,"context_line":"    @mock.patch(\u0027nova.scheduler.client.report.SchedulerReportClient.\u0027"},{"line_number":1173,"context_line":"                \u0027get_providers_in_tree\u0027)"},{"line_number":1174,"context_line":"    @mock.patch(\u0027nova.compute.provider_tree.ProviderTree.\u0027"},{"line_number":1175,"context_line":"                \u0027get_provider_uuids_in_tree\u0027)"},{"line_number":1176,"context_line":"    def test_delete_takes_uuid_for_id(self, mock_order_rps, get_rpt_mock):"},{"line_number":1177,"context_line":"        \"\"\"Tests that a DELETE request correctly deletes a service when a valid"},{"line_number":1178,"context_line":"        service uuid is provided for an existing service."}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_006818f3","line":1175,"in_reply_to":"ff570b3c_0b8c94d5","updated":"2020-06-17 09:54:16.000000000","message":"Right, delete it. Thanks.","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"}],"nova/tests/unit/compute/test_compute.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8da8af2f8592f7986d65e0ddb39614c830d1bd3e","unresolved":false,"context_lines":[{"line_number":220,"context_line":"            fake_get_compute_nodes_in_db)"},{"line_number":221,"context_line":"        self.stub_out(\u0027nova.db.api.compute_node_delete\u0027,"},{"line_number":222,"context_line":"                fake_compute_node_delete)"},{"line_number":223,"context_line":"        self.stub_out("},{"line_number":224,"context_line":"            \u0027nova.scheduler.client.report.SchedulerReportClient.\u0027"},{"line_number":225,"context_line":"            \u0027get_providers_in_tree\u0027,"},{"line_number":226,"context_line":"            fake_get_providers_in_tree)"},{"line_number":227,"context_line":"        self.stub_out("},{"line_number":228,"context_line":"            \u0027nova.compute.provider_tree.ProviderTree.\u0027"},{"line_number":229,"context_line":"            \u0027get_provider_uuids_in_tree\u0027,"},{"line_number":230,"context_line":"            fake_get_provider_uuids_in_tree)"},{"line_number":231,"context_line":"        self.compute.update_available_resource("},{"line_number":232,"context_line":"                context.get_admin_context())"},{"line_number":233,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"ff570b3c_6b939001","line":230,"range":{"start_line":223,"start_character":0,"end_line":230,"end_character":44},"updated":"2020-06-12 11:04:06.000000000","message":"Tests passes even if I drop these stubs.","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"},{"author":{"_account_id":31412,"name":"Wenping Song","email":"songwenping@inspur.com","username":"songwenping"},"change_message_id":"417c134558ee6467d46dbe8cae6bd16596653baf","unresolved":false,"context_lines":[{"line_number":220,"context_line":"            fake_get_compute_nodes_in_db)"},{"line_number":221,"context_line":"        self.stub_out(\u0027nova.db.api.compute_node_delete\u0027,"},{"line_number":222,"context_line":"                fake_compute_node_delete)"},{"line_number":223,"context_line":"        self.stub_out("},{"line_number":224,"context_line":"            \u0027nova.scheduler.client.report.SchedulerReportClient.\u0027"},{"line_number":225,"context_line":"            \u0027get_providers_in_tree\u0027,"},{"line_number":226,"context_line":"            fake_get_providers_in_tree)"},{"line_number":227,"context_line":"        self.stub_out("},{"line_number":228,"context_line":"            \u0027nova.compute.provider_tree.ProviderTree.\u0027"},{"line_number":229,"context_line":"            \u0027get_provider_uuids_in_tree\u0027,"},{"line_number":230,"context_line":"            fake_get_provider_uuids_in_tree)"},{"line_number":231,"context_line":"        self.compute.update_available_resource("},{"line_number":232,"context_line":"                context.get_admin_context())"},{"line_number":233,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_40897021","line":230,"range":{"start_line":223,"start_character":0,"end_line":230,"end_character":44},"in_reply_to":"ff570b3c_6b939001","updated":"2020-06-17 09:54:16.000000000","message":"Right, deleted.","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"}],"nova/tests/unit/compute/test_host_api.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8da8af2f8592f7986d65e0ddb39614c830d1bd3e","unresolved":false,"context_lines":[{"line_number":463,"context_line":"            [mock.call(ctxt, uuids.service_uuid)] * 2)"},{"line_number":464,"context_line":"        self.assertEqual(\u0027db://fake2\u0027, ctxt.db_connection)"},{"line_number":465,"context_line":""},{"line_number":466,"context_line":"    @mock.patch(\u0027nova.compute.provider_tree.ProviderTree.\u0027"},{"line_number":467,"context_line":"                \u0027get_provider_uuids_in_tree\u0027)"},{"line_number":468,"context_line":"    @mock.patch(\u0027nova.scheduler.client.report.SchedulerReportClient.\u0027"},{"line_number":469,"context_line":"                \u0027aggregate_remove_host\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff570b3c_b34eccbf","line":466,"updated":"2020-06-12 11:04:06.000000000","message":"The test passes even if I delete this mock. To make this test change complete you should also assert that no ERROR \"Failed to delete compute node resource provider\" is logged.","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"},{"author":{"_account_id":31412,"name":"Wenping Song","email":"songwenping@inspur.com","username":"songwenping"},"change_message_id":"417c134558ee6467d46dbe8cae6bd16596653baf","unresolved":false,"context_lines":[{"line_number":463,"context_line":"            [mock.call(ctxt, uuids.service_uuid)] * 2)"},{"line_number":464,"context_line":"        self.assertEqual(\u0027db://fake2\u0027, ctxt.db_connection)"},{"line_number":465,"context_line":""},{"line_number":466,"context_line":"    @mock.patch(\u0027nova.compute.provider_tree.ProviderTree.\u0027"},{"line_number":467,"context_line":"                \u0027get_provider_uuids_in_tree\u0027)"},{"line_number":468,"context_line":"    @mock.patch(\u0027nova.scheduler.client.report.SchedulerReportClient.\u0027"},{"line_number":469,"context_line":"                \u0027aggregate_remove_host\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_a0b16c92","line":466,"in_reply_to":"ff570b3c_b34eccbf","updated":"2020-06-17 09:54:16.000000000","message":"Deleted this mock, and donnot know how to assert this error log, any suggestion?","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"}],"nova/tests/unit/scheduler/client/test_report.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c2ad1a7b05ff06926478348e7f507a4208f584a3","unresolved":false,"context_lines":[{"line_number":3206,"context_line":"        self.client._provider_tree.new_root(uuids.cn, uuids.cn, generation\u003d1)"},{"line_number":3207,"context_line":"        cn \u003d objects.ComputeNode(uuid\u003duuids.cn, host\u003d\"fake_host\","},{"line_number":3208,"context_line":"                hypervisor_hostname\u003d\"fake_hostname\", )"},{"line_number":3209,"context_line":"        get_rpt_mock.return_value \u003d [{"},{"line_number":3210,"context_line":"            \u0027uuid\u0027: cn.uuid,"},{"line_number":3211,"context_line":"            \u0027name\u0027: mock.sentinel.name,"},{"line_number":3212,"context_line":"            \u0027generation\u0027: 1,"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_17132e5e","line":3209,"updated":"2020-05-13 05:46:49.000000000","message":"pep8: F821 undefined name \u0027get_rpt_mock\u0027","commit_id":"21c91891c65911d986f0a9a62b5a89c4c58b4bc0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8da8af2f8592f7986d65e0ddb39614c830d1bd3e","unresolved":false,"context_lines":[{"line_number":3148,"context_line":""},{"line_number":3149,"context_line":"    @mock.patch(\u0027nova.scheduler.client.report.SchedulerReportClient.\u0027"},{"line_number":3150,"context_line":"                \u0027get_providers_in_tree\u0027)"},{"line_number":3151,"context_line":"    @mock.patch(\u0027nova.compute.provider_tree.ProviderTree.\u0027"},{"line_number":3152,"context_line":"                \u0027get_provider_uuids_in_tree\u0027)"},{"line_number":3153,"context_line":"    @mock.patch(\"nova.scheduler.client.report.SchedulerReportClient.\""},{"line_number":3154,"context_line":"                \"delete\")"},{"line_number":3155,"context_line":"    @mock.patch(\"nova.scheduler.client.report.SchedulerReportClient.\""}],"source_content_type":"text/x-python","patch_set":9,"id":"ff570b3c_5374909c","line":3152,"range":{"start_line":3151,"start_character":0,"end_line":3152,"end_character":45},"updated":"2020-06-12 11:04:06.000000000","message":"You don\u0027t need to mock this.","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"},{"author":{"_account_id":31412,"name":"Wenping Song","email":"songwenping@inspur.com","username":"songwenping"},"change_message_id":"417c134558ee6467d46dbe8cae6bd16596653baf","unresolved":false,"context_lines":[{"line_number":3148,"context_line":""},{"line_number":3149,"context_line":"    @mock.patch(\u0027nova.scheduler.client.report.SchedulerReportClient.\u0027"},{"line_number":3150,"context_line":"                \u0027get_providers_in_tree\u0027)"},{"line_number":3151,"context_line":"    @mock.patch(\u0027nova.compute.provider_tree.ProviderTree.\u0027"},{"line_number":3152,"context_line":"                \u0027get_provider_uuids_in_tree\u0027)"},{"line_number":3153,"context_line":"    @mock.patch(\"nova.scheduler.client.report.SchedulerReportClient.\""},{"line_number":3154,"context_line":"                \"delete\")"},{"line_number":3155,"context_line":"    @mock.patch(\"nova.scheduler.client.report.SchedulerReportClient.\""}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_808548b0","line":3152,"range":{"start_line":3151,"start_character":0,"end_line":3152,"end_character":45},"in_reply_to":"ff570b3c_5374909c","updated":"2020-06-17 09:54:16.000000000","message":"Right, deleted it. Thanks.","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8da8af2f8592f7986d65e0ddb39614c830d1bd3e","unresolved":false,"context_lines":[{"line_number":3156,"context_line":"                \"delete_allocation_for_instance\")"},{"line_number":3157,"context_line":"    @mock.patch(\"nova.objects.InstanceList.get_uuids_by_host_and_node\")"},{"line_number":3158,"context_line":"    def test_delete_resource_provider_cascade(self, mock_by_host,"},{"line_number":3159,"context_line":"            mock_del_alloc, mock_delete, mock_order_rps, get_rpt_mock):"},{"line_number":3160,"context_line":"        self.client._provider_tree.new_root(uuids.cn, uuids.cn, generation\u003d1)"},{"line_number":3161,"context_line":"        cn \u003d objects.ComputeNode(uuid\u003duuids.cn, host\u003d\"fake_host\","},{"line_number":3162,"context_line":"                hypervisor_hostname\u003d\"fake_hostname\", )"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff570b3c_b3c88c75","line":3159,"range":{"start_line":3159,"start_character":57,"end_line":3159,"end_character":69},"updated":"2020-06-12 11:04:06.000000000","message":"prefix the name with mock_","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"},{"author":{"_account_id":31412,"name":"Wenping Song","email":"songwenping@inspur.com","username":"songwenping"},"change_message_id":"417c134558ee6467d46dbe8cae6bd16596653baf","unresolved":false,"context_lines":[{"line_number":3156,"context_line":"                \"delete_allocation_for_instance\")"},{"line_number":3157,"context_line":"    @mock.patch(\"nova.objects.InstanceList.get_uuids_by_host_and_node\")"},{"line_number":3158,"context_line":"    def test_delete_resource_provider_cascade(self, mock_by_host,"},{"line_number":3159,"context_line":"            mock_del_alloc, mock_delete, mock_order_rps, get_rpt_mock):"},{"line_number":3160,"context_line":"        self.client._provider_tree.new_root(uuids.cn, uuids.cn, generation\u003d1)"},{"line_number":3161,"context_line":"        cn \u003d objects.ComputeNode(uuid\u003duuids.cn, host\u003d\"fake_host\","},{"line_number":3162,"context_line":"                hypervisor_hostname\u003d\"fake_hostname\", )"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_a0f96c81","line":3159,"range":{"start_line":3159,"start_character":57,"end_line":3159,"end_character":69},"in_reply_to":"ff570b3c_b3c88c75","updated":"2020-06-17 09:54:16.000000000","message":"Done","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8da8af2f8592f7986d65e0ddb39614c830d1bd3e","unresolved":false,"context_lines":[{"line_number":3157,"context_line":"    @mock.patch(\"nova.objects.InstanceList.get_uuids_by_host_and_node\")"},{"line_number":3158,"context_line":"    def test_delete_resource_provider_cascade(self, mock_by_host,"},{"line_number":3159,"context_line":"            mock_del_alloc, mock_delete, mock_order_rps, get_rpt_mock):"},{"line_number":3160,"context_line":"        self.client._provider_tree.new_root(uuids.cn, uuids.cn, generation\u003d1)"},{"line_number":3161,"context_line":"        cn \u003d objects.ComputeNode(uuid\u003duuids.cn, host\u003d\"fake_host\","},{"line_number":3162,"context_line":"                hypervisor_hostname\u003d\"fake_hostname\", )"},{"line_number":3163,"context_line":"        mock_by_host.return_value \u003d [uuids.inst1, uuids.inst2]"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff570b3c_33d3dc61","line":3160,"updated":"2020-06-12 11:04:06.000000000","message":"You don\u0027t need this as delete_resource_provider() will construct its own provider tree anyhow.","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"},{"author":{"_account_id":31412,"name":"Wenping Song","email":"songwenping@inspur.com","username":"songwenping"},"change_message_id":"417c134558ee6467d46dbe8cae6bd16596653baf","unresolved":false,"context_lines":[{"line_number":3157,"context_line":"    @mock.patch(\"nova.objects.InstanceList.get_uuids_by_host_and_node\")"},{"line_number":3158,"context_line":"    def test_delete_resource_provider_cascade(self, mock_by_host,"},{"line_number":3159,"context_line":"            mock_del_alloc, mock_delete, mock_order_rps, get_rpt_mock):"},{"line_number":3160,"context_line":"        self.client._provider_tree.new_root(uuids.cn, uuids.cn, generation\u003d1)"},{"line_number":3161,"context_line":"        cn \u003d objects.ComputeNode(uuid\u003duuids.cn, host\u003d\"fake_host\","},{"line_number":3162,"context_line":"                hypervisor_hostname\u003d\"fake_hostname\", )"},{"line_number":3163,"context_line":"        mock_by_host.return_value \u003d [uuids.inst1, uuids.inst2]"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_401330b6","line":3160,"in_reply_to":"ff570b3c_33d3dc61","updated":"2020-06-17 09:54:16.000000000","message":"Maybe this is a check call writen by Fried. I add the comment like L3223.","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8da8af2f8592f7986d65e0ddb39614c830d1bd3e","unresolved":false,"context_lines":[{"line_number":3167,"context_line":"            \u0027generation\u0027: 1,"},{"line_number":3168,"context_line":"            \u0027parent_provider_uuid\u0027: None"},{"line_number":3169,"context_line":"        }]"},{"line_number":3170,"context_line":"        mock_order_rps.return_value \u003d [cn.uuid]"},{"line_number":3171,"context_line":"        resp_mock \u003d mock.Mock(status_code\u003d204)"},{"line_number":3172,"context_line":"        mock_delete.return_value \u003d resp_mock"},{"line_number":3173,"context_line":"        self.client.delete_resource_provider(self.context, cn, cascade\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff570b3c_f35cc41a","line":3170,"updated":"2020-06-12 11:04:06.000000000","message":"This behavior already ensured by the return value of get_rpt_mock","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"},{"author":{"_account_id":31412,"name":"Wenping Song","email":"songwenping@inspur.com","username":"songwenping"},"change_message_id":"417c134558ee6467d46dbe8cae6bd16596653baf","unresolved":false,"context_lines":[{"line_number":3167,"context_line":"            \u0027generation\u0027: 1,"},{"line_number":3168,"context_line":"            \u0027parent_provider_uuid\u0027: None"},{"line_number":3169,"context_line":"        }]"},{"line_number":3170,"context_line":"        mock_order_rps.return_value \u003d [cn.uuid]"},{"line_number":3171,"context_line":"        resp_mock \u003d mock.Mock(status_code\u003d204)"},{"line_number":3172,"context_line":"        mock_delete.return_value \u003d resp_mock"},{"line_number":3173,"context_line":"        self.client.delete_resource_provider(self.context, cn, cascade\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_8024280f","line":3170,"in_reply_to":"ff570b3c_f35cc41a","updated":"2020-06-17 09:54:16.000000000","message":"Right. Deleted it.","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8da8af2f8592f7986d65e0ddb39614c830d1bd3e","unresolved":false,"context_lines":[{"line_number":3178,"context_line":"        mock_delete.assert_called_once_with("},{"line_number":3179,"context_line":"            exp_url, global_request_id\u003dself.context.global_id)"},{"line_number":3180,"context_line":"        self.assertFalse(self.client._provider_tree.exists(uuids.cn))"},{"line_number":3181,"context_line":""},{"line_number":3182,"context_line":"    @mock.patch(\u0027nova.scheduler.client.report.SchedulerReportClient.\u0027"},{"line_number":3183,"context_line":"                \u0027get_providers_in_tree\u0027)"},{"line_number":3184,"context_line":"    @mock.patch(\u0027nova.compute.provider_tree.ProviderTree.\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff570b3c_3338fc9d","line":3181,"updated":"2020-06-12 11:04:06.000000000","message":"I think there is a missing test case where you ensure that more than on RP is in the tree and that all of them is gets deleted in the proper order.","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"},{"author":{"_account_id":31412,"name":"Wenping Song","email":"songwenping@inspur.com","username":"songwenping"},"change_message_id":"417c134558ee6467d46dbe8cae6bd16596653baf","unresolved":false,"context_lines":[{"line_number":3178,"context_line":"        mock_delete.assert_called_once_with("},{"line_number":3179,"context_line":"            exp_url, global_request_id\u003dself.context.global_id)"},{"line_number":3180,"context_line":"        self.assertFalse(self.client._provider_tree.exists(uuids.cn))"},{"line_number":3181,"context_line":""},{"line_number":3182,"context_line":"    @mock.patch(\u0027nova.scheduler.client.report.SchedulerReportClient.\u0027"},{"line_number":3183,"context_line":"                \u0027get_providers_in_tree\u0027)"},{"line_number":3184,"context_line":"    @mock.patch(\u0027nova.compute.provider_tree.ProviderTree.\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_408850e6","line":3181,"in_reply_to":"ff570b3c_3338fc9d","updated":"2020-06-17 09:54:16.000000000","message":"Add one test case for the case.","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8da8af2f8592f7986d65e0ddb39614c830d1bd3e","unresolved":false,"context_lines":[{"line_number":3181,"context_line":""},{"line_number":3182,"context_line":"    @mock.patch(\u0027nova.scheduler.client.report.SchedulerReportClient.\u0027"},{"line_number":3183,"context_line":"                \u0027get_providers_in_tree\u0027)"},{"line_number":3184,"context_line":"    @mock.patch(\u0027nova.compute.provider_tree.ProviderTree.\u0027"},{"line_number":3185,"context_line":"                \u0027get_provider_uuids_in_tree\u0027)"},{"line_number":3186,"context_line":"    @mock.patch(\"nova.scheduler.client.report.SchedulerReportClient.\""},{"line_number":3187,"context_line":"                \"delete\")"},{"line_number":3188,"context_line":"    @mock.patch(\"nova.scheduler.client.report.SchedulerReportClient.\""}],"source_content_type":"text/x-python","patch_set":9,"id":"ff570b3c_136cd89a","line":3185,"range":{"start_line":3184,"start_character":0,"end_line":3185,"end_character":45},"updated":"2020-06-12 11:04:06.000000000","message":"ditto","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8da8af2f8592f7986d65e0ddb39614c830d1bd3e","unresolved":false,"context_lines":[{"line_number":3189,"context_line":"                \"delete_allocation_for_instance\")"},{"line_number":3190,"context_line":"    @mock.patch(\"nova.objects.InstanceList.get_uuids_by_host_and_node\")"},{"line_number":3191,"context_line":"    def test_delete_resource_provider_no_cascade(self, mock_by_host,"},{"line_number":3192,"context_line":"            mock_del_alloc, mock_delete, mock_order_rps, get_rpt_mock):"},{"line_number":3193,"context_line":"        self.client._provider_tree.new_root(uuids.cn, uuids.cn, generation\u003d1)"},{"line_number":3194,"context_line":"        self.client._association_refresh_time[uuids.cn] \u003d mock.Mock()"},{"line_number":3195,"context_line":"        cn \u003d objects.ComputeNode(uuid\u003duuids.cn, host\u003d\"fake_host\","}],"source_content_type":"text/x-python","patch_set":9,"id":"ff570b3c_73b714f7","line":3192,"range":{"start_line":3192,"start_character":57,"end_line":3192,"end_character":69},"updated":"2020-06-12 11:04:06.000000000","message":"prefix the name with mock_","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"},{"author":{"_account_id":31412,"name":"Wenping Song","email":"songwenping@inspur.com","username":"songwenping"},"change_message_id":"417c134558ee6467d46dbe8cae6bd16596653baf","unresolved":false,"context_lines":[{"line_number":3189,"context_line":"                \"delete_allocation_for_instance\")"},{"line_number":3190,"context_line":"    @mock.patch(\"nova.objects.InstanceList.get_uuids_by_host_and_node\")"},{"line_number":3191,"context_line":"    def test_delete_resource_provider_no_cascade(self, mock_by_host,"},{"line_number":3192,"context_line":"            mock_del_alloc, mock_delete, mock_order_rps, get_rpt_mock):"},{"line_number":3193,"context_line":"        self.client._provider_tree.new_root(uuids.cn, uuids.cn, generation\u003d1)"},{"line_number":3194,"context_line":"        self.client._association_refresh_time[uuids.cn] \u003d mock.Mock()"},{"line_number":3195,"context_line":"        cn \u003d objects.ComputeNode(uuid\u003duuids.cn, host\u003d\"fake_host\","}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_c073c014","line":3192,"range":{"start_line":3192,"start_character":57,"end_line":3192,"end_character":69},"in_reply_to":"ff570b3c_73b714f7","updated":"2020-06-17 09:54:16.000000000","message":"Done.","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8da8af2f8592f7986d65e0ddb39614c830d1bd3e","unresolved":false,"context_lines":[{"line_number":3201,"context_line":"            \u0027parent_provider_uuid\u0027: None"},{"line_number":3202,"context_line":"        }]"},{"line_number":3203,"context_line":"        mock_by_host.return_value \u003d [uuids.inst1, uuids.inst2]"},{"line_number":3204,"context_line":"        mock_order_rps.return_value \u003d [cn.uuid]"},{"line_number":3205,"context_line":"        resp_mock \u003d mock.Mock(status_code\u003d204)"},{"line_number":3206,"context_line":"        mock_delete.return_value \u003d resp_mock"},{"line_number":3207,"context_line":"        self.client.delete_resource_provider(self.context, cn)"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff570b3c_5303f0be","line":3204,"updated":"2020-06-12 11:04:06.000000000","message":"ditto","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8da8af2f8592f7986d65e0ddb39614c830d1bd3e","unresolved":false,"context_lines":[{"line_number":3213,"context_line":""},{"line_number":3214,"context_line":"    @mock.patch(\u0027nova.scheduler.client.report.SchedulerReportClient.\u0027"},{"line_number":3215,"context_line":"                \u0027get_providers_in_tree\u0027)"},{"line_number":3216,"context_line":"    @mock.patch(\u0027nova.compute.provider_tree.ProviderTree.\u0027"},{"line_number":3217,"context_line":"                \u0027get_provider_uuids_in_tree\u0027)"},{"line_number":3218,"context_line":"    @mock.patch(\"nova.scheduler.client.report.SchedulerReportClient.\""},{"line_number":3219,"context_line":"                \"delete\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff570b3c_d3e42011","line":3216,"updated":"2020-06-12 11:04:06.000000000","message":"you don\u0027t need this. You have to make sure that get_providers_in_tree() returns what you need then this call will work out of the box.","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"},{"author":{"_account_id":31412,"name":"Wenping Song","email":"songwenping@inspur.com","username":"songwenping"},"change_message_id":"417c134558ee6467d46dbe8cae6bd16596653baf","unresolved":false,"context_lines":[{"line_number":3213,"context_line":""},{"line_number":3214,"context_line":"    @mock.patch(\u0027nova.scheduler.client.report.SchedulerReportClient.\u0027"},{"line_number":3215,"context_line":"                \u0027get_providers_in_tree\u0027)"},{"line_number":3216,"context_line":"    @mock.patch(\u0027nova.compute.provider_tree.ProviderTree.\u0027"},{"line_number":3217,"context_line":"                \u0027get_provider_uuids_in_tree\u0027)"},{"line_number":3218,"context_line":"    @mock.patch(\"nova.scheduler.client.report.SchedulerReportClient.\""},{"line_number":3219,"context_line":"                \"delete\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_0067784f","line":3216,"in_reply_to":"ff570b3c_d3e42011","updated":"2020-06-17 09:54:16.000000000","message":"Deleted it.","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8da8af2f8592f7986d65e0ddb39614c830d1bd3e","unresolved":false,"context_lines":[{"line_number":3219,"context_line":"                \"delete\")"},{"line_number":3220,"context_line":"    @mock.patch(\u0027nova.scheduler.client.report.LOG\u0027)"},{"line_number":3221,"context_line":"    def test_delete_resource_provider_log_calls(self, mock_log, mock_delete,"},{"line_number":3222,"context_line":"                                                mock_order_rps, get_rpt_mock):"},{"line_number":3223,"context_line":"        # First, check a successful call"},{"line_number":3224,"context_line":"        self.client._provider_tree.new_root(uuids.cn, uuids.cn, generation\u003d1)"},{"line_number":3225,"context_line":"        cn \u003d objects.ComputeNode(uuid\u003duuids.cn, host\u003d\"fake_host\","}],"source_content_type":"text/x-python","patch_set":9,"id":"ff570b3c_93b468f4","line":3222,"range":{"start_line":3222,"start_character":64,"end_line":3222,"end_character":76},"updated":"2020-06-12 11:04:06.000000000","message":"call this mock_get_rpt","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"},{"author":{"_account_id":31412,"name":"Wenping Song","email":"songwenping@inspur.com","username":"songwenping"},"change_message_id":"417c134558ee6467d46dbe8cae6bd16596653baf","unresolved":false,"context_lines":[{"line_number":3219,"context_line":"                \"delete\")"},{"line_number":3220,"context_line":"    @mock.patch(\u0027nova.scheduler.client.report.LOG\u0027)"},{"line_number":3221,"context_line":"    def test_delete_resource_provider_log_calls(self, mock_log, mock_delete,"},{"line_number":3222,"context_line":"                                                mock_order_rps, get_rpt_mock):"},{"line_number":3223,"context_line":"        # First, check a successful call"},{"line_number":3224,"context_line":"        self.client._provider_tree.new_root(uuids.cn, uuids.cn, generation\u003d1)"},{"line_number":3225,"context_line":"        cn \u003d objects.ComputeNode(uuid\u003duuids.cn, host\u003d\"fake_host\","}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_80526866","line":3222,"range":{"start_line":3222,"start_character":64,"end_line":3222,"end_character":76},"in_reply_to":"ff570b3c_93b468f4","updated":"2020-06-17 09:54:16.000000000","message":"Done.","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8da8af2f8592f7986d65e0ddb39614c830d1bd3e","unresolved":false,"context_lines":[{"line_number":3224,"context_line":"        self.client._provider_tree.new_root(uuids.cn, uuids.cn, generation\u003d1)"},{"line_number":3225,"context_line":"        cn \u003d objects.ComputeNode(uuid\u003duuids.cn, host\u003d\"fake_host\","},{"line_number":3226,"context_line":"                hypervisor_hostname\u003d\"fake_hostname\", )"},{"line_number":3227,"context_line":"        get_rpt_mock.return_value \u003d [{"},{"line_number":3228,"context_line":"            \u0027uuid\u0027: cn.uuid,"},{"line_number":3229,"context_line":"            \u0027name\u0027: mock.sentinel.name,"},{"line_number":3230,"context_line":"            \u0027generation\u0027: 1,"},{"line_number":3231,"context_line":"            \u0027parent_provider_uuid\u0027: None"},{"line_number":3232,"context_line":"        }]"},{"line_number":3233,"context_line":"        mock_order_rps.return_value \u003d [uuids.cn, uuids.child1, uuids.gc1_1]"},{"line_number":3234,"context_line":"        resp_mock \u003d fake_requests.FakeResponse(204)"},{"line_number":3235,"context_line":"        mock_delete.return_value \u003d resp_mock"},{"line_number":3236,"context_line":"        self.client.delete_resource_provider(self.context, cn)"},{"line_number":3237,"context_line":"        # With a 204, only the info should be called"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff570b3c_73def43e","line":3234,"range":{"start_line":3227,"start_character":1,"end_line":3234,"end_character":1},"updated":"2020-06-12 11:04:06.000000000","message":"The return value of these two mocks are inconsistent. You have to return 3 RPs from get_rpt_mock and you can delete mock_order_rps","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"},{"author":{"_account_id":31412,"name":"Wenping Song","email":"songwenping@inspur.com","username":"songwenping"},"change_message_id":"417c134558ee6467d46dbe8cae6bd16596653baf","unresolved":false,"context_lines":[{"line_number":3224,"context_line":"        self.client._provider_tree.new_root(uuids.cn, uuids.cn, generation\u003d1)"},{"line_number":3225,"context_line":"        cn \u003d objects.ComputeNode(uuid\u003duuids.cn, host\u003d\"fake_host\","},{"line_number":3226,"context_line":"                hypervisor_hostname\u003d\"fake_hostname\", )"},{"line_number":3227,"context_line":"        get_rpt_mock.return_value \u003d [{"},{"line_number":3228,"context_line":"            \u0027uuid\u0027: cn.uuid,"},{"line_number":3229,"context_line":"            \u0027name\u0027: mock.sentinel.name,"},{"line_number":3230,"context_line":"            \u0027generation\u0027: 1,"},{"line_number":3231,"context_line":"            \u0027parent_provider_uuid\u0027: None"},{"line_number":3232,"context_line":"        }]"},{"line_number":3233,"context_line":"        mock_order_rps.return_value \u003d [uuids.cn, uuids.child1, uuids.gc1_1]"},{"line_number":3234,"context_line":"        resp_mock \u003d fake_requests.FakeResponse(204)"},{"line_number":3235,"context_line":"        mock_delete.return_value \u003d resp_mock"},{"line_number":3236,"context_line":"        self.client.delete_resource_provider(self.context, cn)"},{"line_number":3237,"context_line":"        # With a 204, only the info should be called"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_40efb083","line":3234,"range":{"start_line":3227,"start_character":1,"end_line":3234,"end_character":1},"in_reply_to":"ff570b3c_73def43e","updated":"2020-06-17 09:54:16.000000000","message":"Done. Just mock get_providers_in_tree().","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8da8af2f8592f7986d65e0ddb39614c830d1bd3e","unresolved":false,"context_lines":[{"line_number":3235,"context_line":"        mock_delete.return_value \u003d resp_mock"},{"line_number":3236,"context_line":"        self.client.delete_resource_provider(self.context, cn)"},{"line_number":3237,"context_line":"        # With a 204, only the info should be called"},{"line_number":3238,"context_line":"        self.assertEqual(6, mock_log.info.call_count)"},{"line_number":3239,"context_line":"        self.assertEqual(0, mock_log.warning.call_count)"},{"line_number":3240,"context_line":""},{"line_number":3241,"context_line":"        # Now check a 404 response"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff570b3c_538db028","line":3238,"updated":"2020-06-12 11:04:06.000000000","message":"Let\u0027s put a note above this explaining that we expect two log lines per deleted RP.","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"},{"author":{"_account_id":31412,"name":"Wenping Song","email":"songwenping@inspur.com","username":"songwenping"},"change_message_id":"417c134558ee6467d46dbe8cae6bd16596653baf","unresolved":false,"context_lines":[{"line_number":3235,"context_line":"        mock_delete.return_value \u003d resp_mock"},{"line_number":3236,"context_line":"        self.client.delete_resource_provider(self.context, cn)"},{"line_number":3237,"context_line":"        # With a 204, only the info should be called"},{"line_number":3238,"context_line":"        self.assertEqual(6, mock_log.info.call_count)"},{"line_number":3239,"context_line":"        self.assertEqual(0, mock_log.warning.call_count)"},{"line_number":3240,"context_line":""},{"line_number":3241,"context_line":"        # Now check a 404 response"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_c0e1009d","line":3238,"in_reply_to":"ff570b3c_538db028","updated":"2020-06-17 09:54:16.000000000","message":"Revert it by removing my log info.","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8da8af2f8592f7986d65e0ddb39614c830d1bd3e","unresolved":false,"context_lines":[{"line_number":3265,"context_line":""},{"line_number":3266,"context_line":"    @mock.patch(\u0027nova.scheduler.client.report.SchedulerReportClient.\u0027"},{"line_number":3267,"context_line":"                \u0027get_providers_in_tree\u0027)"},{"line_number":3268,"context_line":"    @mock.patch(\u0027nova.compute.provider_tree.ProviderTree.\u0027"},{"line_number":3269,"context_line":"                \u0027get_provider_uuids_in_tree\u0027)"},{"line_number":3270,"context_line":"    @mock.patch(\u0027nova.scheduler.client.report.SchedulerReportClient.delete\u0027,"},{"line_number":3271,"context_line":"                new\u003dmock.Mock(side_effect\u003dks_exc.EndpointNotFound()))"},{"line_number":3272,"context_line":"    def test_delete_resource_provider_placement_exception(self,"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff570b3c_f3a5e4a0","line":3269,"range":{"start_line":3268,"start_character":0,"end_line":3269,"end_character":45},"updated":"2020-06-12 11:04:06.000000000","message":"you don\u0027t need this.","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"},{"author":{"_account_id":31412,"name":"Wenping Song","email":"songwenping@inspur.com","username":"songwenping"},"change_message_id":"417c134558ee6467d46dbe8cae6bd16596653baf","unresolved":false,"context_lines":[{"line_number":3265,"context_line":""},{"line_number":3266,"context_line":"    @mock.patch(\u0027nova.scheduler.client.report.SchedulerReportClient.\u0027"},{"line_number":3267,"context_line":"                \u0027get_providers_in_tree\u0027)"},{"line_number":3268,"context_line":"    @mock.patch(\u0027nova.compute.provider_tree.ProviderTree.\u0027"},{"line_number":3269,"context_line":"                \u0027get_provider_uuids_in_tree\u0027)"},{"line_number":3270,"context_line":"    @mock.patch(\u0027nova.scheduler.client.report.SchedulerReportClient.delete\u0027,"},{"line_number":3271,"context_line":"                new\u003dmock.Mock(side_effect\u003dks_exc.EndpointNotFound()))"},{"line_number":3272,"context_line":"    def test_delete_resource_provider_placement_exception(self,"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_20c71c15","line":3269,"range":{"start_line":3268,"start_character":0,"end_line":3269,"end_character":45},"in_reply_to":"ff570b3c_f3a5e4a0","updated":"2020-06-17 09:54:16.000000000","message":"Right.Deleted it.","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8da8af2f8592f7986d65e0ddb39614c830d1bd3e","unresolved":false,"context_lines":[{"line_number":3275,"context_line":"        \"\"\"Ensure that a ksa exception in delete_resource_provider raises"},{"line_number":3276,"context_line":"        through."},{"line_number":3277,"context_line":"        \"\"\""},{"line_number":3278,"context_line":"        self.client._provider_tree.new_root(uuids.cn, uuids.cn, generation\u003d1)"},{"line_number":3279,"context_line":"        cn \u003d objects.ComputeNode(uuid\u003duuids.cn, host\u003d\"fake_host\","},{"line_number":3280,"context_line":"                hypervisor_hostname\u003d\"fake_hostname\", )"},{"line_number":3281,"context_line":"        get_rpt_mock.return_value \u003d [{"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff570b3c_53b650de","line":3278,"updated":"2020-06-12 11:04:06.000000000","message":"you don\u0027t need this","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"},{"author":{"_account_id":31412,"name":"Wenping Song","email":"songwenping@inspur.com","username":"songwenping"},"change_message_id":"417c134558ee6467d46dbe8cae6bd16596653baf","unresolved":false,"context_lines":[{"line_number":3275,"context_line":"        \"\"\"Ensure that a ksa exception in delete_resource_provider raises"},{"line_number":3276,"context_line":"        through."},{"line_number":3277,"context_line":"        \"\"\""},{"line_number":3278,"context_line":"        self.client._provider_tree.new_root(uuids.cn, uuids.cn, generation\u003d1)"},{"line_number":3279,"context_line":"        cn \u003d objects.ComputeNode(uuid\u003duuids.cn, host\u003d\"fake_host\","},{"line_number":3280,"context_line":"                hypervisor_hostname\u003d\"fake_hostname\", )"},{"line_number":3281,"context_line":"        get_rpt_mock.return_value \u003d [{"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_80d708c0","line":3278,"in_reply_to":"ff570b3c_53b650de","updated":"2020-06-17 09:54:16.000000000","message":"Add the comment.","commit_id":"5f9923be897bb41b0bd95fd41499cf9fc0ad997d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a9200cc66b7e54f8a5450d8ca2e4d4815115ace2","unresolved":false,"context_lines":[{"line_number":3155,"context_line":"    @mock.patch(\"nova.objects.InstanceList.get_uuids_by_host_and_node\")"},{"line_number":3156,"context_line":"    def test_delete_resource_provider_cascade(self, mock_by_host,"},{"line_number":3157,"context_line":"            mock_del_alloc, mock_delete, mock_get_rpt):"},{"line_number":3158,"context_line":"        # First, check a successful call"},{"line_number":3159,"context_line":"        self.client._provider_tree.new_root(uuids.cn, uuids.cn, generation\u003d1)"},{"line_number":3160,"context_line":"        cn \u003d objects.ComputeNode(uuid\u003duuids.cn, host\u003d\"fake_host\","},{"line_number":3161,"context_line":"                hypervisor_hostname\u003d\"fake_hostname\", )"},{"line_number":3162,"context_line":"        mock_by_host.return_value \u003d [uuids.inst1, uuids.inst2]"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf51134e_a3a92125","line":3159,"range":{"start_line":3158,"start_character":0,"end_line":3159,"end_character":77},"updated":"2020-06-22 12:32:58.000000000","message":"This is not needed. Before your change the delete_resource_provider() assumed that there is an intialized provider_tree in the client. So the test needed to set that up for the call. But now your code in delete_resource_provider() does the provider_tree initialization [1]. So the test case does not need to set that up.\n\n[1] https://review.opendev.org/#/c/719163/16/nova/scheduler/client/report.py@2159","commit_id":"0ae2a01e61b27ac049b4bb32b71a708ea660f9a8"},{"author":{"_account_id":31412,"name":"Wenping Song","email":"songwenping@inspur.com","username":"songwenping"},"change_message_id":"e9f84e58a340dde63150a99462fdcbd2e9755ac7","unresolved":false,"context_lines":[{"line_number":3155,"context_line":"    @mock.patch(\"nova.objects.InstanceList.get_uuids_by_host_and_node\")"},{"line_number":3156,"context_line":"    def test_delete_resource_provider_cascade(self, mock_by_host,"},{"line_number":3157,"context_line":"            mock_del_alloc, mock_delete, mock_get_rpt):"},{"line_number":3158,"context_line":"        # First, check a successful call"},{"line_number":3159,"context_line":"        self.client._provider_tree.new_root(uuids.cn, uuids.cn, generation\u003d1)"},{"line_number":3160,"context_line":"        cn \u003d objects.ComputeNode(uuid\u003duuids.cn, host\u003d\"fake_host\","},{"line_number":3161,"context_line":"                hypervisor_hostname\u003d\"fake_hostname\", )"},{"line_number":3162,"context_line":"        mock_by_host.return_value \u003d [uuids.inst1, uuids.inst2]"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf51134e_2bcf98b0","line":3159,"range":{"start_line":3158,"start_character":0,"end_line":3159,"end_character":77},"in_reply_to":"bf51134e_a3a92125","updated":"2020-06-23 07:25:36.000000000","message":"Agree, done it.","commit_id":"0ae2a01e61b27ac049b4bb32b71a708ea660f9a8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a9200cc66b7e54f8a5450d8ca2e4d4815115ace2","unresolved":false,"context_lines":[{"line_number":3186,"context_line":"    @mock.patch(\"nova.objects.InstanceList.get_uuids_by_host_and_node\")"},{"line_number":3187,"context_line":"    def test_delete_resource_provider_no_cascade(self, mock_by_host,"},{"line_number":3188,"context_line":"            mock_del_alloc, mock_delete, mock_get_rpt):"},{"line_number":3189,"context_line":"        # First, check a successful call"},{"line_number":3190,"context_line":"        self.client._provider_tree.new_root(uuids.cn, uuids.cn, generation\u003d1)"},{"line_number":3191,"context_line":"        self.client._association_refresh_time[uuids.cn] \u003d mock.Mock()"},{"line_number":3192,"context_line":"        cn \u003d objects.ComputeNode(uuid\u003duuids.cn, host\u003d\"fake_host\","},{"line_number":3193,"context_line":"                hypervisor_hostname\u003d\"fake_hostname\", )"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf51134e_4375a5ca","line":3190,"range":{"start_line":3189,"start_character":0,"end_line":3190,"end_character":77},"updated":"2020-06-22 12:32:58.000000000","message":"ditto","commit_id":"0ae2a01e61b27ac049b4bb32b71a708ea660f9a8"},{"author":{"_account_id":31412,"name":"Wenping Song","email":"songwenping@inspur.com","username":"songwenping"},"change_message_id":"e9f84e58a340dde63150a99462fdcbd2e9755ac7","unresolved":false,"context_lines":[{"line_number":3186,"context_line":"    @mock.patch(\"nova.objects.InstanceList.get_uuids_by_host_and_node\")"},{"line_number":3187,"context_line":"    def test_delete_resource_provider_no_cascade(self, mock_by_host,"},{"line_number":3188,"context_line":"            mock_del_alloc, mock_delete, mock_get_rpt):"},{"line_number":3189,"context_line":"        # First, check a successful call"},{"line_number":3190,"context_line":"        self.client._provider_tree.new_root(uuids.cn, uuids.cn, generation\u003d1)"},{"line_number":3191,"context_line":"        self.client._association_refresh_time[uuids.cn] \u003d mock.Mock()"},{"line_number":3192,"context_line":"        cn \u003d objects.ComputeNode(uuid\u003duuids.cn, host\u003d\"fake_host\","},{"line_number":3193,"context_line":"                hypervisor_hostname\u003d\"fake_hostname\", )"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf51134e_8bc7c496","line":3190,"range":{"start_line":3189,"start_character":0,"end_line":3190,"end_character":77},"in_reply_to":"bf51134e_4375a5ca","updated":"2020-06-23 07:25:36.000000000","message":"Done.","commit_id":"0ae2a01e61b27ac049b4bb32b71a708ea660f9a8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a9200cc66b7e54f8a5450d8ca2e4d4815115ace2","unresolved":false,"context_lines":[{"line_number":3259,"context_line":"        \"\"\""},{"line_number":3260,"context_line":"        cn \u003d objects.ComputeNode(uuid\u003duuids.cn, host\u003d\"fake_host\","},{"line_number":3261,"context_line":"                hypervisor_hostname\u003d\"fake_hostname\", )"},{"line_number":3262,"context_line":"        mock_get_rpt.return_value \u003d [{"},{"line_number":3263,"context_line":"            \u0027uuid\u0027: uuids.gc1_1,"},{"line_number":3264,"context_line":"            \u0027name\u0027: mock.sentinel.name,"},{"line_number":3265,"context_line":"            \u0027generation\u0027: 1,"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf51134e_de4eaa6d","line":3262,"range":{"start_line":3262,"start_character":21,"end_line":3262,"end_character":33},"updated":"2020-06-22 12:32:58.000000000","message":"while the current order of the returned list is valid it suggests the code might make an assumption that child RPs are always returned before parent RP. As the current implementation (properly) does not make such assumption. I suggest to make return list ordered more randomly (e.g. compute RP before child RP)","commit_id":"0ae2a01e61b27ac049b4bb32b71a708ea660f9a8"},{"author":{"_account_id":31412,"name":"Wenping Song","email":"songwenping@inspur.com","username":"songwenping"},"change_message_id":"e9f84e58a340dde63150a99462fdcbd2e9755ac7","unresolved":false,"context_lines":[{"line_number":3259,"context_line":"        \"\"\""},{"line_number":3260,"context_line":"        cn \u003d objects.ComputeNode(uuid\u003duuids.cn, host\u003d\"fake_host\","},{"line_number":3261,"context_line":"                hypervisor_hostname\u003d\"fake_hostname\", )"},{"line_number":3262,"context_line":"        mock_get_rpt.return_value \u003d [{"},{"line_number":3263,"context_line":"            \u0027uuid\u0027: uuids.gc1_1,"},{"line_number":3264,"context_line":"            \u0027name\u0027: mock.sentinel.name,"},{"line_number":3265,"context_line":"            \u0027generation\u0027: 1,"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf51134e_cbbd3c03","line":3262,"range":{"start_line":3262,"start_character":21,"end_line":3262,"end_character":33},"in_reply_to":"bf51134e_de4eaa6d","updated":"2020-06-23 07:25:36.000000000","message":"Fixed. Thanks.","commit_id":"0ae2a01e61b27ac049b4bb32b71a708ea660f9a8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a9200cc66b7e54f8a5450d8ca2e4d4815115ace2","unresolved":false,"context_lines":[{"line_number":3264,"context_line":"            \u0027name\u0027: mock.sentinel.name,"},{"line_number":3265,"context_line":"            \u0027generation\u0027: 1,"},{"line_number":3266,"context_line":"            \u0027parent_provider_uuid\u0027: uuids.child1"},{"line_number":3267,"context_line":"        }, {"},{"line_number":3268,"context_line":"            \u0027uuid\u0027: uuids.child1,"},{"line_number":3269,"context_line":"            \u0027name\u0027: mock.sentinel.name,"},{"line_number":3270,"context_line":"            \u0027generation\u0027: 1,"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf51134e_23123163","line":3267,"range":{"start_line":3267,"start_character":8,"end_line":3267,"end_character":12},"updated":"2020-06-22 12:32:58.000000000","message":"this is a pretty strange formatting. I would prefer something like \n\n        mock_get_rpt.return_value \u003d [\n            {\n                \"uuid\": uuids.gc1_1,\n                \"name\": mock.sentinel.name,\n                \"generation\": 1,\n                \"parent_provider_uuid\": uuids.child1,\n            },\n            {\n                \"uuid\": uuids.child1,\n                \"name\": mock.sentinel.name,\n                \"generation\": 1,\n                \"parent_provider_uuid\": cn.uuid,\n            },\n            {\n                \"uuid\": cn.uuid,\n                \"name\": mock.sentinel.name,\n                \"generation\": 1,\n                \"parent_provider_uuid\": None,\n            },\n        ]","commit_id":"0ae2a01e61b27ac049b4bb32b71a708ea660f9a8"},{"author":{"_account_id":31412,"name":"Wenping Song","email":"songwenping@inspur.com","username":"songwenping"},"change_message_id":"e9f84e58a340dde63150a99462fdcbd2e9755ac7","unresolved":false,"context_lines":[{"line_number":3264,"context_line":"            \u0027name\u0027: mock.sentinel.name,"},{"line_number":3265,"context_line":"            \u0027generation\u0027: 1,"},{"line_number":3266,"context_line":"            \u0027parent_provider_uuid\u0027: uuids.child1"},{"line_number":3267,"context_line":"        }, {"},{"line_number":3268,"context_line":"            \u0027uuid\u0027: uuids.child1,"},{"line_number":3269,"context_line":"            \u0027name\u0027: mock.sentinel.name,"},{"line_number":3270,"context_line":"            \u0027generation\u0027: 1,"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf51134e_0b39f4a2","line":3267,"range":{"start_line":3267,"start_character":8,"end_line":3267,"end_character":12},"in_reply_to":"bf51134e_23123163","updated":"2020-06-23 07:25:36.000000000","message":"Fixed.","commit_id":"0ae2a01e61b27ac049b4bb32b71a708ea660f9a8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a9200cc66b7e54f8a5450d8ca2e4d4815115ace2","unresolved":false,"context_lines":[{"line_number":3276,"context_line":"            \u0027parent_provider_uuid\u0027: None"},{"line_number":3277,"context_line":"        }]"},{"line_number":3278,"context_line":"        self.client.delete_resource_provider(self.context, cn)"},{"line_number":3279,"context_line":"        self.assertEqual(3, mock_delete.call_count)"},{"line_number":3280,"context_line":"        exp_url \u003d \"Deleted resource provider %s\""},{"line_number":3281,"context_line":"        # logging info in order: uuids.gc1_1, uuids.child1, cn.uuid"},{"line_number":3282,"context_line":"        mock_log.assert_has_calls(["}],"source_content_type":"text/x-python","patch_set":16,"id":"bf51134e_bebe56b1","line":3279,"range":{"start_line":3279,"start_character":0,"end_line":3279,"end_character":51},"updated":"2020-06-22 12:32:58.000000000","message":"you could assert the order of the RP deletion is correct:\n\n        mock_delete.assert_has_calls([\n            mock.call(\u0027/resource_providers/%s\u0027 % uuids.gc1_1,\n                      global_request_id\u003dmock.ANY),\n            mock.call(\u0027/resource_providers/%s\u0027 % uuids.child1,\n                      global_request_id\u003dmock.ANY),\n            mock.call(\u0027/resource_providers/%s\u0027 % cn.uuid,\n                      global_request_id\u003dmock.ANY),\n        ])\n\nJust do not forget to add \n\n        mock_delete.return_value \u003d True\n\nbefore the \n\n        delete_resource_provider()\n\ncall","commit_id":"0ae2a01e61b27ac049b4bb32b71a708ea660f9a8"},{"author":{"_account_id":31412,"name":"Wenping Song","email":"songwenping@inspur.com","username":"songwenping"},"change_message_id":"e9f84e58a340dde63150a99462fdcbd2e9755ac7","unresolved":false,"context_lines":[{"line_number":3276,"context_line":"            \u0027parent_provider_uuid\u0027: None"},{"line_number":3277,"context_line":"        }]"},{"line_number":3278,"context_line":"        self.client.delete_resource_provider(self.context, cn)"},{"line_number":3279,"context_line":"        self.assertEqual(3, mock_delete.call_count)"},{"line_number":3280,"context_line":"        exp_url \u003d \"Deleted resource provider %s\""},{"line_number":3281,"context_line":"        # logging info in order: uuids.gc1_1, uuids.child1, cn.uuid"},{"line_number":3282,"context_line":"        mock_log.assert_has_calls(["}],"source_content_type":"text/x-python","patch_set":16,"id":"bf51134e_0bd45447","line":3279,"range":{"start_line":3279,"start_character":0,"end_line":3279,"end_character":51},"in_reply_to":"bf51134e_509d5708","updated":"2020-06-23 07:25:36.000000000","message":"It is the call().__bool__() function called that blocks the test.","commit_id":"0ae2a01e61b27ac049b4bb32b71a708ea660f9a8"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"ec1def79207de376d7cf960d2ca90cfb163cd6ae","unresolved":false,"context_lines":[{"line_number":3276,"context_line":"            \u0027parent_provider_uuid\u0027: None"},{"line_number":3277,"context_line":"        }]"},{"line_number":3278,"context_line":"        self.client.delete_resource_provider(self.context, cn)"},{"line_number":3279,"context_line":"        self.assertEqual(3, mock_delete.call_count)"},{"line_number":3280,"context_line":"        exp_url \u003d \"Deleted resource provider %s\""},{"line_number":3281,"context_line":"        # logging info in order: uuids.gc1_1, uuids.child1, cn.uuid"},{"line_number":3282,"context_line":"        mock_log.assert_has_calls(["}],"source_content_type":"text/x-python","patch_set":16,"id":"bf51134e_509d5708","line":3279,"range":{"start_line":3279,"start_character":0,"end_line":3279,"end_character":51},"in_reply_to":"bf51134e_bebe56b1","updated":"2020-06-23 06:21:22.000000000","message":"\u003e Just do not forget to add\n \u003e \n \u003e mock_delete.return_value \u003d True\n \u003e \n \u003e before the\n \u003e \n \u003e delete_resource_provider()\n \u003e \n \u003e call\n\nI think that why we cannot get the right mock_delete.assert_has_call() failed, because of the python __loop()__ has been called, we will try to test.","commit_id":"0ae2a01e61b27ac049b4bb32b71a708ea660f9a8"},{"author":{"_account_id":31412,"name":"Wenping Song","email":"songwenping@inspur.com","username":"songwenping"},"change_message_id":"e9f84e58a340dde63150a99462fdcbd2e9755ac7","unresolved":false,"context_lines":[{"line_number":3276,"context_line":"            \u0027parent_provider_uuid\u0027: None"},{"line_number":3277,"context_line":"        }]"},{"line_number":3278,"context_line":"        self.client.delete_resource_provider(self.context, cn)"},{"line_number":3279,"context_line":"        self.assertEqual(3, mock_delete.call_count)"},{"line_number":3280,"context_line":"        exp_url \u003d \"Deleted resource provider %s\""},{"line_number":3281,"context_line":"        # logging info in order: uuids.gc1_1, uuids.child1, cn.uuid"},{"line_number":3282,"context_line":"        mock_log.assert_has_calls(["}],"source_content_type":"text/x-python","patch_set":16,"id":"bf51134e_0bebb412","line":3279,"range":{"start_line":3279,"start_character":0,"end_line":3279,"end_character":51},"in_reply_to":"bf51134e_bebe56b1","updated":"2020-06-23 07:25:36.000000000","message":"Great, it works. This makes us confused many hours just because we put the `mock_delete.return_value` after the function `delete_rp()` called, and we have to use log info instead.","commit_id":"0ae2a01e61b27ac049b4bb32b71a708ea660f9a8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a9200cc66b7e54f8a5450d8ca2e4d4815115ace2","unresolved":false,"context_lines":[{"line_number":3294,"context_line":"        \"\"\"Ensure that a ksa exception in delete_resource_provider raises"},{"line_number":3295,"context_line":"        through."},{"line_number":3296,"context_line":"        \"\"\""},{"line_number":3297,"context_line":"        # First, check a successful call"},{"line_number":3298,"context_line":"        self.client._provider_tree.new_root(uuids.cn, uuids.cn, generation\u003d1)"},{"line_number":3299,"context_line":"        cn \u003d objects.ComputeNode(uuid\u003duuids.cn, host\u003d\"fake_host\","},{"line_number":3300,"context_line":"                hypervisor_hostname\u003d\"fake_hostname\", )"},{"line_number":3301,"context_line":"        mock_get_rpt.return_value \u003d [{"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf51134e_5ecd7a64","line":3298,"range":{"start_line":3297,"start_character":0,"end_line":3298,"end_character":77},"updated":"2020-06-22 12:32:58.000000000","message":"you can drop these","commit_id":"0ae2a01e61b27ac049b4bb32b71a708ea660f9a8"},{"author":{"_account_id":31412,"name":"Wenping Song","email":"songwenping@inspur.com","username":"songwenping"},"change_message_id":"e9f84e58a340dde63150a99462fdcbd2e9755ac7","unresolved":false,"context_lines":[{"line_number":3294,"context_line":"        \"\"\"Ensure that a ksa exception in delete_resource_provider raises"},{"line_number":3295,"context_line":"        through."},{"line_number":3296,"context_line":"        \"\"\""},{"line_number":3297,"context_line":"        # First, check a successful call"},{"line_number":3298,"context_line":"        self.client._provider_tree.new_root(uuids.cn, uuids.cn, generation\u003d1)"},{"line_number":3299,"context_line":"        cn \u003d objects.ComputeNode(uuid\u003duuids.cn, host\u003d\"fake_host\","},{"line_number":3300,"context_line":"                hypervisor_hostname\u003d\"fake_hostname\", )"},{"line_number":3301,"context_line":"        mock_get_rpt.return_value \u003d [{"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf51134e_eb3da08f","line":3298,"range":{"start_line":3297,"start_character":0,"end_line":3298,"end_character":77},"in_reply_to":"bf51134e_5ecd7a64","updated":"2020-06-23 07:25:36.000000000","message":"Dropped.","commit_id":"0ae2a01e61b27ac049b4bb32b71a708ea660f9a8"}]}
