summaryrefslogtreecommitdiff
path: root/obsapi
diff options
context:
space:
mode:
authorScott Bahling <sbahling@suse.com>2020-02-12 18:38:33 +0100
committerScott Bahling <sbahling@suse.com>2020-02-12 18:38:33 +0100
commit7806de5f05bbc153b8405f1e693e1ae202e2a54c (patch)
tree44097318002add0f5e076cb057d10e9edca06ba4 /obsapi
parent9b0d40c28f86e58df131b7971e2c0640d77a01a1 (diff)
downloadobsapi-7806de5f05bbc153b8405f1e693e1ae202e2a54c.tar.gz
obsapi-7806de5f05bbc153b8405f1e693e1ae202e2a54c.tar.xz
obsapi-7806de5f05bbc153b8405f1e693e1ae202e2a54c.zip
Implement sub-api callbackso
When an api object makes an API request to the OBS server, in addition to returning the results, it sends a reference to itself to the registered callback function (if set). We use this to track the last api object called so we can access the last raw request response.
Diffstat (limited to 'obsapi')
-rw-r--r--obsapi/core.py19
-rw-r--r--obsapi/httpapi.py30
2 files changed, 46 insertions, 3 deletions
diff --git a/obsapi/core.py b/obsapi/core.py
index c81f699..209aab2 100644
--- a/obsapi/core.py
+++ b/obsapi/core.py
@@ -8,6 +8,7 @@ from obsapi.sourceapi import ObsSourceApi
from obsapi.buildapi import ObsBuildApi
from obsapi.repoflags import RepoFlags
from obsapi.fileinfo import FileInfo
+from .null import Null
LSItem = namedtuple('LSItem', 'name md5 size mtime')
@@ -34,13 +35,27 @@ class ObsApi(object):
def __init__(self, apiurl=None):
self.apiurl = apiurl or DEFAULTAPIURL
+ self.lastapi = Null
+ self._response = Null
+
+ # init the source api
self.source = ObsSourceApi(self.apiurl)
- self.build = ObsBuildApi(self.apiurl)
self.source.retries = 0
self.source.verify_ssl = True
+ self.source.set_callback(self._api_callback)
+
+ # init the build api
+ self.build = ObsBuildApi(self.apiurl)
self.build.retries = 0
self.build.verify_ssl = True
- self.lastapi = None
+ self.build.set_callback(self._api_callback)
+
+ def _api_callback(self, api_instance):
+ self.lastapi = api_instance
+
+ @property
+ def response(self):
+ return self.lastapi.response
def get_meta(self, prj, pkg=None):
return self.source.get_meta(prj, pkg=pkg)
diff --git a/obsapi/httpapi.py b/obsapi/httpapi.py
index db52050..b73b547 100644
--- a/obsapi/httpapi.py
+++ b/obsapi/httpapi.py
@@ -2,9 +2,11 @@
#
import requests
import re
+import types
+from functools import wraps
+from obsapi.null import Null
from obsapi.logger import logger
from requests.auth import HTTPBasicAuth
-from .null import Null
try:
import osc.conf as osc_conf
@@ -33,6 +35,29 @@ class ObsHttpApi(object):
self._response = Null()
self.retries = 0
self.verify_ssl = True
+ self._callback_function = None
+
+ def _with_callback(func):
+ @wraps(func)
+ def wrapper(inst, *args, **kwargs):
+ r = func(inst, *args, **kwargs)
+ inst._do_callback()
+ return r
+ return wrapper
+
+ def _do_callback(self):
+ if self._callback_function is not None:
+ try:
+ self._callback_function(self)
+ except Exception as e:
+ raise e
+
+ def set_callback(self, func):
+ if isinstance(func, (types.FunctionType, types.MethodType)):
+ self._callback_function = func
+ else:
+ raise ValueError('Callback expects function or method type, '
+ 'got {}'.format(type(func)))
@property
def __auth(self):
@@ -57,6 +82,7 @@ class ObsHttpApi(object):
return self._auth[self.apiurl]
+ @_with_callback
def __api_get(self, api, params=None):
url = '{0}{1}{2}'.format(self.apiurl, self.rootapi, api)
@@ -79,6 +105,7 @@ class ObsHttpApi(object):
return r
+ @_with_callback
def __api_put(self, api, data, params=None):
url = '{0}{1}{2}'.format(self.apiurl, self.rootapi, api)
@@ -91,6 +118,7 @@ class ObsHttpApi(object):
return r
+ @_with_callback
def __api_post(self, api, data, params=None):
url = '{0}{1}{2}'.format(self.apiurl, self.rootapi, api)