chore: import upstream snapshot with attribution
Build and test / Build and test AMD64 Ubuntu 22.04 (push) Failing after 0s
Publish Builder / amazonlinux2023 (push) Failing after 1s
Build and test / UT for Go (push) Has been skipped
Publish KRTE Images / KRTE (push) Failing after 1s
Build and test / Integration Test (push) Has been skipped
Build and test / Upload Code Coverage (push) Has been skipped
Publish Builder / rockylinux9 (push) Failing after 1s
Publish Builder / ubuntu22.04 (push) Failing after 0s
Publish Builder / ubuntu24.04 (push) Failing after 0s
Publish Gpu Builder / publish-gpu-builder (push) Failing after 1s
Publish Test Images / PyTest (push) Failing after 0s
Build and test / UT for Cpp (push) Has been cancelled
Build and test / Build and test AMD64 Ubuntu 22.04 (push) Failing after 0s
Publish Builder / amazonlinux2023 (push) Failing after 1s
Build and test / UT for Go (push) Has been skipped
Publish KRTE Images / KRTE (push) Failing after 1s
Build and test / Integration Test (push) Has been skipped
Build and test / Upload Code Coverage (push) Has been skipped
Publish Builder / rockylinux9 (push) Failing after 1s
Publish Builder / ubuntu22.04 (push) Failing after 0s
Publish Builder / ubuntu24.04 (push) Failing after 0s
Publish Gpu Builder / publish-gpu-builder (push) Failing after 1s
Publish Test Images / PyTest (push) Failing after 0s
Build and test / UT for Cpp (push) Has been cancelled
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
from collections import defaultdict
|
||||
import json
|
||||
import argparse
|
||||
from pymilvus import connections, list_collections
|
||||
TIMEOUT = 120
|
||||
|
||||
|
||||
def save_all_checker_collections(host="127.0.0.1", prefix="Checker"):
|
||||
# create connection
|
||||
connections.connect(host=host, port="19530")
|
||||
all_collections = list_collections()
|
||||
if prefix is None:
|
||||
all_collections = [c_name for c_name in all_collections]
|
||||
else:
|
||||
all_collections = [c_name for c_name in all_collections if prefix in c_name]
|
||||
m = defaultdict(list)
|
||||
for c_name in all_collections:
|
||||
prefix = c_name.split("_")[0]
|
||||
if len(m[prefix]) <= 10:
|
||||
m[prefix].append(c_name)
|
||||
selected_collections = []
|
||||
for v in m.values():
|
||||
selected_collections.extend(v)
|
||||
data = {
|
||||
"all": selected_collections
|
||||
}
|
||||
print("selected_collections is")
|
||||
print(selected_collections)
|
||||
with open("/tmp/ci_logs/all_collections.json", "w") as f:
|
||||
f.write(json.dumps(data))
|
||||
|
||||
|
||||
parser = argparse.ArgumentParser(description='host ip')
|
||||
parser.add_argument('--host', type=str, default='127.0.0.1', help='host ip')
|
||||
args = parser.parse_args()
|
||||
save_all_checker_collections(args.host)
|
||||
@@ -0,0 +1,128 @@
|
||||
# Copyright (C) 2019-2020 Zilliz. All rights reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
# is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
# or implied. See the License for the specific language governing permissions and limitations under the License.
|
||||
|
||||
|
||||
import random
|
||||
import numpy as np
|
||||
import time
|
||||
import argparse
|
||||
from pymilvus import (
|
||||
connections, list_collections,
|
||||
FieldSchema, CollectionSchema, DataType,
|
||||
Collection
|
||||
)
|
||||
TIMEOUT = 120
|
||||
|
||||
|
||||
def hello_milvus(host="127.0.0.1"):
|
||||
import time
|
||||
# create connection
|
||||
connections.connect(host=host, port="19530")
|
||||
|
||||
print(f"\nList collections...")
|
||||
print(list_collections())
|
||||
|
||||
# create collection
|
||||
dim = 128
|
||||
default_fields = [
|
||||
FieldSchema(name="int64", dtype=DataType.INT64, is_primary=True),
|
||||
FieldSchema(name="float", dtype=DataType.FLOAT),
|
||||
FieldSchema(name="varchar", dtype=DataType.VARCHAR, max_length=65535),
|
||||
FieldSchema(name="float_vector", dtype=DataType.FLOAT_VECTOR, dim=dim)
|
||||
]
|
||||
default_schema = CollectionSchema(fields=default_fields, description="test collection")
|
||||
|
||||
print(f"\nCreate collection...")
|
||||
collection = Collection(name="hello_milvus", schema=default_schema)
|
||||
|
||||
print(f"\nList collections...")
|
||||
print(list_collections())
|
||||
|
||||
# insert data
|
||||
nb = 3000
|
||||
vectors = [[random.random() for _ in range(dim)] for _ in range(nb)]
|
||||
t0 = time.time()
|
||||
collection.insert(
|
||||
[
|
||||
[i for i in range(nb)],
|
||||
[np.float32(i) for i in range(nb)],
|
||||
[str(i) for i in range(nb)],
|
||||
vectors
|
||||
]
|
||||
)
|
||||
t1 = time.time()
|
||||
print(f"\nInsert {nb} vectors cost {t1 - t0:.4f} seconds")
|
||||
|
||||
t0 = time.time()
|
||||
print(f"\nGet collection entities...")
|
||||
collection.flush()
|
||||
print(collection.num_entities)
|
||||
t1 = time.time()
|
||||
print(f"\nGet collection entities cost {t1 - t0:.4f} seconds")
|
||||
|
||||
print("\nGet replicas number")
|
||||
try:
|
||||
replicas_info = collection.get_replicas()
|
||||
replica_number = len(replicas_info.groups)
|
||||
print(f"\nReplicas number is {replica_number}")
|
||||
except Exception as e:
|
||||
print(str(e))
|
||||
replica_number = 1
|
||||
|
||||
# create index and load table
|
||||
default_index = {"index_type": "IVF_SQ8", "metric_type": "L2", "params": {"nlist": 64}}
|
||||
print(f"\nCreate index...")
|
||||
t0 = time.time()
|
||||
|
||||
collection.release()
|
||||
|
||||
collection.create_index(field_name="float_vector", index_params=default_index)
|
||||
t1 = time.time()
|
||||
print(f"\nCreate index cost {t1 - t0:.4f} seconds")
|
||||
print(f"\nload collection...")
|
||||
t0 = time.time()
|
||||
collection.load(replica_number=replica_number)
|
||||
t1 = time.time()
|
||||
print(f"\nload collection cost {t1 - t0:.4f} seconds")
|
||||
|
||||
# load and search
|
||||
topK = 5
|
||||
search_params = {"metric_type": "L2", "params": {"nprobe": 10}}
|
||||
t0 = time.time()
|
||||
print(f"\nSearch...")
|
||||
# define output_fields of search result
|
||||
res = collection.search(
|
||||
vectors[-2:], "float_vector", search_params, topK,
|
||||
"int64 > 100", output_fields=["int64", "float"], timeout=TIMEOUT
|
||||
)
|
||||
t1 = time.time()
|
||||
print(f"search cost {t1 - t0:.4f} seconds")
|
||||
# show result
|
||||
for hits in res:
|
||||
for hit in hits:
|
||||
# Get value of the random value field for search result
|
||||
print(hit, hit.entity.get("float"))
|
||||
|
||||
# query
|
||||
expr = "int64 in [2,4,6,8]"
|
||||
output_fields = ["int64", "float"]
|
||||
res = collection.query(expr, output_fields, timeout=TIMEOUT)
|
||||
sorted_res = sorted(res, key=lambda k: k['int64'])
|
||||
for r in sorted_res:
|
||||
print(r)
|
||||
|
||||
|
||||
parser = argparse.ArgumentParser(description='host ip')
|
||||
parser.add_argument('--host', type=str, default='127.0.0.1', help='host ip')
|
||||
args = parser.parse_args()
|
||||
# add time stamp
|
||||
print(f"\nStart time: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))}")
|
||||
hello_milvus(args.host)
|
||||
@@ -0,0 +1,17 @@
|
||||
|
||||
release=${1:-"milvs-chaos"}
|
||||
milvus_mode=${2:-"cluster"}
|
||||
ns=${3:-"chaos-testing"}
|
||||
bash uninstall_milvus.sh ${release} ${ns}|| true
|
||||
|
||||
helm repo add milvus https://zilliztech.github.io/milvus-helm/
|
||||
helm repo update
|
||||
if [[ ${milvus_mode} == "cluster" ]];
|
||||
then
|
||||
helm install --wait --timeout 360s ${release} milvus/milvus -f ../cluster-values.yaml --set metrics.serviceMonitor.enabled=true -n=${ns}
|
||||
fi
|
||||
|
||||
if [[ ${milvus_mode} == "standalone" ]];
|
||||
then
|
||||
helm install --wait --timeout 360s ${release} milvus/milvus -f ../standalone-values.yaml --set metrics.serviceMonitor.enabled=true -n=${ns}
|
||||
fi
|
||||
@@ -0,0 +1,13 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
release=${1:-"milvs-chaos"}
|
||||
ns=${2:-"chaos-testing"}
|
||||
bash uninstall_milvus.sh ${release} ${ns}|| true
|
||||
|
||||
echo "insatll cluster"
|
||||
helm install --wait --debug --timeout 600s ${RELEASE_NAME:-$release} milvus/milvus \
|
||||
--set image.all.repository=${REPOSITORY:-"milvusdb/milvus"} \
|
||||
--set image.all.tag=${IMAGE_TAG:-"master-latest"} \
|
||||
--set metrics.serviceMonitor.enabled=true \
|
||||
-f ../cluster-values.yaml -n=${ns}
|
||||
@@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
release=${1:-"milvs-chaos"}
|
||||
ns=${2:-"chaos-testing"}
|
||||
bash uninstall_milvus.sh ${release} ${ns}|| true
|
||||
echo "insatll standalone"
|
||||
helm install --wait --debug --timeout 600s ${RELEASE_NAME:-$release} milvus/milvus \
|
||||
--set image.all.repository=${REPOSITORY:-"milvusdb/milvus"} \
|
||||
--set image.all.tag=${IMAGE_TAG:-"master-latest"} \
|
||||
--set metrics.serviceMonitor.enabled=true \
|
||||
-f ../standalone-values.yaml -n=${ns}
|
||||
@@ -0,0 +1,25 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
set -x
|
||||
|
||||
|
||||
echo "check os env"
|
||||
platform='Linux'
|
||||
unamestr=$(uname)
|
||||
if [[ "$unamestr" == 'Linux' ]]; then
|
||||
platform='Linux'
|
||||
elif [[ "$unamestr" == 'Darwin' ]]; then
|
||||
platform='Mac'
|
||||
fi
|
||||
echo "platform: $platform"
|
||||
|
||||
if [ "$platform" == "Mac" ];
|
||||
then
|
||||
sed -i "" "s/TESTS_CONFIG_LOCATION =.*/TESTS_CONFIG_LOCATION = \'chaos_objects\/${CHAOS_TYPE/-/_}\/'/g" constants.py
|
||||
sed -i "" "s/ALL_CHAOS_YAMLS =.*/ALL_CHAOS_YAMLS = \'chaos_${POD_NAME}_${CHAOS_TYPE/-/_}.yaml\'/g" constants.py
|
||||
sed -i "" "s/RELEASE_NAME =.*/RELEASE_NAME = \'${RELEASE_NAME}\'/g" constants.py
|
||||
else
|
||||
sed -i "s/TESTS_CONFIG_LOCATION =.*/TESTS_CONFIG_LOCATION = \'chaos_objects\/${CHAOS_TYPE/-/_}\/'/g" constants.py
|
||||
sed -i "s/ALL_CHAOS_YAMLS =.*/ALL_CHAOS_YAMLS = \'chaos_${POD_NAME}_${CHAOS_TYPE/-/_}.yaml\'/g" constants.py
|
||||
sed -i "s/RELEASE_NAME =.*/RELEASE_NAME = \'${RELEASE_NAME}\'/g" constants.py
|
||||
fi
|
||||
@@ -0,0 +1,8 @@
|
||||
|
||||
# Exit immediately for non zero status
|
||||
set -e
|
||||
release=${1:-"milvus-chaos"}
|
||||
ns=${2:-"chaos-testing"}
|
||||
helm uninstall ${release} -n=${ns}
|
||||
kubectl delete pvc -l release=${release} -n=${ns}
|
||||
kubectl delete pvc -l app.kubernetes.io/instance=${release} -n=${ns}
|
||||
@@ -0,0 +1,30 @@
|
||||
|
||||
# Exit immediately for non zero status
|
||||
set -e
|
||||
release=${1:-"milvus-chaos"}
|
||||
ns=${2:-"chaos-testing"}
|
||||
kubectl delete milvus ${release} -n=${ns} || echo "delete milvus ${release} failed"
|
||||
|
||||
# uninstall helm release
|
||||
helm_release_list=('minio' 'etcd' 'kafka' 'pulsar')
|
||||
for helm_release in ${helm_release_list[*]}; do
|
||||
echo "unistall helm release ${release}-${helm_release}"
|
||||
helm uninstall ${release}-${helm_release} -n=${ns} || echo "delete helm release ${release}-${helm_release} failed"
|
||||
done
|
||||
# delete pvc for storage
|
||||
pvc_list=('minio')
|
||||
for pvc in ${pvc_list[*]}; do
|
||||
echo "delete pvc with label release=${release}-${pvc}"
|
||||
kubectl delete pvc -l release=${release}-${pvc} -n=${ns} || echo "delete pvc with label release=${release}-${pvc} failed"
|
||||
done
|
||||
|
||||
# delete pvc of etcd and message queue
|
||||
pvc_list=('etcd' 'kafka' 'pulsar')
|
||||
for pvc in ${pvc_list[*]}; do
|
||||
echo "delete pvc with label app.kubernetes.io/instance=${release}-${pvc}"
|
||||
kubectl delete pvc -l app.kubernetes.io/instance=${release}-${pvc} -n=${ns} || echo "delete pvc with label release=${release}-${pvc} failed"
|
||||
done
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,138 @@
|
||||
# Copyright (C) 2019-2020 Zilliz. All rights reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
# is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||
# or implied. See the License for the specific language governing permissions and limitations under the License.
|
||||
|
||||
from collections import defaultdict
|
||||
import random
|
||||
import numpy as np
|
||||
import time
|
||||
import argparse
|
||||
from pymilvus import (
|
||||
connections, list_collections,
|
||||
FieldSchema, CollectionSchema, DataType,
|
||||
Collection, utility
|
||||
)
|
||||
TIMEOUT = 120
|
||||
|
||||
|
||||
def hello_milvus(collection_name):
|
||||
import time
|
||||
# create collection
|
||||
dim = 128
|
||||
default_fields = [
|
||||
FieldSchema(name="int64", dtype=DataType.INT64, is_primary=True),
|
||||
FieldSchema(name="float", dtype=DataType.FLOAT),
|
||||
FieldSchema(name="varchar", dtype=DataType.VARCHAR, max_length=65535),
|
||||
FieldSchema(name="float_vector", dtype=DataType.FLOAT_VECTOR, dim=dim)
|
||||
]
|
||||
default_schema = CollectionSchema(fields=default_fields, description="test collection")
|
||||
if utility.has_collection(collection_name):
|
||||
print("collection is exist")
|
||||
collection = Collection(name=collection_name)
|
||||
default_schema = collection.schema
|
||||
dim = [field.params['dim'] for field in default_schema.fields if field.dtype in [101, 102]][0]
|
||||
print(f"\nCreate collection...")
|
||||
collection = Collection(name=collection_name, schema=default_schema)
|
||||
# insert data
|
||||
nb = 3000
|
||||
vectors = [[random.random() for _ in range(dim)] for _ in range(nb)]
|
||||
t0 = time.time()
|
||||
|
||||
collection.insert(
|
||||
[
|
||||
[i for i in range(nb)],
|
||||
[np.float32(i) for i in range(nb)],
|
||||
[str(i) for i in range(nb)],
|
||||
vectors
|
||||
]
|
||||
)
|
||||
t1 = time.time()
|
||||
print(f"\nInsert {nb} vectors cost {t1 - t0:.4f} seconds")
|
||||
|
||||
t0 = time.time()
|
||||
print(f"\nGet collection entities...")
|
||||
collection.flush()
|
||||
print(collection.num_entities)
|
||||
t1 = time.time()
|
||||
print(f"\nGet collection entities cost {t1 - t0:.4f} seconds")
|
||||
|
||||
# create index and load table
|
||||
default_index = {"index_type": "IVF_SQ8", "metric_type": "L2", "params": {"nlist": 64}}
|
||||
print(f"\nCreate index...")
|
||||
t0 = time.time()
|
||||
collection.create_index(field_name="float_vector", index_params=default_index)
|
||||
t1 = time.time()
|
||||
print(f"\nCreate index cost {t1 - t0:.4f} seconds")
|
||||
print("\nGet replicas number")
|
||||
try:
|
||||
replicas_info = collection.get_replicas()
|
||||
replica_number = len(replicas_info.groups)
|
||||
print(f"\nReplicas number is {replica_number}")
|
||||
except Exception as e:
|
||||
print(str(e))
|
||||
replica_number = 1
|
||||
print(f"\nload collection...")
|
||||
t0 = time.time()
|
||||
collection.load(replica_number=replica_number)
|
||||
t1 = time.time()
|
||||
print(f"\nload collection cost {t1 - t0:.4f} seconds")
|
||||
|
||||
# load and search
|
||||
topK = 5
|
||||
search_params = {"metric_type": "L2", "params": {"nprobe": 10}}
|
||||
t0 = time.time()
|
||||
print(f"\nSearch...")
|
||||
# define output_fields of search result
|
||||
res = collection.search(
|
||||
vectors[-2:], "float_vector", search_params, topK,
|
||||
"int64 > 100", output_fields=["int64", "float"], timeout=TIMEOUT
|
||||
)
|
||||
t1 = time.time()
|
||||
print(f"search cost {t1 - t0:.4f} seconds")
|
||||
# show result
|
||||
for hits in res:
|
||||
for hit in hits:
|
||||
# Get value of the random value field for search result
|
||||
print(hit, hit.entity.get("float"))
|
||||
|
||||
# query
|
||||
expr = "int64 in [2,4,6,8]"
|
||||
output_fields = ["int64", "float"]
|
||||
res = collection.query(expr, output_fields, timeout=TIMEOUT)
|
||||
sorted_res = sorted(res, key=lambda k: k['int64'])
|
||||
for r in sorted_res:
|
||||
print(r)
|
||||
|
||||
|
||||
parser = argparse.ArgumentParser(description='host ip')
|
||||
parser.add_argument('--host', type=str, default='127.0.0.1', help='host ip')
|
||||
args = parser.parse_args()
|
||||
# add time stamp
|
||||
print(f"\nStart time: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))}")
|
||||
# create connection
|
||||
connections.connect(host=args.host, port="19530")
|
||||
print("\nList collections...")
|
||||
all_collections = list_collections()
|
||||
print(all_collections)
|
||||
all_collections = [c_name for c_name in all_collections if "Checker" in c_name]
|
||||
m = defaultdict(list)
|
||||
for c_name in all_collections:
|
||||
prefix = c_name.split("_")[0]
|
||||
if len(m[prefix]) <= 5:
|
||||
m[prefix].append(c_name)
|
||||
selected_collections = []
|
||||
for v in m.values():
|
||||
selected_collections.extend(v)
|
||||
print("selected_collections is")
|
||||
print(selected_collections)
|
||||
cnt = 0
|
||||
for collection_name in selected_collections:
|
||||
print(f"check collection {collection_name}")
|
||||
hello_milvus(collection_name)
|
||||
@@ -0,0 +1,41 @@
|
||||
import requests
|
||||
requests.packages.urllib3.disable_warnings() # noqa
|
||||
url = "https://api.github.com/repos/milvus-io/milvus/actions/workflows"
|
||||
|
||||
payload = {}
|
||||
token = "" # your token
|
||||
headers = {
|
||||
"Authorization": f"token {token}",
|
||||
}
|
||||
|
||||
response = requests.request("GET", url, headers=headers, data=payload)
|
||||
|
||||
|
||||
def analysis_workflow(workflow_name, workflow_response):
|
||||
"""
|
||||
Used to count the number of successes and failures of jobs in the chaos test workflow,
|
||||
so as to understand the robustness of different components(each job represents a component).
|
||||
"""
|
||||
workflow_id = [w["id"] for w in workflow_response.json()["workflows"] if workflow_name in w["name"]][0]
|
||||
runs_response = requests.request("GET", f"https://api.github.com/repos/milvus-io/milvus/actions/workflows/{workflow_id}/runs", headers=headers, data=payload, verify=False)
|
||||
workflow_runs = [r["id"] for r in runs_response.json()["workflow_runs"] if r["status"] == "completed" and r["event"] == "schedule"]
|
||||
results = {}
|
||||
for run in workflow_runs:
|
||||
job_url = f"https://api.github.com/repos/milvus-io/milvus/actions/runs/{run}/jobs"
|
||||
job_response = requests.request("GET", job_url, headers=headers, data=payload, verify=False)
|
||||
for r in job_response.json()["jobs"]:
|
||||
if r["name"] not in results:
|
||||
results[r["name"]] = {"success": 0, "failure": 0}
|
||||
if r["status"] == "completed" and r["conclusion"] == "success":
|
||||
results[r["name"]]["success"] += 1
|
||||
elif r["status"] == "completed" and r["conclusion"] != "success":
|
||||
results[r["name"]]["failure"] += 1
|
||||
return results
|
||||
|
||||
|
||||
for workflow in ["Pod Kill"]:
|
||||
result = analysis_workflow(workflow, response)
|
||||
print(f"{workflow}:")
|
||||
for k, v in result.items():
|
||||
print(f"{k} success: {v['success']}, failure: {v['failure']}")
|
||||
print("\n")
|
||||
Reference in New Issue
Block a user