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 15:15:05 (GMT)
committer Aleksey Lim <alsroot@sugarlabs.org>2014-05-02 15:15:05 (GMT)
commit06c7ebd2508f354d48be59d3842034c0d477ed20 (patch)
treee0da9dfc63ec067ad83ba11f72ff33cc0d089396
parent7d9ab73af830f79db29f8f15133e0293810e0db1 (diff)
Pass info about installed packages to solve API command
-rw-r--r--TODO1
-rw-r--r--sugar_network/node/model.py37
-rw-r--r--sugar_network/node/routes.py18
-rwxr-xr-xtests/units/node/node_model.py2
4 files changed, 32 insertions, 26 deletions
diff --git a/TODO b/TODO
index b956484..92e2063 100644
--- a/TODO
+++ b/TODO
@@ -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'))