From e00185a160f0b186ba94a8ce3516d57c2edee0ab Mon Sep 17 00:00:00 2001 From: xAt0mZ Date: Tue, 15 Oct 2019 21:55:35 +0200 Subject: [PATCH] feat(registry): registry or direct url selector --- .../imageRegistry/porImageRegistry.html | 51 +++++++++++--- .../porImageRegistryController.js | 61 +++++++++------- app/docker/helpers/imageHelper.js | 70 +++++++------------ app/docker/rest/commit.js | 3 +- app/docker/rest/image.js | 3 +- app/docker/services/containerService.js | 1 + app/docker/services/imageService.js | 10 +-- .../create/createContainerController.js | 4 +- .../containers/edit/containerController.js | 6 +- app/portainer/models/dockerhub.js | 3 +- 10 files changed, 116 insertions(+), 96 deletions(-) diff --git a/app/docker/components/imageRegistry/porImageRegistry.html b/app/docker/components/imageRegistry/porImageRegistry.html index aae64be66..2824a40cc 100644 --- a/app/docker/components/imageRegistry/porImageRegistry.html +++ b/app/docker/components/imageRegistry/porImageRegistry.html @@ -1,17 +1,45 @@
- -
- -
- -
- +
+ +
+ +
+
+ +
+
+ {{$ctrl.registry.URL}} + +
+
+ +
+ +
+
+
+ + +
+
+ +
+ +
+
+
+ +
@@ -19,3 +47,4 @@
+ diff --git a/app/docker/components/imageRegistry/porImageRegistryController.js b/app/docker/components/imageRegistry/porImageRegistryController.js index 6c47fb80a..c49e1b9ad 100644 --- a/app/docker/components/imageRegistry/porImageRegistryController.js +++ b/app/docker/components/imageRegistry/porImageRegistryController.js @@ -1,31 +1,40 @@ +import angular from 'angular'; import _ from 'lodash-es'; -angular.module('portainer.docker') -.controller('porImageRegistryController', ['$q', 'RegistryService', 'DockerHubService', 'ImageService', 'Notifications', -function ($q, RegistryService, DockerHubService, ImageService, Notifications) { - var ctrl = this; +class porImageRegistryController { + /* @ngInject */ + constructor($async, RegistryService, DockerHubService, ImageService, Notifications) { + this.$async = $async; + this.RegistryService = RegistryService; + this.DockerHubService = DockerHubService; + this.ImageService = ImageService; + this.Notifications = Notifications; - function initComponent() { - $q.all({ - registries: RegistryService.registries(), - dockerhub: DockerHubService.dockerhub(), - availableImages: ctrl.autoComplete ? ImageService.images() : [] - }) - .then(function success(data) { - var dockerhub = data.dockerhub; - var registries = data.registries; - ctrl.availableImages = ImageService.getUniqueTagListFromImages(data.availableImages); - ctrl.availableRegistries = [dockerhub].concat(registries); - if (!ctrl.registry.Id) { - ctrl.registry = dockerhub; - } else { - ctrl.registry = _.find(ctrl.availableRegistries, { 'Id': ctrl.registry.Id }); - } - }) - .catch(function error(err) { - Notifications.error('Failure', err, 'Unable to retrieve registries'); - }); + this.onInit = this.onInit.bind(this); } - initComponent(); -}]); + async onInit() { + try { + const [registries, dockerhub, availableImages] = await Promise.all([this.RegistryService.registries(), + this.DockerHubService.dockerhub(), + this.autoComplete ? this.ImageService.images() : []]); + this.availableImages = this.ImageService.getUniqueTagListFromImages(availableImages); + this.availableRegistries = [dockerhub].concat(registries); + if (!this.registry.Id) { + this.registry = dockerhub; + } else { + this.registry = _.find(this.availableRegistries, { 'Id': this.registry.Id }); + } + } catch (err) { + this.Notifications.error('Failure', err, 'Unable to retrieve registries'); + } + } + + $onInit() { + this.useRegistry = true; + return this.$async(this.onInit); + } +} + +export default porImageRegistryController; +angular.module('portainer.docker').controller('porImageRegistryController', porImageRegistryController); diff --git a/app/docker/helpers/imageHelper.js b/app/docker/helpers/imageHelper.js index 78091aa5e..3df788eaf 100644 --- a/app/docker/helpers/imageHelper.js +++ b/app/docker/helpers/imageHelper.js @@ -1,4 +1,4 @@ -import _ from 'lodash-es'; +// import _ from 'lodash-es'; angular.module('portainer.docker') .factory('ImageHelper', [function ImageHelperFactory() { @@ -12,26 +12,26 @@ angular.module('portainer.docker') return tag.match(/^(?![\.\-])([a-zA-Z0-9\_\.\-])+$/g); } - helper.extractImageAndRegistryFromRepository = function(repository) { - var slashCount = _.countBy(repository)['/']; - var registry = null; - var image = repository; - if (slashCount >= 1) { - // assume something/something[/...] - registry = repository.substr(0, repository.indexOf('/')); - // assume valid DNS name or IP (contains at least one '.') - if (_.countBy(registry)['.'] > 0) { - image = repository.substr(repository.indexOf('/') + 1); - } else { - registry = null; - } - } + // helper.extractImageAndRegistryFromRepository = function(repository) { + // var slashCount = _.countBy(repository)['/']; + // var registry = null; + // var image = repository; + // if (slashCount >= 1) { + // // assume something/something[/...] + // registry = repository.substr(0, repository.indexOf('/')); + // // assume valid DNS name or IP (contains at least one '.') + // if (_.countBy(registry)['.'] > 0) { + // image = repository.substr(repository.indexOf('/') + 1); + // } else { + // registry = null; + // } + // } - return { - registry: registry, - image: image - }; - }; + // return { + // registry: registry, + // image: image + // }; + // }; helper.getImagesNamesForDownload = function(images) { var names = images.map(function(image) { @@ -42,34 +42,12 @@ angular.module('portainer.docker') }; }; - 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); + void registry; + console.log(imageName); return { - fromImage: imageAndTag.image, - tag: imageAndTag.tag - }; + fromImage: imageName + } }; helper.removeDigestFromRepository = function(repository) { diff --git a/app/docker/rest/commit.js b/app/docker/rest/commit.js index f2cf6dc03..077951fa7 100644 --- a/app/docker/rest/commit.js +++ b/app/docker/rest/commit.js @@ -5,6 +5,7 @@ angular.module('portainer.docker') endpointId: EndpointProvider.endpointID }, { - commitContainer: {method: 'POST', params: {container: '@id', repo: '@repo', tag: '@tag'}, ignoreLoadingBar: true} + // commitContainer: {method: 'POST', params: {container: '@id', repo: '@repo', tag: '@tag'}, ignoreLoadingBar: true} + commitContainer: {method: 'POST', params: {container: '@id', repo: '@repo'}, ignoreLoadingBar: true} }); }]); diff --git a/app/docker/rest/image.js b/app/docker/rest/image.js index 928466802..64c21e287 100644 --- a/app/docker/rest/image.js +++ b/app/docker/rest/image.js @@ -15,7 +15,8 @@ function ImageFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider, HttpR search: {method: 'GET', params: {action: 'search'}}, history: {method: 'GET', params: {action: 'history'}, isArray: true}, insert: {method: 'POST', params: {id: '@id', action: 'insert'}}, - tag: {method: 'POST', params: {id: '@id', action: 'tag', force: 0, repo: '@repo', tag: '@tag'}, ignoreLoadingBar: true}, + // tag: {method: 'POST', params: {id: '@id', action: 'tag', force: 0, repo: '@repo', tag: '@tag'}, ignoreLoadingBar: true}, + tag: {method: 'POST', params: {id: '@id', action: 'tag', force: 0, repo: '@repo'}, ignoreLoadingBar: true}, inspect: {method: 'GET', params: {id: '@id', action: 'json'}}, push: { method: 'POST', params: {action: 'push', id: '@tag'}, diff --git a/app/docker/services/containerService.js b/app/docker/services/containerService.js index 300a09f91..650a3158e 100644 --- a/app/docker/services/containerService.js +++ b/app/docker/services/containerService.js @@ -108,6 +108,7 @@ function ContainerServiceFactory($q, Container, ResourceControlService, LogHelpe service.createAndStartContainer = function(configuration) { var deferred = $q.defer(); var container; + console.log(configuration); service.createContainer(configuration) .then(function success(data) { container = data; diff --git a/app/docker/services/imageService.js b/app/docker/services/imageService.js index 21bf6dd41..d83cb70c0 100644 --- a/app/docker/services/imageService.js +++ b/app/docker/services/imageService.js @@ -128,11 +128,13 @@ angular.module('portainer.docker') } service.pullImage = function(image, registry, ignoreErrors) { - var imageDetails = ImageHelper.extractImageAndRegistryFromRepository(image); - var imageConfiguration = ImageHelper.createImageConfigForContainer(imageDetails.image, registry.URL); + // var imageDetails = ImageHelper.extractImageAndRegistryFromRepository(image); + // var imageConfiguration = ImageHelper.createImageConfigForContainer(imageDetails.image, registry.URL); var authenticationDetails = registry.Authentication ? RegistryService.encodedCredentials(registry) : ''; HttpRequestHelper.setRegistryAuthenticationHeader(authenticationDetails); + var imageConfiguration = ImageHelper.createImageConfigForContainer(image, registry.URL); + if (ignoreErrors) { return pullImageAndIgnoreErrors(imageConfiguration); } @@ -140,8 +142,8 @@ angular.module('portainer.docker') }; service.tagImage = function(id, image, registry) { - var imageConfig = ImageHelper.createImageConfigForCommit(image, registry); - return Image.tag({id: id, tag: imageConfig.tag, repo: imageConfig.repo}).$promise; + void registry; + return Image.tag({id: id, repo: image}).$promise; }; service.downloadImages = function(images) { diff --git a/app/docker/views/containers/create/createContainerController.js b/app/docker/views/containers/create/createContainerController.js index 86a92ee7d..09e811af3 100644 --- a/app/docker/views/containers/create/createContainerController.js +++ b/app/docker/views/containers/create/createContainerController.js @@ -133,8 +133,7 @@ function ($q, $scope, $async, $state, $timeout, $transition$, $filter, Container var image = config.Image; var registry = $scope.formValues.Registry; var imageConfig = ImageHelper.createImageConfigForContainer(image, registry.URL); - config.Image = imageConfig.fromImage + ':' + imageConfig.tag; - $scope.imageConfig = imageConfig; + config.Image = imageConfig.fromImage ;//+ ':' + imageConfig.tag; } function preparePortBindings(config) { @@ -296,6 +295,7 @@ function ($q, $scope, $async, $state, $timeout, $transition$, $filter, Container config.Cmd = ContainerHelper.commandStringToArray(config.Cmd); prepareNetworkConfig(config); prepareImageConfig(config); + console.log(config); preparePortBindings(config); prepareConsole(config); prepareEnvironmentVariables(config); diff --git a/app/docker/views/containers/edit/containerController.js b/app/docker/views/containers/edit/containerController.js index 860c2ccc0..ace9356d7 100644 --- a/app/docker/views/containers/edit/containerController.js +++ b/app/docker/views/containers/edit/containerController.js @@ -150,11 +150,9 @@ function ($q, $scope, $state, $transition$, $filter, Commit, ContainerHelper, Co }; $scope.commit = function () { - var image = $scope.config.Image; + const image = $scope.config.Image; $scope.config.Image = ''; - var registry = $scope.config.Registry; - var imageConfig = ImageHelper.createImageConfigForCommit(image, registry.URL); - Commit.commitContainer({id: $transition$.params().id, tag: imageConfig.tag, repo: imageConfig.repo}, function () { + Commit.commitContainer({id: $transition$.params().id, repo: image}, function () { update(); Notifications.success('Image created', $transition$.params().id); }, function (e) { diff --git a/app/portainer/models/dockerhub.js b/app/portainer/models/dockerhub.js index 880a89f5b..81213cf41 100644 --- a/app/portainer/models/dockerhub.js +++ b/app/portainer/models/dockerhub.js @@ -1,6 +1,7 @@ export function DockerHubViewModel(data) { this.Name = 'DockerHub'; - this.URL = ''; + this.URL = 'docker.io'; + // this.URL = ''; this.Authentication = data.Authentication; this.Username = data.Username; this.Password = data.Password;