Simplify Building Trove Guest Images

Enable Trove guest images to be build without going through the whole
redstack install, and redstack kick-start workflow. Also seperated out
the upload-to-glance pieces to enable this.

You can now simply build a mysql image using:
redstack build-image mysql

Partially implements blueprint: tempest-guest-tests
Change-Id: I671e22c19e1e11df677959e8f158f26c7da055c8
This commit is contained in:
Nikhil Manchanda
2014-04-28 14:59:58 -07:00
parent a84c7d6e0e
commit 95da12c4cd
12 changed files with 94 additions and 39 deletions

View File

@@ -12,10 +12,10 @@ source $_LIB/die
[ -n "$TMP_HOOKS_PATH." ] || die "Temp hook path not set"
[ -n "${GUEST_USERNAME}" ] || die "GUEST_USERNAME needs to be set to the user for the guest image"
[ -n "${HOST_USERNAME}" ] || die "HOST_USERNAME needs to be set to the user for the host instance"
[ -n "${HOST_SCP_USERNAME}" ] || die "HOST_SCP_USERNAME needs to be set to the user for the host instance"
[ -n "${NETWORK_GATEWAY}" ] || die "NETWORK_GATEWAY needs to be set to the user for the host instance"
[ -n "${ESCAPED_PATH_TROVE}" ] || die "ESCAPED_PATH_TROVE needs to be set to the path to the trove directory on the redstack host"
[ -n "${REDSTACK_SCRIPTS}" ] || die "REDSTACK_SCRIPTS needs to be set to the trove-integration scripts dir"
[ -n "${ESCAPED_GUEST_LOGDIR}" ] || die "ESCAPED_GUEST_LOGDIR must be set to the escaped guest log dir"
sed "s/GUEST_USERNAME/${GUEST_USERNAME}/g;s/GUEST_LOGDIR/${ESCAPED_GUEST_LOGDIR}/g;s/HOST_USERNAME/${HOST_USERNAME}/g;s/NETWORK_GATEWAY/${NETWORK_GATEWAY}/g;s/PATH_TROVE/${ESCAPED_PATH_TROVE}/g" ${REDSTACK_SCRIPTS}/files/trove-guest.systemd.conf > ${TMP_HOOKS_PATH}/trove-guest.service
sed "s/GUEST_USERNAME/${GUEST_USERNAME}/g;s/GUEST_LOGDIR/${ESCAPED_GUEST_LOGDIR}/g;s/HOST_SCP_USERNAME/${HOST_SCP_USERNAME}/g;s/NETWORK_GATEWAY/${NETWORK_GATEWAY}/g;s/PATH_TROVE/${ESCAPED_PATH_TROVE}/g" ${REDSTACK_SCRIPTS}/files/trove-guest.systemd.conf > ${TMP_HOOKS_PATH}/trove-guest.service

View File

@@ -12,10 +12,10 @@ source $_LIB/die
[ -n "$TMP_HOOKS_PATH." ] || die "Temp hook path not set"
[ -n "${GUEST_USERNAME}" ] || die "GUEST_USERNAME needs to be set to the user for the guest image"
[ -n "${HOST_USERNAME}" ] || die "HOST_USERNAME needs to be set to the user for the host instance"
[ -n "${HOST_SCP_USERNAME}" ] || die "HOST_SCP_USERNAME needs to be set to the user for the host instance"
[ -n "${NETWORK_GATEWAY}" ] || die "NETWORK_GATEWAY needs to be set to the user for the host instance"
[ -n "${ESCAPED_PATH_TROVE}" ] || die "ESCAPED_PATH_TROVE needs to be set to the path to the trove directory on the redstack host"
[ -n "${REDSTACK_SCRIPTS}" ] || die "REDSTACK_SCRIPTS needs to be set to the trove-integration scripts dir"
[ -n "${ESCAPED_GUEST_LOGDIR}" ] || die "ESCAPED_GUEST_LOGDIR must be set to the escaped guest log dir"
sed "s/GUEST_USERNAME/${GUEST_USERNAME}/g;s/GUEST_LOGDIR/${ESCAPED_GUEST_LOGDIR}/g;s/HOST_USERNAME/${HOST_USERNAME}/g;s/NETWORK_GATEWAY/${NETWORK_GATEWAY}/g;s/PATH_TROVE/${ESCAPED_PATH_TROVE}/g" ${REDSTACK_SCRIPTS}/files/trove-guest.upstart.conf > ${TMP_HOOKS_PATH}/trove-guest.conf
sed "s/GUEST_USERNAME/${GUEST_USERNAME}/g;s/GUEST_LOGDIR/${ESCAPED_GUEST_LOGDIR}/g;s/HOST_SCP_USERNAME/${HOST_SCP_USERNAME}/g;s/NETWORK_GATEWAY/${NETWORK_GATEWAY}/g;s/PATH_TROVE/${ESCAPED_PATH_TROVE}/g" ${REDSTACK_SCRIPTS}/files/trove-guest.upstart.conf > ${TMP_HOOKS_PATH}/trove-guest.conf

