Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 29 Oct 2014 17:04:09 +0000 (UTC)
From:      Glen Barber <gjb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r273833 - in projects/release-vmimage/release: . amd64 i386 tools
Message-ID:  <201410291704.s9TH499e043208@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: gjb
Date: Wed Oct 29 17:04:09 2014
New Revision: 273833
URL: https://svnweb.freebsd.org/changeset/base/273833

Log:
  Initial commit providing a mechanism to create
  openstack images as part of the release build.
  
  This mimics the way Microsoft Azure images are
  built, with the addition of installing the
  net/cloud-init package and adding a (commented)
  rc.conf(5) entry for cloudinit.
  
  Sponsored by:	The FreeBSD Foundation

Added:
  projects/release-vmimage/release/amd64/mk-openstack.sh   (contents, props changed)
  projects/release-vmimage/release/i386/mk-openstack.sh   (contents, props changed)
  projects/release-vmimage/release/tools/openstack.conf   (contents, props changed)
Modified:
  projects/release-vmimage/release/Makefile.vm

Modified: projects/release-vmimage/release/Makefile.vm
==============================================================================
--- projects/release-vmimage/release/Makefile.vm	Wed Oct 29 16:49:28 2014	(r273832)
+++ projects/release-vmimage/release/Makefile.vm	Wed Oct 29 17:04:09 2014	(r273833)
@@ -10,8 +10,10 @@ VMFORMATS?=	vhd vmdk qcow2 raw
 VMSIZE?=	20G
 VMBASE?=	vm
 
-CLOUDWARE?=	AZURE
+CLOUDWARE?=	AZURE \
+		OPENSTACK
 AZURE_FORMAT=	vhdf
+OPENSTACK_FORMAT=qcow2
 
 .if defined(WITH_CLOUDWARE) && !empty(WITH_CLOUDWARE) && !empty(CLOUDWARE)
 . for _CW in ${CLOUDWARE}
@@ -65,3 +67,13 @@ vm-azure:
 		${WORLDDIR} ${.TARGET} ${VMSIZE} ${AZUREIMAGE}
 .endif
 	touch ${.TARGET}
+
+vm-openstack:
+.if exists(${.CURDIR}/${TARGET}/mk-openstack.sh)
+	env TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} \
+		OPENSTACKCONF=${OPENSTACKCONF}
+		OPENSTACK_FORMAT=${OPENSTACK_FORMAT} \
+		${.CURDIR}/${TARGET}/mk-openstack.sh ${.TARGET} openstack.img \
+		${WORLDDIR} ${.TARGET} ${VMSIZE} ${OPENSTACKIMAGE}
+.endif
+	touch ${.TARGET}

