Repository: exasol/integration-test-docker-environment (language: python)

Issue:
Add port, keys, user to DatabaseInfo with parent field ssh_info
See also comment https://github.com/exasol/integration-test-docker-environment/pull/339#discussion_r1222475847
AC
1. `DatabaseInfo` contains SSH infos user, port, path to file containing the private key
2. User is currently constantly set to `root`

#### Limitation

Path to file containing the private key is current not mounted in _test_container_ so _test_container_ currently will not be able to access database via SSH. As up to now _test_container_ does not access the database at all, mounting the key file is an optional feature that safely can be delayed.
Forward SSH port
ITDE currently uses `docker_exec` to access the Docker Container, e.g. to analyze the content of some logfiles.  With version 8 and higher the format of the Docker Containers might change so that `docker_exec` is no longer possible. Instead ITDE will then need to use SSH access.

The current ticket requests to to forward the SSH port outside the Docker Container in order to enable accessing the operating system hosting the database via SSH from outside the Docker Container.

#### Acceptance Criteria
1. ITDE offers a cli option `--ssh-port-forward` to specify the port mapping
2. user guide describes new cli option
3. ITDE implementation handles the command line option in API, test environment, and luigi task
4. If the container does not exist already and user did not specify a port then ITDE selects a random port from the list of free ports available on the host system outside the docker
5. If the container exists already then ITDE
    * reuses the existing container
    * inquires the forwarded port from the container
    * ignores the command line option



Discussion / hints:

Affected are 
1. `cli/options/test_environment_options.py` defines new cli option
2. `lib/test_environment/parameter/docker_db_test_environment_parameter.py` defines new task parameter
3. `lib/test_environment/spawn_test_database.py` forwards the SSH port accordingly
4. `cli/commands/spawn_test_environment.py`
5. `lib/api/spawn_test_environment_with_test_container.py`
6. `lib/api/spawn_test_environment.py`
7. `testing/exaslct_test_environment.py`

Proposed changes for (3): 
```python
SSH_PORT = "22"
if self.ssh_port_forward is not None:
    ports[f"{SSH_PORT}/tcp"] = ('0.0.0.0', int(self.ssh_port_forward))
```

Discussion with @tkilias:
- forwarded port should be random
- implementation should select a free port automatically 
- If container is already existing then the forwarded port that had been selected previously should be reused 

For reuse: 
* see https://github.com/docker/docker-py/issues/1742
* `port_data = client.inspect_container(<container_id>)['NetworkSettings']['Ports']`

or 
```python
def get_mapped_port(container: Container, port: int) -> int:
    try:
        return int(
            container.attrs
            ["HostConfig"]
            ["PortBindings"]
            [f"{port}/tcp"]
            [0]
            ["HostPort"]
        )
    except (KeyError, IndexError):
        return None
```

Example from `container.attrs`: 
```json
   "PortBindings": {
     "6583/tcp": [{"HostIp": "0.0.0.0", "HostPort": "36263"}],
     "8888/tcp": [{"HostIp": "0.0.0.0", "HostPort": "50033"}]
   },

```

See `exasol_integration_test_docker_environment.testing.utils.find_free_ports`.

Used in `exasol_integration_test_docker_environment/testing/api_test_environment.py`:
```python 
database_port, bucketfs_port = find_free_ports(2)
```

Implementation options
* a) always allocate 3 ports in advance, and only use 3rd port for SSH in case SSH access is required 
* b) stick with on 2 allocated ports in advance, and allocate a 3rd one dynamically later on if required 
* c) analyze cli options to identify if a 3rd port needs to be allocated in advance 

I opt for option (c).
Observations indicate that some logic in Docker seems to overwrite file `/root/.ssh/authorized_keys`.

Which alternatives exist?

- A1) Modify logic in Docker to not overwrite the file and rather append additional keys if required.
- A2) Change our code to modify the file at a later point in time and append to file rather than overwriting it.
- A3) Authenticate with password instead of keys.
- A4) Use key of existing logic in Docker.

For A1 and A2 feasibility is unknown.
A3 and A4 require to know either password or the secret key in advance.

Extend docker db EXAConf template with 

https://github.com/exasol/integration-test-docker-environment/blob/74396e4211287b451977684943fe46b17334de28/docker_db_config_template/8.17.0/EXAConf#L86

add `authorized_keys` config to root user with like that

`authorized_keys = {{ authorized_keys }}`

After changing one of the templates, e.g. `docker_db_config_template/7.1.0/EXAConf` you might need to copy the templates to folder `exasol_integration_test_docker_environment/docker_db_config` with the following command: 

