common/buildservice.py refactoring and cleanups
authorLingchaox Xin <lingchaox.xin@intel.com>
Mon, 21 Jan 2013 10:21:32 +0000 (18:21 +0800)
committerLin Yang <lin.a.yang@intel.com>
Thu, 28 Feb 2013 08:00:35 +0000 (16:00 +0800)
Change-Id: I4f7161e0252d66a702a91b6972d7aab05cfb6d0a

common/buildservice.py

index 3be77de..280e67c 100644 (file)
@@ -1,9 +1,8 @@
 #
-# buildservice.py - Buildservice API support for Yabsc
+# buildservice.py - Buildservice API
 #
 
-# Copyright (C) 2008 James Oakley <jfunk@opensuse.org>
-# Copyright (C) 2010, 2011, 2012 Intel, Inc.
+# Copyright (C) 2010, 2011, 2012, 2013 Intel, Inc.
 
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
 
 import os
 import string
-import sys
 import shutil
-import tempfile
-import time
 import urllib2
 import M2Crypto
 import xml.etree.cElementTree as ElementTree
-from collections import defaultdict
-from pwd import getpwnam
 
-import errors
-from osc import conf, core
-
-class ObsError(Exception):
-    pass
-
-# Injection code for osc.core to fix the empty XML bug
-def solid_get_files_meta(self, revision='latest', skip_service=True):
-    from time import sleep
+from gitbuildsys.errors import ObsError
+from gitbuildsys.oscapi import OSC
 
-    retry_count = 3
-    while retry_count > 0:
-        fm = core.show_files_meta(self.apiurl, self.prjname, self.name,
-                                  revision=revision, meta=self.meta)
-        try:
-            root = core.ET.fromstring(fm)
-            break
-        except:
-            print 'corrupted or empty obs server response ,retrying ...'
-            sleep(1)
-            retry_count -= 1
-
-    if not retry_count:
-        # all the re-try failed, abort
-        raise ObsError('cannet fetch files meta xml from server')
-
-    # look for "too large" files according to size limit and mark them
-    for e in root.findall('entry'):
-        size = e.get('size')
-        if size and self.size_limit and int(size) > self.size_limit \
-            or skip_service and (e.get('name').startswith('_service:') or e.get('name').startswith('_service_')):
-            e.set('skipped', 'true')
-    return core.ET.tostring(root)
-
-core.Package.get_files_meta = solid_get_files_meta
-
-class _Metafile:
-    """
-    _Metafile(url, input, change_is_required=False, file_ext='.xml')
-
-    Implementation on osc.core.metafile that does not print to stdout
-    """
-
-    def __init__(self, url, input, change_is_required=False, file_ext='.xml'):
-        self.url = url
-        self.change_is_required = change_is_required
-
-        (fd, self.filename) = tempfile.mkstemp(prefix = 'osc_metafile.', suffix = file_ext, dir = '/tmp')
-
-        f = os.fdopen(fd, 'w')
-        f.write(''.join(input))
-        f.close()
-
-        self.hash_orig = core.dgst(self.filename)
-
-    def sync(self):
-        hash = core.dgst(self.filename)
-        if self.change_is_required == True and hash == self.hash_orig:
-            os.unlink(self.filename)
-            return True
-
-        # don't do any exception handling... it's up to the caller what to do in case
-        # of an exception
-        core.http_PUT(self.url, file=self.filename)
-        os.unlink(self.filename)
-        return True
-
-# helper functions for class _ProjectFlags
-def _flag2bool(flag):
-    """
-    _flag2bool(flag) -> Boolean
-    Returns a boolean corresponding to the string 'enable', or 'disable'
-    """
+from osc import conf, core
 
