#!/bin/bash

LEVEL=0
volumes_dependencies ()
{
ID=""
[ -z "$1" ] && exit 0 || ID="$1"

IS_VOLUME=$(openstack volume show -c snapshot_id -c source_volid -c status -c name -f value $ID 2>/dev/null | tr '\n' ',')
IS_SNAPSHOT=$(openstack volume snapshot show -c volume_id -c status -c name -f value $ID 2>/dev/null | tr '\n' ',')

# Volume
if [ -n "$IS_VOLUME" ]
then
    NAME=$(echo "$IS_VOLUME" | awk -F',' '{print $1}')
    DEPENDS_SNAPSHOT=$(echo "$IS_VOLUME" | awk -F',' '{print $2}')
    DEPENDS_VOLUME=$(echo "$IS_VOLUME" | awk -F',' '{print $3}')
    INDENT=""
    [ $LEVEL -gt 0 ] && INDENT="$(printf '%*s└── ' $(((LEVEL-1) * 4)))"
    echo "${INDENT}VOLUME: $ID (Name: $NAME)"

    if [ "$DEPENDS_SNAPSHOT" != "None" ]
    then
        ((LEVEL+=1))
        volumes_dependencies $DEPENDS_SNAPSHOT

    elif [ "$DEPENDS_VOLUME" != "None" ]
    then
        ((LEVEL+=1))
        volumes_dependencies $DEPENDS_VOLUME
    fi
fi

# Snapshot
if [ -n "$IS_SNAPSHOT" ]
then
    NAME=$(echo "$IS_SNAPSHOT" | awk -F',' '{print $1}')
    DEPENDS_VOLUME=$(echo "$IS_SNAPSHOT" | awk -F',' '{print $3}')
    INDENT=""
    [ $LEVEL -gt 0 ] && INDENT="$(printf '%*s└── ' $(((LEVEL-1) * 4 )))"
    echo "${INDENT}SNAPSHOT: $ID (Name: $NAME)"

    if [ "$DEPENDS_VOLUME" != "None" ]
    then
        ((LEVEL+=1))
        volumes_dependencies $DEPENDS_VOLUME
    fi
fi
}

usage ()
{
    echo "Usage: get_volume_dependencies.sh [-p project] [-h] <volume-id|snapshot-id>.."
    echo "  -h    : give this help"
}

# Main
while getopts "+h" OPT ; do
    case "$OPT" in
    "?")
        usage
        exit 1
        ;;
    "h")
        usage
        exit 0
        ;;
    *)
        default
        ;;
    esac
done

shift $(($OPTIND - 1))

VOLUMES=""
if [ -z "$1" ]
then
    VOLUMES="$(openstack volume list -f value -c ID | sort | xargs) $(openstack volume snapshot list -f value -c ID | sort | xargs)"
else
    VOLUMES="$@"
fi

for i in $VOLUMES
do
    LEVEL=0
    volumes_dependencies $i
    echo
done

exit 0
