Skip to content

Commit

Permalink
model extract
Browse files Browse the repository at this point in the history
  • Loading branch information
revol.cai committed Feb 18, 2018
1 parent e124a44 commit 2287f30
Show file tree
Hide file tree
Showing 13 changed files with 182 additions and 65 deletions.
2 changes: 1 addition & 1 deletion etcd3/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@
"""Top-level package for etcd3-py."""
from .version import __version__, __author__, __email__

__all__ = [__version__, __author__, __email__]
__all__ = ['__version__', '__author__', '__email__']
7 changes: 4 additions & 3 deletions etcd3/apis/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
class BaseAPI(object):
def call_rpc(self, method, data=None, stream=False, **kwargs):
raise NotImplementedError
from base import BaseAPI
from maintenance import MaintenanceAPI

__all__ = ['BaseAPI', 'MaintenanceAPI']
3 changes: 3 additions & 0 deletions etcd3/apis/base.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
class BaseAPI(object):
def call_rpc(self, method, data=None, stream=False, **kwargs):
raise NotImplementedError
10 changes: 5 additions & 5 deletions etcd3/apis/maintenance.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from . import BaseAPI
from ..models import AlarmAction
from base import BaseAPI
from models import AlarmRequestAlarmAction


class MaintenanceAPI(BaseAPI):
Expand All @@ -20,13 +20,13 @@ def alarm_request(self, alarm_action, member_id, alarm_type):
return self.call_rpc(method, data=data)

def get_alarm(self, member_id, alarm_type):
return self.alarm_request(AlarmAction.GET, member_id, alarm_type)
return self.alarm_request(AlarmRequestAlarmAction.GET, member_id, alarm_type)

def activate_alarm(self, member_id, alarm_type):
return self.alarm_request(AlarmAction.ACTIVATE, member_id, alarm_type)
return self.alarm_request(AlarmRequestAlarmAction.ACTIVATE, member_id, alarm_type)

def deactivate_alarm(self, member_id, alarm_type):
return self.alarm_request(AlarmAction.DEACTIVATE, member_id, alarm_type)
return self.alarm_request(AlarmRequestAlarmAction.DEACTIVATE, member_id, alarm_type)

def defragment(self):
"""
Expand Down
34 changes: 21 additions & 13 deletions etcd3/client.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
import json
import os
import sys
import traceback

import requests
from six.moves import urllib_parse

from version import __version__
from apis import BaseAPI
from apis import MaintenanceAPI
from errors import Etcd3Exception
from swagger_helper import SwaggerSpec
from version import __version__

rpc_swagger_json = os.path.join(os.path.dirname(__file__), 'rpc.swagger.json')

Expand All @@ -19,8 +17,8 @@
def iter_response(resp):
"""
yield response content by every json object
we don't yield by line, because the content of gRPC-JSON-Gateway stream response
does not have a delimiter between each object by default.
we don't yield by line, because the content of etcd's gRPC-JSON-Gateway stream response
does not have a delimiter between each object by default. (only one line)
https://github.com/grpc-ecosystem/grpc-gateway/pull/497/files
:param resp: Response
:return: dict
Expand All @@ -36,18 +34,18 @@ def iter_response(resp):
if bracket_flag == 0:
s = ''.join(buf)
buf = []
if s:
yield json.loads(s)
yield s


class Etcd3APIClient(BaseAPI):
class Etcd3APIClient(MaintenanceAPI):
response_class = requests.models.Response

