blob: 7dafa0290c4912dc8c4cede40bc946966c0b36db [file] [log] [blame]
#!/bin/sh
# Copyright 2019 The Go Authors. All rights reserved.
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.
# This creates the debian-stretch-vmx buildlet VM that's
# like the Container-Optimized OS but using Debian Stretch
# instead of the Chromium OS, and with nested virtualization
# enabled.
set -e
set -x
ZONE=us-central1-f
TARGET_IMAGE=debian-stretch-vmx
TMP_DISK=dev-debian-vmx-tmpdisk
TMP_IMG=dev-debian-vmx-image
TMP_VM=dev-debian-vmx
# Create disk, forking Debian 9 (Stretch).
gcloud compute disks delete $TMP_DISK --zone=$ZONE --quiet || true
gcloud compute disks create $TMP_DISK \
--zone=$ZONE \
--size=40GB \
--image-project=debian-cloud \
--image-family debian-9
# Create image based on that disk, with the nested virtualization
# opt-in flag ("license").
gcloud compute images delete $TMP_IMG --quiet || true
gcloud compute images create \
$TMP_IMG \
--source-disk=$TMP_DISK \
--source-disk-zone=$ZONE \
--licenses "https://www.googleapis.com/compute/v1/projects/vm-options/global/licenses/enable-vmx"
# No longer need that temp disk:
gcloud compute disks delete $TMP_DISK --zone=$ZONE --quiet
# Create the VM
gcloud compute instances delete --zone=$ZONE $TMP_VM --quiet || true
gcloud compute instances create \
$TMP_VM \
--zone=$ZONE \
--image=$TMP_IMG \
--min-cpu-platform "Intel Haswell"
INTERNAL_IP=$(gcloud --format="value(networkInterfaces[0].networkIP)" compute instances list --filter="name=('$TMP_VM')")
EXTERNAL_IP=$(gcloud --format="value(networkInterfaces[0].accessConfigs[0].natIP)" compute instances list --filter="name=('$TMP_VM')")
echo "external IP: $EXTERNAL_IP, internal IP: $INTERNAL_IP"
echo "Waiting for SSH port to be available..."
while ! nc -w 2 -z $INTERNAL_IP 22; do
sleep 1
done
echo "SSH is up. Copying prep-vm.sh script to VM..."
# gcloud compute scp lacks an --internal-ip flag, even though gcloud
# compute ssh has it. Annoying. Workaround:
gcloud compute scp --dry-run --zone=$ZONE prep-vm.sh bradfitz@$TMP_VM: | perl -npe "s/$EXTERNAL_IP/$INTERNAL_IP/" | sh
# And prep the machine.
gcloud compute ssh $TMP_VM --zone=$ZONE --internal-ip -- sudo bash ./prep-vm.sh
echo "Done prepping machine; shutting down"
# Shut it down so it's a stable source to snapshot from.
gcloud compute instances stop $TMP_VM --zone=$ZONE
# Now make the new image from our instance's disk.
gcloud compute images delete $TARGET_IMAGE --quiet || true
gcloud compute images create $TARGET_IMAGE --source-disk=$TMP_VM --source-disk-zone=$ZONE
gcloud compute images delete $TMP_IMG --quiet
echo "Done."