Compare commits

...

3 Commits

Author SHA1 Message Date
Harald Welte 425f84f552 rest_server: fix token release
resource.usage_token_put() works on the Token instance, and not
the uuid string.  So we first need to look-up the Token instance
for the client-provided UUID string, and then we can call
usage_token_put()
2023-06-04 20:40:22 +02:00
Harald Welte 6544151ff9 model: Change resource.usage_tokens from list to dict
this way we can have efficient look-ups by token UUID
2023-06-04 20:39:56 +02:00
Harald Welte 1b0ae2814b apitool: fix token-release 2023-06-04 20:39:34 +02:00
3 changed files with 16 additions and 6 deletions

View File

@ -56,7 +56,7 @@ class ApiClient:
return self._rest_post('/resource/%s/obtain_usage_token' % resource, js=body)
def release_usage_token(self, resource: str, token: str):
return self._rest_get('/resource/%s/token/%s/release')
return self._rest_get('/resource/%s/token/%s/release' % (resource, token))
if __name__ == "__main__":

View File

@ -125,7 +125,7 @@ class Resource:
self.description = desc
self.status = "unknown"
self.use_count = 0
self.usage_tokens = []
self.usage_tokens = {}
self.determine_status()
def usage_inc(self):
@ -144,15 +144,21 @@ class Resource:
def usage_token_get(self, user_name: str, usage: str, duration_s: int) -> UsageToken:
"""Create/obtain a new usage token."""
token = UsageToken(self, user_name, usage, duration_s)
self.usage_tokens.append(token)
self.usage_tokens[token.uuid.hex] = token
self.usage_inc()
return token
def usage_token_put(self, token: UsageToken):
"""Release/put an existing usage token."""
self.usage_tokens.delete(token)
uuid_hex = token.uuid.hex
del self.usage_tokens[uuid_hex]
self.usage_dec()
def usage_token_find(self, uuid_hex: str):
if uuid_hex in self.usage_tokens:
return self.usage_tokens[uuid_hex]
return None
def get_status(self):
"""Return the (cached) status of the resource."""
return self.status

View File

@ -71,10 +71,14 @@ class PwrMgmtRestServer:
set_headers(request)
return json.dumps(token.to_dict())
@app.route('/api/v1/resource/<resrc>/token/<token>/release', methods=['GET'])
def token_release(self, request, resrc, token):
@app.route('/api/v1/resource/<resrc>/token/<token_uuid>/release', methods=['GET'])
def token_release(self, request, resrc, token_uuid):
resource = self.resources[resrc]
# find token within resource
token = resource.usage_token_find(token_uuid)
if not token:
request.setResponseCode(404)
return
resource.usage_token_put(token)
#set_headers(request)
request.setResponseCode(200)