[libvirt] [sandbox PATCH v3 16/22] Image: Add Volume Support

Cedric Bosdonnat cbosdonnat at suse.com
Tue Aug 18 09:43:38 UTC 2015


On Tue, 2015-08-18 at 06:53 +0000, Eren Yagdiran wrote:
> Volumes let user to map host-paths into guest. Docker containers need volumes because its
> filesystem read-only by default.

Please reword that wrong commit message... docker file system isn't
read-only by default.

--
Cedric

> ---
>  virt-sandbox-image/sources/DockerSource.py | 12 ++++++++++++
>  virt-sandbox-image/sources/Source.py       |  4 ++++
>  virt-sandbox-image/virt-sandbox-image.py   | 22 ++++++++++++++++++++++
>  3 files changed, 38 insertions(+)
> 
> diff --git a/virt-sandbox-image/sources/DockerSource.py b/virt-sandbox-image/sources/DockerSource.py
> index 1e7f633..67bcf6b 100644
> --- a/virt-sandbox-image/sources/DockerSource.py
> +++ b/virt-sandbox-image/sources/DockerSource.py
> @@ -30,6 +30,7 @@ import subprocess
>  import shutil
>  import random
>  import string
> +import collections
>  
>  class DockerConfParser():
>  
> @@ -39,6 +40,13 @@ class DockerConfParser():
>      def getRunCommand(self):
>          cmd = self.json_data['container_config']['Cmd'][2]
>          return cmd[cmd.index('"') + 1:cmd.rindex('"')]
> +    def getVolumes(self):
> +        volumes = self.json_data['container_config']['Volumes']
> +        volumelist = []
> +        if isinstance(volumes,collections.Iterable):
> +          for key,value in volumes.iteritems():
> +            volumelist.append(key)
> +        return volumelist
>  
>  class DockerSource(Source):
>  
> @@ -395,5 +403,9 @@ class DockerSource(Source):
>          commandToRun = configParser.getRunCommand()
>          return commandToRun
>  
> +    def get_volume(self,configfile):
> +        configParser = DockerConfParser(configfile)
> +        return configParser.getVolumes()
> +
>  def debug(msg):
>      sys.stderr.write(msg)
> diff --git a/virt-sandbox-image/sources/Source.py b/virt-sandbox-image/sources/Source.py
> index 9a3da59..8cc508e 100644
> --- a/virt-sandbox-image/sources/Source.py
> +++ b/virt-sandbox-image/sources/Source.py
> @@ -45,3 +45,7 @@ class Source():
>      @abstractmethod
>      def get_disk(self,**args):
>        pass
> +
> +    @abstractmethod
> +    def get_volume(self,**args):
> +      pass
> diff --git a/virt-sandbox-image/virt-sandbox-image.py b/virt-sandbox-image/virt-sandbox-image.py
> index 3ce3a8b..e554d8a 100755
> --- a/virt-sandbox-image/virt-sandbox-image.py
> +++ b/virt-sandbox-image/virt-sandbox-image.py
> @@ -130,6 +130,7 @@ def check_connect(connectstr):
>  
>  def run(args):
>      try:
> +        global storage_dir
>          if args.connect is not None:
>              check_connect(args.connect)
>          source = dynamic_source_loader(args.source)
> @@ -148,6 +149,25 @@ def run(args):
>          if networkArgs is not None:
>              params.append('-N')
>              params.append(networkArgs)
> +        allVolumes = source.get_volume(configfile)
> +        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 = storage_dir + guestPath
> +                if not os.path.exists(hostPath):
> +                    os.makedirs(hostPath)
> +            else:
> +                pass
> +            params.append("--mount")
> +            params.append("host-bind:%s=%s" %(guestPath,hostPath))
>          params.append('--')
>          params.append(commandToRun)
>          cmd = cmd + params
> @@ -225,6 +245,8 @@ def gen_run_args(subparser):
>                          help=_("Igniter command for image"))
>      parser.add_argument("-n","--network",
>                          help=_("Network params for running template"))
> +    parser.add_argument("-v","--volume",action="append",
> +                        help=_("Volume params for running template"))
>      parser.set_defaults(func=run)
>  
>  if __name__ == '__main__':





More information about the libvir-list mailing list