summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Bahling <sbahling@suse.de>2016-09-14 12:11:47 +0200
committerScott Bahling <sbahling@suse.de>2016-09-14 12:11:47 +0200
commit2f71f136702ba9fdf740ce9f2598cd804370516b (patch)
tree62718a8ee094e052229f93dac3bb32e7e9078d2b
parent525ac83bf2bb2c0a23ba78045cbfa6393a4cb2d8 (diff)
downloadobsapi-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.py44
-rw-r--r--obsapi/httpapi.py33
-rw-r--r--obsapi/sourceapi.py18
-rw-r--r--test/test_api.py24
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