From 80af93afec4409ee7adf2543c6e0b26dd5215bcc Mon Sep 17 00:00:00 2001
From: Prabhat Khera <91852476+prabhat-org@users.noreply.github.com>
Date: Thu, 18 Nov 2021 10:58:38 +1300
Subject: [PATCH] feat(images): allow tags when importing docker image EE-1737
(#5883)
---
.../images/import/importImageController.js | 59 +++++++++++++++----
.../views/images/import/importimage.html | 19 ++++++
2 files changed, 67 insertions(+), 11 deletions(-)
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 @@