Skip to content

Commit 7f3dd65

Browse files
committed
Support auth API both <= 2.2.5 and >= 2.3.0
Closes #210
1 parent 4e5dd28 commit 7f3dd65

File tree

2 files changed

+30
-2
lines changed

2 files changed

+30
-2
lines changed

src/etcd/auth.py

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,28 @@ def __init__(self, client, name):
1414
self.name = name
1515
self.uri = "{}/auth/{}s/{}".format(self.client.version_prefix,
1616
self.entity, self.name)
17+
# This will be lazily evaluated if not manually set
18+
self._legacy_api = None
19+
20+
@property
21+
def legacy_api(self):
22+
if self._legacy_api is None:
23+
# The auth API has changed between 2.2 and 2.3, true story!
24+
major, minor, _ = map(int, self.client.version.split('.'))
25+
self._legacy_api = (major < 3 and minor < 3)
26+
return self._legacy_api
27+
1728

1829
@property
1930
def names(self):
2031
key = "{}s".format(self.entity)
2132
uri = "{}/auth/{}".format(self.client.version_prefix, key)
2233
response = self.client.api_execute(uri, self.client._MGET)
23-
return json.loads(response.data.decode('utf-8'))[key]
34+
if self.legacy_api:
35+
return json.loads(response.data.decode('utf-8'))[key]
36+
else:
37+
return [obj[self.entity]
38+
for obj in json.loads(response.data.decode('utf-8'))[key]]
2439

2540
def read(self):
2641
try:
@@ -102,7 +117,16 @@ def __init__(self, client, name):
102117

103118
def _from_net(self, data):
104119
d = json.loads(data.decode('utf-8'))
105-
self.roles = d.get('roles', [])
120+
roles = d.get('roles', [])
121+
try:
122+
self.roles = roles
123+
except TypeError:
124+
# with the change of API, PUT responses are different
125+
# from GET reponses, which makes everything so funny.
126+
# Specifically, PUT responses are the same as before...
127+
if self.legacy_api:
128+
raise
129+
self.roles = [obj['role'] for obj in roles]
106130
self.name = d.get('user')
107131

108132
def _to_net(self, prevobj=None):

src/etcd/tests/test_auth.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,10 @@ def test_write_and_delete(self):
9393
self.assertEquals(u.roles, set(['guest', 'root']))
9494
# set roles as a list, it works!
9595
u.roles = ['guest', 'test_group']
96+
# We need this or the new API will return an internal error
97+
r = auth.EtcdRole(self.client, 'test_group')
98+
r.acls = {'*': 'R', '/test/*': 'RW'}
99+
r.write()
96100
try:
97101
u.write()
98102
except:

0 commit comments

Comments
 (0)