[Kimchi-devel] [PATCH 3/3 v3] Changing repositories and swupdate to use yumparser module
Aline Manera
alinefm at linux.vnet.ibm.com
Tue Jun 9 14:06:34 UTC 2015
Reviewed-by: Aline Manera <alinefm at linux.vnet.ibm.com>
On 05/06/2015 17:17, Daniel Henrique Barboza wrote:
> Removing YUM API from the code avoids a memory leak in the
> Host tab each time it is loaded.
>
> Signed-off-by: Daniel Henrique Barboza <dhbarboza82 at gmail.com>
> ---
> src/kimchi/repositories.py | 65 ++++++++++++++--------------------------------
> src/kimchi/swupdate.py | 16 +++++-------
> 2 files changed, 26 insertions(+), 55 deletions(-)
>
> diff --git a/src/kimchi/repositories.py b/src/kimchi/repositories.py
> index e9fc958..20b7311 100644
> --- a/src/kimchi/repositories.py
> +++ b/src/kimchi/repositories.py
> @@ -29,6 +29,7 @@ from kimchi.config import kimchiLock
> from kimchi.exception import InvalidOperation, InvalidParameter
> from kimchi.exception import OperationFailed, NotFoundError, MissingParameter
> from kimchi.utils import validate_repo_url
> +from kimchi.yumparser import get_yum_repositories, write_repo_to_file
>
>
> class Repositories(object):
> @@ -115,25 +116,17 @@ class YumRepo(object):
> CONFIG_ENTRY = ('repo_name', 'mirrorlist', 'metalink')
>
> def __init__(self):
> - self._yb = getattr(__import__('yum'), 'YumBase')
> - self._conf = getattr(__import__('yum'), 'config')
> -
> self._confdir = self.DEFAULT_CONF_DIR
> - reposdir = self._yb().conf.reposdir
> - for d in reposdir:
> - if os.path.isdir(d):
> - self._confdir = d
> - break
>
> def _get_repos(self, errcode):
> try:
> - yb = self._yb()
> - yb.doLock()
> - repos = yb.repos
> - yb.doUnlock()
> + kimchiLock.acquire()
> + repos = get_yum_repositories()
> except Exception, e:
> kimchiLock.release()
> raise OperationFailed(errcode, {'err': str(e)})
> + finally:
> + kimchiLock.release()
>
> return repos
>
> @@ -141,37 +134,28 @@ class YumRepo(object):
> """
> Return a list of repositories IDs
> """
> - kimchiLock.acquire()
> repos = self._get_repos('KCHREPOS0024E')
> - kimchiLock.release()
> - return repos.repos.keys()
> + return repos.keys()
>
> def getRepo(self, repo_id):
> """
> Return a dictionary in the repositories.Repositories() of the given
> repository ID format with the information of a YumRepository object.
> """
> - kimchiLock.acquire()
> repos = self._get_repos('KCHREPOS0025E')
> - kimchiLock.release()
>
> - if repo_id not in repos.repos.keys():
> + if repo_id not in repos.keys():
> raise NotFoundError("KCHREPOS0012E", {'repo_id': repo_id})
>
> - entry = repos.getRepo(repo_id)
> + entry = repos.get(repo_id)
>
> info = {}
> info['enabled'] = entry.enabled
> -
> - baseurl = ''
> - if entry.baseurl:
> - baseurl = entry.baseurl[0]
> -
> - info['baseurl'] = baseurl
> + info['baseurl'] = entry.baseurl or ''
> info['config'] = {}
> - info['config']['repo_name'] = entry.name
> + info['config']['repo_name'] = entry.name or ''
> info['config']['gpgcheck'] = entry.gpgcheck
> - info['config']['gpgkey'] = entry.gpgkey
> + info['config']['gpgkey'] = entry.gpgkey or ''
> info['config']['mirrorlist'] = entry.mirrorlist or ''
> info['config']['metalink'] = entry.metalink or ''
> return info
> @@ -205,10 +189,8 @@ class YumRepo(object):
> if repo_id is None:
> repo_id = "kimchi_repo_%s" % str(int(time.time() * 1000))
>
> - kimchiLock.acquire()
> repos = self._get_repos('KCHREPOS0026E')
> - kimchiLock.release()
> - if repo_id in repos.repos.keys():
> + if repo_id in repos.keys():
> raise InvalidOperation("KCHREPOS0022E", {'repo_id': repo_id})
>
> repo_name = config.get('repo_name', repo_id)
> @@ -235,13 +217,11 @@ class YumRepo(object):
> return repo_id
>
> def toggleRepo(self, repo_id, enable):
> - kimchiLock.acquire()
> repos = self._get_repos('KCHREPOS0011E')
> - kimchiLock.release()
> - if repo_id not in repos.repos.keys():
> + if repo_id not in repos.keys():
> raise NotFoundError("KCHREPOS0012E", {'repo_id': repo_id})
>
> - entry = repos.getRepo(repo_id)
> + entry = repos.get(repo_id)
> if enable and entry.enabled:
> raise InvalidOperation("KCHREPOS0015E", {'repo_id': repo_id})
>
> @@ -255,9 +235,8 @@ class YumRepo(object):
> else:
> entry.disable()
>
> - self._conf.writeRawRepoFile(entry)
> + write_repo_to_file(entry)
> except:
> - kimchiLock.release()
> if enable:
> raise OperationFailed("KCHREPOS0020E", {'repo_id': repo_id})
>
> @@ -271,13 +250,11 @@ class YumRepo(object):
> """
> Update a given repository in repositories.Repositories() format
> """
> - kimchiLock.acquire()
> repos = self._get_repos('KCHREPOS0011E')
> - kimchiLock.release()
> - if repo_id not in repos.repos.keys():
> + if repo_id not in repos.keys():
> raise NotFoundError("KCHREPOS0012E", {'repo_id': repo_id})
>
> - entry = repos.getRepo(repo_id)
> + entry = repos.get(repo_id)
>
> baseurl = params.get('baseurl', None)
> config = params.get('config', {})
> @@ -316,7 +293,7 @@ class YumRepo(object):
> entry.gpgcheck = config.get('gpgcheck', entry.gpgcheck)
> entry.gpgkey = config.get('gpgkey', entry.gpgkey)
> kimchiLock.acquire()
> - self._conf.writeRawRepoFile(entry)
> + write_repo_to_file(entry)
> kimchiLock.release()
> return repo_id
>
> @@ -324,13 +301,11 @@ class YumRepo(object):
> """
> Remove a given repository
> """
> - kimchiLock.acquire()
> repos = self._get_repos('KCHREPOS0027E')
> - kimchiLock.release()
> - if repo_id not in repos.repos.keys():
> + if repo_id not in repos.keys():
> raise NotFoundError("KCHREPOS0012E", {'repo_id': repo_id})
>
> - entry = repos.getRepo(repo_id)
> + entry = repos.get(repo_id)
> parser = ConfigParser()
> with open(entry.repofile) as fd:
> parser.readfp(fd)
> diff --git a/src/kimchi/swupdate.py b/src/kimchi/swupdate.py
> index 40af8f3..4869235 100644
> --- a/src/kimchi/swupdate.py
> +++ b/src/kimchi/swupdate.py
> @@ -24,6 +24,7 @@ from kimchi.basemodel import Singleton
> from kimchi.config import kimchiLock
> from kimchi.exception import NotFoundError, OperationFailed
> from kimchi.utils import kimchi_log, run_command
> +from kimchi.yumparser import get_yum_packages_list_update
>
>
> class SoftwareUpdate(object):
> @@ -150,14 +151,12 @@ class YumUpdate(object):
> Update the list of packages to be updated in the system.
> """
> try:
> - yb = getattr(__import__('yum'), 'YumBase')()
> - yb.doLock()
> - self._pkgs = yb.doPackageLists('updates')
> - yb.doUnlock()
> - del yb
> + kimchiLock.acquire()
> + self._pkgs = get_yum_packages_list_update()
> except Exception, e:
> - kimchiLock.release()
> raise OperationFailed('KCHPKGUPD0003E', {'err': str(e)})
> + finally:
> + kimchiLock.release()
>
> def getPackagesList(self):
> """
> @@ -166,13 +165,10 @@ class YumUpdate(object):
> package = {'package_name': <string>, 'version': <string>,
> 'arch': <string>, 'repository': <string>}
> """
> - kimchiLock.acquire()
> self._refreshUpdateList()
> - kimchiLock.release()
> pkg_list = []
> for pkg in self._pkgs:
> - package = {'package_name': pkg.name,
> - 'version': "%s-%s" % (pkg.version, pkg.release),
> + package = {'package_name': pkg.name, 'version': pkg.version,
> 'arch': pkg.arch, 'repository': pkg.ui_from_repo}
> pkg_list.append(package)
> return pkg_list
More information about the Kimchi-devel
mailing list