def start_test_server(cls, env, master_server): methods = AsyncMethods() for method in public_methods.values(): methods.add(method) for method in private_methods.values(): methods.add(method) server = cls(env, master_server, env.cluster_config.JSON_RPC_PORT, methods) server.start() return server
def build_methods(): """Register all supported hive_api/condenser_api.calls.""" # pylint: disable=expression-not-assigned methods = AsyncMethods() [ methods.add(method, 'hive.' + method.__name__) for method in ( hive_api.db_head_state, hive_api.payouts_total, hive_api.payouts_last_24h, hive_api.get_accounts, hive_api.get_accounts_ac, # --- disabled until #92 #hive_api.get_followers, #hive_api.get_following, #hive_api.get_follow_count, #hive_api.get_user_feed, #hive_api.get_blog_feed, #hive_api.get_discussions_by_sort_and_tag, #hive_api.get_related_posts, ) ] [ methods.add(method, 'condenser_api.' + method.__name__) for method in ( condenser_api.get_followers, condenser_api.get_following, condenser_api.get_follow_count, condenser_api.get_content, condenser_api.get_content_replies, condenser_api_get_state, condenser_api_get_trending_tags, condenser_api.get_discussions_by_trending, condenser_api.get_discussions_by_hot, condenser_api.get_discussions_by_promoted, condenser_api.get_discussions_by_created, condenser_api.get_discussions_by_blog, condenser_api.get_discussions_by_feed, condenser_api.get_discussions_by_comments, condenser_api.get_replies_by_last_update, condenser_api.get_discussions_by_author_before_date, condenser_api.get_blog, condenser_api.get_blog_entries, ) ] methods.add(condenser_api_call) return methods
def run(host=None, port=None, database_url=None, database_extra=None, app_extra=None, **kwargs): app_extra = app_extra or dict() # layout basic aiohttp config and context app = web.Application() app['config'] = dict() if kwargs: app['config'].update(**kwargs) app['config']['database_url'] = database_url app['config']['database_extra'] = database_extra app['db'] = None # this will be defined by init_pg at app startup # register app lifecycle callbacks app.on_startup.append(init_pg) app.on_cleanup.append(on_cleanup) # register app routes app.router.add_post('/', handle_api) app.router.add_get('/.well-known/healthcheck.json', healthcheck_handler) app.router.add_get('/health', healthcheck_handler) # create jsonrpc method dispatcher jsonrpc_methods = AsyncMethods() # register jsonrpc methods with dispatcher jsonrpc_methods.add(api_healthcheck, 'sbds.health') # TODO add additional methods here # add jsonrpc method dispatcher to aiohttp app context app['jsonrpc_methods_dispatcher'] = jsonrpc_methods # run aiohttp webapp web.run_app(app, host=host, port=port, **app_extra)
def build_methods(): """Build a map of all supported hive_api/condenser_api calls.""" methods = AsyncMethods() hive_methods = ( hive_api.db_head_state, # --- disabled until #92 #hive_api.get_followers, #hive_api.get_following, #hive_api.get_follow_count, #hive_api.get_user_feed, #hive_api.get_blog_feed, #hive_api.get_discussions_by_sort_and_tag, #hive_api.get_related_posts, # --- hive_api.payouts_total, hive_api.payouts_last_24h, ) for method in hive_methods: methods.add(method) #methods.add(method, 'hive.' + method.__name__) #test jussi-ns w/o jussi condenser_methods = ( condenser_api.call, condenser_api.get_followers, condenser_api.get_following, condenser_api.get_follow_count, condenser_api.get_discussions_by_trending, condenser_api.get_discussions_by_hot, condenser_api.get_discussions_by_promoted, condenser_api.get_discussions_by_created, condenser_api.get_discussions_by_blog, condenser_api.get_discussions_by_feed, condenser_api.get_discussions_by_comments, condenser_api.get_replies_by_last_update, condenser_api.get_content, condenser_api.get_content_replies, condenser_api.get_state, ) for method in condenser_methods: # todo: unclear if appbase uses condenser_api.call vs call.condenser_api methods.add(method, 'condenser_api.' + method.__name__) # todo: temporary non-appbase endpoint (remove once appbase is in prod) methods.add(method, method.__name__) return methods
class YoAPIServer(YoBaseService): service_name = 'api_server' def __init__(self, database_url=None, loop=None, http_host=None, http_port=None): super().__init__(database_url=database_url, loop=loop) self.host = http_host self.port = http_port self.web_app = web.Application(loop=self.loop) self.api_methods = AsyncMethods() self.web_app.router.add_post('/', self.handle_api) self.web_app.router.add_get('/.well-known/healthcheck.json', self.healthcheck_handler) self.web_app.router.add_get('/health', self.healthcheck_handler) self.api_methods.add( api_get_notifications, 'yo.get_db_notifications') self.api_methods.add(api_mark_read, 'yo.mark_read') self.api_methods.add(api_mark_unread, 'yo.mark_unread') self.api_methods.add(api_mark_shown, 'yo.mark_shown') self.api_methods.add(api_mark_unshown, 'yo.mark_unshown') self.api_methods.add(api_get_transports, 'yo.get_transports') self.api_methods.add(api_set_transports, 'yo.set_transports') self.api_methods.add(self.api_healthcheck, 'health') async def healthcheck_handler(self, request): return web.json_response(await self.api_healthcheck()) async def handle_api(self, request): request = await request.json() context = {'app': self} response = await self.api_methods.dispatch(request, context=context) return json_response(response) @staticmethod async def api_healthcheck(): return { 'status': 'OK', 'source_commit': os.environ.get('SOURCE_COMMIT'), 'docker_tag': os.environ.get('DOCKER_TAG'), 'datetime': datetime.datetime.utcnow().isoformat() } async def main_task(self): web.run_app(self.web_app, host=self.host,port=self.port)
class YoApp: def __init__(self, config=None, db=None): self.config = config self.db = db self.services = {} self.service_tasks = {} self.loop = asyncio.get_event_loop() self.web_app = web.Application(loop=self.loop) self.web_app['config'] = { 'yo_config': self.config, 'yo_db': self.db, 'yo_app': self } self.api_methods = AsyncMethods() self.running = False async def handle_api(self, request): req_app = request.app request = await request.json() logger.debug('Incoming request: %s', request) if 'params' not in request.keys(): request['params'] = {} # fix for API methods that have no params context = {'yo_db': req_app['config']['yo_db']} response = await self.api_methods.dispatch(request, context=context) return web.json_response(response) def add_api_method(self, func, func_name): logger.debug('Adding API method %s', func_name) self.api_methods.add(func, name='yo.%s' % func_name) # pylint: disable=unused-argument async def start_background_tasks(self, app): logger.info('Starting tasks...') for k, v in self.service_tasks.items(): logger.info('Starting %s', k) self.web_app['service_task:%s' % k] = self.web_app.loop.create_task(v()) # pylint: enable=unused-argument @staticmethod async def api_healthcheck(): return { 'status': 'OK', 'source_commit': os.environ.get('SOURCE_COMMIT'), 'docker_tag': os.environ.get('DOCKER_TAG'), 'datetime': datetime.datetime.utcnow().isoformat() } # pylint: disable=unused-argument async def healthcheck_handler(self, request): return web.json_response(await self.api_healthcheck()) # pylint: enable=unused-argument @staticmethod async def handle_options(request): origin = request.headers['Origin'] if origin in ALLOWED_ORIGINS: response = web.Response(status=204, headers={ 'Access-Control-Allow-Methods': 'POST', 'Access-Control-Allow-Origin': origin, 'Access-Control-Allow-Headers': '*' }) else: response = web.Response(status=403) return response # pylint: disable=unused-argument async def setup_standard_api(self, app): self.add_api_method(self.api_healthcheck, 'healthcheck') self.web_app.router.add_post('/', self.handle_api) self.web_app.router.add_get('/.well-known/healthcheck.json', self.healthcheck_handler) # pylint: enable=unused-argument def run(self): self.running = True self.web_app.on_startup.append(self.start_background_tasks) self.web_app.on_startup.append(self.setup_standard_api) web.run_app(self.web_app, host=self.config.get_listen_host(), port=self.config.get_listen_port()) def add_service(self, service_kls): logger.debug('Adding service %s', service_kls) service = service_kls(yo_app=self, config=self.config, db=self.db) name = service.get_name() self.service_tasks[name] = service.async_task service.yo_app = self self.services[name] = service service.init_api() async def invoke_private_api(self, service=None, api_method=None, **kwargs): # TODO - add support for URLs other than :local: if service not in self.services.keys(): return {'error': 'No such service found!'} if api_method not in self.services[service].private_api_methods.keys(): return {'error': 'No such method in service'} return await self.services[service].private_api_methods[api_method]( **kwargs)
jrpc_condenser = (condenser_api.get_followers, condenser_api.get_following, condenser_api.get_follow_count, condenser_api.get_discussions_by_trending, condenser_api.get_discussions_by_hot, condenser_api.get_discussions_by_promoted, condenser_api.get_discussions_by_created, condenser_api.get_discussions_by_blog, condenser_api.get_discussions_by_feed, condenser_api.get_discussions_by_comments, condenser_api.get_replies_by_last_update, condenser_api.get_content, condenser_api.get_content_replies, condenser_api.get_state) methods = AsyncMethods() legacy_methods = AsyncMethods() legacy_methods.add(condenser_api.call, 'call') methods.add(condenser_api.call, 'call') for m in jrpc_methods: methods.add(m) for m in jrpc_condenser: methods.add(m, 'condenser_api.' + m.__name__) legacy_methods.add(m) app = web.Application() app['config'] = dict() app['config']['hive.MAX_BLOCK_NUM_DIFF'] = 10 app['config']['hive.MAX_DB_ROW_RESULTS'] = 100000 app['config'][ 'hive.DB_QUERY_LIMIT'] = app['config']['hive.MAX_DB_ROW_RESULTS'] + 1 app['config']['hive.logger'] = logger
class YoApp: def __init__(self, config=None, db=None): self.config = config self.db = db self.services = {} self.service_tasks = {} self.loop = asyncio.get_event_loop() self.web_app = web.Application(loop=self.loop) self.api_methods = AsyncMethods() self.running = False self.web_app.router.add_post('/', self.handle_api) self.web_app.router.add_get('/.well-known/healthcheck.json', self.healthcheck_handler) self.api_methods.add(yo.api_methods.api_get_notifications, 'yo.get_db_notifications') self.api_methods.add(yo.api_methods.api_mark_read, 'yo.mark_read') self.api_methods.add(yo.api_methods.api_mark_unread, 'yo.mark_unread') self.api_methods.add(yo.api_methods.api_mark_shown, 'yo.mark_shown') self.api_methods.add(yo.api_methods.api_mark_unshown, 'yo.mark_unshown') self.api_methods.add(yo.api_methods.api_get_transports, 'yo.get_transports') self.api_methods.add(yo.api_methods.api_set_transports, 'yo.set_transports') self.api_methods.add(self.api_healthcheck, 'health') async def handle_api(self, request): request = await request.json() context = {'yo_db': self.db} response = await self.api_methods.dispatch(request, context=context) return json_response(response) # pylint: disable=unused-argument async def start_background_tasks(self, app): logger.info('starting tasks') for k, v in self.service_tasks.items(): logger.info('starting service task', task=k) self.web_app['service_task:%s' % k] = self.web_app.loop.create_task(v()) # pylint: enable=unused-argument @staticmethod async def api_healthcheck(): return { 'status': 'OK', 'source_commit': os.environ.get('SOURCE_COMMIT'), 'docker_tag': os.environ.get('DOCKER_TAG'), 'datetime': datetime.datetime.utcnow().isoformat() } # pylint: disable=unused-argument async def healthcheck_handler(self, request): return web.json_response(await self.api_healthcheck()) # pylint: enable=unused-argument # pylint: disable=unused-argument async def on_cleanup(self, app): logger.info('executing on_cleanup signal handler') futures = [service.shutdown() for service in self.services.values()] await asyncio.gather(*futures) # pylint: enable=unused-argument def run(self): self.running = True self.web_app.on_startup.append(self.start_background_tasks) self.web_app.on_cleanup.append(self.on_cleanup) web.run_app(self.web_app, host=self.config.http_host, port=self.config.http_port) def add_service(self, service_kls): logger.debug('Adding service', service=service_kls.service_name) service = service_kls(yo_app=self, config=self.config, db=self.db) name = service.get_name() self.services[name] = service service.init_api()
condenser_api.get_discussions_by_hot, condenser_api.get_discussions_by_promoted, condenser_api.get_discussions_by_created, condenser_api.get_discussions_by_blog, condenser_api.get_discussions_by_feed, condenser_api.get_discussions_by_comments, condenser_api.get_replies_by_last_update, condenser_api.get_content, condenser_api.get_content_replies, condenser_api.get_state ) # Register hive_api methods and (appbase) condenser_api methods methods = AsyncMethods() for m in hive_methods: methods.add(m) methods.add(m, 'hive_api.' + m.__name__) # TODO: temp, for testing jussi-style path without jussi for m in condenser_methods: # note: unclear if appbase expects condenser_api.call or call.condenser_api methods.add(m, 'condenser_api.' + m.__name__) methods.add(m, 'hive_api.condenser_api.' + m.__name__) # TODO: temp, for testing jussi-style path without jussi # Register non-appbase condenser_api endpoint (remove after appbase in prod) non_appbase_methods = AsyncMethods() non_appbase_methods.add(condenser_api.call, 'condenser_api.non_appb.call') non_appbase_methods.add(condenser_api.call, 'hive_api.condenser_api.non_appb.call') # TODO: temp, for testing jussi-style path without jussi for m in condenser_methods: non_appbase_methods.add(m) app = web.Application() app['config'] = dict()