View File

@@ -0,0 +1 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDmQeA/uyEyFf9DsmwR+OztWb7Hb/uTC+R3xG1QgBvRwhSbpBnyBESGMZZ07bIw5Ib7BUSDzwoeryUqNAhAhir2KLeIYODS39UmTwOIl+rIvhlTxhsIoQHV90pewD2qw0T8KgVMPUDsQ0Bd98E6e5dbxciZp67ihVD0r7srhdSRo8PIc56hJWrD52j5FeiIGEmLXHXiZLOyma1M7j/EmiV81wHAzgql6sihWSZHm3xPZZ712JtXbmHhe3RLFIK13u9PSb3XbuEIdGwkZdzP+vYNE0CsYqwjXjVRrY/APsiEkbSNVzHI5p2W1L7ZMtSOMUqZ1Ve+sytVb+YcIJ9L8y07 trove@devstack

27
scripts/files/keys/id_rsa Normal file
View File

@@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA5kHgP7shMhX/Q7JsEfjs7Vm+x2/7kwvkd8RtUIAb0cIUm6QZ
8gREhjGWdO2yMOSG+wVEg88KHq8lKjQIQIYq9ii3iGDg0t/VJk8DiJfqyL4ZU8Yb
CKEB1fdKXsA9qsNE/CoFTD1A7ENAXffBOnuXW8XImaeu4oVQ9K+7K4XUkaPDyHOe
oSVqw+do+RXoiBhJi1x14mSzspmtTO4/xJolfNcBwM4KperIoVkmR5t8T2We9dib
V25h4Xt0SxSCtd7vT0m9127hCHRsJGXcz/r2DRNArGKsI141Ua2PwD7IhJG0jVcx
yOadltS+2TLUjjFKmdVXvrMrVW/mHCCfS/MtOwIDAQABAoIBAQCTAQHbjmwuHu8e
2F24x7Tz//UWPT9fbRtK/6RO3ctlCsS/bXCHHARnrGcDdfHq1yv6PS21/UvXtThE
Dn4qO75X9DzgnAFNgEwELjPyVBM4YG2pF3SQ+MJESaI4hgGY8Rws5eMF/qFhdbo1
hATggqFqnQZqWy0DP9wkq8ESk1nYNICehj0d6Mo5uW190TDMD6QrfHg4rDYbgITf
SCmsRdybCASlgOHCrYgjweG9czNoFimhaG8WwP59yfCX0A1TrDJ0toryyopupIre
A+5HHBM2Dk3KylrtVBAPRsM9eGUo4bmz8p6hRkuw7mr321d416MHdIXcHK38EWR0
ZvUWM8QJAoGBAPlPe3ggR9xhEbQJQkOohnZ1hkogE/uxZrcRiUI3pnDNcCXy9Ogt
SYfwxYnHLa5kuynbmCCzSLOtq2DN9QwJ5o+zgRjX9T8DAWub6KFdEnTHhq/ZLF/w
PWPg3Oe8dYDEEcrPLvN25aetY2LrWKsRPFL8//WLJc1+LFRG6Vc1ATftAoGBAOxv
hGxNGrcD5c8g0ZcyeKVbCCRGfp0+mwonnQ25mDyIXNH+PEHa7SPs5dVexA5r0/Ky
lM/jQgs756EvslwA2oukqVz7ehDhJI4RE92OPjpYrAu7HF6eN/fAhUMghs/vAZ6c
YCM6i9emHYHM4mU6H/yLIr+0e2JNf+479bB5hQTHAoGBAOGnFUQXQ7OukE16C+Yd
RQc3PIMfIbcwTJ3qW2f54sY6zAUtMIptYx6NyN35z9kHB3jNb5Y5b9ZhnLqT7/Yj
h/INMQ4BedK8r65sgVR8X1YfukKzuLxlP8uFHa0KIPiZftkoSYDH3vmzsD86cRj1
ErqykCH4/hBO4WSugkkSirXJAoGARXvQcvOF8lsW4nRGpCSVCCNklSSSeSu47JcP
tMTiVIfOn3gTxVbNck1gjgA3pfVSaHTK/v1On3aPb/NQe3FUyM0vaMAO8372+zlR
mT8AUq1Ugm4OvE/LKuhNQZkBhYI7+50BM9k0179d1JOdxRn75IAPSj+EMzOLcTv1
zFMqIGkCgYBm5xT3Gu8fJh/8ztelzrDkGga6UpYKKYjHGFHpaqmDn9sjjCu8X2pG
JUGgyUVj1NkJAtHMS45Ud3upQwxpy2aNmMaQbwzHybvX7EYZHHVuCwsSzaXRtwj2
Q6mG1Ghi0UQ76SPKQr0Vu8Uu+0CAzYAK4IEKeH6BCRjrzHggSpdNzQ==
-----END RSA PRIVATE KEY-----

