diff --git a/_modules/runtest/__init__.py b/_modules/runtest/__init__.py
index f95e556..3e1fb50 100644
--- a/_modules/runtest/__init__.py
+++ b/_modules/runtest/__init__.py
@@ -72,12 +72,17 @@
 def check_global_requirements(openstack_version=None, url=None):
     """Check if our installed requirements are satisfied with upstream.
     """
+
     if openstack_version is None:
       openstack_version = __salt__['pillar.get']('runtest:openstack_version')
     if url is None:
       url = '%s/%s/global-requirements.txt' % (REQUIREMENTS_LINK, openstack_version)
 
-    requirements_content = requests.get(url).text
+    resp = requests.get(url)
+    if resp.ok:
+      requirements_content = resp.text
+    else:
+        resp.raise_for_status()
     pkgs = requirements.get_installed_distributions()
 
     req_deps = {}
@@ -87,14 +92,14 @@
         if re.match(r'^%s[ ><!=]' % pkg.project_name, line):
             req_cond = line.split('#')[0].strip()
             try:
-                log.info("Checking requirement %(req_name)s, requirement"
-                         " %(req)s".format(req_name=pkg.project_name,
+                log.info("Checking requirement {req_name}s, requirement"
+                         " {req}s".format(req_name=pkg.project_name,
                                            req=req_cond))
                 pkg_resources.working_set.require(req_cond)
             except pkg_resources.VersionConflict as ve:
-                log.warning("Requirement %(req_name)s not satisfied. Required "
-                            "version %(req_cond)s. Installed version "
-                            "%(inst_version)s. Exception %(exc)s".format(
+                log.warning("Requirement {req_name}s not satisfied. Required "
+                            "version {req_cond}s. Installed version "
+                            "{inst_version}s. Exception {exc}s".format(
                                 req_name=pkg.project_name, req_cond=line,
                                 inst_version=pkg.version, exc=ve))
                 freq[pkg.project_name] = {'installed_version': pkg.version,
@@ -109,33 +114,39 @@
     """
     if openstack_version is None:
       openstack_version = __salt__['pillar.get']('runtest:openstack_version')
+
     if url is None:
       url = '%s/%s/upper-constraints.txt' % (REQUIREMENTS_LINK, openstack_version)
 
-    constraints_content = requests.get(url).text
+    resp = requests.get(url)
+    if resp.ok:
+      constraints_content = resp.text
+    else:
+        resp.raise_for_status()
     pkgs = requirements.get_installed_distributions()
 
     req_deps = {}
     freq = {}
     for pkg in pkgs:
       for line in constraints_content.splitlines():
-        if re.match(r'^%s[ ><!=]' % pkg.project_name, line):
+        if re.match(r'^%s[ ><!=]' % pkg.project_name, line, re.IGNORECASE):
             req_cond = line.split('#')[0].strip()
             try:
-                log.info("Checking requirement %(req_name)s, requirement"
-                         " %(req)s".format(req_name=pkg.project_name,
+                log.info("Checking requirement {req_name}s, requirement"
+                         " {req}s".format(req_name=pkg.project_name,
                                            req=req_cond))
                 pkg_resources.working_set.require(req_cond)
             except pkg_resources.VersionConflict as ve:
-                log.warning("Requirement %(req_name)s not satisfied. Required "
-                            "version %(req_cond)s. Installed version "
-                            "%(inst_version)s. Exception %(exc)s".format(
+                log.warning("Requirement {req_name}s not satisfied. Required "
+                            "version {req_cond}s. Installed version "
+                            "{inst_version}s. Exception {exc}s".format(
                                 req_name=pkg.project_name, req_cond=line,
                                 inst_version=pkg.version, exc=ve))
                 freq[pkg.project_name] = {'installed_version': pkg.version,
                                           'requirement': line,
-                                          'error': 've'}
-            except Exception as ex: {'error': ex,
-                                     'requirement': line,
-                                     'installed_version': pkg.version}
+                                          'error': str(ve)}
+            except Exception as ex:
+                freq[pkg.project_name] =  {'error': str(ex),
+                                           'requirement': line,
+                                           'installed_version': pkg.version}
     return freq
