2021-05-11 17:59:29 +08:00
|
|
|
import pytest
|
|
|
|
import sys
|
2021-06-10 19:19:49 +08:00
|
|
|
from pymilvus_orm.default_config import DefaultConfig
|
2021-05-11 17:59:29 +08:00
|
|
|
|
|
|
|
sys.path.append("..")
|
2021-06-04 09:35:34 +08:00
|
|
|
from base.connections_wrapper import ApiConnectionsWrapper
|
|
|
|
from base.collection_wrapper import ApiCollectionWrapper
|
|
|
|
from base.partition_wrapper import ApiPartitionWrapper
|
|
|
|
from base.index_wrapper import ApiIndexWrapper
|
|
|
|
from base.utility_wrapper import ApiUtilityWrapper
|
2021-06-09 09:21:35 +08:00
|
|
|
from base.schema_wrapper import ApiCollectionSchemaWrapper, ApiFieldSchemaWrapper
|
2021-05-11 17:59:29 +08:00
|
|
|
|
2021-06-09 16:19:48 +08:00
|
|
|
from config.log_config import log_config
|
2021-05-20 11:03:45 +08:00
|
|
|
from utils.util_log import test_log as log
|
|
|
|
from common import common_func as cf
|
2021-05-27 10:26:35 +08:00
|
|
|
from common import common_type as ct
|
2021-06-08 13:19:35 +08:00
|
|
|
from check.param_check import ip_check, number_check
|
2021-05-11 17:59:29 +08:00
|
|
|
|
|
|
|
|
|
|
|
class ParamInfo:
|
|
|
|
def __init__(self):
|
2021-05-13 12:17:15 +08:00
|
|
|
self.param_host = ""
|
2021-05-11 17:59:29 +08:00
|
|
|
self.param_port = ""
|
|
|
|
self.param_handler = ""
|
|
|
|
|
2021-05-13 12:17:15 +08:00
|
|
|
def prepare_param_info(self, host, port, handler):
|
|
|
|
self.param_host = host
|
2021-05-11 17:59:29 +08:00
|
|
|
self.param_port = port
|
|
|
|
self.param_handler = handler
|
|
|
|
|
|
|
|
|
|
|
|
param_info = ParamInfo()
|
|
|
|
|
|
|
|
|
|
|
|
class Base:
|
|
|
|
""" Initialize class object """
|
2021-06-04 09:35:34 +08:00
|
|
|
connection_wrap = None
|
|
|
|
collection_wrap = None
|
|
|
|
partition_wrap = None
|
|
|
|
index_wrap = None
|
|
|
|
utility_wrap = None
|
2021-06-09 09:21:35 +08:00
|
|
|
collection_schema_wrap = None
|
|
|
|
field_schema_wrap = None
|
2021-06-28 15:54:11 +08:00
|
|
|
collection_object_list = []
|
2021-05-11 17:59:29 +08:00
|
|
|
|
|
|
|
def setup_class(self):
|
|
|
|
log.info("[setup_class] Start setup class...")
|
|
|
|
|
|
|
|
def teardown_class(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def setup(self):
|
2021-06-02 19:21:33 +08:00
|
|
|
log.info(("*" * 35) + " setup " + ("*" * 35))
|
2021-06-04 09:35:34 +08:00
|
|
|
self.connection_wrap = ApiConnectionsWrapper()
|
|
|
|
self.collection_wrap = ApiCollectionWrapper()
|
2021-06-28 15:54:11 +08:00
|
|
|
self.collection_object_list.append(self.collection_wrap)
|
2021-06-04 09:35:34 +08:00
|
|
|
self.partition_wrap = ApiPartitionWrapper()
|
|
|
|
self.index_wrap = ApiIndexWrapper()
|
|
|
|
self.utility_wrap = ApiUtilityWrapper()
|
2021-06-09 09:21:35 +08:00
|
|
|
self.collection_schema_wrap = ApiCollectionSchemaWrapper()
|
|
|
|
self.field_schema_wrap = ApiFieldSchemaWrapper()
|
2021-05-11 17:59:29 +08:00
|
|
|
|
|
|
|
def teardown(self):
|
2021-06-04 09:35:34 +08:00
|
|
|
log.info(("*" * 35) + " teardown " + ("*" * 35))
|
|
|
|
|
|
|
|
try:
|
|
|
|
""" Drop collection before disconnect """
|
2021-06-28 15:54:11 +08:00
|
|
|
if self.connection_wrap.get_connection(alias=DefaultConfig.DEFAULT_USING)[0] is None:
|
|
|
|
self.connection_wrap.connect(alias=DefaultConfig.DEFAULT_USING, host=param_info.param_host,
|
|
|
|
port=param_info.param_port)
|
|
|
|
|
|
|
|
for collection_object in self.collection_object_list:
|
|
|
|
if collection_object is not None and collection_object.collection is not None:
|
|
|
|
collection_object.drop()
|
|
|
|
|
|
|
|
# if self.collection_wrap is not None:
|
|
|
|
# collection_list = self.utility_wrap.list_collections()[0]
|
|
|
|
# for i in collection_list:
|
|
|
|
# collection_wrap = ApiCollectionWrapper()
|
|
|
|
# collection_wrap.init_collection(name=i)
|
|
|
|
# collection_wrap.drop()
|
2021-06-04 09:35:34 +08:00
|
|
|
except Exception as e:
|
|
|
|
pass
|
|
|
|
|
2021-06-01 18:49:31 +08:00
|
|
|
try:
|
|
|
|
""" Delete connection and reset configuration"""
|
2021-06-04 09:35:34 +08:00
|
|
|
res = self.connection_wrap.list_connections()
|
2021-06-02 19:21:33 +08:00
|
|
|
for i in res[0]:
|
2021-06-04 09:35:34 +08:00
|
|
|
self.connection_wrap.remove_connection(i[0])
|
2021-06-10 19:19:49 +08:00
|
|
|
|
|
|
|
# because the connection is in singleton mode, it needs to be restored to the original state after teardown
|
|
|
|
self.connection_wrap.add_connection(default={"host": DefaultConfig.DEFAULT_HOST,
|
|
|
|
"port": DefaultConfig.DEFAULT_PORT})
|
2021-06-01 18:49:31 +08:00
|
|
|
except Exception as e:
|
|
|
|
pass
|
2021-05-11 17:59:29 +08:00
|
|
|
|
|
|
|
@pytest.fixture(scope="module", autouse=True)
|
|
|
|
def initialize_env(self, request):
|
|
|
|
""" clean log before testing """
|
2021-05-13 12:17:15 +08:00
|
|
|
host = request.config.getoption("--host")
|
2021-05-11 17:59:29 +08:00
|
|
|
port = request.config.getoption("--port")
|
|
|
|
handler = request.config.getoption("--handler")
|
2021-06-08 13:19:35 +08:00
|
|
|
clean_log = request.config.getoption("--clean_log")
|
|
|
|
|
|
|
|
""" params check """
|
|
|
|
assert ip_check(host) and number_check(port)
|
|
|
|
|
|
|
|
""" modify log files """
|
2021-06-09 16:19:48 +08:00
|
|
|
cf.modify_file(file_path_list=[log_config.log_debug, log_config.log_info, log_config.log_err], is_modify=clean_log)
|
2021-06-08 13:19:35 +08:00
|
|
|
|
|
|
|
log.info("#" * 80)
|
|
|
|
log.info("[initialize_milvus] Log cleaned up, start testing...")
|
2021-05-13 12:17:15 +08:00
|
|
|
param_info.prepare_param_info(host, port, handler)
|
2021-05-11 17:59:29 +08:00
|
|
|
|
|
|
|
|
2021-06-05 10:25:34 +08:00
|
|
|
class TestcaseBase(Base):
|
2021-05-11 17:59:29 +08:00
|
|
|
"""
|
|
|
|
Additional methods;
|
|
|
|
Public methods that can be used to add cases.
|
|
|
|
"""
|
|
|
|
|
2021-06-28 15:54:11 +08:00
|
|
|
# move to conftest.py
|
|
|
|
# @pytest.fixture(scope="module", params=ct.get_invalid_strs)
|
|
|
|
# def get_invalid_string(self, request):
|
|
|
|
# yield request.param
|
|
|
|
#
|
|
|
|
# @pytest.fixture(scope="module", params=cf.gen_simple_index())
|
|
|
|
# def get_index_param(self, request):
|
|
|
|
# yield request.param
|
2021-05-27 10:26:35 +08:00
|
|
|
|
2021-05-13 12:17:15 +08:00
|
|
|
def _connect(self):
|
2021-06-04 09:35:34 +08:00
|
|
|
""" Add an connection and create the connect """
|
2021-06-25 10:46:09 +08:00
|
|
|
res, is_succ = self.connection_wrap.connect(alias=DefaultConfig.DEFAULT_USING, host=param_info.param_host,
|
|
|
|
port=param_info.param_port)
|
2021-05-13 12:17:15 +08:00
|
|
|
return res
|
2021-06-08 10:35:35 +08:00
|
|
|
|
2021-06-25 10:46:09 +08:00
|
|
|
def init_collection_wrap(self, name=None, schema=None, check_task=None, check_items=None, **kwargs):
|
2021-06-07 12:15:35 +08:00
|
|
|
name = cf.gen_unique_str('coll_') if name is None else name
|
|
|
|
schema = cf.gen_default_collection_schema() if schema is None else schema
|
2021-06-25 10:46:09 +08:00
|
|
|
if self.connection_wrap.get_connection(alias=DefaultConfig.DEFAULT_USING)[0] is None:
|
2021-06-07 12:15:35 +08:00
|
|
|
self._connect()
|
|
|
|
collection_w = ApiCollectionWrapper()
|
2021-06-28 15:54:11 +08:00
|
|
|
self.collection_object_list.append(collection_w)
|
2021-06-25 10:46:09 +08:00
|
|
|
collection_w.init_collection(name=name, schema=schema, check_task=check_task, check_items=check_items, **kwargs)
|
2021-06-07 12:15:35 +08:00
|
|
|
return collection_w
|
|
|
|
|
2021-06-08 10:35:35 +08:00
|
|
|
def init_partition_wrap(self, collection_wrap=None, name=None, description=None,
|
2021-06-07 16:41:35 +08:00
|
|
|
check_task=None, check_items=None, **kwargs):
|
2021-05-27 10:26:35 +08:00
|
|
|
name = cf.gen_unique_str("partition_") if name is None else name
|
2021-06-07 12:15:35 +08:00
|
|
|
description = cf.gen_unique_str("partition_des_") if description is None else description
|
|
|
|
collection_wrap = self.init_collection_wrap() if collection_wrap is None else collection_wrap
|
|
|
|
partition_wrap = ApiPartitionWrapper()
|
2021-06-07 16:41:35 +08:00
|
|
|
partition_wrap.init_partition(collection_wrap.collection, name, description,
|
|
|
|
check_task=check_task, check_items=check_items,
|
|
|
|
**kwargs)
|
2021-06-07 12:15:35 +08:00
|
|
|
return partition_wrap
|
2021-06-10 11:46:49 +08:00
|
|
|
|
2021-06-24 20:40:09 +08:00
|
|
|
def init_collection_general(self, prefix, insert_data=False, nb=ct.default_nb,
|
|
|
|
partition_num=0, is_binary=False, is_all_data_type=False):
|
2021-06-10 11:46:49 +08:00
|
|
|
"""
|
|
|
|
target: create specified collections
|
|
|
|
method: 1. create collections (binary/non-binary)
|
|
|
|
2. create partitions if specified
|
|
|
|
3. insert specified binary/non-binary data
|
|
|
|
into each partition if any
|
|
|
|
expected: return collection and raw data
|
|
|
|
"""
|
|
|
|
log.info("Test case of search interface: initialize before test case")
|
2021-07-02 09:48:12 +08:00
|
|
|
self._connect()
|
2021-06-10 11:46:49 +08:00
|
|
|
collection_name = cf.gen_unique_str(prefix)
|
|
|
|
vectors = []
|
|
|
|
binary_raw_vectors = []
|
|
|
|
# 1 create collection
|
2021-06-24 20:40:09 +08:00
|
|
|
default_schema = cf.gen_default_collection_schema()
|
2021-06-10 11:46:49 +08:00
|
|
|
if is_binary:
|
|
|
|
default_schema = cf.gen_default_binary_collection_schema()
|
2021-06-24 20:40:09 +08:00
|
|
|
if is_all_data_type:
|
|
|
|
default_schema = cf.gen_collection_schema_all_datatype()
|
2021-06-15 15:11:57 +08:00
|
|
|
log.info("init_collection_general: collection creation")
|
2021-06-10 11:46:49 +08:00
|
|
|
collection_w = self.init_collection_wrap(name=collection_name,
|
|
|
|
schema=default_schema)
|
|
|
|
# 2 add extra partitions if specified (default is 1 partition named "_default")
|
|
|
|
if partition_num > 0:
|
|
|
|
cf.gen_partitions(collection_w, partition_num)
|
|
|
|
# 3 insert data if specified
|
|
|
|
if insert_data:
|
2021-06-24 20:40:09 +08:00
|
|
|
collection_w, vectors, binary_raw_vectors = \
|
|
|
|
cf.insert_data(collection_w, nb, is_binary, is_all_data_type)
|
2021-06-28 15:54:11 +08:00
|
|
|
assert collection_w.is_empty is False
|
2021-06-24 20:40:09 +08:00
|
|
|
assert collection_w.num_entities == nb
|
2021-06-18 19:12:09 +08:00
|
|
|
collection_w.load()
|
2021-06-10 11:46:49 +08:00
|
|
|
|
|
|
|
return collection_w, vectors, binary_raw_vectors
|