Merge "Don't fall when just loading novav21 modules"
diff --git a/README.rst b/README.rst
index 90f2a4b..a290d34 100644
--- a/README.rst
+++ b/README.rst
@@ -274,6 +274,8 @@
       compute:
         version: juno
         enabled: true
+        timeout_nbd: 10
+        heal_instance_info_cache_interval: 60
         cross_az_attach: false
         disk_cachemodes: network=writeback,block=none
         availability_zone: availability_zone_01
@@ -1182,6 +1184,27 @@
 You can read more about it here:
     https://docs.openstack.org/security-guide/databases/database-access-control.html
 
+Nova database connection setup:
+========
+
+.. code-block:: yaml
+
+   nova:
+     controller:
+     enabled: True
+     ...
+     database:
+       idle_timeout: 180
+       min_pool_size: 100
+       max_pool_size: 700
+       max_overflow: 100
+       retry_interval: 5
+       max_retries: '-1'
+       db_max_retries: 3
+       db_retry_interval: 1
+       connection_debug: 10
+       pool_timeout: 120
+
 Upgrades
 ========
 
diff --git a/_states/novav21.py b/_states/novav21.py
index ffda7d1..ad8a4a5 100644
--- a/_states/novav21.py
+++ b/_states/novav21.py
@@ -466,6 +466,7 @@
     :param timeout: amount of time in seconds mapping process should finish in.
     :param runas: username to run the shell commands under.
     """
+    test = __opts__.get('test', False)
     cell_uuid = __salt__['cmd.shell'](
         "nova-manage cell_v2 list_cells 2>/dev/null | "
         "awk '/%s/ {print $4}'" % name, runas=runas)
@@ -476,17 +477,21 @@
             .format(name))
         return result
     start_time = time.time()
-    while True:
-        rc = __salt__['cmd.retcode']('nova-manage cell_v2 map_instances '
-                                     '--cell_uuid %s' % cell_uuid, runas=runas)
-        if rc == 0 or time.time() - start_time > timeout:
-            break
-    if rc != 0:
-        result['comment'] = (
-            'Failed to map all instances in cell {0} in {1} seconds'
-            .format(name, timeout))
-        return result
+    if not test:
+        while True:
+            rc = __salt__['cmd.retcode'](
+                'nova-manage cell_v2 map_instances --cell_uuid %s' % cell_uuid,
+                runas=runas)
+            if rc == 0 or time.time() - start_time > timeout:
+                break
+        if rc != 0:
+            result['comment'] = (
+                'Failed to map all instances in cell {0} in {1} seconds'
+                .format(name, timeout))
+            return result
     result['comment'] = 'All instances mapped in cell {0}'.format(name)
+    if test:
+        result['comment'] = 'TEST: {}'.format(result['comment'])
     result['result'] = True
     return result
 
diff --git a/nova/files/ocata/nova-controller.conf.Debian b/nova/files/ocata/nova-controller.conf.Debian
index 23db54e..11cec7e 100644
--- a/nova/files/ocata/nova-controller.conf.Debian
+++ b/nova/files/ocata/nova-controller.conf.Debian
@@ -3436,16 +3436,16 @@
 #
 # From nova.conf
 #
-idle_timeout = 180
-min_pool_size = 100
-max_pool_size = 700
-max_overflow = 100
-retry_interval = 5
-max_retries = -1
-db_max_retries = 3
-db_retry_interval = 1
-connection_debug = 10
-pool_timeout = 120
+idle_timeout = {{ controller.database.get('idle_timeout', 180) }}
+min_pool_size = {{ controller.database.get('min_pool_size', 100) }}
+max_pool_size = {{ controller.database.get('max_pool_size', 700) }}
+max_overflow = {{ controller.database.get('max_overflow', 100) }}
+retry_interval = {{ controller.database.get('retry_interval', 5) }}
+max_retries = {{ controller.database.get('max_retries', '-1') }}
+db_max_retries = {{ controller.database.get('db_max_retries', 3) }}
+db_retry_interval = {{ controller.database.get('db_retry_interval', 1) }}
+connection_debug = {{ controller.database.get('connection_debug', 10) }}
+pool_timeout = {{ controller.database.get('pool_timeout', 120) }}
 connection = {{ controller.database.engine }}+pymysql://{{ controller.database.user }}:{{ controller.database.password }}@{{ controller.database.host }}/{{ controller.database.name }}_api?charset=utf8{%- if controller.database.get('ssl',{}).get('enabled',False) %}&ssl_ca={{ controller.database.ssl.get('cacert_file', controller.cacert_file) }}{% endif %}
 
 # The SQLAlchemy connection string to use to connect to the database. (string
@@ -4491,16 +4491,16 @@
 # Reason: Should use config option connection or slave_connection to connect the
 # database.
 #sqlite_db=oslo.sqlite
-idle_timeout = 180
-min_pool_size = 100
-max_pool_size = 700
-max_overflow = 100
-retry_interval = 5
-max_retries = -1
-db_max_retries = 3
-db_retry_interval = 1
-connection_debug = 10
-pool_timeout = 120
+idle_timeout = {{ controller.database.get('idle_timeout', 180) }}
+min_pool_size = {{ controller.database.get('min_pool_size', 100) }}
+max_pool_size = {{ controller.database.get('max_pool_size', 700) }}
+max_overflow = {{ controller.database.get('max_overflow', 100) }}
+retry_interval = {{ controller.database.get('retry_interval', 5) }}
+max_retries = {{ controller.database.get('max_retries', '-1') }}
+db_max_retries = {{ controller.database.get('db_max_retries', 3) }}
+db_retry_interval = {{ controller.database.get('db_retry_interval', 1) }}
+connection_debug = {{ controller.database.get('connection_debug', 10) }}
+pool_timeout = {{ controller.database.get('pool_timeout', 120) }}
 connection = {{ controller.database.engine }}+pymysql://{{ controller.database.user }}:{{ controller.database.password }}@{{ controller.database.host }}/{{ controller.database.name }}?charset=utf8{%- if controller.database.get('ssl',{}).get('enabled',False) %}&ssl_ca={{ controller.database.ssl.get('cacert_file', controller.cacert_file) }}{% endif %}
 
 # If True, SQLite uses synchronous mode. (boolean value)
diff --git a/nova/files/pike/nova-controller.conf.Debian b/nova/files/pike/nova-controller.conf.Debian
index ac64982..8b59db2 100644
--- a/nova/files/pike/nova-controller.conf.Debian
+++ b/nova/files/pike/nova-controller.conf.Debian
@@ -3486,16 +3486,16 @@
 #
 # From nova.conf
 #
-idle_timeout = 180
-min_pool_size = 100
-max_pool_size = 700
-max_overflow = 100
-retry_interval = 5
-max_retries = -1
-db_max_retries = 3
-db_retry_interval = 1
-connection_debug = 10
-pool_timeout = 120
+idle_timeout = {{ controller.database.get('idle_timeout', 180) }}
+min_pool_size = {{ controller.database.get('min_pool_size', 100) }}
+max_pool_size = {{ controller.database.get('max_pool_size', 700) }}
+max_overflow = {{ controller.database.get('max_overflow', 100) }}
+retry_interval = {{ controller.database.get('retry_interval', 5) }}
+max_retries = {{ controller.database.get('max_retries', '-1') }}
+db_max_retries = {{ controller.database.get('db_max_retries', 3) }}
+db_retry_interval = {{ controller.database.get('db_retry_interval', 1) }}
+connection_debug = {{ controller.database.get('connection_debug', 10) }}
+pool_timeout = {{ controller.database.get('pool_timeout', 120) }}
 connection = {{ controller.database.engine }}+pymysql://{{ controller.database.user }}:{{ controller.database.password }}@{{ controller.database.host }}/{{ controller.database.name }}_api?charset=utf8{{ connection_x509_ssl_option|string }}
 
 # The SQLAlchemy connection string to use to connect to the database. (string
@@ -4540,16 +4540,16 @@
 # Reason: Should use config option connection or slave_connection to connect the
 # database.
 #sqlite_db=oslo.sqlite
-idle_timeout = 180
-min_pool_size = 100
-max_pool_size = 700
-max_overflow = 100
-retry_interval = 5
-max_retries = -1
-db_max_retries = 3
-db_retry_interval = 1
-connection_debug = 10
-pool_timeout = 120
+idle_timeout = {{ controller.database.get('idle_timeout', 180) }}
+min_pool_size = {{ controller.database.get('min_pool_size', 100) }}
+max_pool_size = {{ controller.database.get('max_pool_size', 700) }}
+max_overflow = {{ controller.database.get('max_overflow', 100) }}
+retry_interval = {{ controller.database.get('retry_interval', 5) }}
+max_retries = {{ controller.database.get('max_retries', '-1') }}
+db_max_retries = {{ controller.database.get('db_max_retries', 3) }}
+db_retry_interval = {{ controller.database.get('db_retry_interval', 1) }}
+connection_debug = {{ controller.database.get('connection_debug', 10) }}
+pool_timeout = {{ controller.database.get('pool_timeout', 120) }}
 connection = {{ controller.database.engine }}+pymysql://{{ controller.database.user }}:{{ controller.database.password }}@{{ controller.database.host }}/{{ controller.database.name }}?charset=utf8{{ connection_x509_ssl_option|string }}
 
 # If True, SQLite uses synchronous mode. (boolean value)
diff --git a/nova/files/queens/nova-compute.conf.Debian b/nova/files/queens/nova-compute.conf.Debian
index 54dfd87..645cc4d 100644
--- a/nova/files/queens/nova-compute.conf.Debian
+++ b/nova/files/queens/nova-compute.conf.Debian
@@ -430,6 +430,9 @@
 # (integer value)
 # Minimum value: 0
 #timeout_nbd = 10
+{%- if compute.timeout_nbd is defined %}
+timeout_nbd = {{ compute.timeout_nbd }}
+{%- endif %}
 
 #
 # Location of cached images.
diff --git a/nova/files/queens/nova-controller.conf.Debian b/nova/files/queens/nova-controller.conf.Debian
index 2f15f22..f430fdf 100644
--- a/nova/files/queens/nova-controller.conf.Debian
+++ b/nova/files/queens/nova-controller.conf.Debian
@@ -423,6 +423,9 @@
 # (integer value)
 # Minimum value: 0
 #timeout_nbd = 10
+{%- if controller.timeout_nbd is defined %}
+timeout_nbd = {{ controller.timeout_nbd }}
+{%- endif %}
 
 #
 # Location of cached images.
@@ -885,6 +888,9 @@
 # * Any value <=0 will disable the sync. This is not recommended.
 #  (integer value)
 #heal_instance_info_cache_interval = 60
+{%- if controller.heal_instance_info_cache_interval is defined %}
+heal_instance_info_cache_interval = {{ controller.heal_instance_info_cache_interval }}
+{%- endif %}
 
 #
 # Interval for reclaiming deleted instances.
diff --git a/nova/files/rocky/nova-compute.conf.Debian b/nova/files/rocky/nova-compute.conf.Debian
index 819ad84..ed0aceb 100644
--- a/nova/files/rocky/nova-compute.conf.Debian
+++ b/nova/files/rocky/nova-compute.conf.Debian
@@ -319,6 +319,9 @@
 # Amount of time, in seconds, to wait for NBD device start up. (integer value)
 # Minimum value: 0
 #timeout_nbd = 10
+{%- if compute.timeout_nbd is defined %}
+timeout_nbd = {{ compute.timeout_nbd }}
+{%- endif %}
 
 #
 # Location of cached images.
diff --git a/nova/files/rocky/nova-controller.conf.Debian b/nova/files/rocky/nova-controller.conf.Debian
index 63810ad..4856353 100644
--- a/nova/files/rocky/nova-controller.conf.Debian
+++ b/nova/files/rocky/nova-controller.conf.Debian
@@ -313,6 +313,9 @@
 # Amount of time, in seconds, to wait for NBD device start up. (integer value)
 # Minimum value: 0
 #timeout_nbd = 10
+{%- if controller.timeout_nbd is defined %}
+timeout_nbd = {{ controller.timeout_nbd }}
+{%- endif %}
 
 #
 # Location of cached images.
@@ -736,6 +739,9 @@
 # * Any value <=0 will disable the sync. This is not recommended.
 #  (integer value)
 #heal_instance_info_cache_interval = 60
+{%- if controller.heal_instance_info_cache_interval is defined %}
+heal_instance_info_cache_interval = {{ controller.heal_instance_info_cache_interval }}
+{%- endif %}
 
 #
 # Interval for reclaiming deleted instances.
diff --git a/nova/upgrade/pre/init.sls b/nova/upgrade/pre/init.sls
index 9ed049a..0c5834e 100644
--- a/nova/upgrade/pre/init.sls
+++ b/nova/upgrade/pre/init.sls
@@ -16,7 +16,7 @@
 /etc/nova/nova.conf:
   file.managed:
   - name: /etc/nova/nova.conf
-  - source: salt://nova/files/{{ _data.version }}/nova-{{ type }}.conf.{{ grains.os_family }}
+  - source: salt://nova/files/{{ upgrade.old_release }}/nova-{{ type }}.conf.{{ grains.os_family }}
   - template: jinja
 
 {%- if controller.get('enabled') %}
diff --git a/tests/pillar/compute_cluster.sls b/tests/pillar/compute_cluster.sls
index 7c79c8a..378de4f 100644
--- a/tests/pillar/compute_cluster.sls
+++ b/tests/pillar/compute_cluster.sls
@@ -7,6 +7,7 @@
       mount_points:
       - path: /mnt/hugepages_1GB
     disk_cachemodes: network=writeback,block=none
+    timeout_nbd: 10
     heal_instance_info_cache_interval: 60
     vncproxy_url: openstack:6080
     report_interval: 60
diff --git a/tests/pillar/compute_single.sls b/tests/pillar/compute_single.sls
index c2b740a..5677ab6 100644
--- a/tests/pillar/compute_single.sls
+++ b/tests/pillar/compute_single.sls
@@ -2,6 +2,7 @@
   compute:
     version: newton
     enabled: true
+    timeout_nbd: 10
     heal_instance_info_cache_interval: 60
     vncproxy_url: openstack:6080
     vnc_keymap: en-gb
diff --git a/tests/pillar/compute_single_config_drive_options.sls b/tests/pillar/compute_single_config_drive_options.sls
index 739f876..44c6428 100644
--- a/tests/pillar/compute_single_config_drive_options.sls
+++ b/tests/pillar/compute_single_config_drive_options.sls
@@ -2,6 +2,7 @@
   compute:
     version: queens
     enabled: true
+    timeout_nbd: 10
     heal_instance_info_cache_interval: 60
     vncproxy_url: openstack:6080
     vnc_keymap: en-gb
diff --git a/tests/pillar/control_cluster.sls b/tests/pillar/control_cluster.sls
index c844124..397d659 100644
--- a/tests/pillar/control_cluster.sls
+++ b/tests/pillar/control_cluster.sls
@@ -24,6 +24,16 @@
       name: nova
       user: nova
       password: password
+      idle_timeout: 180
+      min_pool_size: 100
+      max_pool_size: 700
+      max_overflow: 100
+      retry_interval: 5
+      max_retries: '-1'
+      db_max_retries: 3
+      db_retry_interval: 1
+      connection_debug: 10
+      pool_timeout: 120
     identity:
       engine: keystone
       region: RegionOne
diff --git a/tests/pillar/control_single.sls b/tests/pillar/control_single.sls
index 443e821..114aee8 100644
--- a/tests/pillar/control_single.sls
+++ b/tests/pillar/control_single.sls
@@ -3,6 +3,8 @@
     enabled: true
     networking: contrail
     version: queens
+    timeout_nbd: 10
+    heal_instance_info_cache_interval: 60
     security_group: false
     vncproxy_url: 127.0.0.1
     vnc_keymap: en-gb
@@ -36,6 +38,16 @@
       name: nova
       user: nova
       password: password
+      idle_timeout: 180
+      min_pool_size: 100
+      max_pool_size: 700
+      max_overflow: 100
+      retry_interval: 5
+      max_retries: '-1'
+      db_max_retries: 3
+      db_retry_interval: 1
+      connection_debug: 10
+      pool_timeout: 120
     identity:
       engine: keystone
       region: RegionOne