[Kimchi-devel] [PATCH 3/4] Move validate_repo_url() and check_url_path() from Wok to Kimchi
Paulo Ricardo Paz Vital
pvital at linux.vnet.ibm.com
Tue Oct 20 16:45:31 UTC 2015
Reviewed-By: Paulo Vital <pvital at linux.vnet.ibm.com>
On Mon, 2015-10-19 at 19:10 -0200, Aline Manera wrote:
> validate_repo_url() and check_url_path() functions are used only by
> Kimchi so
> move it from Wok to Kimchi.
>
> Signed-off-by: Aline Manera <alinefm at linux.vnet.ibm.com>
> ---
> src/wok/plugins/kimchi/isoinfo.py | 3 +-
> src/wok/plugins/kimchi/model/config.py | 3 +-
> src/wok/plugins/kimchi/repositories.py | 2 +-
> src/wok/plugins/kimchi/utils.py | 58
> +++++++++++++++++++++++++++++++++
> src/wok/plugins/kimchi/vmtemplate.py | 2 +-
> src/wok/plugins/kimchi/xmlutils/disk.py | 2 +-
> src/wok/utils.py | 55 -----------------------
> --------
> 7 files changed, 65 insertions(+), 60 deletions(-)
>
> diff --git a/src/wok/plugins/kimchi/isoinfo.py
> b/src/wok/plugins/kimchi/isoinfo.py
> index bc8d8a4..731c45a 100644
> --- a/src/wok/plugins/kimchi/isoinfo.py
> +++ b/src/wok/plugins/kimchi/isoinfo.py
> @@ -29,7 +29,8 @@ import urllib2
>
>
> from wok.exception import IsoFormatError
> -from wok.utils import check_url_path, wok_log
> +from wok.plugins.kimchi.utils import check_url_path
> +from wok.utils import wok_log
>
>
> iso_dir = [
> diff --git a/src/wok/plugins/kimchi/model/config.py
> b/src/wok/plugins/kimchi/model/config.py
> index b6cc4d9..680d7dc 100644
> --- a/src/wok/plugins/kimchi/model/config.py
> +++ b/src/wok/plugins/kimchi/model/config.py
> @@ -24,7 +24,8 @@ from wok.basemodel import Singleton
> from wok.config import config as kconfig
> from wok.config import get_version
> from wok.exception import NotFoundError
> -from wok.utils import check_url_path, run_command, wok_log
> +from wok.plugins.kimchi.utils import check_url_path
> +from wok.utils import run_command, wok_log
>
> from ..config import find_qemu_binary
> from ..distroloader import DistroLoader
> diff --git a/src/wok/plugins/kimchi/repositories.py
> b/src/wok/plugins/kimchi/repositories.py
> index c6e061f..5c395c2 100644
> --- a/src/wok/plugins/kimchi/repositories.py
> +++ b/src/wok/plugins/kimchi/repositories.py
> @@ -26,7 +26,7 @@ from ConfigParser import ConfigParser
> from wok.basemodel import Singleton
> from wok.exception import InvalidOperation, InvalidParameter
> from wok.exception import OperationFailed, NotFoundError,
> MissingParameter
> -from wok.utils import validate_repo_url
> +from wok.plugins.kimchi.utils import validate_repo_url
>
> from config import kimchiLock
> from yumparser import get_yum_repositories, write_repo_to_file
> diff --git a/src/wok/plugins/kimchi/utils.py
> b/src/wok/plugins/kimchi/utils.py
> index 92ca83a..4462ce6 100644
> --- a/src/wok/plugins/kimchi/utils.py
> +++ b/src/wok/plugins/kimchi/utils.py
> @@ -18,11 +18,19 @@
> # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
> 02110-1301 USA
> #
>
> +import contextlib
> +import os
> import re
> +import urllib2
> +from httplib import HTTPConnection, HTTPException
> +from urlparse import urlparse
>
> from wok.exception import InvalidParameter
>
>
> +MAX_REDIRECTION_ALLOWED = 5
> +
> +
> def _uri_to_name(collection, uri):
> expr = '/plugins/kimchi/%s/(.*?)$' % collection
> m = re.match(expr, uri)
> @@ -37,3 +45,53 @@ def template_name_from_uri(uri):
>
> def pool_name_from_uri(uri):
> return _uri_to_name('storagepools', uri)
> +
> +
> +def check_url_path(path, redirected=0):
> + if redirected > MAX_REDIRECTION_ALLOWED:
> + return False
> + try:
> + code = ''
> + parse_result = urlparse(path)
> + server_name = parse_result.netloc
> + urlpath = parse_result.path
> + if not urlpath:
> + # Just a server, as with a repo.
> + with contextlib.closing(urllib2.urlopen(path)) as res:
> + code = res.getcode()
> + else:
> + # socket.gaierror could be raised,
> + # which is a child class of IOError
> + conn = HTTPConnection(server_name, timeout=15)
> + # Don't try to get the whole file:
> + conn.request('HEAD', path)
> + response = conn.getresponse()
> + code = response.status
> + conn.close()
> + if code == 200:
> + return True
> + elif code == 301 or code == 302:
> + for header in response.getheaders():
> + if header[0] == 'location':
> + return check_url_path(header[1], redirected+1)
> + else:
> + return False
> + except (urllib2.URLError, HTTPException, IOError, ValueError):
> + return False
> + return True
> +
> +
> +def validate_repo_url(url):
> + url_parts = url.split('://') # [0] = prefix, [1] = rest of URL
> +
> + if url_parts[0] == '':
> + raise InvalidParameter("KCHREPOS0002E")
> +
> + if url_parts[0] in ['http', 'https', 'ftp']:
> + if not check_url_path(url):
> + raise InvalidParameter("WOKUTILS0001E", {'url': url})
> + elif url_parts[0] == 'file':
> + if not os.path.exists(url_parts[1]):
> + raise InvalidParameter("WOKUTILS0001E", {'url': url})
> + else:
> + raise InvalidParameter("KCHREPOS0002E")
> diff --git a/src/wok/plugins/kimchi/vmtemplate.py
> b/src/wok/plugins/kimchi/vmtemplate.py
> index 3edf3a5..3d0b442 100644
> --- a/src/wok/plugins/kimchi/vmtemplate.py
> +++ b/src/wok/plugins/kimchi/vmtemplate.py
> @@ -27,7 +27,7 @@ from lxml.builder import E
>
> from wok.exception import InvalidParameter, ImageFormatError,
> IsoFormatError
> from wok.exception import MissingParameter, OperationFailed
> -from wok.utils import check_url_path
> +from wok.plugins.kimchi.utils import check_url_path
>
> import imageinfo
> import osinfo
> diff --git a/src/wok/plugins/kimchi/xmlutils/disk.py
> b/src/wok/plugins/kimchi/xmlutils/disk.py
> index 126ce77..84be91d 100644
> --- a/src/wok/plugins/kimchi/xmlutils/disk.py
> +++ b/src/wok/plugins/kimchi/xmlutils/disk.py
> @@ -27,7 +27,7 @@ from lxml import objectify
> from lxml.builder import E
>
> from wok.exception import InvalidParameter, NotFoundError
> -from wok.utils import check_url_path
> +from wok.plugins.kimchi.utils import check_url_path
>
>
> BUS_TO_DEV_MAP = {'ide': 'hd', 'virtio': 'vd', 'scsi': 'sd'}
> diff --git a/src/wok/utils.py b/src/wok/utils.py
> index b426dfe..ccc8534 100644
> --- a/src/wok/utils.py
> +++ b/src/wok/utils.py
> @@ -21,7 +21,6 @@
> #
>
> import cherrypy
> -import contextlib
> import grp
> import os
> import psutil
> @@ -29,20 +28,16 @@ import pwd
> import re
> import subprocess
> import traceback
> -import urllib2
> import xml.etree.ElementTree as ET
> from cherrypy.lib.reprconf import Parser
> -from httplib import HTTPConnection, HTTPException
> from multiprocessing import Process, Queue
> from threading import Timer
> -from urlparse import urlparse
>
> from wok.asynctask import AsyncTask
> from wok.config import paths, PluginPaths
> from wok.exception import InvalidParameter, TimeoutExpired
>
>
> -MAX_REDIRECTION_ALLOWED = 5
> wok_log = cherrypy.log.error_log
> task_id = 0
>
> @@ -127,40 +122,6 @@ def import_module(module_name, class_name=''):
> return __import__(module_name, globals(), locals(),
> [class_name])
>
>
> -def check_url_path(path, redirected=0):
> - if redirected > MAX_REDIRECTION_ALLOWED:
> - return False
> - try:
> - code = ''
> - parse_result = urlparse(path)
> - server_name = parse_result.netloc
> - urlpath = parse_result.path
> - if not urlpath:
> - # Just a server, as with a repo.
> - with contextlib.closing(urllib2.urlopen(path)) as res:
> - code = res.getcode()
> - else:
> - # socket.gaierror could be raised,
> - # which is a child class of IOError
> - conn = HTTPConnection(server_name, timeout=15)
> - # Don't try to get the whole file:
> - conn.request('HEAD', path)
> - response = conn.getresponse()
> - code = response.status
> - conn.close()
> - if code == 200:
> - return True
> - elif code == 301 or code == 302:
> - for header in response.getheaders():
> - if header[0] == 'location':
> - return check_url_path(header[1], redirected+1)
> - else:
> - return False
> - except (urllib2.URLError, HTTPException, IOError, ValueError):
> - return False
> - return True
> -
> -
> def run_command(cmd, timeout=None, silent=False):
> """
> cmd is a sequence of command arguments.
> @@ -307,22 +268,6 @@ def probe_file_permission_as_user(file, user):
> return queue.get()
>
>
> -def validate_repo_url(url):
> - url_parts = url.split('://') # [0] = prefix, [1] = rest of URL
> -
> - if url_parts[0] == '':
> - raise InvalidParameter("KCHREPOS0002E")
> -
> - if url_parts[0] in ['http', 'https', 'ftp']:
> - if not check_url_path(url):
> - raise InvalidParameter("WOKUTILS0001E", {'url': url})
> - elif url_parts[0] == 'file':
> - if not os.path.exists(url_parts[1]):
> - raise InvalidParameter("WOKUTILS0001E", {'url': url})
> - else:
> - raise InvalidParameter("KCHREPOS0002E")
> -
> -
> def get_next_clone_name(all_names, basename, name_suffix=''):
> """Find the next available name for a cloned resource.
>
More information about the Kimchi-devel
mailing list