[Fuego] [PATCH 02/11] Mount fuego-rw/ro/core into the fuego-under-test container
Guilherme Campos Camargo
guicc at profusion.mobi
Wed Mar 7 19:54:50 UTC 2018
This patch implements the necessary logic for mounting fuego-rw,
fuego-ro and fuego-core into fuego.
Given that the dockerd socket is shared between the host and the fuego
container, the mountpoints that are passed to the `docker create` call
need to be provided as full paths relative to the *host* (and not
relative to fuego, as would be expected if the docker daemons were
independent)
Signed-off-by: Guilherme Campos Camargo <guicc at profusion.mobi>
---
engine/tests/Functional.fuegotest/test_run.py | 63 +++++++++++++++++++++++++++
1 file changed, 63 insertions(+)
diff --git a/engine/tests/Functional.fuegotest/test_run.py b/engine/tests/Functional.fuegotest/test_run.py
index 96fcfb7..7eae056 100755
--- a/engine/tests/Functional.fuegotest/test_run.py
+++ b/engine/tests/Functional.fuegotest/test_run.py
@@ -173,12 +173,43 @@ class FuegoContainer:
self.container = None
def setup_docker(self):
+ def this_container_id():
+ with open('/proc/self/cgroup', 'rt') as f:
+ f_text = f.read()
+
+ if 'docker' not in f_text:
+ return None
+
+ for c in self.docker_client.containers(quiet=True):
+ if c['Id'] in f_text:
+ return c['Id']
+
+ return None
+
+ def map_to_host(mounts, container_id):
+ host_mounts = self.docker_client.\
+ inspect_container(container_id)['Mounts']
+
+ for mount in mounts:
+ LOGGER.debug(' Trying to find %s mountpoint in the host', mount['source'])
+ for host_mount in host_mounts:
+ if mount['source'].startswith(host_mount['Destination']):
+ mount['source'] = mount['source'].\
+ replace(host_mount['Destination'],
+ host_mount['Source'], 1)
+ LOGGER.debug(' Found: %s', mount['source'])
+ break
+ else:
+ LOGGER.debug(' Not Found')
+ mount['source'] = None
+
cmd = './{} {}'.format(self.install_script, self.image_name)
LOGGER.debug('Running \'%s\' to install the docker image. '
'This may take a while....', cmd)
status = subprocess.call(cmd, shell=True)
if status != 0:
return None
+
docker_client = docker.from_env()
containers = docker_client.containers.list(
all=True, filters={'name': self.container_name})
@@ -188,10 +219,42 @@ class FuegoContainer:
self.container_name)
containers[0].remove(force=True)
+ mounts = [
+ {'source': os.path.abspath('./fuego-rw'),
+ 'destination': '/fuego-rw',
+ 'readonly': False,
+ },
+ {'source': os.path.abspath('./fuego-ro'),
+ 'destination': '/fuego-ro',
+ 'readonly': True,
+ },
+ {'source': os.path.abspath('../fuego-core'),
+ 'destination': '/fuego-core',
+ 'readonly': True,
+ },
+ ]
+
+ our_id = this_container_id()
+
+ if our_id:
+ LOGGER.debug('Running inside the Docker container %s', our_id)
+ map_to_host(mounts, our_id)
+ else:
+ LOGGER.debug('Not running inside a Docker container')
+
+ LOGGER.debug('Creating container with the following mountpoints:')
+ LOGGER.debug(' %s', mounts)
+
container = docker_client.containers.create(
self.image_name,
stdin_open=True, tty=True, network_mode='bridge',
+ mounts=[docker.types.Mount(m['destination'],
+ m['source'],
+ type='bind',
+ read_only=m['readonly'])
+ for m in mounts],
name=self.container_name, command='/bin/bash')
+
LOGGER.debug('Container \'%s\' created', self.container_name)
return container
--
2.16.2
More information about the Fuego
mailing list