+
diff --git a/app/docker/components/imageRegistry/porImageRegistryController.js b/app/docker/components/imageRegistry/porImageRegistryController.js
index c49e1b9ad..721d61afe 100644
--- a/app/docker/components/imageRegistry/porImageRegistryController.js
+++ b/app/docker/components/imageRegistry/porImageRegistryController.js
@@ -20,10 +20,12 @@ class porImageRegistryController {
this.autoComplete ? this.ImageService.images() : []]);
this.availableImages = this.ImageService.getUniqueTagListFromImages(availableImages);
this.availableRegistries = [dockerhub].concat(registries);
- if (!this.registry.Id) {
- this.registry = dockerhub;
+
+ const id = this.model.Registry.Id;
+ if (!id) {
+ this.model.Registry = dockerhub;
} else {
- this.registry = _.find(this.availableRegistries, { 'Id': this.registry.Id });
+ this.model.Registry = _.find(this.availableRegistries, { 'Id': id });
}
} catch (err) {
this.Notifications.error('Failure', err, 'Unable to retrieve registries');
@@ -31,7 +33,6 @@ class porImageRegistryController {
}
$onInit() {
- this.useRegistry = true;
return this.$async(this.onInit);
}
}
diff --git a/app/docker/helpers/imageHelper.js b/app/docker/helpers/imageHelper.js
index 3df788eaf..069b0bc42 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() {
@@ -7,6 +7,7 @@ angular.module('portainer.docker')
var helper = {};
helper.isValidTag = isValidTag;
+ helper.createImageConfigForContainer = createImageConfigForContainer;
function isValidTag(tag) {
return tag.match(/^(?![\.\-])([a-zA-Z0-9\_\.\-])+$/g);
@@ -42,13 +43,30 @@ angular.module('portainer.docker')
};
};
- helper.createImageConfigForContainer = function (imageName, registry) {
- void registry;
- console.log(imageName);
- return {
- fromImage: imageName
+ /**
+ *
+ * @param {PorImageRegistryModel} registry
+ */
+ function createImageConfigForContainer(registry) {
+ console.log('registry', registry);
+ const data = {
+ fromImage: ''
+ };
+ let fullImageName = '';
+
+ if (registry.UseRegistry) {
+ fullImageName = registry.Registry.URL + '/' + registry.Image;
+ if (!_.includes(registry.Image, ':')) {
+ fullImageName += ':latest';
+ }
+ } else {
+ fullImageName = registry.Image;
}
- };
+
+ data.fromImage = fullImageName;
+ console.log('FULL IMAGE NAME', fullImageName);
+ return data;
+ }
helper.removeDigestFromRepository = function(repository) {
return repository.split('@sha')[0];
diff --git a/app/docker/models/porImageRegistry.js b/app/docker/models/porImageRegistry.js
new file mode 100644
index 000000000..38ea4ad94
--- /dev/null
+++ b/app/docker/models/porImageRegistry.js
@@ -0,0 +1,16 @@
+/**
+ * This model should be used with por-image-registry component
+ * And bound to the 'model' attribute
+ *
+ * // viewController.js
+ *
+ * this.imageModel = new PorImageRegistryModel();
+ *
+ * // view.html
+ *
+ */
+export function PorImageRegistryModel() {
+ this.UseRegistry = true;
+ this.Registry = {};
+ this.Image = '';
+}
\ No newline at end of file
diff --git a/app/docker/rest/image.js b/app/docker/rest/image.js
index 64c21e287..25d78d2c2 100644
--- a/app/docker/rest/image.js
+++ b/app/docker/rest/image.js
@@ -25,7 +25,8 @@ function ImageFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider, HttpR
ignoreLoadingBar: true
},
create: {
- method: 'POST', params: {action: 'create', fromImage: '@fromImage', tag: '@tag'},
+ // method: 'POST', params: {action: 'create', fromImage: '@fromImage', tag: '@tag'},
+ method: 'POST', params: {action: 'create', fromImage: '@fromImage'},
isArray: true, transformResponse: jsonObjectsToArrayHandler,
headers: { 'X-Registry-Auth': HttpRequestHelper.registryAuthenticationHeader },
ignoreLoadingBar: true
diff --git a/app/docker/services/containerService.js b/app/docker/services/containerService.js
index 650a3158e..300a09f91 100644
--- a/app/docker/services/containerService.js
+++ b/app/docker/services/containerService.js
@@ -108,7 +108,6 @@ 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 d83cb70c0..fbab095f2 100644
--- a/app/docker/services/imageService.js
+++ b/app/docker/services/imageService.js
@@ -127,19 +127,26 @@ angular.module('portainer.docker')
return deferred.promise;
}
- service.pullImage = function(image, registry, ignoreErrors) {
+ service.pullImage = pullImage;
+
+ /**
+ *
+ * @param {PorImageRegistryModel} registry
+ * @param {bool} ignoreErrors
+ */
+ function pullImage(registry, ignoreErrors) {
// var imageDetails = ImageHelper.extractImageAndRegistryFromRepository(image);
// var imageConfiguration = ImageHelper.createImageConfigForContainer(imageDetails.image, registry.URL);
- var authenticationDetails = registry.Authentication ? RegistryService.encodedCredentials(registry) : '';
+ var authenticationDetails = registry.Registry.Authentication ? RegistryService.encodedCredentials(registry.Registry) : '';
HttpRequestHelper.setRegistryAuthenticationHeader(authenticationDetails);
- var imageConfiguration = ImageHelper.createImageConfigForContainer(image, registry.URL);
+ var imageConfiguration = ImageHelper.createImageConfigForContainer(registry);
if (ignoreErrors) {
return pullImageAndIgnoreErrors(imageConfiguration);
}
return pullImageAndAcknowledgeErrors(imageConfiguration);
- };
+ }
service.tagImage = function(id, image, registry) {
void registry;
diff --git a/app/docker/views/containers/create/createContainerController.js b/app/docker/views/containers/create/createContainerController.js
index 09e811af3..5f52657eb 100644
--- a/app/docker/views/containers/create/createContainerController.js
+++ b/app/docker/views/containers/create/createContainerController.js
@@ -2,6 +2,7 @@ import _ from 'lodash-es';
import { ContainerCapabilities, ContainerCapability } from '../../../models/containerCapabilities';
import { AccessControlFormData } from '../../../../portainer/components/accessControlForm/porAccessControlFormModel';
import { ContainerDetailsViewModel } from '../../../models/container';
+import { PorImageRegistryModel } from 'Docker/models/porImageRegistry';
angular.module('portainer.docker')
@@ -27,7 +28,8 @@ function ($q, $scope, $async, $state, $timeout, $transition$, $filter, Container
NodeName: null,
capabilities: [],
LogDriverName: '',
- LogDriverOpts: []
+ LogDriverOpts: [],
+ RegistryModel: new PorImageRegistryModel()
};
$scope.extraNetworks = {};
@@ -129,11 +131,10 @@ function ($q, $scope, $async, $state, $timeout, $transition$, $filter, Container
$scope.fromContainerMultipleNetworks = false;
+ // TODO
function prepareImageConfig(config) {
- var image = config.Image;
- var registry = $scope.formValues.Registry;
- var imageConfig = ImageHelper.createImageConfigForContainer(image, registry.URL);
- config.Image = imageConfig.fromImage ;//+ ':' + imageConfig.tag;
+ const imageConfig = ImageHelper.createImageConfigForContainer($scope.formValues.RegistryModel);
+ config.Image = imageConfig.fromImage;
}
function preparePortBindings(config) {
@@ -295,7 +296,6 @@ 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);
@@ -436,13 +436,14 @@ function ($q, $scope, $async, $state, $timeout, $transition$, $filter, Container
$scope.config.HostConfig.Devices = path;
}
+ // TODO
function loadFromContainerImageConfig() {
var imageInfo = ImageHelper.extractImageAndRegistryFromRepository($scope.config.Image);
RegistryService.retrieveRegistryFromRepository($scope.config.Image)
.then(function success(data) {
if (data) {
$scope.config.Image = imageInfo.image;
- $scope.formValues.Registry = data;
+ $scope.formValues.RegistryModel = data;
}
})
.catch(function error(err) {
@@ -568,7 +569,6 @@ function ($q, $scope, $async, $state, $timeout, $transition$, $filter, Container
loadFromContainerSpec();
} else {
$scope.fromContainer = {};
- $scope.formValues.Registry = {};
$scope.formValues.capabilities = new ContainerCapabilities();
}
}, function(e) {
@@ -753,7 +753,7 @@ function ($q, $scope, $async, $state, $timeout, $transition$, $filter, Container
function pullImageIfNeeded() {
return $q.when($scope.formValues.alwaysPull &&
- ImageService.pullImage($scope.config.Image, $scope.formValues.Registry, true));
+ ImageService.pullImage($scope.formValues.RegistryModel, true));
}
function createNewContainer() {
diff --git a/app/docker/views/containers/create/createcontainer.html b/app/docker/views/containers/create/createcontainer.html
index 881053077..cec1a551e 100644
--- a/app/docker/views/containers/create/createcontainer.html
+++ b/app/docker/views/containers/create/createcontainer.html
@@ -21,16 +21,15 @@
Image configuration
-
+
The Docker registry for the {{ config.Image }}
image is not registered inside Portainer, you will not be able to create a container. Please register that registry first.
-
+
@@ -142,7 +141,9 @@
-
+
Deploy the container
Deployment in progress...
diff --git a/app/docker/views/containers/edit/container.html b/app/docker/views/containers/edit/container.html
index 5997f2351..92f4ded45 100644
--- a/app/docker/views/containers/edit/container.html
+++ b/app/docker/views/containers/edit/container.html
@@ -155,8 +155,7 @@
diff --git a/app/docker/views/containers/edit/containerController.js b/app/docker/views/containers/edit/containerController.js
index ace9356d7..97a10b874 100644
--- a/app/docker/views/containers/edit/containerController.js
+++ b/app/docker/views/containers/edit/containerController.js
@@ -1,4 +1,5 @@
import moment from 'moment';
+import { PorImageRegistryModel } from 'Docker/models/porImageRegistry';
angular.module('portainer.docker')
.controller('ContainerController', ['$q', '$scope', '$state','$transition$', '$filter', 'Commit', 'ContainerHelper', 'ContainerService', 'ImageHelper', 'NetworkService', 'Notifications', 'ModalService', 'ResourceControlService', 'RegistryService', 'ImageService', 'HttpRequestHelper', 'Authentication',
@@ -7,8 +8,7 @@ function ($q, $scope, $state, $transition$, $filter, Commit, ContainerHelper, Co
$scope.portBindings = [];
$scope.config = {
- Image: '',
- Registry: ''
+ RegistryModel: new PorImageRegistryModel()
};
$scope.state = {
@@ -149,6 +149,7 @@ function ($q, $scope, $state, $transition$, $filter, Commit, ContainerHelper, Co
});
};
+ // TODO CHANGE
$scope.commit = function () {
const image = $scope.config.Image;
$scope.config.Image = '';
@@ -223,15 +224,12 @@ function ($q, $scope, $state, $transition$, $filter, Commit, ContainerHelper, Co
if (!pullImage) {
return $q.when();
}
- return getRegistry().then(function pullImage(containerRegistery) {
- return ImageService.pullImage(container.Config.Image, containerRegistery, true);
+ return RegistryService.retrieveRegistryFromRepository(container.Config.Image)
+ .then(function pullImage(containerRegistry) {
+ return ImageService.pullImage(containerRegistry, true);
});
}
- function getRegistry() {
- return RegistryService.retrieveRegistryFromRepository(container.Config.Image);
- }
-
function setMainNetworkAndCreateContainer() {
var networks = config.NetworkingConfig.EndpointsConfig;
var networksNames = Object.keys(networks);
diff --git a/app/docker/views/images/edit/image.html b/app/docker/views/images/edit/image.html
index 8b6641548..15493d812 100644
--- a/app/docker/views/images/edit/image.html
+++ b/app/docker/views/images/edit/image.html
@@ -64,8 +64,7 @@
diff --git a/app/portainer/components/forms/template-form/template-form.js b/app/portainer/components/forms/template-form/template-form.js
index 9acb67f7d..25260d2b4 100644
--- a/app/portainer/components/forms/template-form/template-form.js
+++ b/app/portainer/components/forms/template-form/template-form.js
@@ -1,58 +1,6 @@
angular.module('portainer.app').component('templateForm', {
templateUrl: './templateForm.html',
- controller: function() {
- this.state = {
- collapseTemplate: false,
- collapseContainer: false,
- collapseStack: false,
- collapseEnv: false
- };
-
- this.addPortBinding = function() {
- this.model.Ports.push({ containerPort: '', protocol: 'tcp' });
- };
-
- this.removePortBinding = function(index) {
- this.model.Ports.splice(index, 1);
- };
-
- this.addVolume = function () {
- this.model.Volumes.push({ container: '', bind: '', readonly: false, type: 'auto' });
- };
-
- this.removeVolume = function(index) {
- this.model.Volumes.splice(index, 1);
- };
-
- this.addLabel = function () {
- this.model.Labels.push({ name: '', value: ''});
- };
-
- this.removeLabel = function(index) {
- this.model.Labels.splice(index, 1);
- };
-
- this.addEnvVar = function() {
- this.model.Env.push({ type: 1, name: '', label: '', description: '', default: '', preset: true, select: [] });
- };
-
- this.removeEnvVar = function(index) {
- this.model.Env.splice(index, 1);
- };
-
- this.addEnvVarValue = function(env) {
- env.select = env.select || [];
- env.select.push({ name: '', value: '' });
- };
-
- this.removeEnvVarValue = function(env, index) {
- env.select.splice(index, 1);
- };
-
- this.changeEnvVarType = function(env) {
- env.preset = env.type === 1;
- };
- },
+ controller: 'TemplateFormController',
bindings: {
model: '=',
categories: '<',
diff --git a/app/portainer/components/forms/template-form/templateForm.html b/app/portainer/components/forms/template-form/templateForm.html
index 67832e2ed..114c3ebf7 100644
--- a/app/portainer/components/forms/template-form/templateForm.html
+++ b/app/portainer/components/forms/template-form/templateForm.html
@@ -203,10 +203,9 @@
diff --git a/app/portainer/components/forms/template-form/templateFormController.js b/app/portainer/components/forms/template-form/templateFormController.js
new file mode 100644
index 000000000..840bc664a
--- /dev/null
+++ b/app/portainer/components/forms/template-form/templateFormController.js
@@ -0,0 +1,54 @@
+angular.module('portainer.app')
+.controller('TemplateFormController', [function() {
+ this.state = {
+ collapseTemplate: false,
+ collapseContainer: false,
+ collapseStack: false,
+ collapseEnv: false
+ };
+
+ this.addPortBinding = function() {
+ this.model.Ports.push({ containerPort: '', protocol: 'tcp' });
+ };
+
+ this.removePortBinding = function(index) {
+ this.model.Ports.splice(index, 1);
+ };
+
+ this.addVolume = function () {
+ this.model.Volumes.push({ container: '', bind: '', readonly: false, type: 'auto' });
+ };
+
+ this.removeVolume = function(index) {
+ this.model.Volumes.splice(index, 1);
+ };
+
+ this.addLabel = function () {
+ this.model.Labels.push({ name: '', value: ''});
+ };
+
+ this.removeLabel = function(index) {
+ this.model.Labels.splice(index, 1);
+ };
+
+ this.addEnvVar = function() {
+ this.model.Env.push({ type: 1, name: '', label: '', description: '', default: '', preset: true, select: [] });
+ };
+
+ this.removeEnvVar = function(index) {
+ this.model.Env.splice(index, 1);
+ };
+
+ this.addEnvVarValue = function(env) {
+ env.select = env.select || [];
+ env.select.push({ name: '', value: '' });
+ };
+
+ this.removeEnvVarValue = function(env, index) {
+ env.select.splice(index, 1);
+ };
+
+ this.changeEnvVarType = function(env) {
+ env.preset = env.type === 1;
+ };
+}]);
\ No newline at end of file
diff --git a/app/portainer/models/template.js b/app/portainer/models/template.js
index e88f8fcef..ffdb5a406 100644
--- a/app/portainer/models/template.js
+++ b/app/portainer/models/template.js
@@ -1,19 +1,20 @@
import _ from 'lodash-es';
+import { PorImageRegistryModel } from 'Docker/models/porImageRegistry';
export function TemplateDefaultModel() {
this.Type = 1;
this.AdministratorOnly = false;
this.Title = '';
- this.Image = '';
this.Description = '';
this.Volumes = [];
this.Ports = [];
this.Env = [];
this.Labels = [];
this.RestartPolicy = 'always';
- this.Registry = {};
+ this.RegistryModel = new PorImageRegistryModel();
}
+// TODO CHANGE
export function TemplateCreateRequest(model) {
this.Type = model.Type;
this.Name = model.Name;
@@ -24,8 +25,8 @@ export function TemplateCreateRequest(model) {
this.Categories = model.Categories;
this.Platform = model.Platform;
this.Logo = model.Logo;
- this.Image = model.Image;
- this.Registry = model.Registry.URL;
+ this.Image = model.RegistryModel.Image;
+ this.Registry = model.RegistryModel.Registry.URL;
this.Command = model.Command;
this.Network = model.Network && model.Network.Name;
this.Privileged = model.Privileged;
@@ -53,6 +54,7 @@ export function TemplateUpdateRequest(model) {
this.id = model.Id;
}
+// TODO CHANGE
export function TemplateViewModel(data) {
this.Id = data.Id;
this.Title = data.title;
@@ -66,9 +68,9 @@ export function TemplateViewModel(data) {
this.Logo = data.logo;
this.Repository = data.repository;
this.Hostname = data.hostname;
- this.Registry = data.registry ? { URL: data.registry } : {};
- this.Image = data.image;
- this.Registry = data.registry ? data.registry : '';
+ this.Registry = data.registry ? { URL: data.registry } : {}; // CHANGE
+ this.Image = data.image; // CHANGE
+ this.Registry = data.registry ? data.registry : ''; // CHANGE
this.Command = data.command ? data.command : '';
this.Network = data.network ? data.network : '';
this.Privileged = data.privileged ? data.privileged : false;
diff --git a/app/portainer/services/api/registryService.js b/app/portainer/services/api/registryService.js
index 1e9c8a8ec..fa97e9279 100644
--- a/app/portainer/services/api/registryService.js
+++ b/app/portainer/services/api/registryService.js
@@ -81,6 +81,7 @@ angular.module('portainer.app')
service.retrieveRegistryFromRepository = function(repository) {
var deferred = $q.defer();
+ console.log('registry', repository);
var imageDetails = ImageHelper.extractImageAndRegistryFromRepository(repository);
$q.when(imageDetails.registry ? service.registries() : DockerHubService.dockerhub())
diff --git a/app/portainer/services/api/templateService.js b/app/portainer/services/api/templateService.js
index 70c0c7d4c..d42733596 100644
--- a/app/portainer/services/api/templateService.js
+++ b/app/portainer/services/api/templateService.js
@@ -10,6 +10,7 @@ function TemplateServiceFactory($q, Templates, TemplateHelper, ImageHelper, Cont
'use strict';
var service = {};
+ // TODO CHANGE
service.templates = function() {
var deferred = $q.defer();
@@ -27,6 +28,7 @@ function TemplateServiceFactory($q, Templates, TemplateHelper, ImageHelper, Cont
return deferred.promise;
};
+ // TODO CHANGE
service.template = function(id) {
var deferred = $q.defer();
@@ -47,18 +49,20 @@ function TemplateServiceFactory($q, Templates, TemplateHelper, ImageHelper, Cont
return Templates.remove({ id: id }).$promise;
};
+ // TODO CHANGE
service.create = function(model) {
var payload = new TemplateCreateRequest(model);
return Templates.create(payload).$promise;
};
+ // TODO CHANGE
service.update = function(model) {
var payload = new TemplateUpdateRequest(model);
return Templates.update(payload).$promise;
};
service.createTemplateConfiguration = function(template, containerName, network) {
- var imageConfiguration = ImageHelper.createImageConfigForContainer(template.Image, template.Registry);
+ var imageConfiguration = ImageHelper.createImageConfigForContainer(template.RegistryModel);
var containerConfiguration = service.createContainerConfiguration(template, containerName, network);
containerConfiguration.Image = imageConfiguration.fromImage + ':' + imageConfiguration.tag;
return containerConfiguration;
diff --git a/app/portainer/views/templates/edit/templateController.js b/app/portainer/views/templates/edit/templateController.js
index 227507a3b..a887ef0b9 100644
--- a/app/portainer/views/templates/edit/templateController.js
+++ b/app/portainer/views/templates/edit/templateController.js
@@ -8,6 +8,7 @@ function ($q, $scope, $state, $transition$, TemplateService, TemplateHelper, Net
actionInProgress: false
};
+ // TODO CHANGE
$scope.update = function() {
var model = $scope.template;