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) return self._rest_post('/resource/%s/obtain_usage_token' % resource, js=body)
def release_usage_token(self, resource: str, token: str): 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__": if __name__ == "__main__":

View File

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

View File

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