Added: projects/release-vmimage/release/amd64/mk-openstack.sh
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/release-vmimage/release/amd64/mk-openstack.sh	Wed Oct 29 17:04:09 2014	(r273833)
@@ -0,0 +1,153 @@
+#!/bin/sh
+#-
+# Copyright (c) 2014 The FreeBSD Foundation
+# All rights reserved.
+#
+# This software was developed by Glen Barber under sponsorship
+# from the FreeBSD Foundation.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# mk-openstack.sh: Create virtual machine disk images for Openstack
+#
+# $FreeBSD$
+#
+
+export PATH="/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin"
+
+usage() {
+	echo "Usage:"
+	echo -n "$(basename ${0}) vm-openstack <base image>"
+	echo " <source tree> <dest dir> <disk image size> <vm image name>"
+	exit 1
+}
+
+panic() {
+	msg="${@}"
+	printf "${msg}\n"
+	if [ ! -z "${mddev}" ]; then
+		mdconfig -d -u ${mddev}
+	fi
+	# Do not allow one failure case to chain through any remaining image
+	# builds.
+	exit 0
+}
+
+vm_create_openstack() {
+	# Arguments:
+	# vm-openstack <base image> <source tree> <dest dir> <disk image size>
+	#	<vm image name>
+
+	VMBASE="${1}"
+	WORLDDIR="${2}"
+	DESTDIR="${3}"
+	VMSIZE="${4}"
+	VMIMAGE="${5}"
+
+	if [ -z "${VMBASE}" -o -z "${WORLDDIR}" -o -z "${DESTDIR}" \
+		-o -z "${VMSIZE}" -o -z "${VMIMAGE}" ]; then
+			usage
+	fi
+
+	trap "umount ${DESTDIR}/dev ${DESTDIR}" INT QUIT TRAP ABRT TERM
+
+	i=0
+	mkdir -p ${DESTDIR}
+	truncate -s ${VMSIZE} ${VMBASE}
+	mddev=$(mdconfig -f ${VMBASE})
+	newfs -j /dev/${mddev}
+	mkdir -p ${DESTDIR}
+	mount /dev/${mddev} ${DESTDIR}
+	make -C ${WORLDDIR} DESTDIR=$(realpath ${DESTDIR}) \
+		installworld installkernel distribution || \
+		panic "\n\nCannot install the base system to ${DESTDIR}."
+	mount -t devfs devfs ${DESTDIR}/dev
+	chroot ${DESTDIR} /usr/bin/newaliases
+	echo '# Custom /etc/fstab for FreeBSD VM images' \
+		> ${DESTDIR}/etc/fstab
+	echo '/dev/gpt/rootfs	/	ufs	rw	2	2' \
+		>> ${DESTDIR}/etc/fstab
+	echo '/dev/gpt/swapfs	none	swap	sw	0	0' \
+		>> ${DESTDIR}/etc/fstab
+
+	chroot ${DESTDIR} /etc/rc.d/ldconfig forcestart
+	chroot ${DESTDIR} env ASSUME_ALWAYS_YES=yes /usr/sbin/pkg bootstrap -y
+	if [ ! -z "${VM_EXTRA_PACKAGES}" ]; then
+	        chroot ${DESTDIR} env ASSUME_ALWAYS_YES=yes /usr/sbin/pkg install -y \
+	                ${VM_EXTRA_PACKAGES}
+	fi
+
+	rm -f ${DESTDIR}/etc/resolv.conf
+	echo 'sshd_enable="YES"' > ${DESTDIR}/etc/rc.conf
+	echo 'ifconfig_DEFAULT="SYNCDHCP"' >> ${DESTDIR}/etc/rc.conf
+
+	if [ ! -z "${VM_RC_LIST}" ]; then
+		for _rcvar in ${VM_RC_LIST}; do
+			echo ${_rcvar}_enable="YES" >> ${DESTDIR}/etc/rc.conf
+		done
+	fi
+
+	sync
+
+	while ! umount ${DESTDIR}/dev ${DESTDIR}; do
+		i=$(( $i + 1 ))
+		if [ $i -ge 10 ]; then
+			# This should never happen.  But, it has happened.
+			msg="Cannot umount(8) ${DESTDIR}\n"
+			msg="${msg}Something has gone horribly wrong."
+			panic "${msg}"
+		fi
+		sleep 1
+	done
+
+	echo "Creating image...  Please wait."
+
+	mkimg -f ${OPENSTACK_FORMAT} -s gpt \
+		-b /boot/pmbr -p freebsd-boot/bootfs:=/boot/gptboot \
+		-p freebsd-swap/swapfs::1G \
+		-p freebsd-ufs/rootfs:=${VMBASE} \
+		-o ${VMIMAGE}.raw
+
+	return 0
+}
+
+main() {
+	cmd="${1}"
+	shift 1
+
+	if [ -e "${OPENSTACKCONF}" -a ! -c "${OPENSTACKCONF}" ]; then
+		. ${OPENSTACKCONF}
+	fi
+
+	case ${cmd} in
+		vm-openstack)
+			eval vm_create_openstack "$@" || return 0
+			;;
+		*|\?)
+			usage
+			;;
+	esac
+
+	return 0
+}
+
+main "$@"

