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 @@
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;
}]);