def ioserveServerOpen(self, buffer=False, **kwa): """ Setup and open a rest server Ioinit attributes valet is Valet instance (wsgi server) mock is Flag if True load mock service endpoints test if Flag if True load test endpoints Parameters: buffer is boolean If True then create wire log buffer for Valet Context: enter Example: do ioserve server open at enter """ if buffer: wlog = WireLog(buffify=True, same=True) result = wlog.reopen() else: wlog = None port = int(self.port.value) app = bottle.app() # create bottle app test = True if self.test.value else False ending.loadAll(app, self.store, test=test) self.valet.value = Valet(port=port, bufsize=131072, wlog=wlog, store=self.store, app=app, ) result = self.valet.value.servant.reopen() if not result: console.terse("Error opening server '{0}' at '{1}'\n".format( self.valet.name, self.valet.value.servant.eha)) return console.concise("Opened server '{0}' at '{1}'\n".format( self.valet.name, self.valet.value.servant.eha,))
def reputationServerOpen(self, buffer=False, **kwa): if buffer: wlog = WireLog(buffify=True, same=True) result = wlog.reopen() else: wlog = None port = int(self.port.value) test = True if self.test.value else False preload = True if self.preload.value else False if test: priming.setupTest() if preload: dbing.preloadTestDbs() else: dbDirPath = self.dbDirPath.value if self.dbDirPath.value else None dbDirPath = os.path.abspath(os.path.expanduser(dbDirPath)) if dbDirPath else None priming.setup(dbDirPath) self.dbDirPath.value = dbing.gDbDirPath app = falcon.API() ending.loadEnds(app, store=self.store) self.valet.value = Valet(port=port, bufsize=131072, wlog=wlog, store=self.store, app=app, timeout=0.5) result = self.valet.value.servant.reopen() if not result: console.terse("Error opening server '{0}' at '{1}'\n".format( self.valet.name, self.valet.value.servant.ha)) return console.concise("Opened server '{0} at '{1}'\n".format( self.valet.name, self.valet.value.servant.ha))
def reputationServerOpen(self, buffer=False, **kwa): """ Sets up and opens a rest server. Ioinit Attributes: valet - Valet instance (wsgi server) port - Server port number dbDirPath - Directory path for the database test - Flag; If True, uses a test configuration if any is available preload - Flag; If True (and test is True), preloads the database for testing Parameters: buffer - Flag; If True, creates wire log buffer for Valet Context: enter Example Usage: do reputation server open at enter """ if buffer: wireLog = WireLog(buffify=True, same=True) result = wireLog.reopen() else: wireLog = None port = int(self.port.value) test = True if self.test.value else False preload = True if self.preload.value else False if test: priming.setupTest() if preload: dbing.preloadTestDbs() else: dbDirPath = self.dbDirPath.value if self.dbDirPath.value else None dbDirPath = os.path.abspath(os.path.expanduser(dbDirPath)) if dbDirPath else None priming.setup(dbDirPath) self.dbDirPath.value = dbing.gDbDirPath app = falcon.API() ending.loadEnds(app, store=self.store) self.valet.value = Valet(port=port, bufsize=131072, wlog=wireLog, store=self.store, app=app, timeout=0.5) result = self.valet.value.servant.reopen() if not result: console.terse("Error opening server '{0}' at '{1}'\n".format( self.valet.name, self.valet.value.servant.ha)) return console.concise("Opened server '{0} at '{1}'\n".format( self.valet.name, self.valet.value.servant.ha))
def backendRequest( method=u'GET', scheme=u'', #default if not in path host=u'localhost', # default if not in path port=None, # default if not in path path=u'/', qargs=None, data=None, store=None, timeout=2.0, buffer=False, ): """ Perform Async ReST request to Backend Server Parameters: Usage: (Inside a generator function) response = yield from backendRequest() response is the response if valid else None before response is completed the yield from yields up an empty string '' once completed then response has a value path can be full url with host port etc path takes precedence over others """ store = store if store is not None else Store(stamp=0.0) if buffer: wlog = WireLog(buffify=buffify, same=True) wlog.reopen() else: wlog = None headers = odict([('Accept', 'application/json'), ('Connection', 'close')]) client = Patron( bufsize=131072, wlog=wlog, store=store, scheme=scheme, hostname=host, port=port, method=method, path=path, qargs=qargs, headers=headers, data=data, reconnectable=False, ) console.concise("Making Backend Request {0} {1} ...\n".format( method, path)) client.transmit() # assumes store clock is advanced elsewhere timer = timing.StoreTimer(store=store, duration=timeout) while ((client.requests or client.connector.txes or not client.responses) and not timer.expired): try: client.serviceAll() except Exception as ex: console.terse( "Error: Servicing backend client. '{0}'\n".format(ex)) raise ex yield b'' # this is eventually yielded by wsgi app while waiting response = None # in case timed out if client.responses: response = client.responses.popleft() client.close() if wlog: wlog.close() return response
def microserviceServerOpen(self, buffer=False, **kwa): """ Setup and open a rest server Ioinit attributes valet is Valet instance (wsgi server) port is server port dbDirPath is directory path for database keepDirPath is directory path for private key files test is Flag if True load test endpoints and test database test is Flag if True and if test is True then preload database for testing fakeHidKind is Flag IF True then enable "fake" HID kind that does not require validation Parameters: buffer is boolean If True then create wire log buffer for Valet Context: enter Example: do bluepea server open at enter """ if buffer: wlog = WireLog(buffify=True, same=True) result = wlog.reopen() else: wlog = None microserviceconstnclass.fakeHidKind = self.fakeHidKind.value # set global flag port = int(self.port.value) ''' test = True if self.test.value else False # use to load test environment preload = True if self.preload.value else False # load test db if test and True if test: priming.setupTest() if preload: dbing.preloadTestDbs() else: keepDirPath = self.keepDirPath.value if self.keepDirPath.value else None # None is default keepDirPath = os.path.abspath(os.path.expanduser(keepDirPath)) if keepDirPath else None dbDirPath = self.dbDirPath.value if self.dbDirPath.value else None # None is default dbDirPath = os.path.abspath(os.path.expanduser(dbDirPath)) if dbDirPath else None priming.setup(keepDirPath=keepDirPath, dbDirPath=dbDirPath) self.dbDirPath.value = dbing.gDbDirPath self.keepDirPath.value = keeping.gKeepDirPath ''' app = falcon.API() # falcon.API instances are callable WSGI apps ending.loadEnds(app, store=self.store) self.valet.value = Valet( port=port, bufsize=131072, wlog=wlog, store=None, app=app, timeout=0.5, ) result = self.valet.value.servant.reopen() if not result: console.terse("Error opening server '{0}' at '{1}'\n".format( self.valet.name, self.valet.value.servant.ha)) return console.concise("Opened server '{0}' at '{1}'\n".format( self.valet.name, self.valet.value.servant.ha, ))
def testBasic(self): """ Test Valet Patron and Bottle """ console.terse("{0}\n".format(self.testBasic.__doc__)) store = Store(stamp=0.0) app = bottle.default_app() # create bottle app @app.get('/echo') @app.get('/echo/<action>') @app.post('/echo') @app.post('/echo/<action>') def echoGet(action=None): """ Echo back request data """ query = dict(bottle.request.query.items()) body = bottle.request.json raw = bottle.request.body.read() form = odict(bottle.request.forms) data = odict(verb=bottle.request.method, url=bottle.request.url, action=action, query=query, form=form, content=body) return data console.terse("{0}\n".format("Building Valet ...\n")) wireLogAlpha = WireLog(buffify=True, same=True) result = wireLogAlpha.reopen() alpha = Valet(port = 6101, bufsize=131072, wlog=wireLogAlpha, store=store, app=app) self.assertIs(alpha.servant.reopen(), True) self.assertEqual(alpha.servant.ha, ('0.0.0.0', 6101)) self.assertEqual(alpha.servant.eha, ('127.0.0.1', 6101)) console.terse("{0}\n".format("Building Patron ...\n")) wireLogBeta = WireLog(buffify=True, same=True) result = wireLogBeta.reopen() path = "http://{0}:{1}/".format('localhost', alpha.servant.eha[1]) beta = Patron(bufsize=131072, wlog=wireLogBeta, store=store, path=path, reconnectable=True) self.assertIs(beta.connector.reopen(), True) self.assertIs(beta.connector.accepted, False) self.assertIs(beta.connector.connected, False) self.assertIs(beta.connector.cutoff, False) request = odict([('method', u'GET'), ('path', u'/echo?name=fame'), ('qargs', odict()), ('fragment', u''), ('headers', odict([('Accept', 'application/json'), ('Content-Length', 0)])), ]) beta.requests.append(request) timer = StoreTimer(store, duration=1.0) while (beta.requests or beta.connector.txes or not beta.responses or not alpha.idle()): alpha.serviceAll() time.sleep(0.05) beta.serviceAll() time.sleep(0.05) store.advanceStamp(0.1) self.assertIs(beta.connector.accepted, True) self.assertIs(beta.connector.connected, True) self.assertIs(beta.connector.cutoff, False) self.assertEqual(len(alpha.servant.ixes), 1) self.assertEqual(len(alpha.reqs), 1) self.assertEqual(len(alpha.reps), 1) requestant = alpha.reqs.values()[0] self.assertEqual(requestant.method, request['method']) self.assertEqual(requestant.url, request['path']) self.assertEqual(requestant.headers, {'accept': 'application/json', 'accept-encoding': 'identity', 'content-length': '0', 'host': 'localhost:6101'}) self.assertEqual(len(beta.responses), 1) response = beta.responses.popleft() self.assertEqual(response['status'], 200) self.assertEqual(response['reason'], 'OK') self.assertEqual(response['body'],bytearray(b'')) self.assertEqual(response['data'],{'action': None, 'content': None, 'form': {}, 'query': {'name': 'fame'}, 'url': 'http://localhost:6101/echo?name=fame', 'verb': 'GET'},) responder = alpha.reps.values()[0] self.assertTrue(responder.status.startswith, str(response['status'])) self.assertEqual(responder.headers, response['headers']) alpha.servant.closeAll() beta.connector.close() wireLogAlpha.close() wireLogBeta.close()
def testTestStream(self): """ Test Valet WSGI service request response stream sse """ console.terse("{0}\n".format(self.testTestStream.__doc__)) store = Store(stamp=0.0) app = bottle.default_app() # create bottle app ending.loadTest(app, store) console.terse("{0}\n".format("Building Valet ...\n")) wireLogAlpha = WireLog(buffify=True, same=True) result = wireLogAlpha.reopen() alpha = Valet(port = 6101, bufsize=131072, wlog=wireLogAlpha, store=store, app=app) self.assertIs(alpha.servant.reopen(), True) self.assertEqual(alpha.servant.ha, ('0.0.0.0', 6101)) self.assertEqual(alpha.servant.eha, ('127.0.0.1', 6101)) console.terse("{0}\n".format("Building Patron ...\n")) wireLogBeta = WireLog(buffify=True, same=True) result = wireLogBeta.reopen() path = "http://{0}:{1}/".format('localhost', alpha.servant.eha[1]) beta = Patron(bufsize=131072, wlog=wireLogBeta, store=store, path=path, reconnectable=True) self.assertIs(beta.connector.reopen(), True) self.assertIs(beta.connector.accepted, False) self.assertIs(beta.connector.connected, False) self.assertIs(beta.connector.cutoff, False) request = odict([('method', u'GET'), ('path', u'/test/stream'), ('qargs', odict()), ('fragment', u''), ('headers', odict([('Accept', 'application/json'), ('Content-Length', 0)])), ('body', None), ]) beta.requests.append(request) timer = StoreTimer(store, duration=1.0) while (not timer.expired): alpha.serviceAll() time.sleep(0.05) beta.serviceAll() time.sleep(0.05) store.advanceStamp(0.1) self.assertIs(beta.connector.accepted, True) self.assertIs(beta.connector.connected, True) self.assertIs(beta.connector.cutoff, False) self.assertEqual(len(alpha.servant.ixes), 1) self.assertEqual(len(alpha.reqs), 1) self.assertEqual(len(alpha.reps), 1) requestant = alpha.reqs.values()[0] self.assertEqual(requestant.method, request['method']) self.assertEqual(requestant.url, request['path']) self.assertEqual(requestant.headers, {'accept': 'application/json', 'accept-encoding': 'identity', 'content-length': '0', 'host': 'localhost:6101'}) #timed out while stream still open so no responses in .responses self.assertIs(beta.waited, True) self.assertIs(beta.respondent.ended, False) self.assertEqual(len(beta.responses), 0) self.assertIn('content-type', beta.respondent.headers) self.assertEqual(beta.respondent.headers['content-type'], 'text/event-stream') self.assertIn('transfer-encoding', beta.respondent.headers) self.assertEqual(beta.respondent.headers['transfer-encoding'], 'chunked') self.assertTrue(len(beta.events) >= 3) self.assertEqual(beta.respondent.retry, 1000) self.assertTrue(int(beta.respondent.leid) >= 2) event = beta.events.popleft() self.assertEqual(event, {'id': '0', 'name': '', 'data': 'START'}) event = beta.events.popleft() self.assertEqual(event, {'id': '1', 'name': '', 'data': '1'}) event = beta.events.popleft() self.assertEqual(event, {'id': '2', 'name': '', 'data': '2'}) beta.events.clear() #keep going until ended timer.restart(duration=1.5) while (not timer.expired): alpha.serviceAll() time.sleep(0.05) beta.serviceAll() time.sleep(0.05) store.advanceStamp(0.1) self.assertTrue(len(beta.events) >= 3) self.assertEqual(beta.respondent.leid, '9') self.assertEqual(beta.events[-2], {'id': '9', 'name': '', 'data': '9'}) self.assertEqual(beta.events[-1], {'id': '9', 'name': '', 'data': 'END'}) beta.events.clear() alpha.servant.closeAll() beta.connector.close() wireLogAlpha.close() wireLogBeta.close()
def testLoadTestEnds(self): """ Test behavior """ console.terse("{0}\n".format(self.testLoadTestEnds.__doc__)) store = Store(stamp=0.0) app = bottle.default_app() # create bottle app ending.loadTest(app, store) console.terse("{0}\n".format("Building Valet ...\n")) wireLogAlpha = WireLog(buffify=True, same=True) result = wireLogAlpha.reopen() alpha = Valet(port = 6101, bufsize=131072, wlog=wireLogAlpha, store=store, app=app) self.assertIs(alpha.servant.reopen(), True) self.assertEqual(alpha.servant.ha, ('0.0.0.0', 6101)) self.assertEqual(alpha.servant.eha, ('127.0.0.1', 6101)) console.terse("{0}\n".format("Building Patron ...\n")) wireLogBeta = WireLog(buffify=True, same=True) result = wireLogBeta.reopen() path = "http://{0}:{1}/".format('localhost', alpha.servant.eha[1]) beta = Patron(bufsize=131072, wlog=wireLogBeta, store=store, path=path, reconnectable=True) self.assertIs(beta.connector.reopen(), True) self.assertIs(beta.connector.accepted, False) self.assertIs(beta.connector.connected, False) self.assertIs(beta.connector.cutoff, False) # get echo request = odict([('method', u'GET'), ('path', u'/test/echo?name=fame'), ('qargs', odict()), ('fragment', u''), ('headers', odict([('Accept', 'application/json'), ('Content-Length', 0)])), ]) beta.requests.append(request) timer = StoreTimer(store, duration=1.0) while (beta.requests or beta.connector.txes or not beta.responses or not alpha.idle()): alpha.serviceAll() time.sleep(0.05) beta.serviceAll() time.sleep(0.05) store.advanceStamp(0.1) self.assertIs(beta.connector.accepted, True) self.assertIs(beta.connector.connected, True) self.assertIs(beta.connector.cutoff, False) self.assertEqual(len(alpha.servant.ixes), 1) self.assertEqual(len(alpha.reqs), 1) self.assertEqual(len(alpha.reps), 1) requestant = alpha.reqs.values()[0] self.assertEqual(requestant.method, request['method']) self.assertEqual(requestant.url, request['path']) self.assertEqual(requestant.headers, {'accept': 'application/json', 'accept-encoding': 'identity', 'content-length': '0', 'host': 'localhost:6101'}) self.assertEqual(len(beta.responses), 1) response = beta.responses.popleft() self.assertEqual(response['status'], 200) self.assertEqual(response['reason'], 'OK') self.assertEqual(response['body'],bytearray(b'')) self.assertEqual(response['data'],{'action': None, 'body': '', 'data': None, 'form': odict([]), 'headers': {'Accept': 'application/json', 'Accept-Encoding': 'identity', 'Content-Length': '0', 'Content-Type': '', 'Host': 'localhost:6101'}, 'query': odict([('name', 'fame')]), 'url': 'http://localhost:6101/test/echo?name=fame', 'verb': 'GET'},) responder = alpha.reps.values()[0] self.assertTrue(responder.status.startswith, str(response['status'])) self.assertEqual(responder.headers, response['headers']) # get routes request = odict([('method', u'GET'), ('path', u'/test/route'), ('qargs', odict()), ('fragment', u''), ('headers', odict([('Accept', 'application/json'), ('Content-Length', 0)])), ]) beta.requests.append(request) timer = StoreTimer(store, duration=1.0) while (beta.requests or beta.connector.txes or not beta.responses or not alpha.idle()): alpha.serviceAll() time.sleep(0.05) beta.serviceAll() time.sleep(0.05) store.advanceStamp(0.1) self.assertIs(beta.connector.accepted, True) self.assertIs(beta.connector.connected, True) self.assertIs(beta.connector.cutoff, False) self.assertEqual(len(alpha.servant.ixes), 1) self.assertEqual(len(alpha.reqs), 1) self.assertEqual(len(alpha.reps), 1) requestant = alpha.reqs.values()[0] self.assertEqual(requestant.method, request['method']) self.assertEqual(requestant.url, request['path']) self.assertEqual(requestant.headers, {'accept': 'application/json', 'accept-encoding': 'identity', 'content-length': '0', 'host': 'localhost:6101'}) self.assertEqual(len(beta.responses), 1) response = beta.responses.popleft() self.assertEqual(response['status'], 200) self.assertEqual(response['reason'], 'OK') self.assertEqual(response['body'], bytearray( b'Web app file is located at /Data/Code/public/ioserve/ios' b'erve/end\n/echo/<action> POST\n/echo POST\n/echo/<actio' b'n> GET\n/echo GET\n/ GET\n/test GET\n/test/route GET\n/te' b'st/echo POST\n/test/echo/<action> POST\n/test/echo GET' b'\n/test/echo/<action> GET\n/test/auth POST\n/test/auth/' b'<token> POST\n/test/auth GET\n/test/auth/<token> GET\n/' b'test/stream GET')) self.assertEqual(response['data'],{ 'action': None, 'body': '', 'data': None, 'form': odict([]), 'headers': {'Accept': 'application/json', 'Accept-Encoding': 'identity', 'Content-Length': '0', 'Content-Type': '', 'Host': 'localhost:6101'}, 'query': odict([('name', 'fame')]), 'url': 'http://localhost:6101/test/echo?name=fame', 'verb': 'GET'},) responder = alpha.reps.values()[0] self.assertTrue(responder.status.startswith, str(response['status'])) self.assertEqual(responder.headers, response['headers']) alpha.servant.closeAll() beta.connector.close() wireLogAlpha.close() wireLogBeta.close()