diff options
author | Aleksey Lim <alsroot@sugarlabs.org> | 2014-05-02 15:15:05 (GMT) |
---|---|---|
committer | Aleksey Lim <alsroot@sugarlabs.org> | 2014-05-02 15:15:05 (GMT) |
commit | 06c7ebd2508f354d48be59d3842034c0d477ed20 (patch) | |
tree | e0da9dfc63ec067ad83ba11f72ff33cc0d089396 | |
parent | 7d9ab73af830f79db29f8f15133e0293810e0db1 (diff) |
Pass info about installed packages to solve API command
-rw-r--r-- | TODO | 1 | ||||
-rw-r--r-- | sugar_network/node/model.py | 37 | ||||
-rw-r--r-- | sugar_network/node/routes.py | 18 | ||||
-rwxr-xr-x | tests/units/node/node_model.py | 2 |
4 files changed, 32 insertions, 26 deletions
@@ -6,6 +6,7 @@ - pull node changes periodically for checked-in contexts - refount blobs on node and client sides to delete orphaned ones - secure node-to-node sync +- detailed error messages for broken solves v1.0 ==== diff --git a/sugar_network/node/model.py b/sugar_network/node/model.py index 545993f..77ee978 100644 --- a/sugar_network/node/model.py +++ b/sugar_network/node/model.py @@ -286,7 +286,7 @@ def apply_batch(path): def solve(volume, top_context, command=None, lsb_id=None, lsb_release=None, - stability=None, requires=None): + stability=None, requires=None, assume=None): top_context = volume['context'][top_context] if stability is None: stability = ['stable'] @@ -309,8 +309,11 @@ def solve(volume, top_context, command=None, lsb_id=None, lsb_release=None, context_clauses = {} clauses = [] - _logger.debug('Solve %r lsb_id=%r lsb_release=%r stability=%r requires=%r', - top_context.guid, lsb_id, lsb_release, stability, top_requires) + _logger.debug( + 'Solve %r lsb_id=%r lsb_release=%r stability=%r requires=%r ' + 'assume=%r', + top_context.guid, lsb_id, lsb_release, stability, top_requires, + assume) def rate_release(digest, release): return [command in release.get('commands', []), @@ -336,25 +339,22 @@ def solve(volume, top_context, command=None, lsb_id=None, lsb_release=None, clause = [] if 'package' in context['type']: - pkg_lst = None - pkg_ver = [] - pkg = None - if 'resolves' in releases: - pkg = releases['resolves']['value'].get(lsb_distro) - if pkg: - pkg_ver = pkg['version'] - pkg_lst = pkg['packages'] + pkg_info = {} + if assume and context.guid in assume: + pkg_info['version'] = assume[context.guid] + elif 'resolves' in releases and \ + lsb_distro in releases['resolves']['value']: + pkg = releases['resolves']['value'][lsb_distro] + pkg_info['version'] = pkg['version'] + pkg_info['packages'] = pkg['packages'] else: alias = releases.get(lsb_id) or releases.get('*') if alias: - alias = alias['value'] - pkg_lst = alias.get('binary', []) + alias.get('devel', []) - if pkg_lst: + pkg_info['version'] = [] + pkg_info['packages'] = alias['value']['binary'] + if pkg_info: clause.append(len(varset)) - varset.append(( - context.guid, - {'version': pkg_ver, 'packages': pkg_lst}, - )) + varset.append((context.guid, pkg_info)) else: candidates = [] for digest, release in releases.items(): @@ -408,6 +408,7 @@ def solve(volume, top_context, command=None, lsb_id=None, lsb_release=None, if not top_clause: _logger.debug('No versions for %r', top_context.guid) return None + result = sat.solve(clauses + [top_clause], context_clauses) if not result: _logger.debug('Failed to solve %r', top_context.guid) diff --git a/sugar_network/node/routes.py b/sugar_network/node/routes.py index ee28e89..68beb65 100644 --- a/sugar_network/node/routes.py +++ b/sugar_network/node/routes.py @@ -18,7 +18,6 @@ import os import re import json -import time import shutil import logging from os.path import join, exists @@ -26,12 +25,11 @@ from os.path import join, exists from sugar_network import db, toolkit from sugar_network.model import FrontRoutes from sugar_network.node import model -from sugar_network.toolkit.router import ACL, File, Request, Response, route +from sugar_network.toolkit.router import ACL, File, route from sugar_network.toolkit.router import fallbackroute, preroute, postroute -from sugar_network.toolkit.spec import parse_requires, parse_version -from sugar_network.toolkit.bundle import Bundle +from sugar_network.toolkit.spec import parse_version from sugar_network.toolkit.coroutine import this -from sugar_network.toolkit import http, coroutine, ranges, packets, enforce +from sugar_network.toolkit import http, coroutine, ranges, enforce _GROUPED_DIFF_LIMIT = 1024 @@ -160,9 +158,15 @@ class NodeRoutes(db.Routes, FrontRoutes): return blob.digest @route('GET', ['context', None], cmd='solve', - arguments={'requires': list, 'stability': list}, + arguments={'requires': list, 'stability': list, 'assume': list}, mime_type='application/json') - def solve(self): + def solve(self, assume=None): + assume_ = this.request['assume'] = {} + for item in assume or []: + enforce('-' in item, http.BadRequest, + "'assume' should be formed as '<CONTEXT>-<VERSION>") + context, version = item.split('-', 1) + assume_[context] = parse_version(version) solution = model.solve(self.volume, this.request.guid, **this.request) enforce(solution is not None, 'Failed to solve') return solution diff --git a/tests/units/node/node_model.py b/tests/units/node/node_model.py index 7850456..369b0de 100755 --- a/tests/units/node/node_model.py +++ b/tests/units/node/node_model.py @@ -1830,7 +1830,7 @@ class NodeModelTest(tests.Test): }) self.assertEqual({ 'context': {'title': '', 'blob': '1', 'command': ('activity', 'command'), 'version': [[1], 0]}, - 'package1': {'packages': ['bin1', 'bin2', 'devel1', 'devel2'], 'version': []}, + 'package1': {'packages': ['bin1', 'bin2'], 'version': []}, }, model.solve(volume, context, lsb_id='Ubuntu')) |