From: Eren Yagdiran <erenyagdiran@xxxxxxxxx> Volumes let user to map host-paths into sandbox. Docker containers need volumes for data persistence. Signed-off-by: Daniel P. Berrange <berrange@xxxxxxxxxx> --- libvirt-sandbox/image/cli.py | 24 +++++++++++++++++++++++- libvirt-sandbox/image/sources/DockerSource.py | 13 +++++++++++++ libvirt-sandbox/image/sources/Source.py | 10 ++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/libvirt-sandbox/image/cli.py b/libvirt-sandbox/image/cli.py index c17b577..3f1ab0d 100755 --- a/libvirt-sandbox/image/cli.py +++ b/libvirt-sandbox/image/cli.py @@ -101,6 +101,7 @@ def create(args): def run(args): try: + global image_dir if args.connect is not None: check_connect(args.connect) source = dynamic_source_loader(args.source) @@ -142,6 +143,26 @@ def run(args): else: pass + allVolumes = source.get_volumes(args.template, args.template_dir) + volumeArgs = args.volume + if volumeArgs is not None: + allVolumes = allVolumes + volumeArgs + for volume in allVolumes: + volumeSplit = volume.split(":") + volumelen = len(volumeSplit) + if volumelen == 2: + hostPath = volumeSplit[0] + guestPath = volumeSplit[1] + elif volumelen == 1: + guestPath = volumeSplit[0] + hostPath = image_dir + guestPath + if not os.path.exists(hostPath): + os.makedirs(hostPath) + else: + pass + params.append("--mount") + params.append("host-bind:%s=%s" %(guestPath,hostPath)) + cmd = cmd + params + ['--'] + commandToRun subprocess.call(cmd) os.unlink(diskfile) @@ -237,7 +258,8 @@ def gen_run_args(subparser): help=_("Network params for running template")) parser.add_argument("-e","--env",action="append", help=_("Environment params for running template")) - + parser.add_argument("--volume",action="append", + help=_("Volume params for running template")) parser.set_defaults(func=run) def main(): diff --git a/libvirt-sandbox/image/sources/DockerSource.py b/libvirt-sandbox/image/sources/DockerSource.py index 4455198..2c358fe 100644 --- a/libvirt-sandbox/image/sources/DockerSource.py +++ b/libvirt-sandbox/image/sources/DockerSource.py @@ -28,6 +28,7 @@ import traceback import os import subprocess import shutil +import collections class DockerConfParser(): @@ -44,6 +45,13 @@ class DockerConfParser(): return lst else: return [] + def getVolumes(self): + volumes = self.json_data['config']['Volumes'] + volumelist = [] + if isinstance(volumes,collections.Iterable): + for key,value in volumes.iteritems(): + volumelist.append(key) + return volumelist class DockerSource(Source): @@ -399,5 +407,10 @@ class DockerSource(Source): configParser = DockerConfParser(configfile) return configParser.getEnvs() + def get_volumes(self, templatename, templatedir): + configfile, diskfile = self._get_template_data(templatename, templatedir) + configParser = DockerConfParser(configfile) + return configParser.getVolumes() + def debug(msg): sys.stderr.write(msg) diff --git a/libvirt-sandbox/image/sources/Source.py b/libvirt-sandbox/image/sources/Source.py index 8a21f90..f1dd3e7 100644 --- a/libvirt-sandbox/image/sources/Source.py +++ b/libvirt-sandbox/image/sources/Source.py @@ -105,3 +105,13 @@ class Source(): Get the dict of environment variables to set """ pass + + @abstractmethod + def get_volumes(self,templatename, templatedir): + """ + :param templatename: name of the template image to download + :param templatedir: local directory path in which to find template + + Get the list of volumes associated with the template + """ + pass -- 2.4.3 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list