Added: projects/release-vmimage/release/i386/mk-openstack.sh
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/release-vmimage/release/i386/mk-openstack.sh	Wed Oct 29 17:04:09 2014	(r273833)
@@ -0,0 +1,153 @@
+#!/bin/sh
+#-
+# Copyright (c) 2014 The FreeBSD Foundation
+# All rights reserved.
+#
+# This software was developed by Glen Barber under sponsorship
+# from the FreeBSD Foundation.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# mk-openstack.sh: Create virtual machine disk images for Openstack
+#
+# $FreeBSD$
+#
+
+export PATH="/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin"
+
+usage() {
+	echo "Usage:"
+	echo -n "$(basename ${0}) vm-openstack <base image>"
+	echo " <source tree> <dest dir> <disk image size> <vm image name>"
+	exit 1
+}
+
+panic() {
+	msg="${@}"
+	printf "${msg}\n"
+	if [ ! -z "${mddev}" ]; then
+		mdconfig -d -u ${mddev}
+	fi
+	# Do not allow one failure case to chain through any remaining image
+	# builds.
+	exit 0
+}
+
+vm_create_openstack() {
+	# Arguments:
+	# vm-openstack <base image> <source tree> <dest dir> <disk image size>
+	#	<vm image name>
+
+	VMBASE="${1}"
+	WORLDDIR="${2}"
+	DESTDIR="${3}"
+	VMSIZE="${4}"
+	VMIMAGE="${5}"
+
+	if [ -z "${VMBASE}" -o -z "${WORLDDIR}" -o -z "${DESTDIR}" \
+		-o -z "${VMSIZE}" -o -z "${VMIMAGE}" ]; then
+			usage
+	fi
+
+	trap "umount ${DESTDIR}/dev ${DESTDIR}" INT QUIT TRAP ABRT TERM
+
+	i=0
+	mkdir -p ${DESTDIR}
+	truncate -s ${VMSIZE} ${VMBASE}
+	mddev=$(mdconfig -f ${VMBASE})
+	newfs -j /dev/${mddev}
+	mkdir -p ${DESTDIR}
+	mount /dev/${mddev} ${DESTDIR}
+	make -C ${WORLDDIR} DESTDIR=$(realpath ${DESTDIR}) \
+		installworld installkernel distribution || \
+		panic "\n\nCannot install the base system to ${DESTDIR}."
+	mount -t devfs devfs ${DESTDIR}/dev
+	chroot ${DESTDIR} /usr/bin/newaliases
+	echo '# Custom /etc/fstab for FreeBSD VM images' \
+		> ${DESTDIR}/etc/fstab
+	echo '/dev/gpt/rootfs	/	ufs	rw	2	2' \
+		>> ${DESTDIR}/etc/fstab
+	echo '/dev/gpt/swapfs	none	swap	sw	0	0' \
+		>> ${DESTDIR}/etc/fstab
+
+	chroot ${DESTDIR} /etc/rc.d/ldconfig forcestart
+	chroot ${DESTDIR} env ASSUME_ALWAYS_YES=yes /usr/sbin/pkg bootstrap -y
+	if [ ! -z "${VM_EXTRA_PACKAGES}" ]; then
+	        chroot ${DESTDIR} env ASSUME_ALWAYS_YES=yes /usr/sbin/pkg install -y \
+	                ${VM_EXTRA_PACKAGES}
+	fi
+
+	rm -f ${DESTDIR}/etc/resolv.conf
+	echo 'sshd_enable="YES"' > ${DESTDIR}/etc/rc.conf
+	echo 'ifconfig_DEFAULT="SYNCDHCP"' >> ${DESTDIR}/etc/rc.conf
+
+	if [ ! -z "${VM_RC_LIST}" ]; then
+		for _rcvar in ${VM_RC_LIST}; do
+			echo ${_rcvar}_enable="YES" >> ${DESTDIR}/etc/rc.conf
+		done
+	fi
+
+	sync
+
+	while ! umount ${DESTDIR}/dev ${DESTDIR}; do
+		i=$(( $i + 1 ))
+		if [ $i -ge 10 ]; then
+			# This should never happen.  But, it has happened.
+			msg="Cannot umount(8) ${DESTDIR}\n"
+			msg="${msg}Something has gone horribly wrong."
+			panic "${msg}"
+		fi
+		sleep 1
+	done
+
+	echo "Creating image...  Please wait."
+
+	mkimg -f ${OPENSTACK_FORMAT} -s gpt \
+		-b /boot/pmbr -p freebsd-boot/bootfs:=/boot/gptboot \
+		-p freebsd-swap/swapfs::1G \
+		-p freebsd-ufs/rootfs:=${VMBASE} \
+		-o ${VMIMAGE}.raw
+
+	return 0
+}
+
+main() {
+	cmd="${1}"
+	shift 1
+
+	if [ -e "${OPENSTACKCONF}" -a ! -c "${OPENSTACKCONF}" ]; then
+		. ${OPENSTACKCONF}
+	fi
+
+	case ${cmd} in
+		vm-openstack)
+			eval vm_create_openstack "$@" || return 0
+			;;
+		*|\?)
+			usage
+			;;
+	esac
+
+	return 0
+}
+
+main "$@"

Added: projects/release-vmimage/release/tools/openstack.conf
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/release-vmimage/release/tools/openstack.conf	Wed Oct 29 17:04:09 2014	(r273833)
@@ -0,0 +1,10 @@
+#!/bin/sh
+#
+# $FreeBSD$
+#
+
+# Set to a list of packages to install.
+export VM_EXTRA_PACKAGES="net/cloud-init"
+
+# Set to a list of third-party software to enable in rc.conf(5).
+export VM_RC_LIST="#cloudinit"



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201410291704.s9TH499e043208>