```shell
bash ./githooks/update_packaging.sh
```

Inside the Docker Container the following commands might be helpful:
* `exaconf list-users` to check the results from evaluating file `/exa/etc/EXAConf`
* `exaconf modify-user --name root --auth-keys <my-key>` to modify auth keys without editing file `/exa/etc/EXAConf`
the issue is, in the c4 container, you can't access the exaconf and exaconf changes the config file, but not the applied config, for that exainit needs to run again.
if you want to change the user in a running container, you probably need to use confd.
No worries, currently I have some progress and I already could find out that the key in EXAConf is not `authorized_keys` but `AuthorizedKeys`. 🙂 

Fix patch:
diff --git a/doc/changes/changes_2.0.0.md b/doc/changes/changes_2.0.0.md
index f3c0a733f..12922a526 100644
--- a/doc/changes/changes_2.0.0.md
+++ b/doc/changes/changes_2.0.0.md
@@ -4,13 +4,19 @@
 
 Version 2.0.0 of ITDE comes with breaking changes as public API class `DatabaseInfo` has been changed.  Former separate attributes `database_port_forward`and `bucketfs_port_forward` have been replaced by a single attribute `port` set to an instance of `PortForwarding` with attributes `database`, `bucketfs`, and `ssh`.
 
+Previous versions of the ITDE used `docker_exec` to access the Docker Container, e.g. to analyze the content of logfiles or execute some shell commands. In future versions of the Exasol Docker-DB the format of the Docker Containers might change so that `docker_exec` is no longer possible. Instead ITDE will then need to use SSH access.
+
+The current release therefore enhances ITDE to enable to access the Docker Container via SSH.  The user can select the docker access method with command line option `--db-os-access` and can specify a port number to which ITDE forwards the SSH port of the Docker Container, see User Guide.
+
+Additionally the directory for storing the randomly generated SSH keys has been moved to `~/.cache/exasol/itde/`. By that ITDE can restrict file permissions allowing access only by the current user.
+
 T.B.D.
 
 ### Supported Exasol Versions
 
 * **7.0**: up to 7.0.20, **except 7.0.5**
 * **7.1**: up to 7.1.17
-* **8.17.0** and 8.18.1
+* **8**: 8.18.1
 
 If you need further versions, please open an issue.
 
@@ -19,3 +25,4 @@ If you need further versions, please open an issue.
 ## Changes
 
 * #329: Added CLI option `--ssh-port-forward` to forward SSH port
+* #343: Added SshInfo to DatabaseInfo containing user, port and path to SSH key file
diff --git a/docker_db_config_template/7.0.0/EXAConf b/docker_db_config_template/7.0.0/EXAConf
index 6d90b2229..5634bf01b 100644
--- a/docker_db_config_template/7.0.0/EXAConf
+++ b/docker_db_config_template/7.0.0/EXAConf
@@ -61,7 +61,7 @@
         Group = root
         LoginEnabled = True
         AdditionalGroups = exausers, exadbadm, exastoradm, exabfsadm, exaadm
-        AuthorizedKeys = {{authorized_keys}}
+        AuthorizedKeys = {{ authorized_keys }}
     [[exadefusr]]
         ID = 500
         Group = exausers
@@ -69,7 +69,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     UUID = A5F8F92113A34BA4B0A48D5397423BBA5CF95161
@@ -118,7 +118,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/docker_db_config_template/7.1.0/EXAConf b/docker_db_config_template/7.1.0/EXAConf
index 922af353f..0193d203b 100644
--- a/docker_db_config_template/7.1.0/EXAConf
+++ b/docker_db_config_template/7.1.0/EXAConf
@@ -81,7 +81,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     # Affinity decides how this node is used in the cluster. i.e, the possibility to become master
@@ -132,7 +132,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/docker_db_config_template/8.17.0/EXAConf b/docker_db_config_template/8.17.0/EXAConf
index b268445ff..d775c3bd4 100644
--- a/docker_db_config_template/8.17.0/EXAConf
+++ b/docker_db_config_template/8.17.0/EXAConf
@@ -84,7 +84,7 @@
         Group = root
         LoginEnabled = True
         AdditionalGroups = exausers, exaadm, exadbadm, exastoradm, exabfsadm, exasaasadm
-        AuthorizedKeys = {{authorized_keys}}
+        AuthorizedKeys = {{ authorized_keys }}
     [[exadefusr]]
         ID = 500
         Group = exausers
