|
| 1 | +#!/bin/bash |
| 2 | +set -euo pipefail |
| 3 | + |
| 4 | +# Resolve script directory |
| 5 | +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" |
| 6 | + |
| 7 | +# Use provided YQ or fallback to ../bin/yq (relative to hack/) |
| 8 | +YQ="${YQ:-../bin/yq}" |
| 9 | +CRANE="${CRANE:-../bin/crane}" |
| 10 | + |
| 11 | +dig gcr.io |
| 12 | +curl -I https://gcr.io/v2/ |
| 13 | + |
| 14 | +if [ ! -x "$YQ" ]; then |
| 15 | + echo "❌ Error: yq not found or not executable at: $YQ" >&2 |
| 16 | + echo "🔍 Resolved path: $(realpath "$YQ" 2>/dev/null || echo '<unresolvable>')" >&2 |
| 17 | + exit 1 |
| 18 | +fi |
| 19 | + |
| 20 | +# Operator version from values.yaml |
| 21 | +defaultOperatorVersion=$("$YQ" .tigeraOperator.version < "${SCRIPT_DIR}/../charts/tigera-operator/values.yaml") |
| 22 | +OPERATOR_VERSION="${OPERATOR_VERSION:-$defaultOperatorVersion}" |
| 23 | +IMAGE_SOURCE="quay.io/tigera/operator:${OPERATOR_VERSION}" |
| 24 | + |
| 25 | +echo "🔍 Checking images for OPERATOR_VERSION=${OPERATOR_VERSION}" |
| 26 | +echo "🔍 Fetching image list from ${IMAGE_SOURCE}..." |
| 27 | + |
| 28 | +######################################### |
| 29 | +# Step 1: Fetch image list from operator |
| 30 | +######################################### |
| 31 | +operator_images=$( |
| 32 | + docker run --rm "${IMAGE_SOURCE}" --print-images=list 2>/dev/null \ |
| 33 | + | grep -E '^[a-z0-9.-]+\.[a-z0-9.-]+/[a-z0-9._/-]+:[a-zA-Z0-9._-]+' \ |
| 34 | + | grep -v -- '-fips' \ |
| 35 | + | sort -u |
| 36 | +) |
| 37 | + |
| 38 | +######################################### |
| 39 | +# Step 2: Extract from manifests |
| 40 | +######################################### |
| 41 | +manifest_dir="${SCRIPT_DIR}/../manifests" |
| 42 | +manifest_images=$( |
| 43 | + grep -rhoE 'image:\s*["'\''"]?[a-z0-9.-]+\.[a-z0-9.-]+/[a-z0-9._/-]+:[a-zA-Z0-9._-]+' "$manifest_dir" \ |
| 44 | + | sed -E 's/image:\s*["'\''"]?//' \ |
| 45 | + | grep -v -- '-fips' \ |
| 46 | + | sort -u |
| 47 | +) |
| 48 | + |
| 49 | +######################################### |
| 50 | +# Step 3: Combine and deduplicate |
| 51 | +######################################### |
| 52 | +all_images=$(echo -e "${operator_images}\n${manifest_images}" | sort -u) |
| 53 | +count=$(echo "$all_images" | wc -l) |
| 54 | + |
| 55 | +echo "📦 Total unique images to check (excluding -fips): ${count}" |
| 56 | + |
| 57 | +######################################### |
| 58 | +# Step 4: Check availability with retries |
| 59 | +######################################### |
| 60 | +FAILED=0 |
| 61 | +FAILED_IMAGES=() |
| 62 | + |
| 63 | +while IFS= read -r image; do |
| 64 | + success=0 |
| 65 | + for attempt in 1 2 3; do |
| 66 | + if "$CRANE" digest "$image" >/dev/null 2>&1; then |
| 67 | + echo "✅ Available: $image" |
| 68 | + success=1 |
| 69 | + break |
| 70 | + else |
| 71 | + echo "⚠️ Attempt $attempt failed for: $image" |
| 72 | + if [ "$attempt" -eq 3 ]; then |
| 73 | + echo "🔍 Used crane at: $(realpath "$CRANE" 2>/dev/null || echo '<unresolvable>')" |
| 74 | + fi |
| 75 | + sleep 3 |
| 76 | + fi |
| 77 | + done |
| 78 | + |
| 79 | + if [ "$success" -ne 1 ]; then |
| 80 | + echo "❌ NOT FOUND after 3 attempts: $image" |
| 81 | + FAILED=1 |
| 82 | + FAILED_IMAGES+=("$image") |
| 83 | + fi |
| 84 | +done <<< "$all_images" |
| 85 | + |
| 86 | +######################################### |
| 87 | +# Step 5: Final result |
| 88 | +######################################### |
| 89 | +if [ "$FAILED" -eq 1 ]; then |
| 90 | + echo "" |
| 91 | + echo "❗ Some images are missing or invalid:" |
| 92 | + for img in "${FAILED_IMAGES[@]}"; do |
| 93 | + echo " ❌ $img" |
| 94 | + done |
| 95 | + exit 1 |
| 96 | +else |
| 97 | + echo "🎉 All images are available!" |
| 98 | +fi |
0 commit comments