diff --git a/app/docker/views/images/import/importImageController.js b/app/docker/views/images/import/importImageController.js index 54b1a4838..3162fbb0c 100644 --- a/app/docker/views/images/import/importImageController.js +++ b/app/docker/views/images/import/importImageController.js @@ -1,35 +1,72 @@ +import { PorImageRegistryModel } from 'Docker/models/porImageRegistry'; + angular.module('portainer.docker').controller('ImportImageController', [ '$scope', '$state', 'ImageService', 'Notifications', 'HttpRequestHelper', - function ($scope, $state, ImageService, Notifications, HttpRequestHelper) { + 'Authentication', + 'ImageHelper', + 'endpoint', + function ($scope, $state, ImageService, Notifications, HttpRequestHelper, Authentication, ImageHelper, endpoint) { $scope.state = { actionInProgress: false, }; + $scope.endpoint = endpoint; + + $scope.isAdmin = Authentication.isAdmin(); + $scope.formValues = { UploadFile: null, NodeName: null, + RegistryModel: new PorImageRegistryModel(), }; - $scope.uploadImage = function () { + $scope.setPullImageValidity = setPullImageValidity; + function setPullImageValidity(validity) { + $scope.state.pullImageValidity = validity; + } + + async function tagImage(id) { + const registryModel = $scope.formValues.RegistryModel; + if (registryModel.Image) { + const image = ImageHelper.createImageConfigForContainer(registryModel); + try { + await ImageService.tagImage(id, image.fromImage); + } catch (err) { + Notifications.error('Failure', err, 'Unable to tag image'); + } + } + } + + $scope.uploadImage = async function () { $scope.state.actionInProgress = true; var nodeName = $scope.formValues.NodeName; HttpRequestHelper.setPortainerAgentTargetHeader(nodeName); var file = $scope.formValues.UploadFile; - ImageService.uploadImage(file) - .then(function success() { + try { + const { data } = await ImageService.uploadImage(file); + if (data.error) { + Notifications.error('Failure', data.error, 'Unable to upload image'); + } else if (data.stream) { + var regex = /Loaded.*?: (.*?)\n$/g; + var imageIds = regex.exec(data.stream); + if (imageIds && imageIds.length == 2) { + await tagImage(imageIds[1]); + $state.go('docker.images.image', { id: imageIds[1] }, { reload: true }); + } Notifications.success('Images successfully uploaded'); - }) - .catch(function error(err) { - Notifications.error('Failure', err, 'Unable to upload image'); - }) - .finally(function final() { - $scope.state.actionInProgress = false; - }); + } else { + Notifications.success('The uploaded tar file contained multiple images. The provided tag therefore has been ignored.'); + } + } catch (err) { + Notifications.error('Failure', err, 'Unable to upload image'); + } finally { + $scope.state.actionInProgress = false; + } }; }, ]); diff --git a/app/docker/views/images/import/importimage.html b/app/docker/views/images/import/importimage.html index 8a9c5476a..0eb665c33 100644 --- a/app/docker/views/images/import/importimage.html +++ b/app/docker/views/images/import/importimage.html @@ -37,6 +37,25 @@ +
+
+ + + + + + + +
+
Actions