diff --git a/tests/test-openstack.sh b/tests/test-openstack.sh
index c346b9bbbe..78502f620d 100755
--- a/tests/test-openstack.sh
+++ b/tests/test-openstack.sh
@@ -7,28 +7,65 @@ set -o errexit
 export PYTHONUNBUFFERED=1
 
 
-function test_openstack {
+function test_openstack_logged {
     # Wait for service ready
     sleep 15
-    . /etc/kolla/admin-openrc.sh
-    nova --debug service-list
-    openstack --debug network agent list
-    tools/init-runonce
-    nova --debug boot --poll --image $(openstack image list | awk '/cirros/ {print $2}') --nic net-id=$(openstack network list | awk '/demo-net/ {print $2}') --flavor 1 kolla_boot_test
 
-    nova --debug list
+    . /etc/kolla/admin-openrc.sh
+
+    openstack --debug compute service list
+    openstack --debug network agent list
+
+    if ! openstack image show cirros >/dev/null 2>&1; then
+        echo "Initialising OpenStack resources via init-runonce"
+        tools/init-runonce
+    else
+        echo "Not running init-runonce - resources exist"
+    fi
+
+    echo "TESTING: Server creation"
+    openstack server create --wait --image cirros --flavor m1.tiny --key-name mykey --network demo-net kolla_boot_test
+    openstack --debug server list
     # If the status is not ACTIVE, print info and exit 1
-    nova --debug show kolla_boot_test | awk '{buf=buf"\n"$0} $2=="status" && $4!="ACTIVE" {failed="yes"}; END {if (failed=="yes") {print buf; exit 1}}'
+    if [[ $(openstack server show kolla_boot_test -f value -c status) != "ACTIVE" ]]; then
+        echo "FAILED: Instance is not active"
+        openstack --debug server show kolla_boot_test
+        return 1
+    fi
+    echo "SUCCESS: Server creation"
+
     if echo $ACTION | grep -q "ceph"; then
+        echo "TESTING: Cinder volume attachment"
         openstack volume create --size 2 test_volume
         openstack server add volume kolla_boot_test test_volume --device /dev/vdb
+        openstack server remove volume kolla_boot_test test_volume
+        echo "SUCCESS: Cinder volume attachment"
     fi
+
+    echo "TESTING: Server deletion"
+    openstack server delete --wait kolla_boot_test
+    echo "SUCCESS: Server deletion"
+
     if echo $ACTION | grep -q "zun"; then
+        echo "TESTING: Zun"
         openstack --debug appcontainer service list
         openstack --debug appcontainer host list
         # TODO(hongbin): Run a Zun container and assert the container becomes
         # Running
+        echo "SUCCESS: Zun"
     fi
 }
 
+function test_openstack {
+    echo "Testing OpenStack"
+    test_openstack_logged > /tmp/logs/ansible/test-openstack 2>&1
+    result=$?
+    if [[ $result != 0 ]]; then
+        echo "Testing OpenStack failed. See ansible/test-openstack for details"
+    else
+        echo "Successfully tested OpenStack. See ansible/test-openstack for details"
+    fi
+    return $result
+}
+
 test_openstack