-    if flag == 'enable':
-        return True
-    elif flag == 'disable':
-        return False
-
-def _bool2flag(b):
-    """
-    _bool2flag(b) -> String
-
-    Returns 'enable', or 'disable' according to boolean value b
-    """
-    if b == True:
-        return 'enable'
-    elif b == False:
-        return 'disable'
-
-class _ProjectFlags(object):
-    """
-    _ProjectFlags(bs, project)
-
-    Represents the flags in project through the BuildService object bs
-    """
-
-    def __init__(self, bs, project):
-        self.bs = bs
-        self.tree = ElementTree.fromstring(self.bs.getProjectMeta(project))
-
-        # The "default" flags, when undefined
-        self.defaultflags = {'build': True,
-                             'publish': True,
-                             'useforbuild': True,
-                             'debuginfo': False}
-
-        # Figure out what arches and repositories are defined
-        self.arches = {}
-        self.repositories = {}
-
-        # Build individual repository list
-        for repository in self.tree.findall('repository'):
-            repodict = {'arches': {}}
-            self.__init_flags_in_dict(repodict)
-            for arch in repository.findall('arch'):
-                repodict['arches'][arch.text] = {}
-                self.__init_flags_in_dict(repodict['arches'][arch.text])
-                # Add placeholder in global arches
-                self.arches[arch.text] = {}
-            self.repositories[repository.get('name')] = repodict
-
-        # Initialise flags in global arches
-        for archdict in self.arches.values():
-            self.__init_flags_in_dict(archdict)
-
-        # A special repository representing the global and global arch flags
-        self.allrepositories = {'arches': self.arches}
-        self.__init_flags_in_dict(self.allrepositories)
-
-        # Now populate the structures from the xml data
-        for flagtype in ('build', 'publish', 'useforbuild', 'debuginfo'):
-            flagnode = self.tree.find(flagtype)
-            if flagnode:
-                for node in flagnode:
-                    repository = node.get('repository')
-                    arch = node.get('arch')
-
-                    if repository and arch:
-                        self.repositories[repository]['arches'][arch][flagtype] = _flag2bool(node.tag)
-                    elif repository:
-                        self.repositories[repository][flagtype] = _flag2bool(node.tag)
-                    elif arch:
-                        self.arches[flagtype] = _flag2bool(node.tag)
-                    else:
-                        self.allrepositories[flagtype] = _flag2bool(node.tag)
-
-    def __init_flags_in_dict(self, d):
-        """
-        __init_flags_in_dict(d)
+class BuildService(OSC):
+    """Interface to Build Service API"""
 
-        Initialize all build flags to None in d
-        """
-        d.update({'build': None,
-                  'publish': None,
-                  'useforbuild': None,
-                  'debuginfo': None})
+    def __init__(self, apiurl, oscrc):
+       OSC.__init__(self, apiurl, oscrc)
 
-    def save(self):
+    def getSrcFileList(self, project, package, revision=None):
+        """ get source file list of prj/pac
         """
-        save()
+        return core.meta_get_filelist(self.apiurl, project, package, expand=True, revision=revision)
 
-        Save flags
+    def getSrcFileContent(self, project, package, path, revision=None):
+        """ Cat remote file
         """
 
-        for flagtype in ('build', 'publish', 'useforbuild', 'debuginfo'):
-            # Clear if set
-            flagnode = self.tree.find(flagtype)
-            if flagnode:
-                self.tree.remove(flagnode)
-
-            # Generate rule nodes
-            rulenodes = []
-
-            # globals
-            if self.allrepositories[flagtype] != None:
-                rulenodes.append(ElementTree.Element(_bool2flag(self.allrepositories[flagtype])))
-            for arch in self.arches:
-                if self.arches[arch][flagtype] != None:
-                    rulenodes.append(ElementTree.Element(_bool2flag(self.arches[arch][flagtype]), arch=arch))
-
-            # repositories
-            for repository in self.repositories:
-                if self.repositories[repository][flagtype] != None:
-                    rulenodes.append(ElementTree.Element(_bool2flag(self.repositories[repository][flagtype]), repository=repository))
-                for arch in self.repositories[repository]['arches']:
-                    if self.repositories[repository]['arches'][arch][flagtype] != None:
-                        rulenodes.append(ElementTree.Element(_bool2flag(self.repositories[repository]['arches'][arch][flagtype]), arch=arch, repository=repository))
-
-            # Add nodes to tree
-            if rulenodes:
-                from pprint import pprint
-                pprint(rulenodes)
-                flagnode = ElementTree.Element(flagtype)
-                self.tree.insert(3, flagnode)
-                for rulenode in rulenodes:
-                    flagnode.append(rulenode)
-
-        print ElementTree.tostring(self.tree)
-
-class BuildService(object):
-    """Interface to Build Service API"""
-
-    def __init__(self, apiurl=None, oscrc=None):
-        if oscrc:
-            try:
-                conf.get_config(override_conffile = oscrc)
-            except OSError, e:
-                if e.errno == 1:
-                    # permission problem, should be the chmod(0600) issue
-                    raise RuntimeError, 'Current user has no write permission for specified oscrc: %s' % oscrc
-
-                raise # else
-            except urllib2.URLError:
-                raise errors.ObsError("invalid service apiurl: %s" % apiurl)
-        else:
-            conf.get_config()
-
-        if apiurl:
-            self.apiurl = apiurl
+        rev = core.show_upstream_xsrcmd5(self.apiurl, project, package, revision=revision)
+        if rev:
+            query = { 'rev': rev }
         else:
