Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 11 additions & 27 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
25 changes: 0 additions & 25 deletions example/sample.py

This file was deleted.

60 changes: 32 additions & 28 deletions rekcurd_client/core/rekcurd_worker_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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
Expand All @@ -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()
Expand Down
3 changes: 0 additions & 3 deletions rekcurd_client/logger/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,3 @@
from .logger_interface import SystemLoggerInterface
from .logger_jsonlogger import JsonSystemLogger
from .logger_fluent import FluentSystemLogger


logger = JsonSystemLogger()
18 changes: 5 additions & 13 deletions test/__init__.py
Original file line number Diff line number Diff line change
@@ -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
6 changes: 3 additions & 3 deletions test/core/_client_application.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand Down Expand Up @@ -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)
Expand Down
8 changes: 3 additions & 5 deletions test/core/test_worker_client_e2e.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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):
Expand Down
17 changes: 4 additions & 13 deletions test/dummy_app.py
Original file line number Diff line number Diff line change
@@ -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