packer {
  required_plugins {
    amazon = {
      version = ">= 1.2.8"
      source  = "github.com/hashicorp/amazon"
    }
  }
}

source "amazon-ebs" "ubuntu" {
  ami_name      = "lab-genai-lab-422-ubuntu-24.04-{{timestamp}}"
  instance_type = "t3.small"
  region        = "us-west-2"
  source_ami_filter {
    filters = {
      name                = "ubuntu/images/*ubuntu-noble-24.04-amd64-server-*"
      root-device-type    = "ebs"
      virtualization-type = "hvm"
    }
    most_recent = true
    owners      = ["099720109477"]
  }
  launch_block_device_mappings {
    device_name = "/dev/sda1"
    volume_size = 20
    volume_type = "gp3"
  }
  ssh_username = "ubuntu"
}

build {
  name    = "genai"
  sources = [
    "source.amazon-ebs.ubuntu"
  ]

  provisioner "shell" {
    inline = [
      "sudo systemctl disable --now unattended-upgrades.service",
      "sudo DEBIAN_FRONTEND=noninteractive apt-get update",
      "sudo DEBIAN_FRONTEND=noninteractive apt-get install -y net-tools curl jq unzip mysql-client-core-8.0 python3-pip ca-certificates",
    ]
  }

  # Add Docker's official GPG key and repository
  provisioner "shell" {
    script = "./scripts/add-docker-repo.sh"
  }

  # Install Docker
  provisioner "shell" {
    inline = [
      "sudo DEBIAN_FRONTEND=noninteractive apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin",
      "sudo usermod -aG docker ubuntu",
    ]
  }

  # Install AWS CFN Bootstrap
  provisioner "shell" {
    inline = [
      "mkdir /home/ubuntu/aws-cfn-bootstrap-latest",
      "curl https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-py3-latest.tar.gz | tar xz -C /home/ubuntu/aws-cfn-bootstrap-latest --strip-components 1",
      "sudo ln -s /home/ubuntu/aws-cfn-bootstrap-latest/init/ubuntu/cfn-hup /etc/init.d/cfn-hup",
      "sudo pip install /home/ubuntu/aws-cfn-bootstrap-latest/ --break-system-packages",
      "sudo rm -rf /home/ubuntu/aws-cfn-bootstrap-latest",
    ]
  }


  # Install AWS CLI
  provisioner "shell" {
    inline = [
      "curl https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip -o awscliv2.zip",
      "unzip -q awscliv2.zip",
      "sudo ./aws/install",
      "rm -rf awscliv2.zip aws",
    ]
  }

  provisioner "shell" {
    inline = [
      "sudo docker pull cheesewang/tidb-lab-python-vscode:1.0",
      "sudo docker pull mysql:8.0",
      "sudo docker pull elasticsearch:8.18.1",
      "sudo docker pull quay.io/coreos/etcd:v3.5.18",
      "sudo docker pull minio/minio:RELEASE.2023-03-20T20-16-18Z",
      "sudo docker pull milvusdb/milvus:v2.5.10"
    ]
  }
}

# Build images:
# - ami-06ac6b412766a3137 (aws oregon)