-            self.apiurl = conf.config['apiurl']
+            query = None
 
-    def getAPIServerList(self):
-        """getAPIServerList() -> list
+        u = core.makeurl(self.apiurl, ['source', project, package, core.pathname2url(path)], query=query)
 
-        Get list of API servers configured in .oscrc
-        """
-        apiservers = []
-        for host in conf.config['api_host_options'].keys():
-            apiurl = "%s://%s" % (conf.config['scheme'], host)
-        return apiservers
+        content = ''
+        for buf in core.streamfile(u, core.http_GET, core.BUFSIZE):
+            content += buf
 
-    # the following two alias api are added temporarily for compatible safe
-    def is_new_package(self, dst_project, dst_package):
-        return self.isNewPackage(dst_project, dst_package)
-    def gen_req_info(self, reqid, show_detail = True):
-        return self.genRequestInfo(reqid, show_detail)
+        # return unicode str
+        return content.decode('utf8')
 
     def isNewPackage(self, dst_project, dst_package):
         """Check whether the dst pac is a new one
@@ -301,10 +91,10 @@ class BuildService(object):
             if e.code == 404:
                 new_prj = True
             else:
-                raise errors.ObsError("%s" % e)
+                raise ObsError("%s" % e)
         except (urllib2.URLError, M2Crypto.m2urllib2.URLError, \
                                   M2Crypto.SSL.SSLError), e:
-            raise errors.ObsError("%s" % e)
+            raise ObsError("%s" % e)
         return new_prj
 
     def genRequestInfo(self, reqid, show_detail = True):
@@ -334,7 +124,7 @@ class BuildService(object):
             return reqdiff
 
         def _gen_server_diff(req):
-            """ Reserved getter: get req diff, if and only if the recommanded getter failed 
+            """ Reserved getter: get req diff, if and only if the recommanded getter failed
             """
             reqdiff = ''
 
@@ -447,19 +237,6 @@ class BuildService(object):
                                           dst_prj, dst_pkg,
                                           msg, orev=orev, src_update=src_update)
 
-    def reqAccept(self, reqid, msg=''):
-        """ This method is called to accept a request
-            Success: return None
-            Failed:  return string of error message
-        """
-
-        try:
-            core.change_request_state(self.apiurl, reqid, 'accepted', message=msg, supersed=None)
-        except Exception, e:
-            return str(e)
-
-        return None
-
     def reqDecline(self, reqid, msg=''):
         """ This method is called to decline a request
             Success: return None
@@ -473,39 +250,6 @@ class BuildService(object):
 
         return None
 
-    def reqRevoke(self, reqid, msg=''):
-        """ This method is called to revoke a request
-            Success: return None
-            Failed:  return string of error message
-        """
-
-        try:
-            core.change_request_state(self.apiurl, reqid, 'revoked', message=msg, supersed=None)
-        except Exception, e:
-            return str(e)
-
-        return None
-
-    def reqReview(self, reqid, user='', group='', msg=''):
-        """ This method is called to add review msg to a request
-            Success: return None
-            Failed:  return string of error message
-        """
-        try:
-            query = { 'cmd': 'addreview' }
-            if user:
-                query['by_user'] = user
-            if group:
-                query['by_group'] = group
-            u = core.makeurl(self.apiurl, ['request', reqid], query=query)
-            f = core.http_POST(u, data=msg)
-            root = ElementTree.parse(f).getroot()
-            root.get('code')
-        except Exception, e:
-            return str(e)
-
-        return None
-
     def reqSupersede(self, reqid, msg='', supersed=None):
         """ This method is called to supersede a request
             Success: return None
