#!/bin/bash -e
# The -e in the shebang does the same thing as set -e (Exit on Error).

exec 3>&1
mkdir -p /var/log/cni
exec &>> /var/log/cni/cni-plugin-bash.log

echo "$(date): Executing cni-plugin-bash"

source /opt/cni/bin/cni-plugin-if.sh
source /opt/cni/bin/cni-plugin-ip.sh
source /opt/cni/bin/cni-plugin-bridge.sh
source /opt/cni/bin/cni-plugin-iptables.sh
source /opt/cni/bin/cni-plugin-connectivity.sh

KUBECONFIG_FILE="/home/ubuntu/.kube/config"
NODE_NAME=$(hostname)
CNI_CONFIG=$(cat /dev/stdin)
CNI_SUBNET=$(kubectl --kubeconfig "$KUBECONFIG_FILE" get node "$NODE_NAME" -o jsonpath='{.spec.podCIDR}')
CNI_SUBNET_SZ=$(echo "$CNI_SUBNET" | awk -F  "/" '{print $2}')
CNI_BRIDGE_NAME=$(echo "$CNI_CONFIG" | jq -r ".bridge")
CNI_DEBUG=$(echo "$CNI_CONFIG" | jq -r ".debug")

echo "NODE_NAME: ${NODE_NAME}"
echo "CNI_COMMAND: ${CNI_COMMAND}"
echo "CNI_CONTAINERID: ${CNI_CONTAINERID}"
echo "CNI_NETNS: ${CNI_NETNS}"
echo "CNI_IFNAME: ${CNI_IFNAME}"
echo "CNI_ARGS: ${CNI_ARGS}"
echo "CNI_CONFIG: ${CNI_CONFIG}"
echo "CNI_SUBNET: ${CNI_SUBNET}"
echo "CNI_SUBNET_SZ: ${CNI_SUBNET_SZ}"
echo "CNI_BRIDGE_NAME: ${CNI_BRIDGE_NAME}"

GATEWAY=""
IP_ADDR=""

if [[ ${CNI_DEBUG} -gt 0 ]]; then set -x; fi

case ${CNI_COMMAND} in
    ADD)
        create_bridge ${CNI_BRIDGE_NAME}
        allocate_ip ${CNI_SUBNET}
        config_interface ${CNI_BRIDGE_NAME} ${CNI_NETNS} \
                         ${CNI_CONTAINERID} ${CNI_IFNAME} \
                         ${CNI_SUBNET_SZ} ${GATEWAY} ${IP_ADDR}
        config_iptables ${CNI_SUBNET}
        config_connectivity
        ;;
    DEL)
        CONTAINER_IP=$(echo "$CNI_CONFIG" | jq -r ".prevResult.ips[0].address" | sed 's:/24::')
        if [ "$VALUE" != "null" ]; then
            deallocate_ip $CONTAINER_IP
        else
            echo "IP is null. Not returning IP."
        fi
        echo "Deleting network for container $CNI_CONTAINERID"
        echo "Namespace $CNI_NETNS (IP: $CONTAINER_IP)"
        rm -rf /var/run/netns/$CNI_CONTAINERID
        ;;
    CHECK)
        # Implement check logic if needed
        ;;
    VERSION)
        echo '{
          "cniVersion": "0.4.0",
          "supportedVersions": [ "0.4.0", "0.4.1" ]
        }' >&3
        ;;
    *)
        echo "Unknown CNI_COMMAND: ${CNI_COMMAND}" >&2
        exit 1
        ;;
esac