diff --git a/build_library/parallels_pvs.sh b/build_library/parallels_pvs.sh new file mode 100644 index 0000000000..455fddb769 --- /dev/null +++ b/build_library/parallels_pvs.sh @@ -0,0 +1,573 @@ +#!/bin/bash + +# Mostly this just copies the below XML, but inserting random MAC address +# and UUID strings, and other options as appropriate. + +SCRIPT_ROOT=$(readlink -f $(dirname "$0")/..) +. "${SCRIPT_ROOT}/common.sh" || exit 1 + +DEFINE_string vm_name "CoreOS" "Name for this VM" +DEFINE_string disk_image "" "Disk image to reference." +DEFINE_integer memory_size 1024 "Memory size in MB" +DEFINE_string output_pvs "" "Path to write pvs file to, required." +DEFINE_boolean template ${FLAGS_FALSE} "Whether this vm is a template." + +# Parse command line +FLAGS "$@" || exit 1 +eval set -- "${FLAGS_ARGV}" + +# Die on any errors. +switch_to_strict_mode + +if [[ ! -d "${FLAGS_disk_image}" ]]; then + echo "No such disk image '${FLAGS_disk_image}'" >&2 + exit 1 +fi + +snapshot_image=$(find "${FLAGS_disk_image}" -name '*.hds') + +DISK_UUID=$(uuidgen) +DISK_NAME=$(basename "${FLAGS_disk_image}") +DISK_VIRTUAL_SIZE_BYTES=$(qemu-img info -f parallels --output json \ + "${snapshot_image}" | jq --raw-output '.["virtual-size"]') +DISK_ACTUAL_SIZE_BYTES=$(du --bytes "${snapshot_image}" | cut -f1) + +if [[ -z "${DISK_VIRTUAL_SIZE_BYTES}" ]]; then + echo "Unable to determine virtual size of '${snapshot_image}'" >&2 + exit 1 +fi + +PARALLELS_MAC_PREFIX=001C42 +macgen() { + hexdump -n3 -e "\"${PARALLELS_MAC_PREFIX}%06X\n\"" /dev/urandom +} + +datep() { + date -u "+%Y-%m-%d %H:%M:%S" +} + +template=0 +if [ ${FLAGS_template} -eq ${FLAGS_TRUE} ]; then + template=1 +fi + +cat >"${FLAGS_output_pvs}" < + + 10.3.0-29227 + 0 + + {$(uuidgen)} + {$(uuidgen)} + + + ${FLAGS_vm_name} + + {0ba0dd3e-d0bf-420c-a0b2-b83cb4d885c1} + + 1 + $(datep) + $(datep) + 0 + 1336536201 + + + + + + 0 + 0 + 0 + 1 + + + + 9 + 2309 + + ${template} + + + 0 + + 0 + 0 + + + + + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + 0 + 6 + 1 + 1 + + + 0 + 5 + 2 + 0 + + + 0 + 15 + 3 + 0 + + + 0 + 8 + 4 + 0 + + + 0 + 0 + + 0 + + + + + 1 + 2 + 0 + + + 0 + + + + 1 + 1 + 4 + 0 + 1 + 0 + 0 + 0 + 0 + + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + + 0 + 0 + + 0 + 1 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1752-01-01 + 00:00:00 + 1752-01-01 + 00:00:00 + + + 0 + + 0.0.0.0 + 0 + 0 + + + 0 + 1 + 0 + + 1 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 1 + 0 + 0 + 1 + 0 + 1 + + + + 0 + 0 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + + + 0 + 1 + 0 + 0 + 1 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + + + 0 + 0 + 0 + 2 + 1 + 1 + 1 + + 0 + 0 + 0 + 0 + 0 + 0 + + 1 + 1 + + + 0 + + + 0 + 1 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 1 + 60 + 0 + 0 + + + + + + 0.8 + 1 + 1 + 1 + + + 0 + 0 + 0 + 0 + 0 + + + 0 + 1 + + + 0 + + + 0 + + + 0 + + + 0 + + + + 0 + 86400 + 10 + 2 + 1 + + + 0 + 86400 + 50 + + + + + + 0 + 0 + + 0 + + + + 0 + + + + + + 0 + + + + + 0 + 1752-01-01 00:00:00 + https://parallels.com + + 1800 + 864000 + + + + 0 + + + 0 + 0 + + + 0 + + + + + + 0 + 0 + 0 + + 1 + 1 + 1 + + + 1 + 1 + 1 + 1 + + + + 1 + 0 + + + 0 + + + + + 1 + 0 + 2 + 1 + 0 + 0 + 0 + 2 + 0 + + 0 + 0 + + + 1 + 3 + + + 0 + + + ${FLAGS_memory_size} + 0 + 128 + 4294967295 + 50 + 1 + 70 + + + + 0 + 0 + 0 + 0 + + + 0 + 2 + 1 + 1 + 0 + + + + {$(uuidgen)} + 0 + 1 + 1 + 1 + ${DISK_NAME} + ${DISK_NAME} + 0 + 2 + 0 + 1 + $((DISK_VIRTUAL_SIZE_BYTES / 1024 / 1024)) + $((DISK_ACTUAL_SIZE_BYTES / 1024 / 1024)) + 0 + 0 + 0 + 2 + level2 + + + + 0 + 1 + 1 + 1 + eth0 + eth0 + 0 + -1 + Default Adapter + $(macgen) + $(macgen) + + 0 + 2 + 0 + + 3 + 0 + + 1 + 1 + 1 + + 0 + 0 + + 0 + + + 0 + + + 0 + + + + + + 0 + + + + + + + + 0 + + 0 + + + + +EOF diff --git a/build_library/vm_image_util.sh b/build_library/vm_image_util.sh index e6678a927b..af2b283e52 100644 --- a/build_library/vm_image_util.sh +++ b/build_library/vm_image_util.sh @@ -20,11 +20,13 @@ VALID_IMG_TYPES=( rackspace_onmetal rackspace_vhd vagrant + vagrant_parallels vagrant_vmware_fusion virtualbox vmware vmware_ova vmware_insecure + parallels xen gce brightbox @@ -159,6 +161,14 @@ IMG_vagrant_vmware_fusion_DISK_LAYOUT=vagrant IMG_vagrant_vmware_fusion_CONF_FORMAT=vagrant_vmware_fusion IMG_vagrant_vmware_fusion_OEM_PACKAGE=oem-vagrant +## vagrant_parallels +IMG_vagrant_parallels_FS_HOOK=box +IMG_vagrant_parallels_BUNDLE_FORMAT=box +IMG_vagrant_parallels_DISK_FORMAT=hdd +IMG_vagrant_parallels_DISK_LAYOUT=vagrant +IMG_vagrant_parallels_CONF_FORMAT=vagrant_parallels +IMG_vagrant_parallels_OEM_PACKAGE=oem-vagrant + ## vmware IMG_vmware_DISK_FORMAT=vmdk_scsi IMG_vmware_DISK_LAYOUT=vm @@ -178,6 +188,12 @@ IMG_vmware_insecure_DISK_LAYOUT=vm IMG_vmware_insecure_CONF_FORMAT=vmware_zip IMG_vmware_insecure_OEM_PACKAGE=oem-vagrant-key +## parallels +IMG_parallels_BUNDLE_FORMAT=pvm_tgz +IMG_parallels_DISK_FORMAT=hdd +IMG_parallels_DISK_LAYOUT=vm +IMG_parallels_CONF_FORMAT=pvs + ## ami IMG_ami_OEM_PACKAGE=oem-ec2-compat IMG_ami_OEM_USE=ec2 @@ -370,6 +386,7 @@ _disk_ext() { vmdk_ide) echo vmdk;; vmdk_scsi) echo vmdk;; vmdk_stream) echo vmdk;; + hdd) echo hdd;; secure_demo) echo bin;; *) echo "${disk_format}";; esac @@ -486,6 +503,7 @@ _run_box_fs_hook() { # Copy basic Vagrant configs from OEM mkdir -p "${VM_TMP_DIR}/box" cp -R "${VM_TMP_ROOT}/usr/share/oem/box/." "${VM_TMP_DIR}/box" + sudo rm -fr "${VM_TMP_ROOT}/usr/share/oem/box" } # Write the vm disk image to the target directory in the proper format @@ -529,6 +547,13 @@ _write_vmdk_scsi_disk() { assert_image_size "$2" vmdk } +_write_hdd_disk() { + "${BUILD_LIBRARY_DIR}/write_hdd.sh" \ + --input_disk_image "$1" \ + --input_disk_format "raw" \ + --output_disk "${2}" +} + _write_vmdk_stream_disk() { # requires two pass conversion, qemu-img doesn't properly support the # stream-optimized VMDK format. The special vmdk-convert tool only takes @@ -948,10 +973,6 @@ _write_vagrant_conf() { --memory_size "$vm_mem" \ --output_ovf "$ovf" \ --output_vagrant "$mac" - - cat > "${VM_TMP_DIR}"/box/metadata.json < "${VM_TMP_DIR}"/box/metadata.json < "${VM_TMP_DIR}"/box/metadata.json <"${json}" <&2 + exit 1 +fi + +rm -fr "${FLAGS_output_disk}" +mkdir -p "${FLAGS_output_disk}" +disk_name=$(basename "${FLAGS_output_disk}") + +touch "${FLAGS_output_disk}"/"${disk_name}" + +# this id is a constant and identifies the first snapshot of a disk +snapshot_uuid="{5fbaabe3-6958-40ff-92a7-860e329aab41}" +snapshot_name="${disk_name}".0.${snapshot_uuid}.hds +snapshot_path="${FLAGS_output_disk}"/"${snapshot_name}" + +qemu-img convert -f "${FLAGS_input_disk_format}" "${FLAGS_input_disk_image}" \ + -O parallels "${snapshot_path}" + +assert_image_size "${snapshot_path}" parallels + +DISK_VIRTUAL_SIZE_BYTES=$(qemu-img info -f parallels --output json \ + "${snapshot_path}" | jq --raw-output '.["virtual-size"]') + +if [[ -z "${DISK_VIRTUAL_SIZE_BYTES}" ]]; then + echo "Unable to determine virtual size of '${snapshot_path}'" >&2 + exit 1 +fi + +cat >"${FLAGS_output_disk}"/DiskDescriptor.xml < + + + $((DISK_VIRTUAL_SIZE_BYTES / 16 / 32)) + $((DISK_VIRTUAL_SIZE_BYTES / 16 / 32 / 512)) + 512 + 16 + 32 + 0 + + {00000000-0000-0000-0000-000000000000} + + + {$(uuidgen)} + coreos + + level2 + 1 + 0 + + + + + 0 + $((DISK_VIRTUAL_SIZE_BYTES / 16 / 32)) + 2048 + + ${snapshot_uuid} + Compressed + ${disk_name}.0.${snapshot_uuid}.hds + + + + + + ${snapshot_uuid} + {00000000-0000-0000-0000-000000000000} + + + +EOF