diff options
Diffstat (limited to 'sugar_network/node')
-rw-r--r-- | sugar_network/node/master.py | 11 | ||||
-rw-r--r-- | sugar_network/node/model.py | 121 | ||||
-rw-r--r-- | sugar_network/node/obs.py | 22 |
3 files changed, 77 insertions, 77 deletions
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 |