summaryrefslogtreecommitdiff
path: root/src/etcd/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/etcd/__init__.py')
-rw-r--r--src/etcd/__init__.py22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/etcd/__init__.py b/src/etcd/__init__.py
index b532be6..f52852c 100644
--- a/src/etcd/__init__.py
+++ b/src/etcd/__init__.py
@@ -200,6 +200,20 @@ class EtcdConnectionFailed(EtcdException):
self.cause = cause
+class EtcdInsufficientPermissions(EtcdException):
+ """
+ Request failed because of insufficient permissions.
+ """
+ pass
+
+
+class EtcdWatchTimedOut(EtcdConnectionFailed):
+ """
+ A watch timed out without returning a result.
+ """
+ pass
+
+
class EtcdWatcherCleared(EtcdException):
"""
Watcher is cleared due to etcd recovery.
@@ -246,6 +260,7 @@ class EtcdError(object):
107: EtcdRootReadOnly,
108: EtcdDirNotEmpty,
# 109: Non-public: existing peer addr.
+ 110: EtcdInsufficientPermissions,
200: EtcdValueError,
201: EtcdValueError,
@@ -277,6 +292,13 @@ class EtcdError(object):
message = payload.get("message")
cause = payload.get("cause")
msg = '{} : {}'.format(message, cause)
+ status = payload.get("status")
+ # Some general status handling, as
+ # not all endpoints return coherent error messages
+ if status == 404:
+ error_code = 100
+ elif status == 401:
+ error_code = 110
exc = cls.error_exceptions.get(error_code, EtcdException)
if issubclass(exc, EtcdException):
raise exc(msg, payload)