Example #1
0
 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
Example #2
0
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
Example #3
0
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)
Example #4
0
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
Example #5
0
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)
Example #6
0
File: app.py Project: GwenNelson/yo
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)
Example #7
0
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
Example #8
0
File: app.py Project: arpwv/yo
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()
Example #9
0
    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()