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 /sugar_network | |
parent | 7d9ab73af830f79db29f8f15133e0293810e0db1 (diff) |
Pass info about installed packages to solve API command
Diffstat (limited to 'sugar_network')
-rw-r--r-- | sugar_network/node/model.py | 37 | ||||
-rw-r--r-- | sugar_network/node/routes.py | 18 |
2 files changed, 30 insertions, 25 deletions
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 |