Common functions, classes, exceptions.
"""
+import sys
+import time
import json
+from functools import wraps
OBS_PROJECT_PREFIX = "home:prerelease:"
if submission.startswith('submitgroup'):
delete_project(obs, submission, target)
+class CancelRetryError(Exception):
+ """Exception for handling cancelling of the retry loop. Needed for
+ transparently re-raising the previous exception."""
+ def __init__(self):
+ Exception.__init__(self)
+ self.typ, self.val, self.backtrace = sys.exc_info()
+
+def retry(exceptions, tries=10, sleep=1):
+ """Decorator for re-trying function calls"""
+ def decorator(func):
+ """The "real" decorator function"""
+ @wraps(func)
+ def wrap(*args, **kwargs):
+ """Wrapper for re-trying func"""
+ for attempt in range(1, tries + 1):
+ try:
+ return func(*args, **kwargs)
+ except CancelRetryError as err:
+ raise err.typ, err.val, err.backtrace
+ except exceptions as err:
+ if attempt >= tries:
+ raise
+ elif sleep:
+ time.sleep(sleep)
+ return wrap
+ return decorator
+
from base64 import b64encode
from xml.etree import cElementTree as ET
from StringIO import StringIO
+from urllib2 import HTTPError
from osc import core
from gitbuildsys.oscapi import OSC, OSCError
from gitbuildsys.utils import Temp
-from repa.common import RepaException
+from repa.common import RepaException, retry
OSCRC_TEMPLATE = """[general]
OSC.__init__(self, apiurl, self.oscrcpath)
+ @retry((OSCError, HTTPError))
+ def get_descr(self, project):
+ """Wrapper around get_description to be able to use @retry."""
+ return self.get_description(project)
+
def get_projects(self, regexp='', processes=0):
"""List projects with attributes."""
try:
for project in projects:
if regexp and re.match(regexp, project):
processes[project] = (
- pool.apply_async(self.get_description, [project]),
+ pool.apply_async(self.get_descr, [project]),
pool.apply_async(self.get_build_results, [project]))
for project in projects:
yield (project, processes[project][0].get(),
processes[project][1].get())
else:
- yield (project, self.get_description(project),
+ yield (project, self.get_descr(project),
self.get_build_results(project))
+ @retry((OSCError, HTTPError))
def get_build_results(self, prj):
"""Get project build results."""
meta = core.show_prj_results_meta(self.apiurl, prj)