env/netbsd-amd64: update build VM to 10.1

This updates the amd64 machine image to NetBSD 10.1 and LUCI
(bootstrapswarm).

For golang/go#57997.

Change-Id: I0727cdd97d9efca53fb4235f5d770d3aa780e4b0
Reviewed-on: https://go-review.googlesource.com/c/build/+/536155
Commit-Queue: Benny Siegert <bsiegert@gmail.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org>
Auto-Submit: Benny Siegert <bsiegert@gmail.com>
diff --git a/env/netbsd-386/make.bash b/env/netbsd-386/make.bash
index 625a098..db7fbd8 100755
--- a/env/netbsd-386/make.bash
+++ b/env/netbsd-386/make.bash
@@ -47,7 +47,7 @@
 python3 setup.py build
 cd ..
 
-env PYTHONPATH=${PWD}/anita-${ANITA_VERSION} python3 ../netbsd-amd64/mkvm.py ${ARCH} ${RELEASE} ${PKG_RELEASE}
+env PYTHONPATH=${PWD}/anita-${ANITA_VERSION} python3 mkvm.py ${ARCH} ${RELEASE} ${PKG_RELEASE}
 
 echo "Archiving wd0.img (this may take a while)"
 ${TAR} -Szcf ${VM_IMAGE} --transform s,${WORKDIR}/wd0.img,disk.raw, ${WORKDIR}/wd0.img
diff --git a/env/netbsd-386/mkvm.py b/env/netbsd-386/mkvm.py
new file mode 100644
index 0000000..7adda46
--- /dev/null
+++ b/env/netbsd-386/mkvm.py
@@ -0,0 +1,77 @@
+#!/usr/bin/env python
+# Copyright 2016 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.
+
+import anita
+import sys
+
+arch = sys.argv[1]
+release = sys.argv[2]
+pkg_release = sys.argv[3]
+
+commands = [
+    """cat >> /etc/rc.local <<EOF
+(
+  export PATH=/usr/pkg/bin:/usr/pkg/sbin:${PATH}
+  export GOROOT_BOOTSTRAP=/usr/pkg/go14
+  set -x
+  echo 'starting buildlet script'
+  netstat -rn
+  cat /etc/resolv.conf
+  dig metadata.google.internal
+  (
+    set -e
+    curl -o /buildlet \$(curl -H 'Metadata-Flavor: Google' http://metadata.google.internal/computeMetadata/v1/instance/attributes/buildlet-binary-url)
+    chmod +x /buildlet
+    exec /buildlet
+  )
+  echo 'giving up'
+  sleep 10
+  halt -p
+)
+EOF""",
+    """cat > /etc/ifconfig.vioif0 << EOF
+!dhcpcd
+mtu 1460
+EOF""",
+    "dhcpcd -w",
+    "env PKG_PATH=http://ftp.netbsd.org/pub/pkgsrc/packages/NetBSD/%s/%s/All/ pkg_add bash curl" % (arch, pkg_release),
+    "env PKG_PATH=http://ftp.netbsd.org/pub/pkgsrc/packages/NetBSD/%s/%s/All/ pkg_add git-base" % (arch, pkg_release),
+    "env PKG_PATH=http://ftp.netbsd.org/pub/pkgsrc/packages/NetBSD/%s/%s/All/ pkg_add mozilla-rootcerts mozilla-rootcerts-openssl go14" % (arch, pkg_release),
+    # Interactive debugging tools for users using gomote ssh:
+    "env PKG_PATH=http://ftp.netbsd.org/pub/pkgsrc/packages/NetBSD/%s/%s/All/ pkg_add emacs25-nox11 vim screen" % (arch, pkg_release),
+    # For https://golang.org/issue/24354
+    "env PKG_PATH=http://ftp.netbsd.org/pub/pkgsrc/packages/NetBSD/%s/%s/All/ pkg_add clang cmake" % (arch, pkg_release),
+
+    # Remove the /tmp entry, because it's mounted as tmpfs -s=ram%25 by default, which isn't enough disk space.
+    """ed /etc/fstab << EOF
+H
+/\\/tmp/d
+wq
+EOF""",
+
+    "echo sshd=yes >> /etc/rc.conf",
+    "echo PermitRootLogin without-password >> /etc/ssh/sshd_config",
+    "/etc/rc.d/sshd restart",
+    "sync; shutdown -hp now",
+]
+
+a = anita.Anita(
+    anita.URL('https://nycdn.netbsd.org/pub/NetBSD-daily/NetBSD-9/latest/%s/' % arch),
+    workdir="work-NetBSD-%s" % arch,
+    disk_size="16G",
+    memory_size="2G",
+    persist=True)
+child = a.boot()
+anita.login(child)
+
+for cmd in commands:
+  anita.shell_cmd(child, cmd, 3600)
+
+# Sometimes, the halt command times out, even though it has completed
+# successfully.
+try:
+    a.halt()
+except:
+    pass
diff --git a/env/netbsd-amd64/anita-2.10.tar.gz.sha1 b/env/netbsd-amd64/anita-2.10.tar.gz.sha1
deleted file mode 100644
index c884994..0000000
--- a/env/netbsd-amd64/anita-2.10.tar.gz.sha1
+++ /dev/null
@@ -1 +0,0 @@
-042deb4c820091bc5a55560ec65ec50c997b2bd3  anita-2.10.tar.gz
diff --git a/env/netbsd-amd64/anita-2.15.tar.gz.sha1 b/env/netbsd-amd64/anita-2.15.tar.gz.sha1
new file mode 100644
index 0000000..fa9553a
--- /dev/null
+++ b/env/netbsd-amd64/anita-2.15.tar.gz.sha1
@@ -0,0 +1 @@
+20a7b3df21e6d455b71acb994d81b27df8b6f473  anita-2.15.tar.gz
diff --git a/env/netbsd-amd64/make.bash b/env/netbsd-amd64/make.bash
index dbae1ab..75dd30b 100755
--- a/env/netbsd-amd64/make.bash
+++ b/env/netbsd-amd64/make.bash
@@ -14,11 +14,9 @@
 
 set -e -x
 
