| #!/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." |