@@ -518,163 +262,6 @@ class BuildService(object):
 
         return None
 
-    def getSrcFileList(self, project, package, revision=None):
-        """ get source file list of prj/pac
-        """
-
-        return core.meta_get_filelist(self.apiurl, project, package, expand=True, revision=revision)
-
-    def getSrcFileContent(self, project, package, path, revision=None):
-        """ Cat remote file
-        """
-
-        rev = core.show_upstream_xsrcmd5(self.apiurl, project, package, revision=revision)
-        if rev:
-            query = { 'rev': rev }
-        else:
-            query = None
-
-        u = core.makeurl(self.apiurl, ['source', project, package, core.pathname2url(path)], query=query)
-
-        content = ''
-        for buf in core.streamfile(u, core.http_GET, core.BUFSIZE):
-            content += buf
-
-        # return unicode str
-        return content.decode('utf8')
-
-    def getSrcFileChecksum(self, project, package, path, revision=None):
-        """ getSrcFileChecksum(project, package, path, revision=None) -> string
-            returns source md5 of a source file
-        """
-
-        query = {}
-        query['expand'] = 1
-        if revision:
-            query['rev'] = revision
-
-        u = core.makeurl(self.apiurl, ['source', project, package], query=query)
-        f = core.http_GET(u)
-        root = ElementTree.parse(f).getroot()
-
-        for node in root.findall('entry'):
-            if node.get('name') == path:
-                return node.get('md5')
-
-        return None
-
-    def getPackageChecksum(self, project, package, revision=None):
-        """ getPackageChecksum(project, package, revision=None) -> string
-            returns srcmd5 of a package
-        """
-
-        query = {}
-        query['expand'] = 1
-        if revision:
-            query['rev'] = revision
-
-        u = core.makeurl(self.apiurl, ['source', project, package], query=query)
-        f = core.http_GET(u)
-        root = ElementTree.parse(f).getroot()
-
-        return root.get('srcmd5')
-
-    def getLinkinfo(self, project, package, revision=None):
-        """ getLinkinfo(project, package, revision=None) -> (linked_prj, linked_pkg, linked_srcmd5)
-            returns link info of a prj/pkg
-        """
-
-        query = {}
-        query['expand'] = 1
-        if revision:
-            query['rev'] = revision
-
-        u = core.makeurl(self.apiurl, ['source', project, package], query=query)
-        f = core.http_GET(u)
-        root = ElementTree.parse(f).getroot()
-
-        for node in root.findall('linkinfo'):
-            return (node.get('project'), node.get('package'), node.get('srcmd5'))
-
-        return None
-
-    def getUserData(self, user, *tags):
-        """getUserData() -> str
-
-        Get the user data
-        """
-        return core.get_user_data(self.apiurl, user, *tags)
-
-    def getUserName(self):
-        """getUserName() -> str
-
-        Get the user name associated with the current API server
-        """
-        return conf.config['api_host_options'][self.apiurl]['user']
-
-    def getProjectList(self):
-        """getProjectList() -> list
-
-        Get list of projects
-        """
-        return [project for project in core.meta_get_project_list(self.apiurl) if project != 'deleted']
-
-    def getWatchedProjectList(self):
-        """getWatchedProjectList() -> list
-
-        Get list of watched projects
-        """
-        username = self.getUserName()
-        tree = ElementTree.fromstring(''.join(core.get_user_meta(self.apiurl, username)))
-        projects = []
-        watchlist = tree.find('watchlist')
-        if watchlist:
-            for project in watchlist.findall('project'):
-                projects.append(project.get('name'))
-        homeproject = 'home:%s' % username
-        if not homeproject in projects and homeproject in self.getProjectList():
-            projects.append(homeproject)
-        return projects
-
-    def watchProject(self, project):
-        """
-        watchProject(project)
-
-        Watch project
-        """
-        username = self.getUserName()
-        data = core.meta_exists('user', username, create_new=False, apiurl=self.apiurl)
-        url = core.make_meta_url('user', username, self.apiurl)
-
-        person = ElementTree.fromstring(''.join(data))
-        watchlist = person.find('watchlist')
-        if not watchlist:
-            watchlist = ElementTree.SubElement(person, 'watchlist')
-        ElementTree.SubElement(watchlist, 'project', name=str(project))
-
-        f = _Metafile(url, ElementTree.tostring(person))
-        f.sync()
-
-    def unwatchProject(self, project):
-        """
-        watchProject(project)
-
-        Watch project
-        """
-        username = self.getUserName()
-        data = core.meta_exists('user', username, create_new=False, apiurl=self.apiurl)
-        url = core.make_meta_url('user', username, self.apiurl)
-
-        person = ElementTree.fromstring(''.join(data))
-        watchlist = person.find('watchlist')
-        for node in watchlist:
-            if node.get('name') == str(project):
-                watchlist.remove(node)
-                break
-
-        f = _Metafile(url, ElementTree.tostring(person))
-        f.sync()
-
     def getRepoState(self, project):
         targets = {}
         print "==%s= %s=" %(self.apiurl, project)
