This repository has been archived on 2020-03-24. You can view files and clone it, but cannot push or open issues or pull requests.
quay/endpoints/api/repotoken.py

139 lines
4.2 KiB
Python
Raw Normal View History

2015-05-14 20:47:38 +00:00
""" Manage repository access tokens (DEPRECATED). """
2014-03-14 17:24:01 +00:00
import logging
from flask import request
from endpoints.api import (resource, nickname, require_repo_admin, RepositoryParamResource,
log_action, validate_json_request, NotFound, path_param)
2014-03-14 17:24:01 +00:00
from data import model
logger = logging.getLogger(__name__)
def token_view(token_obj):
return {
'friendlyName': token_obj.friendly_name,
'code': token_obj.code,
'role': token_obj.role.name,
}
@resource('/v1/repository/<repopath:repository>/tokens/')
@path_param('repository', 'The full path of the repository. e.g. namespace/name')
2014-03-14 17:24:01 +00:00
class RepositoryTokenList(RepositoryParamResource):
""" Resource for creating and listing repository tokens. """
schemas = {
'NewToken': {
'id': 'NewToken',
'type': 'object',
'description': 'Description of a new token.',
'required':[
'friendlyName',
],
2014-03-14 17:24:01 +00:00
'properties': {
'friendlyName': {
'type': 'string',
2014-03-14 18:20:51 +00:00
'description': 'Friendly name to help identify the token',
2014-03-14 17:24:01 +00:00
},
},
},
}
@require_repo_admin
@nickname('listRepoTokens')
def get(self, namespace, repository):
""" List the tokens for the specified repository. """
tokens = model.token.get_repository_delegate_tokens(namespace, repository)
2014-03-14 17:24:01 +00:00
return {
'tokens': {token.code: token_view(token) for token in tokens}
}
@require_repo_admin
@nickname('createToken')
@validate_json_request('NewToken')
def post(self, namespace, repository):
""" Create a new repository token. """
token_params = request.get_json()
token = model.token.create_delegate_token(namespace, repository, token_params['friendlyName'])
2014-03-14 17:24:01 +00:00
log_action('add_repo_accesstoken', namespace,
{'repo': repository, 'token': token_params['friendlyName']},
repo=model.repository.get_repository(namespace, repository))
2014-03-14 17:24:01 +00:00
return token_view(token), 201
@resource('/v1/repository/<repopath:repository>/tokens/<code>')
@path_param('repository', 'The full path of the repository. e.g. namespace/name')
@path_param('code', 'The token code')
2014-03-14 17:24:01 +00:00
class RepositoryToken(RepositoryParamResource):
""" Resource for managing individual tokens. """
schemas = {
'TokenPermission': {
'id': 'TokenPermission',
'type': 'object',
2014-03-14 18:20:51 +00:00
'description': 'Description of a token permission',
'required': [
'role',
],
2014-03-14 17:24:01 +00:00
'properties': {
'role': {
'type': 'string',
'description': 'Role to use for the token',
'enum': [
'read',
'write',
'admin',
],
},
},
},
}
@require_repo_admin
@nickname('getTokens')
def get(self, namespace, repository, code):
2014-03-14 17:24:55 +00:00
""" Fetch the specified repository token information. """
2014-03-14 17:24:01 +00:00
try:
perm = model.token.get_repo_delegate_token(namespace, repository, code)
2014-03-14 17:24:01 +00:00
except model.InvalidTokenException:
raise NotFound()
2014-03-14 17:24:01 +00:00
return token_view(perm)
@require_repo_admin
@nickname('changeToken')
@validate_json_request('TokenPermission')
def put(self, namespace, repository, code):
2014-03-14 17:24:55 +00:00
""" Update the permissions for the specified repository token. """
2014-03-14 17:24:01 +00:00
new_permission = request.get_json()
logger.debug('Setting permission to: %s for code %s' %
(new_permission['role'], code))
token = model.token.set_repo_delegate_token_role(namespace, repository, code,
new_permission['role'])
2014-03-14 17:24:01 +00:00
log_action('change_repo_permission', namespace,
{'repo': repository, 'token': token.friendly_name, 'code': code,
'role': new_permission['role']},
repo=model.repository.get_repository(namespace, repository))
2014-03-14 17:24:01 +00:00
return token_view(token)
@require_repo_admin
@nickname('deleteToken')
def delete(self, namespace, repository, code):
2014-03-14 17:24:55 +00:00
""" Delete the repository token. """
token = model.token.delete_delegate_token(namespace, repository, code)
2014-03-14 17:24:01 +00:00
log_action('delete_repo_accesstoken', namespace,
{'repo': repository, 'token': token.friendly_name,
'code': code},
repo=model.repository.get_repository(namespace, repository))
2014-03-14 17:24:01 +00:00
return 'Deleted', 204