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-04-28 01:28:15 (GMT)
committer Aleksey Lim <alsroot@sugarlabs.org>2014-04-28 01:28:15 (GMT)
commit0438dbe5fba595a11a77c5a311512e48cb9cad33 (patch)
treea2c1d5ad0745497cf1aa1b35aebf52b172d9cbac
parent2dbc9b554f322ea23b224d923d9a6475e33ad6e9 (diff)
Fix starting node
-rwxr-xr-xsugar-network-node7
-rw-r--r--sugar_network/db/blobs.py13
-rw-r--r--sugar_network/db/metadata.py2
-rw-r--r--sugar_network/db/volume.py7
-rw-r--r--sugar_network/model/__init__.py5
-rw-r--r--sugar_network/node/__init__.py2
-rw-r--r--sugar_network/node/master.py6
-rw-r--r--sugar_network/node/slave.py9
-rw-r--r--tests/__init__.py10
-rwxr-xr-xtests/units/client/client_routes.py2
-rwxr-xr-xtests/units/node/master.py1
-rwxr-xr-xtests/units/node/node_routes.py22
-rwxr-xr-xtests/units/node/slave.py5
13 files changed, 50 insertions, 41 deletions
diff --git a/sugar-network-node b/sugar-network-node
index ecb4ecb..e836c1a 100755
--- a/sugar-network-node
+++ b/sugar-network-node
@@ -50,6 +50,8 @@ class Application(application.Daemon):
'No write access to %r directory', node.data_root.value)
def run(self):
+ enforce(node.master_api.value, 'Option --master-api missed')
+
ssl_args = {}
if node.keyfile.value:
ssl_args['keyfile'] = node.keyfile.value
@@ -65,11 +67,10 @@ class Application(application.Daemon):
resources = slave.RESOURCES
logging.info('Start slave node')
volume = Volume(node.data_root.value, resources)
- node_routes = node_routes_class(volume=volume,
- auth=SugarAuth(node.data_root.value),
+ node_routes = node_routes_class(node.master_api.value,
+ volume=volume, auth=SugarAuth(node.data_root.value),
find_limit=node.find_limit.value)
self.jobs.spawn(volume.populate)
- self.jobs.spawn(node_routes.populate)
logging.info('Listening for requests on %s:%s',
node.host.value, node.port.value)
diff --git a/sugar_network/db/blobs.py b/sugar_network/db/blobs.py
index 94e914c..95f1a4e 100644
--- a/sugar_network/db/blobs.py
+++ b/sugar_network/db/blobs.py
@@ -170,11 +170,11 @@ class Blobs(object):
_logger.debug('Wipe %r file', path)
os.unlink(path)
- def populate(self, path=None, recursive=True):
- for __ in self.diff([[1, None]], path or '', recursive):
- pass
+ def populate(self, path=None):
+ for __ in self.diff([[1, None]], path or '', yield_files=False):
+ yield
- def diff(self, r, path=None, recursive=True):
+ def diff(self, r, path=None, recursive=True, yield_files=True):
is_files = path is not None
checkin_seqno = None
@@ -220,7 +220,10 @@ class Blobs(object):
continue
digest = join(rel_root, filename)
meta.append(('path', digest))
- yield File(path, digest, meta)
+ if yield_files:
+ yield File(path, digest, meta)
+ else:
+ yield
def patch(self, patch, seqno=0):
if 'path' in patch.meta:
diff --git a/sugar_network/db/metadata.py b/sugar_network/db/metadata.py
index d7d9065..53034aa 100644
--- a/sugar_network/db/metadata.py
+++ b/sugar_network/db/metadata.py
@@ -438,6 +438,6 @@ class Authors(Dict):
def encode(self, value):
for guid, props in value.items():
if 'name' in props:
- yield props['name']
+ yield toolkit.ascii(props['name'])
if not (props['role'] & ACL.INSYSTEM):
yield guid
diff --git a/sugar_network/db/volume.py b/sugar_network/db/volume.py
index 25ae1bb..c293140 100644
--- a/sugar_network/db/volume.py
+++ b/sugar_network/db/volume.py
@@ -91,9 +91,10 @@ class Volume(dict):
cls.close()
def populate(self):
- for cls in self.values():
- for __ in cls.populate():
- coroutine.dispatch()
+ for resource in self.resources:
+ self.__getitem__(resource)
+ for __ in self.blobs.populate():
+ pass
def broadcast(self, event):
if not self.mute:
diff --git a/sugar_network/model/__init__.py b/sugar_network/model/__init__.py
index 6a314f5..d979772 100644
--- a/sugar_network/model/__init__.py
+++ b/sugar_network/model/__init__.py
@@ -34,8 +34,9 @@ POST_TYPES = [
'review', # Review the Context
'object', # Object generated by Context application
'question', # Q&A request
- 'answer', # Q&A response
- 'issue', # Propblem with the Context
+ 'problem', # Problem with the Context
+ 'idea', # An idea fr the Context
+ 'solution', # Solution for question|problem|idea
'announce', # General announcement
'notification', # Auto-generated Post for updates within the Context
'feedback', # Review parent Post
diff --git a/sugar_network/node/__init__.py b/sugar_network/node/__init__.py
index 14d675c..66bd37e 100644
--- a/sugar_network/node/__init__.py
+++ b/sugar_network/node/__init__.py
@@ -46,5 +46,5 @@ mode = Option(
default='slave')
master_api = Option(
- 'master API url either to connect to (for slave or proxy nodes), or,'
+ 'master API url either to connect to (for slave or proxy nodes), or, '
'to provide from (for master nodes)')
diff --git a/sugar_network/node/master.py b/sugar_network/node/master.py
index c94d047..d51d85b 100644
--- a/sugar_network/node/master.py
+++ b/sugar_network/node/master.py
@@ -19,7 +19,7 @@ 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, master_api, model
+from sugar_network.node import obs, model
from sugar_network.node.routes import NodeRoutes
from sugar_network.toolkit.router import route, ACL
from sugar_network.toolkit.coroutine import this
@@ -33,8 +33,8 @@ _logger = logging.getLogger('node.master')
class MasterRoutes(NodeRoutes):
- def __init__(self, **kwargs):
- NodeRoutes.__init__(self, urlsplit(master_api.value).netloc, **kwargs)
+ def __init__(self, master_api, **kwargs):
+ NodeRoutes.__init__(self, urlsplit(master_api).netloc, **kwargs)
self._pulls = pylru.lrucache(1024)
@route('POST', cmd='sync', arguments={'accept_length': int})
diff --git a/sugar_network/node/slave.py b/sugar_network/node/slave.py
index 176defd..babf1f0 100644
--- a/sugar_network/node/slave.py
+++ b/sugar_network/node/slave.py
@@ -25,7 +25,7 @@ from sugar_network import toolkit
from sugar_network.model.context import Context
from sugar_network.model.post import Post
from sugar_network.model.report import Report
-from sugar_network.node import master_api, 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.coroutine import this
@@ -39,7 +39,7 @@ _logger = logging.getLogger('node.slave')
class SlaveRoutes(NodeRoutes):
- def __init__(self, volume, **kwargs):
+ def __init__(self, master_api, volume, **kwargs):
guid_path = join(volume.root, 'etc', 'node')
if exists(guid_path):
with file(guid_path) as f:
@@ -54,12 +54,13 @@ class SlaveRoutes(NodeRoutes):
vardir = join(volume.root, 'var')
self._push_r = toolkit.Bin(join(vardir, 'push.ranges'), [[1, None]])
self._pull_r = toolkit.Bin(join(vardir, 'pull.ranges'), [[1, None]])
- self._master_guid = urlsplit(master_api.value).netloc
+ self._master_guid = urlsplit(master_api).netloc
+ self._master_api = master_api
@route('POST', cmd='online_sync', acl=ACL.LOCAL,
arguments={'no_pull': bool})
def online_sync(self, no_pull=False):
- conn = http.Connection(master_api.value)
+ conn = http.Connection(self._master_api)
response = conn.request('POST',
data=packets.encode(self._export(not no_pull), header={
'from': self.guid,
diff --git a/tests/__init__.py b/tests/__init__.py
index 652117c..b890003 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -284,7 +284,7 @@ class Test(unittest.TestCase):
classes = master.RESOURCES
#self.touch(('master/etc/private/node', file(join(root, 'data', NODE_UID)).read()))
self.node_volume = NodeVolume('master', classes)
- self.node_routes = routes(volume=self.node_volume, auth=SugarAuth('master'))
+ self.node_routes = routes(node.master_api.value, volume=self.node_volume, auth=SugarAuth('master'))
self.node_router = Router(self.node_routes)
self.node = coroutine.WSGIServer(('127.0.0.1', 7777), self.node_router)
coroutine.spawn(self.node.serve_forever)
@@ -297,14 +297,14 @@ class Test(unittest.TestCase):
if classes is None:
classes = master.RESOURCES
- def node():
+ def _node():
volume = NodeVolume('master', classes)
if cb is not None:
cb(volume)
- node = coroutine.WSGIServer(('127.0.0.1', 7777), Router(routes(volume=volume, auth=SugarAuth('master'))))
- node.serve_forever()
+ anode = coroutine.WSGIServer(('127.0.0.1', 7777), Router(routes(node.master_api.value, volume=volume, auth=SugarAuth('master'))))
+ anode.serve_forever()
- pid = self.fork(node)
+ pid = self.fork(_node)
coroutine.sleep(.1)
return pid
diff --git a/tests/units/client/client_routes.py b/tests/units/client/client_routes.py
index 8b5bf32..c000442 100755
--- a/tests/units/client/client_routes.py
+++ b/tests/units/client/client_routes.py
@@ -1039,7 +1039,7 @@ class ClientRoutesTest(tests.Test):
subscribe_tries = 0
- def __init__(self, volume, auth, *args):
+ def __init__(self, master_api, volume, auth, *args):
pass
@route('GET', cmd='status', mime_type='application/json')
diff --git a/tests/units/node/master.py b/tests/units/node/master.py
index fa879ef..b2ca8c0 100755
--- a/tests/units/node/master.py
+++ b/tests/units/node/master.py
@@ -19,7 +19,6 @@ from __init__ import tests
from sugar_network.client import Connection as Connection_, api
from sugar_network.db.directory import Directory
from sugar_network import db, node, toolkit
-from sugar_network.node.master import MasterRoutes
from sugar_network.node.model import User
from sugar_network.db.volume import Volume
from sugar_network.toolkit.router import Response, File
diff --git a/tests/units/node/node_routes.py b/tests/units/node/node_routes.py
index 5981c2f..c781792 100755
--- a/tests/units/node/node_routes.py
+++ b/tests/units/node/node_routes.py
@@ -20,7 +20,6 @@ from sugar_network.client import Connection
from sugar_network.toolkit import http, coroutine
from sugar_network.node import routes as node_routes
from sugar_network.node.routes import NodeRoutes
-from sugar_network.node.master import MasterRoutes
from sugar_network.model.context import Context
from sugar_network.node.model import User
from sugar_network.node.auth import Principal
@@ -45,7 +44,7 @@ class NodeRoutesTest(tests.Test):
class Routes(NodeRoutes):
- def __init__(self, **kwargs):
+ def __init__(self, master_api, **kwargs):
NodeRoutes.__init__(self, 'node', **kwargs)
@route('GET', [None, None], cmd='probe1', acl=ACL.AUTH)
@@ -74,7 +73,7 @@ class NodeRoutesTest(tests.Test):
class Routes(NodeRoutes):
- def __init__(self, **kwargs):
+ def __init__(self, master_api, **kwargs):
NodeRoutes.__init__(self, 'node', **kwargs)
@route('GET', [None, None], cmd='probe1', acl=ACL.AUTH | ACL.AUTHOR)
@@ -126,7 +125,7 @@ class NodeRoutesTest(tests.Test):
class Routes(NodeRoutes):
- def __init__(self, **kwargs):
+ def __init__(self, master_api, **kwargs):
NodeRoutes.__init__(self, 'node', **kwargs)
@route('PROBE', acl=ACL.AUTH)
@@ -187,7 +186,7 @@ class NodeRoutesTest(tests.Test):
class Routes(NodeRoutes):
- def __init__(self, **kwargs):
+ def __init__(self, master_api, **kwargs):
NodeRoutes.__init__(self, 'node', **kwargs)
@route('PROBE', acl=ACL.AUTH)
@@ -210,7 +209,7 @@ class NodeRoutesTest(tests.Test):
class Routes(NodeRoutes):
- def __init__(self, **kwargs):
+ def __init__(self, master_api, **kwargs):
NodeRoutes.__init__(self, 'node', **kwargs)
@route('PROBE', acl=ACL.AUTH)
@@ -225,7 +224,7 @@ class NodeRoutesTest(tests.Test):
class Routes(NodeRoutes):
- def __init__(self, **kwargs):
+ def __init__(self, master_api, **kwargs):
NodeRoutes.__init__(self, 'node', **kwargs)
@route('PROBE', acl=ACL.AUTH)
@@ -362,7 +361,8 @@ class NodeRoutesTest(tests.Test):
client = Connection()
self.touch(('master/files/packages/repo/arch/package', 'file'))
- volume.blobs.populate()
+ for __ in volume.blobs.populate():
+ pass
self.assertEqual([], client.get(['packages']))
self.assertEqual([], client.get(['packages', 'repo']))
@@ -374,9 +374,11 @@ class NodeRoutesTest(tests.Test):
ipc = Connection()
self.touch('master/files/packages/repo/1', 'master/files/packages/repo/1.1')
- volume.blobs.populate()
+ for __ in volume.blobs.populate():
+ pass
self.touch('master/files/packages/repo/2', 'master/files/packages/repo/2.2')
- volume.blobs.populate()
+ for __ in volume.blobs.populate():
+ pass
self.assertEqual(
sorted(['1', '2']),
diff --git a/tests/units/node/slave.py b/tests/units/node/slave.py
index 9265a7b..67a9d1c 100755
--- a/tests/units/node/slave.py
+++ b/tests/units/node/slave.py
@@ -50,7 +50,7 @@ class SlaveTest(tests.Test):
self.Document = Document
self.slave_volume = Volume('slave', [User, Document])
- self.slave_routes = SlaveRoutes(volume=self.slave_volume, auth=SugarAuth('slave'))
+ self.slave_routes = SlaveRoutes(master_api.value, volume=self.slave_volume, auth=SugarAuth('slave'))
self.slave_server = coroutine.WSGIServer(('127.0.0.1', 8888), Router(self.slave_routes))
coroutine.spawn(self.slave_server.serve_forever)
coroutine.dispatch()
@@ -418,7 +418,8 @@ class SlaveTest(tests.Test):
slave.put(['document', guid, 'title'], 'probe')
self.slave_volume.blobs.post('a')
self.touch(('slave/files/foo/bar', 'bb'))
- self.slave_volume.blobs.populate()
+ for __ in self.slave_volume.blobs.populate():
+ pass
slave.post(cmd='offline_sync', path=tests.tmpdir + '/sync')