fix(image-details): fix the ability to pull an image from a tag (#878)

pull/879/head
Anthony Lapenna 2017-05-23 20:25:56 +02:00 committed by GitHub
parent 6834c20b5d
commit d3ecf1d7a8
3 changed files with 64 additions and 36 deletions

View File

@ -17,7 +17,7 @@ function ($scope, $stateParams, $state, ImageService, Notifications) {
$state.go('image', {id: $stateParams.id}, {reload: true}); $state.go('image', {id: $stateParams.id}, {reload: true});
}) })
.catch(function error(err) { .catch(function error(err) {
Notifications.error("Failure", err, "Unable to tag image"); Notifications.error('Failure', err, 'Unable to tag image');
}) })
.finally(function final() { .finally(function final() {
$('#loadingViewSpinner').hide(); $('#loadingViewSpinner').hide();
@ -31,7 +31,7 @@ function ($scope, $stateParams, $state, ImageService, Notifications) {
Notifications.success('Image successfully pushed'); Notifications.success('Image successfully pushed');
}) })
.catch(function error(err) { .catch(function error(err) {
Notifications.error("Failure", err, "Unable to push image tag"); Notifications.error('Failure', err, 'Unable to push image tag');
}) })
.finally(function final() { .finally(function final() {
$('#loadingViewSpinner').hide(); $('#loadingViewSpinner').hide();
@ -40,15 +40,13 @@ function ($scope, $stateParams, $state, ImageService, Notifications) {
$scope.pullImage = function(tag) { $scope.pullImage = function(tag) {
$('#loadingViewSpinner').show(); $('#loadingViewSpinner').show();
var image = $scope.config.Image;
var registry = $scope.config.Registry;
ImageService.pullImage(image, registry) ImageService.pullTag(tag)
.then(function success(data) { .then(function success(data) {
Notifications.success('Image successfully pulled', image); Notifications.success('Image successfully pulled', tag);
}) })
.catch(function error(err){ .catch(function error(err){
Notifications.error("Failure", err, "Unable to pull image"); Notifications.error('Failure', err, 'Unable to pull image');
}) })
.finally(function final() { .finally(function final() {
$('#loadingViewSpinner').hide(); $('#loadingViewSpinner').hide();
@ -68,7 +66,7 @@ function ($scope, $stateParams, $state, ImageService, Notifications) {
} }
}) })
.catch(function error(err) { .catch(function error(err) {
Notifications.error("Failure", err, 'Unable to remove image'); Notifications.error('Failure', err, 'Unable to remove image');
}) })
.finally(function final() { .finally(function final() {
$('#loadingViewSpinner').hide(); $('#loadingViewSpinner').hide();
@ -83,7 +81,7 @@ function ($scope, $stateParams, $state, ImageService, Notifications) {
$state.go('images', {}, {reload: true}); $state.go('images', {}, {reload: true});
}) })
.catch(function error(err) { .catch(function error(err) {
Notifications.error("Failure", err, 'Unable to remove image'); Notifications.error('Failure', err, 'Unable to remove image');
}) })
.finally(function final() { .finally(function final() {
$('#loadingViewSpinner').hide(); $('#loadingViewSpinner').hide();
@ -97,7 +95,7 @@ function ($scope, $stateParams, $state, ImageService, Notifications) {
$scope.image = data; $scope.image = data;
}) })
.catch(function error(err) { .catch(function error(err) {
Notifications.error("Failure", err, "Unable to retrieve image details"); Notifications.error('Failure', err, 'Unable to retrieve image details');
$state.go('images'); $state.go('images');
}) })
.finally(function final() { .finally(function final() {

View File

@ -1,30 +1,55 @@
angular.module('portainer.helpers') angular.module('portainer.helpers')
.factory('ImageHelper', [function ImageHelperFactory() { .factory('ImageHelper', [function ImageHelperFactory() {
'use strict'; 'use strict';
return {
createImageConfigForCommit: function(imageName, registry) { var helper = {};
var imageNameAndTag = imageName.split(':');
var image = imageNameAndTag[0]; helper.extractImageAndRegistryFromTag = function(tag) {
if (registry) { var slashCount = _.countBy(tag)['/'];
image = registry + '/' + imageNameAndTag[0]; var registry = null;
} var image = tag;
var imageConfig = { if (slashCount > 1) {
repo: image, // assume something/some/thing[/...]
tag: imageNameAndTag[1] ? imageNameAndTag[1] : 'latest' var registryAndImage = _.split(tag, '/');
}; registry = registryAndImage[0];
return imageConfig; image = registryAndImage[1];
},
createImageConfigForContainer: function (imageName, registry) {
var imageNameAndTag = imageName.split(':');
var image = imageNameAndTag[0];
if (registry) {
image = registry + '/' + imageNameAndTag[0];
}
var imageConfig = {
fromImage: image,
tag: imageNameAndTag[1] ? imageNameAndTag[1] : 'latest'
};
return imageConfig;
} }
return {
registry: registry,
image: image
};
}; };
function extractNameAndTag(imageName, registry) {
var imageNameAndTag = imageName.split(':');
var image = imageNameAndTag[0];
var tag = imageNameAndTag[1] ? imageNameAndTag[1] : 'latest';
if (registry) {
image = registry + '/' + imageNameAndTag[0];
}
return {
image: image,
tag: tag
};
}
helper.createImageConfigForCommit = function(imageName, registry) {
var imageAndTag = extractNameAndTag(imageName, registry);
return {
repo: imageAndTag.image,
tag: imageAndTag.tag
};
};
helper.createImageConfigForContainer = function (imageName, registry) {
var imageAndTag = extractNameAndTag(imageName, registry);
return {
fromImage: imageAndTag.image,
tag: imageAndTag.tag
};
};
return helper;
}]); }]);

View File

@ -40,10 +40,10 @@ angular.module('portainer.services')
var imageConfiguration = ImageHelper.createImageConfigForContainer(image, registry); var imageConfiguration = ImageHelper.createImageConfigForContainer(image, registry);
Image.create(imageConfiguration).$promise Image.create(imageConfiguration).$promise
.then(function success(data) { .then(function success(data) {
var err = data.length > 0 && data[data.length - 1].hasOwnProperty('error'); var err = data.length > 0 && data[data.length - 1].hasOwnProperty('message');
if (err) { if (err) {
var detail = data[data.length - 1]; var detail = data[data.length - 1];
deferred.reject({ msg: detail.error }); deferred.reject({ msg: detail.message });
} else { } else {
deferred.resolve(data); deferred.resolve(data);
} }
@ -54,6 +54,11 @@ angular.module('portainer.services')
return deferred.promise; return deferred.promise;
}; };
service.pullTag = function(tag) {
var imageAndRegistry = ImageHelper.extractImageAndRegistryFromTag(tag);
return service.pullImage(imageAndRegistry.image, imageAndRegistry.registry);
};
service.tagImage = function(id, image, registry) { service.tagImage = function(id, image, registry) {
var imageConfig = ImageHelper.createImageConfigForCommit(image, registry); var imageConfig = ImageHelper.createImageConfigForCommit(image, registry);
return Image.tag({id: id, tag: imageConfig.tag, repo: imageConfig.repo}).$promise; return Image.tag({id: id, tag: imageConfig.tag, repo: imageConfig.repo}).$promise;