-ANITA_VERSION=2.10
+ANITA_VERSION=2.15
 ARCH=amd64
-RELEASE=9.3
-# The release that the packages have been built for.
-PKG_RELEASE=9.0_2022Q2
+RELEASE=10.1
 
 # Must use GNU tar. On NetBSD, tar is BSD tar and gtar is GNU.
 TAR=tar
@@ -26,10 +24,8 @@
   TAR=gtar
 fi
 
-LATEST_BUILD=`curl -Ls -w '%{url_effective}'  -o /dev/null https://nycdn.netbsd.org/pub/NetBSD-daily/netbsd-9/latest/ | xargs basename`
-
 WORKDIR=work-NetBSD-${ARCH}
-VM_IMAGE=vm-image-netbsd-${ARCH}-${LATEST_BUILD}.tar.gz
+VM_IMAGE=vm-image-netbsd-${ARCH}-${RELEASE}.tar.gz
 
 # Remove WORKDIR unless -k (keep) is given.
 if [ "$1" != "-k" ]; then
@@ -47,7 +43,7 @@
 python3 setup.py build
 cd ..
 
-env PYTHONPATH=${PWD}/anita-${ANITA_VERSION} python3 mkvm.py ${ARCH} ${RELEASE} ${PKG_RELEASE}
+env PYTHONPATH=${PWD}/anita-${ANITA_VERSION} python3 mkvm.py ${ARCH} ${RELEASE}
 
 
 echo "Archiving wd0.img (this may take a while)"
diff --git a/env/netbsd-amd64/mkvm.py b/env/netbsd-amd64/mkvm.py
index 8ec5c51..84fa7a7 100644
--- a/env/netbsd-amd64/mkvm.py
+++ b/env/netbsd-amd64/mkvm.py
@@ -8,23 +8,45 @@
 
 arch = sys.argv[1]
 release = sys.argv[2]
