summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Bahling <sbahling@suse.de>2015-04-19 12:30:50 +0200
committerScott Bahling <sbahling@suse.de>2015-04-19 12:30:50 +0200
commit5d1583fe035c8e646ab6beba2fde0b3bb5f87c12 (patch)
tree253050494fc9f509f7e9090a08ac4c7680352893
parent942ac9bdbe918873eb4f5984f87d54e1f93efc51 (diff)
downloadobsapi-5d1583fe035c8e646ab6beba2fde0b3bb5f87c12.tar.gz
obsapi-5d1583fe035c8e646ab6beba2fde0b3bb5f87c12.tar.xz
obsapi-5d1583fe035c8e646ab6beba2fde0b3bb5f87c12.zip
Add ObsApi.get_xml() method
get_xml will attempt to retrieve the xml response from the obs api. If response failes, a dummy, blank xml file will be returned. This makes the helper functions more robust against api connection errors. If query failes, empty data will be simply be returned to the client. The client is responsible for any response error checking. The 'response' property is added to the ObsApi. This holds the full requests response from the last api query. The client can check this property to test for query success when required.
-rw-r--r--obsapi/core.py41
1 files changed, 27 insertions, 14 deletions
diff --git a/obsapi/core.py b/obsapi/core.py
index 31782d9..a489b8e 100644
--- a/obsapi/core.py
+++ b/obsapi/core.py
@@ -126,9 +126,12 @@ class FileInfo(object):
class ObsApi(object):
+ default_xml = '<None/>'
+
def __init__(self, apiurl=None):
self.apiurl = apiurl or DEFAULTAPIURL
self.__get_auth()
+ self._response = None
def __get_auth(self):
if osc_conf:
@@ -147,13 +150,24 @@ class ObsApi(object):
def __api_get(self, api, payload=None):
url = '{0}/{1}'.format(self.apiurl, api)
r = requests.get(url, auth=self.auth, params=payload)
+ self._response = r
return r
+ @property
+ def response(self):
+ return self._response
+
+ def get_xml(self, api, payload=None):
+ r = self.__api_get(api, payload)
+ if not r.status_code == requests.codes.ok:
+ return self.default_xml
+
+ return r.text
+
def get_package_meta(self, prj, pkg):
api = '/source/{}/{}/_meta'.format(prj, pkg)
- r = self.__api_get(api)
- return r.text
+ return self.get_xml(api)
def ls(self, prj=None, pkg=None):
if prj and pkg:
@@ -165,16 +179,16 @@ class ObsApi(object):
def project_ls(self, prj):
api = '/source/{}'.format(prj)
- r = self.__api_get(api)
- d = etree.fromstring(r.text)
+ xml = self.get_xml(api)
+ d = etree.fromstring(xml)
lsitems = [e.get('name') for e in d.findall('entry')]
return lsitems
def package_ls(self, prj, pkg):
api = '/source/{}/{}'.format(prj, pkg)
- r = self.__api_get(api)
- d = etree.fromstring(r.text)
+ xml = self.get_xml(api)
+ d = etree.fromstring(xml)
directory = Directory(d.get('name'),
d.get('rev'),
d.get('vrev'),
@@ -192,8 +206,8 @@ class ObsApi(object):
def get_binaries(self, prj, pkg, repo, arch):
api = '/build/{}/{}/{}/{}'.format(prj, repo, arch, pkg)
- r = self.__api_get(api)
- blist = etree.fromstring(r.text)
+ xml = self.get_xml(api)
+ blist = etree.fromstring(xml)
binaries = [Binary(filename=i.get('filename'),
size=i.get('size'),
mtime=i.get('mtime'))
@@ -204,13 +218,13 @@ class ObsApi(object):
def get_binary_fileinfo(self, prj, pkg, repo, arch, binary):
payload = dict(view='fileinfo')
api = '/build/{}/{}/{}/{}/{}'.format(prj, repo, arch, pkg, binary)
- r = self.__api_get(api, payload)
- return FileInfo(r.text)
+ xml = self.get_xml(api, payload)
+ return FileInfo(xml)
def get_project_repos(self, prj):
api = '/build/{}'.format(prj)
- r = self.__api_get(api)
- directory = etree.fromstring(r.text)
+ xml = self.get_xml(api)
+ directory = etree.fromstring(xml)
entries = []
for entry in directory.findall('entry'):
@@ -244,8 +258,7 @@ class ObsApi(object):
def get_build_config(self, prj, repo):
api = '/build/{}/{}/_buildconfig'.format(prj, repo)
- r = self.__api_get(api)
- return r.text
+ return self.get_xml(api)
def get_vendor(self, prj, repo=None):
repo = repo or self.get_project_repos(prj)[0]