diff --git a/bin/wild-cluster-node-ip b/bin/wild-cluster-node-ip new file mode 100755 index 0000000..e8e06e8 --- /dev/null +++ b/bin/wild-cluster-node-ip @@ -0,0 +1,180 @@ +#!/bin/bash + +set -e +set -o pipefail + +# Usage function +usage() { + echo "Usage: wild-cluster-node-ip [options]" + echo "" + echo "Get the current IP address of a cluster node by name." + echo "" + echo "Arguments:" + echo " node-name Name of the node to get IP for" + echo "" + echo "Options:" + echo " --from-config Get IP from local config.yaml" + echo " --from-talosctl Get IP from Talos API" + echo " Default: Query Kubernetes API (kubectl)" + echo " -h, --help Show this help message" + echo "" + echo "Examples:" + echo " wild-cluster-node-ip control-1" + echo " wild-cluster-node-ip worker-1" + echo " wild-cluster-node-ip control-2 --from-config" + echo " wild-cluster-node-ip worker-2 --from-talosctl" + echo "" + echo "This script will:" + echo " - Query the specified source for the node's IP address" + echo " - Return only the internal IP address or exit with error if not found" + echo "" + echo "Requirements:" + echo " - Must be run from a Wild Cloud directory" + echo " - kubectl and/or talosctl must be configured for cluster access" +} + +# Parse arguments +NODE_NAME="" +SOURCE="kubectl" + +while [[ $# -gt 0 ]]; do + case $1 in + --from-config) + SOURCE="config" + shift + ;; + --from-talosctl) + SOURCE="talosctl" + shift + ;; + -h|--help) + usage + exit 0 + ;; + -*) + echo "Unknown option $1" + usage + exit 1 + ;; + *) + if [ -z "$NODE_NAME" ]; then + NODE_NAME="$1" + else + echo "Unexpected argument: $1" + usage + exit 1 + fi + shift + ;; + esac +done + +# Check if node name was provided +if [ -z "$NODE_NAME" ]; then + echo "Error: Node name is required" + usage + exit 1 +fi + +# Initialize Wild Cloud environment +if [ -z "${WC_ROOT}" ]; then + echo "Error: WC_ROOT is not set" >&2 + exit 1 +else + source "${WC_ROOT}/scripts/common.sh" + init_wild_env +fi + +# Function to get IP from config.yaml +get_ip_from_config() { + local node_name="$1" + local ip + + ip=$(yq eval ".cluster.nodes.active.\"${node_name}\".currentIp" "${WC_HOME}/config.yaml" 2>/dev/null || echo "") + + if [ -n "$ip" ] && [ "$ip" != "null" ]; then + echo "$ip" + return 0 + else + return 1 + fi +} + +# Function to get IP from kubectl +get_ip_from_kubectl() { + local node_name="$1" + local ip + + # Check if kubectl is available and configured + if ! command -v kubectl >/dev/null 2>&1; then + return 1 + fi + + # Try to get node info from kubectl + if ! kubectl get nodes "$node_name" >/dev/null 2>&1; then + return 1 + fi + + # Get internal IP address + ip=$(kubectl get node "$node_name" -o jsonpath='{.status.addresses[?(@.type=="InternalIP")].address}' 2>/dev/null || echo "") + + if [ -n "$ip" ]; then + echo "$ip" + return 0 + else + return 1 + fi +} + +# Function to get IP from talosctl +get_ip_from_talosctl() { + local node_name="$1" + local ip + + # Check if talosctl is available and configured + if ! command -v talosctl >/dev/null 2>&1; then + return 1 + fi + + # Try to get node info from talosctl + if talosctl get members >/dev/null 2>&1; then + # Find the specific node and get its first IP address + ip=$(talosctl get members -o json 2>/dev/null | jq -r --arg hostname "$node_name" 'select(.spec.hostname == $hostname) | .spec.addresses[0]' 2>/dev/null | grep -v "null" | head -n1 || echo "") + + if [ -n "$ip" ]; then + echo "$ip" + return 0 + fi + fi + + return 1 +} + + +# Main logic +case $SOURCE in + config) + if ip=$(get_ip_from_config "$NODE_NAME"); then + echo "$ip" + else + echo "Error: Node $NODE_NAME not found in config.yaml or no currentIp set" >&2 + exit 1 + fi + ;; + kubectl) + if ip=$(get_ip_from_kubectl "$NODE_NAME"); then + echo "$ip" + else + echo "Error: Could not get IP for node $NODE_NAME via kubectl" >&2 + exit 1 + fi + ;; + talosctl) + if ip=$(get_ip_from_talosctl "$NODE_NAME"); then + echo "$ip" + else + echo "Error: Could not get IP for node $NODE_NAME via talosctl" >&2 + exit 1 + fi + ;; +esac \ No newline at end of file