@@ -687,34 +274,6 @@ class BuildService(object):
             targets[('/'.join((result.get('repository'), result.get('arch'))))] = result.get('state')
         return targets
 
-    def getResults(self, project):
-        """getResults(project) -> (dict, list)
-
-        Get results of a project. Returns (results, targets)
-
-        results is a dict, with package names as the keys, and lists of result codes as the values
-
-        targets is a list of targets, corresponding to the result code lists
-        """
-        results = {}
-        targets = []
-        tree = ElementTree.fromstring(''.join(core.show_prj_results_meta(self.apiurl, project)))
-        for result in tree.findall('result'):
-            targets.append('/'.join((result.get('repository'), result.get('arch'))))
-            for status in result.findall('status'):
-                package = status.get('package')
-                code = status.get('code')
-                if not package in results:
-                    results[package] = []
-                results[package].append(code)
-        return (results, targets)
-
-    def getDiff(self, sprj, spkg, dprj, dpkg, rev):
-        diff = ''
-        diff += core.server_diff(self.apiurl, sprj, spkg, None,
-                 dprj, dpkg, rev, False, True)
-        return diff
-
     def getTargets(self, project):
         """
         getTargets(project) -> list
@@ -728,37 +287,6 @@ class BuildService(object):
                 targets.append('%s/%s' % (repo.get('name'), arch.text))
         return targets
 
-    def getPackageStatus(self, project, package):
-        """
-        getPackageStatus(project, package) -> dict
-
-        Returns the status of a package as a dict with targets as the keys and status codes as the
-        values
-        """
-        status = {}
-        tree = ElementTree.fromstring(''.join(core.show_results_meta(self.apiurl, project, package)))
-        for result in tree.findall('result'):
-            target = '/'.join((result.get('repository'), result.get('arch')))
-            statusnode = result.find('status')
-            code = statusnode.get('code')
-            details = statusnode.find('details')
-            if details is not None:
-                code += ': ' + details.text
-            status[target] = code
-        return status
-
-    def getProjectDiff(self, src_project, dst_project):
-        diffs = []
-
-        packages = self.getPackageList(src_project)
-        for src_package in packages:
-            diff = core.server_diff(self.apiurl,
-                                dst_project, src_package, None,
-                                src_project, src_package, None, False)
-            diffs.append(diff)
-
-        return '\n'.join(diffs)
-
     def getPackageList(self, prj, deleted=None):
         query = {}
         if deleted:
@@ -769,26 +297,6 @@ class BuildService(object):
         root = ElementTree.parse(f).getroot()
         return [ node.get('name') for node in root.findall('entry') ]
 
-    def getBinaryList(self, project, target, package):
-        """
-        getBinaryList(project, target, package) -> list
-
-        Returns a list of binaries for a particular target and package
-        """
-
-        (repo, arch) = target.split('/')
-        return core.get_binarylist(self.apiurl, project, repo, arch, package)
-
-    def getBinary(self, project, target, package, file, path):
-        """
-        getBinary(project, target, file, path)
-
-        Get binary 'file' for 'project' and 'target' and save it as 'path'
-        """
-
-        (repo, arch) = target.split('/')
-        core.get_binary_file(self.apiurl, project, repo, arch, file, target_filename=path, package=package)
-
     def getBuildLog(self, project, target, package, offset=0):
         """
         getBuildLog(project, target, package, offset=0) -> str