@@ -97,7 +97,7 @@
         AdditionalGroups = exasaasadm,
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     # Affinity decides how this node is used in the cluster. i.e, the possibility to become master
@@ -156,7 +156,7 @@
     # Unique id of this database.
     ID = aCbUZhU3R8eEc0UIDS7wQw
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/docker_db_config_template/8.18.1/EXAConf b/docker_db_config_template/8.18.1/EXAConf
index 89a75dc9a..41accbd32 100644
--- a/docker_db_config_template/8.18.1/EXAConf
+++ b/docker_db_config_template/8.18.1/EXAConf
@@ -97,7 +97,7 @@
         AdditionalGroups = exasaasadm,
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     # Affinity decides how this node is used in the cluster. i.e, the possibility to become master
@@ -156,7 +156,7 @@
     # Unique id of this database.
     ID = aCbUZhU3R8eEc0UIDS7wQw
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888


Test patch:
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.0.0/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.0.0/EXAConf
index 6d90b2229..5634bf01b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.0.0/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.0.0/EXAConf
@@ -61,7 +61,7 @@
         Group = root
         LoginEnabled = True
         AdditionalGroups = exausers, exadbadm, exastoradm, exabfsadm, exaadm
-        AuthorizedKeys = {{authorized_keys}}
+        AuthorizedKeys = {{ authorized_keys }}
     [[exadefusr]]
         ID = 500
         Group = exausers
@@ -69,7 +69,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     UUID = A5F8F92113A34BA4B0A48D5397423BBA5CF95161
@@ -118,7 +118,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.0.1/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.0.1/EXAConf
index 6d90b2229..5634bf01b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.0.1/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.0.1/EXAConf
@@ -61,7 +61,7 @@
         Group = root
         LoginEnabled = True
         AdditionalGroups = exausers, exadbadm, exastoradm, exabfsadm, exaadm
-        AuthorizedKeys = {{authorized_keys}}
+        AuthorizedKeys = {{ authorized_keys }}
     [[exadefusr]]
         ID = 500
         Group = exausers
@@ -69,7 +69,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     UUID = A5F8F92113A34BA4B0A48D5397423BBA5CF95161
@@ -118,7 +118,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.0.10/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.0.10/EXAConf
index 6d90b2229..5634bf01b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.0.10/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.0.10/EXAConf
@@ -61,7 +61,7 @@
         Group = root
         LoginEnabled = True
         AdditionalGroups = exausers, exadbadm, exastoradm, exabfsadm, exaadm
-        AuthorizedKeys = {{authorized_keys}}
+        AuthorizedKeys = {{ authorized_keys }}
     [[exadefusr]]
         ID = 500
         Group = exausers
@@ -69,7 +69,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     UUID = A5F8F92113A34BA4B0A48D5397423BBA5CF95161
@@ -118,7 +118,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.0.11/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.0.11/EXAConf
index 6d90b2229..5634bf01b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.0.11/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.0.11/EXAConf
@@ -61,7 +61,7 @@
         Group = root
         LoginEnabled = True
         AdditionalGroups = exausers, exadbadm, exastoradm, exabfsadm, exaadm
-        AuthorizedKeys = {{authorized_keys}}
+        AuthorizedKeys = {{ authorized_keys }}
     [[exadefusr]]
         ID = 500
         Group = exausers
@@ -69,7 +69,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     UUID = A5F8F92113A34BA4B0A48D5397423BBA5CF95161
@@ -118,7 +118,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.0.12/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.0.12/EXAConf
index 6d90b2229..5634bf01b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.0.12/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.0.12/EXAConf
@@ -61,7 +61,7 @@
         Group = root
         LoginEnabled = True
         AdditionalGroups = exausers, exadbadm, exastoradm, exabfsadm, exaadm
-        AuthorizedKeys = {{authorized_keys}}
+        AuthorizedKeys = {{ authorized_keys }}
     [[exadefusr]]
         ID = 500
         Group = exausers
@@ -69,7 +69,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     UUID = A5F8F92113A34BA4B0A48D5397423BBA5CF95161
@@ -118,7 +118,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.0.13/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.0.13/EXAConf
index 6d90b2229..5634bf01b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.0.13/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.0.13/EXAConf
@@ -61,7 +61,7 @@
         Group = root
         LoginEnabled = True
         AdditionalGroups = exausers, exadbadm, exastoradm, exabfsadm, exaadm
-        AuthorizedKeys = {{authorized_keys}}
+        AuthorizedKeys = {{ authorized_keys }}
     [[exadefusr]]
         ID = 500
         Group = exausers
