haos/tools/build_image.sh
Ilya Shakhat e0225ff639 Introduce Cirros-based Haos agent and add sample test
This patch adds new agent that can be used in Cirros images and
does the same functionality as Shaker Lib (allowing execution
of remote commands)

As an example of Haos agent a simple Neutron DHCP disaster test
is added.

Change-Id: I4be3fe2c05831f268f4fbde3ac69f74bf45268bc
2015-05-20 19:11:11 +03:00

143 lines
4.4 KiB
Bash
Executable File

#!/bin/bash -xe
TOP_DIR=$(cd $(dirname "$0") && pwd)
NETWORK_NAME=${NETWORK_NAME:-net04}
HAOS_SERVER_ENDPOINT=${HAOS_SERVER_ENDPOINT}
IMAGE_NAME=${HAOS_IMAGE:-haos-image}
FLAVOR_NAME=${HAOS_FLAVOR:-haos-flavor}
CLOUD_IMAGE_NAME="haos-cloud-image"
CIRROS_IMAGE_URL="http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img"
error() {
printf "\e[31mError: %s\e[0m\n" "${*}" >&2
exit 1
}
message() {
printf "\e[33m%s\e[0m\n" "${1}"
}
remote_shell() {
host=$1
key=$2
command=$3
ssh -i ${key} -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=10 cirros@${host} "$command"
}
remote_cp() {
host=$1
key=$2
src=$3
dst=$4
scp -i ${key} -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=10 "$src" cirros@${host}:${dst}
}
build_image() {
message "Installing Haos image, will take some time"
if [ -z "$(glance image-show ${CLOUD_IMAGE_NAME})" ]; then
message "Downloading Cirros image"
glance image-create --name ${CLOUD_IMAGE_NAME} --disk-format qcow2 --container-format bare --is-public True --copy-from ${CIRROS_IMAGE_URL}
until [ -n "$(glance image-show ${CLOUD_IMAGE_NAME} | grep status | grep active)" ]; do
sleep 5
done
fi
UUID=$(cat /proc/sys/kernel/random/uuid)
message "Creating security group"
SEC_GROUP="haos-access-${UUID}"
nova secgroup-create ${SEC_GROUP} "Security Group for Haos"
nova secgroup-add-rule ${SEC_GROUP} icmp -1 -1 0.0.0.0/0
nova secgroup-add-rule ${SEC_GROUP} tcp 1 65535 0.0.0.0/0
nova secgroup-add-rule ${SEC_GROUP} udp 1 65535 0.0.0.0/0
message "Creating flavor"
if [ -n "$(nova flavor-list | grep ${FLAVOR_NAME})" ]; then
nova flavor-delete ${FLAVOR_NAME}
fi
nova flavor-create --is-public true ${FLAVOR_NAME} auto 64 0 1
message "Creating key pair"
KEY_NAME="haos-key-${UUID}"
KEY="`mktemp`"
nova keypair-add ${KEY_NAME} > ${KEY}
chmod og-rw ${KEY}
message "Booting VM"
NETWORK_ID=`neutron net-show ${NETWORK_NAME} -f value -c id`
VM="haos-template-${UUID}"
nova boot --poll --flavor ${FLAVOR_NAME} --image ${CLOUD_IMAGE_NAME} --key_name ${KEY_NAME} --nic net-id=${NETWORK_ID} --security-groups ${SEC_GROUP} ${VM}
message "Associating a floating IP with VM"
FLOATING_IP=`neutron floatingip-create -f value -c floating_ip_address net04_ext | tail -1`
nova floating-ip-associate ${VM} ${FLOATING_IP}
message "Waiting for VM to boot up"
until remote_shell ${FLOATING_IP} ${KEY} "echo"; do
sleep 10
done
message "Installing haos agent into VM"
remote_cp ${FLOATING_IP} ${KEY} ${TOP_DIR}/agent/haosagent /tmp/haosagent
remote_shell ${FLOATING_IP} ${KEY} "sudo cp /tmp/haosagent /usr/bin/"
remote_shell ${FLOATING_IP} ${KEY} "sudo chmod 755 /usr/bin/haosagent"
HAOSAGENT_INIT="`mktemp`"
cat > ${HAOSAGENT_INIT} << EOF
#!/bin/sh
case "\$1" in
start)
export HAOS_SERVER_ENDPOINT="${HAOS_SERVER_ENDPOINT}"
start-stop-daemon -S -b -q -p /var/run/haosagent.pid --exec /usr/bin/haosagent
echo "OK"
;;
stop) :;;
*) echo "unknown argument ${1}" 1>&2;;
esac
EOF
remote_cp ${FLOATING_IP} ${KEY} ${HAOSAGENT_INIT} /tmp/S97-haosagent
remote_shell ${FLOATING_IP} ${KEY} "sudo cp /tmp/S97-haosagent /etc/init.d/"
remote_shell ${FLOATING_IP} ${KEY} "sudo chmod 755 /etc/init.d/S97-haosagent"
remote_shell ${FLOATING_IP} ${KEY} "sudo ln -s /etc/init.d/S97-haosagent /etc/rc3.d/"
remote_shell ${FLOATING_IP} ${KEY} "sudo /sbin/poweroff"
sleep 10
message "Making VM snapshot"
nova image-create --poll ${VM} ${IMAGE_NAME}
glance image-update --is-public True ${IMAGE_NAME}
message "Destroy VM"
nova delete ${VM}
message "Waiting for VM to die"
until [ -z "$(nova list | grep ${VM})" ]; do
sleep 5
done
message "Cleaning up resources"
FP_ID=`neutron floatingip-list -f csv -c id -c floating_ip_address --quote none | grep ${FLOATING_IP} | awk -F "," '{print $1}'`
neutron floatingip-delete ${FP_ID}
nova secgroup-delete ${SEC_GROUP}
nova keypair-delete ${KEY_NAME}
}
main() {
if [ -z ${HAOS_SERVER_ENDPOINT} ]; then
error "Set HAOS_SERVER_ENDPOINT env var"
exit 1
fi
if [ -z "$(glance image-show ${IMAGE_NAME})" ]; then
build_image
else
message "Image ${IMAGE_NAME} already exists."
fi
}
main "$@"