| #!/bin/bash | |
| # | |
| # Copyright 2021 The Chromium OS Authors. All rights reserved. | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| # | |
| # make_ova.sh -d [vmdk file] -o [ova file] -p[product-name] \ | |
| # -n[image-name] -t ${TEMPLATE_OVF} | |
| # | |
| # This scripts creates .ova file from given disk image and OVA template. | |
| # | |
| set -o xtrace | |
| set -o errexit | |
| set -o nounset | |
| SCRIPT_ROOT=$(dirname $(readlink -f "$0")) | |
| TEMPLATE_PATH=${SCRIPT_ROOT}/template.ovf | |
| WORKSPACE=${SCRIPT_ROOT%\/src\/scripts\/cos} | |
| BOARD=anthos-amd64-vsphere | |
| PRODUCT_NAME="Anthos OnPrem on COS" | |
| IMAGE_NAME="COS" | |
| IMAGE_TYPE="test" | |
| IMAGE_ROOT=${WORKSPACE}/src/build/images/${BOARD}/latest | |
| DISK_FILE=${IMAGE_ROOT}/chromiumos_${IMAGE_TYPE}_image.vmdk | |
| OUTPUT_FILE=${IMAGE_ROOT}/chromiumos_${IMAGE_TYPE}_image.ova | |
| usage() { | |
| echo "Usage: $0 -b board -d disk.vmdk \ | |
| -p product-name -n image-name \ | |
| -o output-file [-t template.ovf]" | |
| } | |
| while getopts ":b:d:p:n:t:o:h" arg; do | |
| case $arg in | |
| b) BOARDD=$OPTARG ;; | |
| d) DISK_FILE=$OPTARG ;; | |
| p) PRODUCT_NAME=$OPTARG ;; | |
| n) IMAGE_NAME=$OPTARG ;; | |
| t) TEMPLATE_PATH=$OPTARG ;; | |
| o) OUTPUT_FILE=$OPTARG ;; | |
| h) | |
| usage | |
| exit 0 | |
| ;; | |
| *) | |
| usage | |
| exit 1 | |
| ;; | |
| esac | |
| done | |
| : "${BOARD?Missing -d BOARD value}" | |
| : "${DISK_FILE?Missing -d DISK_FILE value}" | |
| : "${PRODUCT_NAME?Missing -p PRODUCT_NAME value}" | |
| : "${IMAGE_NAME?Missing -n IMAGE_NAME value}" | |
| : "${TEMPLATE_PATH?Missing -t TEMPLATE_PATH value}" | |
| : "${OUTPUT_FILE?Missing -o OUTPUT_FILE value}" | |
| if [[ ! -f ${TEMPLATE_PATH} ]]; then | |
| echo "Cannot find template at ${TEMPLATE_PATH}" | |
| exit 1 | |
| fi | |
| XML_NS=( | |
| -N 'x=http://schemas.dmtf.org/ovf/envelope/1' | |
| -N 'ovf=http://schemas.dmtf.org/ovf/envelope/1' | |
| -N 'vssd=http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData' | |
| ) | |
| WORK_DIR=$(mktemp -d) | |
| trap 'rm -rf "${WORK_DIR}"' EXIT | |
| # xmlstar does not support multiple updates at once, and we need to provide | |
| # namespaces to every invocation, so disable quoting warning. | |
| # shellcheck disable=SC2086 | |
| xmlstarlet ed ${XML_NS[*]} \ | |
| --update '//x:VirtualSystem/@ovf:id' --value "${IMAGE_NAME}" \ | |
| "${TEMPLATE_PATH}" \ | |
| | xmlstarlet ed ${XML_NS[*]} \ | |
| --update '//x:VirtualSystem/x:Name' --value "${IMAGE_NAME}" \ | |
| | xmlstarlet ed ${XML_NS[*]} \ | |
| --update '//vssd:VirtualSystemIdentifier' --value "${IMAGE_NAME}" \ | |
| > "${WORK_DIR}/tmp.ovf" | |
| # Add a disk image to temporary .ovf | |
| cot --force add-disk "${DISK_FILE}" "${WORK_DIR}/tmp.ovf" \ | |
| -o "${WORK_DIR}/image.ovf" \ | |
| -f vmdisk1 -t harddisk -c scsi | |
| # Add product information and convert .ovf to .ova | |
| cot --force edit-product "${WORK_DIR}/image.ovf" \ | |
| -o "${OUTPUT_FILE}" \ | |
| --product "${PRODUCT_NAME}" | |