Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
milvus
milvus
提交
42e60f59
M
milvus
项目概览
milvus
/
milvus
大约 1 年 前同步成功
通知
261
Star
22476
Fork
2472
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
milvus
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
42e60f59
编写于
2月 21, 2023
作者:
T
ThreadDao
提交者:
GitHub
2月 21, 2023
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add chaos case to test resource group (#22308)
Signed-off-by:
N
ThreadDao
<
yufen.zong@zilliz.com
>
上级
9e0ec154
变更
3
显示空白变更内容
内联
并排
Showing
3 changed file
with
191 addition
and
5 deletion
+191
-5
tests/python_client/chaos/testcases/test_all_collections_after_chaos.py
...lient/chaos/testcases/test_all_collections_after_chaos.py
+3
-3
tests/python_client/chaos/testcases/test_chaos_resource_group.py
...ython_client/chaos/testcases/test_chaos_resource_group.py
+185
-0
tests/python_client/chaos/testcases/test_data_persistence.py
tests/python_client/chaos/testcases/test_data_persistence.py
+3
-2
未找到文件。
tests/python_client/chaos/testcases/test_all_collections_after_chaos.py
浏览文件 @
42e60f59
...
@@ -8,8 +8,10 @@ from common.common_type import CaseLabel
...
@@ -8,8 +8,10 @@ from common.common_type import CaseLabel
from
utils.util_log
import
test_log
as
log
from
utils.util_log
import
test_log
as
log
from
utils.util_common
import
get_collections
from
utils.util_common
import
get_collections
class
TestAllCollection
(
TestcaseBase
):
class
TestAllCollection
(
TestcaseBase
):
""" Test case of end to end"""
""" Test case of end to end"""
@
pytest
.
fixture
(
scope
=
"function"
,
params
=
get_collections
())
@
pytest
.
fixture
(
scope
=
"function"
,
params
=
get_collections
())
def
collection_name
(
self
,
request
):
def
collection_name
(
self
,
request
):
if
request
.
param
==
[]
or
request
.
param
==
""
:
if
request
.
param
==
[]
or
request
.
param
==
""
:
...
@@ -22,7 +24,6 @@ class TestAllCollection(TestcaseBase):
...
@@ -22,7 +24,6 @@ class TestAllCollection(TestcaseBase):
method
.
__name__
)
method
.
__name__
)
log
.
info
(
"skip drop collection"
)
log
.
info
(
"skip drop collection"
)
@
pytest
.
mark
.
tags
(
CaseLabel
.
L1
)
@
pytest
.
mark
.
tags
(
CaseLabel
.
L1
)
def
test_milvus_default
(
self
,
collection_name
):
def
test_milvus_default
(
self
,
collection_name
):
# create
# create
...
@@ -117,4 +118,3 @@ class TestAllCollection(TestcaseBase):
...
@@ -117,4 +118,3 @@ class TestAllCollection(TestcaseBase):
tt
=
time
.
time
()
-
t0
tt
=
time
.
time
()
-
t0
log
.
info
(
f
"assert query result
{
len
(
res
)
}
:
{
tt
}
"
)
log
.
info
(
f
"assert query result
{
len
(
res
)
}
:
{
tt
}
"
)
assert
len
(
res
)
>=
4
assert
len
(
res
)
>=
4
tests/python_client/chaos/testcases/test_chaos_resource_group.py
0 → 100644
浏览文件 @
42e60f59
import
time
import
pytest
from
base.client_base
import
TestcaseBase
from
common
import
common_func
as
cf
from
common
import
common_type
as
ct
from
common.common_type
import
CaseLabel
from
utils.util_log
import
test_log
as
log
# customer rg
rg_name_0
=
"RG_0"
rg_name_1
=
"RG_1"
# coll name
coll_name_1
=
"ResourceGroup_111"
coll_name_2
=
"ResourceGroup_222"
# resource group info of 4 qns
resource_group_info
=
[
{
"name"
:
rg_name_0
,
"available_node"
:
1
,
"capacity"
:
1
,
"loaded_replica"
:
{
coll_name_1
:
1
}},
{
"name"
:
rg_name_1
,
"available_node"
:
1
,
"capacity"
:
1
,
"loaded_replica"
:
{
coll_name_1
:
1
}},
{
"name"
:
ct
.
default_resource_group_name
,
"available_node"
:
2
,
"capacity"
:
ct
.
default_resource_group_capacity
,
"loaded_replica"
:
{
coll_name_2
:
2
}}
]
class
TestChaosRG
(
TestcaseBase
):
""" Test case of end to end"""
def
teardown_method
(
self
,
method
):
log
.
info
((
"*"
*
35
)
+
" teardown "
+
(
"*"
*
35
))
log
.
info
(
"[teardown_method] Start teardown test case %s..."
%
method
.
__name__
)
log
.
info
(
"skip drop collection"
)
@
pytest
.
mark
.
tags
(
CaseLabel
.
L3
)
def
test_milvus_resource_group
(
self
):
nb
=
10000
# collection rg map
collection_rg_map
=
{
coll_name_1
:
{
"resource_groups"
:
[
rg_name_0
,
rg_name_1
],
"replica_number"
:
2
},
coll_name_2
:
{
"resource_groups"
:
[
ct
.
default_resource_group_name
],
"replica_number"
:
2
}
}
self
.
_connect
()
# create RG_0, RG_1, transfer 1 node to RG_0, 1 node to RG_1
for
rg_info
in
resource_group_info
:
rg_name
=
rg_info
[
"name"
]
if
rg_name
!=
ct
.
default_resource_group_name
:
_
,
create_rg_res
=
self
.
utility_wrap
.
create_resource_group
(
rg_name
)
assert
create_rg_res
log
.
info
(
f
"[ResourceGroup] Create rg
{
rg_name
}
done"
)
self
.
utility_wrap
.
transfer_node
(
source
=
ct
.
default_resource_group_name
,
target
=
rg_name
,
num_node
=
rg_info
[
"available_node"
])
log
.
info
(
f
'[ResourceGroup] Transfer
{
rg_info
[
"available_node"
]
}
nodes from
{
ct
.
default_resource_group_name
}
to
{
rg_name
}
done'
)
# verify RGs
resource_groups
,
_
=
self
.
utility_wrap
.
list_resource_groups
()
assert
len
(
resource_groups
)
==
len
(
resource_group_info
)
assert
all
([
rg_info
[
"name"
]
in
resource_groups
for
rg_info
in
resource_group_info
])
for
rg_info
in
resource_group_info
:
rg_info
=
{
"name"
:
rg_info
[
"name"
],
"capacity"
:
rg_info
[
"capacity"
],
"num_available_node"
:
rg_info
[
"available_node"
],
"num_loaded_replica"
:
{},
"num_outgoing_node"
:
{},
"num_incoming_node"
:
{}
}
desc_rg_info
,
_
=
self
.
utility_wrap
.
describe_resource_group
(
name
=
rg_info
[
"name"
],
check_task
=
ct
.
CheckTasks
.
check_rg_property
,
check_items
=
rg_info
)
log
.
info
(
f
'[ResourceGroup] Rg of
{
rg_info
[
"name"
]
}
info is:
{
desc_rg_info
}
'
)
# prepare collection C1, C2
# create
data
=
cf
.
gen_default_dataframe_data
(
nb
=
nb
)
index_params
=
{
"index_type"
:
"HNSW"
,
"metric_type"
:
"L2"
,
"params"
:
{
"M"
:
48
,
"efConstruction"
:
500
}}
for
coll_name
in
coll_name_1
,
coll_name_2
:
# create
collection_w
=
self
.
init_collection_wrap
(
name
=
coll_name
,
active_trace
=
True
)
log
.
info
(
f
"create collection
{
collection_w
.
name
}
done"
)
entities
=
collection_w
.
num_entities
# insert
_
,
res
=
collection_w
.
insert
(
data
)
assert
res
log
.
info
(
f
"insert
{
nb
}
entities done"
)
# flush
_
,
check_result
=
collection_w
.
flush
(
timeout
=
180
)
assert
check_result
assert
collection_w
.
num_entities
==
nb
+
entities
entities
=
collection_w
.
num_entities
log
.
info
(
f
"flush done with entities:
{
entities
}
"
)
# index
index
,
_
=
collection_w
.
create_index
(
field_name
=
ct
.
default_float_vec_field_name
,
index_params
=
index_params
,
index_name
=
cf
.
gen_unique_str
())
index
,
_
=
collection_w
.
create_index
(
field_name
=
ct
.
default_string_field_name
,
index_params
=
{},
index_name
=
cf
.
gen_unique_str
())
index_infos
=
[
index
.
to_dict
()
for
index
in
collection_w
.
indexes
]
log
.
info
(
f
"index info:
{
index_infos
}
"
)
# load coll_rg_a, 2 replicas -> RG_0, RG_1
# load coll_rg_b, 2 replicas -> default_RG
collection_w
.
load
(
replica_number
=
collection_rg_map
[
coll_name
][
"replica_number"
],
_resource_groups
=
collection_rg_map
[
coll_name
][
"resource_groups"
])
# show query segment info
segment_info
,
_
=
self
.
utility_wrap
.
get_query_segment_info
(
collection_w
.
name
)
log
.
info
(
f
"
{
collection_w
.
name
}
segment info:
{
segment_info
}
"
)
# show replicas info
replicas
,
_
=
collection_w
.
get_replicas
()
log
.
info
(
f
"
{
collection_w
.
name
}
replica info:
{
replicas
}
"
)
# search
search_vectors
=
cf
.
gen_vectors
(
ct
.
default_nq
,
ct
.
default_dim
)
search_params
=
{
"metric_type"
:
"L2"
,
"params"
:
{
"ef"
:
64
}}
search_res
,
_
=
collection_w
.
search
(
data
=
search_vectors
,
anns_field
=
ct
.
default_float_vec_field_name
,
param
=
search_params
,
limit
=
ct
.
default_limit
,
expr
=
"int64 >= 0"
)
assert
len
(
search_res
)
==
ct
.
default_nq
assert
len
(
search_res
[
0
])
==
ct
.
default_limit
# query and delete
term_expr
=
f
'
{
ct
.
default_int64_field_name
}
< 100'
query_res
,
_
=
collection_w
.
query
(
term_expr
)
assert
len
(
query_res
)
==
100
delete_expr
=
f
'
{
ct
.
default_int64_field_name
}
in
{
[
i
for
i
in
range
(
100
)]
}
'
collection_w
.
delete
(
delete_expr
)
collection_w
.
query
(
term_expr
,
check_task
=
ct
.
CheckTasks
.
check_query_empty
)
# verify rg replica info
for
rg_info
in
resource_group_info
:
rg_info
=
{
"name"
:
rg_info
[
"name"
],
"capacity"
:
rg_info
[
"capacity"
],
"num_available_node"
:
rg_info
[
"available_node"
],
"num_loaded_replica"
:
rg_info
[
"loaded_replica"
],
"num_outgoing_node"
:
{},
"num_incoming_node"
:
{}
}
desc_rg_info_2
,
_
=
self
.
utility_wrap
.
describe_resource_group
(
name
=
rg_info
[
"name"
],
check_task
=
ct
.
CheckTasks
.
check_rg_property
,
check_items
=
rg_info
)
log
.
info
(
f
'[ResourceGroup] Rg of
{
rg_info
[
"name"
]
}
info is:
{
desc_rg_info_2
}
'
)
@
pytest
.
mark
.
tags
(
CaseLabel
.
L3
)
def
test_verify_milvus_resource_group
(
self
):
self
.
_connect
()
# verify collection exist
all_collections
,
_
=
self
.
utility_wrap
.
list_collections
()
assert
all
(
coll_name
in
all_collections
for
coll_name
in
[
coll_name_1
,
coll_name_2
])
# verify resource groups
for
rg_info
in
resource_group_info
:
rg_info
=
{
"name"
:
rg_info
[
"name"
],
"capacity"
:
rg_info
[
"capacity"
],
"num_available_node"
:
rg_info
[
"available_node"
],
"num_loaded_replica"
:
rg_info
[
"loaded_replica"
],
"num_outgoing_node"
:
{},
"num_incoming_node"
:
{}
}
desc_rg_info
,
_
=
self
.
utility_wrap
.
describe_resource_group
(
name
=
rg_info
[
"name"
],
check_task
=
ct
.
CheckTasks
.
check_rg_property
,
check_items
=
rg_info
)
log
.
info
(
f
'[ResourceGroup] Rg of
{
rg_info
[
"name"
]
}
info is:
{
desc_rg_info
}
'
)
# search
for
coll_name
in
coll_name_1
,
coll_name_2
:
collection_w
=
self
.
init_collection_wrap
(
name
=
coll_name
,
active_trace
=
True
)
for
i
in
range
(
10
):
search_vectors
=
cf
.
gen_vectors
(
ct
.
default_nq
,
ct
.
default_dim
)
search_params
=
{
"metric_type"
:
"L2"
,
"params"
:
{
"ef"
:
64
}}
search_res
,
_
=
collection_w
.
search
(
data
=
search_vectors
,
anns_field
=
ct
.
default_float_vec_field_name
,
param
=
search_params
,
limit
=
ct
.
default_limit
,
expr
=
"int64 >= 0"
)
assert
len
(
search_res
)
==
ct
.
default_nq
assert
len
(
search_res
[
0
])
==
ct
.
default_limit
\ No newline at end of file
tests/python_client/chaos/testcases/test_data_persistence.py
浏览文件 @
42e60f59
...
@@ -10,6 +10,7 @@ from utils.util_log import test_log as log
...
@@ -10,6 +10,7 @@ from utils.util_log import test_log as log
class
TestDataPersistence
(
TestcaseBase
):
class
TestDataPersistence
(
TestcaseBase
):
""" Test case of end to end"""
""" Test case of end to end"""
def
teardown_method
(
self
,
method
):
def
teardown_method
(
self
,
method
):
log
.
info
((
"*"
*
35
)
+
" teardown "
+
(
"*"
*
35
))
log
.
info
((
"*"
*
35
)
+
" teardown "
+
(
"*"
*
35
))
log
.
info
(
"[teardown_method] Start teardown test case %s..."
%
log
.
info
(
"[teardown_method] Start teardown test case %s..."
%
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录