@@ -802,167 +310,6 @@ class BuildService(object):
         u = core.makeurl(self.apiurl, ['build', project, repo, arch, package, '_log?nostream=1&start=%s' % offset])
         return core.http_GET(u).read()
 
-    def getWorkerStatus(self):
-        """
-        getWorkerStatus() -> list of dicts
-
-        Get worker status as a list of dictionaries. Each dictionary contains the keys 'id',
-        'hostarch', and 'status'. If the worker is building, the dict will additionally contain the
-        keys 'project', 'package', 'target', and 'starttime'
-        """
-
-        url = core.makeurl(self.apiurl, ['build', '_workerstatus'])
-        f = core.http_GET(url)
-        tree = ElementTree.parse(f).getroot()
-        workerstatus = []
-        for worker in tree.findall('building'):
-            d = {'id': worker.get('workerid'),
-                 'status': 'building'}
-            for attr in ('hostarch', 'project', 'package', 'starttime'):
-                d[attr] = worker.get(attr)
-            d['target'] = '/'.join((worker.get('repository'), worker.get('arch')))
-            d['started'] = time.asctime(time.localtime(float(worker.get('starttime'))))
-            workerstatus.append(d)
-        for worker in tree.findall('idle'):
-            d = {'id': worker.get('workerid'),
-                 'hostarch': worker.get('hostarch'),
-                 'status': 'idle'}
-            workerstatus.append(d)
-        return workerstatus
-
-    def getWaitStats(self):
-        """
-        getWaitStats() -> list
-
-        Returns the number of jobs in the wait queue as a list of (arch, count)
-        pairs
-        """
-
-        url = core.makeurl(self.apiurl, ['build', '_workerstatus'])
-        f = core.http_GET(url)
-        tree = ElementTree.parse(f).getroot()
-        stats = []
-        for worker in tree.findall('waiting'):
-            stats.append((worker.get('arch'), int(worker.get('jobs'))))
-        return stats
-
-    def getSubmitRequests(self):
-        """
-        getSubmitRequests() -> list of dicts
-
-        """
-
-        url = core.makeurl(self.apiurl, ['search', 'request', '?match=submit'])
-        f = core.http_GET(url)
-        tree = ElementTree.parse(f).getroot()
-        submitrequests = []
-        for sr in tree.findall('request'):
-            if sr.get('type') != "submit":
-                continue
-
-            d = {'id': int(sr.get('id'))}
-            sb = sr.findall('submit')[0]
-            src = sb.findall('source')[0]
-            d['srcproject'] = src.get('project')
-            d['srcpackage'] = src.get('package')
-            dst = sb.findall('target')[0]
-            d['dstproject'] = dst.get('project')
-            d['dstpackage'] = dst.get('package')
-            d['state'] = sr.findall('state')[0].get('name')
-
-            submitrequests.append(d)
-        submitrequests.sort(key=lambda x: x['id'])
-        return submitrequests
-
-    def rebuild(self, project, package, target=None, code=None):
-        """
-        rebuild(project, package, target, code=None)
-
-        Rebuild 'package' in 'project' for 'target'. If 'code' is specified,
-        all targets with that code will be rebuilt
-        """
-
-        if target:
-            (repo, arch) = target.split('/')
-        else:
-            repo = None
-            arch = None
-        return core.rebuild(self.apiurl, project, package, repo, arch, code)
-
-    def abortBuild(self, project, package=None, target=None):
-        """
-        abort(project, package=None, target=None)
-
-        Abort build of a package or all packages in a project
-        """
-
-        if target:
-            (repo, arch) = target.split('/')
-        else:
-            repo = None
-            arch = None
-        return core.abortbuild(self.apiurl, project, package, arch, repo)
-
-    def getBuildHistory(self, project, package, target):
-        """
-        getBuildHistory(project, package, target) -> list
-
-        Get build history of package for target as a list of tuples of the form
-        (time, srcmd5, rev, versrel, bcnt)
-        """
-
-        (repo, arch) = target.split('/')
-        u = core.makeurl(self.apiurl, ['build', project, repo, arch, package, '_history'])
-        f = core.http_GET(u)
-        root = ElementTree.parse(f).getroot()
-
-        r = []
-        for node in root.findall('entry'):
-            rev = int(node.get('rev'))
-            srcmd5 = node.get('srcmd5')
-            versrel = node.get('versrel')
-            bcnt = int(node.get('bcnt'))
-            t = time.localtime(int(node.get('time')))
-            t = time.strftime('%Y-%m-%d %H:%M:%S', t)
-
-            r.append((t, srcmd5, rev, versrel, bcnt))
-        return r
-
-    def getCommitLog(self, project, package, revision=None):
-        """
-        getCommitLog(project, package, revision=None) -> list
-
-        Get commit log for package in project. If revision is set, get just the
-        log for that revision.
-
-        Each log is a tuple of the form (rev, srcmd5, version, time, user,
-        comment)
-        """
-
-        u = core.makeurl(self.apiurl, ['source', project, package, '_history'])
-        f = core.http_GET(u)
-        root = ElementTree.parse(f).getroot()
-
-        r = []
-        revisions = root.findall('revision')
-        revisions.reverse()
-        for node in revisions:
-            rev = int(node.get('rev'))
-            if revision and rev != int(revision):
-                continue
-            srcmd5 = node.find('srcmd5').text
-            version = node.find('version').text
-            user = node.find('user').text
-            try:
-                comment = node.find('comment').text
-            except:
-                comment = '<no message>'
-            t = time.localtime(int(node.find('time').text))
-            t = time.strftime('%Y-%m-%d %H:%M:%S', t)
-
-            r.append((rev, srcmd5, version, t, user, comment))
-        return r
-
     def getProjectConfig(self, project):
         """
         getProjectConfig(project) -> string
@@ -971,85 +318,10 @@ class BuildService(object):
         """
         return ''.join(core.show_project_conf(self.apiurl, project))
 
