Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksey Lim <alsroot@sugarlabs.org>2014-05-02 08:00:38 (GMT)
committer Aleksey Lim <alsroot@sugarlabs.org>2014-05-02 12:15:03 (GMT)
commit4596cf36203db51cd371b21fd6639b9c55166f17 (patch)
tree04f233d0ac0c2a77c7ee8799f76d7c23d8847866
parentd575dade236cd1c5ca345b79dc7a29f5d9a6959e (diff)
Node command to regerate package resolves/presolves
-rw-r--r--TODO1
-rwxr-xr-xsugar-network-node27
-rw-r--r--sugar_network/client/injector.py4
-rw-r--r--sugar_network/db/blobs.py2
-rw-r--r--sugar_network/db/resource.py6
-rw-r--r--sugar_network/node/master.py11
-rw-r--r--sugar_network/node/model.py121
-rw-r--r--sugar_network/node/obs.py22
-rw-r--r--sugar_network/toolkit/packagekit.py (renamed from sugar_network/client/packagekit.py)48
-rw-r--r--tests/units/client/__main__.py1
-rwxr-xr-xtests/units/client/injector.py12
-rwxr-xr-xtests/units/client/packagekit.py25
-rwxr-xr-xtests/units/node/node_model.py44
-rwxr-xr-xtests/units/node/node_routes.py4
-rwxr-xr-xtests/units/node/obs.py2
-rw-r--r--tests/units/toolkit/__main__.py1
-rwxr-xr-xtests/units/toolkit/packagekit.py25
17 files changed, 189 insertions, 167 deletions
diff --git a/TODO b/TODO
index 6cef066..27f2742 100644
--- a/TODO
+++ b/TODO
@@ -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()