aboutsummaryrefslogtreecommitdiff
path: root/tests/test-container-engine-migration.sh
diff options
context:
space:
mode:
authorKonstantin Yarovoy <konstantin.yarovoy@tietoevry.com>2022-04-07 13:16:15 +0200
committerRoman Krcek <roman.krcek@tietoevry.com>2025-03-19 17:20:04 +0000
commitf726cfd9982bf6a5250859f3ecfcacf018159b99 (patch)
treebd0a4c62f63935e18b96e4610f684f6deeed4caa /tests/test-container-engine-migration.sh
parent12aa03929a30dc9d10b12a64551623d9fd998a2f (diff)
downloadkolla-ansible-f726cfd9982bf6a5250859f3ecfcacf018159b99.tar.gz
kolla-ansible-f726cfd9982bf6a5250859f3ecfcacf018159b99.zip
Add container engine migration scenario
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 <konstantin.yarovoy@tietoevry.com> Signed-off-by: Martin Hiner <m.hiner@partner.samsung.com> Signed-off-by: Roman KrĨek <roman.krcek@tietoevry.com> Change-Id: Icd709cb042d44e063c5da64ab0695b0b6ba6d48b
Diffstat (limited to 'tests/test-container-engine-migration.sh')
-rw-r--r--tests/test-container-engine-migration.sh205
1 files changed, 205 insertions, 0 deletions
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