Some checks failed
API CI / API Lint (push) Successful in 47s
API CI / API Type Check (push) Failing after 47s
API CI / API Test (push) Successful in 1m0s
API CI / API Build (push) Failing after 50s
API CI / Build Docker Image (push) Has been skipped
Build Crossplane Provider / build (push) Failing after 5m51s
CD Pipeline / Deploy to Staging (push) Failing after 29s
CI Pipeline / Lint and Type Check (push) Failing after 36s
CI Pipeline / Build (push) Has been skipped
CI Pipeline / Test Backend (push) Failing after 1m33s
CI Pipeline / Test Frontend (push) Failing after 30s
CI Pipeline / Security Scan (push) Failing after 1m16s
Crossplane Provider CI / Go Test (push) Failing after 3m23s
Crossplane Provider CI / Go Lint (push) Failing after 7m27s
Crossplane Provider CI / Go Build (push) Failing after 3m27s
Deploy to Staging / Deploy to Staging (push) Failing after 30s
Portal CI / Portal Lint (push) Failing after 21s
Portal CI / Portal Type Check (push) Failing after 21s
Portal CI / Portal Test (push) Failing after 21s
Portal CI / Portal Build (push) Failing after 22s
Test Suite / frontend-tests (push) Failing after 30s
Test Suite / api-tests (push) Failing after 49s
Test Suite / blockchain-tests (push) Failing after 30s
Type Check / type-check (map[directory:. name:root]) (push) Failing after 23s
Type Check / type-check (map[directory:api name:api]) (push) Failing after 21s
Type Check / type-check (map[directory:portal name:portal]) (push) Failing after 19s
Validate Configuration Files / validate (push) Failing after 1m52s
CD Pipeline / Deploy to Production (push) Has been skipped
Co-authored-by: Cursor <cursoragent@cursor.com>
148 lines
5.9 KiB
Bash
Executable File
148 lines
5.9 KiB
Bash
Executable File
#!/bin/bash
|
|
# Copy cloud image from ISO storage to image-capable storage
|
|
# This fixes the issue where images in local:iso/ cannot be used as VM disks
|
|
|
|
set -e
|
|
|
|
NODE="r630-01"
|
|
SOURCE_IMAGE="local:iso/ubuntu-22.04-cloud.img"
|
|
TARGET_STORAGE="${1:-ceph-rbd}" # Default to ceph-rbd, or pass as first argument
|
|
|
|
echo "═══════════════════════════════════════════════════════════════════════════════"
|
|
echo " COPY CLOUD IMAGE TO IMAGE STORAGE"
|
|
echo "═══════════════════════════════════════════════════════════════════════════════"
|
|
echo ""
|
|
|
|
# Check if running on r630-01
|
|
HOSTNAME=$(hostname)
|
|
if [ "$HOSTNAME" != "r630-01" ]; then
|
|
echo "⚠️ WARNING: This script should be run on r630-01"
|
|
echo " Current hostname: $HOSTNAME"
|
|
echo ""
|
|
echo "To run remotely via SSH:"
|
|
echo " ssh root@192.168.11.11 'bash -s' < $0"
|
|
echo ""
|
|
read -p "Continue anyway? (y/N) " -n 1 -r
|
|
echo
|
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
echo "Step 1: Checking if image exists in ISO storage..."
|
|
if ! pvesm list local 2>/dev/null | grep -q "ubuntu-22.04-cloud"; then
|
|
echo "⚠️ Image not found: $SOURCE_IMAGE"
|
|
echo " Listing available images in local storage:"
|
|
pvesm list local 2>/dev/null | grep -E "\.img$|\.qcow2$" | head -10 || echo " No images found in local storage"
|
|
exit 1
|
|
fi
|
|
|
|
echo "✅ Image found: $SOURCE_IMAGE"
|
|
echo ""
|
|
|
|
echo "Step 2: Extracting filename..."
|
|
FILENAME=$(echo "$SOURCE_IMAGE" | sed 's/.*\///')
|
|
TARGET_PATH="template/cache/$FILENAME"
|
|
TARGET_VOLID="$TARGET_STORAGE:$TARGET_PATH"
|
|
|
|
echo " Source: $SOURCE_IMAGE"
|
|
echo " Target: $TARGET_VOLID"
|
|
echo ""
|
|
|
|
echo "Step 3: Copying image to $TARGET_STORAGE storage..."
|
|
# Method 1: Use qm disk import (recommended)
|
|
if command -v qm &> /dev/null; then
|
|
echo " Using qm disk import method..."
|
|
# Create a temporary VM to import the disk
|
|
TEMP_VMID=9999
|
|
echo " Creating temporary VM (ID: $TEMP_VMID) for import..."
|
|
qm create $TEMP_VMID --name temp-import --memory 128 --net0 virtio,bridge=vmbr0 2>/dev/null || {
|
|
# VM might already exist, try to destroy it first
|
|
qm destroy $TEMP_VMID 2>/dev/null || true
|
|
sleep 2
|
|
qm create $TEMP_VMID --name temp-import --memory 128 --net0 virtio,bridge=vmbr0 2>/dev/null || {
|
|
echo "❌ Failed to create temporary VM"
|
|
exit 1
|
|
}
|
|
}
|
|
|
|
# Import the disk from ISO storage to target storage
|
|
echo " Importing disk from $SOURCE_IMAGE to $TARGET_STORAGE..."
|
|
if qm disk import $TEMP_VMID $SOURCE_IMAGE $TARGET_STORAGE --format qcow2 2>&1; then
|
|
echo " ✅ Disk imported successfully"
|
|
|
|
# Get the imported disk volid
|
|
IMPORTED_DISK=$(qm config $TEMP_VMID 2>/dev/null | grep -E "^scsi[0-9]+:" | head -1 | cut -d: -f2 | cut -d, -f1 | tr -d ' ')
|
|
if [ -n "$IMPORTED_DISK" ]; then
|
|
echo " Imported disk: $IMPORTED_DISK"
|
|
fi
|
|
|
|
# Clean up temp VM
|
|
echo " Cleaning up temporary VM..."
|
|
qm destroy $TEMP_VMID 2>/dev/null || true
|
|
echo "✅ Image copied successfully to $TARGET_STORAGE"
|
|
else
|
|
echo "⚠️ qm disk import failed, trying alternative method..."
|
|
# Clean up temp VM first
|
|
qm destroy $TEMP_VMID 2>/dev/null || true
|
|
|
|
# Method 2: Use rbd import directly (for RBD storage)
|
|
if [ "$TARGET_STORAGE" = "ceph-rbd" ] || [ "$TARGET_STORAGE" = "rbd" ]; then
|
|
echo " Using rbd import method for RBD storage..."
|
|
SOURCE_PATH="/var/lib/vz/template/iso/$(basename $SOURCE_IMAGE | sed 's/local:iso\///')"
|
|
RBD_IMAGE_NAME="template_cache_$(basename $SOURCE_IMAGE | sed 's/\.img$//' | tr '[:upper:]' '[:lower:]' | tr -cd '[:alnum:]_')"
|
|
|
|
if [ -f "$SOURCE_PATH" ]; then
|
|
echo " Importing image to RBD pool 'rbd' as '$RBD_IMAGE_NAME'..."
|
|
if rbd import "$SOURCE_PATH" "rbd/$RBD_IMAGE_NAME" --image-format 2 2>&1; then
|
|
echo " ✅ Image imported to RBD pool"
|
|
echo " Note: Proxmox will need to discover this image"
|
|
echo " The image is now in RBD pool 'rbd' as '$RBD_IMAGE_NAME'"
|
|
else
|
|
echo "❌ RBD import failed"
|
|
exit 1
|
|
fi
|
|
else
|
|
echo "❌ Source file not found at $SOURCE_PATH"
|
|
exit 1
|
|
fi
|
|
else
|
|
# Method 3: Use direct file copy (for local storage types)
|
|
echo " Trying direct file copy method..."
|
|
SOURCE_PATH="/var/lib/vz/template/iso/$(basename $SOURCE_IMAGE | sed 's/local:iso\///')"
|
|
TARGET_DIR="/var/lib/vz/images"
|
|
|
|
if [ -f "$SOURCE_PATH" ]; then
|
|
echo " Copying file: $SOURCE_PATH -> $TARGET_DIR/"
|
|
mkdir -p "$TARGET_DIR" 2>/dev/null || true
|
|
cp "$SOURCE_PATH" "$TARGET_DIR/" 2>&1 && echo "✅ File copied" || {
|
|
echo "❌ File copy failed"
|
|
exit 1
|
|
}
|
|
else
|
|
echo "❌ Source file not found at $SOURCE_PATH"
|
|
echo " Please copy the image manually or use Proxmox web UI"
|
|
exit 1
|
|
fi
|
|
fi
|
|
fi
|
|
else
|
|
echo "❌ qm command not found"
|
|
exit 1
|
|
fi
|
|
|
|
echo ""
|
|
echo "Step 4: Verifying copied image..."
|
|
if pvesm list "$TARGET_STORAGE" | grep -q "$FILENAME"; then
|
|
echo "✅ Image copied to: $TARGET_VOLID"
|
|
echo ""
|
|
echo "The provider can now use this image directly for VM creation."
|
|
else
|
|
echo "⚠️ Image not found in target storage, but copy may have succeeded"
|
|
echo " Check manually: pvesm list $TARGET_STORAGE"
|
|
fi
|
|
|
|
echo ""
|
|
echo "✅ Setup complete!"
|
|
|