View File

@@ -0,0 +1 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDmQeA/uyEyFf9DsmwR+OztWb7Hb/uTC+R3xG1QgBvRwhSbpBnyBESGMZZ07bIw5Ib7BUSDzwoeryUqNAhAhir2KLeIYODS39UmTwOIl+rIvhlTxhsIoQHV90pewD2qw0T8KgVMPUDsQ0Bd98E6e5dbxciZp67ihVD0r7srhdSRo8PIc56hJWrD52j5FeiIGEmLXHXiZLOyma1M7j/EmiV81wHAzgql6sihWSZHm3xPZZ712JtXbmHhe3RLFIK13u9PSb3XbuEIdGwkZdzP+vYNE0CsYqwjXjVRrY/APsiEkbSNVzHI5p2W1L7ZMtSOMUqZ1Ve+sytVb+YcIJ9L8y07 trove@devstack

View File

@@ -12,11 +12,11 @@ ExecStartPre=mkdir -p GUEST_LOGDIR ; chown GUEST_USERNAME:root GUEST_LOGDIR
# If ~/trove-installed does not exist, copy the trove source from
# the user's development environment, then touch the sentinel file
ExecStartPre=/bin/bash "test -f /home/GUEST_USERNAME/trove-installed || sudo -u GUEST_USERNAME rsync -e 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' -avz --exclude='.*' HOST_USERNAME@NETWORK_GATEWAY:PATH_TROVE/ /home/GUEST_USERNAME/trove && touch /home/GUEST_USERNAME/trove-installed"
ExecStartPre=/bin/bash "test -f /home/GUEST_USERNAME/trove-installed || sudo -u GUEST_USERNAME rsync -e 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' -avz --exclude='.*' HOST_SCP_USERNAME@NETWORK_GATEWAY:PATH_TROVE/ /home/GUEST_USERNAME/trove && touch /home/GUEST_USERNAME/trove-installed"
# If /etc/trove does not exist, create it and then copy the trove-guestagent.conf
# from /etc/trove on the user's development environment,
ExecStartPre=/bin/bash "test -d /etc/trove || sudo mkdir -p /etc/trove && sudo -u GUEST_USERNAME rsync -e 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' -avz --exclude='.*' HOST_USERNAME@NETWORK_GATEWAY:/etc/trove/trove-guestagent.conf ~GUEST_USERNAME/ && mv ~GUEST_USERNAME/trove-guestagent.conf /etc/trove/trove-guestagent.conf"
ExecStartPre=/bin/bash "test -d /etc/trove || sudo mkdir -p /etc/trove && sudo -u GUEST_USERNAME rsync -e 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' -avz --exclude='.*' HOST_SCP_USERNAME@NETWORK_GATEWAY:/etc/trove/trove-guestagent.conf ~GUEST_USERNAME/ && mv ~GUEST_USERNAME/trove-guestagent.conf /etc/trove/trove-guestagent.conf"
ExecStart=/home/GUEST_USERNAME/trove/bin/trove-guestagent --config-file=/etc/guest_info --config-file=/etc/trove/trove-guestagent.conf

