From b3a641e15a8783892c5af33997e1caed3ddfc459 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Fri, 25 Nov 2016 07:21:06 +0100 Subject: [PATCH] feat(service-creation): add support for container labels (#365) --- .../createService/createServiceController.js | 19 +++++++++++- .../createService/createservice.html | 29 +++++++++++++++++ app/components/service/service.html | 31 +++++++++++++++++++ app/components/service/serviceController.js | 13 +++++++- app/shared/helpers.js | 2 ++ app/shared/viewmodel.js | 3 +- 6 files changed, 94 insertions(+), 3 deletions(-) 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 @@ + +
+ +
+ + container label + +
+ +
+
+
+ name + +
+
+ value + + + + +
+
+
+ +
+ 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 + +
+
+ + container label + +
+ +
+
+
+ name + +
+
+ value + + + + +
+
+
+ +
+ + 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;