diff options
author | Aleksey Lim <alsroot@sugarlabs.org> | 2014-05-02 08:00:38 (GMT) |
---|---|---|
committer | Aleksey Lim <alsroot@sugarlabs.org> | 2014-05-02 12:15:03 (GMT) |
commit | 4596cf36203db51cd371b21fd6639b9c55166f17 (patch) | |
tree | 04f233d0ac0c2a77c7ee8799f76d7c23d8847866 | |
parent | d575dade236cd1c5ca345b79dc7a29f5d9a6959e (diff) |
Node command to regerate package resolves/presolves
-rw-r--r-- | TODO | 1 | ||||
-rwxr-xr-x | sugar-network-node | 27 | ||||
-rw-r--r-- | sugar_network/client/injector.py | 4 | ||||
-rw-r--r-- | sugar_network/db/blobs.py | 2 | ||||
-rw-r--r-- | sugar_network/db/resource.py | 6 | ||||
-rw-r--r-- | sugar_network/node/master.py | 11 | ||||
-rw-r--r-- | sugar_network/node/model.py | 121 | ||||
-rw-r--r-- | sugar_network/node/obs.py | 22 | ||||
-rw-r--r-- | sugar_network/toolkit/packagekit.py (renamed from sugar_network/client/packagekit.py) | 48 | ||||
-rw-r--r-- | tests/units/client/__main__.py | 1 | ||||
-rwxr-xr-x | tests/units/client/injector.py | 12 | ||||
-rwxr-xr-x | tests/units/client/packagekit.py | 25 | ||||
-rwxr-xr-x | tests/units/node/node_model.py | 44 | ||||
-rwxr-xr-x | tests/units/node/node_routes.py | 4 | ||||
-rwxr-xr-x | tests/units/node/obs.py | 2 | ||||
-rw-r--r-- | tests/units/toolkit/__main__.py | 1 | ||||
-rwxr-xr-x | tests/units/toolkit/packagekit.py | 25 |
17 files changed, 189 insertions, 167 deletions
@@ -1,7 +1,6 @@ - auth while offline posts - do not return Context.releases while non-slave sync - deliver spawn events only to local subscribers -- test/run presolve - if node relocates api calls, do it only once in toolkit.http - switch auth from WWW-AUTHENTICATE to mutual authentication over the HTTPS - restrict ACL.LOCAL routes only to localhost clients diff --git a/sugar-network-node b/sugar-network-node index e836c1a..0b997a0 100755 --- a/sugar-network-node +++ b/sugar-network-node @@ -19,15 +19,14 @@ import os import locale import gettext import logging -from os.path import exists +from os.path import exists, join from sugar_network.toolkit import coroutine coroutine.inject() from sugar_network import db, node, toolkit from sugar_network.node.auth import SugarAuth -from sugar_network.node.model import Volume -from sugar_network.node import obs, master, slave +from sugar_network.node import obs, master, slave, model from sugar_network.toolkit.http import Connection from sugar_network.toolkit.router import Router from sugar_network.toolkit import application, Option, enforce @@ -66,7 +65,7 @@ class Application(application.Daemon): node_routes_class = slave.SlaveRoutes resources = slave.RESOURCES logging.info('Start slave node') - volume = Volume(node.data_root.value, resources) + volume = model.Volume(node.data_root.value, resources) node_routes = node_routes_class(node.master_api.value, volume=volume, auth=SugarAuth(node.data_root.value), find_limit=node.find_limit.value) @@ -102,6 +101,26 @@ class Application(application.Daemon): path = self.args.pop(0) self._ensure_instance().post(cmd='offline-sync', path=path) + @application.command( + 'resolve/presolve packages for all package-type Contexts', + name='resolve') + def resolve(self): + enforce(not self.check_for_instance(), 'Node should be stopped') + enforce(node.mode.value == 'master', 'Node is not master') + volume = model.Volume(node.data_root.value, master.RESOURCES) + try: + for doc in volume['context']: + if 'package' not in doc['type']: + continue + for key, agg in doc['releases'].items(): + if key == 'resolves' or 'value' not in agg: + continue + model.resolve_package(doc, key, agg['value']) + doc.post('releases') + finally: + volume.close() + model.presolve(join(node.data_root.value, 'files'), block=False) + def _ensure_instance(self): enforce(self.check_for_instance(), 'Node is not started') return Connection('http://localhost:%s' % diff --git a/sugar_network/client/injector.py b/sugar_network/client/injector.py index 69dc06a..fcd87ea 100644 --- a/sugar_network/client/injector.py +++ b/sugar_network/client/injector.py @@ -24,12 +24,12 @@ import logging from os.path import exists, join from sugar_network import toolkit -from sugar_network.client import packagekit, journal, profile_path +from sugar_network.client import journal, profile_path from sugar_network.toolkit.spec import format_version from sugar_network.toolkit.bundle import Bundle from sugar_network.toolkit.coroutine import this from sugar_network.toolkit import lsb_release, coroutine, i18n, pylru, http -from sugar_network.toolkit import enforce +from sugar_network.toolkit import packagekit, enforce _PREEMPTIVE_POOL_SIZE = 256 diff --git a/sugar_network/db/blobs.py b/sugar_network/db/blobs.py index f283cb2..0566e4f 100644 --- a/sugar_network/db/blobs.py +++ b/sugar_network/db/blobs.py @@ -243,7 +243,7 @@ class Blobs(object): else: path = self._blob_path(patch.digest) if not patch.size: - self._delete(path.digest, path, seqno) + self._delete(patch.digest, path, seqno) return if not exists(dirname(path)): os.makedirs(dirname(path)) diff --git a/sugar_network/db/resource.py b/sugar_network/db/resource.py index 35ab29b..1bf46c6 100644 --- a/sugar_network/db/resource.py +++ b/sugar_network/db/resource.py @@ -208,7 +208,11 @@ class Resource(object): patch[prop] = value return patch - def post(self, prop, value, **meta): + def post(self, prop, value=None, **meta): + if value is None: + if prop not in self.posts: + return + value = self.posts[prop] prop = self.metadata[prop] if prop.on_set is not None: value = prop.on_set(self, value) diff --git a/sugar_network/node/master.py b/sugar_network/node/master.py index d51d85b..d5f3f70 100644 --- a/sugar_network/node/master.py +++ b/sugar_network/node/master.py @@ -19,9 +19,9 @@ from urlparse import urlsplit from sugar_network import toolkit from sugar_network.model.post import Post from sugar_network.model.report import Report -from sugar_network.node import obs, model +from sugar_network.node import model from sugar_network.node.routes import NodeRoutes -from sugar_network.toolkit.router import route, ACL +from sugar_network.toolkit.router import route from sugar_network.toolkit.coroutine import this from sugar_network.toolkit import http, packets, pylru, ranges, enforce @@ -55,13 +55,6 @@ class MasterRoutes(NodeRoutes): return packets.encode(reply, limit=accept_length, header={'from': self.guid}, on_complete=this.cookie.clear) - @route('PUT', ['context', None], cmd='presolve', - acl=ACL.AUTH, mime_type='application/json') - def presolve(self): - aliases = this.volume['context'].get(this.request.guid)['aliases'] - enforce(aliases, http.BadRequest, 'Nothing to presolve') - return obs.presolve(None, aliases, this.volume.blobs.path('packages')) - def status(self): result = NodeRoutes.status(self) result['mode'] = 'master' diff --git a/sugar_network/node/model.py b/sugar_network/node/model.py index 380963f..545993f 100644 --- a/sugar_network/node/model.py +++ b/sugar_network/node/model.py @@ -29,18 +29,18 @@ from sugar_network.model import ICON_SIZE, LOGO_SIZE from sugar_network.node import obs from sugar_network.node.auth import Principal from sugar_network.toolkit.router import ACL, File, Request, Response -from sugar_network.toolkit.coroutine import Queue, this +from sugar_network.toolkit.coroutine import Queue, Empty, this from sugar_network.toolkit.spec import EMPTY_LICENSE, ensure_version from sugar_network.toolkit.spec import parse_requires, parse_version from sugar_network.toolkit.bundle import Bundle -from sugar_network.toolkit import sat, http, i18n, ranges, packets +from sugar_network.toolkit import sat, http, i18n, ranges, packets, packagekit from sugar_network.toolkit import svg_to_png, enforce BATCH_SUFFIX = '.meta' _logger = logging.getLogger('node.model') -_presolve_queue = None +_presolve_queue = Queue() class User(_user.User): @@ -64,9 +64,11 @@ class _Release(object): return value.guid, value doc = this.volume['context'][this.request.guid] if 'package' in doc['type']: + enforce(this.request.key, http.BadRequest, 'No distro in path') value = _ReleaseValue(self._package_subcast.typecast(value)) value.guid = this.request.key - _resolve_package_alias(doc, value) + resolve_package(doc, this.request.key, value) + doc.post('releases') return value bundle = this.volume.blobs.post(value, this.request.content_type) __, value = load_bundle(bundle, context=this.request.guid) @@ -336,7 +338,9 @@ def solve(volume, top_context, command=None, lsb_id=None, lsb_release=None, if 'package' in context['type']: pkg_lst = None pkg_ver = [] - pkg = releases.get('resolves', {}).get(lsb_distro) + pkg = None + if 'resolves' in releases: + pkg = releases['resolves']['value'].get(lsb_distro) if pkg: pkg_ver = pkg['version'] pkg_lst = pkg['packages'] @@ -418,12 +422,61 @@ def solve(volume, top_context, command=None, lsb_id=None, lsb_release=None, return solution -def presolve(presolve_path): - global _presolve_queue - _presolve_queue = Queue() +def resolve_package(doc, distro, alias): + enforce(alias.get('binary'), http.BadRequest, 'No binary aliases') - for repo_name, pkgs in _presolve_queue: - obs.presolve(repo_name, pkgs, presolve_path) + if distro == '*': + lsb_id = None + lsb_release = None + elif '-' in distro: + lsb_id, lsb_release = distro.split('-', 1) + else: + lsb_id = distro + lsb_release = None + releases = doc['releases'] + resolves = releases['resolves']['value'] if 'resolves' in releases else {} + to_presolve = [] + + for repo in obs.get_repos(): + if lsb_id and lsb_id != repo['lsb_id'] or \ + lsb_release and lsb_release != repo['lsb_release']: + continue + # Make sure there are no alias overrides + if not lsb_id and repo['lsb_id'] in releases or \ + not lsb_release and repo['name'] in releases: + continue + pkgs = sum([alias.get(i, []) for i in ('binary', 'devel')], []) + version = None + try: + for arch in repo['arches']: + version = obs.resolve(repo['name'], arch, pkgs)['version'] + except Exception, error: + _logger.warning('Failed to resolve %r on %s', + pkgs, repo['name']) + resolve = {'status': str(error)} + else: + to_presolve.append((repo['name'], pkgs)) + version = packagekit.cleanup_distro_version(version) + resolve = { + 'version': parse_version(version), + 'packages': pkgs, + 'status': 'success', + } + resolves.setdefault(repo['name'], {}).update(resolve) + + if to_presolve and _presolve_queue is not None: + _presolve_queue.put(to_presolve) + doc.posts.setdefault('releases', {})['resolves'] = {'value': resolves} + + +def presolve(presolve_path, **pop_kwargs): + while True: + try: + value = _presolve_queue.get(**pop_kwargs) + except Empty: + break + for repo_name, pkgs in value: + obs.presolve(repo_name, pkgs, presolve_path) def load_bundle(blob, context=None, initial=False, extra_deps=None, @@ -624,54 +677,6 @@ def _load_context_metadata(bundle, spec): return result, icon_svg -def _resolve_package_alias(doc, value): - enforce(value.get('binary'), http.BadRequest, 'No binary aliases') - - distro = this.request.key - enforce(distro, http.BadRequest, 'No distro in path') - if distro == '*': - lsb_id = None - lsb_release = None - elif '-' in this.request.key: - lsb_id, lsb_release = distro.split('-', 1) - else: - lsb_id = distro - lsb_release = None - releases = doc['releases'] - resolves = releases.get('resolves') or {} - to_presolve = [] - - for repo in obs.get_repos(): - if lsb_id and lsb_id != repo['lsb_id'] or \ - lsb_release and lsb_release != repo['lsb_release']: - continue - # Make sure there are no alias overrides - if not lsb_id and repo['lsb_id'] in releases or \ - not lsb_release and repo['name'] in releases: - continue - pkgs = sum([value.get(i, []) for i in ('binary', 'devel')], []) - version = None - try: - for arch in repo['arches']: - version = obs.resolve(repo['name'], arch, pkgs)['version'] - except Exception, error: - _logger.warning('Failed to resolve %r on %s', - pkgs, repo['name']) - resolve = {'status': str(error)} - else: - to_presolve.append((repo['name'], pkgs)) - resolve = { - 'version': parse_version(version), - 'packages': pkgs, - 'status': 'success', - } - resolves.setdefault(repo['name'], {}).update(resolve) - - if to_presolve and _presolve_queue is not None: - _presolve_queue.put(to_presolve) - doc.post('releases', {'resolves': resolves}) - - def _generate_icons(svg, props): blobs = this.volume.blobs props['artefact_icon'] = \ diff --git a/sugar_network/node/obs.py b/sugar_network/node/obs.py index 0c68a6e..81afc62 100644 --- a/sugar_network/node/obs.py +++ b/sugar_network/node/obs.py @@ -56,6 +56,9 @@ def resolve(repo, arch, packages): def presolve(repo_name, packages, dst_path): + # TODO The only repo is OLPC which is Fedora-14 based + if repo_name != 'Fedora-14': + return for repo in _get_repos(obs_presolve_project.value): dst_dir = join(dst_path, 'packages', obs_presolve_project.value, repo['name']) @@ -68,7 +71,7 @@ def presolve(repo_name, packages, dst_path): for repo_arch in repo['arches']: response = _request('GET', ['resolve'], params={ 'project': obs_presolve_project.value, - 'repository': '%(lsb_id)s-%(lsb_release)s' % repo, + 'repository': repo['name'], 'arch': repo_arch, 'package': package, 'withdeps': '1', @@ -129,14 +132,13 @@ def _get_repos(project): repos = _repos[project] = [] for repo in _request('GET', ['build', project]).findall('entry'): - repo = repo.get('name') - arches = _request('GET', ['build', project, repo]) - lsb_id, lsb_release = repo.split('-', 1) - repos.append({ - 'lsb_id': lsb_id, - 'lsb_release': lsb_release, - 'name': repo, - 'arches': [i.get('name') for i in arches.findall('entry')], - }) + name = repo.get('name') + arches = _request('GET', ['build', project, name]) + info = {'name': name, + 'arches': [i.get('name') for i in arches.findall('entry')], + } + if '-' in name: + info['lsb_id'], info['lsb_release'] = name.split('-', 1) + repos.append(info) return repos diff --git a/sugar_network/client/packagekit.py b/sugar_network/toolkit/packagekit.py index 68772e8..6003486 100644 --- a/sugar_network/client/packagekit.py +++ b/sugar_network/toolkit/packagekit.py @@ -54,6 +54,29 @@ def install(names): resp.error_details, resp.error_code) +def cleanup_distro_version(version): + if ':' in version: + # Skip 'epoch' + version = version.split(':', 1)[1] + version = version.replace('_', '-') + if '~' in version: + version, suffix = version.split('~', 1) + if suffix.startswith('pre'): + suffix = suffix[3:] + suffix = '-pre' + (cleanup_distro_version(suffix) or '') + else: + suffix = '' + match = _VERSION_RE.match(version) + if match: + major, version, revision = match.groups() + if major is not None: + version = major[:-1].rstrip('.') + '.' + version + if revision is not None: + version = '%s-%s' % (version, revision[2:]) + return version + suffix + return None + + def _resolve(names): result = {} @@ -106,7 +129,7 @@ def _pk(result, op, *args): def Package_cb(status, pk_id, summary): package_name, version, arch, __ = pk_id.split(';') - clean_version = _cleanup_distro_version(version) + clean_version = cleanup_distro_version(version) if not clean_version: _logger.warn('Cannot parse distribution version "%s" ' 'for package "%s"', version, package_name) @@ -159,29 +182,6 @@ def _canonicalize_machine(arch): return 'i686' -def _cleanup_distro_version(version): - if ':' in version: - # Skip 'epoch' - version = version.split(':', 1)[1] - version = version.replace('_', '-') - if '~' in version: - version, suffix = version.split('~', 1) - if suffix.startswith('pre'): - suffix = suffix[3:] - suffix = '-pre' + (_cleanup_distro_version(suffix) or '') - else: - suffix = '' - match = _VERSION_RE.match(version) - if match: - major, version, revision = match.groups() - if major is not None: - version = major[:-1].rstrip('.') + '.' + version - if revision is not None: - version = '%s-%s' % (version, revision[2:]) - return version + suffix - return None - - _DOTTED_RE = r'[0-9]+(?:\.[0-9]+)*' # Matche a version number that would be a valid version without modification _RELEASE_RE = '(?:%s)(?:-(?:pre|rc|post|)(?:%s))*' % (_DOTTED_RE, _DOTTED_RE) diff --git a/tests/units/client/__main__.py b/tests/units/client/__main__.py index 2a67dae..6944c5f 100644 --- a/tests/units/client/__main__.py +++ b/tests/units/client/__main__.py @@ -6,7 +6,6 @@ from journal import * from client_model import * from client_routes import * from injector import * -from packagekit import * if __name__ == '__main__': tests.main() diff --git a/tests/units/client/injector.py b/tests/units/client/injector.py index 69316e7..2f2cdef 100755 --- a/tests/units/client/injector.py +++ b/tests/units/client/injector.py @@ -12,11 +12,11 @@ from os.path import exists, join, basename from __init__ import tests from sugar_network import db, client -from sugar_network.client import Connection, api, packagekit, injector as injector_, model +from sugar_network.client import Connection, api, injector as injector_, model from sugar_network.client.injector import _PreemptivePool, Injector from sugar_network.client.model import Volume as LocalVolume from sugar_network.toolkit.coroutine import this -from sugar_network.toolkit import http, lsb_release +from sugar_network.toolkit import http, lsb_release, packagekit class InjectorTest(tests.Test): @@ -880,16 +880,16 @@ class InjectorTest(tests.Test): distro = '%s-%s' % (lsb_release.distributor_id(), lsb_release.release()) volume['context'].create({ 'guid': 'package1', 'type': ['package'], 'title': {}, 'summary': {}, 'description': {}, 'releases': { - 'resolves': { + 'resolves': {'value': { distro: {'version': [[1], 0], 'packages': ['pkg1', 'pkg2']}, - }, + }}, }, }) volume['context'].create({ 'guid': 'package2', 'type': ['package'], 'title': {}, 'summary': {}, 'description': {}, 'releases': { - 'resolves': { + 'resolves': {'value': { distro: {'version': [[1], 0], 'packages': ['pkg3', 'pkg4']}, - }, + }}, }, }) diff --git a/tests/units/client/packagekit.py b/tests/units/client/packagekit.py deleted file mode 100755 index 05cd8eb..0000000 --- a/tests/units/client/packagekit.py +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env python -# sugar-lint: disable - -from __init__ import tests - -from sugar_network.client.packagekit import _cleanup_distro_version - - -class Packagekit(tests.Test): - - def test_cleanup_distro_version(self): - self.assertEqual('0.3.1-1', _cleanup_distro_version('1:0.3.1-1')) - self.assertEqual('0.3.1-1', _cleanup_distro_version('0.3.1-1ubuntu0')) - self.assertEqual('0.3-post1-rc2', _cleanup_distro_version('0.3-post1-rc2')) - self.assertEqual('0.3.1-2', _cleanup_distro_version('0.3.1-r2-r3')) - self.assertEqual('6.17', _cleanup_distro_version('6b17')) - self.assertEqual('20-1', _cleanup_distro_version('b20_1')) - self.assertEqual('17', _cleanup_distro_version('p17')) - self.assertEqual('7-pre3-2.1.1-3', _cleanup_distro_version('7~u3-2.1.1-3')) # Debian snapshot - self.assertEqual('7-pre3-2.1.1-pre1-1', _cleanup_distro_version('7~u3-2.1.1~pre1-1ubuntu2')) - self.assertEqual(None, _cleanup_distro_version('cvs')) - - -if __name__ == '__main__': - tests.main() diff --git a/tests/units/node/node_model.py b/tests/units/node/node_model.py index 6501e1d..7850456 100755 --- a/tests/units/node/node_model.py +++ b/tests/units/node/node_model.py @@ -1160,11 +1160,11 @@ class NodeModelTest(tests.Test): 'ctime': 0, 'seqno': 3, }, - 'resolves': { + 'resolves': {'value': { 'Gentoo-2.1': {'status': 'success', 'packages': ['pkg1.bin', 'pkg2.bin', 'pkg3.devel'], 'version': [[1, 0], 0]}, 'Debian-6.0': {'status': 'success', 'packages': ['pkg1.bin', 'pkg2.bin', 'pkg3.devel'], 'version': [[1, 0], 0]}, 'Debian-7.0': {'status': 'success', 'packages': ['pkg1.bin', 'pkg2.bin', 'pkg3.devel'], 'version': [[1, 0], 0]}, - }, + }}, }, volume['context'][guid]['releases']) @@ -1185,9 +1185,9 @@ class NodeModelTest(tests.Test): 'ctime': 0, 'seqno': 5, }, - 'resolves': { + 'resolves': {'value': { 'Gentoo-2.1': {'status': 'success', 'packages': ['pkg1.bin', 'pkg2.bin', 'pkg3.devel'], 'version': [[1, 0], 0]}, - }, + }}, }, volume['context'][guid]['releases']) @@ -1208,9 +1208,9 @@ class NodeModelTest(tests.Test): 'ctime': 0, 'seqno': 7, }, - 'resolves': { + 'resolves': {'value': { 'Debian-6.0': {'status': 'success', 'packages': ['pkg1.bin', 'pkg2.bin', 'pkg3.devel'], 'version': [[1, 0], 0]}, - }, + }}, }, volume['context'][guid]['releases']) @@ -1241,9 +1241,9 @@ class NodeModelTest(tests.Test): 'ctime': 0, 'seqno': 3, }, - 'resolves': { + 'resolves': {'value': { 'Gentoo-2.1': {'status': 'resolve failed'}, - }, + }}, }, volume['context'][guid]['releases']) @@ -1273,11 +1273,11 @@ class NodeModelTest(tests.Test): 'ctime': 0, 'seqno': 3, }, - 'resolves': { + 'resolves': {'value': { 'Gentoo-2.1': {'status': '1'}, 'Debian-6.0': {'status': '1'}, 'Debian-7.0': {'status': '1'}, - }, + }}, }, volume['context'][guid]['releases']) @@ -1296,11 +1296,11 @@ class NodeModelTest(tests.Test): 'ctime': 0, 'seqno': 4, }, - 'resolves': { + 'resolves': {'value': { 'Gentoo-2.1': {'status': '1'}, 'Debian-6.0': {'status': '2'}, 'Debian-7.0': {'status': '2'}, - }, + }}, }, volume['context'][guid]['releases']) @@ -1325,11 +1325,11 @@ class NodeModelTest(tests.Test): 'ctime': 0, 'seqno': 5, }, - 'resolves': { + 'resolves': {'value': { 'Gentoo-2.1': {'status': '1'}, 'Debian-6.0': {'status': '3'}, 'Debian-7.0': {'status': '2'}, - }, + }}, }, volume['context'][guid]['releases']) @@ -1354,11 +1354,11 @@ class NodeModelTest(tests.Test): 'ctime': 0, 'seqno': 5, }, - 'resolves': { + 'resolves': {'value': { 'Gentoo-2.1': {'status': '1'}, 'Debian-6.0': {'status': '3'}, 'Debian-7.0': {'status': '4'}, - }, + }}, }, volume['context'][guid]['releases']) @@ -1781,9 +1781,9 @@ class NodeModelTest(tests.Test): }) volume['context'].create({ 'guid': 'package', 'type': ['package'], 'title': {}, 'summary': {}, 'description': {}, 'releases': { - 'resolves': { + 'resolves': {'value': { 'Ubuntu-10.04': {'version': [[1], 0], 'packages': ['pkg1', 'pkg2']}, - }, + }}, }, }) self.assertEqual({ @@ -1844,9 +1844,9 @@ class NodeModelTest(tests.Test): volume['context'].create({ 'guid': 'package2', 'type': ['package'], 'title': {}, 'summary': {}, 'description': {}, 'releases': { 'Ubuntu': {'value': {'binary': ['bin']}}, - 'resolves': { + 'resolves': {'value': { 'Ubuntu-10.04': {'version': [[1], 0], 'packages': ['pkg1', 'pkg2']}, - }, + }}, }, }) self.assertEqual({ @@ -1871,9 +1871,9 @@ class NodeModelTest(tests.Test): 'guid': 'package1', 'type': ['package'], 'title': {}, 'summary': {}, 'description': {}, 'releases': { '*': {'value': {'binary': ['pkg1']}}, 'Ubuntu': {'value': {'binary': ['pkg2']}}, - 'resolves': { + 'resolves': {'value': { 'Ubuntu-10.04': {'version': [[1], 0], 'packages': ['pkg3']}, - }, + }}, }, }) self.assertEqual({ diff --git a/tests/units/node/node_routes.py b/tests/units/node/node_routes.py index 2332e36..fb7b1c7 100755 --- a/tests/units/node/node_routes.py +++ b/tests/units/node/node_routes.py @@ -702,10 +702,10 @@ class NodeRoutesTest(tests.Test): 'description': 'description', }, principal=Principal('admin', 0xF)) volume['context'].update('package', {'releases': { - 'resolves': { + 'resolves': {'value': { 'Ubuntu-10.04': {'version': [[1], 0], 'packages': ['package.bin']}, 'Ubuntu-12.04': {'version': [[2], 0], 'packages': ['package-fake.bin']}, - }}}) + }}}}) self.assertEqual({ 'activity': { diff --git a/tests/units/node/obs.py b/tests/units/node/obs.py index 21b53a0..2fff158 100755 --- a/tests/units/node/obs.py +++ b/tests/units/node/obs.py @@ -111,7 +111,7 @@ class ObsTest(tests.Test): ('http://pkg2-2.prm', ['4']), ])) - obs.presolve(None, ['pkg1', 'pkg2'], '.') + obs.presolve('Fedora-14', ['pkg1', 'pkg2'], '.') self.assertEqual({ 'arch': [ diff --git a/tests/units/toolkit/__main__.py b/tests/units/toolkit/__main__.py index 2d8530f..45a6810 100644 --- a/tests/units/toolkit/__main__.py +++ b/tests/units/toolkit/__main__.py @@ -15,6 +15,7 @@ from i18n import * from sat import * from packets import * from ranges import * +from packagekit import * if __name__ == '__main__': tests.main() diff --git a/tests/units/toolkit/packagekit.py b/tests/units/toolkit/packagekit.py new file mode 100755 index 0000000..1378e2f --- /dev/null +++ b/tests/units/toolkit/packagekit.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python +# sugar-lint: disable + +from __init__ import tests + +from sugar_network.toolkit.packagekit import cleanup_distro_version + + +class Packagekit(tests.Test): + + def test_cleanup_distro_version(self): + self.assertEqual('0.3.1-1', cleanup_distro_version('1:0.3.1-1')) + self.assertEqual('0.3.1-1', cleanup_distro_version('0.3.1-1ubuntu0')) + self.assertEqual('0.3-post1-rc2', cleanup_distro_version('0.3-post1-rc2')) + self.assertEqual('0.3.1-2', cleanup_distro_version('0.3.1-r2-r3')) + self.assertEqual('6.17', cleanup_distro_version('6b17')) + self.assertEqual('20-1', cleanup_distro_version('b20_1')) + self.assertEqual('17', cleanup_distro_version('p17')) + self.assertEqual('7-pre3-2.1.1-3', cleanup_distro_version('7~u3-2.1.1-3')) # Debian snapshot + self.assertEqual('7-pre3-2.1.1-pre1-1', cleanup_distro_version('7~u3-2.1.1~pre1-1ubuntu2')) + self.assertEqual(None, cleanup_distro_version('cvs')) + + +if __name__ == '__main__': + tests.main() |