github.com/kata-containers/tests@v0.0.0-20240307153542-772105b56064/metrics/disk/cassandra_kubernetes/cassandra.sh (about) 1 #!/bin/bash 2 # 3 # Copyright (c) 2022 Intel Corporation 4 # 5 # SPDX-License-Identifier: Apache-2.0 6 7 set -e 8 set -x 9 10 SCRIPT_PATH=$(dirname "$(readlink -f "$0")") 11 12 source "${SCRIPT_PATH}/../../../.ci/lib.sh" 13 source "${SCRIPT_PATH}/../../lib/common.bash" 14 test_repo="${test_repo:-github.com/kata-containers/tests}" 15 TEST_NAME="${TEST_NAME:-cassandra}" 16 cassandra_file=$(mktemp cassandraresults.XXXXXXXXXX) 17 cassandra_read_file=$(mktemp cassandrareadresults.XXXXXXXXXX) 18 19 function remove_tmp_file() { 20 rm -rf "${cassandra_file}" "${cassandra_read_file}" 21 } 22 23 trap remove_tmp_file EXIT 24 25 function cassandra_write_test() { 26 cassandra_start 27 export pod_name="cassandra-0" 28 export write_cmd="/usr/local/apache-cassandra-3.11.2/tools/bin/cassandra-stress write n=1000000 cl=one -mode native cql3 -schema keyspace="keyspace1" -pop seq=1..1000000 -node cassandra" 29 number_of_retries="50" 30 for _ in $(seq 1 "$number_of_retries"); do 31 if kubectl exec -i cassandra-0 -- sh -c 'nodetool status' | grep Up; then 32 ok="1" 33 break; 34 fi 35 sleep 1 36 done 37 # This is needed to wait that cassandra is up 38 sleep 30 39 kubectl exec -i cassandra-0 -- sh -c "$write_cmd" > "${cassandra_file}" 40 write_op_rate=$(cat "${cassandra_file}" | grep -e "Op rate" | cut -d':' -f2 | sed -e 's/^[ \t]*//' | cut -d ' ' -f1) 41 write_latency_mean=$(cat "${cassandra_file}" | grep -e "Latency mean" | cut -d':' -f2 | sed -e 's/^[ \t]*//' | cut -d ' ' -f1) 42 write_latency_95th=$(cat "${cassandra_file}" | grep -e "Latency 95th percentile" | cut -d':' -f2 | sed -e 's/^[ \t]*//' | cut -d ' ' -f1) 43 write_latency_99th=$(cat "${cassandra_file}" | grep -e "Latency 99th percentile" | cut -d':' -f2 | sed -e 's/^[ \t]*//' | cut -d ' ' -f1) 44 write_latency_median=$(cat "${cassandra_file}" | grep -e "Latency median" | cut -d':' -f2 | sed -e 's/^[ \t]*//' | cut -d ' ' -f1) 45 46 export read_cmd="/usr/local/apache-cassandra-3.11.2/tools/bin/cassandra-stress read n=200000 -rate threads=50" 47 kubectl exec -i cassandra-0 -- sh -c "$read_cmd" > "${cassandra_read_file}" 48 read_op_rate=$(cat "${cassandra_read_file}" | grep -e "Op rate" | cut -d':' -f2 | sed -e 's/^[ \t]*//' | cut -d ' ' -f1) 49 read_latency_mean=$(cat "${cassandra_read_file}" | grep -e "Latency mean" | cut -d':' -f2 | sed -e 's/^[ \t]*//' | cut -d ' ' -f1) 50 read_latency_95th=$(cat "${cassandra_read_file}" | grep -e "Latency 95th percentile" | cut -d':' -f2 | sed -e 's/^[ \t]*//' | cut -d ' ' -f1) 51 read_latency_99th=$(cat "${cassandra_read_file}" | grep -e "Latency 99th percentile" | cut -d':' -f2 | sed -e 's/^[ \t]*//' | cut -d ' ' -f1) 52 read_latency_median=$(cat "${cassandra_read_file}" | grep -e "Latency median" | cut -d':' -f2 | sed -e 's/^[ \t]*//' | cut -d ' ' -f1) 53 54 metrics_json_init 55 # Save configuration 56 metrics_json_start_array 57 58 local json="$(cat << EOF 59 { 60 "Write Op rate": { 61 "Result" : "$write_op_rate", 62 "Units" : "op/s" 63 }, 64 "Write Latency Mean": { 65 "Result" : "$write_latency_mean", 66 "Units" : "ms" 67 }, 68 "Write Latency 95th percentile": { 69 "Result" : "$write_latency_95th", 70 "Units" : "ms" 71 }, 72 "Write Latency 99th percentile": { 73 "Result" : "$write_latency_99th", 74 "Units" : "ms" 75 }, 76 "Write Latency Median" : { 77 "Result" : "$write_latency_median", 78 "Units" : "ms" 79 }, 80 "Read Op rate": { 81 "Result" : "$read_op_rate", 82 "Units" : "op/s" 83 }, 84 "Read Latency Mean": { 85 "Result" : "$read_latency_mean", 86 "Units" : "ms" 87 }, 88 "Read Latency 95th percentile": { 89 "Result" : "$read_latency_95th", 90 "Units" : "ms" 91 }, 92 "Read Latency 99th percentile": { 93 "Result" : "$read_latency_99th", 94 "Units" : "ms" 95 }, 96 "Read Latency Median" : { 97 "Result" : "$read_latency_median", 98 "Units" : "ms" 99 } 100 } 101 EOF 102 )" 103 104 metrics_json_add_array_element "$json" 105 metrics_json_end_array "Results" 106 107 metrics_json_save 108 cassandra_cleanup 109 } 110 111 function cassandra_start() { 112 cmds=("bc" "jq") 113 check_cmds "${cmds[@]}" 114 115 # Check no processes are left behind 116 check_processes 117 118 # Start kubernetes 119 start_kubernetes 120 121 export KUBECONFIG="$HOME/.kube/config" 122 export service_name="cassandra" 123 export app_name="cassandra" 124 125 wait_time=20 126 sleep_time=2 127 128 vol_capacity="3Gi" 129 volume_name="block-loop-pv" 130 volume_claim="block-loop-pvc" 131 132 # Create Loop Device 133 export tmp_disk_image=$(mktemp --tmpdir disk.XXXXXX.img) 134 truncate "$tmp_disk_image" --size "3GB" 135 export loop_dev=$(sudo losetup -f) 136 sudo losetup "$loop_dev" "$tmp_disk_image" 137 138 # Create Storage Class 139 kubectl create -f "${SCRIPT_PATH}/volume/block-local-storage.yaml" 140 141 # Create Persistent Volume 142 export tmp_pv_yaml=$(mktemp --tmpdir block_persistent_vol.XXXXX.yaml) 143 sed -e "s|LOOP_DEVICE|${loop_dev}|" "${SCRIPT_PATH}/volume/block-loop-pv.yaml" > "$tmp_pv_yaml" 144 sed -i "s|HOSTNAME|$(hostname | awk '{print tolower($0)}')|" "$tmp_pv_yaml" 145 sed -i "s|CAPACITY|${vol_capacity}|" "$tmp_pv_yaml" 146 147 kubectl create -f "$tmp_pv_yaml" 148 cmd="kubectl get pv/${volume_name} | grep Available" 149 waitForProcess "$wait_time" "$sleep_time" "$cmd" 150 151 # Create Persistent Volume Claim 152 export tmp_pvc_yaml=$(mktemp --tmpdir block_persistent_vol.XXXXX.yaml) 153 sed -e "s|CAPACITY|${vol_capacity}|" "${SCRIPT_PATH}/volume/block-loop-pvc.yaml" > "$tmp_pvc_yaml" 154 kubectl create -f "$tmp_pvc_yaml" 155 156 # Create service 157 kubectl create -f "${SCRIPT_PATH}/runtimeclass_workloads/cassandra-service.yaml" 158 159 # Check service 160 kubectl get svc | grep "$service_name" 161 162 # Create workload using volume 163 ctr_dev_path="/dev/xda" 164 export tmp_pod_yaml=$(mktemp --tmpdir pod-pv.XXXXX.yaml) 165 sed -e "s|DEVICE_PATH|${ctr_dev_path}|" "${SCRIPT_PATH}/runtimeclass_workloads/cassandra-statefulset.yaml" > "$tmp_pod_yaml" 166 kubectl create -f "$tmp_pod_yaml" 167 cmd="kubectl rollout status --watch --timeout=120s statefulset/$app_name" 168 waitForProcess "$wait_time" "$sleep_time" "$cmd" 169 170 # Verify persistent volume claim is bound 171 kubectl get pvc | grep "Bound" 172 173 # Check pods are running 174 cmd="kubectl get pods -o jsonpath='{.items[*].status.phase}' | grep Running" 175 waitForProcess "$wait_time" "$sleep_time" "$cmd" 176 } 177 178 function cassandra_cleanup() { 179 kubectl patch pvc block-loop-pvc -p '{"metadata":{"finalizers":null}}' 180 kubectl delete pvc block-loop-pvc --force 181 kubectl patch pv block-loop-pv -p '{"metadata":{"finalizers":null}}' 182 kubectl delete pv block-loop-pv --force 183 kubectl delete svc "$service_name" 184 kubectl delete pod -l app="$app_name" 185 kubectl delete storageclass block-local-storage 186 kubectl delete statefulsets "$app_name" 187 188 # Delete temporary yaml files 189 rm -f "$tmp_pv_yaml" 190 rm -f "$tmp_pvc_yaml" 191 rm -f "$tmp_pod_yaml" 192 193 # Remove image and loop device 194 sudo losetup -d "$loop_dev" 195 rm -f "$tmp_disk_image" 196 197 end_kubernetes 198 check_processes 199 } 200 201 function start_kubernetes() { 202 info "Start k8s" 203 pushd "${GOPATH}/src/${test_repo}/integration/kubernetes" 204 bash ./init.sh 205 popd 206 } 207 208 function end_kubernetes() { 209 info "End k8s" 210 pushd "${GOPATH}/src/${test_repo}/integration/kubernetes" 211 bash ./cleanup_env.sh 212 popd 213 } 214 215 function main() { 216 init_env 217 cassandra_write_test 218 } 219 220 main "$@"