From cacd61e0a7404a522e5a14e54aec68ef7121e3ff Mon Sep 17 00:00:00 2001 From: Aleksey Lim Date: Sun, 01 Sep 2013 10:35:11 +0000 Subject: Add spawnable submit local API route for Report resource --- diff --git a/sugar-network b/sugar-network index cc56837..5276eae 100755 --- a/sugar-network +++ b/sugar-network @@ -143,7 +143,7 @@ class Application(application.Application): conn = self._connect() # XXX Have to proceed auth before uploading data conn.get(cmd='whoami') - guid = conn.upload(['implementation'], path, cmd='release', **props) + guid = conn.upload(['implementation'], path, cmd='submit', **props) if porcelain.value: print guid diff --git a/sugar_network/client/routes.py b/sugar_network/client/routes.py index 55fd92f..268ef38 100644 --- a/sugar_network/client/routes.py +++ b/sugar_network/client/routes.py @@ -16,7 +16,8 @@ import os import logging import httplib -from os.path import join +from zipfile import ZipFile, ZIP_DEFLATED +from os.path import join, basename from sugar_network import db, client, node, toolkit, model from sugar_network.client import journal, implementations @@ -172,11 +173,29 @@ class ClientRoutes(model.FrontRoutes, implementations.Routes, journal.Routes): else: return self.fallback(request, response) + @route('POST', ['report'], cmd='submit', mime_type='text/event-stream') + def submit_report(self, request, response): + logs = request.content.pop('logs') + guid = self.fallback(method='POST', path=['report'], + content=request.content, content_type='application/json') + if logs: + with toolkit.TemporaryFile() as tmpfile: + with ZipFile(tmpfile, 'w', ZIP_DEFLATED) as zipfile: + for path in logs: + zipfile.write(path, basename(path)) + tmpfile.seek(0) + self.fallback(method='PUT', path=['report', guid, 'data'], + content_stream=tmpfile, content_type='application/zip') + yield {'event': 'done', 'guid': guid} + @fallbackroute() def fallback(self, request=None, response=None, method=None, path=None, - cmd=None, **kwargs): + cmd=None, content=None, content_stream=None, content_type=None, + **kwargs): if request is None: - request = Request(method=method, path=path, cmd=cmd) + request = Request(method=method, path=path, cmd=cmd, + content=content, content_stream=content_stream, + content_type=content_type) if response is None: response = Response() request.update(kwargs) diff --git a/sugar_network/node/routes.py b/sugar_network/node/routes.py index 0458258..e34c0ed 100644 --- a/sugar_network/node/routes.py +++ b/sugar_network/node/routes.py @@ -138,10 +138,10 @@ class NodeRoutes(model.VolumeRoutes, model.FrontRoutes): else: return toolkit.iter_file(path) - @route('POST', ['implementation'], cmd='release', + @route('POST', ['implementation'], cmd='submit', arguments={'initial': False}, mime_type='application/json', acl=ACL.AUTH | ACL.AUTHOR) - def release(self, request, document): + def submit_implementation(self, request, document): with toolkit.NamedTemporaryFile() as blob: shutil.copyfileobj(request.content_stream, blob) blob.flush() diff --git a/sugar_network/toolkit/router.py b/sugar_network/toolkit/router.py index b7ba542..dd22b83 100644 --- a/sugar_network/toolkit/router.py +++ b/sugar_network/toolkit/router.py @@ -101,7 +101,8 @@ class Request(dict): subcall = lambda *args: enforce(False) def __init__(self, environ=None, method=None, path=None, cmd=None, - content=None, content_type=None, session=None, **kwargs): + content=None, content_stream=None, content_type=None, session=None, + **kwargs): dict.__init__(self) self.path = [] @@ -113,7 +114,7 @@ class Request(dict): self._dirty_query = False self._if_modified_since = _NOT_SET self._accept_language = _NOT_SET - self._content_stream = _NOT_SET + self._content_stream = content_stream or _NOT_SET self._content_type = content_type or _NOT_SET if environ: diff --git a/tests/__init__.py b/tests/__init__.py index 09149ec..da59a40 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -310,8 +310,8 @@ class Test(unittest.TestCase): coroutine.dispatch() return volume - def start_offline_client(self): - self.home_volume = db.Volume('db', model.RESOURCES) + def start_offline_client(self, resources=None): + self.home_volume = db.Volume('db', resources or model.RESOURCES) commands = ClientRoutes(self.home_volume) server = coroutine.WSGIServer(('127.0.0.1', client.ipc_port.value), Router(commands)) coroutine.spawn(server.serve_forever) diff --git a/tests/units/client/cache.py b/tests/units/client/cache.py index d8c2dde..5ae418e 100755 --- a/tests/units/client/cache.py +++ b/tests/units/client/cache.py @@ -204,7 +204,7 @@ class CacheTest(tests.Test): 'activity_version = 1', 'license = Public Domain', 'stability = stable', - ]])), cmd='release', initial=True) + ]])), cmd='submit', initial=True) impl2 = conn.upload(['implementation'], StringIO(self.zips(['TestActivity/activity/activity.info', [ '[Activity]', 'name = TestActivity', @@ -214,7 +214,7 @@ class CacheTest(tests.Test): 'activity_version = 1', 'license = Public Domain', 'stability = stable', - ]])), cmd='release', initial=True) + ]])), cmd='submit', initial=True) impl3 = conn.upload(['implementation'], StringIO(self.zips(['TestActivity/activity/activity.info', [ '[Activity]', 'name = TestActivity', @@ -224,7 +224,7 @@ class CacheTest(tests.Test): 'activity_version = 1', 'license = Public Domain', 'stability = stable', - ]])), cmd='release', initial=True) + ]])), cmd='submit', initial=True) self.assertEqual('exit', [i for i in conn.get(['context', 'context1'], cmd='launch')][-1]['event']) self.assertEqual([impl1], [i for i in self.client_routes._cache]) @@ -255,7 +255,7 @@ class CacheTest(tests.Test): 'activity_version = 1', 'license = Public Domain', 'stability = stable', - ]])), cmd='release', initial=True) + ]])), cmd='submit', initial=True) conn.put(['context', 'context'], True, cmd='clone') self.assertEqual([], [i for i in self.client_routes._cache]) @@ -274,7 +274,7 @@ class CacheTest(tests.Test): 'activity_version = 2', 'license = Public Domain', 'stability = stable', - ]])), cmd='release', initial=True) + ]])), cmd='submit', initial=True) shutil.rmtree('cache') conn.put(['context', 'context'], True, cmd='clone') diff --git a/tests/units/client/implementations.py b/tests/units/client/implementations.py index 3ed4922..12f4e98 100755 --- a/tests/units/client/implementations.py +++ b/tests/units/client/implementations.py @@ -46,7 +46,7 @@ class Implementations(tests.Test): 'license = Public Domain', 'requires = dep1; dep2', ]]) - impl = conn.upload(['implementation'], StringIO(blob), cmd='release', initial=True) + impl = conn.upload(['implementation'], StringIO(blob), cmd='submit', initial=True) conn.post(['context'], { 'guid': 'dep1', @@ -120,7 +120,7 @@ class Implementations(tests.Test): 'TestActivity/file1', 'TestActivity/test/file2', ) - impl = conn.upload(['implementation'], StringIO(blob), cmd='release', initial=True) + impl = conn.upload(['implementation'], StringIO(blob), cmd='submit', initial=True) conn.put(['context', 'bundle_id'], True, cmd='clone') @@ -144,7 +144,7 @@ class Implementations(tests.Test): 'activity_version = 1', 'license = Public Domain', 'stability = stable', - ]])), cmd='release', initial=True) + ]])), cmd='submit', initial=True) solution = ['http://127.0.0.1:8888', ['stable'], [{ 'license': ['Public Domain'], 'stability': 'stable', @@ -270,7 +270,7 @@ class Implementations(tests.Test): 'activity_version = 1', 'license = Public Domain', 'stability = stable', - ]])), cmd='release', initial=True) + ]])), cmd='submit', initial=True) conn.upload(['implementation'], StringIO(self.zips(['TestActivity/activity/activity.info', [ '[Activity]', 'name = TestActivity', @@ -280,7 +280,7 @@ class Implementations(tests.Test): 'activity_version = 2', 'license = Public Domain', 'stability = testing', - ]])), cmd='release') + ]])), cmd='submit') conn.upload(['implementation'], StringIO(self.zips(['TestActivity/activity/activity.info', [ '[Activity]', 'name = TestActivity', @@ -290,7 +290,7 @@ class Implementations(tests.Test): 'activity_version = 3', 'license = Public Domain', 'stability = buggy', - ]])), cmd='release') + ]])), cmd='submit') cached_path = 'cache/solutions/bu/bundle_id' self.assertEqual('exit', [i for i in conn.get(['context', 'bundle_id'], cmd='launch')][-1]['event']) @@ -338,7 +338,7 @@ class Implementations(tests.Test): '#!/bin/sh', 'cat $6', ]], - )), cmd='release', initial=True) + )), cmd='submit', initial=True) conn.post(['context'], { 'guid': 'document', diff --git a/tests/units/client/offline_routes.py b/tests/units/client/offline_routes.py index d3a11d8..7c98ed0 100755 --- a/tests/units/client/offline_routes.py +++ b/tests/units/client/offline_routes.py @@ -3,6 +3,7 @@ import json from cStringIO import StringIO +from zipfile import ZipFile from os.path import exists from __init__ import tests, src_root @@ -10,6 +11,8 @@ from __init__ import tests, src_root from sugar_network import client, model from sugar_network.client import IPCConnection, implementations, packagekit from sugar_network.client.routes import ClientRoutes +from sugar_network.model.user import User +from sugar_network.model.report import Report from sugar_network.toolkit.router import Router from sugar_network.toolkit import coroutine, http, lsb_release @@ -276,7 +279,7 @@ class OfflineRoutes(tests.Test): 'activity_version = 1', 'license=Public Domain', ]]) - impl = ipc.upload(['implementation'], StringIO(blob), cmd='release', initial=True) + impl = ipc.upload(['implementation'], StringIO(blob), cmd='submit', initial=True) ipc.put(['context', 'bundle_id'], True, cmd='clone') solution = [{ @@ -455,6 +458,32 @@ Can't find all required implementations: self.assertRaises(http.NotFound, ipc.get, ['context', guid]) assert not exists(guid_path) + def test_SubmitReport(self): + ipc = self.home_volume = self.start_offline_client([User, Report]) + + self.touch( + ['file1', 'content1'], + ['file2', 'content2'], + ['file3', 'content3'], + ) + events = [i for i in ipc.post(['report'], {'context': 'context', 'error': 'error', 'logs': [ + tests.tmpdir + '/file1', + tests.tmpdir + '/file2', + tests.tmpdir + '/file3', + ]}, cmd='submit')] + self.assertEqual('done', events[-1]['event']) + guid = events[-1]['guid'] + + self.assertEqual({ + 'context': 'context', + 'error': 'error', + }, + ipc.get(['report', guid], reply=['context', 'error'])) + zipfile = ZipFile('db/report/%s/%s/data.blob' % (guid[:2], guid)) + self.assertEqual('content1', zipfile.read('file1')) + self.assertEqual('content2', zipfile.read('file2')) + self.assertEqual('content3', zipfile.read('file3')) + if __name__ == '__main__': tests.main() diff --git a/tests/units/client/online_routes.py b/tests/units/client/online_routes.py index f4e052e..de9f3f4 100755 --- a/tests/units/client/online_routes.py +++ b/tests/units/client/online_routes.py @@ -7,6 +7,7 @@ import time import copy import shutil import zipfile +from zipfile import ZipFile from cStringIO import StringIO from os.path import exists, lexists, basename @@ -20,6 +21,7 @@ from sugar_network.client.routes import ClientRoutes, Request, Response from sugar_network.node.master import MasterRoutes from sugar_network.db import Volume, Resource from sugar_network.model.user import User +from sugar_network.model.report import Report from sugar_network.model.context import Context from sugar_network.model.implementation import Implementation from sugar_network.model.artifact import Artifact @@ -579,7 +581,7 @@ Can't find all required implementations: 'license=Public Domain', ]) blob = self.zips(['TestActivity/activity/activity.info', activity_info]) - impl = ipc.upload(['implementation'], StringIO(blob), cmd='release', initial=True) + impl = ipc.upload(['implementation'], StringIO(blob), cmd='submit', initial=True) clone_path = 'client/context/bu/bundle_id/.clone' blob_path = tests.tmpdir + '/client/implementation/%s/%s/data.blob' % (impl[:2], impl) solution = [{ @@ -729,7 +731,7 @@ Can't find all required implementations: 'license = Public Domain', ]) blob1 = self.zips(['TestActivity/activity/activity.info', activity_info1]) - impl1 = ipc.upload(['implementation'], StringIO(blob1), cmd='release', initial=True) + impl1 = ipc.upload(['implementation'], StringIO(blob1), cmd='submit', initial=True) activity_info2 = '\n'.join([ '[Activity]', @@ -742,7 +744,7 @@ Can't find all required implementations: 'stability = buggy', ]) blob2 = self.zips(['TestActivity/activity/activity.info', activity_info2]) - impl2 = ipc.upload(['implementation'], StringIO(blob2), cmd='release', initial=True) + impl2 = ipc.upload(['implementation'], StringIO(blob2), cmd='submit', initial=True) self.assertEqual( 'ready', @@ -785,7 +787,7 @@ Can't find all required implementations: 'license = Public Domain', ]) blob = self.zips(['TestActivity/activity/activity.info', activity_info]) - impl = ipc.upload(['implementation'], StringIO(blob), cmd='release', initial=True) + impl = ipc.upload(['implementation'], StringIO(blob), cmd='submit', initial=True) blob_path = 'master/implementation/%s/%s/data.blob' % (impl[:2], impl) self.assertEqual({ @@ -843,7 +845,7 @@ Can't find all required implementations: 'activity_version = 1', 'license=Public Domain', ]]) - impl = ipc.upload(['implementation'], StringIO(blob), cmd='release', initial=True) + impl = ipc.upload(['implementation'], StringIO(blob), cmd='submit', initial=True) coroutine.sleep(.1) solution = [{ @@ -878,7 +880,7 @@ Can't find all required implementations: 'activity_version = 2', 'license=Public Domain', ]]) - impl = ipc.upload(['implementation'], StringIO(blob), cmd='release') + impl = ipc.upload(['implementation'], StringIO(blob), cmd='submit') coroutine.sleep(.1) shutil.rmtree('cache/solutions') @@ -967,7 +969,7 @@ Can't find all required implementations: 'license=Public Domain', ]) blob = self.zips(['TestActivity/activity/activity.info', activity_info]) - impl = ipc.upload(['implementation'], StringIO(blob), cmd='release', initial=True) + impl = ipc.upload(['implementation'], StringIO(blob), cmd='submit', initial=True) solution = [{ 'guid': impl, @@ -1265,7 +1267,7 @@ Can't find all required implementations: def yield_json_and_sleep(self): yield '"' yield 'r' - coroutine.sleep(.5) + coroutine.sleep(1) yield 'emote"' node_pid = self.fork_master([User], NodeRoutes) @@ -1276,10 +1278,10 @@ Can't find all required implementations: self.assertEqual('remote', ipc.get(cmd='sleep')) self.assertEqual('remote\n' * 66, ipc.get(cmd='yield_raw_and_sleep')) self.assertEqual('remote', ipc.get(cmd='yield_json_and_sleep')) - assert time.time() - ts >= 1.5 + assert time.time() - ts >= 2 def kill(): - coroutine.sleep(.25) + coroutine.sleep(.5) self.waitpid(node_pid) coroutine.spawn(kill) @@ -1340,6 +1342,33 @@ Can't find all required implementations: trigger.wait() assert not cp.inline() + def test_SubmitReport(self): + self.home_volume = self.start_online_client([User, Report]) + ipc = IPCConnection() + + self.touch( + ['file1', 'content1'], + ['file2', 'content2'], + ['file3', 'content3'], + ) + events = [i for i in ipc.post(['report'], {'context': 'context', 'error': 'error', 'logs': [ + tests.tmpdir + '/file1', + tests.tmpdir + '/file2', + tests.tmpdir + '/file3', + ]}, cmd='submit')] + self.assertEqual('done', events[-1]['event']) + guid = events[-1]['guid'] + + self.assertEqual({ + 'context': 'context', + 'error': 'error', + }, + ipc.get(['report', guid], reply=['context', 'error'])) + zipfile = ZipFile('master/report/%s/%s/data.blob' % (guid[:2], guid)) + self.assertEqual('content1', zipfile.read('file1')) + self.assertEqual('content2', zipfile.read('file2')) + self.assertEqual('content3', zipfile.read('file3')) + if __name__ == '__main__': tests.main() diff --git a/tests/units/client/routes.py b/tests/units/client/routes.py index 6450e81..50ed910 100755 --- a/tests/units/client/routes.py +++ b/tests/units/client/routes.py @@ -64,7 +64,7 @@ class RoutesTest(tests.Test): 'activity_version = 1', 'license = Public Domain', 'stability = stable', - ]])), cmd='release', initial=True) + ]])), cmd='submit', initial=True) guid2 = 'context2' ipc.upload(['implementation'], StringIO(self.zips(['TestActivity/activity/activity.info', [ '[Activity]', @@ -75,7 +75,7 @@ class RoutesTest(tests.Test): 'activity_version = 1', 'license = Public Domain', 'stability = stable', - ]])), cmd='release', initial=True) + ]])), cmd='submit', initial=True) guid3 = 'context3' guid4 = ipc.post(['context'], { 'guid': 'context4', @@ -254,7 +254,6 @@ class RoutesTest(tests.Test): assert self.node_volume['context'].exists(guid) self.assertEqual(['context'], volume.keys()) - def test_SwitchToOfflineForAbsentOnlineProps(self): volume = db.Volume('client', model.RESOURCES) cp = ClientRoutes(volume, client.api_url.value) diff --git a/tests/units/node/node.py b/tests/units/node/node.py index 3506495..1925a90 100755 --- a/tests/units/node/node.py +++ b/tests/units/node/node.py @@ -689,7 +689,7 @@ class NodeTest(tests.Test): 'requires = sugar>=0.88; dep' ]) bundle1 = self.zips(('topdir/activity/activity.info', activity_info)) - guid1 = json.load(conn.request('POST', ['implementation'], bundle1, params={'cmd': 'release'}).raw) + guid1 = json.load(conn.request('POST', ['implementation'], bundle1, params={'cmd': 'submit'}).raw) impl = volume['implementation'].get(guid1) self.assertEqual('bundle_id', impl['context']) @@ -726,7 +726,7 @@ class NodeTest(tests.Test): 'stability = stable', ]) bundle2 = self.zips(('topdir/activity/activity.info', activity_info)) - guid2 = json.load(conn.request('POST', ['implementation'], bundle2, params={'cmd': 'release'}).raw) + guid2 = json.load(conn.request('POST', ['implementation'], bundle2, params={'cmd': 'submit'}).raw) self.assertEqual('1', volume['implementation'].get(guid1)['version']) self.assertEqual([], volume['implementation'].get(guid1)['layer']) @@ -745,7 +745,7 @@ class NodeTest(tests.Test): 'stability = stable', ]) bundle3 = self.zips(('topdir/activity/activity.info', activity_info)) - guid3 = json.load(conn.request('POST', ['implementation'], bundle3, params={'cmd': 'release'}).raw) + guid3 = json.load(conn.request('POST', ['implementation'], bundle3, params={'cmd': 'submit'}).raw) self.assertEqual('1', volume['implementation'].get(guid1)['version']) self.assertEqual(['deleted'], volume['implementation'].get(guid1)['layer']) @@ -766,7 +766,7 @@ class NodeTest(tests.Test): 'stability = buggy', ]) bundle4 = self.zips(('topdir/activity/activity.info', activity_info)) - guid4 = json.load(conn.request('POST', ['implementation'], bundle4, params={'cmd': 'release'}).raw) + guid4 = json.load(conn.request('POST', ['implementation'], bundle4, params={'cmd': 'submit'}).raw) self.assertEqual('1', volume['implementation'].get(guid1)['version']) self.assertEqual(['deleted'], volume['implementation'].get(guid1)['layer']) @@ -825,7 +825,7 @@ class NodeTest(tests.Test): base64.b64decode('3hIElQAAAAAMAAAAHAAAAHwAAAARAAAA3AAAAAAAAAAgAQAADwAAACEBAAAOAAAAMQEAAA0AAABAAQAACgAAAE4BAAAMAAAAWQEAAA0AAABmAQAAJwAAAHQBAAAUAAAAnAEAABAAAACxAQAABwAAAMIBAAAIAAAAygEAANEBAADTAQAAIQAAAKUDAAATAAAAxwMAABwAAADbAwAAFwAAAPgDAAAhAAAAEAQAAB0AAAAyBAAAQAAAAFAEAAA9AAAAkQQAADUAAADPBAAAFAAAAAUFAAAQAAAAGgUAAAEAAAACAAAABwAAAAAAAAADAAAAAAAAAAwAAAAJAAAAAAAAAAoAAAAEAAAAAAAAAAAAAAALAAAABgAAAAgAAAAFAAAAAENob29zZSBkb2N1bWVudABEb3dubG9hZGluZy4uLgBGaXQgdG8gd2luZG93AEZ1bGxzY3JlZW4ASW1hZ2UgVmlld2VyAE9yaWdpbmFsIHNpemUAUmV0cmlldmluZyBzaGFyZWQgaW1hZ2UsIHBsZWFzZSB3YWl0Li4uAFJvdGF0ZSBhbnRpY2xvY2t3aXNlAFJvdGF0ZSBjbG9ja3dpc2UAWm9vbSBpbgBab29tIG91dABQcm9qZWN0LUlkLVZlcnNpb246IFBBQ0tBR0UgVkVSU0lPTgpSZXBvcnQtTXNnaWQtQnVncy1UbzogClBPVC1DcmVhdGlvbi1EYXRlOiAyMDEyLTA5LTI3IDE0OjU3LTA0MDAKUE8tUmV2aXNpb24tRGF0ZTogMjAxMC0wOS0yMiAxMzo1MCswMjAwCkxhc3QtVHJhbnNsYXRvcjoga3JvbTlyYSA8a3JvbTlyYUBnbWFpbC5jb20+Ckxhbmd1YWdlLVRlYW06IExBTkdVQUdFIDxMTEBsaS5vcmc+Ckxhbmd1YWdlOiAKTUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04CkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKUGx1cmFsLUZvcm1zOiBucGx1cmFscz0zOyBwbHVyYWw9KG4lMTA9PTEgJiYgbiUxMDAhPTExID8gMCA6IG4lMTA+PTIgJiYgbiUxMDw9NCAmJiAobiUxMDA8MTAgfHwgbiUxMDA+PTIwKSA/IDEgOiAyKTsKWC1HZW5lcmF0b3I6IFBvb3RsZSAyLjAuMwoA0JLRi9Cx0LXRgNC40YLQtSDQtNC+0LrRg9C80LXQvdGCANCX0LDQs9GA0YPQt9C60LAuLi4A0KPQvNC10YHRgtC40YLRjCDQsiDQvtC60L3QtQDQn9C+0LvQvdGL0Lkg0Y3QutGA0LDQvQDQn9GA0L7RgdC80L7RgtGAINC60LDRgNGC0LjQvdC+0LoA0JjRgdGC0LjQvdC90YvQuSDRgNCw0LfQvNC10YAA0J/QvtC70YPRh9C10L3QuNC1INC40LfQvtCx0YDQsNC20LXQvdC40LksINC/0L7QtNC+0LbQtNC40YLQtS4uLgDQn9C+0LLQtdGA0L3Rg9GC0Ywg0L/RgNC+0YLQuNCyINGH0LDRgdC+0LLQvtC5INGB0YLRgNC10LvQutC4ANCf0L7QstC10YDQvdGD0YLRjCDQv9C+INGH0LDRgdC+0LLQvtC5INGB0YLRgNC10LvQutC1ANCf0YDQuNCx0LvQuNC30LjRgtGMANCe0YLQtNCw0LvQuNGC0YwA')), ('ImageViewer.activity/activity/activity-imageviewer.svg', svg), ) - impl = json.load(conn.request('POST', ['implementation'], bundle, params={'cmd': 'release'}).raw) + impl = json.load(conn.request('POST', ['implementation'], bundle, params={'cmd': 'submit'}).raw) context = volume['context'].get('org.laptop.ImageViewerActivity') self.assertEqual({ @@ -867,8 +867,8 @@ class NodeTest(tests.Test): ])), ('ImageViewer.activity/activity/activity-imageviewer.svg', ''), ) - self.assertRaises(http.NotFound, conn.request, 'POST', ['implementation'], bundle, params={'cmd': 'release'}) - impl = json.load(conn.request('POST', ['implementation'], bundle, params={'cmd': 'release', 'initial': 1}).raw) + self.assertRaises(http.NotFound, conn.request, 'POST', ['implementation'], bundle, params={'cmd': 'submit'}) + impl = json.load(conn.request('POST', ['implementation'], bundle, params={'cmd': 'submit', 'initial': 1}).raw) context = volume['context'].get('org.laptop.ImageViewerActivity') self.assertEqual({'en': 'Image Viewer'}, context['title']) @@ -897,8 +897,8 @@ class NodeTest(tests.Test): self.override(client, 'sugar_uid', lambda: tests.UID) conn = Connection() - impl1 = json.load(conn.request('POST', ['implementation'], bundle, params={'cmd': 'release', 'initial': 1}).raw) - impl2 = json.load(conn.request('POST', ['implementation'], bundle, params={'cmd': 'release'}).raw) + impl1 = json.load(conn.request('POST', ['implementation'], bundle, params={'cmd': 'submit', 'initial': 1}).raw) + impl2 = json.load(conn.request('POST', ['implementation'], bundle, params={'cmd': 'submit'}).raw) self.assertEqual(['deleted'], volume['implementation'].get(impl1)['layer']) self.assertEqual([], volume['implementation'].get(impl2)['layer']) @@ -912,7 +912,7 @@ class NodeTest(tests.Test): }) conn = Connection() conn.get(cmd='whoami') - self.assertRaises(http.Forbidden, conn.request, 'POST', ['implementation'], bundle, params={'cmd': 'release'}) + self.assertRaises(http.Forbidden, conn.request, 'POST', ['implementation'], bundle, params={'cmd': 'submit'}) self.assertEqual(['deleted'], volume['implementation'].get(impl1)['layer']) self.assertEqual([], volume['implementation'].get(impl2)['layer']) -- cgit v0.9.1