-pkg_release = sys.argv[3]
+
+pkg_path = "https://cdn.netbsd.org/pub/pkgsrc/packages/NetBSD/{arch}/{release}/All".format(arch=arch, release=release)
+install_packages = [
+    "pkg_alternatives",
+    "bash",
+    "curl",
+    "git-base",
+    "go123",
+    "doas",
+    # Interactive debugging tools for users using gomote ssh
+    "emacs29-nox11",
+    "vim",
+    "screen",
+    # For https://golang.org/issue/24354
+    "clang",
+    "cmake",
+]
 
 commands = [
     """cat >> /etc/rc.local <<EOF
 (
-  export PATH=/usr/pkg/bin:/usr/pkg/sbin:${PATH}
-  export GOROOT_BOOTSTRAP=/usr/pkg/go14
+  export PATH=/usr/pkg/bin:/usr/pkg/sbin:\${PATH}
+  export GOROOT_BOOTSTRAP=/usr/pkg/go123
   set -x
-  echo 'starting buildlet script'
+  echo 'starting bootstrapswarm'
   netstat -rn
   cat /etc/resolv.conf
   dig metadata.google.internal
+
+  gcehost=\$(curl -s -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/hostname | cut -d . -f 1)
+  echo "Found GCE host ${gcehost}."
+  swarming=\$(curl -s -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/attributes/swarming | cut -d . -f 1)
+  swarming="\${swarming}.appspot.com"
+  echo "Found Swarming host \${swarming}."
   (
     set -e
-    curl -o /buildlet \$(curl -H 'Metadata-Flavor: Google' http://metadata.google.internal/computeMetadata/v1/instance/attributes/buildlet-binary-url)
-    chmod +x /buildlet
-    exec /buildlet
+    go install -o /bootstrapswarm golang.org/x/build/cmd/bootstrapswarm@latest
+    chmod +x /bootstrapswarm
+    exec su -l swarming -c /bootstrapswarm -hostname \$gcehost -swarming \$swarming
   )
   echo 'giving up'
   sleep 10
@@ -35,14 +57,20 @@
 !dhcpcd
 mtu 1460
 EOF""",
-    "dhcpcd",
-    "env PKG_PATH=http://ftp.netbsd.org/pub/pkgsrc/packages/NetBSD/%s/%s/All/ pkg_add bash curl" % (arch, pkg_release),
-    "env PKG_PATH=http://ftp.netbsd.org/pub/pkgsrc/packages/NetBSD/%s/%s/All/ pkg_add git-base" % (arch, pkg_release),
-    "env PKG_PATH=http://ftp.netbsd.org/pub/pkgsrc/packages/NetBSD/%s/%s/All/ pkg_add mozilla-rootcerts mozilla-rootcerts-openssl go14" % (arch, pkg_release),
-    # Interactive debugging tools for users using gomote ssh:
-    "env PKG_PATH=http://ftp.netbsd.org/pub/pkgsrc/packages/NetBSD/%s/%s/All/ pkg_add emacs25-nox11 vim screen" % (arch, pkg_release),
-    # For https://golang.org/issue/24354
-    "env PKG_PATH=http://ftp.netbsd.org/pub/pkgsrc/packages/NetBSD/%s/%s/All/ pkg_add clang cmake" % (arch, pkg_release),
+    "useradd -m -p '*' swarming",
+    # Prefer IPv4 over v6
+    "echo ip6addrctl=YES >> /etc/rc.conf",
+    "echo ip6addrctl_policy=ipv4_prefer >> /etc/rc.conf",
+    "service ip6addrctl start",
+    "dhcpcd -w",
+    "env PKG_PATH={} pkg_add -v sqlite3".format(pkg_path),
+    "env PKG_PATH={} pkg_add -v pkgin".format(pkg_path),
+    "echo {} > /usr/pkg/etc/pkgin/repositories.conf".format(pkg_path),
+    "pkgin update",
+]
+commands.extend(["pkgin -y install {}".format(x) for x in install_packages])
+commands.extend([
+    "pkgin clean",
 
     # Remove the /tmp entry, because it's mounted as tmpfs -s=ram%25 by default, which isn't enough disk space.
     """ed /etc/fstab << EOF
@@ -53,13 +81,14 @@
 
     "echo sshd=yes >> /etc/rc.conf",
     "echo PermitRootLogin without-password >> /etc/ssh/sshd_config",
+    "echo 'permit nopass swarming as root' > /usr/pkg/etc/doas.conf",
     "/etc/rc.d/sshd restart",
     "sync; shutdown -hp now",
-]
+])
 
 a = anita.Anita(
-    anita.URL('https://nycdn.netbsd.org/pub/NetBSD-daily/NetBSD-9/latest/%s/' % arch),
-    workdir="work-NetBSD-%s" % arch,
+    anita.URL('https://cdn.netbsd.org/pub/NetBSD/NetBSD-{}/{}/'.format(release, arch)),
+    workdir="work-NetBSD-{}-{}".format(release, arch),
     disk_size="16G",
     memory_size="2G",
     persist=True)