summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--obsapi/core.py16
-rw-r--r--obsapi/jobhist.py37
-rw-r--r--test/test_jobhist.py34
3 files changed, 87 insertions, 0 deletions
diff --git a/obsapi/core.py b/obsapi/core.py
index 26b7b7e..2baf072 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 obsapi.jobhist import JobHist
from .null import Null
@@ -411,3 +412,18 @@ class ObsApi(object):
params['cmd'] = 'remove_flag'
return self.source.post(prj, pkg, **params)
+
+ def get_jobhistory_list(self, prj, repo, arch, package=None, code=None, limit=None):
+ '''Get build job history for packages in project
+
+ :param prj: OBS Project
+ :param repo: OBS Repository
+ "param arch: Architecture
+ :param package: OBS Package (optional, limit result to this package)
+ :param limit: Number of jot histories to limit to (optional)
+
+ :returns: List of JobHist objects
+ '''
+ xml = self.build.get_jobhistory(prj, repo, arch, pkg=package, code=code, limit=limit)
+ root = xml2etree(xml)
+ return [JobHist(jh) for jh in root.findall('jobhist')]
diff --git a/obsapi/jobhist.py b/obsapi/jobhist.py
new file mode 100644
index 0000000..be4577f
--- /dev/null
+++ b/obsapi/jobhist.py
@@ -0,0 +1,37 @@
+# -*- coding: utf-8 -*-
+
+from lxml import etree
+from datetime import datetime
+from obsapi.helpers import xml2etree
+
+
+class JobHist():
+
+ def __init__(self, element):
+ self.root = xml2etree(element)
+
+ def __str__(self):
+ return self.xml
+
+ def __getattr__(self, attr):
+ value = self.root.get(attr)
+ if value is None:
+ raise AttributeError
+
+ return value
+
+ @property
+ def starttime(self):
+ return datetime.fromtimestamp(int(self.root.get('starttime')))
+
+ @property
+ def endtime(self):
+ return datetime.fromtimestamp(int(self.root.get('endtime')))
+
+ @property
+ def readytime(self):
+ return datetime.fromtimestamp(int(self.root.get('readytime')))
+
+ @property
+ def xml(self):
+ return etree.tostring(self.root)
diff --git a/test/test_jobhist.py b/test/test_jobhist.py
new file mode 100644
index 0000000..79764fb
--- /dev/null
+++ b/test/test_jobhist.py
@@ -0,0 +1,34 @@
+import pytest
+from lxml import etree
+from datetime import datetime
+from obsapi.jobhist import JobHist
+
+
+@pytest.fixture
+def jhist_xml():
+ return '''<jobhist package="chromium" rev="16" srcmd5="407c32b2d472dde5e18703b1bedba963" versrel="80.0.3987.149-1" bcnt="1" readytime="1585238949" starttime="1585238959" endtime="1585253844" code="succeeded" uri="http://192.168.131.81:34165" workerid="sheep81:4" hostarch="x86_64" reason="source change" verifymd5="407c32b2d472dde5e18703b1bedba963" />'''
+
+
+def test_jobhist(jhist_xml):
+ jhist = JobHist(jhist_xml)
+ root = etree.fromstring(jhist_xml)
+ assert jhist.package == root.get('package')
+ assert jhist.rev == root.get('rev')
+ assert jhist.srcmd5 == root.get('srcmd5')
+ assert jhist.versrel == root.get('versrel')
+ assert jhist.bcnt == root.get('bcnt')
+ assert jhist.readytime == datetime.fromtimestamp(int(root.get('readytime')))
+ assert jhist.starttime == datetime.fromtimestamp(int(root.get('starttime')))
+ assert jhist.endtime == datetime.fromtimestamp(int(root.get('endtime')))
+ assert jhist.code == root.get('code')
+ assert jhist.uri == root.get('uri')
+ assert jhist.workerid == root.get('workerid')
+ assert jhist.hostarch == root.get('hostarch')
+ assert jhist.reason == root.get('reason')
+ assert jhist.verifymd5 == root.get('verifymd5')
+
+
+def test_jobhist_invalid_attribute(jhist_xml):
+ jhist = JobHist(jhist_xml)
+ with pytest.raises(AttributeError):
+ assert jhist.invalid_attribute == 'Error'