-    def getProjectMeta(self, project):
-        """
-        getProjectMeta(project) -> string
-
-        Get XML metadata for project
-        """
-
-        return ''.join(core.show_project_meta(self.apiurl, project))
-
-    def getProjectData(self, project, tag):
-        """
-        getProjectData(project, tag) -> list
-        
-        Return a string list if node has text, else return the values dict list
-        """
-
-        data = []
-        tree = ElementTree.fromstring(self.getProjectMeta(project))
-        nodes = tree.findall(tag)
-        if nodes:
-            for node in nodes:
-                node_value = {}
-                for key in node.keys():
-                    node_value[key] = node.get(key)
-
-                if node_value:
-                    data.append(node_value)
-                else:
-                    data.append(node.text)
-
-        return data
-
-    def getProjectPersons(self, project, role):
-        """
-        getProjectPersons(project, role) -> list
-        
-        Return a userid list in this project with this role
-        """
-
-        userids = []
-        persons = self.getProjectData(project, 'person')
-        for person in persons:
-            if person.has_key('role') and person['role'] == role:
-                userids.append(person['userid'])
-
-        return userids
-
-    def getProjectDevel(self, project):
-        """
-        getProjectDevel(project) -> tuple (devel_prj, devel_pkg)
-
-        Return the devel tuple of a project if it has the node, else return None
-        """
-
-        devels = self.getProjectData(project, 'devel')
-        for devel in devels:
-            if devel.has_key('project') and devel.has_key('package'):
-                return (devel['project'], devel['package'])
-
-        return None
-
-    def getProjectLink(self, project):
-        """
-        getProjectLink(project) -> string
-
-        Return the linked project of a project if it has the node, else return None
-        """
-
-        links = self.getProjectData(project, 'link')
-        for link in links:
-            if link.has_key('project'):
-                return link['project']
-
-        return None
-
     def deleteProject(self, project):
         """
         deleteProject(project)
-        
+
         Delete the specific project
         """
 
@@ -1057,7 +329,7 @@ class BuildService(object):
             core.delete_project(self.apiurl, project)
         except Exception:
             return False
-            
+
         return True
 
     def getPackageMeta(self, project, package):
@@ -1069,29 +341,6 @@ class BuildService(object):
 
         return ''.join(core.show_package_meta(self.apiurl, project, package))
 
