2013-09-25 21:50:03 +00:00
|
|
|
import logging
|
2013-09-30 20:14:48 +00:00
|
|
|
import json
|
2013-09-25 21:50:03 +00:00
|
|
|
|
2015-07-15 21:25:41 +00:00
|
|
|
from flask import abort, request, jsonify, make_response, session
|
2013-09-25 21:50:03 +00:00
|
|
|
|
2017-03-16 20:50:09 +00:00
|
|
|
from auth.decorators import process_auth
|
2017-06-29 17:24:00 +00:00
|
|
|
from auth.permissions import (ReadRepositoryPermission, ModifyRepositoryPermission)
|
2013-09-25 21:50:03 +00:00
|
|
|
from data import model
|
2017-07-20 15:31:22 +00:00
|
|
|
from endpoints.decorators import anon_protect, parse_repository_name
|
2015-06-22 21:37:13 +00:00
|
|
|
from endpoints.v1 import v1_bp
|
2017-06-29 17:19:53 +00:00
|
|
|
from endpoints.v1.models_pre_oci import pre_oci_model as model
|
2017-05-11 17:33:18 +00:00
|
|
|
from util.audit import track_and_log
|
|
|
|
from util.names import TAG_ERROR, TAG_REGEX
|
2013-09-25 21:50:03 +00:00
|
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
2016-01-21 20:40:51 +00:00
|
|
|
@v1_bp.route('/repositories/<repopath:repository>/tags', methods=['GET'])
|
2013-09-25 21:50:03 +00:00
|
|
|
@process_auth
|
2015-05-19 21:52:44 +00:00
|
|
|
@anon_protect
|
2016-03-09 21:20:28 +00:00
|
|
|
@parse_repository_name()
|
|
|
|
def get_tags(namespace_name, repo_name):
|
|
|
|
permission = ReadRepositoryPermission(namespace_name, repo_name)
|
2013-09-25 21:50:03 +00:00
|
|
|
|
2016-08-30 19:05:15 +00:00
|
|
|
if permission.can() or model.repository_is_public(namespace_name, repo_name):
|
2017-03-22 18:30:33 +00:00
|
|
|
repo = model.get_repository(namespace_name, repo_name)
|
|
|
|
if repo.kind != 'image':
|
2017-03-22 20:53:12 +00:00
|
|
|
msg = 'This repository is for managing %s resources and not container images.' % repo.kind
|
|
|
|
abort(405, message=msg, namespace=namespace_name)
|
2017-03-22 18:30:33 +00:00
|
|
|
|
2016-08-30 19:05:15 +00:00
|
|
|
tags = model.list_tags(namespace_name, repo_name)
|
2013-10-01 21:23:44 +00:00
|
|
|
tag_map = {tag.name: tag.image.docker_image_id for tag in tags}
|
2013-09-25 21:50:03 +00:00
|
|
|
return jsonify(tag_map)
|
|
|
|
|
|
|
|
abort(403)
|
|
|
|
|
|
|
|
|
2016-01-21 20:40:51 +00:00
|
|
|
@v1_bp.route('/repositories/<repopath:repository>/tags/<tag>', methods=['GET'])
|
2013-09-25 21:50:03 +00:00
|
|
|
@process_auth
|
2015-05-19 21:52:44 +00:00
|
|
|
@anon_protect
|
2016-03-09 21:20:28 +00:00
|
|
|
@parse_repository_name()
|
|
|
|
def get_tag(namespace_name, repo_name, tag):
|
|
|
|
permission = ReadRepositoryPermission(namespace_name, repo_name)
|
2013-09-25 21:50:03 +00:00
|
|
|
|
2016-08-30 19:05:15 +00:00
|
|
|
if permission.can() or model.repository_is_public(namespace_name, repo_name):
|
2017-03-22 18:30:33 +00:00
|
|
|
repo = model.get_repository(namespace_name, repo_name)
|
|
|
|
if repo.kind != 'image':
|
2017-03-22 20:53:12 +00:00
|
|
|
msg = 'This repository is for managing %s resources and not container images.' % repo.kind
|
|
|
|
abort(405, message=msg, namespace=namespace_name)
|
2017-03-22 18:30:33 +00:00
|
|
|
|
2016-08-30 19:05:15 +00:00
|
|
|
image_id = model.find_image_id_by_tag(namespace_name, repo_name, tag)
|
2016-07-12 17:48:44 +00:00
|
|
|
if image_id is None:
|
2015-09-29 19:02:03 +00:00
|
|
|
abort(404)
|
|
|
|
|
2016-07-12 17:48:44 +00:00
|
|
|
resp = make_response('"%s"' % image_id)
|
2013-11-12 01:00:01 +00:00
|
|
|
resp.headers['Content-Type'] = 'application/json'
|
|
|
|
return resp
|
2013-09-25 21:50:03 +00:00
|
|
|
|
|
|
|
abort(403)
|
|
|
|
|
|
|
|
|
2016-01-21 20:40:51 +00:00
|
|
|
@v1_bp.route('/repositories/<repopath:repository>/tags/<tag>', methods=['PUT'])
|
2013-09-25 21:50:03 +00:00
|
|
|
@process_auth
|
2015-06-02 19:56:44 +00:00
|
|
|
@anon_protect
|
2016-03-09 21:20:28 +00:00
|
|
|
@parse_repository_name()
|
|
|
|
def put_tag(namespace_name, repo_name, tag):
|
|
|
|
permission = ModifyRepositoryPermission(namespace_name, repo_name)
|
2013-09-25 21:50:03 +00:00
|
|
|
|
|
|
|
if permission.can():
|
2015-10-05 20:36:33 +00:00
|
|
|
if not TAG_REGEX.match(tag):
|
|
|
|
abort(400, TAG_ERROR)
|
|
|
|
|
2017-03-22 18:30:33 +00:00
|
|
|
repo = model.get_repository(namespace_name, repo_name)
|
|
|
|
if repo.kind != 'image':
|
2017-03-22 20:53:12 +00:00
|
|
|
msg = 'This repository is for managing %s resources and not container images.' % repo.kind
|
|
|
|
abort(405, message=msg, namespace=namespace_name)
|
2017-03-22 18:30:33 +00:00
|
|
|
|
2016-07-12 17:48:44 +00:00
|
|
|
image_id = json.loads(request.data)
|
2016-08-30 19:05:15 +00:00
|
|
|
model.create_or_update_tag(namespace_name, repo_name, image_id, tag)
|
2013-09-25 21:50:03 +00:00
|
|
|
|
2014-10-22 18:14:56 +00:00
|
|
|
# Store the updated tag.
|
2016-03-09 21:20:28 +00:00
|
|
|
if 'pushed_tags' not in session:
|
2014-10-22 18:14:56 +00:00
|
|
|
session['pushed_tags'] = {}
|
|
|
|
|
2016-07-12 17:48:44 +00:00
|
|
|
session['pushed_tags'][tag] = image_id
|
2014-10-22 18:14:56 +00:00
|
|
|
|
2013-09-25 21:50:03 +00:00
|
|
|
return make_response('Created', 200)
|
|
|
|
|
|
|
|
abort(403)
|
|
|
|
|
|
|
|
|
2016-01-21 20:40:51 +00:00
|
|
|
@v1_bp.route('/repositories/<repopath:repository>/tags/<tag>', methods=['DELETE'])
|
2013-09-25 21:50:03 +00:00
|
|
|
@process_auth
|
2015-06-02 19:56:44 +00:00
|
|
|
@anon_protect
|
2016-03-09 21:20:28 +00:00
|
|
|
@parse_repository_name()
|
|
|
|
def delete_tag(namespace_name, repo_name, tag):
|
|
|
|
permission = ModifyRepositoryPermission(namespace_name, repo_name)
|
2013-09-25 21:50:03 +00:00
|
|
|
|
|
|
|
if permission.can():
|
2017-03-22 18:30:33 +00:00
|
|
|
repo = model.get_repository(namespace_name, repo_name)
|
|
|
|
if repo.kind != 'image':
|
2017-03-22 20:53:12 +00:00
|
|
|
msg = 'This repository is for managing %s resources and not container images.' % repo.kind
|
|
|
|
abort(405, message=msg, namespace=namespace_name)
|
2017-03-22 18:30:33 +00:00
|
|
|
|
2016-08-30 19:05:15 +00:00
|
|
|
model.delete_tag(namespace_name, repo_name, tag)
|
|
|
|
track_and_log('delete_tag', model.get_repository(namespace_name, repo_name), tag=tag)
|
2014-02-06 22:33:50 +00:00
|
|
|
return make_response('Deleted', 200)
|
2013-09-25 21:50:03 +00:00
|
|
|
|
|
|
|
abort(403)
|