View File

@@ -18,9 +18,9 @@ pre-start script
# If /etc/trove does not exist, copy the trove source and the
# guest agent config from the user's development environment
if [ ! -d /etc/trove ]; then
sudo -u GUEST_USERNAME rsync -e 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' -avz --exclude='.*' HOST_USERNAME@NETWORK_GATEWAY:PATH_TROVE/ /home/GUEST_USERNAME/trove
sudo -u GUEST_USERNAME rsync -e 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' -avz --exclude='.*' HOST_SCP_USERNAME@NETWORK_GATEWAY:PATH_TROVE/ /home/GUEST_USERNAME/trove
mkdir -p /etc/trove
sudo -u GUEST_USERNAME rsync -e 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' -avz --exclude='.*' HOST_USERNAME@NETWORK_GATEWAY:/etc/trove/trove-guestagent.conf ~GUEST_USERNAME/
sudo -u GUEST_USERNAME rsync -e 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' -avz --exclude='.*' HOST_SCP_USERNAME@NETWORK_GATEWAY:/etc/trove/trove-guestagent.conf ~GUEST_USERNAME/
mv ~GUEST_USERNAME/trove-guestagent.conf /etc/trove/trove-guestagent.conf
fi

View File

@@ -10,11 +10,12 @@ function build_vm() {
readonly HOMEDIR=$1
readonly HOST_USERNAME=$2
GUEST_USERNAME=${GUEST_USERNAME:-$2}
HOST_SCP_USERNAME=${HOST_SCP_USERNAME:-$2}
VM=$3
DISTRO=$4
SERVICE_TYPE=$5
readonly SSH_DIR=${HOMEDIR}/.ssh
readonly SSH_DIR=${KEY_DIR:-${HOMEDIR}/.ssh}
manage_ssh_keys
if [ $DISTRO == 'ubuntu' ]; then
@@ -26,6 +27,7 @@ function build_vm() {
EXTRA_ELEMENTS=selinux-permissive
fi
export HOST_USERNAME
export HOST_SCP_USERNAME
export GUEST_USERNAME
export NETWORK_GATEWAY
export REDSTACK_SCRIPTS
@@ -39,7 +41,7 @@ function build_vm() {
${PATH_DISKIMAGEBUILDER}/bin/disk-image-create -a amd64 -o "${VM}" -x ${DISTRO} ${EXTRA_ELEMENTS} vm heat-cfntools ${DISTRO}-guest ${DISTRO}-${SERVICE_TYPE}
}
function cmd_build_image() {
function build_guest_image() {
exclaim "Building an image for use with development and integration tests."
if [ -z "$1" ]
then
@@ -78,12 +80,6 @@ function cmd_build_image() {
else
exclaim "Found image in $VM_PATH using the qcow2 image found here..."
fi
QCOW_IMAGE=`find $VM_PATH -name '*.qcow2'`
TROVE_TOKEN=`retrieve_token trove $SERVICE_PASSWORD $SERVICE_TENANT`
# Now upload it
upload_image_to_glance "${IMAGENAME}" ovf qcow2 $TROVE_TOKEN $QCOW_IMAGE $SERVICE_TYPE
}
function clean_instances() {
@@ -107,7 +103,7 @@ function manage_ssh_keys() {
add_host_key_to_authorizedkeys
}
generate_empty_passphrase_ssh_key () {
function generate_empty_passphrase_ssh_key () {
echo "generating a empty passphrase DEV ONLY rsa key"
expect -c "
spawn sudo -Hiu ${HOST_USERNAME} /usr/bin/ssh-keygen -f ${SSH_DIR}/id_rsa -q
@@ -118,7 +114,7 @@ send \n
expect eof"
}
add_host_key_to_authorizedkeys () {
function add_host_key_to_authorizedkeys () {
# test to see if the host key is already in its own authorized_keys file - if not then add it. This is then later copied
# to the guest image
is_in_keyfile=`cat ${SSH_DIR}/id_rsa.pub | grep -f - ${SSH_DIR}/authorized_keys | wc -l`

View File

@@ -0,0 +1,3 @@
diskimage-builder
tripleo-image-elements
trove

View File

@@ -3,11 +3,8 @@ nova
glance
horizon
swift
trove
neutron
heat
diskimage-builder
tripleo-image-elements
python-keystoneclient
python-novaclient
python-troveclient

View File

@@ -38,7 +38,7 @@ fi
# Public facing bits
SERVICE_PROTOCOL=${SERVICE_PROTOCOL:-http}
SERVICE_TENANT=${SERVICE_TENANT:-service}
NETWORK_GATEWAY=${NETWORK_GATEWAY:-$SERVICE_HOST}
NETWORK_GATEWAY=${NETWORK_GATEWAY:-$BRIDGE_IP}
NETWORK_INTERFACE=${NETWORK_INTERFACE:-eth0}
NETWORK_SUBNET=${NETWORK_SUBNET:-10.0.0.0/24}
KEYSTONE_AUTH_HOST=${KEYSTONE_AUTH_HOST:-$SERVICE_HOST}
@@ -169,7 +169,8 @@ function install_devstack_code() {
fi
# Clones all of the code to where devstack expects it to be
pushd $PATH_DEVSTACK_OUTPUT
cmd_clone_projects
cmd_clone_projects do_not_force_update $REDSTACK_SCRIPTS/projects-list \
$REDSTACK_SCRIPTS/image-projects-list
popd
}
@@ -329,7 +330,6 @@ function upload_image_to_glance() {
# Unused since support of multiple datastores added.
# Still need for another datastores in future
DATASTORE_TYPE=$6
source $PATH_DEVSTACK_SRC/openrc admin admin
GLANCE_IMAGEID=`get_glance_id glance image-create \
--name="$IMAGE_NAME" --is-public=True \
--container-format=$CONTAINER_FORMAT --disk-format=$DISK_FORMAT \
@@ -439,8 +439,41 @@ function cmd_test_init() {
exclaim "Creating Test Flavors."
add_test_flavors
if [[ -n $KEY_DIR ]]; then
exclaim "Installing the SSH key from $KEY_DIR to the test environment."
mkdir -p $USERHOME/.ssh
install -b --mode 0400 $KEY_DIR/id_rsa $USERHOME/.ssh
cat $KEY_DIR/authorized_keys >> $USERHOME/.ssh/authorized_keys
fi
}
function cmd_build_image() {
IMAGE_DATASTORE_TYPE=${1:-'mysql'}
ESCAPED_PATH_TROVE=${2:-'\/opt\/stack\/trove'}
HOST_SCP_USERNAME=${3:-'ubuntu'}
GUEST_USERNAME=${4:-'ubuntu'}
exclaim "Ensuring we have all packages needed to build image."
sudo apt-get -y update
sudo apt-get -y install qemu
cmd_clone_projects do_not_force_update $REDSTACK_SCRIPTS/image-projects-list
exclaim "Use tripleo-diskimagebuilder to actually build the Trove Guest Agent Image."
build_guest_image $IMAGE_DATASTORE_TYPE
}
function cmd_build_and_upload_image() {
exclaim "First build the image"
cmd_build_image $1 $ESCAPED_PATH_TROVE `whoami` `whoami`
exclaim "Now upload it to Glance"
QCOW_IMAGE=`find $VM_PATH -name '*.qcow2'`
TROVE_TOKEN=`retrieve_token trove $SERVICE_PASSWORD $SERVICE_TENANT`
upload_image_to_glance "${IMAGENAME}" ovf qcow2 $TROVE_TOKEN $QCOW_IMAGE $SERVICE_TYPE
}
function cmd_initialize() {
exclaim '(Re)Initializing Trove...'
pushd $PATH_DEVSTACK_SRC
@@ -656,7 +689,7 @@ function cmd_run_ci() {
cmd_install
cmd_test_init
# The arg will be the image type
cmd_build_image $1
cmd_build_and_upload_image $1
# Test in fake mode.
exclaim "Testing in fake mode."
@@ -687,13 +720,9 @@ function cmd_clear() {
}
function cmd_kick_start() {
source $PATH_DEVSTACK_SRC/openrc admin admin
cmd_test_init
cmd_build_image $1
}
function cmd_post_devstack() {
cmd_test_init
cmd_build_image $1
cmd_build_and_upload_image $1
}
function cmd_reset_task() {
@@ -702,12 +731,13 @@ function cmd_reset_task() {
function cmd_clone_projects() {
UPDATE_PROJECTS=$1
for project in $(cat $REDSTACK_SCRIPTS/projects-list); do
PROJECT_LIST_FILES=${@:2}
for project in $(cat $PROJECT_LIST_FILES); do
if [ ! -d $PATH_DEVSTACK_OUTPUT/$project ]; then
echo "Creating a new clone of $project..."
git_clone $OPENSTACK_GITSOURCE/"$project".git ${PATH_DEVSTACK_OUTPUT}/$project master
else
if [ -z $UPDATE_PROJECTS ]; then
if [ $UPDATE_PROJECTS != "force_update" ]; then
echo "$project was already cloned or exists in a shared folder. Ignoring..."
else
echo "$project was already cloned. Pulling changes to update."
@@ -746,14 +776,13 @@ function print_usage() {
--setup environment--
install - Install all the required dependencies and bring up tr-api and tr-tmgr
test-init - Configure the test configuration files and add keystone test users
build-image - Builds the vm image and adds it to glance
build-image - Builds the vm image for the trove guest
initialize - Reinitialize the trove database, users, services, and test config
post-devstack - Configures testing environment, builds image and uploads to glance
--helper for environment--
kick-start - kick start the setup of trove.
(redstack test-init/build-image in one step)
[mysql no-clean] no clean avoids rebuilding pacakges from scratch
[mysql no-clean] no clean avoids rebuilding packages from scratch
--trove dependency services--
start-deps - Start or resume daemons Trove depends on.
@@ -794,7 +823,6 @@ function run_command() {
"test-init" ) cmd_test_init;;
"build-image" ) shift; cmd_build_image $@;;
"initialize" ) cmd_initialize;;
"post-devstack" ) shift; cmd_post_devstack $@;;
"unit-tests" ) cmd_unit_tests;;
"start-deps" ) cmd_start_deps;;
"stop-deps" ) cmd_stop_deps;;
@@ -815,7 +843,9 @@ function run_command() {
"kick-start" ) shift; cmd_kick_start $@;;
"run-fake" ) shift; cmd_run_fake $@;;
"start-fake" ) shift; cmd_start_fake $@;;
"update-projects" ) cmd_clone_projects force_update;;
"update-projects" ) cmd_clone_projects force_update \
$REDSTACK_SCRIPTS/projects-list \
$REDSTACK_SCRIPTS/image-projects-list;;
"reset-task" ) shift; cmd_reset_task $@;;
"wipe-queues" ) shift; cmd_wipe_queues $@;;
"example-tests" ) shift; cmd_example_tests $@;;

View File

@@ -1,7 +1,7 @@
# Paths inside the VM.
[ -z $SERVICE_HOST ] && SERVICE_HOST=`get_default_host_ip`
[ -z $DEST ] && DEST=/opt/stack
[ -z $NETWORK_GATEWAY ] && NETWORK_GATEWAY=$SERVICE_HOST
[ -z $BRIDGE_IP ] && BRIDGE_IP=10.0.0.1
[ -z $PATH_DEVSTACK_SRC ] && PATH_DEVSTACK_SRC=~/devstack
[ -z $TROVE_CONF_DIR ] && TROVE_CONF_DIR=/etc/trove