diff --git a/app/components/createService/createServiceController.js b/app/components/createService/createServiceController.js index 09ff3805a..32b7e5c78 100644 --- a/app/components/createService/createServiceController.js +++ b/app/components/createService/createServiceController.js @@ -24,7 +24,7 @@ function ($q, $scope, $state, $timeout, Service, ServiceHelper, ConfigService, C Parallelism: 1, PlacementConstraints: [], PlacementPreferences: [], - UpdateDelay: 0, + UpdateDelay: '0s', UpdateOrder: 'stop-first', FailureAction: 'pause', Secrets: [], @@ -243,7 +243,7 @@ function ($q, $scope, $state, $timeout, Service, ServiceHelper, ConfigService, C function prepareUpdateConfig(config, input) { config.UpdateConfig = { Parallelism: input.Parallelism || 0, - Delay: input.UpdateDelay * 1000000000 || 0, + Delay: ServiceHelper.translateHumanDurationToNanos(input.UpdateDelay), FailureAction: input.FailureAction, Order: input.UpdateOrder }; diff --git a/app/components/createService/createservice.html b/app/components/createService/createservice.html index 196e97506..426696e04 100644 --- a/app/components/createService/createservice.html +++ b/app/components/createService/createservice.html @@ -389,13 +389,16 @@
- +
- +

- Amount of time between updates. Time in seconds. + Amount of time between updates expressed by a number followed by unit (ns|us|ms|s|m|h). Example: 1m.

diff --git a/app/components/service/includes/updateconfig.html b/app/components/service/includes/updateconfig.html index 92b6ff34b..3a1d7801b 100644 --- a/app/components/service/includes/updateconfig.html +++ b/app/components/service/includes/updateconfig.html @@ -19,11 +19,11 @@ Update Delay - +

- Amount of time between updates. Time in seconds. + Amount of time between updates expressed by a number followed by unit (ns|us|ms|s|m|h). Example: 1m.

diff --git a/app/components/service/serviceController.js b/app/components/service/serviceController.js index 761c7f708..5633d2911 100644 --- a/app/components/service/serviceController.js +++ b/app/components/service/serviceController.js @@ -244,7 +244,7 @@ function ($q, $scope, $transition$, $state, $location, $timeout, $anchorScroll, config.UpdateConfig = { Parallelism: service.UpdateParallelism, - Delay: service.UpdateDelay * 1000000000, + Delay: ServiceHelper.translateHumanDurationToNanos(service.UpdateDelay), FailureAction: service.UpdateFailureAction, Order: service.UpdateOrder }; @@ -324,7 +324,7 @@ function ($q, $scope, $transition$, $state, $location, $timeout, $anchorScroll, function transformDurations(service) { service.RestartDelay = service.RestartDelay / 1000000000 || 5; service.RestartWindow = service.RestartWindow / 1000000000 || 0; - service.UpdateDelay = service.UpdateDelay / 1000000000 || 0; + service.UpdateDelay = ServiceHelper.translateNanosToHumanDuration(service.UpdateDelay) || '0s'; } function initView() { diff --git a/app/helpers/serviceHelper.js b/app/helpers/serviceHelper.js index 00d063278..0903166d4 100644 --- a/app/helpers/serviceHelper.js +++ b/app/helpers/serviceHelper.js @@ -141,5 +141,55 @@ angular.module('portainer.helpers').factory('ServiceHelper', [function ServiceHe } }; + helper.translateHumanDurationToNanos = function(humanDuration) { + var nanos = 0; + var regex = /^([0-9]+)(h|m|s|ms|us|ns)$/i; + var matches = humanDuration.match(regex); + + if (matches !== null && matches.length === 3) { + var duration = parseInt(matches[1], 10); + var unit = matches[2]; + // Moment.js cannot use micro or nanoseconds + switch (unit) { + case 'ns': + nanos = duration; + break; + case 'us': + nanos = duration * 1000; + break; + default: + nanos = moment.duration(duration, unit).asMilliseconds() * 1000000; + } + } + return nanos; + }; + + // Convert nanoseconds to the higher unit possible + // e.g 1840 nanoseconds = 1804ns + // e.g 300000000000 nanoseconds = 5m + // e.g 3510000000000 nanoseconds = 3510s + // e.g 3540000000000 nanoseconds = 59m + // e.g 3600000000000 nanoseconds = 1h + + helper.translateNanosToHumanDuration = function(nanos) { + var humanDuration = '0s'; + + var conversionFromNano = {}; + conversionFromNano['ns'] = 1; + conversionFromNano['us'] = conversionFromNano['ns'] * 1000; + conversionFromNano['ms'] = conversionFromNano['us'] * 1000; + conversionFromNano['s'] = conversionFromNano['ms'] * 1000; + conversionFromNano['m'] = conversionFromNano['s'] * 60; + conversionFromNano['h'] = conversionFromNano['m'] * 60; + + Object.keys(conversionFromNano).forEach(function(unit) { + if ( nanos % conversionFromNano[unit] === 0 && (nanos / conversionFromNano[unit]) > 0) { + humanDuration = (nanos / conversionFromNano[unit]) + unit; + } + }); + + return humanDuration; + }; + return helper; }]);