blob: 20b8958ff6d4853b0317c1dfcd97b112b2d839af [file] [log] [blame]
#cloud-config
#
# Copyright 2021 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# This script runs customization scripts on a COS VM instance. It pulls
# source from GCS and executes it.
write_files:
- path: /tmp/startup.sh
permissions: 0644
content: |
set +o history
set -o errexit
set -o pipefail
set -o nounset
set -x
status() {
$@ 2>&1 | sed "s/^/BuildStatus: /"
return "${PIPESTATUS[0]}"
}
# Setup the scratch disk for use among tasks that need it.
# Directories are created for any task that might use them.
# E.g. there will be a /mnt/disks/scratch/gpu for the gpu step
# and potentially other directories for other steps.
setup_scratch_disk() {
status mkdir -p /mnt/disks/scratch
status resize2fs -f /dev/disk/by-label/SCRATCH
status mount /dev/disk/by-label/SCRATCH /mnt/disks/scratch
status mkdir -p /mnt/disks/scratch/gpu
}
# To make sure that ARCH gets set properly, this function cannot run in a
# subshell.
set_arch() {
case "$(uname -m)" in
x86_64)
ARCH=amd64
;;
aarch64)
ARCH=arm64
;;
*)
ARCH="$(uname -m)"
;;
esac
status echo "Set ARCH to ${ARCH}"
}
run_provisioner() {
status $@ && ret=$? || ret=$?
if [[ "${ret}" != 0 ]]; then
if [[ "${ret}" == 3 ]]; then
status echo "Rebooting..."
sleep 15 || :
reboot
while true; do sleep 1; done
fi
echo "BuildFailed: exiting due to errors"
# Under normal circumstances, Daisy will delete the VM once it sees
# "BuildFailed". But sometimes Daisy will die unexpectedly, so we want
# to shutdown ourselves to conserve resources. Let's give Daisy 5
# minutes to capture logs and delete the VM. If Daisy doesn't do that in
# 5 minutes, let's shut ourselves down.
sleep 300 || :
shutdown -h now
while true; do sleep 1; done
else
echo "BuildSucceeded: Build completed with no errors. Shutting down..."
# Once we shut down, the serial logs will be gone. We need to give Daisy
# time to capture the serial logs. Once Daisy is done capturing the
# serial logs, it will add the "DaisyEnd" metadata key. Let's wait for
# that key to appear (and shutdown anyway after 5 minutes).
/mnt/disks/cidata/metadata_watcher_${ARCH} DaisyEnd
umount /mnt/disks/cidata
umount /mnt/disks/scratch || :
shutdown -h now
while true; do sleep 1; done
fi
}
main() {
status history -c
set_arch
if [[ -e /dev/disk/by-label/SCRATCH ]]; then
setup_scratch_disk
fi
status mkdir -p /mnt/disks/cidata
status mount /dev/disk/by-label/CIDATA /mnt/disks/cidata
if [[ ! -d /var/lib/.cos-customizer ]]; then
run_provisioner /mnt/disks/cidata/provisioner_${ARCH} run --config=/mnt/disks/cidata/config.json
else
run_provisioner /mnt/disks/cidata/provisioner_${ARCH} resume
fi
}
main
- path: /etc/systemd/system/customizer@.service
permissions: 0644
content: |
[Unit]
Description=Container-Optimized OS Customization Service
Wants=network-online.target gcr-online.target docker.service
After=network-online.target gcr-online.target docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
User=root
ExecStart=/bin/bash /tmp/startup.sh
ExecStopPost=/bin/bash -c 'rm /etc/systemd/system/customizer@.service'
StandardOutput=tty
StandardError=tty
TTYPath=%I
runcmd:
- echo "Starting startup service..."
- systemctl daemon-reload
- |
if [[ "$(uname -m)" == "aarch64" ]]; then
systemctl --no-block start customizer@-dev-ttyAMA2.service
else
systemctl --no-block start customizer@-dev-ttyS2.service
fi