Explorar o código

modify generate bf16 and f16 vector. (#1037)

Signed-off-by: yongpengli-z <yongpeng.li@zilliz.com>
yongpengli-z hai 8 meses
pai
achega
ca633f6f21
Modificáronse 36 ficheiros con 1077 adicións e 95 borrados
  1. 5 5
      .github/workflows/java_sdk_ci_test.yaml
  2. 1 1
      tests/milvustestv2/pom.xml
  3. 4 4
      tests/milvustestv2/src/main/java/com/zilliz/milvustestv2/common/BaseTest.java
  4. 5 0
      tests/milvustestv2/src/main/java/com/zilliz/milvustestv2/common/CommonData.java
  5. 40 43
      tests/milvustestv2/src/main/java/com/zilliz/milvustestv2/common/CommonFunction.java
  6. 245 0
      tests/milvustestv2/src/main/java/com/zilliz/milvustestv2/utils/Float16Utils.java
  7. 1 1
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/alias/CreateAliasTest.java
  8. 1 1
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/collection/CreateCollectionTest.java
  9. 3 3
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/collection/GetCollectionStatsTest.java
  10. 41 0
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/database/AlterDatabaseTest.java
  11. 54 0
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/database/CreateDatabaseTest.java
  12. 33 0
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/database/DescribeDatabaseTest.java
  13. 30 0
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/database/DropDatabaseTest.java
  14. 14 10
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/index/CreateIndexTest.java
  15. 1 1
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/index/DescribeIndexTest.java
  16. 1 1
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/index/DropIndexTest.java
  17. 9 1
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/index/ListIndexesTest.java
  18. 1 1
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/loadRelease/LoadCollectionTest.java
  19. 1 1
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/loadRelease/LoadPartitionsTest.java
  20. 1 1
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/loadRelease/ReleaseCollectionTest.java
  21. 1 1
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/loadRelease/ReleasePartitionsTest.java
  22. 63 0
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/vectorOperation/DeleteTest.java
  23. 1 1
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/vectorOperation/GetTest.java
  24. 2 2
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/vectorOperation/InsertTest.java
  25. 8 8
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/vectorOperation/SearchTest.java
  26. 12 8
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/vectorOperation/UpsertTest.java
  27. 127 0
      tests/milvustestv2/src/test/java/resources/cluster-values.yaml
  28. 52 0
      tests/milvustestv2/src/test/java/resources/docker-compose.yml
  29. 230 0
      tests/milvustestv2/src/test/java/resources/scripts/docker_image_find_tag.sh
  30. 8 0
      tests/milvustestv2/src/test/java/resources/scripts/install_milvus.sh
  31. 13 0
      tests/milvustestv2/src/test/java/resources/scripts/install_milvus_cluster.sh
  32. 12 0
      tests/milvustestv2/src/test/java/resources/scripts/install_milvus_standalone.sh
  33. 25 0
      tests/milvustestv2/src/test/java/resources/scripts/modify_config.sh
  34. 8 0
      tests/milvustestv2/src/test/java/resources/scripts/uninstall_milvus.sh
  35. 23 0
      tests/milvustestv2/src/test/java/resources/standalone-values.yaml
  36. 1 1
      tests/milvustestv2/src/test/resources/run.properties

+ 5 - 5
.github/workflows/java_sdk_ci_test.yaml

@@ -15,7 +15,7 @@ jobs:
       - name: Deploy Milvus
         timeout-minutes: 15
         shell: bash
-        working-directory: tests/milvustest/src/test/java/resources
+        working-directory: tests/milvustestv2/src/test/java/resources
         run: |
           echo "deploy milvus"
           ls
@@ -34,10 +34,10 @@ jobs:
       - name: Test
         timeout-minutes: 60
         shell: bash
-        working-directory: tests/milvustest
+        working-directory: tests/milvustestv2
         run: |
           echo "run testcases"
-          mvn clean test -DsuiteXmlFile=testng.xml
+          mvn clean test -Dsurefire.suiteXmlFiles=testng.xml
 
       - name: Upload logs
         if: ${{ always() }}
@@ -45,5 +45,5 @@ jobs:
         with:
           name: logs-java-sdk-ci-test
           path: |
-            tests/milvustest/target/surefire-reports
-            tests/milvustest/target/allure-results 
+            tests/milvustestv2/target/surefire-reports
+            tests/milvustestv2/target/allure-results 

+ 1 - 1
tests/milvustestv2/pom.xml

@@ -107,7 +107,7 @@
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
-                <version>2.6.7</version>
+                <version>2.7.10</version>
                 <configuration>
                     <excludes>
                         <exclude>

+ 4 - 4
tests/milvustestv2/src/main/java/com/zilliz/milvustestv2/common/BaseTest.java

@@ -73,7 +73,7 @@ public class BaseTest extends AbstractTestNGSpringContextTests {
         CommonFunction.createNewCollection(CommonData.dim,CommonData.defaultFloatVectorCollection, DataType.FloatVector);
         milvusClientV2.createAlias(CreateAliasReq.builder().collectionName(CommonData.defaultFloatVectorCollection).alias(CommonData.alias).build());
         // insert data
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
         InsertResp insert = milvusClientV2.insert(InsertReq.builder().collectionName(CommonData.defaultFloatVectorCollection).data(jsonObjects).build());
         CommonFunction.createVectorIndex(CommonData.defaultFloatVectorCollection,CommonData.fieldFloatVector, IndexParam.IndexType.AUTOINDEX, IndexParam.MetricType.L2);
         milvusClientV2.loadCollection(LoadCollectionReq.builder().collectionName(CommonData.defaultFloatVectorCollection).build());
@@ -82,9 +82,9 @@ public class BaseTest extends AbstractTestNGSpringContextTests {
        CommonFunction.createPartition(CommonData.defaultFloatVectorCollection,CommonData.partitionNameA);
        CommonFunction.createPartition(CommonData.defaultFloatVectorCollection,CommonData.partitionNameB);
        CommonFunction.createPartition(CommonData.defaultFloatVectorCollection,CommonData.partitionNameC);
-        List<JsonObject> jsonObjectsA = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
-        List<JsonObject> jsonObjectsB = CommonFunction.generateDefaultData(CommonData.numberEntities*2, CommonData.dim,DataType.FloatVector);
-        List<JsonObject> jsonObjectsC = CommonFunction.generateDefaultData(CommonData.numberEntities*3, CommonData.dim,DataType.FloatVector);
+        List<JsonObject> jsonObjectsA = CommonFunction.generateDefaultData(0,CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
+        List<JsonObject> jsonObjectsB = CommonFunction.generateDefaultData(0,CommonData.numberEntities*2, CommonData.dim,DataType.FloatVector);
+        List<JsonObject> jsonObjectsC = CommonFunction.generateDefaultData(0,CommonData.numberEntities*3, CommonData.dim,DataType.FloatVector);
        milvusClientV2.insert(InsertReq.builder().collectionName(CommonData.defaultFloatVectorCollection).partitionName(CommonData.partitionNameA).data(jsonObjectsA).build());
        milvusClientV2.insert(InsertReq.builder().collectionName(CommonData.defaultFloatVectorCollection).partitionName(CommonData.partitionNameB).data(jsonObjectsB).build());
        milvusClientV2.insert(InsertReq.builder().collectionName(CommonData.defaultFloatVectorCollection).partitionName(CommonData.partitionNameC).data(jsonObjectsC).build());

+ 5 - 0
tests/milvustestv2/src/main/java/com/zilliz/milvustestv2/common/CommonData.java

@@ -6,6 +6,7 @@ package com.zilliz.milvustestv2.common;
  */
 public class CommonData {
     public static long numberEntities=2000;
+    public static long batchSize=1000;
     public static int dim=128;
     public static String defaultFloatVectorCollection="FloatVectorCollection";
     public static String defaultBinaryVectorCollection="BinaryVectorCollection";
@@ -48,6 +49,10 @@ public class CommonData {
 
     public static String roleName="role02";
 
+    public static String databaseName="database01";
+    public static String databaseName2="database02";
+
+
 
 
 }

+ 40 - 43
tests/milvustestv2/src/main/java/com/zilliz/milvustestv2/common/CommonFunction.java

@@ -8,6 +8,7 @@ import com.zilliz.milvustestv2.utils.GenerateUtil;
 
 import com.zilliz.milvustestv2.utils.JsonObjectUtil;
 import com.zilliz.milvustestv2.utils.MathUtil;
+import io.milvus.common.utils.Float16Utils;
 import io.milvus.v2.common.ConsistencyLevel;
 import io.milvus.v2.common.DataType;
 import io.milvus.v2.common.IndexParam;
@@ -162,11 +163,11 @@ public class CommonFunction {
      * @param dim 维度
      * @return List<JsonObject>
      */
-    public static List<JsonObject> generateDefaultData(long num, int dim, DataType vectorType) {
+    public static List<JsonObject> generateDefaultData(long startId,long num, int dim, DataType vectorType) {
         List<JsonObject> jsonList = new ArrayList<>();
         Random ran = new Random();
         Gson gson = new Gson();
-        for (long i = 0; i < num; i++) {
+        for (long i = startId; i < (num+startId); i++) {
             JsonObject row = new JsonObject();
             row.addProperty(CommonData.fieldInt64, i);
             row.addProperty(CommonData.fieldInt32, (int) i % 32767);
@@ -343,6 +344,20 @@ public class CommonFunction {
                 .build());
     }
 
+    /**
+     *  创建一条float32的向量
+     * @param dimension 维度
+     * @return List<Float>
+     */
+    public static List<Float> generateFloatVector(int dimension) {
+        Random ran = new Random();
+        List<Float> vector = new ArrayList<>();
+        for (int i = 0; i < dimension; ++i) {
+            vector.add(ran.nextFloat());
+        }
+        return vector;
+    }
+
     /**
      * 创建一条Sparse向量数据
      *
@@ -380,18 +395,8 @@ public class CommonFunction {
      * @return ByteBuffer
      */
     public static ByteBuffer generateFloat16Vector(int dim) {
-        Random ran = new Random();
-        int byteCount = dim * 2;
-        ByteBuffer vector = ByteBuffer.allocate(byteCount);
-        for (int i = 0; i < dim; ++i) {
-            short halfFloatValue = MathUtil.floatToFloat16(ran.nextInt(100) + 0.1f);
-            ByteBuffer buffer = ByteBuffer.allocate(2);
-            buffer.putShort(halfFloatValue);
-            buffer.flip();
-            vector.put(buffer.get(0));
-            vector.put(buffer.get(1));
-        }
-        return vector;
+        List<Float> originalVector = generateFloatVector(dim);
+        return Float16Utils.f32VectorToFp16Buffer(originalVector);
     }
 
     /**
@@ -416,22 +421,8 @@ public class CommonFunction {
      * @return ByteBuffer
      */
     public static ByteBuffer generateBF16Vector(int dim) {
-        Random ran = new Random();
-        float randomFloat;
-        int byteCount = dim * 2;
-        ByteBuffer vector = ByteBuffer.allocate(byteCount);
-        for (int i = 0; i < dim; ++i) {
-            do {
-                randomFloat = ran.nextFloat();
-            } while (Float.isInfinite(randomFloat));
-            short halfFloatValue = MathUtil.floatToBF16(randomFloat);
-            ByteBuffer buffer = ByteBuffer.allocate(2);
-            buffer.putShort(halfFloatValue);
-            buffer.flip();
-            vector.put(buffer.get(0));
-            vector.put(buffer.get(1));
-        }
-        return vector;
+        List<Float> originalVector = generateFloatVector(dim);
+        return Float16Utils.f32VectorToBf16Buffer(originalVector);
     }
 
     /**
@@ -573,12 +564,19 @@ public class CommonFunction {
         if (ifLoad) {
             BaseTest.milvusClientV2.loadCollection(LoadCollectionReq.builder().collectionName(collectionName).build());
         }
-        List<JsonObject> jsonObjects = generateDefaultData(numberEntities, CommonData.dim, vectorType);
-        InsertResp insert = BaseTest.milvusClientV2.insert(InsertReq.builder().collectionName(collectionName).data(jsonObjects).build());
-        System.out.println(insert);
+        insertIntoCollectionByBatch(collectionName,numberEntities,CommonData.dim,vectorType);
 
     }
 
+    public static void insertIntoCollectionByBatch(String collectionName,long num,int dim,DataType vectorType){
+        long insertRounds = (num / CommonData.batchSize) ==0?1:(num / CommonData.batchSize);
+        for (int i = 0; i < insertRounds; i++) {
+            System.out.println("insert batch:"+(i+1));
+            List<JsonObject> jsonObjects = generateDefaultData(i*CommonData.batchSize, CommonData.batchSize, dim, vectorType);
+            InsertResp insert = BaseTest.milvusClientV2.insert(InsertReq.builder().collectionName(collectionName).data(jsonObjects).build());
+        }
+    }
+
     /**
      * 提供search时候的向量参数
      *
@@ -874,11 +872,11 @@ public class CommonFunction {
      * @param collection     collection name
      * @param fieldParamList scalar fields
      */
-    public static void createScalarCommonIndex(String collection, List<FieldParam> FieldParamList) {
+    public static void createScalarCommonIndex(String collection, List<FieldParam> fieldParamList) {
         List<IndexParam> indexParamList = new ArrayList<>();
-        for (FieldParam FieldParam : FieldParamList) {
-            IndexParam.IndexType indexType = FieldParam.getIndextype();
-            String fieldName = FieldParam.getFieldName();
+        for (FieldParam fieldParam : fieldParamList) {
+            IndexParam.IndexType indexType = fieldParam.getIndextype();
+            String fieldName = fieldParam.getFieldName();
 
             IndexParam indexParam = IndexParam.builder()
                     .fieldName(fieldName)
@@ -894,14 +892,13 @@ public class CommonFunction {
                 .build());
     }
 
-    /**
-     * Drop Scalar Indexes
+    /** Drop Scalar Indexes
      *
-     * @param collection     collection name
-     * @param fieldParamList scalar fields
+     * @param collection collection name
+     * @param fieldParamList FieldParamList
      */
-    public static void dropScalarCommonIndex(String collection, List<FieldParam> FieldParamList) {
-        List<String> fieldNames = FieldParamList.stream().map(FieldParam::getFieldName).collect(Collectors.toList());
+    public static void dropScalarCommonIndex(String collection, List<FieldParam> fieldParamList) {
+        List<String> fieldNames = fieldParamList.stream().map(FieldParam::getFieldName).collect(Collectors.toList());
         fieldNames.forEach(x -> BaseTest.milvusClientV2.dropIndex(DropIndexReq.builder()
                 .collectionName(collection)
                 .fieldName(x)

+ 245 - 0
tests/milvustestv2/src/main/java/com/zilliz/milvustestv2/utils/Float16Utils.java

@@ -0,0 +1,245 @@
+package com.zilliz.milvustestv2.utils;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.ShortBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
+public class Float16Utils {
+    /**
+     * Converts a float32 into bf16. May not produce correct values for subnormal floats.
+     *
+     * This method is copied from microsoft ONNX Runtime:
+     * https://github.com/microsoft/onnxruntime/blob/main/java/src/main/jvm/ai/onnxruntime/platform/Fp16Conversions.java
+     *
+     * @param input a standard float32 value which will be converted to a bfloat16 value
+     * @return a short value to store the bfloat16 value
+     */
+    public static short floatToBf16(float input) {
+        int bits = Float.floatToIntBits(input);
+        int lsb = (bits >> 16) & 1;
+        int roundingBias = 0x7fff + lsb;
+        bits += roundingBias;
+        return (short) (bits >> 16);
+    }
+
+    /**
+     * Upcasts a bf16 value stored in a short into a float32 value.
+     *
+     * This method is copied from microsoft ONNX Runtime:
+     * https://github.com/microsoft/onnxruntime/blob/main/java/src/main/jvm/ai/onnxruntime/platform/Fp16Conversions.java
+     *
+     * @param input a bfloat16 value which will be converted to a float32 value
+     * @return a float32 value converted from a bfloat16
+     */
+    public static float bf16ToFloat(short input) {
+        int bits = input << 16;
+        return Float.intBitsToFloat(bits);
+    }
+
+    /**
+     * Rounds a float32 value to a fp16 stored in a short.
+     *
+     * This method is copied from microsoft ONNX Runtime:
+     * https://github.com/microsoft/onnxruntime/blob/main/java/src/main/jvm/ai/onnxruntime/platform/Fp16Conversions.java
+     *
+     * @param input a standard float32 value which will be converted to a float16 value
+     * @return a short value to store the float16 value
+     */
+    public static short floatToFp16(float input) {
+        // Port of MLAS_Float2Half from onnxruntime/core/mlas/inc/mlas_float16.h
+        int bits = Float.floatToIntBits(input);
+        final int F32_INFINITY = Float.floatToIntBits(Float.POSITIVE_INFINITY);
+        final int F16_MAX = (127 + 16) << 23;
+        final int DENORM_MAGIC = ((127 - 15) + (23 - 10) + 1) << 23;
+        final int SIGN_MASK = 0x80000000;
+        final int ROUNDING_CONST = ((15 - 127) << 23) + 0xfff;
+
+        int sign = bits & SIGN_MASK;
+        // mask out sign bit
+        bits ^= sign;
+
+        short output;
+        if (bits >= F16_MAX) {
+            // Inf or NaN (all exponent bits set)
+            output = (bits > F32_INFINITY) ? (short) 0x7e00 : (short) 0x7c00;
+        } else {
+            if (bits < (113 << 23)) {
+                // Subnormal or zero
+                // use a magic value to align our 10 mantissa bits at the bottom of
+                // the float. as long as FP addition is round-to-nearest-even this
+                // just works.
+                float tmp = Float.intBitsToFloat(bits) + Float.intBitsToFloat(DENORM_MAGIC);
+
+                // and one integer subtract of the bias later, we have our final float!
+                output = (short) (Float.floatToIntBits(tmp) - DENORM_MAGIC);
+            } else {
+                int mant_odd = (bits >> 13) & 1; // resulting mantissa is odd
+
+                // update exponent, rounding bias part 1
+                bits += ROUNDING_CONST;
+                // rounding bias part 2
+                bits += mant_odd;
+                // take the bits!
+                output = (short) (bits >> 13);
+            }
+        }
+
+        // Add the sign back in
+        output = (short) (output | ((short) (sign >> 16)));
+
+        return output;
+    }
+
+    /**
+     * Upcasts a fp16 value stored in a short to a float32 value.
+     *
+     * This method is copied from microsoft ONNX Runtime:
+     * https://github.com/microsoft/onnxruntime/blob/main/java/src/main/jvm/ai/onnxruntime/platform/Fp16Conversions.java
+     *
+     * @param input a float16 value which will be converted to a float32 value
+     * @return a float32 value converted from a float16 value
+     */
+    public static float fp16ToFloat(short input) {
+        // Port of MLAS_Half2Float from onnxruntime/core/mlas/inc/mlas_float16.h
+        final int MAGIC = 113 << 23;
+        // exponent mask after shift
+        final int SHIFTED_EXP = 0x7c00 << 13;
+
+        // exponent/mantissa bits
+        int bits = (input & 0x7fff) << 13;
+        // just the exponent
+        final int exp = SHIFTED_EXP & bits;
+        // exponent adjust
+        bits += (127 - 15) << 23;
+
+        // handle exponent special cases
+        if (exp == SHIFTED_EXP) {
+            // Inf/NaN?
+            // extra exp adjust
+            bits += (128 - 16) << 23;
+        } else if (exp == 0) {
+            // Zero/Denormal?
+            // extra exp adjust
+            bits += (1 << 23);
+            // renormalize
+            float tmp = Float.intBitsToFloat(bits) - Float.intBitsToFloat(MAGIC);
+            bits = Float.floatToIntBits(tmp);
+        }
+
+        // sign bit
+        bits |= (input & 0x8000) << 16;
+
+        return Float.intBitsToFloat(bits);
+    }
+
+    /**
+     * Rounds a float32 vector to bf16 values, and stores into a ByteBuffer.
+     *
+     * @param vector a float32 vector
+     * @return <code>ByteBuffer</code> the vector is converted to bfloat16 values and stored into a ByteBuffer
+     */
+    public static ByteBuffer f32VectorToBf16Buffer(List<Float> vector) {
+        if (vector.isEmpty()) {
+            return null;
+        }
+
+        ByteBuffer buf = ByteBuffer.allocate(2 * vector.size());
+        buf.order(ByteOrder.LITTLE_ENDIAN); // milvus server stores fp16/bf16 vector as little endian
+        for (Float val : vector) {
+            short bf16 = floatToBf16(val);
+            buf.putShort(bf16);
+        }
+        return buf;
+    }
+
+    /**
+     * Converts a ByteBuffer to fp16 vector upcasts to float32 array.
+     *
+     * @param buf a buffer to store a float16 vector
+     * @return List of Float a float32 vector
+     */
+    public static List<Float> fp16BufferToVector(ByteBuffer buf) {
+        buf.rewind(); // reset the read position
+        List<Float> vector = new ArrayList<>();
+        ShortBuffer sbuf = buf.asShortBuffer();
+        for (int i = 0; i < sbuf.limit(); i++) {
+            float val = fp16ToFloat(sbuf.get(i));
+            vector.add(val);
+        }
+        return vector;
+    }
+
+    /**
+     * Rounds a float32 vector to fp16 values, and stores into a ByteBuffer.
+     *
+     * @param vector a float32 vector
+     * @return <code>ByteBuffer</code> the vector is converted to float16 values and stored in a ByteBuffer
+     */
+    public static ByteBuffer f32VectorToFp16Buffer(List<Float> vector) {
+        if (vector.isEmpty()) {
+            return null;
+        }
+
+        ByteBuffer buf = ByteBuffer.allocate(2 * vector.size());
+        buf.order(ByteOrder.LITTLE_ENDIAN); // milvus server stores fp16/bf16 vector as little endian
+        for (Float val : vector) {
+            short bf16 = floatToFp16(val);
+            buf.putShort(bf16);
+        }
+        return buf;
+    }
+
+    /**
+     * Converts a ByteBuffer to bf16 vector upcasts to float32 array.
+     *
+     * @param buf a buffer to store a bfloat16 vector
+     * @return List of Float the vector is converted to float32 values
+     */
+    public static List<Float> bf16BufferToVector(ByteBuffer buf) {
+        buf.rewind(); // reset the read position
+        List<Float> vector = new ArrayList<>();
+        ShortBuffer sbuf = buf.asShortBuffer();
+        for (int i = 0; i < sbuf.limit(); i++) {
+            float val = bf16ToFloat(sbuf.get(i));
+            vector.add(val);
+        }
+        return vector;
+    }
+
+    /**
+     * Stores a fp16/bf16 vector into a ByteBuffer.
+     *
+     * @param vector a float16 vector stored in a list of Short
+     * @return <code>ByteBuffer</code> a buffer to store the float16 vector
+     */
+    public static ByteBuffer f16VectorToBuffer(List<Short> vector) {
+        if (vector.isEmpty()) {
+            return null;
+        }
+
+        ByteBuffer buf = ByteBuffer.allocate(2 * vector.size());
+        buf.order(ByteOrder.LITTLE_ENDIAN); // milvus server stores fp16/bf16 vector as little endian
+        for (Short val : vector) {
+            buf.putShort(val);
+        }
+        return buf;
+    }
+
+    /**
+     * Converts a ByteBuffer to a fp16/bf16 vector stored in short array.
+     *
+     * @param buf a buffer to store a float16 vector
+     * @return List of Short the vector is converted to a list of Short, each Short value is a float16 value
+     */
+    public static List<Short> bufferToF16Vector(ByteBuffer buf) {
+        buf.rewind(); // reset the read position
+        List<Short> vector = new ArrayList<>();
+        ShortBuffer sbuf = buf.asShortBuffer();
+        for (int i = 0; i < sbuf.limit(); i++) {
+            vector.add(sbuf.get(i));
+        }
+        return vector;
+    }
+}

+ 1 - 1
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/alias/CreateAliasTest.java

@@ -33,7 +33,7 @@ public class CreateAliasTest extends BaseTest {
     public void providerCollection(){
         aliasName="a_"+ GenerateUtil.getRandomString(10);
         newCollectionName = CommonFunction.createNewCollection(CommonData.dim, null, DataType.FloatVector);
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
         milvusClientV2.insert(InsertReq.builder().collectionName(newCollectionName).data(jsonObjects).build());
         IndexParam indexParam = IndexParam.builder()
                 .fieldName(CommonData.fieldFloatVector)

+ 1 - 1
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/collection/CreateCollectionTest.java

@@ -170,7 +170,7 @@ public class CreateCollectionTest extends BaseTest {
         ListCollectionsResp listCollectionsResp = milvusClientV2.listCollections();
         Assert.assertTrue(listCollectionsResp.getCollectionNames().contains(collectionNameWithIndex));
         //insert
-        CommonFunction.generateDefaultData(100,CommonData.dim,DataType.FloatVector);
+        CommonFunction.generateDefaultData(0,100,CommonData.dim,DataType.FloatVector);
         // search
         SearchResp searchResp = CommonFunction.defaultSearch(collectionNameWithIndex);
         Assert.assertEquals(searchResp.getSearchResults().size(),10);

+ 3 - 3
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/collection/GetCollectionStatsTest.java

@@ -7,6 +7,7 @@ import com.zilliz.milvustestv2.common.CommonFunction;
 import io.milvus.v2.common.DataType;
 import io.milvus.v2.service.collection.request.DropCollectionReq;
 import io.milvus.v2.service.collection.request.GetCollectionStatsReq;
+import io.milvus.v2.service.collection.request.LoadCollectionReq;
 import io.milvus.v2.service.collection.response.GetCollectionStatsResp;
 import io.milvus.v2.service.vector.request.InsertReq;
 import org.testng.Assert;
@@ -26,8 +27,7 @@ public class GetCollectionStatsTest extends BaseTest {
     @BeforeClass(alwaysRun = true)
     public void providerCollection(){
         newCollectionName = CommonFunction.createNewCollection(CommonData.dim, null, DataType.FloatVector);
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
-        milvusClientV2.insert(InsertReq.builder().collectionName(newCollectionName).data(jsonObjects).build());
+        CommonFunction.createIndexAndInsertAndLoad(newCollectionName,DataType.FloatVector,true,CommonData.numberEntities);
     }
 
     @AfterClass(alwaysRun = true)
@@ -35,7 +35,7 @@ public class GetCollectionStatsTest extends BaseTest {
         milvusClientV2.dropCollection(DropCollectionReq.builder().collectionName(newCollectionName).build());
     }
 
-    @Test(description = "Get collection stats", groups = {"Smoke"})
+    @Test(description = "Get collection stats", groups = {"Smoke"},enabled = false)
     public void getCollectionStats(){
         GetCollectionStatsResp collectionStats = milvusClientV2.getCollectionStats(GetCollectionStatsReq.builder()
                 .collectionName(newCollectionName)

+ 41 - 0
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/database/AlterDatabaseTest.java

@@ -0,0 +1,41 @@
+package com.zilliz.milvustestv2.database;
+
+import com.zilliz.milvustestv2.common.BaseTest;
+import com.zilliz.milvustestv2.common.CommonData;
+import io.milvus.param.Constant;
+import io.milvus.v2.service.database.request.AlterDatabaseReq;
+import io.milvus.v2.service.database.request.CreateDatabaseReq;
+import io.milvus.v2.service.database.request.DescribeDatabaseReq;
+import io.milvus.v2.service.database.request.DropDatabaseReq;
+import io.milvus.v2.service.database.response.DescribeDatabaseResp;
+import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class AlterDatabaseTest extends BaseTest {
+    @BeforeClass(alwaysRun = true)
+    public void initTestData(){
+        milvusClientV2.createDatabase(CreateDatabaseReq.builder().databaseName(CommonData.databaseName).build());
+    }
+    @AfterClass(alwaysRun = true)
+    public void cleanTestData(){
+        milvusClientV2.dropDatabase(DropDatabaseReq.builder().databaseName(CommonData.databaseName).build());
+    }
+
+    @Test(description = "alter database",groups = {"Smoke"})
+    public void alterDatabase(){
+        Map<String,String> map1=new HashMap<>();
+        map1.put(Constant.DATABASE_REPLICA_NUMBER,"2");
+        milvusClientV2.alterDatabase(AlterDatabaseReq.builder()
+                .databaseName(CommonData.databaseName)
+                .properties(map1).build());
+        DescribeDatabaseResp describeDatabaseResp = milvusClientV2.describeDatabase(DescribeDatabaseReq.builder()
+                .databaseName(CommonData.databaseName).build());
+        Assert.assertEquals(describeDatabaseResp.getDatabaseName(),CommonData.databaseName);
+        Assert.assertEquals(describeDatabaseResp.getProperties().get(Constant.DATABASE_REPLICA_NUMBER),"2");
+    }
+}

+ 54 - 0
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/database/CreateDatabaseTest.java

@@ -0,0 +1,54 @@
+package com.zilliz.milvustestv2.database;
+
+import com.zilliz.milvustestv2.common.BaseTest;
+import com.zilliz.milvustestv2.common.CommonData;
+import com.zilliz.milvustestv2.common.CommonFunction;
+import io.milvus.v2.common.DataType;
+import io.milvus.v2.service.collection.request.DropCollectionReq;
+import io.milvus.v2.service.database.request.CreateDatabaseReq;
+import io.milvus.v2.service.database.request.DropDatabaseReq;
+import io.milvus.v2.service.database.response.ListDatabasesResp;
+import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+
+public class CreateDatabaseTest extends BaseTest {
+
+    @DataProvider(name = "differentCollection")
+    public Object[][] providerVectorType() {
+        return new Object[][]{
+                { DataType.FloatVector},
+                { DataType.BinaryVector},
+                { DataType.Float16Vector},
+                { DataType.BFloat16Vector},
+                { DataType.SparseFloatVector},
+        };
+    }
+
+    @AfterClass(alwaysRun = true)
+    public void cleanTestData(){
+        milvusClientV2.dropDatabase(DropDatabaseReq.builder().databaseName(CommonData.databaseName).build());
+    }
+
+    @Test(description = "Create database",groups = {"Smoke"})
+    public void createDatabase(){
+        milvusClientV2.createDatabase(CreateDatabaseReq.builder()
+                .databaseName(CommonData.databaseName).build());
+        ListDatabasesResp listDatabasesResp = milvusClientV2.listDatabases();
+        Assert.assertTrue(listDatabasesResp.getDatabaseNames().contains(CommonData.databaseName));
+    }
+
+    @Test(description = "Create database with same name repeatedly ",groups = {"Smoke"},dependsOnMethods = {"createDatabase"})
+    public void createDatabaseRepeatedly(){
+        try {
+            milvusClientV2.createDatabase(CreateDatabaseReq.builder()
+                    .databaseName(CommonData.databaseName).build());
+        } catch (Exception e) {
+            Assert.assertTrue(e.getMessage().contains("database already exist"));
+        }
+
+
+    }
+}

+ 33 - 0
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/database/DescribeDatabaseTest.java

@@ -0,0 +1,33 @@
+package com.zilliz.milvustestv2.database;
+
+import com.zilliz.milvustestv2.common.BaseTest;
+import com.zilliz.milvustestv2.common.CommonData;
+import io.milvus.v2.service.database.request.CreateDatabaseReq;
+import io.milvus.v2.service.database.request.DescribeDatabaseReq;
+import io.milvus.v2.service.database.request.DropDatabaseReq;
+import io.milvus.v2.service.database.response.DescribeDatabaseResp;
+import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+public class DescribeDatabaseTest extends BaseTest {
+
+    @BeforeClass(alwaysRun = true)
+    public void initTestData(){
+        milvusClientV2.createDatabase(CreateDatabaseReq.builder().databaseName(CommonData.databaseName).build());
+    }
+
+
+    @AfterClass(alwaysRun = true)
+    public void cleanTestData(){
+        milvusClientV2.dropDatabase(DropDatabaseReq.builder().databaseName(CommonData.databaseName).build());
+    }
+
+    @Test(description = "describe database",groups = {"Smoke"})
+    public void describeDatabase(){
+        DescribeDatabaseResp describeDatabaseResp = milvusClientV2.describeDatabase(DescribeDatabaseReq.builder()
+                .databaseName(CommonData.databaseName).build());
+        Assert.assertEquals(describeDatabaseResp.getDatabaseName(),CommonData.databaseName);
+    }
+}

+ 30 - 0
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/database/DropDatabaseTest.java

@@ -0,0 +1,30 @@
+package com.zilliz.milvustestv2.database;
+
+import com.zilliz.milvustestv2.common.BaseTest;
+import com.zilliz.milvustestv2.common.CommonData;
+import io.milvus.v2.service.database.request.CreateDatabaseReq;
+import io.milvus.v2.service.database.request.DescribeDatabaseReq;
+import io.milvus.v2.service.database.request.DropDatabaseReq;
+import io.milvus.v2.service.database.response.DescribeDatabaseResp;
+import org.testng.Assert;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+public class DropDatabaseTest extends BaseTest {
+    @BeforeClass(alwaysRun = true)
+    public void initTestData(){
+        milvusClientV2.createDatabase(CreateDatabaseReq.builder().databaseName(CommonData.databaseName).build());
+    }
+
+    @Test(description = "drop database",groups = {"Smoke"})
+    public void dropDatabase(){
+        milvusClientV2.dropDatabase(DropDatabaseReq.builder().databaseName(CommonData.databaseName).build());
+        try {
+            DescribeDatabaseResp describeDatabaseResp = milvusClientV2.describeDatabase(DescribeDatabaseReq.builder()
+                    .databaseName(CommonData.databaseName).build());
+        } catch (Exception e) {
+            Assert.assertTrue(e.getMessage().contains("database not found"));
+        }
+    }
+
+}

+ 14 - 10
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/index/CreateIndexTest.java

@@ -35,25 +35,25 @@ public class CreateIndexTest extends BaseTest {
     public Object[][] providerScalarIndex() {
         return new Object[][]{
                 {new ArrayList<FieldParam>() {{
-                    add(FieldParam.builder().fieldName(CommonData.fieldInt8).indextype(IndexParam.IndexType.BITMAP).build());
+//                    add(FieldParam.builder().fieldName(CommonData.fieldInt8).indextype(IndexParam.IndexType.BITMAP).build());
                     add(FieldParam.builder().fieldName(CommonData.fieldInt16).indextype(IndexParam.IndexType.STL_SORT).build());
                     add(FieldParam.builder().fieldName(CommonData.fieldInt64).indextype(IndexParam.IndexType.INVERTED).build());
                     add(FieldParam.builder().fieldName(CommonData.fieldVarchar).indextype(IndexParam.IndexType.TRIE).build());
                 }}
                 },
                 {new ArrayList<FieldParam>() {{
-                    add(FieldParam.builder().fieldName(CommonData.fieldInt16).indextype(IndexParam.IndexType.BITMAP).build());
+//                    add(FieldParam.builder().fieldName(CommonData.fieldInt16).indextype(IndexParam.IndexType.BITMAP).build());
                 }}
                 },
                 {new ArrayList<FieldParam>() {{
-                    add(FieldParam.builder().fieldName(CommonData.fieldInt32).indextype(IndexParam.IndexType.BITMAP).build());
+//                    add(FieldParam.builder().fieldName(CommonData.fieldInt32).indextype(IndexParam.IndexType.BITMAP).build());
                 }}
                 },
                 {new ArrayList<FieldParam>() {{
-                    add(FieldParam.builder().fieldName(CommonData.fieldInt64).indextype(IndexParam.IndexType.BITMAP).build());
+//                    add(FieldParam.builder().fieldName(CommonData.fieldInt64).indextype(IndexParam.IndexType.BITMAP).build());
                 }}
                 },
-                {new ArrayList<FieldParam>() {{
+/*                {new ArrayList<FieldParam>() {{
                     add(FieldParam.builder().fieldName(CommonData.fieldVarchar).indextype(IndexParam.IndexType.BITMAP).build());
                     add(FieldParam.builder().fieldName(CommonData.fieldInt8).indextype(IndexParam.IndexType.BITMAP).build());
                     add(FieldParam.builder().fieldName(CommonData.fieldInt16).indextype(IndexParam.IndexType.BITMAP).build());
@@ -62,14 +62,14 @@ public class CreateIndexTest extends BaseTest {
                     add(FieldParam.builder().fieldName(CommonData.fieldBool).indextype(IndexParam.IndexType.BITMAP).build());
                     add(FieldParam.builder().fieldName(CommonData.fieldArray).indextype(IndexParam.IndexType.BITMAP).build());
                 }}
-                },
+                },*/
         };
     }
 
     @BeforeClass(alwaysRun = true)
     public void providerCollection() {
         newCollectionName = CommonFunction.createNewCollection(CommonData.dim, null, DataType.FloatVector);
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities * 10, CommonData.dim, DataType.FloatVector);
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,CommonData.numberEntities * 10, CommonData.dim, DataType.FloatVector);
         milvusClientV2.insert(InsertReq.builder().collectionName(newCollectionName).data(jsonObjects).build());
     }
 
@@ -110,7 +110,7 @@ public class CreateIndexTest extends BaseTest {
                 .build());
     }
 
-    @Test(description = "Create scalar index", groups = {"Smoke"}, dependsOnMethods = {"createVectorIndex"})
+    @Test(description = "Create scalar index", groups = {"Smoke"}, dependsOnMethods = {"createVectorIndex"}, enabled = false)
     public void createMultiScalarIndex() {
         milvusClientV2.releaseCollection(ReleaseCollectionReq.builder().collectionName(newCollectionName).build());
         IndexParam indexParam1 = IndexParam.builder()
@@ -127,7 +127,7 @@ public class CreateIndexTest extends BaseTest {
                 .build();
         IndexParam indexParam4 = IndexParam.builder()
                 .fieldName(CommonData.fieldInt16)
-                .indexType(IndexParam.IndexType.BITMAP)
+//                .indexType(IndexParam.IndexType.BITMAP)
                 .build();
         milvusClientV2.createIndex(CreateIndexReq.builder()
                 .collectionName(newCollectionName)
@@ -138,7 +138,11 @@ public class CreateIndexTest extends BaseTest {
                 .build());
     }
 
-    @Test(description = "Create scalar index", groups = {"Smoke"}, dependsOnMethods = {"createVectorIndex"}, dataProvider = "multiScalar")
+    @Test(description = "Create scalar index",
+            groups = {"Smoke"},
+            dependsOnMethods = {"createVectorIndex"},
+            dataProvider = "multiScalar",
+            enabled = false)
     public void createAllBitmapIndex(List<FieldParam> FieldParamList) {
         milvusClientV2.releaseCollection(ReleaseCollectionReq.builder().collectionName(newCollectionName).build());
         CommonFunction.dropScalarCommonIndex(newCollectionName, FieldParamList);

+ 1 - 1
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/index/DescribeIndexTest.java

@@ -28,7 +28,7 @@ public class DescribeIndexTest extends BaseTest {
     @BeforeClass(alwaysRun = true)
     public void providerCollection(){
         newCollectionName = CommonFunction.createNewCollection(CommonData.dim, null, DataType.FloatVector);
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
         milvusClientV2.insert(InsertReq.builder().collectionName(newCollectionName).data(jsonObjects).build());
         IndexParam indexParam = IndexParam.builder()
                 .fieldName(CommonData.fieldFloatVector)

+ 1 - 1
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/index/DropIndexTest.java

@@ -26,7 +26,7 @@ public class DropIndexTest extends BaseTest {
     @BeforeClass(alwaysRun = true)
     public void providerCollection(){
         newCollectionName = CommonFunction.createNewCollection(CommonData.dim, null, DataType.FloatVector);
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
         milvusClientV2.insert(InsertReq.builder().collectionName(newCollectionName).data(jsonObjects).build());
         IndexParam indexParam = IndexParam.builder()
                 .fieldName(CommonData.fieldFloatVector)

+ 9 - 1
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/index/ListIndexesTest.java

@@ -28,7 +28,7 @@ public class ListIndexesTest extends BaseTest {
     @BeforeClass(alwaysRun = true)
     public void providerCollection(){
         newCollectionName = CommonFunction.createNewCollection(CommonData.dim, null, DataType.FloatVector);
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
         milvusClientV2.insert(InsertReq.builder().collectionName(newCollectionName).data(jsonObjects).build());
         IndexParam indexParam = IndexParam.builder()
                 .fieldName(CommonData.fieldFloatVector)
@@ -54,4 +54,12 @@ public class ListIndexesTest extends BaseTest {
         Assert.assertEquals(strings.get(0),CommonData.fieldFloatVector);
 
     }
+
+    @Test(description = "List index empty if no index exists",groups = {"Smoke"})
+    public void listIndexEmpty(){
+        String newCollection = CommonFunction.createNewCollection(CommonData.dim, null, DataType.FloatVector);
+        List<String> strings = milvusClientV2.listIndexes(ListIndexesReq.builder()
+                .collectionName(newCollection).build());
+        Assert.assertEquals(strings.size(),0);
+    }
 }

+ 1 - 1
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/loadRelease/LoadCollectionTest.java

@@ -31,7 +31,7 @@ public class LoadCollectionTest extends BaseTest {
     @BeforeClass(alwaysRun = true)
     public void providerCollection(){
         newCollectionName = CommonFunction.createNewCollection(CommonData.dim, null, DataType.FloatVector);
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
         milvusClientV2.insert(InsertReq.builder().collectionName(newCollectionName).data(jsonObjects).build());
         CommonFunction.createVectorIndex(newCollectionName,CommonData.fieldFloatVector, IndexParam.IndexType.HNSW, IndexParam.MetricType.L2);
     }

+ 1 - 1
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/loadRelease/LoadPartitionsTest.java

@@ -43,7 +43,7 @@ public class LoadPartitionsTest extends BaseTest {
                 .collectionName(newCollection)
                 .partitionName(CommonData.partitionName)
                 .build());
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
         milvusClientV2.insert(InsertReq.builder().collectionName(newCollection).partitionName(CommonData.partitionName).data(jsonObjects).build());
         CommonFunction.createVectorIndex(newCollection,CommonData.fieldFloatVector, IndexParam.IndexType.HNSW, IndexParam.MetricType.L2);
     }

+ 1 - 1
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/loadRelease/ReleaseCollectionTest.java

@@ -27,7 +27,7 @@ public class ReleaseCollectionTest extends BaseTest {
     @BeforeClass(alwaysRun = true)
     public void providerCollection(){
         newCollectionName = CommonFunction.createNewCollection(CommonData.dim, null, DataType.FloatVector);
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
         milvusClientV2.insert(InsertReq.builder().collectionName(newCollectionName).data(jsonObjects).build());
         CommonFunction.createVectorIndex(newCollectionName,CommonData.fieldFloatVector, IndexParam.IndexType.HNSW, IndexParam.MetricType.L2);
         milvusClientV2.loadCollection(LoadCollectionReq.builder()

+ 1 - 1
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/loadRelease/ReleasePartitionsTest.java

@@ -42,7 +42,7 @@ public class ReleasePartitionsTest extends BaseTest {
                 .collectionName(newCollection)
                 .partitionName(CommonData.partitionName)
                 .build());
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
         milvusClientV2.insert(InsertReq.builder().collectionName(newCollection).partitionName(CommonData.partitionName).data(jsonObjects).build());
         CommonFunction.createVectorIndex(newCollection,CommonData.fieldFloatVector, IndexParam.IndexType.HNSW, IndexParam.MetricType.L2);
         milvusClientV2.loadCollection(LoadCollectionReq.builder()

+ 63 - 0
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/vectorOperation/DeleteTest.java

@@ -1,16 +1,24 @@
 package com.zilliz.milvustestv2.vectorOperation;
 
+import com.google.common.collect.Lists;
 import com.zilliz.milvustestv2.common.BaseTest;
 import com.zilliz.milvustestv2.common.CommonData;
 import com.zilliz.milvustestv2.common.CommonFunction;
 import com.zilliz.milvustestv2.utils.GenerateUtil;
+import io.milvus.v2.common.ConsistencyLevel;
 import io.milvus.v2.common.DataType;
 import io.milvus.v2.common.IndexParam;
 import io.milvus.v2.service.collection.request.DropCollectionReq;
 import io.milvus.v2.service.collection.request.LoadCollectionReq;
 import io.milvus.v2.service.index.request.CreateIndexReq;
 import io.milvus.v2.service.vector.request.DeleteReq;
+import io.milvus.v2.service.vector.request.QueryReq;
+import io.milvus.v2.service.vector.request.SearchReq;
+import io.milvus.v2.service.vector.request.data.BaseVector;
 import io.milvus.v2.service.vector.response.DeleteResp;
+import io.milvus.v2.service.vector.response.QueryResp;
+import io.milvus.v2.service.vector.response.SearchResp;
+import org.apache.hadoop.yarn.webapp.hamlet2.Hamlet;
 import org.testng.Assert;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
@@ -18,6 +26,7 @@ import org.testng.annotations.Test;
 
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.List;
 
 /**
  * @Author yongpeng.li
@@ -71,4 +80,58 @@ public class DeleteTest extends BaseTest {
     }
 
 
+    @Test(description = "search after delete  ",groups = {"Smoke"})
+    public void searchAfterDelete(){
+        String newCollection = CommonFunction.createNewCollection(CommonData.dim, null, DataType.FloatVector);
+        CommonFunction.createIndexAndInsertAndLoad(newCollection,DataType.FloatVector,true,CommonData.numberEntities);
+        DeleteResp delete = milvusClientV2.delete(DeleteReq.builder()
+                .collectionName(newCollection)
+                .filter(CommonData.fieldInt64+" < 10 ")
+                .build());
+        Assert.assertEquals(delete.getDeleteCnt(),10);
+        //count
+        QueryResp query = milvusClientV2.query(QueryReq.builder()
+                .collectionName(newCollection)
+                .outputFields(Lists.newArrayList("*"))
+                .filter(CommonData.fieldInt64+" >= 0 ")
+                .consistencyLevel(ConsistencyLevel.STRONG).build());
+        Assert.assertEquals(CommonData.numberEntities-10, query.getQueryResults().size());
+
+        // search
+        List<BaseVector> data = CommonFunction.providerBaseVector(CommonData.nq, CommonData.dim, DataType.FloatVector);
+        SearchResp search = milvusClientV2.search(SearchReq.builder()
+                .collectionName(newCollection)
+                .filter(CommonData.fieldInt64+" < 10 ")
+                .outputFields(Lists.newArrayList("*"))
+                .consistencyLevel(ConsistencyLevel.STRONG)
+                .data(data)
+                .topK(CommonData.topK)
+                .build());
+        Assert.assertEquals(search.getSearchResults().size(), 1);
+        Assert.assertEquals(search.getSearchResults().get(0).size(), 0);
+
+        // insert deleted data
+        CommonFunction.createIndexAndInsertAndLoad(newCollection,DataType.FloatVector,true, 10L);
+        //count
+        QueryResp query2 = milvusClientV2.query(QueryReq.builder()
+                .collectionName(newCollection)
+                .outputFields(Lists.newArrayList("*"))
+                .filter(CommonData.fieldInt64+" >= 0 ")
+                .consistencyLevel(ConsistencyLevel.STRONG)
+                .build());
+        Assert.assertEquals(CommonData.numberEntities, query2.getQueryResults().size());
+        SearchResp search2 = milvusClientV2.search(SearchReq.builder()
+                .collectionName(newCollection)
+                .filter(CommonData.fieldInt64+" < 10 ")
+                .outputFields(Lists.newArrayList("*"))
+                .consistencyLevel(ConsistencyLevel.STRONG)
+                .data(data)
+                .topK(CommonData.topK)
+                .build());
+        Assert.assertEquals(search2.getSearchResults().size(), 1);
+        Assert.assertEquals(search2.getSearchResults().get(0).size(), CommonData.topK);
+        milvusClientV2.dropCollection(DropCollectionReq.builder()
+                .collectionName(newCollection).build());
+    }
+
 }

+ 1 - 1
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/vectorOperation/GetTest.java

@@ -29,7 +29,7 @@ public class GetTest extends BaseTest {
     @BeforeClass(alwaysRun = true)
     public void providerCollection(){
         newCollectionName = CommonFunction.createNewCollection(CommonData.dim, null, DataType.FloatVector);
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
         milvusClientV2.insert(InsertReq.builder().collectionName(newCollectionName).data(jsonObjects).build());
         IndexParam indexParam = IndexParam.builder()
                 .fieldName(CommonData.fieldFloatVector)

+ 2 - 2
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/vectorOperation/InsertTest.java

@@ -59,7 +59,7 @@ public class InsertTest extends BaseTest {
 
     @Test(description = "insert test", groups = {"Smoke"})
     public void insert() {
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim, DataType.FloatVector);
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,CommonData.numberEntities, CommonData.dim, DataType.FloatVector);
         InsertResp insert = milvusClientV2.insert(InsertReq.builder()
                 .data(jsonObjects)
                 .collectionName(newCollectionName)
@@ -80,7 +80,7 @@ public class InsertTest extends BaseTest {
     @Test(description = "insert different vector collection test", groups = {"Smoke"}, dataProvider = "VectorTypeList")
     public void insertIntoDiffVectorCollection(DataType dataType) {
         String newCollection = CommonFunction.createNewCollection(CommonData.dim, null, dataType);
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim, dataType);
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,CommonData.numberEntities, CommonData.dim, dataType);
         InsertResp insert = milvusClientV2.insert(InsertReq.builder()
                 .collectionName(newCollection)
                 .data(jsonObjects).build());

+ 8 - 8
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/vectorOperation/SearchTest.java

@@ -140,7 +140,7 @@ public class SearchTest extends BaseTest {
     @BeforeClass(alwaysRun = true)
     public void providerCollection() {
         newCollectionName = CommonFunction.createNewCollection(CommonData.dim, null, DataType.FloatVector);
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities * 10, CommonData.dim, DataType.FloatVector);
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,CommonData.numberEntities * 10, CommonData.dim, DataType.FloatVector);
         milvusClientV2.insert(InsertReq.builder().collectionName(newCollectionName).data(jsonObjects).build());
     }
 
@@ -165,13 +165,13 @@ public class SearchTest extends BaseTest {
 
         // Build Scalar Index
         List<FieldParam> FieldParamList = new ArrayList<FieldParam>() {{
-            add(FieldParam.builder().fieldName(CommonData.fieldVarchar).indextype(IndexParam.IndexType.BITMAP).build());
-            add(FieldParam.builder().fieldName(CommonData.fieldInt8).indextype(IndexParam.IndexType.BITMAP).build());
-            add(FieldParam.builder().fieldName(CommonData.fieldInt16).indextype(IndexParam.IndexType.BITMAP).build());
-            add(FieldParam.builder().fieldName(CommonData.fieldInt32).indextype(IndexParam.IndexType.BITMAP).build());
-            add(FieldParam.builder().fieldName(CommonData.fieldInt64).indextype(IndexParam.IndexType.BITMAP).build());
-            add(FieldParam.builder().fieldName(CommonData.fieldBool).indextype(IndexParam.IndexType.BITMAP).build());
-            add(FieldParam.builder().fieldName(CommonData.fieldArray).indextype(IndexParam.IndexType.BITMAP).build());
+//            add(FieldParam.builder().fieldName(CommonData.fieldVarchar).indextype(IndexParam.IndexType.BITMAP).build());
+//            add(FieldParam.builder().fieldName(CommonData.fieldInt8).indextype(IndexParam.IndexType.BITMAP).build());
+//            add(FieldParam.builder().fieldName(CommonData.fieldInt16).indextype(IndexParam.IndexType.BITMAP).build());
+//            add(FieldParam.builder().fieldName(CommonData.fieldInt32).indextype(IndexParam.IndexType.BITMAP).build());
+//            add(FieldParam.builder().fieldName(CommonData.fieldInt64).indextype(IndexParam.IndexType.BITMAP).build());
+//            add(FieldParam.builder().fieldName(CommonData.fieldBool).indextype(IndexParam.IndexType.BITMAP).build());
+//            add(FieldParam.builder().fieldName(CommonData.fieldArray).indextype(IndexParam.IndexType.BITMAP).build());
         }};
         CommonFunction.createScalarCommonIndex(newCollectionName, FieldParamList);
         log.info("Create Scalar index done{}, scalar index:{}", newCollectionName, FieldParamList);

+ 12 - 8
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/vectorOperation/UpsertTest.java

@@ -38,7 +38,7 @@ public class UpsertTest extends BaseTest {
     @BeforeClass(alwaysRun = true)
     public void providerCollection() {
         newCollectionName = CommonFunction.createNewCollection(CommonData.dim, null, DataType.FloatVector);
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim, DataType.FloatVector);
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,CommonData.numberEntities, CommonData.dim, DataType.FloatVector);
         milvusClientV2.insert(InsertReq.builder().collectionName(newCollectionName).data(jsonObjects).build());
     }
 
@@ -50,17 +50,20 @@ public class UpsertTest extends BaseTest {
     @DataProvider(name = "DifferentCollection")
     public Object[][] providerVectorType() {
         return new Object[][]{
-                {CommonData.defaultFloatVectorCollection, DataType.FloatVector},
-                {CommonData.defaultBinaryVectorCollection, DataType.BinaryVector},
-                {CommonData.defaultFloat16VectorCollection, DataType.Float16Vector},
-                {CommonData.defaultBFloat16VectorCollection, DataType.BFloat16Vector},
-                {CommonData.defaultSparseFloatVectorCollection, DataType.SparseFloatVector},
+                { DataType.FloatVector},
+                { DataType.BinaryVector},
+                { DataType.Float16Vector},
+                { DataType.BFloat16Vector},
+                { DataType.SparseFloatVector},
         };
     }
 
     @Test(description = "upsert collection", groups = {"Smoke"}, dataProvider = "DifferentCollection")
-    public void upsert(String collectionName, DataType vectorType) {
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(1, CommonData.dim, vectorType);
+    public void upsert( DataType vectorType) {
+        String collectionName = CommonFunction.createNewCollection(CommonData.dim, null, vectorType);
+        CommonFunction.createIndexAndInsertAndLoad(collectionName,vectorType,true,CommonData.numberEntities);
+
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,1, CommonData.dim, vectorType);
         for (int i = 1; i < 10; i++) {
             JsonObject jsonObject0 = jsonObjects.get(0).deepCopy();
             jsonObject0.addProperty(CommonData.fieldInt64, i);
@@ -95,6 +98,7 @@ public class UpsertTest extends BaseTest {
                 .outputFields(Lists.newArrayList(CommonData.fieldInt64, CommonData.fieldInt32))
                 .consistencyLevel(ConsistencyLevel.STRONG).build());
         Assert.assertEquals(query.getQueryResults().size(),10);
+        milvusClientV2.dropCollection(DropCollectionReq.builder().collectionName(collectionName).build());
     }
 
     @Test(description = "upsert collection", groups = {"Smoke"})

+ 127 - 0
tests/milvustestv2/src/test/java/resources/cluster-values.yaml

@@ -0,0 +1,127 @@
+cluster:
+  enabled: true
+image:
+  all:
+    repository: milvusdb/milvus
+    tag: master-latest
+    pullPolicy: IfNotPresent
+
+etcd:
+  replicaCount: 3
+  image:
+    repository: milvusdb/etcd
+    tag: 3.5.0-r7
+
+minio:
+  resources:
+    requests:
+      memory: 256Mi
+
+kafka:
+  enabled: false
+  name: kafka
+  replicaCount: 3
+  defaultReplicationFactor: 2
+
+pulsar:
+  enabled: true
+  extra:
+    bastion: no
+    wsproxy: no
+
+  autorecovery:
+    resources:
+      requests:
+        cpu: 0.1
+        memory: 256Mi
+  proxy:
+    replicaCount: 1
+    resources:
+      requests:
+        cpu: 0.1
+        memory: 256Mi
+    wsResources:
+      requests:
+        memory: 256Mi
+        cpu: 0.1
+    configData:
+      PULSAR_MEM: >
+        -Xms256m -Xmx256m
+      PULSAR_GC: >
+        -XX:MaxDirectMemorySize=512m
+      httpNumThreads: "50"
+
+  bookkeeper:
+    replicaCount: 2
+    resources:
+      requests:
+        cpu: 0.1
+        memory: 512Mi
+    configData:
+      PULSAR_MEM: >
+        -Xms512m
+        -Xmx512m
+        -XX:MaxDirectMemorySize=1024m
+      PULSAR_GC: >
+        -Dio.netty.leakDetectionLevel=disabled
+        -Dio.netty.recycler.linkCapacity=1024
+        -XX:+UseG1GC -XX:MaxGCPauseMillis=10
+        -XX:+ParallelRefProcEnabled
+        -XX:+UnlockExperimentalVMOptions
+        -XX:+DoEscapeAnalysis
+        -XX:ParallelGCThreads=32
+        -XX:ConcGCThreads=32
+        -XX:G1NewSizePercent=50
+        -XX:+DisableExplicitGC
+        -XX:-ResizePLAB
+        -XX:+ExitOnOutOfMemoryError
+        -XX:+PerfDisableSharedMem
+        -XX:+PrintGCDetails
+      nettyMaxFrameSizeBytes: "104867840"
+  zookeeper:
+    replicaCount: 1
+    resources:
+      requests:
+        cpu: 0.1
+        memory: 256Mi
+    configData:
+      PULSAR_MEM: >
+        -Xms512m
+        -Xmx512m
+      PULSAR_GC: >
+        -Dcom.sun.management.jmxremote
+        -Djute.maxbuffer=10485760
+        -XX:+ParallelRefProcEnabled
+        -XX:+UnlockExperimentalVMOptions
+        -XX:+DoEscapeAnalysis
+        -XX:+DisableExplicitGC
+        -XX:+PerfDisableSharedMem
+        -Dzookeeper.forceSync=no
+  broker:
+    replicaCount: 1
+    resources:
+      requests:
+        cpu: 0.1
+        memory: 512Mi
+    configData:
+      PULSAR_MEM: >
+        -Xms512m
+        -Xmx512m
+        -XX:MaxDirectMemorySize=1024m
+      PULSAR_GC: >
+        -Dio.netty.leakDetectionLevel=disabled
+        -Dio.netty.recycler.linkCapacity=1024
+        -XX:+ParallelRefProcEnabled
+        -XX:+UnlockExperimentalVMOptions
+        -XX:+DoEscapeAnalysis
+        -XX:ParallelGCThreads=32
+        -XX:ConcGCThreads=32
+        -XX:G1NewSizePercent=50
+        -XX:+DisableExplicitGC
+        -XX:-ResizePLAB
+        -XX:+ExitOnOutOfMemoryError
+      maxMessageSize: "104857600"
+      defaultRetentionTimeInMinutes: "10080"
+      defaultRetentionSizeInMB: "8192"
+      backlogQuotaDefaultLimitGB: "8"
+      backlogQuotaDefaultRetentionPolicy: producer_exception

+ 52 - 0
tests/milvustestv2/src/test/java/resources/docker-compose.yml

@@ -0,0 +1,52 @@
+version: '3.5'
+
+services:
+  etcd:
+    container_name: milvus-etcd
+    image: quay.io/coreos/etcd:v3.5.0
+    environment:
+      - ETCD_AUTO_COMPACTION_MODE=revision
+      - ETCD_AUTO_COMPACTION_RETENTION=1000
+      - ETCD_QUOTA_BACKEND_BYTES=4294967296
+      - ETCD_SNAPSHOT_COUNT=50000
+    volumes:
+      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcd
+    command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd
+
+  minio:
+    container_name: milvus-minio
+    image: minio/minio:RELEASE.2022-03-17T06-34-49Z
+    environment:
+      MINIO_ACCESS_KEY: minioadmin
+      MINIO_SECRET_KEY: minioadmin
+    volumes:
+      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/minio:/minio_data
+    command: minio server /minio_data --console-address ":9001"
+    ports:
+      - "9000:9000"
+      - "9001:9001"
+    healthcheck:
+      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
+      interval: 30s
+      timeout: 20s
+      retries: 3
+
+  standalone:
+    container_name: milvus-standalone
+    image: milvusdb/milvus:master-latest
+    command: ["milvus", "run", "standalone"]
+    environment:
+      ETCD_ENDPOINTS: etcd:2379
+      MINIO_ADDRESS: minio:9000
+    volumes:
+      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
+    ports:
+      - "19530:19530"
+      - "9091:9091"
+    depends_on:
+      - "etcd"
+      - "minio"
+
+networks:
+  default:
+    name: milvus

+ 230 - 0
tests/milvustestv2/src/test/java/resources/scripts/docker_image_find_tag.sh

@@ -0,0 +1,230 @@
+#!/usr/bin/env bash
+
+# Reference: https://github.com/ryandaniels/docker-script-find-latest-image-tag/blob/master/docker_image_find_tag.sh
+
+set -ef -o pipefail
+
+REGISTRY=${REGISTRY:-"https://index.docker.io/v2"}
+REGISTRY_AUTH=${REGISTRY_AUTH:-"https://auth.docker.io"}
+REGISTRY_SERVICE=${REGISTRY_SERVICE:-"registry.docker.io"}   
+# IMAGE_NAME=library/traefik
+IMAGE_NAME=${IMAGE_NAME:-""}
+IMAGE_TAG=${IMAGE_TAG-""}
+IMAGE_ID_SHORT=${IMAGE_ID_SHORT:-""}
+# IMAGE_ID_SHORT="96c63a7d3e50"
+IMAGE_ID_TARGET=""
+IMAGE_ID_LONG=${IMAGE_ID_LONG:-""}
+# IMAGE_ID_LONG="sha256:96c63a7d3e502fcbbd8937a2523368c22d0edd1788b8389af095f64038318834"
+DOCKER_BIN=docker
+# TAGS_FILTER="1.7"
+TAGS_FILTER=${TAGS_FILTER:-""}
+FAST_MATCH=0
+VERBOSE=0
+QUIET=0
+TAGS_LIMIT=100
+TAG_UNLIMIT=0
+ignore_404=0
+
+show_help () {
+  echo "Usage:"
+  echo "$0 [-n image name] [-i image-id]"
+  echo "Example: $0 -n traefik -i 96c63a7d3e50 -f 1.7"
+  echo "  -n [text]: Image name (Required). '-n traefik' would reference the traefik image"
+  echo "  -D: Use Docker binary for Image ID check (Default) (Optional)"
+  echo "  -P: Use Podman binary for Image ID check (Optional)"
+  echo "  -r [text]: Registry URL to use. Example: -r https://index.docker.io/v2 (Default) (Optional)"
+  echo "  -a [text]: Registry AUTH to use. Example: -a https://auth.docker.io (Default) (Optional)"  
+  echo "  -l [number]: Tag limit. Defaults to 100. (Optional)"  
+  echo "  -L: Tag unlimit. (Optional)"
+  echo "  -f [text]: Filter tag to contain this value (Optional)"
+  echo "  -F: Fast match tag. (Optional)"
+  echo "  -q: Quiet output (Optional)"
+  echo "  -v: Verbose output (Optional)"
+}
+
+# From: https://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash
+# A POSIX variable
+OPTIND=1         # Reset in case getopts has been used previously in the shell.
+
+while getopts "h?n:t:DPr:a:l:Lf:Fqv" opt; do
+    case "$opt" in
+    h|\?)
+        show_help
+        exit 0
+        ;;
+    n)  IMAGE_NAME="$OPTARG"
+        ;;
+    t)  IMAGE_TAG="$OPTARG"
+        ;;
+    D)  DOCKER_BIN=docker
+        ;;
+    P)  DOCKER_BIN=podman
+        ;;
+    r)  REGISTRY="$OPTARG"
+        ;;
+    a)  REGISTRY_AUTH="$OPTARG"
+        ;;
+    l)  TAGS_LIMIT="$OPTARG"
+        ;;
+    L)  TAG_UNLIMIT=1
+        ;;
+    f)  TAGS_FILTER="$OPTARG"
+        ;;
+    F)  FAST_MATCH=1
+        ;;
+    q)  QUIET=1
+        ;;
+    v)  VERBOSE=1
+        ;;
+    esac
+done
+
+shift $((OPTIND-1))
+
+[ "${1:-}" = "--" ] && shift
+
+if [ -z "$IMAGE_NAME" ]; then
+  echo "Requires Image Name"
+  exit 1;
+else
+  if [[ "$VERBOSE" -eq 1 ]]; then
+    echo "Using IMAGE_NAME: $IMAGE_NAME"
+  fi
+  # Add library/ if no /. (Which is _ aka official image like hub.docker.com/_/traefik)
+  # Official images are in "library/"
+  if [[ "$IMAGE_NAME" != *"/"* ]]; then
+      IMAGE_NAME="library/$IMAGE_NAME"
+  fi
+fi
+
+if [[ -z "$IMAGE_TAG" ]]; then
+  echo "Requires Image Tag"
+  exit 1;
+fi
+
+if [[ "$VERBOSE" -eq 1 ]]; then
+  echo "Using REGISTRY: $REGISTRY"
+fi
+
+if ! [[ $TAGS_LIMIT =~ ^[0-9]+$ ]] ; then
+  echo "Tag limit (-l) must be an integer > 0"
+  exit 1;
+fi
+
+function log() {
+  if [[ "${QUIET}" -ne 1 || "$VERBOSE" -eq 1  ]]; then
+    echo "${1}"
+  fi
+}
+
+# https://unix.stackexchange.com/questions/459367/using-shell-variables-for-command-options/459369#459369
+# https://unix.stackexchange.com/questions/444946/how-can-we-run-a-command-stored-in-a-variable/444949#444949
+# https://askubuntu.com/questions/674333/how-to-pass-an-array-as-function-argument/995110#995110
+# Maybe https://stackoverflow.com/questions/45948172/executing-a-curl-request-through-bash-script/45948289#45948289
+# http://mywiki.wooledge.org/BashFAQ/050#I_only_want_to_pass_options_if_the_runtime_data_needs_them
+function do_curl_get () {
+  local URL="$1"
+  shift
+  local array=("$@")
+  HTTP_RESPONSE="$(curl -sSL --write-out "HTTPSTATUS:%{http_code}" \
+    -H "Content-Type: application/json;charset=UTF-8" \
+    "${array[@]}" \
+    -X GET "$URL")"
+  HTTP_BODY=$(echo "$HTTP_RESPONSE" | sed -E 's/HTTPSTATUS\:[0-9]{3}$//')
+  HTTP_STATUS=$(echo "$HTTP_RESPONSE" | tr -d '\n' | sed -E 's/.*HTTPSTATUS:([0-9]{3})$/\1/')
+  # Check that the http status is 200
+  if [[ "$HTTP_STATUS" -ne 200 ]]; then
+    if [[ "$ignore_404" -eq 0 ]]; then
+      if [[ "$VERBOSE" -eq 0 ]]; then
+        echo -e "\\nError $HTTP_STATUS from: $URL\\n"
+      else
+        echo -e "\\nError $HTTP_STATUS from: $URL\\nHTTP_BODY: $HTTP_BODY\\n"
+      fi
+      exit 1
+    fi
+  fi
+}
+
+# Get AUTH token
+CURL_AUTH=()
+CURL_URL="$REGISTRY_AUTH/token?service=${REGISTRY_SERVICE##*(//)}&scope=repository:$IMAGE_NAME:pull"
+do_curl_get "$CURL_URL" "${CURL_AUTH[@]}"
+AUTH=$(echo "$HTTP_BODY" | jq --raw-output .token)
+
+# Get source image ID
+CURL_AUTH=( -H "Authorization: Bearer $AUTH" -H "Accept:application/vnd.docker.distribution.manifest.v2+json" )
+CURL_URL="$REGISTRY/$IMAGE_NAME/manifests/$IMAGE_TAG"
+do_curl_get "$CURL_URL" "${CURL_AUTH[@]}"
+IMAGE_ID_SOURCE="$(echo "$HTTP_BODY" |jq -r .config.digest)"
+
+# Get tags
+CURL_AUTH=( -H "Authorization: Bearer $AUTH" )
+CURL_URL="$REGISTRY/$IMAGE_NAME/tags/list"
+do_curl_get "$CURL_URL" "${CURL_AUTH[@]}"
+TAGS_CURL=$(echo "$HTTP_BODY")
+TAGS_COUNT=$(echo "$TAGS_CURL"|jq -r '.tags[]'|grep -vi windows|wc -l)
+TAGS_temp=$(echo "$TAGS_CURL"|jq --arg TAGS_FILTER "$TAGS_FILTER" -r '.tags[]|select(.|contains($TAGS_FILTER))'|grep -vi windows|sort -r --version-sort)
+
+if [[ "$TAG_UNLIMIT" -eq 1 ]]; then
+  TAGS_LIMIT="$TAGS_COUNT"
+fi
+
+TAGS=$(echo "$TAGS_temp"|sed -n 1,"$TAGS_LIMIT"p)
+log "Found Total Tags: $TAGS_COUNT"
+# Check if tags are not being filtered
+if [ -z "$TAGS_FILTER" ]; then
+  log "Limiting Tags to: $TAGS_LIMIT"
+  # Check if limit reached and display warning
+  if [[ "$TAGS_COUNT" -gt "$TAGS_LIMIT" ]]; then
+    log "Limit reached, consider increasing limit (-l [number]) or adding a filter (-f [text])"
+  fi
+# If tags are filtered, show how many filtered tags were found
+else
+  TAGS_FILTER_COUNT=$(echo "$TAGS_temp"|wc -l)
+  log "Found Tags (after filtering): $TAGS_FILTER_COUNT"
+  log "Limiting Tags to: $TAGS_LIMIT"
+  # Check if limit reached and display warning
+  if [[ "$TAGS_FILTER_COUNT" -ge "$TAGS_LIMIT" ]]; then
+    log "Limit reached, consider increasing limit (-l [number]) or use more specific filter (-f [text])"
+  fi
+fi
+if [[ "$VERBOSE" -eq 1 ]]; then
+  # Output all tags found
+  echo -e "\nFound Tags:\n$TAGS"
+fi
+
+# Loop through tags and look for sha Id match
+# Some "manifests/tag" endpoints do not exist (http404 error)? Seems to be windows images. Ignore any 404 error
+ignore_404=1
+counter=0
+log "Checking for image match ..."
+
+if [[ "$FAST_MATCH" -eq 1 ]]; then
+    log "Fast match tag."
+fi
+for i in $TAGS; do
+  if [[ "$VERBOSE" -eq 1 ]]; then
+  # Output still working text every 50 tags if -v
+    if [[ "$counter" =~ ^($(echo {50..1000..50}|sed 's/ /|/g'))$ ]]; then
+      log "Still working, currently on tag number: $counter"
+    fi
+    counter=$((counter+1))
+  fi
+
+  if [[ "$IMAGE_TAG" != "$i" ]]; then
+    # IMAGE_ID_TARGET="$(curl -sSLH "Authorization: Bearer $AUTH" -H "Accept:application/vnd.docker.distribution.manifest.v2+json" -X GET "$REGISTRY/$IMAGE_NAME/manifests/$i"|jq -r .config.digest)"
+    CURL_AUTH=( -H "Authorization: Bearer $AUTH" -H "Accept:application/vnd.docker.distribution.manifest.v2+json" )
+    CURL_URL="$REGISTRY/$IMAGE_NAME/manifests/$i"
+    do_curl_get "$CURL_URL" "${CURL_AUTH[@]}"
+    IMAGE_ID_TARGET="$(echo "$HTTP_BODY" |jq -r .config.digest)"
+
+    if [[ "$IMAGE_ID_TARGET" == "$IMAGE_ID_SOURCE" ]]; then
+        log "Found match. tag:"
+        echo "$i"
+
+        if [[ "$FAST_MATCH" -eq 1 ]]; then
+          exit 0
+        fi
+    fi
+  fi
+done;

+ 8 - 0
tests/milvustestv2/src/test/java/resources/scripts/install_milvus.sh

@@ -0,0 +1,8 @@
+
+release=${1:-"milvs-chaos"}
+ns=${2:-"chaos-testing"}
+bash uninstall_milvus.sh ${release} ${ns}|| true
+
+helm repo add milvus https://milvus-io.github.io/milvus-helm/
+helm repo update
+helm install --wait --timeout 360s ${release} milvus/milvus -f ../cluster-values.yaml --set metrics.serviceMonitor.enabled=true -n=${ns}

+ 13 - 0
tests/milvustestv2/src/test/java/resources/scripts/install_milvus_cluster.sh

@@ -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}

+ 12 - 0
tests/milvustestv2/src/test/java/resources/scripts/install_milvus_standalone.sh

@@ -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}

+ 25 - 0
tests/milvustestv2/src/test/java/resources/scripts/modify_config.sh

@@ -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

+ 8 - 0
tests/milvustestv2/src/test/java/resources/scripts/uninstall_milvus.sh

@@ -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}

+ 23 - 0
tests/milvustestv2/src/test/java/resources/standalone-values.yaml

@@ -0,0 +1,23 @@
+cluster:
+  enabled: false
+image:
+  all:
+    repository: milvusdb/milvus
+    tag: master-latest
+    pullPolicy: IfNotPresent
+
+kafka:
+  enabled: false
+  name: kafka
+  replicaCount: 3
+  defaultReplicationFactor: 2
+
+etcd:
+  replicaCount: 1
+  image:
+    repository: milvusdb/etcd
+    tag: 3.5.0-r7  
+minio:
+  mode: standalone
+pulsar:
+  enabled: false

+ 1 - 1
tests/milvustestv2/src/test/resources/run.properties

@@ -1,3 +1,3 @@
-uri=http://10.102.6.30:19530
+uri=http://127.0.0.1:19530