def __init__(self, host='localhost', port=2379, protocol='http',
ca_cert=None, cert_key=None, cert_cert=None,
timeout=None, headers=None, user_agent=None, pool_size=30,
user=None, password=None, token=None):
self.session = requests.session()
self.__set_conn_pool(pool_size)
self.host = host
self.port = port
self.cert = None
Expand All @@ -70,6 +68,9 @@ def __init__(self, host='localhost', port=2379, protocol='http',
self.password = password
self.token = token

def __set_conn_pool(self, pool_size):
pass

@property
def baseurl(self):
return '{}://{}:{}'.format(self.protocol, self.host, self.port)
Expand Down Expand Up @@ -99,6 +100,9 @@ def modelizeStreamResponse(cls, method, resp, decode=True):
swpath = swaggerSpec.getPath(method)
respModel = swpath.post.responses._200.schema.getModel()
for data in iter_response(resp):
if not data:
continue
data = json.loads(data)
data = data.get('result', {}) # the real data is been put under the key: 'result'
if decode:
data = cls.decodeRPCResponse(method, data)
Expand All @@ -122,9 +126,8 @@ def raise_for_status(resp):
try:
data = resp.json()
except Exception:
_, _, tb = sys.exc_info()
error = ''.join(traceback.format_tb(tb))
code = -1
error = resp.content
code = 2
else:
error = data.get('error')
code = data.get('code')
Expand Down Expand Up @@ -167,7 +170,12 @@ def call_rpc(self, method, data=None, stream=False, encode=True, raw=False, **kw
# print(client.call_rpc('/v3alpha/kv/put', {'key': 'foo', 'value': 'bar', 'prev_kv': True}).json())
# print(client.call_rpc('/v3alpha/kv/range', {'key': 'foo'}).json())
# print(client.call_rpc('/v3alpha/kv/range', {'key': 'foa'}).json())
print(client.status())
print(client.hash())
r = client.call_rpc('/v3alpha/watch', {'create_request': {'key': 'foo'}}, stream=True)
for i in r:
print(i)
print(client.call_rpc('/v3alpha/kv/rang', {'key': 'foa'}).json())
try:
print(client.call_rpc('/v3alpha/kv/rang', {'key': 'foa'}).json())
except Exception as e:
print(e)
6 changes: 4 additions & 2 deletions etcd3/errors/errors.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@ def __init__(self, error, code, status):
self.code = code
self.codeText = codeText[code]
self.status = status
self.error = error
self.error = error.strip()

def __repr__(self):
return "Etcd3Exception(code='%s', message='%s')" % (self.code, self.error)
return "<Etcd3Exception error:'%s', code:%s>" % (self.error, self.code)

__str__ = __repr__

def as_dict(self):
return {
Expand Down
33 changes: 33 additions & 0 deletions etcd3/extract_models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
ENUM_FILE_TPL = '''\
# Models generated from rpc.swagger.json, do not edit
import enum
{% for e in enums %}
class {{e._path | last}}(enum.Enum):
"""
ref: {{ e._ref }}
default: {{ e.default }}
"""
{% for prop in e.enum %}{{ prop.name }} = '{{ prop.value }}'
{% endfor %}
{% endfor %}
__all__ = [{% for e in enums %}
'{{e._path | last}}',{% endfor %}
]
'''

if __name__ == '__main__':
import os
import jinja2
from swagger_helper import SwaggerSpec

rpc_swagger_json = os.path.join(os.path.dirname(__file__), 'rpc.swagger.json')
swaggerSpec = SwaggerSpec(rpc_swagger_json)

enums = [i for i in swaggerSpec.definitions if i._is_enum]
enum_tpl = jinja2.Template(ENUM_FILE_TPL)
with open(os.path.join(os.path.dirname(__file__), 'models.py'), 'w') as f:
s = enum_tpl.render(enums=enums)
f.write(s)
print(s)
106 changes: 106 additions & 0 deletions etcd3/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
# Models generated from rpc.swagger.json, do not edit
import enum


class AlarmRequestAlarmAction(enum.Enum):
"""
ref: #/definitions/AlarmRequestAlarmAction
default: GET
"""
GET = 'GET'
ACTIVATE = 'ACTIVATE'
DEACTIVATE = 'DEACTIVATE'


class EventEventType(enum.Enum):
"""
ref: #/definitions/EventEventType
default: PUT
"""
PUT = 'PUT'
DELETE = 'DELETE'


class RangeRequestSortTarget(enum.Enum):
"""
ref: #/definitions/RangeRequestSortTarget
default: KEY
"""
KEY = 'KEY'
VERSION = 'VERSION'
CREATE = 'CREATE'
MOD = 'MOD'
VALUE = 'VALUE'


class CompareCompareTarget(enum.Enum):
"""
ref: #/definitions/CompareCompareTarget
default: VERSION
"""
VERSION = 'VERSION'
CREATE = 'CREATE'
MOD = 'MOD'
VALUE = 'VALUE'


class authpbPermissionType(enum.Enum):
"""
ref: #/definitions/authpbPermissionType
default: READ
"""
READ = 'READ'
WRITE = 'WRITE'
READWRITE = 'READWRITE'


class CompareCompareResult(enum.Enum):
"""
ref: #/definitions/CompareCompareResult
default: EQUAL
"""
EQUAL = 'EQUAL'
GREATER = 'GREATER'
LESS = 'LESS'
NOT_EQUAL = 'NOT_EQUAL'


class RangeRequestSortOrder(enum.Enum):
"""
ref: #/definitions/RangeRequestSortOrder
default: NONE
"""
NONE = 'NONE'
ASCEND = 'ASCEND'
DESCEND = 'DESCEND'


class etcdserverpbAlarmType(enum.Enum):
"""
ref: #/definitions/etcdserverpbAlarmType
default: NONE
"""
NONE = 'NONE'
NOSPACE = 'NOSPACE'


class WatchCreateRequestFilterType(enum.Enum):
"""
ref: #/definitions/WatchCreateRequestFilterType
default: NOPUT
"""
NOPUT = 'NOPUT'
NODELETE = 'NODELETE'


__all__ = [
'AlarmRequestAlarmAction',
'EventEventType',
'RangeRequestSortTarget',
'CompareCompareTarget',
'authpbPermissionType',
'CompareCompareResult',
'RangeRequestSortOrder',
'etcdserverpbAlarmType',
'WatchCreateRequestFilterType',
]
1 change: 0 additions & 1 deletion etcd3/models/__init__.py

This file was deleted.

12 changes: 0 additions & 12 deletions etcd3/models/maintenance.py

This file was deleted.

4 changes: 4 additions & 0 deletions etcd3/swagger_helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -349,6 +349,10 @@ def __getattr__(self, key):
def _get(self, k, *args, **kwargs):
return getattr(self, k, *args, **kwargs)

def __iter__(self):
for k in self._keys():
yield self._get(k)

__getitem__ = _get

def __dir__(self):
Expand Down
28 changes: 0 additions & 28 deletions etcd3/utils.py
Original file line number Diff line number Diff line change
@@ -1,29 +1 @@
import base64
import enum
import six

bytes_types = (bytes, bytearray)


def encode(data):
"""
Encode the given data using base-64
:param data:
:return: base-64 encoded string
"""
if isinstance(data, enum.Enum):
data = enum.value
if not isinstance(data, bytes_types):
data = six.b(str(data))
return base64.b64encode(data).decode("utf-8")


def decode(data):
"""
Decode the base-64 encoded string
:param data:
:return: decoded string
"""
if not isinstance(data, bytes_types):
data = six.b(str(data))
return base64.b64decode(data.decode("utf-8"))
1 change: 1 addition & 0 deletions requirements_dev.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
pip>=8.1.2
bumpversion>=0.5.3
Jinja2==2.10
wheel>=0.29.0
watchdog>=0.8.3
flake8>=2.6.0
Expand Down

0 comments on commit 2287f30

Please sign in to comment.