[Kimchi-devel] [PATCH 3/4] Move validate_repo_url() and check_url_path() from Wok to Kimchi

Aline Manera alinefm at linux.vnet.ibm.com
Mon Oct 19 21:10:42 UTC 2015


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.
 
-- 
2.1.0




More information about the Kimchi-devel mailing list