From b81fde744f8621a4fa45cf13d8e452406671be42 Mon Sep 17 00:00:00 2001 From: Aleksey Lim Date: Thu, 04 Oct 2012 15:16:00 +0000 Subject: Fix local checkin/keep commands --- diff --git a/sugar-network b/sugar-network index bcc7015..ad70db2 100755 --- a/sugar-network +++ b/sugar-network @@ -17,6 +17,7 @@ import os import re +import sys import json import shlex import locale @@ -27,6 +28,7 @@ from sugar_network import local, sugar, toolkit, IPCClient from sugar_network.resources.volume import Volume, Request from sugar_network.local.mountset import Mountset from sugar_network.local.mounts import HomeMount, RemoteMount +from sugar_network.local.ipc_client import Router from active_toolkit.options import Option from active_toolkit import printf, application, coroutine, enforce @@ -94,7 +96,8 @@ class Application(application.Application): request[arg] = value pid_path = None - cp = None + server = None + mountset = None try: if not self.check_for_instance(): pid_path = self.new_instance() @@ -105,27 +108,24 @@ class Application(application.Application): else: toolkit.ensure_dsa_pubkey(sugar.profile_path('owner.key')) volume = Volume(local.db_path()) - cp = Mountset(volume) - cp['~'] = HomeMount(volume) - cp['/'] = RemoteMount(volume) - cp['/'].mounted.wait() - else: - cp = IPCClient() - - def events_cb(events): - for event in events: - pass + mountset = Mountset(volume) + mountset['~'] = HomeMount(volume) + mountset['/'] = RemoteMount(volume) + mountset['/'].mounted.wait() + server = coroutine.WSGIServer( + ('localhost', local.ipc_port.value), Router(mountset)) + coroutine.spawn(server.serve_forever) + coroutine.dispatch() - coroutine.spawn(events_cb, cp.subscribe()) - coroutine.dispatch() - result = cp.call(request, response) + result = IPCClient().call(request, response) finally: - cp.close() if pid_path: + server.close() + mountset.close() os.unlink(pid_path) - if result is not None: + if result: if reply: for key in reply: key = _ESCAPE_VALUE_RE.sub("'\\1'", key) @@ -137,7 +137,7 @@ class Application(application.Application): # New defaults application.debug.value = sugar.logger_level() Option.seek('main', [application.debug, anonymous]) -Option.seek('local', [local.api_url, local.layers]) +Option.seek('local', [local.api_url, local.layers, local.ipc_port]) locale.setlocale(locale.LC_ALL, '') diff --git a/sugar_network/local/__init__.py b/sugar_network/local/__init__.py index 6a6d736..6428025 100644 --- a/sugar_network/local/__init__.py +++ b/sugar_network/local/__init__.py @@ -71,7 +71,7 @@ tmpdir = Option( ipc_port = Option( 'port number to listen for incomming connections from IPC clients', - default=5001, type_cast=int) + default=5001, type_cast=int, name='ipc_port') hub_root = Option( 'path to Contributor Hub site directory to serve from /hub location ' diff --git a/sugar_network/local/mounts.py b/sugar_network/local/mounts.py index 7c53121..deba9ea 100644 --- a/sugar_network/local/mounts.py +++ b/sugar_network/local/mounts.py @@ -23,7 +23,7 @@ import active_document as ad from sugar_network.zerosugar import Bundle from sugar_network.local import activities, cache from sugar_network.zerosugar import Spec -from sugar_network.resources.volume import Request +from sugar_network.resources.volume import Request, VolumeCommands from sugar_network import local, checkin, sugar, Client from active_toolkit import util, coroutine, enforce @@ -72,10 +72,10 @@ class _Mount(object): self.publisher(event) -class LocalMount(ad.VolumeCommands, _Mount): +class LocalMount(VolumeCommands, _Mount): def __init__(self, volume): - ad.VolumeCommands.__init__(self, volume) + VolumeCommands.__init__(self, volume) _Mount.__init__(self) volume.connect(self._events_cb) @@ -131,7 +131,7 @@ class LocalMount(ad.VolumeCommands, _Mount): def before_create(self, request, props): props['user'] = [sugar.uid()] props['author'] = [sugar.nickname()] - ad.VolumeCommands.before_create(self, request, props) + VolumeCommands.before_create(self, request, props) def _events_cb(self, event): event['mountpoint'] = self.mountpoint diff --git a/sugar_network/local/mountset.py b/sugar_network/local/mountset.py index 9cc7de6..6810ebc 100644 --- a/sugar_network/local/mountset.py +++ b/sugar_network/local/mountset.py @@ -88,31 +88,29 @@ class Mountset(dict, ad.CommandsProcessor, Commands, SyncCommands): @ad.volume_command(method='PUT', cmd='checkin') def checkin(self, mountpoint, request): - mount = self.get(mountpoint) + mount = self.get(mountpoint or '/') enforce(mount is not None, 'No such mountpoint') mount.mounted.wait() for guid in (request.content or '').split(): _logger.info('Checkin %r context', guid) - mount.call( - Request(method='PUT', document='context', guid=guid, - accept_language=[self._lang], - content={'keep_impl': 2, 'keep': False}), - ad.Response()) + request = Request(method='PUT', document='context', guid=guid, + accept_language=[self._lang]) + request.content = {'keep_impl': 2, 'keep': False} + mount.call(request, ad.Response()) @ad.volume_command(method='PUT', cmd='keep') def keep(self, mountpoint, request): - mount = self.get(mountpoint) + mount = self.get(mountpoint or '/') enforce(mount is not None, 'No such mountpoint') mount.mounted.wait() for guid in (request.content or '').split(): _logger.info('Keep %r context', guid) - mount.call( - Request(method='PUT', document='context', guid=guid, - accept_language=[self._lang], - content={'keep': True}), - ad.Response()) + request = Request(method='PUT', document='context', guid=guid, + accept_language=[self._lang]) + request.content = {'keep': True} + mount.call(request, ad.Response()) @ad.volume_command(method='POST', cmd='publish') def _publish(self, request): diff --git a/sugar_network/node/commands.py b/sugar_network/node/commands.py index c918f1d..758bd32 100644 --- a/sugar_network/node/commands.py +++ b/sugar_network/node/commands.py @@ -22,7 +22,7 @@ import active_document as ad from sugar_network import node from sugar_network.node.sync_master import SyncCommands from sugar_network.node import auth -from sugar_network.resources.volume import Commands +from sugar_network.resources.volume import Commands, VolumeCommands from sugar_network.toolkit import router from active_toolkit import util, enforce @@ -32,10 +32,10 @@ _DEFAULT_MASTER_GUID = 'api-testing.network.sugarlabs.org' _logger = logging.getLogger('node.commands') -class NodeCommands(ad.VolumeCommands, Commands): +class NodeCommands(VolumeCommands, Commands): def __init__(self, volume): - ad.VolumeCommands.__init__(self, volume) + VolumeCommands.__init__(self, volume) Commands.__init__(self) self._is_master = False @@ -86,7 +86,7 @@ class NodeCommands(ad.VolumeCommands, Commands): directory.update(guid, {'layer': ['deleted']}) def resolve(self, request): - cmd = ad.VolumeCommands.resolve(self, request) + cmd = VolumeCommands.resolve(self, request) if cmd is None: return @@ -152,12 +152,12 @@ class NodeCommands(ad.VolumeCommands, Commands): implement = implement[0] props['guid'] = implement - ad.VolumeCommands.before_create(self, request, props) + VolumeCommands.before_create(self, request, props) def before_update(self, request, props): if 'user' in props: self._set_author(props) - ad.VolumeCommands.before_update(self, request, props) + VolumeCommands.before_update(self, request, props) @ad.directory_command_pre(method='GET') def _NodeCommands_find_pre(self, request): diff --git a/sugar_network/resources/volume.py b/sugar_network/resources/volume.py index 376bb2a..df43c26 100644 --- a/sugar_network/resources/volume.py +++ b/sugar_network/resources/volume.py @@ -25,7 +25,7 @@ from sugar_network.toolkit.sneakernet import DiskFull from sugar_network.toolkit.collection import Sequence from sugar_network.toolkit import http from active_toolkit.sockets import BUFFER_SIZE -from active_toolkit import coroutine +from active_toolkit import coroutine, enforce ad_directory._LAYOUT_VERSION = 2 @@ -266,3 +266,40 @@ class Commands(object): self._notifier.set(event) self._notifier = coroutine.AsyncResult() coroutine.dispatch() + + +class VolumeCommands(ad.VolumeCommands): + + @ad.document_command(method='GET', cmd='deplist', + mime_type='application/json') + def deplist(self, document, guid, repo, layer): + """List of native packages context is dependening on. + + Command return only GNU/Linux package names and ignores + Sugar Network dependencies. + + :param repo: + OBS repository name to get package names for, e.g., + Fedora-14 + :param layer: + restrict dependencies only to the specified Sugar Network layer + :returns: + list of package names + + """ + enforce(document == 'context') + versions, total = self.volume['implementation'].find( + limit=1, order_by='-version', context=guid, layer=layer) + enforce(total, ad.NotFound, 'No implementations') + + result = [] + + spec = [i for i in versions][0]['spec'] + for dep in spec.get('*-*', {}).get('requires', {}).keys(): + try: + dep = self.volume['context'].get(dep) + except Exception: + continue + result.extend(dep['packages'].get(repo, {}).get('binary', [])) + + return result -- cgit v0.9.1