diff options
| author | Scott Bahling <sbahling@suse.de> | 2016-09-14 12:11:47 +0200 |
|---|---|---|
| committer | Scott Bahling <sbahling@suse.de> | 2016-09-14 12:11:47 +0200 |
| commit | 2f71f136702ba9fdf740ce9f2598cd804370516b (patch) | |
| tree | 62718a8ee094e052229f93dac3bb32e7e9078d2b | |
| parent | 525ac83bf2bb2c0a23ba78045cbfa6393a4cb2d8 (diff) | |
| download | obsapi-0.0.6.tar.gz obsapi-0.0.6.tar.xz obsapi-0.0.6.zip | |
Implement locking api; refactor ObsSourceApi get/put/post callsobsapi-0.0.6
| -rw-r--r-- | obsapi/core.py | 44 | ||||
| -rw-r--r-- | obsapi/httpapi.py | 33 | ||||
| -rw-r--r-- | obsapi/sourceapi.py | 18 | ||||
| -rw-r--r-- | test/test_api.py | 24 |
4 files changed, 90 insertions, 29 deletions
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('<lock><enable/></lock>') - 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=''): diff --git a/test/test_api.py b/test/test_api.py index 054a7df..e32c66e 100644 --- a/test/test_api.py +++ b/test/test_api.py @@ -84,3 +84,27 @@ def test_get_binary_fileinfo(): assert bfinfo.source == 'suse-hello' binary = '_statistics' bfinfo = api.get_binary_fileinfo(prj, pkg, repo, arch, binary) + + +def test_lock_project(): + api.lock(prj) + xml = api.get_meta(prj) + print(xml) + meta = etree.fromstring(xml) + lock = meta.find('lock') + assert lock is not None + assert lock.find('enable') is not None + + +def test_unlock_project(): + api.unlock(prj) + meta = etree.fromstring(api.get_meta(prj)) + lock = meta.find('lock') + assert lock is None + + +def test_project_locked(): + api.lock(prj) + assert api.locked(prj) is True + api.unlock(prj) + assert api.locked(prj) is False |
