#!/usr/bin/env bash

. ${MAIN_PATH}/lib/yandex.sh

usage() {
	echo """
Usage: ya tool sre pods command [opts]

Available commands:
  -h | help  - print help
  list - show list of Pods
  info - show porto props by Pods
  yasm - generate CPU yasm panel
  membw - show memory bandwidth utilization for Pod
  numastat - show per-NUMA-node memory stats for Pod
  pids - show pids list for Pod
  threads - show threads stats for Pod
"""
}

get_dc() {
  echo $(jq -r .walle_dc /etc/server_info.json)
}

get_pods() {
	echo $(portoctl list -1 -t | grep "ISS-AGENT--")
}

cmd_pids() {
  [[ -z $1 ]] && return
	echo $(find /sys/fs/cgroup/pids/porto%${1}/ -name cgroup.procs -exec cat {} \; | sort | uniq)
}

cmd_threads() {
  [[ -z $1 ]] && return
	for i in $(cmd_pids $1); do
		echo "$i $(cat /proc/$i/comm):"; cat /proc/$i/task/*/comm | sort | uniq -c | sort -n
	done
}

cmd_list() {
	dc=$(get_dc)
	for i in $(get_pods | sed -e 's/ISS-AGENT--//g'); do
		data=$(curl -s localhost:25536/pods/info/$i 2>/dev/null)
		echo $data | jq . > /dev/null 2>&1
		if [[ $? -ne 0 ]]; then
			#echo $data
			continue
		fi
	  pod=$(echo $data | jq -r .pod_set_id)
	  echo "ISS-AGENT--${i}: https://deploy.yandex-team.ru/yp/$dc/pod-sets?podSetId=$pod"
	done | column -t
}

cmd_info() {
  # $1 - porto property
  [[ -z $1 ]] && return
	for i in $(get_pods); do
		echo "$i: $(portoctl get $i | grep "^$1 " | sed -e 's/'$1' = //g')"
	done | column -t
}

cmd_yasm() {
  dc=$(get_dc)
	context=$(ya tool yp select pod --filter '[/spec/node_id]="'$HOSTNAME'" and [/status/agent/state]="started"' --address $dc --selector '/labels/deploy_engine' --selector '/meta/id' --selector '/spec/iss/instances/0/instanceRevision/hostname' --selector '/labels/nanny_service_id' --selector '/spec/host_infra/monitoring/labels/itype' --selector '/spec/host_infra/monitoring/labels/stage' --selector '/spec/host_infra/monitoring/labels/deploy_unit' --selector '/spec/iss/instances/0/instanceRevision/tags' | grep ' "' | cut -d '"' -f2,4,6,8,10,12,14,16,18,20,22 | tr '"' "~" | awk '{print $HOSTNAME,","}' | xargs | tr -d ' ' | sed -e 's/,$/\//');
	case "$1" in
		net) sigs="portoinst-net_retrans_segs_tmmv,portoinst-net_rx_drops_summ,portoinst-net_tx_drops_summ,portoinst-net_rx_mb_summ,portoinst-net_tx_mb_summ" ;;
		*) sigs="havg(portoinst-cpu_usage_slot_hgram),havg(portoinst-cpu_wait_slot_hgram),havg(portoinst-cpu_throttled_slot_hgram),portoinst-cpu_constrained_wait_slot_tmmv,portoinst-cpu_unconstrained_wait_slot_tmmv" ;;
	esac
	echo "https://yasm.yandex-team.ru/template/panel/describe-node/signals=${sigs};node=${HOSTNAME};context=${context}"
}

cmd_membw() {
  [[ -z $1 ]] && return
	cmd_run_sudo_yatool pqos -p "all:$(cmd_pids $1 | xargs | tr ' ' ',')" -I
}

cmd_numastat() {
  [[ -z $1 ]] && return
	cmd_run_sudo /usr/bin/numastat -p $(cmd_pids $1 | xargs | sed -e 's/ / -p /g') -c
}

cmd_perftop() {
  [[ -z $1 ]] && return
	cmd_run_sudo_yatool perf top -e cycles -G porto%${1}
}

case "$1" in
  list) shift; cmd_list;;
  info) shift; cmd_info $1;;
  yasm) shift; cmd_yasm $1;;
  membw) shift; cmd_membw $1;;
  numastat) shift; cmd_numastat $1;;
  pids) shift; cmd_pids $1;;
  threads) shift; cmd_threads $1;;
  perftop) shift; cmd_perftop $1;;
  *) usage;;
esac
