[libvirt] [PATCH sandbox 1/1] Delete virt-sandbox-image tool now in separate repo
Cedric Bosdonnat
cbosdonnat at suse.com
Thu Apr 19 07:15:57 UTC 2018
On Wed, 2018-04-18 at 17:10 +0100, Daniel P. Berrangé wrote:
> The virt-sandbox-image tool and its supporting code has been split into
> a separate libvirt-sandbox-image GIT repository. This allows its build
> system and distribution to work in the normal python way, and have a
> release lifecycle independent of the main libvirt-sandbox package.
>
> https://libvirt.org/git/?p=libvirt-sandbox-image.git;a=summary
ACK
--
Cedric
> Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
> ---
> autobuild.sh | 3 +-
> bin/virt-sandbox-image | 8 -
> configure.ac | 4 -
> libvirt-sandbox.spec.in | 9 -
> libvirt-sandbox/image/Makefile.am | 10 -
> libvirt-sandbox/image/__init__.py | 0
> libvirt-sandbox/image/cli.py | 282 -----------
> libvirt-sandbox/image/sources/Makefile.am | 10 -
> libvirt-sandbox/image/sources/__init__.py | 0
> libvirt-sandbox/image/sources/base.py | 160 -------
> libvirt-sandbox/image/sources/docker.py | 690 ---------------------------
> libvirt-sandbox/image/sources/virtbuilder.py | 109 -----
> libvirt-sandbox/image/template.py | 133 ------
> m4/virt-win32.m4 | 5 -
> 14 files changed, 1 insertion(+), 1422 deletions(-)
> delete mode 100755 bin/virt-sandbox-image
> delete mode 100644 libvirt-sandbox/image/Makefile.am
> delete mode 100644 libvirt-sandbox/image/__init__.py
> delete mode 100644 libvirt-sandbox/image/cli.py
> delete mode 100644 libvirt-sandbox/image/sources/Makefile.am
> delete mode 100644 libvirt-sandbox/image/sources/__init__.py
> delete mode 100644 libvirt-sandbox/image/sources/base.py
> delete mode 100755 libvirt-sandbox/image/sources/docker.py
> delete mode 100755 libvirt-sandbox/image/sources/virtbuilder.py
> delete mode 100644 libvirt-sandbox/image/template.py
>
> diff --git a/autobuild.sh b/autobuild.sh
> index 9cd4ca2..c176fea 100755
> --- a/autobuild.sh
> +++ b/autobuild.sh
> @@ -54,8 +54,7 @@ if [ -x /usr/bin/i686-pc-mingw32-gcc ]; then
> ../configure \
> --build=$(uname -m)-pc-linux \
> --host=i686-pc-mingw32 \
> - --prefix="$AUTOBUILD_INSTALL_ROOT/i686-pc-mingw32/sys-root/mingw" \
> - --without-python
> + --prefix="$AUTOBUILD_INSTALL_ROOT/i686-pc-mingw32/sys-root/mingw"
>
> make
> make install
> diff --git a/bin/virt-sandbox-image b/bin/virt-sandbox-image
> deleted file mode 100755
> index 61346ef..0000000
> --- a/bin/virt-sandbox-image
> +++ /dev/null
> @@ -1,8 +0,0 @@
> -#!/usr/bin/env python3
> -# -*- coding: utf-8 -*-
> -
> -from libvirt_sandbox.image import cli
> -import sys
> -
> -if __name__ == '__main__':
> - sys.exit(cli.main())
> diff --git a/configure.ac b/configure.ac
> index 28305d2..19d4523 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -130,13 +130,9 @@ dnl Should be in m4/virt-gettext.m4 but intltoolize is too
> dnl dumb to find it there
> IT_PROG_INTLTOOL([0.35.0])
>
> -AM_PATH_PYTHON([3])
> -
> AC_OUTPUT(Makefile
> libvirt-sandbox/Makefile
> libvirt-sandbox/tests/Makefile
> - libvirt-sandbox/image/Makefile
> - libvirt-sandbox/image/sources/Makefile
> bin/Makefile
> examples/Makefile
> docs/Makefile
> diff --git a/libvirt-sandbox.spec.in b/libvirt-sandbox.spec.in
> index 125a361..0374d9e 100644
> --- a/libvirt-sandbox.spec.in
> +++ b/libvirt-sandbox.spec.in
> @@ -36,14 +36,7 @@ BuildRequires: zlib-devel >= 1.2.0, zlib-static
> BuildRequires: libtirpc-devel
> BuildRequires: rpcgen
> %endif
> -Requires: python3-rpm
> -# For virsh lxc-enter-namespace command
> -Requires: libvirt-client >= %{libvirt_version}
> -Requires: systemd >= 198
> -Requires: pygobject3-base
> -Requires: libselinux-python3
> Requires: %{name}-libs = %{version}-%{release}
> -Requires: %{_bindir}/virt-builder
>
> %package libs
> Group: Development/Libraries
> @@ -102,8 +95,6 @@ rm -rf $RPM_BUILD_ROOT
> %files
> %defattr(-,root,root,-)
> %{_bindir}/virt-sandbox
> -%{_bindir}/virt-sandbox-image
> -%{python3_sitelib}/libvirt_sandbox
> %{_mandir}/man1/virt-sandbox.1*
>
> %files libs -f %{name}.lang
> diff --git a/libvirt-sandbox/image/Makefile.am b/libvirt-sandbox/image/Makefile.am
> deleted file mode 100644
> index 60afbf3..0000000
> --- a/libvirt-sandbox/image/Makefile.am
> +++ /dev/null
> @@ -1,10 +0,0 @@
> -
> -SUBDIRS = sources
> -
> -pythonsandboxdir = $(pythondir)/libvirt_sandbox
> -pythonsandbox_DATA = __init__.py
> -
> -pythonimagedir = $(pythondir)/libvirt_sandbox/image
> -pythonimage_DATA = __init__.py cli.py template.py
> -
> -EXTRA_DIST = $(pythonimage_DATA)
> diff --git a/libvirt-sandbox/image/__init__.py b/libvirt-sandbox/image/__init__.py
> deleted file mode 100644
> index e69de29..0000000
> diff --git a/libvirt-sandbox/image/cli.py b/libvirt-sandbox/image/cli.py
> deleted file mode 100644
> index 605183c..0000000
> --- a/libvirt-sandbox/image/cli.py
> +++ /dev/null
> @@ -1,282 +0,0 @@
> -#!/usr/bin/env python3
> -# -*- coding: utf-8 -*-
> -# Authors: Daniel P. Berrange <berrange at redhat.com>
> -# Eren Yagdiran <erenyagdiran at gmail.com>
> -#
> -# Copyright (C) 2013-2015 Red Hat, Inc.
> -# Copyright (C) 2015 Universitat Politècnica de Catalunya.
> -#
> -# This program is free software; you can redistribute it and/or modify
> -# it under the terms of the GNU General Public License as published by
> -# the Free Software Foundation; either version 2 of the License, or
> -# (at your option) any later version.
> -#
> -# This program is distributed in the hope that it will be useful,
> -# but WITHOUT ANY WARRANTY; without even the implied warranty of
> -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> -# GNU General Public License for more details.
> -#
> -# You should have received a copy of the GNU General Public License
> -# along with this program; if not, write to the Free Software
> -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
> -#
> -
> -import argparse
> -import gettext
> -import hashlib
> -import json
> -import os
> -import os.path
> -import re
> -import shutil
> -import sys
> -import subprocess
> -import random
> -import string
> -
> -from libvirt_sandbox.image import template
> -
> -if os.geteuid() == 0:
> - default_template_dir = "/var/lib/libvirt/templates"
> - default_image_dir = "/var/lib/libvirt/images"
> -else:
> - default_template_dir = os.environ['HOME'] + "/.local/share/libvirt/templates"
> - default_image_dir = os.environ['HOME'] + "/.local/share/libvirt/images"
> -
> -debug = False
> -verbose = False
> -
> -gettext.bindtextdomain("libvirt-sandbox", "/usr/share/locale")
> -gettext.textdomain("libvirt-sandbox")
> -try:
> - gettext.install("libvirt-sandbox",
> - localedir="/usr/share/locale",
> - codeset = 'utf-8')
> -except IOError:
> - import __builtin__
> - __builtin__.__dict__['_'] = unicode
> -
> -
> -def debug(msg):
> - sys.stderr.write(msg)
> -
> -def info(msg):
> - sys.stdout.write(msg)
> -
> -def get_template_dir(args):
> - tmpl = template.Template.from_uri(args.template)
> - return "%s/%s" % (args.template_dir, tmpl.source)
> -
> -def purge(args):
> - tmpl = template.Template.from_uri(args.template)
> - source = tmpl.get_source_impl()
> - source.delete_template(template=tmpl,
> - templatedir=get_template_dir(args))
> -
> -def prepare(args):
> - tmpl = template.Template.from_uri(args.template)
> - source = tmpl.get_source_impl()
> - source.create_template(template=tmpl,
> - templatedir=get_template_dir(args),
> - connect=args.connect)
> -
> -def random_domain_name(tmpl):
> - randomid = ''.join(random.choice(string.ascii_lowercase) for i in range(10))
> - return re.sub('[^a-z0-9-]', '_', tmpl.path[1:], re.I) + ":" + randomid
> -
> -def run(args):
> - if args.connect is not None:
> - check_connect(args.connect)
> -
> - tmpl = template.Template.from_uri(args.template)
> - source = tmpl.get_source_impl()
> - template_dir = get_template_dir(args)
> -
> - # Create the template image if needed
> - if not source.has_template(tmpl, template_dir):
> - prepare(args)
> -
> - name = args.name
> - if name is None:
> - name = random_domain_name(tmpl)
> -
> - diskfile = source.get_disk(template=tmpl,
> - templatedir=template_dir,
> - imagedir=args.image_dir,
> - sandboxname=name)
> -
> - commandToRun = source.get_command(tmpl, template_dir, args.args)
> - if len(commandToRun) == 0:
> - commandToRun = ["/bin/sh"]
> - cmd = ['virt-sandbox', '--name', name]
> - if args.connect is not None:
> - cmd.append("-c")
> - cmd.append(args.connect)
> - params = ['-m','host-image:/=%s,format=qcow2' % diskfile]
> -
> - networkArgs = args.network
> - if networkArgs is not None:
> - params.append('-N')
> - params.append(networkArgs)
> -
> - allEnvs = source.get_env(tmpl, template_dir)
> - envArgs = args.env
> - if envArgs is not None:
> - allEnvs = allEnvs + envArgs
> - for env in allEnvs:
> - envsplit = env.split("=")
> - envlen = len(envsplit)
> - if envlen == 2:
> - params.append("--env")
> - params.append(env)
> - else:
> - pass
> -
> - cmd = cmd + params + ['--'] + commandToRun
> - subprocess.call(cmd)
> - os.unlink(diskfile)
> - source.post_run(tmpl, template_dir, name)
> -
> -def list_cached(args):
> - tmpls = []
> - if args.source is not None:
> - tmpls.extend(template.Template.get_all(args.source,
> - "%s/%s" % (args.template_dir, args.source)))
> - else:
> - for source in ["docker", "virt-builder"]:
> - tmpls.extend(template.Template.get_all(source,
> - "%s/%s" % (args.template_dir, source)))
> - for tmpl in tmpls:
> - print (tmpl)
> -
> -def requires_template(parser):
> - parser.add_argument("template",
> - help=_("URI of the template"))
> -
> -def requires_name(parser):
> - parser.add_argument("-n","--name",
> - help=_("Name of the running sandbox"))
> -
> -def requires_debug(parser):
> - parser.add_argument("-d","--debug",
> - default=False, action="store_true",
> - help=_("Run in debug mode"))
> -
> -def check_connect(connectstr):
> - supportedDrivers = ['lxc:///','qemu:///session','qemu:///system']
> - if not connectstr in supportedDrivers:
> - raise ValueError("URI '%s' is not supported by virt-sandbox-image" % connectstr)
> - return True
> -
> -def requires_connect(parser):
> - parser.add_argument("-c","--connect",
> - help=_("Connect string for libvirt"))
> -
> -def requires_template_dir(parser):
> - global default_template_dir
> - parser.add_argument("-t","--template-dir",
> - default=default_template_dir,
> - help=_("Template directory for saving templates"))
> -
> -def requires_image_dir(parser):
> - global default_image_dir
> - parser.add_argument("-I","--image-dir",
> - default=default_image_dir,
> - help=_("Image directory for saving images"))
> -
> -def gen_command_parser(subparser, name, helptext):
> - parser = subparser.add_parser(
> - name, help=helptext,
> - formatter_class=argparse.RawDescriptionHelpFormatter,
> - epilog="""
> -
> -Example supported URI formats:
> -
> - docker:///ubuntu?tag=15.04
> - docker://username:password@index.docker.io/private/image
> - docker://registry.access.redhat.com/rhel6
> - virt-builder:///fedora-20
> -""")
> - return parser
> -
> -def gen_purge_args(subparser):
> - parser = gen_command_parser(subparser, "purge",
> - _("Purge cached template"))
> - requires_template(parser)
> - requires_template_dir(parser)
> - parser.set_defaults(func=purge)
> -
> -def gen_prepare_args(subparser):
> - parser = gen_command_parser(subparser, "prepare",
> - _("Prepare local template"))
> - requires_template(parser)
> - requires_connect(parser)
> - requires_template_dir(parser)
> - parser.set_defaults(func=prepare)
> -
> -def gen_run_args(subparser):
> - parser = gen_command_parser(subparser, "run",
> - _("Run an instance of a template"))
> - requires_name(parser)
> - requires_template(parser)
> - requires_connect(parser)
> - requires_template_dir(parser)
> - requires_image_dir(parser)
> - parser.add_argument("args",
> - nargs=argparse.REMAINDER,
> - help=_("command arguments to run"))
> - parser.add_argument("-N","--network",
> - help=_("Network params for running template"))
> - parser.add_argument("-e","--env",action="append",
> - help=_("Environment params for running template"))
> -
> - parser.set_defaults(func=run)
> -
> -def gen_list_args(subparser):
> - parser = gen_command_parser(subparser, "list",
> - _("List locally cached images"))
> - requires_template_dir(parser)
> -
> - parser.add_argument("-s","--source",
> - help=_("Name of the template source"))
> -
> - parser.set_defaults(func=list_cached)
> -
> -def main():
> - parser = argparse.ArgumentParser(description="Sandbox Container Image Tool")
> -
> - requires_debug(parser)
> -
> - subparser = parser.add_subparsers(help=_("commands"))
> - subparser.required = True
> - subparser.dest = "command"
> - gen_purge_args(subparser)
> - gen_prepare_args(subparser)
> - gen_run_args(subparser)
> - gen_list_args(subparser)
> -
> - args = parser.parse_args()
> - if args.debug:
> - args.func(args)
> - sys.exit(0)
> - else:
> - try:
> - args.func(args)
> - sys.exit(0)
> - except KeyboardInterrupt as e:
> - sys.exit(0)
> - except ValueError as e:
> - sys.stderr.write("%s: %s\n" % (sys.argv[0], e))
> - sys.stderr.flush()
> - sys.exit(1)
> - except IOError as e:
> - sys.stderr.write("%s: %s\n" % (sys.argv[0], e.filename))
> - sys.stderr.flush()
> - sys.exit(1)
> - except OSError as e:
> - sys.stderr.write("%s: %s\n" % (sys.argv[0], e))
> - sys.stderr.flush()
> - sys.exit(1)
> - except Exception as e:
> - print (e)
> - sys.exit(1)
> diff --git a/libvirt-sandbox/image/sources/Makefile.am b/libvirt-sandbox/image/sources/Makefile.am
> deleted file mode 100644
> index 817baa0..0000000
> --- a/libvirt-sandbox/image/sources/Makefile.am
> +++ /dev/null
> @@ -1,10 +0,0 @@
> -
> -pythonimagedir = $(pythondir)/libvirt_sandbox/image/sources
> -pythonimage_DATA = \
> - __init__.py \
> - base.py \
> - docker.py \
> - virtbuilder.py \
> - $(NULL)
> -
> -EXTRA_DIST = $(pythonimage_DATA)
> diff --git a/libvirt-sandbox/image/sources/__init__.py b/libvirt-sandbox/image/sources/__init__.py
> deleted file mode 100644
> index e69de29..0000000
> diff --git a/libvirt-sandbox/image/sources/base.py b/libvirt-sandbox/image/sources/base.py
> deleted file mode 100644
> index 0fc9243..0000000
> --- a/libvirt-sandbox/image/sources/base.py
> +++ /dev/null
> @@ -1,160 +0,0 @@
> -# -*- coding: utf-8 -*-
> -#
> -# Copyright (C) 2015 Universitat Politècnica de Catalunya.
> -# Copyright (C) 2015 Red Hat, Inc.
> -#
> -# This library is free software; you can redistribute it and/or
> -# modify it under the terms of the GNU Lesser General Public
> -# License as published by the Free Software Foundation; either
> -# version 2.1 of the License, or (at your option) any later version.
> -#
> -# This library is distributed in the hope that it will be useful,
> -# but WITHOUT ANY WARRANTY; without even the implied warranty of
> -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> -# Lesser General Public License for more details.
> -#
> -# You should have received a copy of the GNU Lesser General Public
> -# License along with this library; if not, write to the Free Software
> -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> -#
> -# Author: Eren Yagdiran <erenyagdiran at gmail.com>
> -
> -from abc import ABCMeta, abstractmethod
> -import subprocess
> -
> -class Source():
> - '''The Source class defines the base interface for
> - all image provider source implementations. An image
> - provide source is able to download templates from
> - a repository, convert them to a host specific image
> - format and report commands used to invoke them.'''
> -
> - __metaclass__ = ABCMeta
> - def __init__(self):
> - pass
> -
> - @abstractmethod
> - def list_templates(self, templatedir):
> - """
> - :param templatedir: local directory path in which to store the template
> -
> - Get a list of all templates that are locally cached
> -
> - :returns: a list of libvirt_sandbox.template.Template objects
> - """
> - pass
> -
> - @abstractmethod
> - def has_template(self, template, templatedir):
> - """
> - :param template: libvirt_sandbox.template.Template object
> - :param templatedir: local directory path in which to store the template
> -
> - Check if a template has already been created.
> - """
> - pass
> -
> - @abstractmethod
> - def create_template(self, template, templatedir,
> - connect=None):
> - """
> - :param template: libvirt_sandbox.template.Template object
> - :param templatedir: local directory path in which to store the template
> - :param connect: libvirt connection URI
> -
> - Create a set of local disk images populated with the content
> - of a template. The images creation process will be isolated
> - inside a sandbox using the requested libvirt connection URI.
> - """
> - pass
> -
> - @abstractmethod
> - def delete_template(self, template, templatedir):
> - """
> - :param template: libvirt_sandbox.template.Template object
> - :param templatedir: local directory path from which to delete template
> -
> - Delete all local files associated with the template
> - """
> - pass
> -
> - @abstractmethod
> - def get_command(self, template, templatedir, userargs):
> - """
> - :param template: libvirt_sandbox.template.Template object
> - :param templatedir: local directory path in which templates are stored
> - :param userargs: user specified arguments to run
> -
> - Get the command line to invoke in the container. If userargs
> - is specified, then this should override the default args in
> - the image"""
> - pass
> -
> - @abstractmethod
> - def get_disk(self, template, templatedir, imagedir, sandboxname):
> - """
> - :param template: libvirt_sandbox.template.Template object
> - :param templatedir: local directory path in which to find template
> - :param imagedir: local directory in which to storage disk image
> -
> - Creates an instance private disk image, backed by the content
> - of a template.
> - """
> - pass
> -
> - @abstractmethod
> - def get_env(self, template, templatedir):
> - """
> - :param template: libvirt_sandbox.template.Template object
> - :param templatedir: local directory path in which to find template
> -
> - Get the dict of environment variables to set
> - """
> - pass
> -
> - def post_run(self, template, templatedir, imagename):
> - """
> - :param template: libvirt_sandbox.template.Template object
> - :param templatedir: local directory path in which to find template
> - :param imagename: name of the image that just stopped running
> -
> - Hook called after the image has been stopped. By default is doesn't
> - do anything, subclasses can override this to do some additional
> - cleanup.
> - """
> - pass
> -
> -
> - # Utility functions to share between the sources.
> -
> - def format_disk(self,disk,format,connect):
> - cmd = ['virt-sandbox']
> - if connect is not None:
> - cmd.append("-c")
> - cmd.append(connect)
> - cmd.append("-p")
> - params = ['--disk=file:disk_image=%s,format=%s' %(disk,format),
> - '/sbin/mkfs.ext3',
> - '/dev/disk/by-tag/disk_image']
> - cmd = cmd + params
> - subprocess.check_call(cmd)
> -
> - def extract_tarball(self, diskfile, format, tarfile, connect):
> - cmd = ['virt-sandbox']
> - if connect is not None:
> - cmd.append("-c")
> - cmd.append(connect)
> - cmd.append("-p")
> - compression = ""
> - if tarfile.endswith(".gz"):
> - compression = "z"
> - params = ['-m',
> - 'host-image:/mnt=%s,format=%s' % (diskfile, format),
> - '--',
> - '/bin/tar',
> - 'xf%s' % compression,
> - '%s' % tarfile,
> - '-C',
> - '/mnt']
> - cmd = cmd + params
> - subprocess.check_call(cmd)
> diff --git a/libvirt-sandbox/image/sources/docker.py b/libvirt-sandbox/image/sources/docker.py
> deleted file mode 100755
> index eaf41fc..0000000
> --- a/libvirt-sandbox/image/sources/docker.py
> +++ /dev/null
> @@ -1,690 +0,0 @@
> -# -*- coding: utf-8 -*-
> -#
> -# Copyright (C) 2015 Universitat Politècnica de Catalunya.
> -# Copyright (C) 2015 Red Hat, Inc.
> -#
> -# This library is free software; you can redistribute it and/or
> -# modify it under the terms of the GNU Lesser General Public
> -# License as published by the Free Software Foundation; either
> -# version 2.1 of the License, or (at your option) any later version.
> -#
> -# This library is distributed in the hope that it will be useful,
> -# but WITHOUT ANY WARRANTY; without even the implied warranty of
> -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> -# Lesser General Public License for more details.
> -#
> -# You should have received a copy of the GNU Lesser General Public
> -# License along with this library; if not, write to the Free Software
> -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> -#
> -# Author: Eren Yagdiran <erenyagdiran at gmail.com>
> -#
> -
> -import sys
> -import json
> -import traceback
> -import os
> -import subprocess
> -import shutil
> -import urllib.error
> -import urllib.parse
> -import urllib.request
> -import hashlib
> -from abc import ABCMeta, abstractmethod
> -import copy
> -from libvirt_sandbox.image.template import Template
> -
> -from . import base
> -
> -class DockerConfParser():
> -
> - def __init__(self,jsonfile):
> - with open(jsonfile) as json_file:
> - self.json_data = json.load(json_file)
> - def getCommand(self):
> - return self.json_data['config']['Cmd']
> - def getEntrypoint(self):
> - return self.json_data['config']['Entrypoint']
> - def getEnvs(self):
> - lst = self.json_data['config']['Env']
> - if lst is not None and isinstance(lst,list):
> - return lst
> - else:
> - return []
> -
> -class DockerImage():
> -
> - def __init__(self, repo, name, tag=None):
> -
> - self.repo = repo
> - self.name = name
> - self.tag = tag
> -
> - if self.tag is None:
> - self.tag = "latest"
> -
> - if self.repo is None:
> - self.repo = "library"
> -
> - def __repr__(self):
> - return "%s/%s,tag=%s" % (self.repo, self.name, self.tag)
> -
> - @classmethod
> - def from_template(cls, template):
> - bits = template.path[1:].split("/")
> - if len(bits) == 1:
> - return cls(repo=None,
> - name=bits[0],
> - tag=template.params.get("tag"))
> - elif len(bits) == 2:
> - return cls(repo=bits[0],
> - name=bits[1],
> - tag=template.params.get("tag"))
> - else:
> - raise Exception("Expected image name, or repo & image name for path, not '%s'",
> - template.path)
> -
> -
> -class DockerAuth():
> -
> - __metaclass__ = ABCMeta
> - def __init__(self):
> - pass
> -
> - @abstractmethod
> - def prepare_req(self, req):
> - pass
> -
> - @abstractmethod
> - def process_res(self, res):
> - pass
> -
> - @abstractmethod
> - def process_err(self, err):
> - return False
> -
> -
> -class DockerAuthNop(DockerAuth):
> -
> - def prepare_req(self, req):
> - pass
> -
> - def process_res(self, res):
> - pass
> -
> - def process_err(self, err):
> - return False
> -
> -
> -class DockerAuthBasic(DockerAuth):
> -
> - def __init__(self, username, password):
> - self.username = username
> - self.password = password
> - self.token = None
> -
> - def prepare_req(self, req):
> - if self.username is not None:
> - auth = base64.encodestring(
> - '%s:%s' % (self.username, self.password)).replace('\n', '')
> -
> - req.add_header("Authorization", "Basic %s" % auth)
> -
> - req.add_header("X-Docker-Token", "true")
> -
> - def process_res(self, res):
> - self.token = res.info().get('X-Docker-Token')
> -
> - def process_err(self, err):
> - return False
> -
> -
> -class DockerAuthToken(DockerAuth):
> -
> - def __init__(self, token):
> - self.token = token
> -
> - def prepare_req(self, req):
> - req.add_header("Authorization", "Token %s" % self.token)
> -
> - def process_res(self, res):
> - pass
> -
> - def process_err(self, err):
> - return False
> -
> -
> -class DockerAuthBearer(DockerAuth):
> -
> - def __init__(self):
> - self.token = None
> -
> - def prepare_req(self, req):
> - if self.token is not None:
> - req.add_header("Authorization", "Bearer %s" % self.token)
> -
> - def process_res(self, res):
> - pass
> -
> - def process_err(self, err):
> - method = err.headers.get("WWW-Authenticate", None)
> - if method is None:
> - return False
> -
> - if not method.startswith("Bearer "):
> - return False
> -
> - challenge = method[7:]
> -
> - bits = challenge.split(",")
> - attrs = {}
> - for bit in bits:
> - subbit = bit.split("=")
> - attrs[subbit[0]] = subbit[1][1:-1]
> -
> - url = attrs["realm"]
> - del attrs["realm"]
> - if "error" in attrs:
> - del attrs["error"]
> -
> - params = "&".join([
> - "%s=%s" % (attr, attrs[attr])
> - for attr in attrs.keys()
> - ])
> - if params != "":
> - url = url + "?" + params
> -
> - req = urllib.request.Request(url=url)
> - req.add_header("Accept", "application/json")
> -
> - res = urllib.request.urlopen(req)
> - data = json.loads(res.read())
> - self.token = data["token"]
> - return True
> -
> -
> -class DockerRegistry():
> -
> - def __init__(self, uri_base):
> -
> - self.uri_base = list(urllib.parse.urlparse(uri_base))
> - self.auth_handler = DockerAuthNop()
> -
> - def set_auth_handler(self, auth_handler):
> - self.auth_handler = auth_handler
> -
> - def supports_v2(self):
> - try:
> - (data, res) = self.get_json("/v2/")
> - ver = res.info().get("Docker-Distribution-Api-Version")
> - except urllib.error.HTTPError as e:
> - ver = e.headers.get("Docker-Distribution-Api-Version", None)
> -
> - if ver is None:
> - return False
> - return ver.startswith("registry/2")
> -
> - def set_server(self, server):
> - self.uri_base[1] = server
> -
> - @classmethod
> - def from_template(cls, template):
> - protocol = template.protocol
> - hostname = template.hostname
> - port = template.port
> -
> - if protocol is None:
> - protocol = "https"
> - if hostname is None:
> - hostname = "index.docker.io"
> -
> - if port is None:
> - server = hostname
> - else:
> - server = "%s:%s" % (hostname, port)
> -
> - url = urllib.parse.urlunparse((protocol, server, "", None, None, None))
> -
> - return cls(url)
> -
> - def get_url(self, path, headers=None):
> - url_bits = copy.copy(self.uri_base)
> - url_bits[2] = path
> - url = urllib.parse.urlunparse(url_bits)
> - debug("Fetching %s..." % url)
> -
> - req = urllib.request.Request(url=url)
> -
> - if headers is not None:
> - for h in headers.keys():
> - req.add_header(h, headers[h])
> -
> - self.auth_handler.prepare_req(req)
> -
> - try:
> - res = urllib.request.urlopen(req)
> - self.auth_handler.process_res(res)
> - return res
> - except urllib.error.HTTPError as e:
> - if e.code == 401:
> - retry = self.auth_handler.process_err(e)
> - if retry:
> - debug("Re-Fetching %s..." % url)
> - self.auth_handler.prepare_req(req)
> - res = urllib.request.urlopen(req)
> - self.auth_handler.process_res(res)
> - return res
> - else:
> - debug("Not re-fetching")
> - raise
> - else:
> - raise
> -
> - def save_data(self, path, dest, checksum=None):
> - try:
> - res = self.get_url(path)
> -
> - datalen = res.info().get("Content-Length")
> - if datalen is not None:
> - datalen = int(datalen)
> -
> - csum = None
> - if checksum is not None:
> - csum = hashlib.sha256()
> -
> - pattern = [".", "o", "O", "o"]
> - patternIndex = 0
> - donelen = 0
> -
> - with open(dest, "wb") as f:
> - while 1:
> - buf = res.read(1024*64)
> - if not buf:
> - break
> - if csum is not None:
> - csum.update(buf)
> - f.write(buf)
> -
> - if datalen is not None:
> - donelen = donelen + len(buf)
> - debug("\x1b[s%s (%5d Kb of %5d Kb)\x1b8" % (
> - pattern[patternIndex], (donelen/1024), (datalen/1024)
> - ))
> - patternIndex = (patternIndex + 1) % 4
> -
> - debug("\x1b[K")
> - if csum is not None:
> - csumstr = "sha256:" + csum.hexdigest()
> - if csumstr != checksum:
> - debug("FAIL checksum '%s' does not match '%s'" % (csumstr, checksum))
> - os.remove(dest)
> - raise IOError("Checksum '%s' for data does not match '%s'" % (csumstr, checksum))
> - debug("OK\n")
> - return res
> - except Exception as e:
> - debug("FAIL %s\n" % str(e))
> - raise
> -
> - def get_json(self, path):
> - try:
> - headers = {}
> - headers["Accept"] = "application/json"
> - res = self.get_url(path, headers)
> - data = json.loads(res.read())
> - debug("OK\n")
> - return (data, res)
> - except Exception as e:
> - debug("FAIL %s\n" % str(e))
> - raise
> -
> -
> -class DockerSource(base.Source):
> -
> - def _check_cert_validate(self):
> - major = sys.version_info.major
> - SSL_WARNING = "SSL certificates couldn't be validated by default. You need to have 2.7.9/3.4.3 or higher"
> - SSL_WARNING +="\nSee https://bugs.python.org/issue22417\n"
> - py2_7_9_hexversion = 34015728
> - py3_4_3_hexversion = 50594800
> - if (major == 2 and sys.hexversion < py2_7_9_hexversion) or (major == 3 and sys.hexversion <
> py3_4_3_hexversion):
> - sys.stderr.write(SSL_WARNING)
> -
> - def _was_downloaded(self, image, templatedir):
> - try:
> - self._get_image_list(image, templatedir)
> - return True
> - except Exception:
> - return False
> -
> - def list_templates(self, templatedir):
> - indexes = []
> - try:
> - imagedirs = os.listdir(templatedir)
> - except OSError:
> - return []
> -
> - for imagetagid in imagedirs:
> - indexfile = templatedir + "/" + imagetagid + "/index.json"
> - if os.path.exists(indexfile):
> - with open(indexfile,"r") as f:
> - index = json.load(f)
> - indexes.append(index)
> -
> - return [
> - Template(source="docker",
> - protocol=None,
> - hostname=None,
> - port=None,
> - username=None,
> - password=None,
> - path="/%s/%s" % (index.get("repo", "library"), index["name"]),
> - params={
> - "tag": index.get("tag", "latest"),
> - }) for index in indexes]
> -
> - def has_template(self, template, templatedir):
> - try:
> - image = DockerImage.from_template(template)
> - configfile, diskfile = self._get_template_data(image, templatedir)
> - return os.path.exists(diskfile)
> - except Exception:
> - return False
> -
> - def download_template(self, image, template, templatedir):
> - try:
> - createdFiles = []
> - createdDirs = []
> -
> - self._download_template_impl(image, template, templatedir, createdFiles, createdDirs)
> - except Exception as e:
> - for f in createdFiles:
> - try:
> - os.remove(f)
> - except:
> - pass
> - for d in createdDirs:
> - try:
> - shutil.rmtree(d)
> - except:
> - pass
> - raise
> -
> - def _download_template_impl(self, image, template, templatedir, createdFiles, createdDirs):
> - self._check_cert_validate()
> -
> - registry = DockerRegistry.from_template(template)
> - registry.set_auth_handler(DockerAuthBearer())
> - if registry.supports_v2():
> - self._download_template_impl_v2(registry, image, template, templatedir, createdFiles, createdDirs)
> - else:
> - self._download_template_impl_v1(registry, image, template, templatedir, createdFiles, createdDirs)
> -
> - def _download_template_impl_v1(self, registry, image, template, templatedir, createdFiles, createdDirs):
> - basicauth = DockerAuthBasic(template.username, template.password)
> - registry.set_auth_handler(basicauth)
> - try:
> - (data, res) = registry.get_json("/v1/repositories/%s/%s/images" % (
> - image.repo, image.name,
> - ))
> - except urllib.error.HTTPError as e:
> - raise ValueError(["Image '%s' does not exist" % template])
> -
> - registryendpoint = res.info().get('X-Docker-Endpoints')
> -
> - if basicauth.token is not None:
> - registry.set_auth_handler(DockerAuthToken(basicauth.token))
> - else:
> - registry.set_auth_handler(DockerAuthNop())
> -
> - (data, res) = registry.get_json("/v1/repositories/%s/%s/tags" %(
> - image.repo, image.name
> - ))
> -
> - if image.tag not in data:
> - raise ValueError(["Tag '%s' does not exist for image '%s'" %
> - (image.tag, template)])
> - imagetagid = data[image.tag]
> -
> - (data, res) = registry.get_json("/v1/images/" + imagetagid + "/ancestry")
> -
> - if data[0] != imagetagid:
> - raise ValueError(["Expected first layer id '%s' to match image id '%s'",
> - data[0], imagetagid])
> -
> - for layerid in data:
> - layerdir = templatedir + "/" + layerid
> - if not os.path.exists(layerdir):
> - os.makedirs(layerdir)
> - createdDirs.append(layerdir)
> -
> - jsonfile = layerdir + "/template.json"
> - datafile = layerdir + "/template.tar.gz"
> -
> - if not os.path.exists(jsonfile) or not os.path.exists(datafile):
> - res = registry.save_data("/v1/images/" + layerid + "/json",
> - jsonfile)
> - createdFiles.append(jsonfile)
> -
> - registry.save_data("/v1/images/" + layerid + "/layer",
> - datafile)
> - createdFiles.append(datafile)
> -
> - index = {
> - "repo": image.repo,
> - "name": image.name,
> - "tag": image.tag,
> - }
> -
> - indexfile = templatedir + "/" + imagetagid + "/index.json"
> - with open(indexfile, "w") as f:
> - f.write(json.dumps(index))
> -
> -
> - def _download_template_impl_v2(self, registry, image, template, templatedir, createdFiles, createdDirs):
> - (manifest, res) = registry.get_json( "/v2/%s/%s/manifests/%s" % (
> - image.repo, image.name, image.tag))
> -
> - layerChecksums = [
> - layer["blobSum"] for layer in manifest["fsLayers"]
> - ]
> - layers = [
> - json.loads(entry["v1Compatibility"]) for entry in manifest["history"]
> - ]
> -
> - for i in range(len(layerChecksums)):
> - layerChecksum = layerChecksums[i]
> - config = layers[i]
> -
> - layerdir = templatedir + "/" + config["id"]
> - if not os.path.exists(layerdir):
> - os.makedirs(layerdir)
> - createdDirs.append(layerdir)
> -
> - jsonfile = layerdir + "/template.json"
> - datafile = layerdir + "/template.tar.gz"
> -
> - with open(jsonfile, "w") as fh:
> - fh.write(json.dumps(config))
> -
> - registry.save_data("/v2/%s/%s/blobs/%s" % (
> - image.repo, image.name, layerChecksum),
> - datafile, checksum=layerChecksum)
> -
> -
> - index = {
> - "repo": image.repo,
> - "name": image.name,
> - "tag": image.tag,
> - }
> -
> - indexfile = templatedir + "/" + layers[0]["id"] + "/index.json"
> - with open(indexfile, "w") as f:
> - f.write(json.dumps(index))
> -
> -
> - def create_template(self, template, templatedir, connect=None):
> - image = DockerImage.from_template(template)
> -
> - if not self._was_downloaded(image, templatedir):
> - self.download_template(image, template, templatedir)
> -
> - imagelist = self._get_image_list(image, templatedir)
> - imagelist.reverse()
> -
> - parentImage = None
> - for imagetagid in imagelist:
> - templateImage = templatedir + "/" + imagetagid + "/template.qcow2"
> - cmd = ["qemu-img","create","-f","qcow2"]
> - if parentImage is not None:
> - cmd.append("-o")
> - cmd.append("backing_fmt=qcow2,backing_file=%s" % parentImage)
> - cmd.append(templateImage)
> - if parentImage is None:
> - cmd.append("10G")
> - subprocess.check_call(cmd)
> -
> - if parentImage is None:
> - self.format_disk(templateImage, "qcow2", connect)
> -
> - path = templatedir + "/" + imagetagid + "/template."
> - self.extract_tarball(path + "qcow2",
> - "qcow2",
> - path + "tar.gz",
> - connect)
> - parentImage = templateImage
> -
> - def _get_image_list(self, image, templatedir):
> - imageparent = {}
> - imagenames = {}
> - imagedirs = []
> - try:
> - imagedirs = os.listdir(templatedir)
> - except OSError:
> - pass
> - for imagetagid in imagedirs:
> - indexfile = templatedir + "/" + imagetagid + "/index.json"
> - if os.path.exists(indexfile):
> - with open(indexfile,"r") as f:
> - index = json.load(f)
> - thisimage = DockerImage(index.get("repo"),
> - index["name"],
> - index.get("tag"))
> - imagenames[str(thisimage)] = imagetagid
> - jsonfile = templatedir + "/" + imagetagid + "/template.json"
> - if os.path.exists(jsonfile):
> - with open(jsonfile,"r") as f:
> - data = json.load(f)
> - parent = data.get("parent",None)
> - if parent:
> - imageparent[imagetagid] = parent
> - if str(image) not in imagenames:
> - raise ValueError(["Image %s does not exist locally" % image])
> - imagetagid = imagenames[str(image)]
> - imagelist = []
> - while imagetagid != None:
> - imagelist.append(imagetagid)
> - parent = imageparent.get(imagetagid,None)
> - imagetagid = parent
> - return imagelist
> -
> - def delete_template(self, template, templatedir):
> - image = DockerImage.from_template(template)
> -
> - imageusage = {}
> - imageparent = {}
> - imagenames = {}
> - imagedirs = []
> - try:
> - imagedirs = os.listdir(templatedir)
> - except OSError:
> - pass
> - for imagetagid in imagedirs:
> - indexfile = templatedir + "/" + imagetagid + "/index.json"
> - if os.path.exists(indexfile):
> - with open(indexfile,"r") as f:
> - index = json.load(f)
> - thisimage = DockerImage(index.get("repo"),
> - index["name"],
> - index.get("tag"))
> - imagenames[str(thisimage)] = imagetagid
> - jsonfile = templatedir + "/" + imagetagid + "/template.json"
> - if os.path.exists(jsonfile):
> - with open(jsonfile,"r") as f:
> - data = json.load(f)
> -
> - parent = data.get("parent",None)
> - if parent:
> - if parent not in imageusage:
> - imageusage[parent] = []
> - imageusage[parent].append(imagetagid)
> - imageparent[imagetagid] = parent
> -
> -
> - if str(image) not in imagenames:
> - raise ValueError(["Image %s does not exist locally" % image])
> - imagetagid = imagenames[str(image)]
> - while imagetagid != None:
> - debug("Remove %s\n" % imagetagid)
> - parent = imageparent.get(imagetagid,None)
> -
> - indexfile = templatedir + "/" + imagetagid + "/index.json"
> - if os.path.exists(indexfile):
> - os.remove(indexfile)
> - jsonfile = templatedir + "/" + imagetagid + "/template.json"
> - if os.path.exists(jsonfile):
> - os.remove(jsonfile)
> - datafile = templatedir + "/" + imagetagid + "/template.tar.gz"
> - if os.path.exists(datafile):
> - os.remove(datafile)
> - imagedir = templatedir + "/" + imagetagid
> - shutil.rmtree(imagedir)
> -
> - if parent:
> - if len(imageusage[parent]) != 1:
> - debug("Parent %s is shared\n" % parent)
> - parent = None
> - imagetagid = parent
> -
> - def _get_template_data(self, image, templatedir):
> - imageList = self._get_image_list(image, templatedir)
> - toplayer = imageList[0]
> - diskfile = templatedir + "/" + toplayer + "/template.qcow2"
> - configfile = templatedir + "/" + toplayer + "/template.json"
> - return configfile, diskfile
> -
> - def get_disk(self, template, templatedir, imagedir, sandboxname):
> - image = DockerImage.from_template(template)
> - configfile, diskfile = self._get_template_data(image, templatedir)
> - tempfile = imagedir + "/" + sandboxname.split('/')[-1] + ".qcow2"
> - if not os.path.exists(imagedir):
> - os.makedirs(imagedir)
> - cmd = ["qemu-img","create","-q","-f","qcow2"]
> - cmd.append("-o")
> - cmd.append("backing_fmt=qcow2,backing_file=%s" % diskfile)
> - cmd.append(tempfile)
> - subprocess.check_call(cmd)
> - return tempfile
> -
> - def get_command(self, template, templatedir, userargs):
> - image = DockerImage.from_template(template)
> - configfile, diskfile = self._get_template_data(image, templatedir)
> - configParser = DockerConfParser(configfile)
> - cmd = configParser.getCommand()
> - entrypoint = configParser.getEntrypoint()
> - if entrypoint is None:
> - entrypoint = []
> - if cmd is None:
> - cmd = []
> - if userargs is not None and len(userargs) > 0:
> - return entrypoint + userargs
> - else:
> - return entrypoint + cmd
> -
> - def get_env(self, template, templatedir):
> - image = DockerImage.from_template(template)
> - configfile, diskfile = self._get_template_data(image, templatedir)
> - configParser = DockerConfParser(configfile)
> - return configParser.getEnvs()
> -
> -def debug(msg):
> - sys.stderr.write(msg)
> diff --git a/libvirt-sandbox/image/sources/virtbuilder.py b/libvirt-sandbox/image/sources/virtbuilder.py
> deleted file mode 100755
> index 1b32083..0000000
> --- a/libvirt-sandbox/image/sources/virtbuilder.py
> +++ /dev/null
> @@ -1,109 +0,0 @@
> -#
> -# Copyright (C) 2015 SUSE LLC
> -#
> -# This library is free software; you can redistribute it and/or
> -# modify it under the terms of the GNU Lesser General Public
> -# License as published by the Free Software Foundation; either
> -# version 2.1 of the License, or (at your option) any later version.
> -#
> -# This library is distributed in the hope that it will be useful,
> -# but WITHOUT ANY WARRANTY; without even the implied warranty of
> -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> -# Lesser General Public License for more details.
> -#
> -# You should have received a copy of the GNU Lesser General Public
> -# License along with this library; if not, write to the Free Software
> -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> -#
> -# Author: Cedric Bosdonnat <cbosdonnat at suse.com>
> -#
> -
> -import os
> -import os.path
> -import subprocess
> -
> -from . import base
> -from libvirt_sandbox.image.template import Template
> -
> -
> -class VirtBuilderSource(base.Source):
> -
> - def _get_template_name(self, template):
> - # We shouldn't have '/' in the names, but let's make sure
> - # nobody can try to alter the folders structure later.
> - return template.path[1:].replace('/', '_')
> -
> - def has_template(self, template, templatedir):
> - imagepath = "%s/%s.qcow2" % (templatedir, template.path)
> - return os.path.exists(imagepath)
> -
> - def create_template(self, template, templatedir, connect=None):
> - if not os.path.exists(templatedir):
> - os.makedirs(templatedir)
> -
> - # Get the image using virt-builder
> - templatename = self._get_template_name(template)
> - imagepath_original = "%s/%s-original.qcow2" % (templatedir, templatename)
> - imagepath = "%s/%s.qcow2" % (templatedir, templatename)
> - cmd = ["virt-builder", templatename, "--no-network",
> - "-o", imagepath_original, "--format", "qcow2"]
> - subprocess.check_call(cmd)
> -
> - try:
> - # We need to convert this image into a single partition one.
> - tarfile = "%s/%s.tar" % (templatedir, templatename)
> - cmd = ["virt-tar-out", "-a", imagepath_original, "/", tarfile]
> - subprocess.check_call(cmd)
> -
> - cmd = ["qemu-img", "create", "-q", "-f", "qcow2", imagepath, "10G"]
> - subprocess.check_call(cmd)
> -
> - self.format_disk(imagepath, "qcow2", connect)
> - self.extract_tarball(imagepath, "qcow2", tarfile, connect)
> -
> - finally:
> - os.unlink(imagepath_original)
> - os.unlink(tarfile)
> -
> - def list_templates(self, templatedir):
> - files = []
> - try:
> - imagefiles = os.listdir(templatedir)
> - except OSError:
> - return []
> -
> - for filename in imagefiles:
> - if not filename.endswith(".qcow2"):
> - continue
> - files.append(filename[0:-6])
> -
> - return [
> - Template(source="virt-builder",
> - protocol=None,
> - hostname=None,
> - port=None,
> - username=None,
> - password=None,
> - path="/%s" % filename,
> - params={}) for filename in files]
> -
> - def delete_template(self, template, templatedir):
> - os.unlink("%s/%s.qcow2" % (templatedir, self._get_template_name(template)))
> -
> - def get_command(self, template, templatedir, userargs):
> - return userargs
> -
> - def get_disk(self,template, templatedir, imagedir, sandboxname):
> - diskfile = "%s/%s.qcow2" % (templatedir, self._get_template_name(template))
> - tempfile = imagedir + "/" + sandboxname + ".qcow2"
> - if not os.path.exists(imagedir):
> - os.makedirs(imagedir)
> - cmd = ["qemu-img", "create", "-q",
> - "-f", "qcow2",
> - "-o", "backing_fmt=qcow2,backing_file=%s" % diskfile,
> - tempfile]
> - subprocess.check_call(cmd)
> - return tempfile
> -
> - def get_env(self,template, templatedir):
> - return []
> diff --git a/libvirt-sandbox/image/template.py b/libvirt-sandbox/image/template.py
> deleted file mode 100644
> index ab2ea29..0000000
> --- a/libvirt-sandbox/image/template.py
> +++ /dev/null
> @@ -1,133 +0,0 @@
> -#
> -# -*- coding: utf-8 -*-
> -# Authors: Daniel P. Berrange <berrange at redhat.com>
> -#
> -# Copyright (C) 2015 Red Hat, Inc.
> -#
> -# This program is free software; you can redistribute it and/or modify
> -# it under the terms of the GNU General Public License as published by
> -# the Free Software Foundation; either version 2 of the License, or
> -# (at your option) any later version.
> -#
> -# This program is distributed in the hope that it will be useful,
> -# but WITHOUT ANY WARRANTY; without even the implied warranty of
> -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> -# GNU General Public License for more details.
> -#
> -# You should have received a copy of the GNU General Public License
> -# along with this program; if not, write to the Free Software
> -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
> -#
> -
> -import urllib.parse
> -import importlib
> -import re
> -
> -class Template(object):
> -
> - def __init__(self,
> - source, protocol,
> - hostname, port,
> - username, password,
> - path, params):
> - """
> - :param source: template source name
> - :param protocol: network transport protocol or None
> - :param hostname: registry hostname or None
> - :param port: registry port or None
> - :param username: username or None
> - :param password: password or None
> - :param path: template path identifier
> - :param params: template parameters
> -
> - docker:///ubuntu
> -
> - docker+https://index.docker.io/ubuntu?tag=latest
> -
> - virt-builder:///fedora-20
> - """
> -
> - self.source = source
> - self.protocol = protocol
> - self.hostname = hostname
> - self.port = port
> - self.username = username
> - self.password = password
> - self.path = path
> - self.params = params
> - if self.params is None:
> - self.params = {}
> -
> - @classmethod
> - def _get_source_impl(klass, source):
> - try:
> - p = re.compile("\W")
> - sourcemod = "".join(p.split(source))
> - sourcename = "".join([i.capitalize() for i in p.split(source)])
> -
> - mod = importlib.import_module(
> - "libvirt_sandbox.image.sources." + sourcemod)
> - classname = sourcename + "Source"
> - classimpl = getattr(mod, classname)
> - return classimpl()
> - except Exception as e:
> - print (e)
> - raise Exception("Invalid source: '%s'" % source)
> -
> - def get_source_impl(self):
> - if self.source == "":
> - raise Exception("Missing scheme in image URI")
> -
> - return self._get_source_impl(self.source)
> -
> - def __repr__(self):
> - if self.protocol is not None:
> - scheme = self.source + "+" + self.protocol
> - else:
> - scheme = self.source
> - if self.hostname:
> - if self.port:
> - netloc = "%s:%d" % (self.hostname, self.port)
> - else:
> - netloc = self.hostname
> -
> - if self.username:
> - if self.password:
> - auth = self.username + ":" + self.password
> - else:
> - auth = self.username
> - netloc = auth + "@" + netloc
> - else:
> - netloc = None
> -
> - query = "&".join([key + "=" + self.params[key] for key in self.params.keys()])
> - ret = urllib.parse.urlunparse((scheme, netloc, self.path, None, query, None))
> - return ret
> -
> - @classmethod
> - def from_uri(klass, uri):
> - o = urllib.parse.urlparse(uri)
> -
> - idx = o.scheme.find("+")
> - if idx == -1:
> - source = o.scheme
> - protocol = None
> - else:
> - source = o.scheme[0:idx]
> - protocol = o.scheme[idx + 1:]
> -
> - query = {}
> - if o.query is not None and o.query != "":
> - for param in o.query.split("&"):
> - (key, val) = param.split("=")
> - query[key] = val
> - return klass(source, protocol,
> - o.hostname, o.port,
> - o.username, o.password,
> - o.path, query)
> -
> - @classmethod
> - def get_all(klass, source, templatedir):
> - impl = klass._get_source_impl(source)
> -
> - return impl.list_templates(templatedir)
> diff --git a/m4/virt-win32.m4 b/m4/virt-win32.m4
> index d088ce8..8b908e7 100644
> --- a/m4/virt-win32.m4
> +++ b/m4/virt-win32.m4
> @@ -4,15 +4,11 @@ AC_DEFUN([LIBVIRT_SANDBOX_WIN32],[
> dnl for now since I'm not supporting mingw at present. - RWMJ
> CYGWIN_EXTRA_LDFLAGS=
> CYGWIN_EXTRA_LIBADD=
> - CYGWIN_EXTRA_PYTHON_LIBADD=
> MINGW_EXTRA_LDFLAGS=
> case "$host" in
> *-*-cygwin*)
> CYGWIN_EXTRA_LDFLAGS="-no-undefined"
> CYGWIN_EXTRA_LIBADD="${INTLLIBS}"
> - if test "x$PYTHON_VERSION" != "x"; then
> - CYGWIN_EXTRA_PYTHON_LIBADD="-L/usr/lib/python${PYTHON_VERSION}/config -lpython${PYTHON_VERSION}"
> - fi
> ;;
> *-*-mingw*)
> MINGW_EXTRA_LDFLAGS="-no-undefined"
> @@ -20,6 +16,5 @@ AC_DEFUN([LIBVIRT_SANDBOX_WIN32],[
> esac
> AC_SUBST([CYGWIN_EXTRA_LDFLAGS])
> AC_SUBST([CYGWIN_EXTRA_LIBADD])
> - AC_SUBST([CYGWIN_EXTRA_PYTHON_LIBADD])
> AC_SUBST([MINGW_EXTRA_LDFLAGS])
> ])
More information about the libvir-list
mailing list