@@ -69,7 +69,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     UUID = A5F8F92113A34BA4B0A48D5397423BBA5CF95161
@@ -118,7 +118,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.0.14/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.0.14/EXAConf
index 6d90b2229..5634bf01b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.0.14/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.0.14/EXAConf
@@ -61,7 +61,7 @@
         Group = root
         LoginEnabled = True
         AdditionalGroups = exausers, exadbadm, exastoradm, exabfsadm, exaadm
-        AuthorizedKeys = {{authorized_keys}}
+        AuthorizedKeys = {{ authorized_keys }}
     [[exadefusr]]
         ID = 500
         Group = exausers
@@ -69,7 +69,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     UUID = A5F8F92113A34BA4B0A48D5397423BBA5CF95161
@@ -118,7 +118,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.0.15/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.0.15/EXAConf
index 6d90b2229..5634bf01b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.0.15/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.0.15/EXAConf
@@ -61,7 +61,7 @@
         Group = root
         LoginEnabled = True
         AdditionalGroups = exausers, exadbadm, exastoradm, exabfsadm, exaadm
-        AuthorizedKeys = {{authorized_keys}}
+        AuthorizedKeys = {{ authorized_keys }}
     [[exadefusr]]
         ID = 500
         Group = exausers
@@ -69,7 +69,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     UUID = A5F8F92113A34BA4B0A48D5397423BBA5CF95161
@@ -118,7 +118,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.0.16/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.0.16/EXAConf
index 6d90b2229..5634bf01b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.0.16/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.0.16/EXAConf
@@ -61,7 +61,7 @@
         Group = root
         LoginEnabled = True
         AdditionalGroups = exausers, exadbadm, exastoradm, exabfsadm, exaadm
-        AuthorizedKeys = {{authorized_keys}}
+        AuthorizedKeys = {{ authorized_keys }}
     [[exadefusr]]
         ID = 500
         Group = exausers
@@ -69,7 +69,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     UUID = A5F8F92113A34BA4B0A48D5397423BBA5CF95161
@@ -118,7 +118,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.0.17/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.0.17/EXAConf
index 6d90b2229..5634bf01b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.0.17/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.0.17/EXAConf
@@ -61,7 +61,7 @@
         Group = root
         LoginEnabled = True
         AdditionalGroups = exausers, exadbadm, exastoradm, exabfsadm, exaadm
-        AuthorizedKeys = {{authorized_keys}}
+        AuthorizedKeys = {{ authorized_keys }}
     [[exadefusr]]
         ID = 500
         Group = exausers
@@ -69,7 +69,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     UUID = A5F8F92113A34BA4B0A48D5397423BBA5CF95161
@@ -118,7 +118,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.0.18/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.0.18/EXAConf
index 6d90b2229..5634bf01b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.0.18/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.0.18/EXAConf
@@ -61,7 +61,7 @@
         Group = root
         LoginEnabled = True
         AdditionalGroups = exausers, exadbadm, exastoradm, exabfsadm, exaadm
-        AuthorizedKeys = {{authorized_keys}}
+        AuthorizedKeys = {{ authorized_keys }}
     [[exadefusr]]
         ID = 500
         Group = exausers
@@ -69,7 +69,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     UUID = A5F8F92113A34BA4B0A48D5397423BBA5CF95161
@@ -118,7 +118,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.0.19/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.0.19/EXAConf
index 6d90b2229..5634bf01b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.0.19/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.0.19/EXAConf
@@ -61,7 +61,7 @@
         Group = root
         LoginEnabled = True
         AdditionalGroups = exausers, exadbadm, exastoradm, exabfsadm, exaadm
-        AuthorizedKeys = {{authorized_keys}}
+        AuthorizedKeys = {{ authorized_keys }}
     [[exadefusr]]
         ID = 500
         Group = exausers
@@ -69,7 +69,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     UUID = A5F8F92113A34BA4B0A48D5397423BBA5CF95161
@@ -118,7 +118,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.0.2/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.0.2/EXAConf
index 6d90b2229..5634bf01b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.0.2/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.0.2/EXAConf
@@ -61,7 +61,7 @@
         Group = root
         LoginEnabled = True
         AdditionalGroups = exausers, exadbadm, exastoradm, exabfsadm, exaadm
-        AuthorizedKeys = {{authorized_keys}}
+        AuthorizedKeys = {{ authorized_keys }}
     [[exadefusr]]
         ID = 500
         Group = exausers
