Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/sugar_network/node/routes.py
diff options
context:
space:
mode:
Diffstat (limited to 'sugar_network/node/routes.py')
-rw-r--r--sugar_network/node/routes.py49
1 files changed, 17 insertions, 32 deletions
diff --git a/sugar_network/node/routes.py b/sugar_network/node/routes.py
index 6323cbc..da6c675 100644
--- a/sugar_network/node/routes.py
+++ b/sugar_network/node/routes.py
@@ -20,9 +20,10 @@ import hashlib
from ConfigParser import ConfigParser
from os.path import join, isdir, exists
-from sugar_network import db, node, toolkit, model
+from sugar_network import db, node, toolkit
from sugar_network.db import files
-from sugar_network.node import stats_user
+from sugar_network.model import FrontRoutes, load_bundle
+from sugar_network.node import stats_user, model
# pylint: disable-msg=W0611
from sugar_network.toolkit.router import route, preroute, postroute, ACL
from sugar_network.toolkit.router import Unauthorized, Request, fallbackroute
@@ -39,11 +40,11 @@ _AUTH_POOL_SIZE = 1024
_logger = logging.getLogger('node.routes')
-class NodeRoutes(db.Routes, model.FrontRoutes):
+class NodeRoutes(db.Routes, FrontRoutes):
def __init__(self, guid, **kwargs):
db.Routes.__init__(self, **kwargs)
- model.FrontRoutes.__init__(self)
+ FrontRoutes.__init__(self)
self._guid = guid
self._auth_pool = pylru.lrucache(_AUTH_POOL_SIZE)
self._auth_config = None
@@ -120,7 +121,7 @@ class NodeRoutes(db.Routes, model.FrontRoutes):
def submit_release(self, request, initial):
blob = files.post(request.content_stream)
try:
- context, release = model.load_bundle(blob, initial=initial)
+ context, release = load_bundle(blob, initial=initial)
except Exception:
files.delete(blob.digest)
raise
@@ -144,40 +145,24 @@ class NodeRoutes(db.Routes, model.FrontRoutes):
layer = list(set(doc['layer']) - set(request.content))
directory.update(request.guid, {'layer': layer})
+ @route('GET', ['context', None], cmd='solve',
+ arguments={'requires': list, 'stability': list},
+ mime_type='application/json')
+ def solve(self, request):
+ solution = model.solve(self.volume, request.guid, **request)
+ enforce(solution is not None, 'Failed to solve')
+ return solution
+
@route('GET', ['context', None], cmd='clone',
arguments={'requires': list})
def get_clone(self, request, response):
- deps = {}
- if 'requires' in request:
- for i in request['requires']:
- deps.update(parse_requires(i))
- version = request.get('version')
- if version:
- version = parse_version(version)[0]
- stability = request.get('stability') or 'stable'
-
- recent = None
- context = self.volume['context'][request.guid]
- for release in context['releases'].values():
- release = release.get('value')
- if not release:
- continue
- spec = release['spec']['*-*']
- if version and version != release['release'][0] or \
- stability and stability != release['stability'] or \
- deps and not ensure_requires(spec['requires'], deps):
- continue
- if recent is None or release['release'] > recent['release']:
- recent = release
- enforce(recent, http.NotFound, 'No releases found')
-
- response.meta = recent
- return files.get(recent['spec']['*-*']['bundle'])
+ response.meta = self.solve(request)
+ return files.get(response.meta['files'][request.guid])
@route('HEAD', ['context', None], cmd='clone',
arguments={'requires': list})
def head_clone(self, request, response):
- self.get_clone(request, response)
+ response.meta = self.solve(request)
@route('GET', ['user', None], cmd='stats-info',
mime_type='application/json', acl=ACL.AUTH)