[nova] Add flag to set libvirt tb_cache_size

A config option is being added in nova with [1]
in order to allow configuring lower tb-cache size
for qemu guest VMs.

This patch adds a flag in devstack so jobs can
utilize it to set required tb-cache size.

[1] https://review.opendev.org/c/openstack/nova/+/868419

Co-Authored-By: Sean Mooney <work@seanmooney.info>
Related: blueprint libvirt-tb-cache-size
Change-Id: Ifde737eb5d87dfe860445097d1f2b0ce16b0de05
diff --git a/.zuul.yaml b/.zuul.yaml
index 06d76d0..3e6c42e 100644
--- a/.zuul.yaml
+++ b/.zuul.yaml
@@ -544,17 +544,15 @@
         # increase in swap performance by reducing the amount of data
         # written to disk. the overall speedup is proportional to the
         # compression ratio and the speed of the swap device.
+        # NOTE: this option is ignored when not using nova with the libvirt
+        # virt driver.
+        NOVA_LIBVIRT_TB_CACHE_SIZE: 128
         ENABLE_ZSWAP: true
       devstack_local_conf:
         post-config:
           $NEUTRON_CONF:
             DEFAULT:
               global_physnet_mtu: '{{ external_bridge_mtu }}'
-          $NOVA_CPU_CONF:
-            libvirt:
-              # Use lower TB cache than default(1GiB), only applicable with
-              # libvirt>=8.0.0
-              tb_cache_size: 128
       devstack_services:
         # Core services enabled for this branch.
         # This list replaces the test-matrix.
@@ -659,13 +657,9 @@
           # written to disk. the overall speedup is porportional to the
           # compression ratio and the speed of the swap device.
           ENABLE_ZSWAP: true
-        devstack_local_conf:
-          post-config:
-            $NOVA_CPU_CONF:
-              libvirt:
-                # Use lower TB cache than default(1GiB), only applicable with
-                # libvirt>=8.0.0
-                tb_cache_size: 128
+          # NOTE: this option is ignored when not using nova with the libvirt
+          # virt driver.
+          NOVA_LIBVIRT_TB_CACHE_SIZE: 128
 
 - job:
     name: devstack-ipv6
diff --git a/lib/nova b/lib/nova
index ee3f29e..7c6ffb2 100644
--- a/lib/nova
+++ b/lib/nova
@@ -173,6 +173,9 @@
 # Whether to use Keystone unified limits instead of legacy quota limits.
 NOVA_USE_UNIFIED_LIMITS=$(trueorfalse False NOVA_USE_UNIFIED_LIMITS)
 
+# TB Cache Size in MiB for qemu guests
+NOVA_LIBVIRT_TB_CACHE_SIZE=${NOVA_LIBVIRT_TB_CACHE_SIZE:-0}
+
 # Functions
 # ---------
 
@@ -1071,6 +1074,9 @@
     fi
 
     if [[ "$VIRT_DRIVER" = 'libvirt' ]]; then
+        if [ ${NOVA_LIBVIRT_TB_CACHE_SIZE} -gt 0 ]; then
+            iniset $NOVA_CPU_CONF libvirt tb_cache_size ${NOVA_LIBVIRT_TB_CACHE_SIZE}
+        fi
         # The group **$LIBVIRT_GROUP** is added to the current user in this script.
         # ``sg`` is used in run_process to execute nova-compute as a member of the
         # **$LIBVIRT_GROUP** group.