@@ -69,7 +69,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     UUID = A5F8F92113A34BA4B0A48D5397423BBA5CF95161
@@ -118,7 +118,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.0.20/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.0.20/EXAConf
index 6d90b2229..5634bf01b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.0.20/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.0.20/EXAConf
@@ -61,7 +61,7 @@
         Group = root
         LoginEnabled = True
         AdditionalGroups = exausers, exadbadm, exastoradm, exabfsadm, exaadm
-        AuthorizedKeys = {{authorized_keys}}
+        AuthorizedKeys = {{ authorized_keys }}
     [[exadefusr]]
         ID = 500
         Group = exausers
@@ -69,7 +69,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     UUID = A5F8F92113A34BA4B0A48D5397423BBA5CF95161
@@ -118,7 +118,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.0.3/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.0.3/EXAConf
index 6d90b2229..5634bf01b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.0.3/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.0.3/EXAConf
@@ -61,7 +61,7 @@
         Group = root
         LoginEnabled = True
         AdditionalGroups = exausers, exadbadm, exastoradm, exabfsadm, exaadm
-        AuthorizedKeys = {{authorized_keys}}
+        AuthorizedKeys = {{ authorized_keys }}
     [[exadefusr]]
         ID = 500
         Group = exausers
@@ -69,7 +69,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     UUID = A5F8F92113A34BA4B0A48D5397423BBA5CF95161
@@ -118,7 +118,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.0.4/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.0.4/EXAConf
index 6d90b2229..5634bf01b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.0.4/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.0.4/EXAConf
@@ -61,7 +61,7 @@
         Group = root
         LoginEnabled = True
         AdditionalGroups = exausers, exadbadm, exastoradm, exabfsadm, exaadm
-        AuthorizedKeys = {{authorized_keys}}
+        AuthorizedKeys = {{ authorized_keys }}
     [[exadefusr]]
         ID = 500
         Group = exausers
@@ -69,7 +69,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     UUID = A5F8F92113A34BA4B0A48D5397423BBA5CF95161
@@ -118,7 +118,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.0.6/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.0.6/EXAConf
index 6d90b2229..5634bf01b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.0.6/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.0.6/EXAConf
@@ -61,7 +61,7 @@
         Group = root
         LoginEnabled = True
         AdditionalGroups = exausers, exadbadm, exastoradm, exabfsadm, exaadm
-        AuthorizedKeys = {{authorized_keys}}
+        AuthorizedKeys = {{ authorized_keys }}
     [[exadefusr]]
         ID = 500
         Group = exausers
@@ -69,7 +69,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     UUID = A5F8F92113A34BA4B0A48D5397423BBA5CF95161
@@ -118,7 +118,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.0.7/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.0.7/EXAConf
index 6d90b2229..5634bf01b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.0.7/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.0.7/EXAConf
@@ -61,7 +61,7 @@
         Group = root
         LoginEnabled = True
         AdditionalGroups = exausers, exadbadm, exastoradm, exabfsadm, exaadm
-        AuthorizedKeys = {{authorized_keys}}
+        AuthorizedKeys = {{ authorized_keys }}
     [[exadefusr]]
         ID = 500
         Group = exausers
@@ -69,7 +69,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     UUID = A5F8F92113A34BA4B0A48D5397423BBA5CF95161
@@ -118,7 +118,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.0.8/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.0.8/EXAConf
index 6d90b2229..5634bf01b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.0.8/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.0.8/EXAConf
@@ -61,7 +61,7 @@
         Group = root
         LoginEnabled = True
         AdditionalGroups = exausers, exadbadm, exastoradm, exabfsadm, exaadm
-        AuthorizedKeys = {{authorized_keys}}
+        AuthorizedKeys = {{ authorized_keys }}
     [[exadefusr]]
         ID = 500
         Group = exausers
@@ -69,7 +69,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     UUID = A5F8F92113A34BA4B0A48D5397423BBA5CF95161
@@ -118,7 +118,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.0.9/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.0.9/EXAConf
index 6d90b2229..5634bf01b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.0.9/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.0.9/EXAConf
@@ -61,7 +61,7 @@
         Group = root
         LoginEnabled = True
         AdditionalGroups = exausers, exadbadm, exastoradm, exabfsadm, exaadm
-        AuthorizedKeys = {{authorized_keys}}
+        AuthorizedKeys = {{ authorized_keys }}
     [[exadefusr]]
         ID = 500
         Group = exausers
