Fix add tag operation in UI on manifests without legacy images
This commit is contained in:
parent
a6ffad9759
commit
1e4e424d64
4 changed files with 43 additions and 14 deletions
|
@ -160,15 +160,30 @@ class RepositoryTag(RepositoryParamResource):
|
||||||
else:
|
else:
|
||||||
raise InvalidRequest('Could not update tag expiration; Tag has probably changed')
|
raise InvalidRequest('Could not update tag expiration; Tag has probably changed')
|
||||||
|
|
||||||
if 'image' in request.get_json():
|
if 'image' in request.get_json() or 'manifest_digest' in request.get_json():
|
||||||
existing_tag = registry_model.get_repo_tag(repo_ref, tag, include_legacy_image=True)
|
existing_tag = registry_model.get_repo_tag(repo_ref, tag, include_legacy_image=True)
|
||||||
|
|
||||||
|
manifest_or_image = None
|
||||||
|
image_id = None
|
||||||
|
manifest_digest = None
|
||||||
|
|
||||||
|
if 'image' in request.get_json():
|
||||||
image_id = request.get_json()['image']
|
image_id = request.get_json()['image']
|
||||||
image = registry_model.get_legacy_image(repo_ref, image_id)
|
manifest_or_image = registry_model.get_legacy_image(repo_ref, image_id)
|
||||||
if image is None:
|
else:
|
||||||
|
manifest_digest = request.get_json()['manifest_digest']
|
||||||
|
manifest_or_image = registry_model.lookup_manifest_by_digest(repo_ref, manifest_digest)
|
||||||
|
|
||||||
|
if manifest_or_image is None:
|
||||||
raise NotFound()
|
raise NotFound()
|
||||||
|
|
||||||
if not registry_model.retarget_tag(repo_ref, tag, image, storage):
|
# TODO(jschorr): Remove this check once fully on V22
|
||||||
|
existing_manifest_digest = None
|
||||||
|
if existing_tag:
|
||||||
|
existing_manifest = registry_model.get_manifest_for_tag(existing_tag)
|
||||||
|
existing_manifest_digest = existing_manifest.digest if existing_manifest else None
|
||||||
|
|
||||||
|
if not registry_model.retarget_tag(repo_ref, tag, manifest_or_image, storage):
|
||||||
raise InvalidRequest('Could not move tag')
|
raise InvalidRequest('Could not move tag')
|
||||||
|
|
||||||
username = get_authenticated_user().username
|
username = get_authenticated_user().username
|
||||||
|
@ -179,7 +194,11 @@ class RepositoryTag(RepositoryParamResource):
|
||||||
'tag': tag,
|
'tag': tag,
|
||||||
'namespace': namespace,
|
'namespace': namespace,
|
||||||
'image': image_id,
|
'image': image_id,
|
||||||
'original_image': existing_tag.legacy_image.docker_image_id if existing_tag else None,
|
'manifest_digest': manifest_digest,
|
||||||
|
'original_image': (existing_tag.legacy_image.docker_image_id
|
||||||
|
if existing_tag and existing_tag.legacy_image_if_present
|
||||||
|
else None),
|
||||||
|
'original_manifest_digest': existing_manifest_digest,
|
||||||
}, repo_name=repository)
|
}, repo_name=repository)
|
||||||
|
|
||||||
return 'Updated', 201
|
return 'Updated', 201
|
||||||
|
|
|
@ -47,9 +47,9 @@
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
<button type="button" class="close" data-dismiss="modal"
|
<button type="button" class="close" data-dismiss="modal"
|
||||||
aria-hidden="true" ng-show="!addingTag">×</button>
|
aria-hidden="true" ng-show="!addingTag">×</button>
|
||||||
<h4 class="modal-title">{{ isAnotherImageTag(toTagImage, tagToCreate) ? 'Move' : 'Add' }} Tag to Image {{ toTagImage.substr(0, 12) }}</h4>
|
<h4 class="modal-title">{{ isAnotherImageTag(toTagImage, tagToCreate) ? 'Move' : 'Add' }} Tag to {{ toTagManifestDigest ? ('Manifest ' + toTagManifestDigest.substr(0, 19)) : ('Image ' + toTagImage.substr(0, 12)) }}</h4>
|
||||||
</div>
|
</div>
|
||||||
<form name="addTagForm" ng-submit="createOrMoveTag(toTagImage, tagToCreate);">
|
<form name="addTagForm" ng-submit="createOrMoveTag(toTagImage, tagToCreate, toTagManifestDigest);">
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<div class="cor-loader" ng-show="addingTag"></div>
|
<div class="cor-loader" ng-show="addingTag"></div>
|
||||||
<div ng-show="!addingTag">
|
<div ng-show="!addingTag">
|
||||||
|
|
|
@ -92,6 +92,10 @@ angular.module('quay').directive('repoPanelTags', function () {
|
||||||
var imageIndexMap = {};
|
var imageIndexMap = {};
|
||||||
for (var i = 0; i < ordered.length; ++i) {
|
for (var i = 0; i < ordered.length; ++i) {
|
||||||
var tagInfo = ordered[i];
|
var tagInfo = ordered[i];
|
||||||
|
if (!tagInfo.image_id) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (!imageMap[tagInfo.image_id]) {
|
if (!imageMap[tagInfo.image_id]) {
|
||||||
imageMap[tagInfo.image_id] = [];
|
imageMap[tagInfo.image_id] = [];
|
||||||
imageIDs.push(tagInfo.image_id)
|
imageIDs.push(tagInfo.image_id)
|
||||||
|
@ -360,7 +364,7 @@ angular.module('quay').directive('repoPanelTags', function () {
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.askAddTag = function(tag) {
|
$scope.askAddTag = function(tag) {
|
||||||
$scope.tagActionHandler.askAddTag(tag.image_id);
|
$scope.tagActionHandler.askAddTag(tag.image_id, tag.manifest_digest);
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.showLabelEditor = function(tag) {
|
$scope.showLabelEditor = function(tag) {
|
||||||
|
|
|
@ -84,7 +84,7 @@ angular.module('quay').directive('tagOperationsDialog', function () {
|
||||||
return found.image_id == image;
|
return found.image_id == image;
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.createOrMoveTag = function(image, tag) {
|
$scope.createOrMoveTag = function(image, tag, opt_manifest_digest) {
|
||||||
if (!$scope.repository.can_write) { return; }
|
if (!$scope.repository.can_write) { return; }
|
||||||
if ($scope.alertOnTagOpsDisabled()) {
|
if ($scope.alertOnTagOpsDisabled()) {
|
||||||
return;
|
return;
|
||||||
|
@ -97,9 +97,14 @@ angular.module('quay').directive('tagOperationsDialog', function () {
|
||||||
'tag': tag
|
'tag': tag
|
||||||
};
|
};
|
||||||
|
|
||||||
var data = {
|
var data = {};
|
||||||
'image': image
|
if (image) {
|
||||||
};
|
data['image'] = image;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt_manifest_digest) {
|
||||||
|
data['manifest_digest'] = opt_manifest_digest;
|
||||||
|
}
|
||||||
|
|
||||||
var errorHandler = ApiService.errorDisplay('Cannot create or move tag', function(resp) {
|
var errorHandler = ApiService.errorDisplay('Cannot create or move tag', function(resp) {
|
||||||
$element.find('#createOrMoveTagModal').modal('hide');
|
$element.find('#createOrMoveTagModal').modal('hide');
|
||||||
|
@ -330,13 +335,14 @@ angular.module('quay').directive('tagOperationsDialog', function () {
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
'askAddTag': function(image) {
|
'askAddTag': function(image, opt_manifest_digest) {
|
||||||
if ($scope.alertOnTagOpsDisabled()) {
|
if ($scope.alertOnTagOpsDisabled()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$scope.tagToCreate = '';
|
$scope.tagToCreate = '';
|
||||||
$scope.toTagImage = image;
|
$scope.toTagImage = image;
|
||||||
|
$scope.toTagManifestDigest = opt_manifest_digest;
|
||||||
$scope.addingTag = false;
|
$scope.addingTag = false;
|
||||||
$scope.addTagForm.$setPristine();
|
$scope.addTagForm.$setPristine();
|
||||||
$element.find('#createOrMoveTagModal').modal('show');
|
$element.find('#createOrMoveTagModal').modal('show');
|
||||||
|
|
Reference in a new issue