Skip to content

Commit

Permalink
Merge pull request #19 from Revolution1/feature/some-extra-apis
Browse files Browse the repository at this point in the history
add health api
  • Loading branch information
Revolution1 committed Mar 22, 2018
2 parents cce9269 + d6cc44d commit 7c79faa
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 4 deletions.
10 changes: 10 additions & 0 deletions etcd3/apis/extra.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,16 @@ def version(self):
self._raise_for_status(resp)
return EtcdVersion(**resp.json())

def health(self):
"""
get the health of etcd-server
:return: EtcdVersion
"""
resp = self._get(self._url('/health'))
self._raise_for_status(resp)
return resp.json()['health']

def metrics_raw(self): # pragma: no cover
"""
get the raw /metrics text
Expand Down
11 changes: 8 additions & 3 deletions etcd3/baseclient.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@

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

swaggerSpec = SwaggerSpec(rpc_swagger_json)
swaggerSpec = SwaggerSpec(rpc_swagger_json) # TODO: swagger json may changed and need to implement multiple version


class BaseModelizedStreamResponse(object): # pragma: no cover
Expand Down Expand Up @@ -73,19 +73,24 @@ def __init__(self, host='localhost', port=2379, protocol='http',
self.password = password
self.token = token
self.cluster_version = None
# TODO: /v3alpha will be deprecated an replaced by /v3 in v3.4
# TODO: /v3beta will be deprecated in v3.5
self.api_prefix = '/v3alpha'
self._retrieve_version()

def _retrieve_version(self): # pragma: no cover
try:
import requests

r = requests.get(self._url('/version'), timeout=0.3) # 300ms will do
r = requests.get(self._url('/version'), timeout=0.3) # 300ms will do
r.raise_for_status()
v = r.json()
self.cluster_version = v["etcdcluster"]
if sem.compare(self.cluster_version, '3.3.0') == -1:
if sem.Version(self.cluster_version) < sem.Version('3.3.0'):
warnings.warn(Etcd3Warning("detected etcd cluster version(%s) is lower than 3.3.0, "
"the gRPC-JSON-Gateway may not work" % self.cluster_version))
else:
self.api_prefix = '/v3'
except Exception:
warnings.warn(Etcd3Warning("cannot detect etcd server version\n"
"1. maybe is a network problem, please check your network connection\n"
Expand Down
2 changes: 1 addition & 1 deletion etcd3/swagger_helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,7 @@ class SwaggerNode(object):

def __new__(cls, root, node, path, parent=None, name=None):
key = tuple(path)
return cls._node_cache.setdefault(key, object.__new__(cls))
return cls._node_cache.setdefault(root, {}).setdefault(key, object.__new__(cls))

def __init__(self, root, node, path, parent=None, name=None):
self._root = root
Expand Down
4 changes: 4 additions & 0 deletions tests/test_extra_apis.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,7 @@ def test_version_api(client, monkeypatch):
v = client.version()
assert v.etcdserver == "3.3.0-rc.4"
assert v.etcdcluster == "3.3.0"


def test_health_api(client):
assert client.health()

0 comments on commit 7c79faa

Please sign in to comment.