Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksey Lim <alsroot@sugarlabs.org>2012-10-04 15:16:00 (GMT)
committer Aleksey Lim <alsroot@sugarlabs.org>2012-10-04 15:16:00 (GMT)
commitb81fde744f8621a4fa45cf13d8e452406671be42 (patch)
tree595251baec9fbb0b6306528e334ceec6a3118118
parent64d33027a89eee8ebc4b07dcba2f46d8e751c2d5 (diff)
Fix local checkin/keep commands
-rwxr-xr-xsugar-network34
-rw-r--r--sugar_network/local/__init__.py2
-rw-r--r--sugar_network/local/mounts.py8
-rw-r--r--sugar_network/local/mountset.py22
-rw-r--r--sugar_network/node/commands.py12
-rw-r--r--sugar_network/resources/volume.py39
6 files changed, 76 insertions, 41 deletions
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