docstr: Method:
  1. prepare a rgA with 2 nodes
  2. create a collection
  3. load the collection into rgA and default rg
  verify fail with error msg
  4. load the collection into rgA and rgB
  verify search succ
  5. transfer replica from rgB to default rg
  verify fail
  6. transfer node from rgA to default rgA
  verify succ
  7. transfer node from rgB to default rgB
  8. verify search succ
docstr_tok: ["Method",":","1.","prepare","a","rgA","with","2","nodes","2.","create","a","collection","3.","load","the","collection","into","rgA","and","default","rg","verify","fail","with","error","msg","4.","load","the","collection","into","rgA","and","rgB","verify","search","succ","5.","transfer","replica","from","rgB","to","default","rg","verify","fail","6.","transfer","node","from","rgA","to","default","rgA","verify","succ","7.","transfer","node","from","rgB","to","default","rgB","8.","verify","search","succ"]
code: def test_load_multi_rgs_with_default_rg(self):
      """
      Method:
      1. prepare a rgA with 2 nodes
      2. create a collection
      3. load the collection into rgA and default rg
      verify fail with error msg
      4. load the collection into rgA and rgB
      verify search succ
      5. transfer replica from rgB to default rg
      verify fail
      6. transfer node from rgA to default rgA
      verify succ
      7. transfer node from rgB to default rgB
      8. verify search succ
      """
      self._connect()
      rgA_name = cf.gen_unique_str("rgA")
      self.init_resource_group(name=rgA_name)
      self.utility_wrap.transfer_node(
          source=ct.default_resource_group_name,
          target=rgA_name,
          num_node=2,
      )
      dim = 128
      collection_w = self.init_collection_wrap(shards_num=1)
      insert_ids = []
      nb = 500
      for i in range(5):
          res, _ = collection_w.insert(
              cf.gen_default_list_data(nb=nb, dim=dim, start=i * nb)
          )
          collection_w.flush()
          insert_ids.extend(res.primary_keys)
      collection_w.create_index(
          ct.default_float_vec_field_name, ct.default_flat_index
      )
  
      # load the collection with rgA and default rg
      error = {
          ct.err_code: 999,
          ct.err_msg: f"failed to load collection, err=load operation can't use default resource group and other resource group together",
      }
      collection_w.load(
          replica_number=2,
          _resource_groups=[rgA_name, ct.default_resource_group_name],
          check_task=CheckTasks.err_res,
          check_items=error,
      )
  
      rgB_name = cf.gen_unique_str("rgB")
      self.init_resource_group(name=rgB_name)
      self.utility_wrap.transfer_node(
          source=ct.default_resource_group_name,
          target=rgB_name,
          num_node=2,
      )
  
      # load the collection into rgA and rgB
      collection_w.load(
          replica_number=2, _resource_groups=[rgA_name, rgB_name]
      )
      nq = 5
      vectors = [
          [random.random() for _ in range(dim)] for _ in range(nq)
      ]
      # verify search succ
      collection_w.search(
          vectors[:nq],
          ct.default_float_vec_field_name,
          ct.default_search_params,
          ct.default_limit,
          check_task=CheckTasks.check_search_results,
          check_items={
              "nq": nq,
              "ids": insert_ids.copy(),
              "limit": ct.default_limit,
          },
      )
      # transfer the replica from rgB to default rg
      error = {
          ct.err_code: 999,
          ct.err_msg: "transfer replica will cause replica loaded in both default rg and other rg",
      }
      self.utility_wrap.transfer_replica(
          source=rgB_name,
          target=ct.default_resource_group_name,
          collection_name=collection_w.name,
          num_replica=1,
          check_task=CheckTasks.err_res,
          check_items=error,
      )
  
      time.sleep(1)
      collection_w.search(
          vectors[:nq],
          ct.default_float_vec_field_name,
          ct.default_search_params,
          ct.default_limit,
          check_task=CheckTasks.check_search_results,
          check_items={
              "nq": nq,
              "ids": insert_ids.copy(),
              "limit": ct.default_limit,
          },
      )
  
      # transfer all nodes back to default rg
      self.utility_wrap.transfer_node(
          source=rgA_name,
          target=ct.default_resource_group_name,
          num_node=2,
      )
      self.utility_wrap.transfer_node(
          source=rgB_name,
          target=ct.default_resource_group_name,
          num_node=2,
      )
      time.sleep(1)
      collection_w.search(
          vectors[:nq],
          ct.default_float_vec_field_name,
          ct.default_search_params,
          ct.default_limit,
          check_task=CheckTasks.check_search_results,
          check_items={
              "nq": nq,
              "ids": insert_ids.copy(),
              "limit": ct.default_limit,
          },
      )
      collection_w.get_replicas()
  
imports: import pytest
  from base.client_base import TestcaseBase
  from common import common_func
  from common import common_type
  from common.common_type import CaseLabel, CheckTasks
  from utils.util_pymilvus import *
label_desc: Use image node_id 7 for calling the TestResourceGroupMultiNodes obj's underlying member method code with example usage: obj.test_load_multi_rgs_with_default_rg() without return types