diff --git a/app/components/service/service.html b/app/components/service/service.html index a243b41f2..95ca62de9 100644 --- a/app/components/service/service.html +++ b/app/components/service/service.html @@ -43,20 +43,29 @@ Replicas - + {{ service.Replicas }} - Scale + Scale - - - + + + Image - {{ service.Image }} + + {{ service.Image }} + + + + + + + + Published ports @@ -66,15 +75,35 @@ - - Env + + Environment Variables - - - - - -
{{ var|key: '=' }}{{ var|value: '=' }}
+
+
+ + environment variable + +
+ +
+
+
+ name + +
+
+ value + + + + +
+
+
+ +
@@ -91,6 +120,12 @@ + +
+ + +
+
diff --git a/app/components/service/serviceController.js b/app/components/service/serviceController.js index 07fecf38a..ba4238a96 100644 --- a/app/components/service/serviceController.js +++ b/app/components/service/serviceController.js @@ -8,43 +8,68 @@ function ($scope, $stateParams, $state, Service, ServiceHelper, Task, Node, Mess $scope.sortType = 'Status'; $scope.sortReverse = false; + var previousServiceValues = {}; + $scope.order = function (sortType) { $scope.sortReverse = ($scope.sortType === sortType) ? !$scope.sortReverse : false; $scope.sortType = sortType; }; $scope.renameService = function renameService(service) { + updateServiceAttribute(service, 'Name', service.newServiceName || service.name); + service.EditName = false; + }; + $scope.changeServiceImage = function changeServiceImage(service) { + updateServiceAttribute(service, 'Image', service.newServiceImage || service.image); + service.EditImage = false; + }; + $scope.scaleService = function scaleService(service) { + updateServiceAttribute(service, 'Replicas', service.newServiceReplicas || service.Replicas); + service.EditReplicas = false; + }; + + $scope.addEnvironmentVariable = function addEnvironmentVariable(service) { + service.EnvironmentVariables.push({ key: '', value: '', originalValue: '' }); + service.hasChanges = true; + }; + $scope.removeEnvironmentVariable = function removeEnvironmentVariable(service, index) { + var removedElement = service.EnvironmentVariables.splice(index, 1); + service.hasChanges = service.hasChanges || removedElement !== null; + }; + $scope.updateEnvironmentVariable = function updateEnvironmentVariable(service, variable) { + service.hasChanges = service.hasChanges || variable.value !== variable.originalValue; + }; + + $scope.cancelChanges = function changeServiceImage(service) { + Object.keys(previousServiceValues).forEach(function(attribute) { + service[attribute] = previousServiceValues[attribute]; // reset service values + service['newService' + attribute] = previousServiceValues[attribute]; // reset edit fields + }); + previousServiceValues = {}; // clear out all changes + // clear out environment variable changes + service.EnvironmentVariables = translateEnvironmentVariables(service.Env); + + service.hasChanges = false; + }; + + $scope.updateService = function updateService(service) { $('#loadServicesSpinner').show(); - var serviceName = service.Name; var config = ServiceHelper.serviceToConfig(service.Model); config.Name = service.newServiceName; + config.TaskTemplate.ContainerSpec.Env = translateEnvironmentVariablesToEnv(service.EnvironmentVariables); + config.TaskTemplate.ContainerSpec.Image = service.newServiceImage; + config.Mode.Replicated.Replicas = service.Replicas; + Service.update({ id: service.Id, version: service.Version }, config, function (data) { $('#loadServicesSpinner').hide(); - Messages.send("Service successfully renamed", "New name: " + service.newServiceName); + Messages.send("Service successfully updated", "Service updated"); $state.go('service', {id: service.Id}, {reload: true}); }, function (e) { $('#loadServicesSpinner').hide(); - service.EditName = false; - service.Name = serviceName; - Messages.error("Failure", e, "Unable to rename service"); + Messages.error("Failure", e, "Unable to update service"); }); }; - $scope.scaleService = function scaleService(service) { - $('#loadServicesSpinner').show(); - var config = ServiceHelper.serviceToConfig(service.Model); - config.Mode.Replicated.Replicas = service.Replicas; - Service.update({ id: service.Id, version: service.Version }, config, function (data) { - $('#loadServicesSpinner').hide(); - Messages.send("Service successfully scaled", "New replica count: " + service.Replicas); - $state.go('service', {id: service.Id}, {reload: true}); - }, function (e) { - $('#loadServicesSpinner').hide(); - service.Scale = false; - service.Replicas = service.ReplicaCount; - Messages.error("Failure", e, "Unable to scale service"); - }); - }; $scope.removeService = function removeService() { $('#loadingViewSpinner').show(); @@ -68,6 +93,10 @@ function ($scope, $stateParams, $state, Service, ServiceHelper, Task, Node, Mess Service.get({id: $stateParams.id}, function (d) { var service = new ServiceViewModel(d); service.newServiceName = service.Name; + service.newServiceImage = service.Image; + service.newServiceReplicas = service.Replicas; + service.EnvironmentVariables = translateEnvironmentVariables(service.Env); + $scope.service = service; Task.query({filters: {service: [service.Name]}}, function (tasks) { Node.query({}, function (nodes) { @@ -93,5 +122,40 @@ function ($scope, $stateParams, $state, Service, ServiceHelper, Task, Node, Mess }); } + function updateServiceAttribute(service, name, newValue) { + // ensure we only capture the original previous value, in case we update the attribute multiple times + if (!previousServiceValues[name]) { + previousServiceValues[name] = service[name]; + } + // update the attribute + service[name] = newValue; + service.hasChanges = true; + } + + function translateEnvironmentVariables(env) { + if (env) { + var variables = []; + env.forEach(function(variable) { + var keyValue = variable.split('='); + var originalValue = (keyValue.length > 1) ? keyValue[1] : ''; + variables.push({ key: keyValue[0], value: originalValue, originalValue: originalValue, added: true}); + }); + return variables; + } + return []; + } + function translateEnvironmentVariablesToEnv(env) { + if (env) { + var variables = []; + env.forEach(function(variable) { + if (variable.key && variable.key !== '' && variable.value && variable.value !== '') { + variables.push(variable.key + '=' + variable.value); + } + }); + return variables; + } + return []; + } + fetchServiceDetails(); }]);