[libvirt] [PATCH sandbox v5 20/20] Image: Add Volume Support

Daniel P. Berrange berrange at redhat.com
Tue Sep 8 16:29:51 UTC 2015


From: Eren Yagdiran <erenyagdiran at gmail.com>

Volumes let user to map host-paths into sandbox. Docker containers
need volumes for data persistence.

Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
---
 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




More information about the libvir-list mailing list