diff --git a/testdata/controllers/blue-green-mm/bumpweights.sh b/testdata/controllers/blue-green-mm/bumpweights.sh new file mode 100755 index 000000000..38ed5dc5a --- /dev/null +++ b/testdata/controllers/blue-green-mm/bumpweights.sh @@ -0,0 +1,4 @@ +echo "kubectl annotate --overwrite isvc wisdom-primary-weight iter8.tools/weight='20'" +echo "kubectl annotate --overwrite isvc wisdom-candidate-weight iter8.tools/weight='80'" +kubectl annotate --overwrite cm wisdom-primary-weight iter8.tools/weight='20' +kubectl annotate --overwrite cm wisdom-candidate-weight iter8.tools/weight='80' diff --git a/testdata/controllers/blue-green-mm/cleanup.sh b/testdata/controllers/blue-green-mm/cleanup.sh new file mode 100755 index 000000000..b02d1d4b0 --- /dev/null +++ b/testdata/controllers/blue-green-mm/cleanup.sh @@ -0,0 +1,10 @@ +#!/bin/sh +# Cleanup application +kubectl -n modelmesh-serving delete isvc/wisdom-primary cm/wisdom-primary-weight +kubectl -n modelmesh-serving delete isvc/wisdom-candidate cm/wisdom-candidate-weight +# Cleanup routemap(s) +kubectl delete cm/wisdom +# Cleanup networking +kubectl delete svc/wisdom gateway/wisdom-gateway virtualservice/wisdom +# Cleanup sleep utility +kubectl delete deploy/sleep cm/wisdom-input diff --git a/testdata/controllers/blue-green-mm/execintosleep.sh b/testdata/controllers/blue-green-mm/execintosleep.sh new file mode 100755 index 000000000..1391b7697 --- /dev/null +++ b/testdata/controllers/blue-green-mm/execintosleep.sh @@ -0,0 +1,6 @@ +#!/bin/sh +# First, get $SLEEP_POD +SLEEP_POD=$(kubectl get pod --sort-by={metadata.creationTimestamp} -l app=sleep -o jsonpath={.items..metadata.name} | rev | cut -d' ' -f 1 | rev) +# Second, exec into it +kubectl exec --stdin --tty "${SLEEP_POD}" -c sleep -- /bin/sh +# Third, cd wisdom && source query.sh in order to query wisdom \ No newline at end of file diff --git a/testdata/controllers/blue-green-mm/initialize.sh b/testdata/controllers/blue-green-mm/initialize.sh new file mode 100755 index 000000000..ef55f3b2a --- /dev/null +++ b/testdata/controllers/blue-green-mm/initialize.sh @@ -0,0 +1,150 @@ +cat < parameters = 4; + + // The tensor contents using a data-type format. This field must + // not be specified if "raw" tensor contents are being used for + // the inference request. + InferTensorContents contents = 5; + } + + // An output tensor requested for an inference request. + message InferRequestedOutputTensor + { + // The tensor name. + string name = 1; + + // Optional requested output tensor parameters. + map parameters = 2; + } + + // The name of the model to use for inferencing. + string model_name = 1; + + // The version of the model to use for inference. If not given the + // server will choose a version based on the model and internal policy. + string model_version = 2; + + // Optional identifier for the request. If specified will be + // returned in the response. + string id = 3; + + // Optional inference parameters. + map parameters = 4; + + // The input tensors for the inference. + repeated InferInputTensor inputs = 5; + + // The requested output tensors for the inference. Optional, if not + // specified all outputs produced by the model will be returned. + repeated InferRequestedOutputTensor outputs = 6; + + // The data contained in an input tensor can be represented in "raw" + // bytes form or in the repeated type that matches the tensor's data + // type. To use the raw representation 'raw_input_contents' must be + // initialized with data for each tensor in the same order as + // 'inputs'. For each tensor, the size of this content must match + // what is expected by the tensor's shape and data type. The raw + // data must be the flattened, one-dimensional, row-major order of + // the tensor elements without any stride or padding between the + // elements. Note that the FP16 data type must be represented as raw + // content as there is no specific data type for a 16-bit float + // type. + // + // If this field is specified then InferInputTensor::contents must + // not be specified for any input tensor. + repeated bytes raw_input_contents = 7; + } + + message ModelInferResponse + { + // An output tensor returned for an inference request. + message InferOutputTensor + { + // The tensor name. + string name = 1; + + // The tensor data type. + string datatype = 2; + + // The tensor shape. + repeated int64 shape = 3; + + // Optional output tensor parameters. + map parameters = 4; + + // The tensor contents using a data-type format. This field must + // not be specified if "raw" tensor contents are being used for + // the inference response. + InferTensorContents contents = 5; + } + + // The name of the model used for inference. + string model_name = 1; + + // The version of the model used for inference. + string model_version = 2; + + // The id of the inference request if one was specified. + string id = 3; + + // Optional inference response parameters. + map parameters = 4; + + // The output tensors holding inference results. + repeated InferOutputTensor outputs = 5; + + // The data contained in an output tensor can be represented in + // "raw" bytes form or in the repeated type that matches the + // tensor's data type. To use the raw representation 'raw_output_contents' + // must be initialized with data for each tensor in the same order as + // 'outputs'. For each tensor, the size of this content must match + // what is expected by the tensor's shape and data type. The raw + // data must be the flattened, one-dimensional, row-major order of + // the tensor elements without any stride or padding between the + // elements. Note that the FP16 data type must be represented as raw + // content as there is no specific data type for a 16-bit float + // type. + // + // If this field is specified then InferOutputTensor::contents must + // not be specified for any output tensor. + repeated bytes raw_output_contents = 6; + } + + // An inference parameter value. The Parameters message describes a + // “name”/”value” pair, where the “name” is the name of the parameter + // and the “value” is a boolean, integer, or string corresponding to + // the parameter. + message InferParameter + { + // The parameter value can be a string, an int64, a boolean + // or a message specific to a predefined parameter. + oneof parameter_choice + { + // A boolean parameter value. + bool bool_param = 1; + + // An int64 parameter value. + int64 int64_param = 2; + + // A string parameter value. + string string_param = 3; + } + } + + // The data contained in a tensor represented by the repeated type + // that matches the tensor's data type. Protobuf oneof is not used + // because oneofs cannot contain repeated fields. + message InferTensorContents + { + // Representation for BOOL data type. The size must match what is + // expected by the tensor's shape. The contents must be the flattened, + // one-dimensional, row-major order of the tensor elements. + repeated bool bool_contents = 1; + + // Representation for INT8, INT16, and INT32 data types. The size + // must match what is expected by the tensor's shape. The contents + // must be the flattened, one-dimensional, row-major order of the + // tensor elements. + repeated int32 int_contents = 2; + + // Representation for INT64 data types. The size must match what + // is expected by the tensor's shape. The contents must be the + // flattened, one-dimensional, row-major order of the tensor elements. + repeated int64 int64_contents = 3; + + // Representation for UINT8, UINT16, and UINT32 data types. The size + // must match what is expected by the tensor's shape. The contents + // must be the flattened, one-dimensional, row-major order of the + // tensor elements. + repeated uint32 uint_contents = 4; + + // Representation for UINT64 data types. The size must match what + // is expected by the tensor's shape. The contents must be the + // flattened, one-dimensional, row-major order of the tensor elements. + repeated uint64 uint64_contents = 5; + + // Representation for FP32 data type. The size must match what is + // expected by the tensor's shape. The contents must be the flattened, + // one-dimensional, row-major order of the tensor elements. + repeated float fp32_contents = 6; + + // Representation for FP64 data type. The size must match what is + // expected by the tensor's shape. The contents must be the flattened, + // one-dimensional, row-major order of the tensor elements. + repeated double fp64_contents = 7; + + // Representation for BYTES data type. The size must match what is + // expected by the tensor's shape. The contents must be the flattened, + // one-dimensional, row-major order of the tensor elements. + repeated bytes bytes_contents = 8; + } + grpc_input.json: | + { + "inputs": [ + { + "name": "predict", + "shape": [1, 64], + "datatype": "FP32", + "contents": { + "fp32_contents": [0.0, 0.0, 1.0, 11.0, 14.0, 15.0, 3.0, 0.0, 0.0, 1.0, 13.0, 16.0, 12.0, 16.0, 8.0, 0.0, 0.0, 8.0, 16.0, 4.0, 6.0, 16.0, 5.0, 0.0, 0.0, 5.0, 15.0, 11.0, 13.0, 14.0, 0.0, 0.0, 0.0, 0.0, 2.0, 12.0, 16.0, 13.0, 0.0, 0.0, 0.0, 0.0, 0.0, 13.0, 16.0, 16.0, 6.0, 0.0, 0.0, 0.0, 0.0, 16.0, 16.0, 16.0, 7.0, 0.0, 0.0, 0.0, 0.0, 11.0, 13.0, 12.0, 1.0, 0.0] + } + } + ] + } + query.sh: | + cat grpc_input.json | grpcurl -plaintext -proto kserve.proto -d @ wisdom.modelmesh-serving:80 inference.GRPCInferenceService.ModelInfer +EOF diff --git a/testdata/controllers/blue-green-mm/steps.sh b/testdata/controllers/blue-green-mm/steps.sh new file mode 100644 index 000000000..cbef1c44f --- /dev/null +++ b/testdata/controllers/blue-green-mm/steps.sh @@ -0,0 +1,41 @@ +# Start iter8 controller +POD_NAME=blue-leader-0 POD_NAMESPACE=modelmesh-serving CONFIG_FILE=testdata/controllers/config.yaml go run main.go controllers -l trace +# initialize primary v1 +./initialize.sh +# query +./sleep.sh +# in a new terminal +./execintosleep.sh +# inside the sleep pod +cd wisdom +source query.sh + +# Explore what the initialization step entailed ... templated virtual service +less initialize.sh + +# Explore status of virtual service ... +kubectl get virtualservice wisdom -o yaml + +# check back on status of query ... + +# candidate v2 +./v2-candidate.sh + +source query.sh + +# Explore what candidate release entails... +less v2-candidate.sh + +# Explore status of virtual service ... +kubectl get virtualservice wisdom -o yaml + +# check back on status of warm up + +# bump up traffic for candidate v2 +./bumpweights.sh + +# Explore status of virtual service ... +kubectl get virtualservice wisdom -o yaml + +# promote v2 +./promote-v2.sh diff --git a/testdata/controllers/blue-green-mm/v2-candidate.sh b/testdata/controllers/blue-green-mm/v2-candidate.sh new file mode 100755 index 000000000..1141e8543 --- /dev/null +++ b/testdata/controllers/blue-green-mm/v2-candidate.sh @@ -0,0 +1,27 @@ +cat < parameters = 4; + + // The tensor contents using a data-type format. This field must + // not be specified if "raw" tensor contents are being used for + // the inference request. + InferTensorContents contents = 5; + } + + // An output tensor requested for an inference request. + message InferRequestedOutputTensor + { + // The tensor name. + string name = 1; + + // Optional requested output tensor parameters. + map parameters = 2; + } + + // The name of the model to use for inferencing. + string model_name = 1; + + // The version of the model to use for inference. If not given the + // server will choose a version based on the model and internal policy. + string model_version = 2; + + // Optional identifier for the request. If specified will be + // returned in the response. + string id = 3; + + // Optional inference parameters. + map parameters = 4; + + // The input tensors for the inference. + repeated InferInputTensor inputs = 5; + + // The requested output tensors for the inference. Optional, if not + // specified all outputs produced by the model will be returned. + repeated InferRequestedOutputTensor outputs = 6; + + // The data contained in an input tensor can be represented in "raw" + // bytes form or in the repeated type that matches the tensor's data + // type. To use the raw representation 'raw_input_contents' must be + // initialized with data for each tensor in the same order as + // 'inputs'. For each tensor, the size of this content must match + // what is expected by the tensor's shape and data type. The raw + // data must be the flattened, one-dimensional, row-major order of + // the tensor elements without any stride or padding between the + // elements. Note that the FP16 data type must be represented as raw + // content as there is no specific data type for a 16-bit float + // type. + // + // If this field is specified then InferInputTensor::contents must + // not be specified for any input tensor. + repeated bytes raw_input_contents = 7; + } + + message ModelInferResponse + { + // An output tensor returned for an inference request. + message InferOutputTensor + { + // The tensor name. + string name = 1; + + // The tensor data type. + string datatype = 2; + + // The tensor shape. + repeated int64 shape = 3; + + // Optional output tensor parameters. + map parameters = 4; + + // The tensor contents using a data-type format. This field must + // not be specified if "raw" tensor contents are being used for + // the inference response. + InferTensorContents contents = 5; + } + + // The name of the model used for inference. + string model_name = 1; + + // The version of the model used for inference. + string model_version = 2; + + // The id of the inference request if one was specified. + string id = 3; + + // Optional inference response parameters. + map parameters = 4; + + // The output tensors holding inference results. + repeated InferOutputTensor outputs = 5; + + // The data contained in an output tensor can be represented in + // "raw" bytes form or in the repeated type that matches the + // tensor's data type. To use the raw representation 'raw_output_contents' + // must be initialized with data for each tensor in the same order as + // 'outputs'. For each tensor, the size of this content must match + // what is expected by the tensor's shape and data type. The raw + // data must be the flattened, one-dimensional, row-major order of + // the tensor elements without any stride or padding between the + // elements. Note that the FP16 data type must be represented as raw + // content as there is no specific data type for a 16-bit float + // type. + // + // If this field is specified then InferOutputTensor::contents must + // not be specified for any output tensor. + repeated bytes raw_output_contents = 6; + } + + // An inference parameter value. The Parameters message describes a + // “name”/”value” pair, where the “name” is the name of the parameter + // and the “value” is a boolean, integer, or string corresponding to + // the parameter. + message InferParameter + { + // The parameter value can be a string, an int64, a boolean + // or a message specific to a predefined parameter. + oneof parameter_choice + { + // A boolean parameter value. + bool bool_param = 1; + + // An int64 parameter value. + int64 int64_param = 2; + + // A string parameter value. + string string_param = 3; + } + } + + // The data contained in a tensor represented by the repeated type + // that matches the tensor's data type. Protobuf oneof is not used + // because oneofs cannot contain repeated fields. + message InferTensorContents + { + // Representation for BOOL data type. The size must match what is + // expected by the tensor's shape. The contents must be the flattened, + // one-dimensional, row-major order of the tensor elements. + repeated bool bool_contents = 1; + + // Representation for INT8, INT16, and INT32 data types. The size + // must match what is expected by the tensor's shape. The contents + // must be the flattened, one-dimensional, row-major order of the + // tensor elements. + repeated int32 int_contents = 2; + + // Representation for INT64 data types. The size must match what + // is expected by the tensor's shape. The contents must be the + // flattened, one-dimensional, row-major order of the tensor elements. + repeated int64 int64_contents = 3; + + // Representation for UINT8, UINT16, and UINT32 data types. The size + // must match what is expected by the tensor's shape. The contents + // must be the flattened, one-dimensional, row-major order of the + // tensor elements. + repeated uint32 uint_contents = 4; + + // Representation for UINT64 data types. The size must match what + // is expected by the tensor's shape. The contents must be the + // flattened, one-dimensional, row-major order of the tensor elements. + repeated uint64 uint64_contents = 5; + + // Representation for FP32 data type. The size must match what is + // expected by the tensor's shape. The contents must be the flattened, + // one-dimensional, row-major order of the tensor elements. + repeated float fp32_contents = 6; + + // Representation for FP64 data type. The size must match what is + // expected by the tensor's shape. The contents must be the flattened, + // one-dimensional, row-major order of the tensor elements. + repeated double fp64_contents = 7; + + // Representation for BYTES data type. The size must match what is + // expected by the tensor's shape. The contents must be the flattened, + // one-dimensional, row-major order of the tensor elements. + repeated bytes bytes_contents = 8; + } + grpc_input.json: | + { + "inputs": [ + { + "name": "predict", + "shape": [1, 64], + "datatype": "FP32", + "contents": { + "fp32_contents": [0.0, 0.0, 1.0, 11.0, 14.0, 15.0, 3.0, 0.0, 0.0, 1.0, 13.0, 16.0, 12.0, 16.0, 8.0, 0.0, 0.0, 8.0, 16.0, 4.0, 6.0, 16.0, 5.0, 0.0, 0.0, 5.0, 15.0, 11.0, 13.0, 14.0, 0.0, 0.0, 0.0, 0.0, 2.0, 12.0, 16.0, 13.0, 0.0, 0.0, 0.0, 0.0, 0.0, 13.0, 16.0, 16.0, 6.0, 0.0, 0.0, 0.0, 0.0, 16.0, 16.0, 16.0, 7.0, 0.0, 0.0, 0.0, 0.0, 11.0, 13.0, 12.0, 1.0, 0.0] + } + } + ] + } + query.sh: | + cat grpc_input.json | grpcurl -plaintext -proto kserve.proto -d @ wisdom.modelmesh-serving:80 inference.GRPCInferenceService.ModelInfer + test_query.sh: | + cat grpc_input.json | grpcurl -plaintext -proto kserve.proto -d @ -H 'traffic: test' wisdom.modelmesh-serving:80 inference.GRPCInferenceService.ModelInfer +EOF diff --git a/testdata/controllers/canary-mm/steps.sh b/testdata/controllers/canary-mm/steps.sh new file mode 100644 index 000000000..5be336e94 --- /dev/null +++ b/testdata/controllers/canary-mm/steps.sh @@ -0,0 +1,23 @@ +# initialize primary v1 +./initialize.sh +# query +./sleep.sh +# in a new terminal +./execintosleep.sh +# inside the sleep pod +cd wisdom +source query.sh + +# candidate v2 +./v2-candidate.sh + +# inside the sleep pod +source query.sh +source test_query.sh + +# promote v2 +./promote-v2.sh +kubectl delete isvc wisdom-candidate + +# clean up +./cleanup.sh \ No newline at end of file diff --git a/testdata/controllers/canary-mm/v2-candidate.sh b/testdata/controllers/canary-mm/v2-candidate.sh new file mode 100755 index 000000000..9b69704df --- /dev/null +++ b/testdata/controllers/canary-mm/v2-candidate.sh @@ -0,0 +1,20 @@ +cat < parameters = 4; + + // The tensor contents using a data-type format. This field must + // not be specified if "raw" tensor contents are being used for + // the inference request. + InferTensorContents contents = 5; + } + + // An output tensor requested for an inference request. + message InferRequestedOutputTensor + { + // The tensor name. + string name = 1; + + // Optional requested output tensor parameters. + map parameters = 2; + } + + // The name of the model to use for inferencing. + string model_name = 1; + + // The version of the model to use for inference. If not given the + // server will choose a version based on the model and internal policy. + string model_version = 2; + + // Optional identifier for the request. If specified will be + // returned in the response. + string id = 3; + + // Optional inference parameters. + map parameters = 4; + + // The input tensors for the inference. + repeated InferInputTensor inputs = 5; + + // The requested output tensors for the inference. Optional, if not + // specified all outputs produced by the model will be returned. + repeated InferRequestedOutputTensor outputs = 6; + + // The data contained in an input tensor can be represented in "raw" + // bytes form or in the repeated type that matches the tensor's data + // type. To use the raw representation 'raw_input_contents' must be + // initialized with data for each tensor in the same order as + // 'inputs'. For each tensor, the size of this content must match + // what is expected by the tensor's shape and data type. The raw + // data must be the flattened, one-dimensional, row-major order of + // the tensor elements without any stride or padding between the + // elements. Note that the FP16 data type must be represented as raw + // content as there is no specific data type for a 16-bit float + // type. + // + // If this field is specified then InferInputTensor::contents must + // not be specified for any input tensor. + repeated bytes raw_input_contents = 7; + } + + message ModelInferResponse + { + // An output tensor returned for an inference request. + message InferOutputTensor + { + // The tensor name. + string name = 1; + + // The tensor data type. + string datatype = 2; + + // The tensor shape. + repeated int64 shape = 3; + + // Optional output tensor parameters. + map parameters = 4; + + // The tensor contents using a data-type format. This field must + // not be specified if "raw" tensor contents are being used for + // the inference response. + InferTensorContents contents = 5; + } + + // The name of the model used for inference. + string model_name = 1; + + // The version of the model used for inference. + string model_version = 2; + + // The id of the inference request if one was specified. + string id = 3; + + // Optional inference response parameters. + map parameters = 4; + + // The output tensors holding inference results. + repeated InferOutputTensor outputs = 5; + + // The data contained in an output tensor can be represented in + // "raw" bytes form or in the repeated type that matches the + // tensor's data type. To use the raw representation 'raw_output_contents' + // must be initialized with data for each tensor in the same order as + // 'outputs'. For each tensor, the size of this content must match + // what is expected by the tensor's shape and data type. The raw + // data must be the flattened, one-dimensional, row-major order of + // the tensor elements without any stride or padding between the + // elements. Note that the FP16 data type must be represented as raw + // content as there is no specific data type for a 16-bit float + // type. + // + // If this field is specified then InferOutputTensor::contents must + // not be specified for any output tensor. + repeated bytes raw_output_contents = 6; + } + + // An inference parameter value. The Parameters message describes a + // “name”/”value” pair, where the “name” is the name of the parameter + // and the “value” is a boolean, integer, or string corresponding to + // the parameter. + message InferParameter + { + // The parameter value can be a string, an int64, a boolean + // or a message specific to a predefined parameter. + oneof parameter_choice + { + // A boolean parameter value. + bool bool_param = 1; + + // An int64 parameter value. + int64 int64_param = 2; + + // A string parameter value. + string string_param = 3; + } + } + + // The data contained in a tensor represented by the repeated type + // that matches the tensor's data type. Protobuf oneof is not used + // because oneofs cannot contain repeated fields. + message InferTensorContents + { + // Representation for BOOL data type. The size must match what is + // expected by the tensor's shape. The contents must be the flattened, + // one-dimensional, row-major order of the tensor elements. + repeated bool bool_contents = 1; + + // Representation for INT8, INT16, and INT32 data types. The size + // must match what is expected by the tensor's shape. The contents + // must be the flattened, one-dimensional, row-major order of the + // tensor elements. + repeated int32 int_contents = 2; + + // Representation for INT64 data types. The size must match what + // is expected by the tensor's shape. The contents must be the + // flattened, one-dimensional, row-major order of the tensor elements. + repeated int64 int64_contents = 3; + + // Representation for UINT8, UINT16, and UINT32 data types. The size + // must match what is expected by the tensor's shape. The contents + // must be the flattened, one-dimensional, row-major order of the + // tensor elements. + repeated uint32 uint_contents = 4; + + // Representation for UINT64 data types. The size must match what + // is expected by the tensor's shape. The contents must be the + // flattened, one-dimensional, row-major order of the tensor elements. + repeated uint64 uint64_contents = 5; + + // Representation for FP32 data type. The size must match what is + // expected by the tensor's shape. The contents must be the flattened, + // one-dimensional, row-major order of the tensor elements. + repeated float fp32_contents = 6; + + // Representation for FP64 data type. The size must match what is + // expected by the tensor's shape. The contents must be the flattened, + // one-dimensional, row-major order of the tensor elements. + repeated double fp64_contents = 7; + + // Representation for BYTES data type. The size must match what is + // expected by the tensor's shape. The contents must be the flattened, + // one-dimensional, row-major order of the tensor elements. + repeated bytes bytes_contents = 8; + } + grpc_input.json: | + { + "inputs": [ + { + "name": "predict", + "shape": [1, 64], + "datatype": "FP32", + "contents": { + "fp32_contents": [0.0, 0.0, 1.0, 11.0, 14.0, 15.0, 3.0, 0.0, 0.0, 1.0, 13.0, 16.0, 12.0, 16.0, 8.0, 0.0, 0.0, 8.0, 16.0, 4.0, 6.0, 16.0, 5.0, 0.0, 0.0, 5.0, 15.0, 11.0, 13.0, 14.0, 0.0, 0.0, 0.0, 0.0, 2.0, 12.0, 16.0, 13.0, 0.0, 0.0, 0.0, 0.0, 0.0, 13.0, 16.0, 16.0, 6.0, 0.0, 0.0, 0.0, 0.0, 16.0, 16.0, 16.0, 7.0, 0.0, 0.0, 0.0, 0.0, 11.0, 13.0, 12.0, 1.0, 0.0] + } + } + ] + } + query.sh: | + cat grpc_input.json | grpcurl -plaintext -proto kserve.proto -d @ wisdom.modelmesh-serving:80 inference.GRPCInferenceService.ModelInfer +EOF diff --git a/testdata/controllers/mirror-mm/steps.sh b/testdata/controllers/mirror-mm/steps.sh new file mode 100644 index 000000000..a8e7057cf --- /dev/null +++ b/testdata/controllers/mirror-mm/steps.sh @@ -0,0 +1,23 @@ +# initialize primary v1 +./initialize.sh +# query +./sleep.sh +# in a new terminal +./execintosleep.sh +# inside the sleep pod +cd wisdom +source query.sh + +# candidate v2 +./v2-candidate.sh + +# inside the sleep pod; verify stickiness +source query.sh +source test_query.sh + +# promote v2 +./promote-v2.sh +kubectl delete isvc wisdom-candidate + +# clean up +./cleanup.sh \ No newline at end of file diff --git a/testdata/controllers/mirror-mm/v2-candidate.sh b/testdata/controllers/mirror-mm/v2-candidate.sh new file mode 100755 index 000000000..9b69704df --- /dev/null +++ b/testdata/controllers/mirror-mm/v2-candidate.sh @@ -0,0 +1,20 @@ +cat <