diff --git a/app/components/createService/createServiceController.js b/app/components/createService/createServiceController.js
index 7cc0767e3..4f7619e6c 100644
--- a/app/components/createService/createServiceController.js
+++ b/app/components/createService/createServiceController.js
@@ -13,6 +13,7 @@ function ($scope, $state, Service, Volume, Network, ImageHelper, Messages) {
User: '',
Env: [],
Labels: [],
+ ContainerLabels: [],
Volumes: [],
Network: '',
ExtraNetworks: [],
@@ -59,6 +60,14 @@ function ($scope, $state, Service, Volume, Network, ImageHelper, Messages) {
$scope.formValues.Labels.splice(index, 1);
};
+ $scope.addContainerLabel = function() {
+ $scope.formValues.ContainerLabels.push({ name: '', value: ''});
+ };
+
+ $scope.removeContainerLabel = function(index) {
+ $scope.formValues.ContainerLabels.splice(index, 1);
+ };
+
function prepareImageConfig(config, input) {
var imageConfig = ImageHelper.createImageConfig(input.Image, input.Registry);
config.TaskTemplate.ContainerSpec.Image = imageConfig.repo + ':' + imageConfig.tag;
@@ -113,7 +122,15 @@ function ($scope, $state, Service, Volume, Network, ImageHelper, Messages) {
labels[label.name] = label.value;
}
});
- config.TaskTemplate.ContainerSpec.Labels = labels;
+ config.Labels = labels;
+
+ var containerLabels = {};
+ input.ContainerLabels.forEach(function (label) {
+ if (label.name && label.value) {
+ containerLabels[label.name] = label.value;
+ }
+ });
+ config.TaskTemplate.ContainerSpec.Labels = containerLabels;
}
function prepareVolumes(config, input) {
diff --git a/app/components/createService/createservice.html b/app/components/createService/createservice.html
index c6e68a7dc..a1d017fd8 100644
--- a/app/components/createService/createservice.html
+++ b/app/components/createService/createservice.html
@@ -284,6 +284,35 @@
+
+
+
diff --git a/app/components/service/service.html b/app/components/service/service.html
index 027a5b614..194f06228 100644
--- a/app/components/service/service.html
+++ b/app/components/service/service.html
@@ -137,6 +137,37 @@
+
+ Container labels |
+
+
+ |
+
diff --git a/app/components/service/serviceController.js b/app/components/service/serviceController.js
index 7d99234db..700df3886 100644
--- a/app/components/service/serviceController.js
+++ b/app/components/service/serviceController.js
@@ -51,6 +51,14 @@ function ($scope, $stateParams, $state, Service, ServiceHelper, Task, Node, Mess
$scope.updateLabel = function updateLabel(service, label) {
service.hasChanges = service.hasChanges || label.value !== label.originalValue;
};
+ $scope.addContainerLabel = function addContainerLabel(service) {
+ service.hasChanges = true;
+ service.ServiceContainerLabels.push({ key: '', value: '', originalValue: '' });
+ };
+ $scope.removeContainerLabel = function removeContainerLabel(service, index) {
+ var removedElement = service.ServiceContainerLabels.splice(index, 1);
+ service.hasChanges = service.hasChanges || removedElement !== null;
+ };
$scope.cancelChanges = function changeServiceImage(service) {
Object.keys(previousServiceValues).forEach(function(attribute) {
@@ -61,6 +69,7 @@ function ($scope, $stateParams, $state, Service, ServiceHelper, Task, Node, Mess
// clear out environment variable changes
service.EnvironmentVariables = translateEnvironmentVariables(service.Env);
service.ServiceLabels = translateLabelsToServiceLabels(service.Labels);
+ service.ServiceContainerLabels = translateLabelsToServiceLabels(service.ContainerLabels);
service.hasChanges = false;
};
@@ -69,8 +78,9 @@ function ($scope, $stateParams, $state, Service, ServiceHelper, Task, Node, Mess
$('#loadServicesSpinner').show();
var config = ServiceHelper.serviceToConfig(service.Model);
config.Name = service.newServiceName;
+ config.Labels = translateServiceLabelsToLabels(service.ServiceLabels);
config.TaskTemplate.ContainerSpec.Env = translateEnvironmentVariablesToEnv(service.EnvironmentVariables);
- config.TaskTemplate.ContainerSpec.Labels = translateServiceLabelsToLabels(service.ServiceLabels);
+ config.TaskTemplate.ContainerSpec.Labels = translateServiceLabelsToLabels(service.ServiceContainerLabels);
config.TaskTemplate.ContainerSpec.Image = service.newServiceImage;
if (service.Mode === 'replicated') {
config.Mode.Replicated.Replicas = service.Replicas;
@@ -113,6 +123,7 @@ function ($scope, $stateParams, $state, Service, ServiceHelper, Task, Node, Mess
service.newServiceReplicas = service.Replicas;
service.EnvironmentVariables = translateEnvironmentVariables(service.Env);
service.ServiceLabels = translateLabelsToServiceLabels(service.Labels);
+ service.ServiceContainerLabels = translateLabelsToServiceLabels(service.ContainerLabels);
$scope.service = service;
Task.query({filters: {service: [service.Name]}}, function (tasks) {
diff --git a/app/shared/helpers.js b/app/shared/helpers.js
index 87ba6873f..2ccf027f7 100644
--- a/app/shared/helpers.js
+++ b/app/shared/helpers.js
@@ -41,8 +41,10 @@ angular.module('portainer.helpers', [])
serviceToConfig: function(service) {
return {
Name: service.Spec.Name,
+ Labels: service.Spec.Labels,
TaskTemplate: service.Spec.TaskTemplate,
Mode: service.Spec.Mode,
+ UpdateConfig: service.Spec.UpdateConfig,
Networks: service.Spec.Networks,
EndpointSpec: service.Spec.EndpointSpec
};
diff --git a/app/shared/viewmodel.js b/app/shared/viewmodel.js
index 10f538aa2..e320c0752 100644
--- a/app/shared/viewmodel.js
+++ b/app/shared/viewmodel.js
@@ -35,8 +35,9 @@ function ServiceViewModel(data) {
} else {
this.Mode = 'global';
}
+ this.Labels = data.Spec.Labels;
if (data.Spec.TaskTemplate.ContainerSpec) {
- this.Labels = data.Spec.TaskTemplate.ContainerSpec.Labels;
+ this.ContainerLabels = data.Spec.TaskTemplate.ContainerSpec.Labels;
}
if (data.Spec.TaskTemplate.ContainerSpec.Env) {
this.Env = data.Spec.TaskTemplate.ContainerSpec.Env;