diff --git a/tests/run.yml b/tests/run.yml
index f52881eafa..107c8bd2d5 100644
--- a/tests/run.yml
+++ b/tests/run.yml
@@ -10,7 +10,7 @@
     - name: set facts for commonly used variables
       vars:
         # NOTE(yoctozepto): needed here to use in other facts too
-        openstack_core_enabled: "{{ scenario not in ['bifrost', 'mariadb', 'prometheus-efk', 'monasca'] }}"
+        openstack_core_enabled: "{{ scenario not in ['bifrost', 'mariadb', 'prometheus-efk', 'monasca', 'venus'] }}"
       set_fact:
         kolla_inventory_path: "/etc/kolla/inventory"
         logs_dir: "/tmp/logs"
@@ -519,6 +519,13 @@
             chdir: "{{ kolla_ansible_src_dir }}"
           when: scenario == "prometheus-efk"
 
+        - name: Run test-venus.sh script
+          script:
+            cmd: test-venus.sh
+            executable: /bin/bash
+            chdir: "{{ kolla_ansible_src_dir }}"
+          when: scenario == "venus"
+
       when: scenario != "bifrost"
 
 # NOTE(yoctozepto): each host checks itself
diff --git a/tests/setup_gate.sh b/tests/setup_gate.sh
index db7c81d58f..0318e838d9 100755
--- a/tests/setup_gate.sh
+++ b/tests/setup_gate.sh
@@ -101,6 +101,11 @@ function prepare_images {
         # FIXME(mgoddard): No need for OpenStack core images.
         GATE_IMAGES+=",^elasticsearch,^grafana,^influxdb,^kafka,^kibana,^logstash,^monasca,^storm,^zookeeper"
     fi
+
+    if [[ $SCENARIO == "venus" ]]; then
+        GATE_IMAGES="^cron,^elasticsearch,^fluentd,^haproxy,^keepalived,^keystone,^kolla-toolbox,^mariadb,^memcached,^rabbitmq,^venus"
+    fi
+
     sudo tee -a /etc/kolla/kolla-build.conf <<EOF
 [profiles]
 gate = ${GATE_IMAGES}
diff --git a/tests/templates/globals-default.j2 b/tests/templates/globals-default.j2
index a8b0d3d76a..22dda70c7f 100644
--- a/tests/templates/globals-default.j2
+++ b/tests/templates/globals-default.j2
@@ -191,3 +191,8 @@ octavia_amp_flavor:
 octavia_network_type: "tenant"
 {% endif %}
 
+{% if scenario == "venus" %}
+enable_elasticsearch: "yes"
+enable_keystone: "yes"
+enable_venus: "yes"
+{% endif %}
diff --git a/tests/test-venus.sh b/tests/test-venus.sh
new file mode 100755
index 0000000000..4bb4a4c8fb
--- /dev/null
+++ b/tests/test-venus.sh
@@ -0,0 +1,94 @@
+#!/bin/bash
+
+set -o xtrace
+set -o errexit
+set -o pipefail
+
+# Enable unbuffered output
+export PYTHONUNBUFFERED=1
+
+# TODO(yoctozepto): Avoid duplicating this from prometheus-efk
+function check_elasticsearch {
+    # Verify that we see a healthy index created due to Fluentd forwarding logs
+    local es_url=${OS_AUTH_URL%:*}:9200/_cluster/health
+    output_path=$1
+    args=(
+        --include
+        --location
+        --fail
+    )
+    if ! curl "${args[@]}" $es_url > $output_path; then
+        return 1
+    fi
+    # NOTE(mgoddard): Status may be yellow because no indices have been
+    # created.
+    if ! grep -E '"status":"(green|yellow)"' $output_path >/dev/null; then
+        return 1
+    fi
+}
+
+function check_venus {
+    local venus_url=${OS_AUTH_URL%:*}:10010/custom_config
+    output_path=$1
+    if ! curl --include --fail $venus_url > $output_path; then
+        return 1
+    fi
+    if ! grep -E '"status": "SUPPORTED"' $output_path >/dev/null; then
+        return 1
+    fi
+}
+
+function test_elasticsearch {
+    echo "TESTING: Elasticsearch"
+    output_path=$(mktemp)
+    attempt=1
+    while ! check_elasticsearch $output_path; do
+        echo "Elasticsearch not accessible yet"
+        attempt=$((attempt+1))
+        if [[ $attempt -eq 12 ]]; then
+            echo "FAILED: Elasticsearch did not become accessible. Response:"
+            cat $output_path
+            return 1
+        fi
+        sleep 10
+    done
+    echo "SUCCESS: Elasticsearch"
+}
+
+function test_venus {
+    echo "TESTING: Venus"
+    output_path=$(mktemp)
+    attempt=1
+    while ! check_venus $output_path; do
+        echo "Venus not accessible yet"
+        attempt=$((attempt+1))
+        if [[ $attempt -eq 12 ]]; then
+            echo "FAILED: Venus did not become accessible. Response:"
+            cat $output_path
+            return 1
+        fi
+        sleep 10
+    done
+    echo "SUCCESS: Venus"
+}
+
+function test_venus_scenario_logged {
+    . /etc/kolla/admin-openrc.sh
+
+    test_elasticsearch
+    test_venus
+}
+
+function test_venus_scenario {
+    echo "Testing Venus and EFK"
+    test_venus_scenario_logged > /tmp/logs/ansible/test-venus-scenario 2>&1
+    result=$?
+    if [[ $result != 0 ]]; then
+        echo "Testing Venus scenario failed. See ansible/test-venus-scenario for details"
+    else
+        echo "Successfully tested Venus scenario. See ansible/test-venus-scenario for details"
+    fi
+    return $result
+}
+
+test_venus_scenario
diff --git a/zuul.d/base.yaml b/zuul.d/base.yaml
index 726065a105..e7ebe12f3b 100644
--- a/zuul.d/base.yaml
+++ b/zuul.d/base.yaml
@@ -234,6 +234,16 @@
     vars:
       scenario: prometheus-efk
 
+- job:
+    name: kolla-ansible-venus-base
+    parent: kolla-ansible-base
+    voting: false
+    files:
+      - ^ansible/roles/(common|elasticsearch|venus)/
+      - ^tests/test-venus.sh
+    vars:
+      scenario: venus
+
 - job:
     name: kolla-ansible-hashi-vault-base
     run: tests/run-hashi-vault.yml
diff --git a/zuul.d/jobs.yaml b/zuul.d/jobs.yaml
index 1bd8b3e0a1..ac0557ac89 100644
--- a/zuul.d/jobs.yaml
+++ b/zuul.d/jobs.yaml
@@ -423,6 +423,22 @@
       base_distro: ubuntu
       install_type: source
 
+- job:
+    name: kolla-ansible-centos8s-source-venus
+    parent: kolla-ansible-venus-base
+    nodeset: kolla-ansible-centos8s
+    vars:
+      base_distro: centos
+      install_type: source
+
+- job:
+    name: kolla-ansible-ubuntu-source-venus
+    parent: kolla-ansible-venus-base
+    nodeset: kolla-ansible-focal
+    vars:
+      base_distro: ubuntu
+      install_type: source
+
 - job:
     name: kolla-ansible-centos8s-hashi-vault
     parent: kolla-ansible-hashi-vault-base
diff --git a/zuul.d/project.yaml b/zuul.d/project.yaml
index 1f51d44e3e..c4ceba3180 100644
--- a/zuul.d/project.yaml
+++ b/zuul.d/project.yaml
@@ -50,6 +50,8 @@
         - kolla-ansible-ubuntu-source-ovn
         - kolla-ansible-centos8s-source-prometheus-efk
         - kolla-ansible-ubuntu-source-prometheus-efk
+        - kolla-ansible-centos8s-source-venus
+        - kolla-ansible-ubuntu-source-venus
         - kolla-ansible-centos8s-source-monasca
         - kolla-ansible-centos8s-source-cephadm
         - kolla-ansible-ubuntu-source-cephadm