#!/bin/bash # Setup testing environment for archsetup # Author: Craig Jennings # License: GNU GPLv3 # # This script performs one-time setup of the testing infrastructure: # - Installs QEMU/KVM and libvirt # - Configures libvirt networking # - Adds user to libvirt group # - Verifies KVM support # - Creates directories for test artifacts set -e # Get script directory SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" # Source utilities source "$SCRIPT_DIR/lib/logging.sh" # Initialize logging LOGFILE="$PROJECT_ROOT/test-results/setup-$(date +'%Y%m%d-%H%M%S').log" init_logging "$LOGFILE" section "ArchSetup Testing Environment Setup" # Check if running on Arch Linux if [ ! -f /etc/arch-release ]; then fatal "This script is designed for Arch Linux" fi # Check if user has sudo if ! sudo -n true 2>/dev/null; then warn "This script requires sudo access" info "You may be prompted for your password" fi # Install required packages section "Installing Required Packages" PACKAGES=( qemu-full libvirt virt-manager dnsmasq bridge-utils iptables virt-install libguestfs ) for pkg in "${PACKAGES[@]}"; do if pacman -Qi "$pkg" &>/dev/null; then info "$pkg is already installed" else step "Installing $pkg" if sudo pacman -S --noconfirm "$pkg" >> "$LOGFILE" 2>&1; then success "$pkg installed" else error "Failed to install $pkg" fatal "Package installation failed" fi fi done # Enable and start libvirt service section "Configuring libvirt Service" step "Enabling libvirtd service" if sudo systemctl enable libvirtd.service >> "$LOGFILE" 2>&1; then success "libvirtd service enabled" else warn "Failed to enable libvirtd service (may already be enabled)" fi step "Starting libvirtd service" if sudo systemctl start libvirtd.service >> "$LOGFILE" 2>&1; then success "libvirtd service started" else if sudo systemctl is-active --quiet libvirtd.service; then info "libvirtd service is already running" else error "Failed to start libvirtd service" fatal "Service startup failed" fi fi # Add user to libvirt group section "Configuring User Permissions" if groups | grep -q libvirt; then success "User $USER is already in libvirt group" else step "Adding user $USER to libvirt group" if sudo usermod -a -G libvirt "$USER" >> "$LOGFILE" 2>&1; then success "User added to libvirt group" warn "You must log out and back in for group membership to take effect" warn "After logging back in, re-run this script to continue" exit 0 else error "Failed to add user to libvirt group" fatal "User configuration failed" fi fi # Verify KVM support section "Verifying KVM Support" if [ -e /dev/kvm ]; then success "KVM is available" else error "KVM is not available" info "Check if virtualization is enabled in BIOS" info "Load kvm module: sudo modprobe kvm-intel (or kvm-amd)" fatal "KVM not available" fi # Check which KVM module is loaded if lsmod | grep -q kvm_intel; then info "Using Intel KVM" elif lsmod | grep -q kvm_amd; then info "Using AMD KVM" else warn "No KVM module detected" info "Load with: sudo modprobe kvm-intel (or kvm-amd)" fi # Create directory structure section "Creating Directory Structure" DIRS=( "$PROJECT_ROOT/vm-images" "$PROJECT_ROOT/test-results" ) for dir in "${DIRS[@]}"; do if [ -d "$dir" ]; then info "Directory exists: $dir" else step "Creating directory: $dir" if mkdir -p "$dir" 2>> "$LOGFILE"; then success "Directory created: $dir" else error "Failed to create directory: $dir" fi fi done # Configure default libvirt network section "Configuring libvirt Network" if virsh net-info default &>/dev/null; then info "Default network exists" if virsh net-info default | grep -q "Active:.*yes"; then success "Default network is active" else step "Starting default network" if virsh net-start default >> "$LOGFILE" 2>&1; then success "Default network started" else error "Failed to start default network" fi fi if virsh net-info default | grep -q "Autostart:.*yes"; then info "Default network autostart is enabled" else step "Enabling default network autostart" if virsh net-autostart default >> "$LOGFILE" 2>&1; then success "Default network autostart enabled" else warn "Failed to enable default network autostart" fi fi else error "Default network not found" info "This is unusual - libvirt should create it automatically" fi # Summary section "Setup Complete" success "Testing environment is ready" info "" info "Next steps:" info " 1. Create base VM: ./scripts/testing/create-base-vm.sh" info " 2. Run a test: ./scripts/testing/run-test.sh" info "" info "Log file: $LOGFILE"