@@ -69,7 +69,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     UUID = A5F8F92113A34BA4B0A48D5397423BBA5CF95161
@@ -118,7 +118,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.1.0/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.1.0/EXAConf
index 922af353f..0193d203b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.1.0/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.1.0/EXAConf
@@ -81,7 +81,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     # Affinity decides how this node is used in the cluster. i.e, the possibility to become master
@@ -132,7 +132,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.1.1/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.1.1/EXAConf
index 922af353f..0193d203b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.1.1/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.1.1/EXAConf
@@ -81,7 +81,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     # Affinity decides how this node is used in the cluster. i.e, the possibility to become master
@@ -132,7 +132,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.1.10/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.1.10/EXAConf
index 922af353f..0193d203b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.1.10/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.1.10/EXAConf
@@ -81,7 +81,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     # Affinity decides how this node is used in the cluster. i.e, the possibility to become master
@@ -132,7 +132,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.1.11/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.1.11/EXAConf
index 922af353f..0193d203b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.1.11/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.1.11/EXAConf
@@ -81,7 +81,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     # Affinity decides how this node is used in the cluster. i.e, the possibility to become master
@@ -132,7 +132,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.1.12/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.1.12/EXAConf
index 922af353f..0193d203b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.1.12/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.1.12/EXAConf
@@ -81,7 +81,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     # Affinity decides how this node is used in the cluster. i.e, the possibility to become master
@@ -132,7 +132,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.1.13/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.1.13/EXAConf
index 922af353f..0193d203b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.1.13/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.1.13/EXAConf
@@ -81,7 +81,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     # Affinity decides how this node is used in the cluster. i.e, the possibility to become master
@@ -132,7 +132,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.1.14/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.1.14/EXAConf
index 922af353f..0193d203b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.1.14/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.1.14/EXAConf
@@ -81,7 +81,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     # Affinity decides how this node is used in the cluster. i.e, the possibility to become master
@@ -132,7 +132,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.1.15/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.1.15/EXAConf
index 922af353f..0193d203b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.1.15/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.1.15/EXAConf
@@ -81,7 +81,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     # Affinity decides how this node is used in the cluster. i.e, the possibility to become master
@@ -132,7 +132,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.1.16/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.1.16/EXAConf
index 922af353f..0193d203b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.1.16/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.1.16/EXAConf
@@ -81,7 +81,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     # Affinity decides how this node is used in the cluster. i.e, the possibility to become master
@@ -132,7 +132,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.1.17/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.1.17/EXAConf
index 922af353f..0193d203b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.1.17/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.1.17/EXAConf
@@ -81,7 +81,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     # Affinity decides how this node is used in the cluster. i.e, the possibility to become master
@@ -132,7 +132,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.1.2/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.1.2/EXAConf
index 922af353f..0193d203b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.1.2/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.1.2/EXAConf
@@ -81,7 +81,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     # Affinity decides how this node is used in the cluster. i.e, the possibility to become master
@@ -132,7 +132,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.1.3/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.1.3/EXAConf
index 922af353f..0193d203b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.1.3/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.1.3/EXAConf
@@ -81,7 +81,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     # Affinity decides how this node is used in the cluster. i.e, the possibility to become master
@@ -132,7 +132,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.1.4/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.1.4/EXAConf
index 922af353f..0193d203b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.1.4/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.1.4/EXAConf
@@ -81,7 +81,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     # Affinity decides how this node is used in the cluster. i.e, the possibility to become master
@@ -132,7 +132,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.1.5/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.1.5/EXAConf
index 922af353f..0193d203b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.1.5/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.1.5/EXAConf
@@ -81,7 +81,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     # Affinity decides how this node is used in the cluster. i.e, the possibility to become master
@@ -132,7 +132,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.1.6/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.1.6/EXAConf
index 922af353f..0193d203b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.1.6/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.1.6/EXAConf
@@ -81,7 +81,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     # Affinity decides how this node is used in the cluster. i.e, the possibility to become master
@@ -132,7 +132,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.1.7/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.1.7/EXAConf
index 922af353f..0193d203b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.1.7/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.1.7/EXAConf
@@ -81,7 +81,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     # Affinity decides how this node is used in the cluster. i.e, the possibility to become master
@@ -132,7 +132,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.1.8/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.1.8/EXAConf
index 922af353f..0193d203b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.1.8/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.1.8/EXAConf
@@ -81,7 +81,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     # Affinity decides how this node is used in the cluster. i.e, the possibility to become master
@@ -132,7 +132,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/7.1.9/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/7.1.9/EXAConf
index 922af353f..0193d203b 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/7.1.9/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/7.1.9/EXAConf
@@ -81,7 +81,7 @@
         AdditionalGroups = exadbadm, exastoradm, exabfsadm, exaadm
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     # Affinity decides how this node is used in the cluster. i.e, the possibility to become master
@@ -132,7 +132,7 @@
 # An EXASOL database
 [DB : DB1]
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/docker_db_config/8.17.0/EXAConf b/exasol_integration_test_docker_environment/docker_db_config/8.17.0/EXAConf
index b268445ff..d775c3bd4 100644
--- a/exasol_integration_test_docker_environment/docker_db_config/8.17.0/EXAConf
+++ b/exasol_integration_test_docker_environment/docker_db_config/8.17.0/EXAConf
@@ -84,7 +84,7 @@
         Group = root
         LoginEnabled = True
         AdditionalGroups = exausers, exaadm, exadbadm, exastoradm, exabfsadm, exasaasadm