-    def getPackageData(self, project, package, tag):
-        """
-        getPackageData(project, package, tag) -> list
-        
-        Return a string list if node has text, else return the values dict list
-        """
-
-        data = []
-        tree = ElementTree.fromstring(self.getPackageMeta(project, package))
-        nodes = tree.findall(tag)
-        if nodes:
-            for node in nodes:
-                node_value = {}
-                for key in node.keys():
-                    node_value[key] = node.get(key)
-
-                if node_value:
-                    data.append(node_value)
-                else:
-                    data.append(node.text)
-
-        return data
-
     def getPackageRealProjectName(self, project, package):
         """
         getPackageRealProjectName(project, package) -> string
@@ -1108,39 +357,10 @@ class BuildService(object):
 
         return realprj
 
-    def getPackagePersons(self, project, package, role):
-        """
-        getPackagePersons(project, package, role) -> list
-        
-        Return a userid list in the package with this role
-        """
-
-        userids = []
-        persons = self.getPackageData(project, package, 'person')
-        for person in persons:
-            if person.has_key('role') and person['role'] == role:
-                userids.append(person['userid'])
-
-        return userids
-
-    def getPackageDevel(self, project, package):
-        """
-        getPackageDevel(project, package) -> tuple (devel_prj, devel_pkg)
-        
-        Return the devel tuple of a package if it has the node, else return None
-        """
-
-        devels = self.getPackageData(project, package, 'devel')
-        for devel in devels:
-            if devel.has_key('project') and devel.has_key('package'):
-                return (devel['project'], devel['package'])
-
-        return None
-
     def deletePackage(self, project, package):
         """
         deletePackage(project, package)
-        
+
         Delete the specific package in project
         """
 
@@ -1148,17 +368,8 @@ class BuildService(object):
             core.delete_package(self.apiurl, project, package)
         except Exception:
             return False
-            
-        return True
 
-    def projectFlags(self, project):
-        """
-        projectFlags(project) -> _ProjectFlags
-
-        Return a _ProjectFlags object for manipulating the flags of project
-        """
-
-        return _ProjectFlags(self, project)
+        return True
 
     def checkout(self, prj, pkg, rev='latest'):
         """ checkout the package to current dir with link expanded
@@ -1200,7 +411,7 @@ class BuildService(object):
         try:
             core.Project(prj).commit(tuple([pac_path]), msg=msg, files=files)
         except urllib2.HTTPError, e:
-            raise errors.ObsError('%s' % e)   
+            raise ObsError('%s' % e)
         core.store_unlink_file(pac.absdir, '_commit_msg')
 
     def branchPkg(self, src_project, src_package, rev=None, target_project=None, target_package=None):
@@ -1229,44 +440,3 @@ class BuildService(object):
 
         return (targetprj, targetpkg)
 
-    def get_buildconfig(self, prj, repository):
-        return core.get_buildconfig(self.apiurl, prj, repository)
-
-    def get_ArchitectureList(self, prj, target):
-        """
-        return the list of Archictecture of the target of the projectObsName for a OBS server.
-        """
-        url = core.makeurl(self.apiurl,['build', prj, target])
-        f = core.http_GET(url)
-        if f == None:
-            return None
-
-        aElement = ElementTree.fromstring(''.join(f.readlines()))
-        result = []
-        for directory in aElement:
-            for entry in directory.getiterator():
-                result.append(entry.get("name"))
-
-        return result
-
-    def get_results(self, prj, package):
-        try:
-            results = defaultdict(dict)
-            build_status = core.get_results(self.apiurl, prj, package)
-            for res in build_status:
-                repo, arch, status = res.split()
-                results[repo][arch] = status
-            return results
-        except (M2Crypto.m2urllib2.URLError, M2Crypto.SSL.SSLError), err:
-            raise errors.ObsError(str(err))
-
-    def get_buildlog(self, prj, package, repository, arch, offset = 0):
-        """prints out the buildlog on stdout"""
-        all_bytes = string.maketrans('', '')
-        remove_bytes = all_bytes[:10] + all_bytes[11:32]
-        try:
-            log = self.getBuildLog(prj, '%s/%s' % (repository, arch), package)
-            sys.stdout.write(log.translate(all_bytes, remove_bytes))
-        except (M2Crypto.m2urllib2.URLError, M2Crypto.SSL.SSLError), err:
-            raise errors.ObsError(str(err))
-