From 83076cf49ebd8ded4d5d5e9667fcd8e9e9be4172 Mon Sep 17 00:00:00 2001 From: Carlos Goncalves Date: Wed, 16 Nov 2016 09:55:01 +0000 Subject: Refactor installers support code Restructuring tests directory to become more modular, and adding installer helper functions. JIRA: DOCTOR-71 Change-Id: Ib3846c35485cfa4f0a0881beb69811cdc0b8f66f Signed-off-by: Carlos Goncalves --- tests/lib/installer | 34 +++++++++ tests/lib/installers/apex | 24 +++++++ tests/lib/installers/fuel | 107 ++++++++++++++++++++++++++++ tests/lib/installers/local | 21 ++++++ tests/run.sh | 172 ++++----------------------------------------- 5 files changed, 199 insertions(+), 159 deletions(-) create mode 100644 tests/lib/installer create mode 100644 tests/lib/installers/apex create mode 100644 tests/lib/installers/fuel create mode 100644 tests/lib/installers/local diff --git a/tests/lib/installer b/tests/lib/installer new file mode 100644 index 00000000..cdde6eff --- /dev/null +++ b/tests/lib/installer @@ -0,0 +1,34 @@ +#!/bin/bash + +INSTALLER_TYPE=${INSTALLER_TYPE:-local} +INSTALLER_IP=${INSTALLER_IP:-none} +ssh_opts_cpu="$ssh_opts" + +function is_installer_supported { + local installer="$1" + [[ -f $TOP_DIR/lib/installers/$installer ]] +} + +function is_installer { + local installer="$1" + [[ $installer == $INSTALLER_TYPE ]] +} + +function setup_installer { + if ! is_installer_supported $INSTALLER_TYPE; then + die $LINENO"INSTALLER_TYPE=$INSTALLER_TYPE is not supported." + fi + + source $TOP_DIR/lib/installers/$INSTALLER_TYPE + + if ! is_set INSTALLER_IP; then + get_installer_ip + fi + + installer_get_ssh_keys + installer_apply_patches +} + +function cleanup_installer { + cleanup_installer_$INSTALLER_TYPE +} diff --git a/tests/lib/installers/apex b/tests/lib/installers/apex new file mode 100644 index 00000000..54b3dce2 --- /dev/null +++ b/tests/lib/installers/apex @@ -0,0 +1,24 @@ +#!/bin/bash + +function get_installer_ip { + local instack_mac=$(sudo virsh domiflist instack | awk '/default/{print $5}') + INSTALLER_IP=$(/usr/sbin/arp -e | grep ${instack_mac} | awk '{print $1}') + die_if_not_set $LINENO $INSTALLER_IP "No installer IP" +} + +function installer_get_ssh_keys { + sudo scp $ssh_opts root@"$INSTALLER_IP":/home/stack/.ssh/id_rsa instack_key + sudo chown $(whoami):$(whoami) instack_key + chmod 400 instack_key + ssh_opts_cpu+=" -i instack_key" +} + +function installer_apply_patches { + # Noop + return +} + +function cleanup_installer_apex { + # Noop + return +} diff --git a/tests/lib/installers/fuel b/tests/lib/installers/fuel new file mode 100644 index 00000000..34a86922 --- /dev/null +++ b/tests/lib/installers/fuel @@ -0,0 +1,107 @@ +#!/bin/bash + +function get_installer_ip { + local instack_mac=$(sudo virsh domiflist fuel-opnfv | awk '/pxebr/{print $5}') + INSTALLER_IP=$(/usr/sbin/arp -e | grep ${instack_mac} | awk '{print $1}') + die_if_not_set $LINENO $INSTALLER_IP "No installer IP" +} + +function installer_get_ssh_keys { + sshpass -p r00tme scp $ssh_opts root@${INSTALLER_IP}:.ssh/id_rsa instack_key + sudo chown $(whoami):$(whoami) instack_key + chmod 400 instack_key + ssh_opts_cpu+=" -i instack_key" +} + +function installer_apply_patches { + cat > set_conf.sh << 'END_TXT' +#!/bin/bash +if [ -e /etc/ceilometer/event_pipeline.yaml ]; then + if ! grep -q '^ *- notifier://?topic=alarm.all$' /etc/ceilometer/event_pipeline.yaml; then + sed -i 's|- notifier://|- notifier://?topic=alarm.all|' /etc/ceilometer/event_pipeline.yaml + echo "modify the ceilometer config" + service ceilometer-agent-notification restart + fi +else + echo "ceilometer event_pipeline.yaml file does not exist" + exit 1 +fi +if [ -e /etc/nova/nova.conf ]; then + if ! grep -q '^notification_driver=messaging$' /etc/nova/nova.conf; then + sed -i -r 's/notification_driver=/notification_driver=messaging/g' /etc/nova/nova.conf + echo "modify nova config" + service nova-api restart + fi +else + echo "nova.conf file does not exist" + exit 1 +fi +exit 0 +END_TXT + + chmod +x set_conf.sh + CONTROLLER_IP=$(sshpass -p r00tme ssh 2>/dev/null $ssh_opts root@${INSTALLER_IP} \ + "fuel node | grep controller | cut -d '|' -f 5|xargs") + for node in $CONTROLLER_IP;do + scp $ssh_opts_cpu set_conf.sh "root@$node:" + ssh $ssh_opts_cpu "root@$node" './set_conf.sh > set_conf.log 2>&1 &' + sleep 1 + scp $ssh_opts_cpu "root@$node:set_conf.log" set_conf_$node.log + done + + if grep -q "modify the ceilometer config" set_conf_*.log ; then + NEED_TO_RESTORE_CEILOMETER=true + fi + if grep -q "modify nova config" set_conf_*.log ; then + NEED_TO_RESTORE_NOVA=true + fi + + echo "waiting service restart..." + sleep 60 + +} + +function cleanup_installer_fuel { + if ! ($NEED_TO_RESTORE_CEILOMETER || $NEED_TO_RESTORE_NOVA) ; then + echo "Don't need to restore config" + exit 0 + fi + + echo "restore the configuration..." + cat > restore_conf.sh << 'END_TXT' +#!/bin/bash +if @NEED_TO_RESTORE_CEILOMETER@ ; then + if [ -e /etc/ceilometer/event_pipeline.yaml ]; then + if grep -q '^ *- notifier://?topic=alarm.all$' /etc/ceilometer/event_pipeline.yaml; then + sed -i 's|- notifier://?topic=alarm.all|- notifier://|' /etc/ceilometer/event_pipeline.yaml + service ceilometer-agent-notification restart + fi + else + echo "ceilometer event_pipeline.yaml file does not exist" + exit 1 + fi +fi +if @NEED_TO_RESTORE_NOVA@ ; then + if [ -e /etc/nova/nova.conf ]; then + if grep -q '^notification_driver=messaging$' /etc/nova/nova.conf; then + sed -i -r 's/notification_driver=messaging/notification_driver=/g' /etc/nova/nova.conf + service nova-api restart + fi + else + echo "nova.conf file does not exist" + exit 1 + fi +fi +exit 0 +END_TXT + sed -i -e "s/@NEED_TO_RESTORE_CEILOMETER@/$NEED_TO_RESTORE_CEILOMETER/" restore_conf.sh + sed -i -e "s/@NEED_TO_RESTORE_NOVA@/$NEED_TO_RESTORE_NOVA/" restore_conf.sh + chmod +x restore_conf.sh + for node in $CONTROLLER_IP;do + scp $ssh_opts_cpu restore_conf.sh "root@$node:" + ssh $ssh_opts_cpu "root@$node" './restore_conf.sh > restore_conf.log 2>&1 &' + done + + echo "waiting service restart..." + sleep 60 +} diff --git a/tests/lib/installers/local b/tests/lib/installers/local new file mode 100644 index 00000000..e7aed14f --- /dev/null +++ b/tests/lib/installers/local @@ -0,0 +1,21 @@ +#!/bin/bash + +function get_installer_ip { + # Noop + return +} + +function installer_get_ssh_keys { + echo "INSTALLER_TYPE set to 'local'. Assuming SSH keys already exchanged with $COMPUTE_HOST" + return +} + +function installer_apply_patches { + # Noop + return +} + +function cleanup_installer_local { + # Noop + return +} diff --git a/tests/run.sh b/tests/run.sh index ea7ded50..141d836a 100755 --- a/tests/run.sh +++ b/tests/run.sh @@ -26,10 +26,6 @@ DOCTOR_PROJECT=doctor #TODO: change back to `_member_` when JIRA DOCTOR-55 is done DOCTOR_ROLE=admin -SUPPORTED_INSTALLER_TYPES="apex fuel local" -INSTALLER_TYPE=${INSTALLER_TYPE:-local} -INSTALLER_IP=${INSTALLER_IP:-none} - SUPPORTED_INSPECTOR_TYPES="sample congress" INSPECTOR_TYPE=${INSPECTOR_TYPE:-sample} TOP_DIR=$(cd $(dirname "$0") && pwd) @@ -38,151 +34,11 @@ ssh_opts="-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" as_doctor_user="--os-username $DOCTOR_USER --os-password $DOCTOR_PW --os-tenant-name $DOCTOR_PROJECT" -if [[ ! "$SUPPORTED_INSTALLER_TYPES" =~ "$INSTALLER_TYPE" ]] ; then - echo "ERROR: INSTALLER_TYPE=$INSTALLER_TYPE is not supported." - exit 1 -fi - if [[ ! "$SUPPORTED_INSPECTOR_TYPES" =~ "$INSPECTOR_TYPE" ]] ; then echo "ERROR: INSPECTOR_TYPE=$INSPECTOR_TYPE is not supported." exit 1 fi -get_installer_ip() { - if [[ "$INSTALLER_TYPE" == "apex" ]] ; then - if [[ "$INSTALLER_IP" == "none" ]] ; then - instack_mac=$(sudo virsh domiflist instack | awk '/default/{print $5}') - INSTALLER_IP=$(/usr/sbin/arp -e | grep ${instack_mac} | awk '{print $1}') - fi - elif [[ "$INSTALLER_TYPE" == "fuel" ]] ; then - if [[ "$INSTALLER_IP" == "none" ]] ; then - instack_mac=$(sudo virsh domiflist fuel-opnfv | awk '/pxebr/{print $5}') - INSTALLER_IP=$(/usr/sbin/arp -e | grep ${instack_mac} | awk '{print $1}') - fi - fi - - if [[ "$INSTALLER_TYPE" != "local" ]] ; then - die_if_not_set $LINENO INSTALLER_IP "No installer IP" - fi -} - -prepare_ssh_to_cloud() { - ssh_opts_cpu="$ssh_opts" - - # get ssh key from installer node - if [[ "$INSTALLER_TYPE" == "apex" ]] ; then - sudo scp $ssh_opts root@"$INSTALLER_IP":/home/stack/.ssh/id_rsa instack_key - sudo chown $(whoami):$(whoami) instack_key - chmod 400 instack_key - ssh_opts_cpu+=" -i instack_key" - elif [[ "$INSTALLER_TYPE" == "fuel" ]] ; then - sshpass -p r00tme scp $ssh_opts root@${INSTALLER_IP}:.ssh/id_rsa instack_key - sudo chown $(whoami):$(whoami) instack_key - chmod 400 instack_key - ssh_opts_cpu+=" -i instack_key" - elif [[ "$INSTALLER_TYPE" == "local" ]] ; then - echo "INSTALLER_TYPE set to 'local'. Assuming SSH keys already exchanged with $COMPUTE_HOST" - fi -} - -prepare_test_env() { - #TODO delete it when fuel support the configuration - if [[ "$INSTALLER_TYPE" == "fuel" ]] ; then - echo "modify the configuration..." - cat > set_conf.sh << 'END_TXT' -#!/bin/bash -if [ -e /etc/ceilometer/event_pipeline.yaml ]; then - if ! grep -q '^ *- notifier://?topic=alarm.all$' /etc/ceilometer/event_pipeline.yaml; then - sed -i 's|- notifier://|- notifier://?topic=alarm.all|' /etc/ceilometer/event_pipeline.yaml - echo "modify the ceilometer config" - service ceilometer-agent-notification restart - fi -else - echo "ceilometer event_pipeline.yaml file does not exist" - exit 1 -fi -if [ -e /etc/nova/nova.conf ]; then - if ! grep -q '^notification_driver=messaging$' /etc/nova/nova.conf; then - sed -i -r 's/notification_driver=/notification_driver=messaging/g' /etc/nova/nova.conf - echo "modify nova config" - service nova-api restart - fi -else - echo "nova.conf file does not exist" - exit 1 -fi -exit 0 -END_TXT - chmod +x set_conf.sh - CONTROLLER_IP=$(sshpass -p r00tme ssh 2>/dev/null $ssh_opts root@${INSTALLER_IP} \ - "fuel node | grep controller | cut -d '|' -f 5|xargs") - for node in $CONTROLLER_IP;do - scp $ssh_opts_cpu set_conf.sh "root@$node:" - ssh $ssh_opts_cpu "root@$node" './set_conf.sh > set_conf.log 2>&1 &' - sleep 1 - scp $ssh_opts_cpu "root@$node:set_conf.log" set_conf_$node.log - done - - if grep -q "modify the ceilometer config" set_conf_*.log ; then - NEED_TO_RESTORE_CEILOMETER=true - fi - if grep -q "modify nova config" set_conf_*.log ; then - NEED_TO_RESTORE_NOVA=true - fi - - echo "waiting service restart..." - sleep 60 - fi -} - -restore_test_env() { - #TODO delete it when fuel support the configuration - if [[ "$INSTALLER_TYPE" == "fuel" ]] ; then - if ! ($NEED_TO_RESTORE_CEILOMETER || $NEED_TO_RESTORE_NOVA) ; then - echo "Don't need to restore config" - exit 0 - fi - - echo "restore the configuration..." - cat > restore_conf.sh << 'END_TXT' -#!/bin/bash -if @NEED_TO_RESTORE_CEILOMETER@ ; then - if [ -e /etc/ceilometer/event_pipeline.yaml ]; then - if grep -q '^ *- notifier://?topic=alarm.all$' /etc/ceilometer/event_pipeline.yaml; then - sed -i 's|- notifier://?topic=alarm.all|- notifier://|' /etc/ceilometer/event_pipeline.yaml - service ceilometer-agent-notification restart - fi - else - echo "ceilometer event_pipeline.yaml file does not exist" - exit 1 - fi -fi -if @NEED_TO_RESTORE_NOVA@ ; then - if [ -e /etc/nova/nova.conf ]; then - if grep -q '^notification_driver=messaging$' /etc/nova/nova.conf; then - sed -i -r 's/notification_driver=messaging/notification_driver=/g' /etc/nova/nova.conf - service nova-api restart - fi - else - echo "nova.conf file does not exist" - exit 1 - fi -fi -exit 0 -END_TXT - sed -i -e "s/@NEED_TO_RESTORE_CEILOMETER@/$NEED_TO_RESTORE_CEILOMETER/" restore_conf.sh - sed -i -e "s/@NEED_TO_RESTORE_NOVA@/$NEED_TO_RESTORE_NOVA/" restore_conf.sh - chmod +x restore_conf.sh - for node in $CONTROLLER_IP;do - scp $ssh_opts_cpu restore_conf.sh "root@$node:" - ssh $ssh_opts_cpu "root@$node" './restore_conf.sh > restore_conf.log 2>&1 &' - done - - echo "waiting service restart..." - sleep 60 - fi -} - get_compute_host_info() { # get computer host info which VM boot in COMPUTE_HOST=$(openstack $as_doctor_user server show $VM_NAME | @@ -190,18 +46,18 @@ get_compute_host_info() { compute_host_in_undercloud=${COMPUTE_HOST%%.*} die_if_not_set $LINENO COMPUTE_HOST "Failed to get compute hostname" - if [[ "$INSTALLER_TYPE" == "apex" ]] ; then + if is_installer apex; then COMPUTE_USER=${COMPUTE_USER:-heat-admin} COMPUTE_IP=$(sudo ssh $ssh_opts $INSTALLER_IP \ "source stackrc; \ nova show $compute_host_in_undercloud \ | awk '/ ctlplane network /{print \$5}'") - elif [[ "$INSTALLER_TYPE" == "fuel" ]] ; then + elif is_installer fuel; then COMPUTE_USER=${COMPUTE_USER:-root} node_id=$(echo $compute_host_in_undercloud | cut -d "-" -f 2) COMPUTE_IP=$(sshpass -p r00tme ssh 2>/dev/null $ssh_opts root@${INSTALLER_IP} \ "fuel node|awk -F '|' -v id=$node_id '{if (\$1 == id) print \$5}' |xargs") - elif [[ "$INSTALLER_TYPE" == "local" ]] ; then + elif is_installer local; then COMPUTE_USER=${COMPUTE_USER:-$(whoami)} COMPUTE_IP=$(getent hosts "$COMPUTE_HOST" | awk '{ print $1 }') fi @@ -225,13 +81,13 @@ get_compute_host_info() { get_consumer_ip() { local get_consumer_command="ip route get $COMPUTE_IP | awk '/ src /{print \$NF}'" - if [[ "$INSTALLER_TYPE" == "apex" ]] ; then + if is_installer apex; then CONSUMER_IP=$(sudo ssh $ssh_opts root@$INSTALLER_IP \ "$get_consumer_command") - elif [[ "$INSTALLER_TYPE" == "fuel" ]] ; then + elif is_installer fuel; then CONSUMER_IP=$(sudo sshpass -p r00tme ssh $ssh_opts root@${INSTALLER_IP} \ "$get_consumer_command") - elif [[ "$INSTALLER_TYPE" == "local" ]] ; then + elif is_installer local; then CONSUMER_IP=`$get_consumer_command` fi echo "CONSUMER_IP=$CONSUMER_IP" @@ -397,13 +253,13 @@ start_consumer() { # NOTE(r-mibu): create tunnel to the controller nodes, so that we can # avoid some network problems dpends on infra and installers. # This tunnel will be terminated by stop_consumer() or after 10 mins passed. - if [[ "$INSTALLER_TYPE" != "local" ]] ; then - if [[ "$INSTALLER_TYPE" == "apex" ]] ; then + if ! is_installer local; then + if is_installer apex; then CONTROLLER_IPS=$(sudo ssh $ssh_opts $INSTALLER_IP \ "source stackrc; \ nova list | grep ' overcloud-controller-[0-9] ' \ | sed -e 's/^.*ctlplane=//' -e 's/ *|\$//'") - elif [[ "$INSTALLER_TYPE" == "fuel" ]] ; then + elif is_installer fuel; then CONTROLLER_IPS=$(sshpass -p r00tme ssh 2>/dev/null $ssh_opts root@${INSTALLER_IP} \ "fuel node | grep controller | cut -d '|' -f 5|xargs") fi @@ -424,7 +280,7 @@ stop_consumer() { print_log consumer.log # NOTE(r-mibu): terminate tunnels to the controller nodes - if [[ "$INSTALLER_TYPE" != "local" ]] ; then + if ! is_installer local; then for ip in $CONTROLLER_IPS do forward_rule="-R $CONSUMER_PORT:localhost:$CONSUMER_PORT" @@ -534,7 +390,7 @@ cleanup() { openstack project delete "$DOCTOR_PROJECT" openstack user delete "$DOCTOR_USER" - restore_test_env + cleanup_installer } @@ -543,11 +399,9 @@ echo "Note: doctor/tests/run.sh has been executed." trap cleanup EXIT source $TOP_DIR/functions-common +source $TOP_DIR/lib/installer -echo "preparing test env..." -get_installer_ip -prepare_ssh_to_cloud -prepare_test_env +setup_installer echo "preparing VM image..." download_image -- cgit 1.2.3-korg