-        AuthorizedKeys = {{authorized_keys}}
+        AuthorizedKeys = {{ authorized_keys }}
     [[exadefusr]]
         ID = 500
         Group = exausers
@@ -97,7 +97,7 @@
         AdditionalGroups = exasaasadm,
 
 [Node : 11]
-    PrivateNet = {{private_network}}
+    PrivateNet = {{ private_network }}
     PublicNet =
     Name = n11
     # Affinity decides how this node is used in the cluster. i.e, the possibility to become master
@@ -156,7 +156,7 @@
     # Unique id of this database.
     ID = aCbUZhU3R8eEc0UIDS7wQw
     # Version nr. of this database.
-    Version = {{db_version}}
+    Version = {{ db_version }}
     # Memory size over all nodes (e. g. '1 TiB').
     MemSize = {{ mem_size }}
     Port = 8888
diff --git a/exasol_integration_test_docker_environment/lib/data/database_info.py b/exasol_integration_test_docker_environment/lib/data/database_info.py
index 36425dc05..47c9f0d0e 100644
--- a/exasol_integration_test_docker_environment/lib/data/database_info.py
+++ b/exasol_integration_test_docker_environment/lib/data/database_info.py
@@ -1,15 +1,20 @@
 from exasol_integration_test_docker_environment.lib.base.info import Info
 from exasol_integration_test_docker_environment.lib.data.container_info import ContainerInfo
 from exasol_integration_test_docker_environment.lib.test_environment.ports import Ports
+from exasol_integration_test_docker_environment.lib.data.ssh_info import SshInfo
 
 
-# Replacing former separate parameters bucketfs_port_forward and
-# database_port_forward by a single parameter named ports is a breaking change
-# in the API.
 class DatabaseInfo(Info):
-    def __init__(self, host: str, ports: Ports,
-                 reused: bool, container_info: ContainerInfo = None):
+    def __init__(
+            self,
+            host: str,
+            ports: Ports,
+            reused: bool,
+            container_info: ContainerInfo = None,
+            ssh_info: SshInfo = None,
+    ):
         self.container_info = container_info
         self.ports = ports
         self.host = host
         self.reused = reused
