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