Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test: modify search iterator V2 case about alias/db/rbac for milvus client #39400

Merged
merged 1 commit into from
Jan 20, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions tests/python_client/base/client_v2_base.py
Original file line number Diff line number Diff line change
@@ -154,8 +154,8 @@ def search(self, client, collection_name, data, limit=10, filter=None, output_fi
return res, check_result

@trace()
def search_interator(self, client, collection_name, data, batch_size=20, limit=100, filter=None, output_fields=None,
search_params=None, timeout=None, check_task=None, check_items=None, **kwargs):
def search_iterator(self, client, collection_name, data, batch_size, limit=-1, filter=None, output_fields=None,
search_params=None, timeout=None, check_task=None, check_items=None, **kwargs):
timeout = TIMEOUT if timeout is None else timeout
kwargs.update({"timeout": timeout})
func_name = sys._getframe().f_code.co_name
44 changes: 24 additions & 20 deletions tests/python_client/check/func_check.py
Original file line number Diff line number Diff line change
@@ -429,26 +429,30 @@ def check_search_iterator(search_res, func_name, check_items):
search_iterator = search_res
pk_list = []
while True:
res = search_iterator.next()
if len(res) == 0:
log.info("search iteration finished, close")
search_iterator.close()
break
if check_items.get("batch_size", None):
assert len(res) <= check_items["batch_size"]
if check_items.get("radius", None):
for distance in res.distances():
if check_items["metric_type"] == "L2":
assert distance < check_items["radius"]
else:
assert distance > check_items["radius"]
if check_items.get("range_filter", None):
for distance in res.distances():
if check_items["metric_type"] == "L2":
assert distance >= check_items["range_filter"]
else:
assert distance <= check_items["range_filter"]
pk_list.extend(res.ids())
try:
res = search_iterator.next()
if len(res) == 0:
log.info("search iteration finished, close")
search_iterator.close()
break
if check_items.get("batch_size", None):
assert len(res) <= check_items["batch_size"]
if check_items.get("radius", None):
for distance in res.distances():
if check_items["metric_type"] == "L2":
assert distance < check_items["radius"]
else:
assert distance > check_items["radius"]
if check_items.get("range_filter", None):
for distance in res.distances():
if check_items["metric_type"] == "L2":
assert distance >= check_items["range_filter"]
else:
assert distance <= check_items["range_filter"]
pk_list.extend(res.ids())
except Exception as e:
assert check_items["err_msg"] in str(e)
return False
assert len(pk_list) == len(set(pk_list))
log.info("check: total %d results" % len(pk_list))

17 changes: 7 additions & 10 deletions tests/python_client/milvus_client/test_milvus_client_rbac.py
Original file line number Diff line number Diff line change
@@ -597,9 +597,9 @@ def teardown_method(self, method):
roles, _ = self.list_roles(client)
for role in roles:
if role not in ['admin', 'public']:
res, _ = self.describe_role(client, role)
if res['privileges']:
for privilege in res['privileges']:
role_info, _ = self.describe_role(client, role)
if role_info:
for privilege in role_info.get("privileges", []):
self.revoke_privilege(client, role, privilege["object_type"],
privilege["privilege"], privilege["object_name"])
self.drop_role(client, role)
@@ -613,8 +613,9 @@ def test_milvus_client_search_iterator_rbac_mul_db(self):
"""
target: test search iterator(high level api) normal case about mul db by rbac
method: create connection, collection, insert and search iterator
expected: search iterator permission deny after switch to no permission db
expected: search iterator permission deny after switch to no permission db
"""
batch_size = 20
uri = f"http://{cf.param_info.param_host}:{cf.param_info.param_port}"
client, _ = self.init_milvus_client(uri=uri, token="root:Milvus")
my_db = cf.gen_unique_str(prefix)
@@ -647,14 +648,10 @@ def test_milvus_client_search_iterator_rbac_mul_db(self):

# 5. search_iterator
vectors_to_search = rng.random((1, default_dim))
self.search_interator(client, collection_name, vectors_to_search, use_rbac_mul_db=True, another_db=my_db,
check_task=CheckTasks.check_permission_deny)
self.search_iterator(client, collection_name, vectors_to_search, batch_size, use_rbac_mul_db=True, another_db=my_db,
check_task=CheckTasks.check_permission_deny)
client, _ = self.init_milvus_client(uri=uri, token="root:Milvus")
self.revoke_privilege(client, role_name, "Collection", "Search", collection_name, 'default')
self.revoke_privilege(client, role_name, "Collection", "Insert", collection_name, my_db)
self.revoke_role(client, user_name=user_name, role_name=role_name)
self.release_collection(client, collection_name)
self.drop_collection(client, collection_name)
self.using_database(client, 'default')
self.release_collection(client, collection_name)
self.drop_collection(client, collection_name)
Original file line number Diff line number Diff line change
@@ -42,13 +42,14 @@ def search_params(self, request):
yield request.param

@pytest.mark.tags(CaseLabel.L1)
@pytest.mark.skip("https://github.com/milvus-io/milvus/issues/39045")
# @pytest.mark.skip("https://github.com/milvus-io/milvus/issues/39045")
def test_milvus_client_search_iterator_using_mul_db(self, search_params):
"""
target: test search iterator(high level api) case about mul db
method: create connection, collection, insert and search iterator
expected: search iterator error after switch to another db
"""
batch_size = 20
client = self._client()
collection_name = cf.gen_unique_str(prefix)
my_db = cf.gen_unique_str(prefix)
@@ -75,21 +76,23 @@ def test_milvus_client_search_iterator_using_mul_db(self, search_params):
# 5. search_iterator
vectors_to_search = rng.random((1, default_dim))
search_params = {"params": search_params}
self.search_interator(client, collection_name, vectors_to_search, search_params=search_params,
use_mul_db=True, another_db=my_db,
check_task=CheckTasks.err_res,
check_items={})
error_msg = "alias or database may have been changed"
self.search_iterator(client, collection_name, vectors_to_search, batch_size, search_params=search_params,
use_mul_db=True, another_db=my_db,
check_task=CheckTasks.check_search_iterator,
check_items={ct.err_code: 1, ct.err_msg: error_msg})
self.release_collection(client, collection_name)
self.drop_collection(client, collection_name)

@pytest.mark.tags(CaseLabel.L1)
@pytest.mark.skip("https://github.com/milvus-io/milvus/issues/39087")
# @pytest.mark.skip("https://github.com/milvus-io/milvus/issues/39087")
def test_milvus_client_search_iterator_alias_different_col(self, search_params):
"""
target: test search iterator(high level api) case about alias
method: create connection, collection, insert and search iterator
expected: search iterator error after alter alias
"""
batch_size = 20
client = self._client()
collection_name = cf.gen_unique_str(prefix)
collection_name_new = cf.gen_unique_str(prefix)
@@ -114,11 +117,11 @@ def test_milvus_client_search_iterator_alias_different_col(self, search_params):
# 3. search_iterator
vectors_to_search = rng.random((1, default_dim))
search_params = {"params": search_params}
error_msg = "" # todo
self.search_interator(client, alias, vectors_to_search, search_params=search_params,
use_alias=True, another_collection=collection_name_new,
check_task=CheckTasks.err_res,
check_items={ct.err_code: 1, ct.err_msg: error_msg})
error_msg = "alias or database may have been changed"
self.search_iterator(client, alias, vectors_to_search, batch_size, search_params=search_params,
use_alias=True, another_collection=collection_name_new,
check_task=CheckTasks.check_search_iterator,
check_items={ct.err_code: 1, ct.err_msg: error_msg})
self.release_collection(client, collection_name)
self.drop_collection(client, collection_name)
self.release_collection(client, collection_name_new)
@@ -153,6 +156,7 @@ def test_milvus_client_search_iterator_default(self, search_params):
method: create connection, collection, insert and search iterator
expected: search iterator successfully
"""
batch_size = 20
client = self._client()
collection_name = cf.gen_unique_str(prefix)
self.using_database(client, "default")
@@ -175,12 +179,12 @@ def test_milvus_client_search_iterator_default(self, search_params):
vectors_to_search = rng.random((1, default_dim))
insert_ids = [i for i in range(default_nb)]
search_params = {"params": search_params}
self.search_interator(client, collection_name, vectors_to_search, search_params=search_params,
check_task=CheckTasks.check_search_iterator,
check_items={"enable_milvus_client_api": True,
"nq": len(vectors_to_search),
"ids": insert_ids,
"limit": default_limit})
self.search_iterator(client, collection_name, vectors_to_search, batch_size, search_params=search_params,
check_task=CheckTasks.check_search_iterator,
check_items={"enable_milvus_client_api": True,
"nq": len(vectors_to_search),
"ids": insert_ids,
"limit": default_limit})
self.release_collection(client, collection_name)
self.drop_collection(client, collection_name)

@@ -192,6 +196,7 @@ def test_milvus_client_search_iterator_about_nullable_default(self, nullable, se
method: create connection, collection, insert and search iterator
expected: search iterator successfully
"""
batch_size = 20
client = self._client()
collection_name = cf.gen_unique_str(prefix)
dim = 128
@@ -218,13 +223,13 @@ def test_milvus_client_search_iterator_about_nullable_default(self, nullable, se
vectors_to_search = rng.random((1, default_dim))
insert_ids = [i for i in range(default_nb)]
search_params = {"params": search_params}
self.search_interator(client, collection_name, vectors_to_search, filter="nullable_field>=10",
search_params=search_params,
check_task=CheckTasks.check_search_iterator,
check_items={"enable_milvus_client_api": True,
"nq": len(vectors_to_search),
"ids": insert_ids,
"limit": default_limit})
self.search_iterator(client, collection_name, vectors_to_search, batch_size, filter="nullable_field>=10",
search_params=search_params,
check_task=CheckTasks.check_search_iterator,
check_items={"enable_milvus_client_api": True,
"nq": len(vectors_to_search),
"ids": insert_ids,
"limit": default_limit})
if self.has_collection(client, collection_name)[0]:
self.drop_collection(client, collection_name)

@@ -235,6 +240,7 @@ def test_milvus_client_rename_search_iterator_default(self, search_params):
method: create connection, collection, insert and search iterator
expected: search iterator successfully
"""
batch_size = 20
client = self._client()
collection_name = cf.gen_unique_str(prefix)
# 1. create collection
@@ -260,12 +266,12 @@ def test_milvus_client_rename_search_iterator_default(self, search_params):
vectors_to_search = rng.random((1, default_dim))
insert_ids = [i for i in range(default_nb)]
search_params = {"params": search_params}
self.search_interator(client, new_name, vectors_to_search, search_params=search_params,
check_task=CheckTasks.check_search_iterator,
check_items={"enable_milvus_client_api": True,
"nq": len(vectors_to_search),
"ids": insert_ids,
"limit": default_limit})
self.search_iterator(client, new_name, vectors_to_search, batch_size, search_params=search_params,
check_task=CheckTasks.check_search_iterator,
check_items={"enable_milvus_client_api": True,
"nq": len(vectors_to_search),
"ids": insert_ids,
"limit": default_limit})
self.release_collection(client, new_name)
self.drop_collection(client, new_name)

@@ -276,6 +282,7 @@ def test_milvus_client_array_insert_search_iterator(self, search_params):
method: create connection, collection, insert and search iterator
expected: search iterator successfully
"""
batch_size = 20
client = self._client()
collection_name = cf.gen_unique_str(prefix)
# 1. create collection
@@ -296,12 +303,12 @@ def test_milvus_client_array_insert_search_iterator(self, search_params):
vectors_to_search = rng.random((1, default_dim))
insert_ids = [i for i in range(default_nb)]
search_params = {"params": search_params}
self.search_interator(client, collection_name, vectors_to_search, search_params=search_params,
check_task=CheckTasks.check_search_iterator,
check_items={"enable_milvus_client_api": True,
"nq": len(vectors_to_search),
"ids": insert_ids,
"limit": default_limit})
self.search_iterator(client, collection_name, vectors_to_search, batch_size, search_params=search_params,
check_task=CheckTasks.check_search_iterator,
check_items={"enable_milvus_client_api": True,
"nq": len(vectors_to_search),
"ids": insert_ids,
"limit": default_limit})

@pytest.mark.tags(CaseLabel.L2)
def test_milvus_client_search_iterator_string(self, search_params):
@@ -310,6 +317,7 @@ def test_milvus_client_search_iterator_string(self, search_params):
method: create connection, collection, insert and search iterator
expected: search iterator successfully
"""
batch_size = 20
client = self._client()
collection_name = cf.gen_unique_str(prefix)
# 1. create collection
@@ -324,11 +332,11 @@ def test_milvus_client_search_iterator_string(self, search_params):
# 3. search_iterator
vectors_to_search = rng.random((1, default_dim))
search_params = {"params": search_params}
self.search_interator(client, collection_name, vectors_to_search, search_params=search_params,
check_task=CheckTasks.check_search_iterator,
check_items={"enable_milvus_client_api": True,
"nq": len(vectors_to_search),
"limit": default_limit})
self.search_iterator(client, collection_name, vectors_to_search, batch_size, search_params=search_params,
check_task=CheckTasks.check_search_iterator,
check_items={"enable_milvus_client_api": True,
"nq": len(vectors_to_search),
"limit": default_limit})
self.drop_collection(client, collection_name)

@pytest.mark.tags(CaseLabel.L2)
@@ -355,13 +363,13 @@ def test_milvus_client_search_iterator_different_metric_type_no_specify_in_searc
# 3. search_iterator
vectors_to_search = rng.random((1, default_dim))
search_params = {"params": search_params}
self.search_interator(client, collection_name, vectors_to_search, batch_size=default_batch_size,
limit=default_limit, search_params=search_params,
output_fields=[default_primary_key_field_name],
check_task=CheckTasks.check_search_iterator,
check_items={"enable_milvus_client_api": True,
"nq": len(vectors_to_search),
"limit": default_limit})
self.search_iterator(client, collection_name, vectors_to_search, batch_size=default_batch_size,
limit=default_limit, search_params=search_params,
output_fields=[default_primary_key_field_name],
check_task=CheckTasks.check_search_iterator,
check_items={"enable_milvus_client_api": True,
"nq": len(vectors_to_search),
"limit": default_limit})
self.drop_collection(client, collection_name)

@pytest.mark.tags(CaseLabel.L2)
@@ -389,13 +397,13 @@ def test_milvus_client_search_iterator_different_metric_type_specify_in_search_p
vectors_to_search = rng.random((1, default_dim))
search_params = {"params": search_params}
search_params.update({"metric_type": metric_type})
self.search_interator(client, collection_name, vectors_to_search, batch_size=default_batch_size,
limit=default_limit, search_params=search_params,
output_fields=[default_primary_key_field_name],
check_task=CheckTasks.check_search_iterator,
check_items={"enable_milvus_client_api": True,
"nq": len(vectors_to_search),
"limit": default_limit})
self.search_iterator(client, collection_name, vectors_to_search, batch_size=default_batch_size,
limit=default_limit, search_params=search_params,
output_fields=[default_primary_key_field_name],
check_task=CheckTasks.check_search_iterator,
check_items={"enable_milvus_client_api": True,
"nq": len(vectors_to_search),
"limit": default_limit})
self.drop_collection(client, collection_name)

@pytest.mark.tags(CaseLabel.L1)
@@ -426,13 +434,13 @@ def test_milvus_client_search_iterator_delete_with_ids(self, search_params):
insert_ids.remove(insert_id)
limit = default_nb - delete_num
search_params = {"params": search_params}
self.search_interator(client, collection_name, vectors_to_search, batch_size=default_batch_size,
search_params=search_params, limit=default_nb,
check_task=CheckTasks.check_search_iterator,
check_items={"enable_milvus_client_api": True,
"nq": len(vectors_to_search),
"ids": insert_ids,
"limit": limit})
self.search_iterator(client, collection_name, vectors_to_search, batch_size=default_batch_size,
search_params=search_params, limit=default_nb,
check_task=CheckTasks.check_search_iterator,
check_items={"enable_milvus_client_api": True,
"nq": len(vectors_to_search),
"ids": insert_ids,
"limit": limit})
self.drop_collection(client, collection_name)

@pytest.mark.tags(CaseLabel.L1)
@@ -463,13 +471,13 @@ def test_milvus_client_search_iterator_delete_with_filters(self, search_params):
insert_ids.remove(insert_id)
limit = default_nb - delete_num
search_params = {"params": search_params}
self.search_interator(client, collection_name, vectors_to_search, batch_size=default_batch_size,
search_params=search_params, limit=default_nb,
check_task=CheckTasks.check_search_iterator,
check_items={"enable_milvus_client_api": True,
"nq": len(vectors_to_search),
"ids": insert_ids,
"limit": limit})
self.search_iterator(client, collection_name, vectors_to_search, batch_size=default_batch_size,
search_params=search_params, limit=default_nb,
check_task=CheckTasks.check_search_iterator,
check_items={"enable_milvus_client_api": True,
"nq": len(vectors_to_search),
"ids": insert_ids,
"limit": limit})
# 5. query
self.query(client, collection_name, filter=default_search_exp,
check_task=CheckTasks.check_query_results,