diff options
author | Aleksey Lim <alsroot@sugarlabs.org> | 2014-04-28 01:28:15 (GMT) |
---|---|---|
committer | Aleksey Lim <alsroot@sugarlabs.org> | 2014-04-28 01:28:15 (GMT) |
commit | 0438dbe5fba595a11a77c5a311512e48cb9cad33 (patch) | |
tree | a2c1d5ad0745497cf1aa1b35aebf52b172d9cbac | |
parent | 2dbc9b554f322ea23b224d923d9a6475e33ad6e9 (diff) |
Fix starting node
-rwxr-xr-x | sugar-network-node | 7 | ||||
-rw-r--r-- | sugar_network/db/blobs.py | 13 | ||||
-rw-r--r-- | sugar_network/db/metadata.py | 2 | ||||
-rw-r--r-- | sugar_network/db/volume.py | 7 | ||||
-rw-r--r-- | sugar_network/model/__init__.py | 5 | ||||
-rw-r--r-- | sugar_network/node/__init__.py | 2 | ||||
-rw-r--r-- | sugar_network/node/master.py | 6 | ||||
-rw-r--r-- | sugar_network/node/slave.py | 9 | ||||
-rw-r--r-- | tests/__init__.py | 10 | ||||
-rwxr-xr-x | tests/units/client/client_routes.py | 2 | ||||
-rwxr-xr-x | tests/units/node/master.py | 1 | ||||
-rwxr-xr-x | tests/units/node/node_routes.py | 22 | ||||
-rwxr-xr-x | tests/units/node/slave.py | 5 |
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') |