diff --git a/tests/deploy.sh b/tests/deploy.sh
index bf326cf63dee26c82a29cc5ae87ac450c31e4253..7405d43a30795108fe94c872b2f07dcaf16a663c 100755
--- a/tests/deploy.sh
+++ b/tests/deploy.sh
@@ -23,6 +23,10 @@ function deploy {
     kolla-ansible -i ${RAW_INVENTORY} -vvv pull &> /tmp/logs/ansible/pull
     kolla-ansible -i ${RAW_INVENTORY} -vvv deploy &> /tmp/logs/ansible/deploy
     kolla-ansible -i ${RAW_INVENTORY} -vvv post-deploy &> /tmp/logs/ansible/post-deploy
+
+    if [[ $HAS_UPGRADE == 'no' ]]; then
+        kolla-ansible -i ${RAW_INVENTORY} -vvv validate-config &> /tmp/logs/ansible/validate-config
+    fi
 }
 
 
diff --git a/tests/run.yml b/tests/run.yml
index 1394688120b95aed000cf7264325541a521b067f..b30d13a41432ff302261794bf88c90e91332e558 100644
--- a/tests/run.yml
+++ b/tests/run.yml
@@ -388,6 +388,7 @@
           environment:
             TLS_ENABLED: "{{ tls_enabled }}"
             KOLLA_ANSIBLE_VENV_PATH: "{{ kolla_ansible_venv_path }}"
+            HAS_UPGRADE: "{{ is_upgrade | bool | ternary('yes', 'no') }}"
 
         # NOTE(yoctozepto): this is nice as the first step after the deployment
         # because it waits for the services to stabilize well enough so that
diff --git a/tests/upgrade.sh b/tests/upgrade.sh
index d5902784c5170b11bd0358c7b9e7fbabb6ba1a40..23a77c9a971c76836e7d1699043d469f6afb1985 100755
--- a/tests/upgrade.sh
+++ b/tests/upgrade.sh
@@ -20,6 +20,8 @@ function upgrade {
     # TODO(yoctozepto): Remove after Zed.
     kolla-ansible -i ${RAW_INVENTORY} -vvv deploy --tags keystone &> /tmp/logs/ansible/upgrade-deploy
     kolla-ansible -i ${RAW_INVENTORY} -vvv post-deploy &> /tmp/logs/ansible/upgrade-post-deploy
+
+    kolla-ansible -i ${RAW_INVENTORY} -vvv validate-config &> /tmp/logs/ansible/validate-config
 }