Back

8_instance_deploy

#!/usr/bin/env bash
# ================================================================
#  OPENSTACK PHASE 8 — IMAGE MANAGEMENT (CloudShell)
#  Launch Your First Instance in OpenStack via Remote CLI
#
#  PREREQ: Practical 7 must be running (Foundation Node)
#  RUN   : chmod +x 8_image_deploy.sh && ./8_image_deploy.sh
# ================================================================
set -euo pipefail

REGION="ap-south-1"
NODE_NAME="Practical-OpenStack-Node"
KEY_NAME="Practical-KeyPair"

G='\033[0;32m'; B='\033[0;34m'; Y='\033[1;33m'; C='\033[0;36m'; NC='\033[0m'
info()    { echo -e "${B}[INFO]${NC}    $*"; }
success() { echo -e "${G}[OK]${NC}      $*"; }
banner()  { echo -e "\n${Y}══════════════════════════════════════════${NC}"; \
            echo -e "${Y}  $*${NC}"; \
            echo -e "${Y}══════════════════════════════════════════${NC}\n"; }

banner "OPENSTACK — Image Management & Instance Launch"

info "Step 0 — Locating OpenStack Foundation Node..."
NODE_IP=$(aws ec2 describe-instances \
  --filters "Name=tag:Name,Values=$NODE_NAME" "Name=instance-state-name,Values=running" \
  --region "$REGION" --query "Reservations[0].Instances[0].PublicIpAddress" --output text)

if [[ "$NODE_IP" == "None" || -z "$NODE_IP" ]]; then
  echo -e "${Y}[ERROR] OpenStack Node not found. Run 7_foundation_deploy.sh first.${NC}"
  exit 1
fi
success "Found OpenStack Node at $NODE_IP"

# Base SSH command to execute OpenStack CLI on the controller
OSH="ssh -i $HOME/${KEY_NAME}.pem -o StrictHostKeyChecking=no ubuntu@$NODE_IP source /home/ubuntu/devstack/openrc admin admin &&"

# ── Step 1: Project & User Setup ─────────────────────────────
info "Step 1 — Creating Project and User"
ssh -i "$HOME/${KEY_NAME}.pem" -o StrictHostKeyChecking=no ubuntu@$NODE_IP <<'EOF'
  source /home/ubuntu/devstack/openrc admin admin
  openstack project create --description "Lab Project" lab-project 2>/dev/null || true
  openstack user create --password labpass labuser 2>/dev/null || true
  openstack role add --project lab-project --user admin admin 2>/dev/null || true
  openstack role add --project lab-project --user labuser member 2>/dev/null || true
EOF
success "Project: lab-project | User: labuser created."

# ── Step 2: Upload Image (Glance) ────────────────────────────
info "Step 2 — Downloading and Uploading Image (CirrOS - Lightweight)"
ssh -i "$HOME/${KEY_NAME}.pem" -o StrictHostKeyChecking=no ubuntu@$NODE_IP <<'EOF'
  source /home/ubuntu/devstack/openrc admin admin
  if ! openstack image show "CirrOS 0.6.2" >/dev/null 2>&1; then
    wget -q -O /tmp/cirros.img http://download.cirros-cloud.net/0.6.2/cirros-0.6.2-x86_64-disk.img
    openstack image create "CirrOS 0.6.2" \
      --file /tmp/cirros.img \
      --disk-format qcow2 --container-format bare --public
    rm -f /tmp/cirros.img
  fi
EOF
success "Image uploaded: CirrOS 0.6.2"

# ── Step 3: Create Flavor (Nova) ─────────────────────────────
info "Step 3 — Creating Custom Flavor"
ssh -i "$HOME/${KEY_NAME}.pem" -o StrictHostKeyChecking=no ubuntu@$NODE_IP <<'EOF'
  source /home/ubuntu/devstack/openrc admin admin
  openstack flavor create --ram 512 --disk 1 --vcpus 1 m1.nano 2>/dev/null || true
EOF
success "Flavor defined: m1.nano (512MB RAM, 1 vCPU, 1GB Disk)"

# ── Step 4: KeyPair & Security Group ─────────────────────────
info "Step 4 — Setting up Security Group & Key Pair"
ssh -i "$HOME/${KEY_NAME}.pem" -o StrictHostKeyChecking=no ubuntu@$NODE_IP <<'EOF'
  source /home/ubuntu/devstack/openrc admin admin
  openstack keypair create my-key > /home/ubuntu/my-key.pem 2>/dev/null || true
  chmod 400 /home/ubuntu/my-key.pem 2>/dev/null || true
  
  # Allow SSH and ICMP on default security group
  SG_ID=$(openstack security group list --project admin -f value -c ID | head -n 1)
  openstack security group rule create --proto icmp $SG_ID 2>/dev/null || true
  openstack security group rule create --proto tcp --dst-port 22 $SG_ID 2>/dev/null || true
EOF
success "Security rules applied."

# ── Step 5: Launch Instance ──────────────────────────────────
info "Step 5 — Launching First Instance"
ssh -i "$HOME/${KEY_NAME}.pem" -o StrictHostKeyChecking=no ubuntu@$NODE_IP <<'EOF'
  source /home/ubuntu/devstack/openrc admin admin
  NET_ID=$(openstack network list | grep private | awk '{print $2}' | head -n 1)
  if ! openstack server show lab-instance >/dev/null 2>&1; then
    openstack server create \
      --flavor m1.nano \
      --image "CirrOS 0.6.2" \
      --network "$NET_ID" \
      --key-name my-key \
      lab-instance >/dev/null
  fi
EOF

info "Waiting for instance to become ACTIVE..."
sleep 15
success "Instance launched."

banner "OPENSTACK INSTANCE SUMMARY"
# Run commands and capture output directly
ssh -i "$HOME/${KEY_NAME}.pem" -o StrictHostKeyChecking=no ubuntu@$NODE_IP <<'EOF'
  source /home/ubuntu/devstack/openrc admin admin
  echo -e "\nInstances:"
  openstack server list
  
  echo -e "\nServer Details (lab-instance):"
  openstack server show lab-instance -c status -c addresses -c flavor -c image -f table
EOF

echo -e "\n${Y}NOTE:${NC} To view the Horizon Dashboard:"
echo -e "      http://$NODE_IP/dashboard"
echo -e "      User: admin | Password: openstack"