From 2f71f136702ba9fdf740ce9f2598cd804370516b Mon Sep 17 00:00:00 2001 From: Scott Bahling Date: Wed, 14 Sep 2016 12:11:47 +0200 Subject: Implement locking api; refactor ObsSourceApi get/put/post calls --- obsapi/core.py | 44 ++++++++++++++++++++++++++------------------ obsapi/httpapi.py | 33 +++++++++++++++++++++++++++------ obsapi/sourceapi.py | 18 +++++++++++++----- 3 files changed, 66 insertions(+), 29 deletions(-) (limited to 'obsapi') diff --git a/obsapi/core.py b/obsapi/core.py index 77b6517..5200efe 100644 --- a/obsapi/core.py +++ b/obsapi/core.py @@ -144,10 +144,10 @@ class ObsApi(object): return etree.parse(BytesIO(xml), parser).xpath('.')[0] def get_meta(self, prj, pkg=None): - return self.source.get_meta(prj, pkg) + return self.source.get_meta(prj, pkg=pkg) def put_meta(self, prj, pkg=None, xml=None): - return self.source.put_meta(prj, pkg, data=xml) + return self.source.put_meta(prj, pkg=pkg, xml=xml) def ls(self, prj=None, pkg=None, repo=None, arch=None): if repo and arch: @@ -167,7 +167,7 @@ class ObsApi(object): return lsitems def package_ls(self, prj, pkg): - xml = self.source.get(prj, pkg) + xml = self.source.get(prj, pkg=pkg) d = etree.fromstring(xml) directory = Directory(d.get('name'), d.get('rev'), @@ -184,8 +184,11 @@ class ObsApi(object): ) return (directory, lsitems) - def get_source_info(self, prj, pkg): - xml = self.source.get(prj, pkg, view='info') + def get_source_info(self, prj, pkg, rev=None): + if rev is None: + xml = self.source.get(prj, pkg=pkg, view='info') + else: + xml = self.source.get(prj, pkg=pkg, view='info', rev=rev) tree = etree.fromstring(xml) sinfo = SourceInfo(tree.get('package'), tree.get('rev'), @@ -287,14 +290,15 @@ class ObsApi(object): return vendor + def locked(self, prj, pkg=None): + meta = self.__xml2etree(self.get_meta(prj, pkg)) + if meta.find('lock') is not None: + return True + return False + def lock(self, prj, pkg=None): - if pkg is None: - xml = self.get_project_meta(prj) - put = self.put_project_meta - else: - xml = self.get_package_meta(prj, pkg) - put = self.put_package_meta + xml = self.get_meta(prj, pkg) meta = self.__xml2etree(xml) if meta.tag not in ['project', 'package']: if pkg: @@ -302,14 +306,18 @@ class ObsApi(object): else: raise Exception('Failed to lock project. %s' % prj) - if meta.find('lock') is not None: + if self.locked(prj, pkg): return 'Already Locked' - lock = self.__xml2etree('') - meta.append(lock) - if pkg: - r = put(prj, pkg, etree.tostring(meta)) - else: - r = put(prj, etree.tostring(meta)) + lock = etree.SubElement(meta, 'lock') + etree.SubElement(lock, 'enable') + r = self.put_meta(prj, pkg, etree.tostring(meta)) return r + + def unlock(self, prj, pkg=None, comment=None): + if not self.locked(prj, pkg): + return + + comment = comment or "Unlock" + self.source.post(prj, pkg, cmd="unlock", comment="Unlock") diff --git a/obsapi/httpapi.py b/obsapi/httpapi.py index 81a8fd0..8334224 100644 --- a/obsapi/httpapi.py +++ b/obsapi/httpapi.py @@ -2,6 +2,7 @@ # import requests from requests.auth import HTTPBasicAuth +from null import Null try: import osc.conf as osc_conf @@ -20,7 +21,7 @@ class ObsHttpApi(object): def __init__(self, apiurl=None): self.apiurl = apiurl or DEFAULTAPIURL self.__get_auth() - self._response = None + self._response = Null() self.retries = 3 self.verify_ssl = True @@ -41,8 +42,9 @@ class ObsHttpApi(object): def __api_get(self, api, params=None): + url = '{0}{1}{2}'.format(self.apiurl, self.rootapi, api) + def try_get(): - url = '{0}{1}{2}'.format(self.apiurl, self.rootapi, api) r = requests.get(url, auth=self.auth, params=params, @@ -62,17 +64,30 @@ class ObsHttpApi(object): return r - def __api_put(self, api, data): + def __api_put(self, api, data, params=None): url = '{0}{1}{2}'.format(self.apiurl, self.rootapi, api) r = requests.put(url, auth=self.auth, data=data, + params=params, verify=self.verify_ssl) self._response = r return r + def __api_post(self, api, data, params=None): + + url = '{0}{1}{2}'.format(self.apiurl, self.rootapi, api) + r = requests.post(url, + auth=self.auth, + data=data, + params=params, + verify=self.verify_ssl) + self._response = r + + return r + @property def response(self): '''Return requests response from last api query''' @@ -92,12 +107,18 @@ class ObsHttpApi(object): api = self.__api(*args) r = self.__api_get(api, params=params) if not self.success: - print self.response return self.default_xml return r.text - def put(self, args, data): + def put(self, *args, **kwargs): + data = kwargs.pop('data', None) + api = self.__api(*args) + r = self.__api_put(api, data=data, params=kwargs) + return r + + def post(self, *args, **kwargs): + data = kwargs.pop('data', None) api = self.__api(*args) - r = self.__api_put(api, data) + r = self.__api_post(api, data=data, params=kwargs) return r diff --git a/obsapi/sourceapi.py b/obsapi/sourceapi.py index 23fee99..b49712d 100644 --- a/obsapi/sourceapi.py +++ b/obsapi/sourceapi.py @@ -13,16 +13,24 @@ class ObsSourceApi(ObsHttpApi): def __put(self, *args, **kwargs): return super(ObsSourceApi, self).put(*args, **kwargs) - def get(self, prj, pkg='', filename='', view=None): - return self.__get(prj, pkg, filename, view=view) + def __post(self, *args, **kwargs): + return super(ObsSourceApi, self).post(*args, **kwargs) - def put(self, prj, pkg, filename, data): - return self.__put(prj, pkg, filename, data=data) + def get(self, prj, pkg=None, filename=None, **kwargs): + return self.__get(prj, pkg, filename, **kwargs) + + def put(self, prj, pkg=None, filename=None, data=None, **kwargs): + return self.__put(prj, pkg, filename, data, **kwargs) + + def post(self, prj, pkg=None, filename=None, data=None, **kwargs): + return self.__post(prj, pkg, filename, data, **kwargs) def get_meta(self, prj, pkg=''): return self.__get(prj, pkg, '_meta') - def put_meta(self, prj, xml, pkg=None): + def put_meta(self, prj, xml=None, pkg=None): + if xml is None: + return None return self.__put(prj, pkg, '_meta', data=xml) def get_attribute(self, prj, pkg='', binary='', attribute=''): -- cgit v1.2.3