+        self.ssh_info = ssh_info
diff --git a/exasol_integration_test_docker_environment/lib/data/ssh_info.py b/exasol_integration_test_docker_environment/lib/data/ssh_info.py
new file mode 100644
index 000000000..5786c9c31
--- /dev/null
+++ b/exasol_integration_test_docker_environment/lib/data/ssh_info.py
@@ -0,0 +1,8 @@
+class SshInfo:
+    """
+    key_file contains path to the file containing the private key for SSH access.
+    """
+    def __init__(self, user: str, port: int, key_file: str):
+        self.user = user
+        self.port = port
+        self.key_file = key_file
diff --git a/exasol_integration_test_docker_environment/lib/test_environment/ports.py b/exasol_integration_test_docker_environment/lib/test_environment/ports.py
index f584ba1f5..ed1547083 100644
--- a/exasol_integration_test_docker_environment/lib/test_environment/ports.py
+++ b/exasol_integration_test_docker_environment/lib/test_environment/ports.py
@@ -33,6 +33,7 @@ class PortsType(type):
     - docker
     - forward
     """
+
     @property
     def default_ports(self) -> 'Ports':
         return Ports(database=8888, bucketfs=6583, ssh=22)
diff --git a/exasol_integration_test_docker_environment/lib/test_environment/spawn_test_database.py b/exasol_integration_test_docker_environment/lib/test_environment/spawn_test_database.py
index 75237f2d6..844ebd32a 100644
--- a/exasol_integration_test_docker_environment/lib/test_environment/spawn_test_database.py
+++ b/exasol_integration_test_docker_environment/lib/test_environment/spawn_test_database.py
@@ -21,6 +21,7 @@
 from exasol_integration_test_docker_environment.lib.docker.images.create.utils.pull_log_handler import PullLogHandler
 from exasol_integration_test_docker_environment.lib.docker.images.image_info import ImageInfo
 from exasol_integration_test_docker_environment.lib.test_environment.db_version import DbVersion
+from exasol_integration_test_docker_environment.lib.data.ssh_info import SshInfo
 from exasol_integration_test_docker_environment.lib.test_environment.ports import (
     find_free_ports,
     Ports,
@@ -51,6 +52,8 @@ class SpawnTestDockerDatabase(DockerBaseTask, DockerDBTestEnvironmentParameter):
     docker_runtime = luigi.OptionalParameter(None, significant=False)  # type: str
     certificate_volume_name = luigi.OptionalParameter(None, significant=False)
     additional_db_parameter = luigi.ListParameter()
+    ssh_user = luigi.Parameter("root")
+    ssh_key_file = luigi.OptionalParameter(None, significant=False)
 
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
@@ -77,6 +80,7 @@ def _try_to_reuse_database(self, db_ip_address: str) -> DatabaseInfo:
         self.logger.info("Try to reuse database container %s",
                          self.db_container_name)
         database_info = None
+        ssh_key = self._get_ssh_key()
         try:
             database_info = self._create_database_info(db_ip_address=db_ip_address, reused=True)
         except Exception as e:
@@ -84,6 +88,12 @@ def _try_to_reuse_database(self, db_ip_address: str) -> DatabaseInfo:
                                 "Fallback to create new database.", self.db_container_name, e)
         return database_info
 
+    def _get_ssh_key(self) -> SshKey:
+        if self.ssh_key_file:
+            return SshKey.read_from(self.ssh_key_file)
+        self.ssh_key_file = SshKeyCache().private_key
+        return SshKey.from_cache()
+
     def _handle_output(self, output_generator, image_info: ImageInfo):
         log_file_path = self.get_log_path().joinpath("pull_docker_db_image.log")
         with PullLogHandler(log_file_path, self.logger, image_info) as log_handler:
@@ -120,13 +130,13 @@ def _port_mappings(self):
         return result
 
     def _create_database_container(self, db_ip_address: str, db_private_network: str):
-        def get_authorized_keys() -> str:
+        def get_authorized_keys(ssh_key) -> str:
             """
             Multiple authorized_keys can be comma-separated.
             """
             if self.db_os_access != DbOsAccess.SSH:
                 return ""
-            return SshKey.from_cache().public_key_as_string("itde-ssh-access")
+            return ssh_key.public_key_as_string("itde-ssh-access")
 
         def enable_ssh_access(container: Container, authorized_keys: str):
             copy = DockerContainerCopy(container)
@@ -134,7 +144,8 @@ def enable_ssh_access(container: Container, authorized_keys: str):
             copy.copy("/root/")
 
         self.logger.info("Starting database container %s", self.db_container_name)
-        authorized_keys = get_authorized_keys()
+        ssh_key = self._get_ssh_key()
+        authorized_keys = get_authorized_keys(ssh_key)
         with self._get_docker_client() as docker_client:
             try:
                 docker_client.containers.get(self.db_container_name).remove(force=True, v=True)
@@ -182,11 +193,13 @@ def _create_database_info(self, db_ip_address: str, reused: bool) -> DatabaseInf
                 network_info=self.network_info,
                 volume_name=self._get_db_volume_name(),
             )
+            ssh_info = SshInfo(self.ssh_user, self.ssh_port_forward, self.ssh_key_file)
             database_info = DatabaseInfo(
                 host=db_ip_address,
                 ports=Ports.default_ports,
                 reused=reused,
                 container_info=container_info,
+                ssh_info=ssh_info,
             )
             return database_info
 
diff --git a/test/integration/test_ssh_access.py b/test/integration/test_ssh_access.py
index e0f6cb379..264ddc497 100644
--- a/test/integration/test_ssh_access.py
+++ b/test/integration/test_ssh_access.py
@@ -1,10 +1,8 @@
-import contextlib
 import fabric
 import io
 import os
 import pytest
 
-from exasol_integration_test_docker_environment.lib.docker import ContextDockerClient
 from exasol_integration_test_docker_environment.lib.base.ssh_access import SshKey, SshKeyCache
 from test.integration.helpers import container_named