diff --git a/README.md b/README.md index b0bb739..a676097 100644 --- a/README.md +++ b/README.md @@ -34,46 +34,30 @@ pip install rekcurd_client ``` ## How to use -Example code is available [here](./example/sample.py). +Example code is available [here](https://github.com/rekcurd/rekcurd-client-example). When you use Kubernetes and Rekcurd dashboard, you need to specify `application_name`, `service_level` and `rekcurd_grpc_version` correctly. ```python from rekcurd_client import RekcurdWorkerClient -from rekcurd_client.logger import logger -host = 'localhost:5000' -client = RekcurdWorkerClient(logger=logger, host=host) +host = 'localhost' +port = 5000 +application_name = "sample" +service_level = "development" +rekcurd_grpc_version = "v2" -input = [0,0,0,1,11,0,0,0,0,0, - 0,7,8,0,0,0,0,0,1,13, - 6,2,2,0,0,0,7,15,0,9, - 8,0,0,5,16,10,0,16,6,0, - 0,4,15,16,13,16,1,0,0,0, - 0,3,15,10,0,0,0,0,0,2, - 16,4,0,0] -response = client.run_predict_arrint_arrint(input) -``` - -When you use Kubernetes and deploy Rekcurd service via Rekcurd dashboard, you can access your Rekcurd service like the below. - -```python -from rekcurd_client import RekcurdWorkerClient -from rekcurd_client.logger import logger - - -domain = 'example.com' -app = 'rekcurd-sample' -env = 'development' -client = RekcurdWorkerClient(logger=logger, domain=domain, app=app, env=env) +client = RekcurdWorkerClient( + host=host, port=port, + application_name=application_name, service_level=service_level, rekcurd_grpc_version=rekcurd_grpc_version) -input = [0,0,0,1,11,0,0,0,0,0, +idata = [0,0,0,1,11,0,0,0,0,0, 0,7,8,0,0,0,0,0,1,13, 6,2,2,0,0,0,7,15,0,9, 8,0,0,5,16,10,0,16,6,0, 0,4,15,16,13,16,1,0,0,0, 0,3,15,10,0,0,0,0,0,2, 16,4,0,0] -response = client.run_predict_arrint_arrint(input) +response = client.run_predict_arrint_string(idata) ``` ### RekcurdWorkerClient diff --git a/example/sample.py b/example/sample.py deleted file mode 100644 index feb2fa3..0000000 --- a/example/sample.py +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - - -from rekcurd_client import RekcurdWorkerClient -from rekcurd_client.logger import logger - - -host = 'localhost:5000' -client = RekcurdWorkerClient(logger=logger, host=host) - -#domain = 'example.com' -#app = 'rekcurd-sample' -#env = 'development' -#client = RekcurdWorkerClient(logger=logger, domain=domain, app=app, env=env) - -input = [0,0,0,1,11,0,0,0,0,0, - 0,7,8,0,0,0,0,0,1,13, - 6,2,2,0,0,0,7,15,0,9, - 8,0,0,5,16,10,0,16,6,0, - 0,4,15,16,13,16,1,0,0,0, - 0,3,15,10,0,0,0,0,0,2, - 16,4,0,0] -response = client.run_predict_arrint_arrint(input) -print(response) diff --git a/rekcurd_client/core/rekcurd_worker_client.py b/rekcurd_client/core/rekcurd_worker_client.py index d60408b..6766218 100644 --- a/rekcurd_client/core/rekcurd_worker_client.py +++ b/rekcurd_client/core/rekcurd_worker_client.py @@ -7,7 +7,7 @@ import grpc from rekcurd_client.protobuf import rekcurd_pb2, rekcurd_pb2_grpc -from rekcurd_client.logger import SystemLoggerInterface +from rekcurd_client.logger import SystemLoggerInterface, JsonSystemLogger def error_handling(error_response): @@ -39,27 +39,40 @@ def _wrapper(*args, **kwargs): class RekcurdWorkerClient: - def __init__(self, logger: SystemLoggerInterface, - host: str = None, - domain: str = None, app: str = None, - env: str = None, version: int = None): - self.logger = logger - self.stub = None - if host is None and (domain is None or app is None or env is None): - raise RuntimeError("You must specify url or domain+app+env.") - - if version is None: - v_str = rekcurd_pb2.DESCRIPTOR.GetOptions().Extensions[rekcurd_pb2.rekcurd_grpc_proto_version] + _logger: SystemLoggerInterface = None + + def __init__(self, host: str = None, port: int = None, + application_name: str = None, service_level: str = None, + rekcurd_grpc_version: str = None): + self._logger = JsonSystemLogger() + + _host = "127.0.0.1" + _port = 5000 + host = host or _host + port = int(port or _port) + + if rekcurd_grpc_version is None: + rekcurd_grpc_version = rekcurd_pb2.DESCRIPTOR.GetOptions().Extensions[rekcurd_pb2.rekcurd_grpc_proto_version] else: - v_str = rekcurd_pb2.EnumVersionInfo.Name(version) + rekcurd_pb2.EnumVersionInfo.Value(rekcurd_grpc_version) + + self.__metadata = [('x-rekcurd-application-name', application_name), + ('x-rekcurd-sevice-level', service_level), + ('x-rekcurd-grpc-version', rekcurd_grpc_version)] + + channel = grpc.insecure_channel("{0}:{1}".format(host, port)) + self.stub = rekcurd_pb2_grpc.RekcurdWorkerStub(channel) - self.__metadata = [('x-rekcurd-application-name', app), - ('x-rekcurd-sevice-level', env), - ('x-rekcurd-grpc-version', v_str)] - if host is None: - self.__change_domain_app_env(domain, app, env, v_str) + @property + def logger(self): + return self._logger + + @logger.setter + def logger(self, logger: SystemLoggerInterface): + if isinstance(logger, SystemLoggerInterface): + self._logger = logger else: - self.__change_host(host) + raise TypeError("Invalid logger type.") def on_error(self, error: Exception): """ Postprocessing on error @@ -74,18 +87,9 @@ def on_error(self, error: Exception): self.logger.error(str(error)) self.logger.error(traceback.format_exc()) - def __change_domain_app_env(self, domain: str, app: str, env: str, version: str): - host = "{0}-{1}-{2}.{3}".format(app,version,env,domain) - self.__change_host(host) - - def __change_host(self, host: str): - channel = grpc.insecure_channel(host) - self.stub = rekcurd_pb2_grpc.RekcurdWorkerStub(channel) - def __byte_input_request(self, input, option="{}"): yield rekcurd_pb2.BytesInput(input=input, option=rekcurd_pb2.Option(val=option)) - @error_handling(rekcurd_pb2.StringOutput()) def run_predict_string_string(self, input, option="{}"): request = rekcurd_pb2.StringInput() diff --git a/rekcurd_client/logger/__init__.py b/rekcurd_client/logger/__init__.py index 3d1b656..b37f162 100644 --- a/rekcurd_client/logger/__init__.py +++ b/rekcurd_client/logger/__init__.py @@ -4,6 +4,3 @@ from .logger_interface import SystemLoggerInterface from .logger_jsonlogger import JsonSystemLogger from .logger_fluent import FluentSystemLogger - - -logger = JsonSystemLogger() diff --git a/test/__init__.py b/test/__init__.py index f0f25ab..74df7a3 100644 --- a/test/__init__.py +++ b/test/__init__.py @@ -1,17 +1,9 @@ -import os +from .dummy_app import DummyApp -from rekcurd.logger import JsonServiceLogger, JsonSystemLogger -import rekcurd.rekcurd_worker_servicer +from rekcurd import RekcurdWorkerServicer +from rekcurd.logger import JsonServiceLogger -from test.dummy_app import DummyApp -from rekcurd_client.logger import logger - - -os.environ["REKCURD_TEST_MODE"] = "True" -os.environ["REKCURD_SETTINGS_YAML"] = "test/test-settings.yml" app = DummyApp() -service_logger = JsonServiceLogger(app.config) -system_logger = JsonSystemLogger(app.config) -Type = rekcurd.rekcurd_worker_servicer.RekcurdWorkerServicer.Type -client_logger = logger +app.service_logger = JsonServiceLogger() +Type = RekcurdWorkerServicer.Type diff --git a/test/core/_client_application.py b/test/core/_client_application.py index d5c2494..ce28fae 100644 --- a/test/core/_client_application.py +++ b/test/core/_client_application.py @@ -5,9 +5,7 @@ from rekcurd.utils import PredictResult -import rekcurd_client.core.rekcurd_worker_client from rekcurd_client.protobuf import rekcurd_pb2_grpc -from rekcurd_client.logger import logger from rekcurd_client import RekcurdWorkerClient @@ -409,7 +407,9 @@ def _run_arrstring_arrstring(client: RekcurdWorkerClient): def run(scenario, channel): stub = rekcurd_pb2_grpc.RekcurdWorkerStub(channel) - client = rekcurd_client.core.rekcurd_worker_client.RekcurdWorkerClient(logger=logger, domain='example.com', app='rekcurd-sample', env='development') + client = RekcurdWorkerClient( + host="example.com", port=80, application_name="rekcurd-sample", + service_level="development") client.stub = stub try: return _IMPLEMENTATIONS[scenario](client) diff --git a/test/core/test_worker_client_e2e.py b/test/core/test_worker_client_e2e.py index e99eec1..a7163c4 100644 --- a/test/core/test_worker_client_e2e.py +++ b/test/core/test_worker_client_e2e.py @@ -2,13 +2,13 @@ from concurrent import futures from test import * +from rekcurd_client import RekcurdWorkerClient from rekcurd_client.protobuf import rekcurd_pb2_grpc import unittest from functools import wraps from unittest.mock import patch, Mock from rekcurd.utils import PredictResult -import rekcurd_client.core.rekcurd_worker_client def patch_predictor(input_type, output_type): @@ -81,13 +81,11 @@ def assertArrStringResponse(self, response): def setUpClass(cls): server = grpc.server(futures.ThreadPoolExecutor(max_workers=1)) rekcurd_pb2_grpc.add_RekcurdWorkerServicer_to_server( - rekcurd.rekcurd_worker_servicer.RekcurdWorkerServicer( - logger=service_logger, app=app), - server) + RekcurdWorkerServicer(app=app, predictor=None), server) server.add_insecure_port("[::]:5000") server.start() cls.server = server - cls.client = rekcurd_client.core.rekcurd_worker_client.RekcurdWorkerClient(logger=client_logger, host='127.0.0.1:5000') + cls.client = RekcurdWorkerClient(host='127.0.0.1', port=5000) @classmethod def tearDownClass(cls): diff --git a/test/dummy_app.py b/test/dummy_app.py index 76fe283..25ef14f 100644 --- a/test/dummy_app.py +++ b/test/dummy_app.py @@ -1,24 +1,15 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - - from rekcurd import Rekcurd -from rekcurd.utils import PredictLabel, PredictResult, EvaluateResult, EvaluateResultDetail, EvaluateDetail -from typing import List, Generator class DummyApp(Rekcurd): - def __init__(self, config_file: str = None): - super().__init__(config_file) - - def load_model(self) -> None: + def load_model(self, **kwargs): pass - def predict(self, input: PredictLabel, option: dict = None) -> PredictResult: + def predict(self, **kwargs): pass - def evaluate(self, file: bytes) -> EvaluateResult: + def evaluate(self, **kwargs): pass - def get_evaluate_detail(self, file_path: str, results: List[EvaluateResultDetail]) -> Generator[EvaluateDetail, None, None]: + def get_evaluate_detail(self, **kwargs): pass