Provide a factory providing gerrit container

So far the provisioning of a gerrit container with a factory was
only performed in the gerrit-slave container tests. Such a
container will also be needed to test the functionality of the
gerrit-init container.

This change moves the factory for a gerrit container out of the
gerrit-slave container tests to the conftests.py file for
container-image tests. Thereby, the factory is available for all
container-image tests.

Change-Id: Ica537347bef3ba72f0de408a81c5c226aaaee14d
diff --git a/tests/container-images/conftest.py b/tests/container-images/conftest.py
index 3feb67f..66892fa 100644
--- a/tests/container-images/conftest.py
+++ b/tests/container-images/conftest.py
@@ -12,6 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+import os.path
 import time
 
 from sqlalchemy import create_engine
@@ -74,3 +75,66 @@
     return MySQLContainer(docker_client, docker_network, host, port, root_pwd)
 
   return get_mysql_container
+
+class GerritContainer():
+
+  def __init__(self, docker_client, docker_network, tmp_dir, image,
+               configs, port):
+    self.docker_client = docker_client
+    self.docker_network = docker_network
+    self.tmp_dir = tmp_dir
+    self.image = image
+    self.configs = configs
+    self.port = port
+
+    self.gerrit_container = None
+
+    self._start_gerrit_container()
+
+  def _create_config_files(self):
+    tmp_config_dir = os.path.join(self.tmp_dir, "configs")
+    if not os.path.isdir(tmp_config_dir):
+      os.mkdir(tmp_config_dir)
+    config_paths = {}
+    for filename, content in self.configs.items():
+      gerrit_config_file = os.path.join(tmp_config_dir, filename)
+      with open(gerrit_config_file, "w") as config_file:
+        config_file.write(content)
+      config_paths[filename] = gerrit_config_file
+    return config_paths
+
+  def _define_volume_mounts(self):
+    volumes = {v: {
+      "bind": "/var/config/%s" % k,
+      "mode": "rw"
+    } for (k, v) in self._create_config_files().items()}
+    volumes[os.path.join(self.tmp_dir, "lib")] = {
+      "bind": "/var/gerrit/lib",
+      "mode": "rw"
+    }
+    return volumes
+
+  def _start_gerrit_container(self):
+    self.gerrit_container = self.docker_client.containers.run(
+      image=self.image.id,
+      user="gerrit",
+      volumes=self._define_volume_mounts(),
+      ports={
+        str(self.port): str(self.port)
+      },
+      network=self.docker_network.name,
+      detach=True,
+      auto_remove=True
+    )
+
+  def stop_gerrit_container(self):
+    self.gerrit_container.stop(timeout=1)
+
+@pytest.fixture(scope="session")
+def gerrit_container_factory():
+  def get_gerrit_container(docker_client, docker_network, tmp_dir, image,
+                           gerrit_config, port):
+    return GerritContainer(docker_client, docker_network, tmp_dir, image,
+                           gerrit_config, port)
+
+  return get_gerrit_container
diff --git a/tests/container-images/gerrit-slave/test_container_integration_gerrit_slave.py b/tests/container-images/gerrit-slave/test_container_integration_gerrit_slave.py
index 386b190..743293e 100644
--- a/tests/container-images/gerrit-slave/test_container_integration_gerrit_slave.py
+++ b/tests/container-images/gerrit-slave/test_container_integration_gerrit_slave.py
@@ -28,86 +28,36 @@
 
 CONFIG_FILES = ["gerrit.config", "secure.config"]
 
-class GerritSlaveTestSetup():
-
-  def __init__(self, docker_client, docker_network, tmp_dir, image,
-               gerrit_config, port):
-    self.docker_client = docker_client
-    self.docker_network = docker_network
-    self.tmp_dir = tmp_dir
-    self.image = image
-    self.gerrit_config = gerrit_config
-    self.port = port
-
-    self.gerrit_container = None
-
-    self._start_gerrit_container()
-
-  def _create_config_files(self):
-    tmp_config_dir = os.path.join(self.tmp_dir, "configs")
-    if not os.path.isdir(tmp_config_dir):
-      os.mkdir(tmp_config_dir)
-    configs = {}
-    for config in CONFIG_FILES:
-      gerrit_config_file = os.path.join(tmp_config_dir, config)
-      with open(gerrit_config_file, "w") as config_file:
-        config_file.write(self.gerrit_config)
-      configs[config] = gerrit_config_file
-    return configs
-
-  def _define_volume_mounts(self):
-    volumes = {v: {
-      "bind": "/var/config/%s" % k,
-      "mode": "rw"
-    } for (k, v) in self._create_config_files().items()}
-    volumes[os.path.join(self.tmp_dir, "lib")] = {
-      "bind": "/var/gerrit/lib",
-      "mode": "rw"
-    }
-    return volumes
-
-  def _start_gerrit_container(self):
-    self.gerrit_container = self.docker_client.containers.run(
-      image=self.image.id,
-      user="gerrit",
-      volumes=self._define_volume_mounts(),
-      ports={
-        str(self.port): str(self.port)
-      },
-      network=self.docker_network.name,
-      detach=True,
-      auto_remove=True
-    )
-
-  def stop_gerrit_container(self):
-    self.gerrit_container.stop(timeout=1)
-
-
 @pytest.fixture(scope="module")
 def tmp_dir(tmp_path_factory):
   return tmp_path_factory.mktemp("gerrit-slave-test")
 
 @pytest.fixture(scope="class")
 def container_run_h2(request, docker_client, docker_network, tmp_dir,
-                     gerrit_slave_image):
-  config = """
-    [gerrit]
-      basePath = git
+                     gerrit_slave_image, gerrit_container_factory):
+  configs = {
+    "gerrit.config": """
+      [gerrit]
+        basePath = git
 
-    [database]
-      type = H2
+      [database]
+        type = H2
 
-    [httpd]
-      listenUrl = http://*:8081
+      [httpd]
+        listenUrl = http://*:8081
 
-    [container]
-      slave = true
+      [container]
+        slave = true
 
-    [test]
-      success = True
-    """
-  test_setup = GerritSlaveTestSetup(
-    docker_client, docker_network, tmp_dir, gerrit_slave_image, config, 8081)
+      [test]
+        success = True
+      """,
+    "secure.config": """
+      [test]
+          success = True
+      """}
+  test_setup = gerrit_container_factory(
+    docker_client, docker_network, tmp_dir, gerrit_slave_image, configs, 8081)
 
   request.addfinalizer(test_setup.stop_gerrit_container)
 
@@ -115,22 +65,23 @@
 
 @pytest.fixture(scope="class")
 def container_run_mysql(request, docker_client, docker_network, tmp_dir,
-                        gerrit_slave_image):
-  config = """
-    [gerrit]
-      basePath = git
+                        gerrit_slave_image, gerrit_container_factory):
+  configs = {
+    "gerrit.config": """
+      [gerrit]
+        basePath = git
 
-    [database]
-      type = MySQL
+      [database]
+        type = MySQL
 
-    [httpd]
-      listenUrl = http://*:8082
+      [httpd]
+        listenUrl = http://*:8082
 
-    [container]
-      slave = true
-    """
-  test_setup = GerritSlaveTestSetup(
-    docker_client, docker_network, tmp_dir, gerrit_slave_image, config, 8082)
+      [container]
+        slave = true
+      """}
+  test_setup = gerrit_container_factory(
+    docker_client, docker_network, tmp_dir, gerrit_slave_image, configs, 8082)
 
   request.addfinalizer(test_setup.stop_gerrit_container)