#/bin/bash

DATA_STORAGE_CLASS="${1:-iam-kaas-iam-data}"
BACKUP_DATA_STORAGE_CLASS="${2:-iam-kaas-iam-backup}"

declare -A data_node2lv_map
declare -A data_lv2pvc_map
declare -A backup_lv2node_map
declare -A backup_lv2pvc_map

get_pv_node() {
  kubectl -n kaas get pv ${1} \
    -o jsonpath='{.spec.nodeAffinity.required.nodeSelectorTerms[0].matchExpressions[0].values[0]}'
}

get_pv_pvc() {
  kubectl -n kaas get pv ${1} -o jsonpath='{.spec.claimRef.name}'
}

get_sc_volumes() {
  kubectl -n kaas get pv \
    -o jsonpath='{.items[?(@.spec.storageClassName=="'${1}'")].metadata.name}'
}

get_lv_info() {
    local lv_name
    local data_lv
    local data_pvc
    local backup_pvc
    local volume_path
    local node
    local machine
    local internal_ip

    lv_name="${1}"
    volume_path=$(kubectl get pv ${lv_name} \
      -o jsonpath='{.spec.local.path}')
    node=${backup_lv2node_map[${lv_name}]}
    data_lv=${data_node2lv_map[${node}]}
    data_pvc=${data_lv2pvc_map[${data_lv}]}
    backup_pvc=${backup_lv2pvc_map[${lv_name}]}
    machine=$(kubectl get node ${node} \
      -o jsonpath='{.metadata.labels.kaas\.mirantis\.com/machine-name}')
    internal_ip=$(kubectl get lcmmachine ${machine} \
      -o jsonpath='{.status.addresses[?(@.type=="InternalIP")].address}')

    echo "Volume: ${lv_name}"
    echo "Volume path: ${volume_path}"
    echo "Data PVC: ${data_pvc}"
    if [[ -n "${backup_pvc}" ]]; then
      echo "Backup PVC: ${backup_pvc}"
    fi
    echo "Node: ${node}"
    echo "Machine: ${machine}"
    echo "Internal IP: ${internal_ip}"
    echo ""
}

for volume in $(get_sc_volumes ${DATA_STORAGE_CLASS}); do
  node=$(get_pv_node ${volume})
  pvc=$(get_pv_pvc ${volume})
  data_node2lv_map[${node}]="${volume}"
  data_lv2pvc_map[${volume}]="${pvc}"
done

for volume in $(get_sc_volumes ${BACKUP_DATA_STORAGE_CLASS}); do
  node=$(get_pv_node ${volume})
  pvc=$(get_pv_pvc ${volume})
  backup_lv2node_map[${volume}]="${node}"
  backup_lv2pvc_map[${volume}]="${pvc}"
done

for volume in "${!backup_lv2pvc_map[@]}"; do
  pvc=${backup_lv2pvc_map[${volume}]}
  if [[ -n ${pvc} ]]; then
    echo "Primary local volume"
    echo "===================="
    get_lv_info "${volume}"
  fi
done

for volume in "${!backup_lv2pvc_map[@]}"; do
  pvc=${backup_lv2pvc_map[${volume}]}
  if [[ -z "${pvc}" ]]; then
    echo "Secondary local volume"
    echo "----------------------"
    get_lv_info "${volume}"
  fi
done
