Improve OVF documentation and provide functional demo.
This commit is contained in:
		| @@ -54,6 +54,8 @@ | ||||
|    This way the configured hostname of the system will be used if not provided | ||||
|    by metadata (LP: #838280) | ||||
|  - DataSourceOVF: change the default instance id to 'iid-dsovf' from 'nocloud' | ||||
|  - Improve the OVF documentation, and provide a simple command line | ||||
|    tool for creating a useful ISO file. | ||||
|  | ||||
| 0.6.1: | ||||
|  - fix bug in fixing permission on /var/log/cloud-init.log (LP: #704509) | ||||
|   | ||||
| @@ -1,11 +1,83 @@ | ||||
| - environment.xml | ||||
| This directory contains documentation and a demo of the OVF | ||||
| functionality that is present in cloud-init. | ||||
|  | ||||
| The example/ directory contains the following files: | ||||
|   example/ovf-env.xml | ||||
|   This is an example ovf environment file | ||||
|   to make an iso that qualifies for the ISO transport, do: | ||||
|     mkdir my-iso | ||||
|     cp environment.xml my-iso/ovf-env.xml | ||||
|     genisoimage -o transport.iso -r my-iso | ||||
|   Then, boot with that ISO attached as a CDrom | ||||
| - ProductSection.xml | ||||
|   TODO: document what the ProductSection can look like | ||||
| - maverick-server.ovf | ||||
|   Example generated by virtualbox "export" of a simple VM | ||||
| - example/ubuntu-server.ovf | ||||
|   Example generated by virtualbox "export" of a simple VM. | ||||
|   It contains a functional ProductSection also.  Given answers | ||||
|   to each of the Properties there, a suitable OVF environment file | ||||
|   (ovf-env.xml) could be created. | ||||
|  | ||||
| == Demo == | ||||
| In order to easily demonstrate this functionality, simple demo is | ||||
| contained here.  To boot a local virtual machine in either kvm or virtual | ||||
| box, follow the steps below. | ||||
|  | ||||
| - download a suitable Ubuntu image | ||||
|   Visit http://cloud-images.ubuntu.com/releases and download a disk image | ||||
|   of Natty, Oneiric or a newer release. | ||||
|  | ||||
|   $ burl="http://cloud-images.ubuntu.com/releases/" | ||||
|   $ disk="ubuntu-11.10-server-cloudimg-i386-disk1" | ||||
|   $ wget "$burl/11.10/release/$disk.img" -O "$disk.img" | ||||
|  | ||||
| - If you're going to use virtual box, you will need to convert the image | ||||
|   from qcow2 format into a virtual-box friendly VHD format.   | ||||
|   $ qemu-img convert -O vdi "$disk.img" "ubuntu.vdi" | ||||
|  | ||||
| - If you're using kvm, you should create a qcow delta image to store | ||||
|   the changes so you keep the original pristine. | ||||
|   $ qemu-img create -f qcow2 -b "$disk.img" "ubuntu.qcow2" | ||||
|  | ||||
|   Optionally, you could decompress the image, which will make it boot faster | ||||
|   but will take up more local disk space. | ||||
|   $ qemu-img convert -O qcow2 "$disk.img" "$disk.qcow2" | ||||
|   $ qemu-img create -O qcow2 -b "$disk.qcow2" ubuntu.qcow2 | ||||
|  | ||||
| - Create an ISO file that will provide user-data to the image. | ||||
|   This will put the contents of 'user-data' into an ovf-env.xml file | ||||
|   and create an ISO file that can then be attached at boot to provide | ||||
|   the user data to cloud-init. | ||||
|  | ||||
|   $ ./make-iso ovf-env.xml.tmpl user-data --output ovftransport.iso | ||||
|  | ||||
| - Boot your virtual machine | ||||
|   The cloud-images boot with kernel and boot progress to ttyS0. | ||||
|   You can change that at the grub prompt if you'd like by editing the | ||||
|   kernel entry.  Otherwise, to see progress you'll need to switch | ||||
|   to the serial console.  In kvm graphic mode, you do that by clicking | ||||
|   in the window and then pressing pressing 'ctrl-alt-3'.  For information | ||||
|   on how to do that in virtualbox or kvm curses, see the relevant | ||||
|   documentation. | ||||
|  | ||||
|   KVM: | ||||
|    $ kvm -drive file=ubuntu.qcow2,if=virtio -cdrom ovftransport.iso \ | ||||
|         -m 256 -net nic -net user,hostfwd=tcp::2222-:22 | ||||
|  | ||||
|   VirtualBox: | ||||
|    - Launch the GUI and create a new vm with $disk.vdi and ovftransport.iso | ||||
|      attached. | ||||
|    - If you use 'NAT' networking, then forward a port (2222) to the | ||||
|      guests' port 22 to be able to ssh. | ||||
|  | ||||
|   Upon successful boot you will be able to log in as the 'ubuntu' user | ||||
|   with the password 'passw0rd' (which was set in the 'user-data' file). | ||||
|    | ||||
|   You will also be able to ssh to the instance with the provided: | ||||
|   $ chmod 600 ovfdemo.pem | ||||
|   $ ssh -i ovfdemo.pem -p 2222 ubuntu@localhost | ||||
|  | ||||
| - Notes: | ||||
|   * The 'instance-id' that is set in the ovf-env.xml image needs to | ||||
|     be unique.  If you want to run the first-boot code of cloud-init | ||||
|     again you will either have to remove /var/lib/cloud ('rm -Rf' is fine) | ||||
|     or create a new cdrom with a different instance-id.  To do the | ||||
|     ladder, simply add the '--instance-id=' flag to the 'make-iso' | ||||
|     command above and start your vm with the new ISO attached. | ||||
|   | ||||
							
								
								
									
										156
									
								
								doc/ovf/make-iso
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										156
									
								
								doc/ovf/make-iso
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,156 @@ | ||||
| #!/bin/bash | ||||
|  | ||||
| VERBOSITY=0 | ||||
| PROPERTIES=( instance-id   hostname              user-data seedfrom ) | ||||
| DEFAULTS=(   "i-ovfdemo00" "ovfdemo.localdomain" ""        ""       ) | ||||
|  | ||||
| DEF_OUTPUT="ovftransport.iso" | ||||
| TEMP_D="" | ||||
|  | ||||
| error() { echo "$@" 1>&2; } | ||||
| fail() { [ $# -eq 0 ] || error "$@"; exit 1; } | ||||
|  | ||||
| # propvalue(name, value) | ||||
| propvalue() { | ||||
| 	local prop="" val="$2" i=0 | ||||
| 	for prop in "${PROPERTIES[@]}"; do | ||||
| 		if [ "$prop" = "$1" ]; then | ||||
| 			[ $# -eq 1 ] || DEFAULTS[$i]="$2" | ||||
| 			_RET=${DEFAULTS[$i]} | ||||
| 			return | ||||
| 		fi | ||||
| 		i=$(($i+1)) | ||||
| 	done | ||||
| 	return | ||||
| } | ||||
|  | ||||
| Usage() { | ||||
| 	cat <<EOF | ||||
| Usage: ${0##*/} ovf-env.xml.tmpl [user-data-file] | ||||
|  | ||||
|    create an an ovf transport iso with ovf-env.xml.tmpl | ||||
|    as ovf-env.xml on the iso. | ||||
|  | ||||
|    if user-data-file is given, the file's contents will be base64 encoded | ||||
|    and stuffed inside ovf-env.xml. This will override the '--user-data' | ||||
|    argument. | ||||
|  | ||||
|    options: | ||||
|      -o | --output OUTPUT    write output to OUTPUT [default: $DEF_OUTPUT] | ||||
|      -v | --verbose          increase verbosity | ||||
|  | ||||
| EOF | ||||
| 	local i="" | ||||
| 	for i in "${PROPERTIES[@]}"; do | ||||
| 		propvalue "$i" | ||||
| 		printf "%10s--%-17s%s\n" "" "$i" "set $i. [default: '$_RET']" | ||||
| 	done | ||||
| 	cat <<EOF | ||||
|  | ||||
|    Example: | ||||
|      $ ${0##*/} --hostname "foobar.mydomain" ovf-env.xml.tmpl user-data | ||||
|  | ||||
| EOF | ||||
| } | ||||
|  | ||||
| bad_Usage() { Usage 1>&2; [ $# -eq 0 ] || error "$@"; exit 1; } | ||||
| cleanup() { | ||||
|    [ -z "${TEMP_D}" -o ! -d "${TEMP_D}" ] || rm -Rf "${TEMP_D}" | ||||
| } | ||||
|  | ||||
| debug() { | ||||
| 	local level=${1}; shift; | ||||
| 	[ "${level}" -ge "${VERBOSITY}" ] && return | ||||
| 	error "${@}" | ||||
| } | ||||
|  | ||||
| short_opts="ho:v" | ||||
| long_opts="help,output:,verbose" | ||||
| for i in "${PROPERTIES[@]}"; do | ||||
| 	long_opts="$long_opts,$i:" | ||||
| done | ||||
| getopt_out=$(getopt --name "${0##*/}" \ | ||||
| 	--options "${short_opts}" --long "${long_opts}" -- "$@") && | ||||
| 	eval set -- "${getopt_out}" || | ||||
| 	bad_Usage | ||||
|  | ||||
| ## <<insert default variables here>> | ||||
| output="${DEF_OUTPUT}" | ||||
| user_data="" | ||||
|  | ||||
| while [ $# -ne 0 ]; do | ||||
| 	cur=${1}; next=${2}; | ||||
| 	case "$cur" in | ||||
| 		-h|--help) Usage ; exit 0;; | ||||
| 		-o|--output) output=${2}; shift;; | ||||
| 		-v|--verbose) VERBOSITY=$((${VERBOSITY}+1));; | ||||
| 		--) shift; break;; | ||||
| 		--*) | ||||
| 			for i in "${PROPERTIES[@]}" _none_; do | ||||
| 				[ "${cur#--}" == "$i" ] || continue | ||||
| 				[ "$i" != "user-data" ] || | ||||
| 					next=$(echo "$next" | base64 --wrap=0) || | ||||
| 						fail "failed to base64 encode userdata" | ||||
| 				propvalue "$i" "$next" | ||||
| 				break | ||||
| 			done | ||||
| 			[ "$i" = "_none_" ] && bad_Usage "confused by $cur" | ||||
| 			;; | ||||
| 	esac | ||||
| 	shift; | ||||
| done | ||||
|  | ||||
| [ $# -eq 1 -o $# -eq 2 ] || | ||||
| 	bad_Usage "wrong number of arguments" | ||||
|  | ||||
| env_tmpl="$1" | ||||
| ud_file="$2" | ||||
|  | ||||
| [ -f "$env_tmpl" ] || bad_Usage "$env_tmpl: not a file" | ||||
| [ -z "$ud_file" -o -f "$ud_file" ] || | ||||
| 	bad_Usage "$ud_file: not a file" | ||||
|  | ||||
| TEMP_D=$(mktemp -d "${TMPDIR:-/tmp}/${0##*/}.XXXXXX") || | ||||
|    fail "failed to make tempdir" | ||||
| trap cleanup EXIT | ||||
|  | ||||
| mkdir "$TEMP_D/iso" && iso_d="$TEMP_D/iso" || | ||||
| 	fail "failed to make a tempdir?" | ||||
| ovf_env="$TEMP_D/iso/ovf-env.xml" | ||||
|  | ||||
| if [ -n "$ud_file" ]; then | ||||
| 	user_data=$(base64 --wrap=0 "$ud_file") || | ||||
| 		fail "failed to base64 encode $ud_file. Do you have base64 installed?" | ||||
| 	propvalue user-data "$user_data" | ||||
| fi | ||||
|  | ||||
| changes=( ) | ||||
| for i in "${PROPERTIES[@]}"; do | ||||
| 	changes[${#changes[@]}]="-e" | ||||
| 	propvalue "$i" | ||||
| 	changes[${#changes[@]}]="s|@@$i@@|$_RET|g" | ||||
| done | ||||
|  | ||||
| sed "${changes[@]}" "$env_tmpl" > "$ovf_env" || | ||||
| 		fail "failed to replace string in $env_tmpl" | ||||
|  | ||||
| if [ "${#changes[@]}" -ne 0 ]; then | ||||
| 	cmp "$ovf_env" "$env_tmpl" >/dev/null && | ||||
| 		fail "nothing replaced in $ovf_env.  template is identical to output" | ||||
| fi | ||||
|  | ||||
| debug 1 "creating iso with: genisoimage -o tmp.iso -r iso" | ||||
| ( cd "$TEMP_D" &&  | ||||
| 	genisoimage -V OVF-TRANSPORT -o tmp.iso -r iso 2>/dev/null ) || | ||||
| 	fail "failed to create iso. do you have genisoimage?" | ||||
|  | ||||
| if [ "$output" = "-" ]; then | ||||
| 	cat "$TEMP_D/tmp.iso" | ||||
| else | ||||
| 	cp "$TEMP_D/tmp.iso" "$output" || | ||||
| 		fail "failed to write to $output" | ||||
| fi | ||||
|  | ||||
| error "wrote iso to $output" | ||||
| exit 0 | ||||
| # vi: ts=4 noexpandtab | ||||
							
								
								
									
										28
									
								
								doc/ovf/ovf-env.xml.tmpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								doc/ovf/ovf-env.xml.tmpl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <Environment xmlns="http://schemas.dmtf.org/ovf/environment/1" | ||||
|     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
|     xmlns:oe="http://schemas.dmtf.org/ovf/environment/1" | ||||
|     xsi:schemaLocation="http://schemas.dmtf.org/ovf/environment/1 ../dsp8027.xsd" | ||||
|     oe:id="WebTier"> | ||||
|      | ||||
|     <!-- This example reference a local schema file, to validate against online schema use: | ||||
|     xsi:schemaLocation="http://schemas.dmtf.org/ovf/envelope/1 http://schemas.dmtf.org/ovf/envelope/1/dsp8027_1.0.0.xsd" | ||||
|     --> | ||||
|      | ||||
|     <!-- Information about hypervisor platform --> | ||||
|     <oe:PlatformSection> | ||||
|         <Kind>ESX Server</Kind> | ||||
|         <Version>3.0.1</Version> | ||||
|         <Vendor>VMware, Inc.</Vendor> | ||||
|         <Locale>en_US</Locale> | ||||
|     </oe:PlatformSection> | ||||
|  | ||||
|     <!--- Properties defined for this virtual machine --> | ||||
|     <PropertySection> | ||||
|         <Property oe:key="instance-id" oe:value="@@instance-id@@"/> | ||||
|         <Property oe:key="hostname" oe:value="@@hostname@@"/> | ||||
|         <Property oe:key="user-data" oe:value="@@user-data@@"/> | ||||
|         <Property oe:key="seedfrom" oe:value="@@seedfrom@@"/> | ||||
|     </PropertySection> | ||||
|  | ||||
| </Environment> | ||||
							
								
								
									
										27
									
								
								doc/ovf/ovfdemo.pem
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								doc/ovf/ovfdemo.pem
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| -----BEGIN RSA PRIVATE KEY----- | ||||
| MIIEpAIBAAKCAQEA1Zq/11Rky/uHdbKJewmEtDABGoSjIFyjoY04T5dFYUNwi0B6 | ||||
| Km7b85Ylqmi/1KmR4Zvi++dj10XnusoWr/Zruv85hHilMZ9GozL2RD6jU/CaI+rB | ||||
| QkKSaR/CdmEHBbRimq6T2E9chMhJY0jNzeexJSKVR3QeLdbRZ64H7QGTHp7Ulodu | ||||
| vS9VwAWcpYbGgcM541fboFAiJOLICM1UPH4x5WDkTq/6yeElSmeiE2lHtESHhyMJ | ||||
| OSDB3YZ5hw1+4bY3sR+0vZ3VQWzpn1Lwg1X3AZA8yf+ZsmMZHhTFeCglsd8jlLHk | ||||
| Wudh5mJBkCuwPvRQk1gE5gSnTGti0TUqLIrNRwIDAQABAoIBAGZMrdIXxgp3VWHF | ||||
| 9tfpMBgH4Y9stJ98HpXxh2V+4ih53v2iDKAj5c1cPH/HmQ/lgktVmDjikct43El2 | ||||
| HbV6RBATyd0q1prUWEUy1ATNJvW9hmTrOlFchrg4EK8XOwC9angAYig3oeyp65PU | ||||
| O1SAwTMyw+GruARmHHYWQA9/MJF5yexrjBw00w7hnCsqjezU5YIYsXwgcz0Zw+Ix | ||||
| fDJcZFXF9X3Al7H3ZILW3PpfhcVl7WzkL47TIX4oB/ab2kltaTE90SZMXKVcLvTI | ||||
| 6To2xJAnMUyasRfcGmvE8m0SqWqp66POAUDF2I8qu78inKH2u0rNtLQjyx5btF5K | ||||
| A39bPnkCgYEA8Joba3QFrbd0zPTP/DawRtTXzdIQcNjj4XEefxBN3Cw7MlCsfgDc | ||||
| xiAR703zqQ/IDkF00XrU5w7rmDga3Pv66JRzFDwvRVtGb6QV+lg7Ypd/6NI1G5AS | ||||
| 0Qzneer2JytEpHoTqGH/vWcXzJRH2BfaPK/vEF4qhAXBqouz2DXn3EUCgYEA40ZU | ||||
| eDc4MmHOSuqoggSEDJ5NITgPbdkwOta0BmnBZ36M5vgqN8EfAZISKocLNlERDrRG | ||||
| MpBlQCulq3rpU7WYkx8hGE21f1YBo+vKkffI56ptO2lAp5iLflkSOypdiVN6OELW | ||||
| 5SzkViohDnxKc6eshVycnNoxh6MqE6ugWSd6ahsCgYEA6t0kQwIgwPDCfYfEt2kT | ||||
| LjF675lNHzs5R8pKgLKDrpcmufjySJXC7UxE9ZrcbX3QRcozpIEI7vwrko3B+1Gm | ||||
| Hf87TtdpNYTh/vznz1btsVI+NCFuYheDprm4A9UOsDGWchAQvF/dayAFpVhhwVmX | ||||
| WYJMFWg2jGWqJTb2Oep1CRkCgYEAqzdkk1wmPe5o1w+I+sokIM1xFcGB/iNMrkbp | ||||
| QJuTVECGLcpvI6mdjjVY8ijiTX0s+ILfD2CwpnM7T8A83w9DbjJZYFHKla9ZdQBB | ||||
| j024UK6Xs9ZLGvdUv06i6We1J6t3u8K+2c/EBRWf6aXBAPgkhCOM6K2H+sL1A/Sb | ||||
| zA5trlkCgYArqJCk999mXQuMjNv6UTwzB0iYDjAFNgJdFmPMXlogD51r0HlGeCgD | ||||
| OEyup4FdIvX1ZYOCkKyieSngmPmY/P4lZBgQbM23FMp+oUkA+FlVW+WNVoXagUrh | ||||
| abatKtbZ+WZHHmgSoC8sAo5KnxM9O0R6fWlpoIhJTVoihkZYdmnpMg== | ||||
| -----END RSA PRIVATE KEY----- | ||||
							
								
								
									
										7
									
								
								doc/ovf/user-data
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								doc/ovf/user-data
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| #cloud-config | ||||
| password: passw0rd | ||||
| chpasswd: { expire: False } | ||||
| ssh_pwauth: True | ||||
|  | ||||
| ssh_authorized_keys: | ||||
|   - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDVmr/XVGTL+4d1sol7CYS0MAEahKMgXKOhjThPl0VhQ3CLQHoqbtvzliWqaL/UqZHhm+L752PXRee6yhav9mu6/zmEeKUxn0ajMvZEPqNT8Joj6sFCQpJpH8J2YQcFtGKarpPYT1yEyEljSM3N57ElIpVHdB4t1tFnrgftAZMentSWh269L1XABZylhsaBwznjV9ugUCIk4sgIzVQ8fjHlYOROr/rJ4SVKZ6ITaUe0RIeHIwk5IMHdhnmHDX7htjexH7S9ndVBbOmfUvCDVfcBkDzJ/5myYxkeFMV4KCWx3yOUseRa52HmYkGQK7A+9FCTWATmBKdMa2LRNSosis1H ubuntu@ovfdemo | ||||
		Reference in New Issue
	
	Block a user
	 Scott Moser
					Scott Moser