From f726cfd9982bf6a5250859f3ecfcacf018159b99 Mon Sep 17 00:00:00 2001 From: Konstantin Yarovoy Date: Thu, 7 Apr 2022 13:16:15 +0200 Subject: Add container engine migration scenario MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add "migrate-container-engine" action to kolla-ansible which changes the container engine on which the Openstack is deployed on. For example Docker to Podman and vice versa. Depends-on: https://review.opendev.org/c/openstack/ansible-collection-kolla/+/925083 Signed-off-by: Konstantin Yarovoy Signed-off-by: Martin Hiner Signed-off-by: Roman KrĨek Change-Id: Icd709cb042d44e063c5da64ab0695b0b6ba6d48b --- tests/test-container-engine-migration.sh | 205 +++++++++++++++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 tests/test-container-engine-migration.sh (limited to 'tests/test-container-engine-migration.sh') diff --git a/tests/test-container-engine-migration.sh b/tests/test-container-engine-migration.sh new file mode 100644 index 000000000..76b97941e --- /dev/null +++ b/tests/test-container-engine-migration.sh @@ -0,0 +1,205 @@ +#!/bin/bash + +set -o xtrace +set -o errexit +set -o pipefail + +# Enable unbuffered output +export PYTHONUNBUFFERED=1 + +VM_NAME="kolla_migration_test" +FIP_ADDR= + +function create_instance { + local name=$1 + local server_create_extra + + if [[ $IP_VERSION -eq 6 ]]; then + # NOTE(yoctozepto): CirrOS has no IPv6 metadata support, hence need to use configdrive + server_create_extra="${server_create_extra} --config-drive True" + fi + + openstack server create --wait --image cirros --flavor m1.tiny --key-name mykey --network demo-net ${server_create_extra} ${name} + # If the status is not ACTIVE, print info and exit 1 + if [[ $(openstack server show ${name} -f value -c status) != "ACTIVE" ]]; then + echo "FAILED: Instance is not active" + openstack --debug server show ${name} + return 1 + fi +} + +function start_instance { + local name=$1 + local attempts + attempts=12 + + openstack server start ${name} + + # substitution for missing --wait argument + for i in $(seq 1 ${attempts}); do + if [[ $(openstack server show ${name} -f value -c status) == "ACTIVE" ]]; then + break + elif [[ $i -eq ${attempts} ]]; then + echo "Failed to start server after ${attempts} attempts" + echo "Console log:" + openstack console log show ${name} || true + openstack --debug server show ${name} + return 1 + else + echo "Server is not yet started - retrying" + fi + sleep 10 + done +} + +function stop_instance { + local name=$1 + local attempts + attempts=12 + + openstack server stop ${name} + + # substitution for missing --wait argument + for i in $(seq 1 ${attempts}); do + if [[ $(openstack server show ${name} -f value -c status) == "SHUTOFF" ]]; then + break + elif [[ $i -eq ${attempts} ]]; then + echo "Failed to stop server after ${attempts} attempts" + echo "Console log:" + openstack console log show ${name} || true + openstack --debug server show ${name} + return 1 + else + echo "Server is not yet stopped - retrying" + fi + sleep 10 + done +} + +function delete_instance { + local name=$1 + openstack server delete --wait ${name} +} + +function create_fip { + openstack floating ip create public1 -f value -c floating_ip_address +} + +function delete_fip { + local fip_addr=$1 + openstack floating ip delete ${fip_addr} +} + +function attach_fip { + local instance_name=$1 + local fip_addr=$2 + openstack server add floating ip ${instance_name} ${fip_addr} +} + +function detach_fip { + local instance_name=$1 + local fip_addr=$2 + openstack server remove floating ip ${instance_name} ${fip_addr} +} + +function test_ssh { + local instance_name=$1 + local fip_addr=$2 + local attempts + attempts=12 + for i in $(seq 1 ${attempts}); do + if ping -c1 -W1 ${fip_addr} && ssh -v -o BatchMode=yes -o StrictHostKeyChecking=no cirros@${fip_addr} hostname; then + break + elif [[ $i -eq ${attempts} ]]; then + echo "Failed to access server via SSH after ${attempts} attempts" + echo "Console log:" + openstack console log show ${instance_name} || true + openstack --debug server show ${instance_name} + return 1 + else + echo "Cannot access server - retrying" + fi + sleep 10 + done +} + +function test_initial_vm { + . /etc/kolla/admin-openrc.sh + . ~/openstackclient-venv/bin/activate + + echo "TESTING: Initial server creation" + create_instance ${VM_NAME} + echo "SUCCESS: Initial server creation" + + if [[ $IP_VERSION -eq 4 ]]; then + echo "TESTING: Floating ip allocation" + FIP_ADDR=$(create_fip) + attach_fip ${VM_NAME} ${FIP_ADDR} + echo "SUCCESS: Floating ip allocation" + else + # NOTE(yoctozepto): Neutron has no IPv6 NAT support, hence no floating ip addresses + local instance_addresses + FIP_ADDR=$(openstack server show ${VM_NAME} -f yaml -c addresses|tail -1|cut -d- -f2) + fi + + echo "TESTING: PING&SSH to initial instance" + test_ssh ${VM_NAME} ${FIP_ADDR} + echo "SUCCESS: PING&SSH to initial instance" + + echo "TESTING: Stopping the initial instance" + stop_instance ${VM_NAME} + echo "SUCCESS: Stopped the initial instance" +} + +function test_migrated_vm { + . /etc/kolla/admin-openrc.sh + . ~/openstackclient-venv/bin/activate + + echo "TESTING: Starting the migrated instance" + start_instance ${VM_NAME} + echo "SUCCESS: Started the migrated instance" + + echo "TESTING: PING&SSH to migrated instance" + test_ssh ${VM_NAME} ${FIP_ADDR} + echo "SUCCESS: PING&SSH to migrated instance" + + if [[ $IP_VERSION -eq 4 ]]; then + echo "TESTING: Floating ip deallocation" + detach_fip ${VM_NAME} ${FIP_ADDR} + delete_fip ${FIP_ADDR} + echo "SUCCESS: Floating ip deallocation" + fi + + echo "TESTING: Server deletion" + delete_instance ${VM_NAME} + echo "SUCCESS: Server deletion" +} + +function migrate_container_engine { + echo "MIGRATION: Migrating from Docker to Podman" + sed -i "s/\(kolla_container_engine:\s*\).*/\1podman/" /etc/kolla/globals.yml + RAW_INVENTORY=/etc/kolla/inventory + source ${KOLLA_ANSIBLE_VENV_PATH}/bin/activate + kolla-ansible migrate-container-engine -i ${RAW_INVENTORY} -vvv + echo "SUCCESS: Migrated from Docker to Podman" +} + +function test_container_engine_migration_logged { + test_initial_vm + migrate_container_engine + test_migrated_vm +} + +function test_container_engine_migration { + echo "Testing container engine migration from Docker to Podman" + test_container_engine_migration_logged > /tmp/logs/ansible/test-container-engine-migration 2>&1 + result=$? + if [[ $result != 0 ]]; then + echo "Testing container engine migration failed. See ansible/test-container-engine-migration for details" + else + echo "Successfully tested container engine migration. See ansible/test-container-engine-migration for details" + fi + return $result +} + +test_container_engine_migration -- cgit v1.2.3