#!/bin/bash
#
# Run this script to gather details about the environment where the CI job is
# running. This can be helpful to identify issues why minikube failed to
# deploy, or tests encounter problems while running.
#

function minikube_ssh() {
    ssh \
        -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no \
        -l docker -i "$(minikube ssh-key)" \
        "$(minikube ip)" "${*}"
}

function log() {
    echo "###" >/dev/stderr
    echo "### going to execute: ${*}" >/dev/stderr
    echo "###" >/dev/stderr
    "${@}"
    echo "###" >/dev/stderr
    echo "### execution finished: ${*}" >/dev/stderr
    echo "###" >/dev/stderr
}

# get the status of the VM in libvirt
log virsh list

# status of the minikube Kubernetes cluster
log minikube status
log minikube logs

# get the status of processes in the VM
log minikube_ssh top -b -c -n1 -w

# get the logs from the VM
log minikube_ssh journalctl --boot

# filesystem status for host and VM
log df -hT
log minikube_ssh df -hT

# fetch all logs from /var/lib/rook in the VM and write them to stdout
log minikube_ssh sudo tar c /var/lib/rook | tar xvO

# gets status from all namespaces
for NAMESPACE in $(kubectl get namespaces -o jsonpath='{.items[*].metadata.name}')
do
    log kubectl describe namespace "${NAMESPACE}"
    log kubectl -n "${NAMESPACE}" get events
    log kubectl -n "${NAMESPACE}" get pods
    for POD in $(kubectl -n "${NAMESPACE}" get pods -o jsonpath='{.items[*].metadata.name}')
    do
        log kubectl -n "${NAMESPACE}" describe pod "${POD}"
        log kubectl -n "${NAMESPACE}" logs "${POD}" --all-containers
        log kubectl -n "${NAMESPACE}" logs "${POD}" --all-containers --previous=true
    done
done
log kubectl -n rook-ceph describe CephCluster
log kubectl -n rook-ceph describe CephBlockPool
log kubectl -n rook-ceph describe CephFilesystem

# run "ceph -s" in the toolbox
log kubectl -n rook-ceph exec \
    "$(kubectl -n rook-ceph get pod -l app=rook-ceph-tools -o jsonpath='{.items[0].metadata.name}')" \
    -- ceph -s