From c6586707736fc4b8a0061b8d3f529562c3f933f2 Mon Sep 17 00:00:00 2001 From: Zane Bitter Date: Thu, 4 May 2017 11:41:55 -0400 Subject: [PATCH] Deal correctly with negative elapsed time Since we're comparing local time to database time, we need to correctly handle negative offsets to account for clock skew. The datetime.timedelta class always reports a positive number of seconds, but with a possibly negative number of *days*. Therefore, take the days into account. Change-Id: I4422e4cf41cb57cdc89548d01b0abc27cda914ef Closes-Bug: #1688327 (cherry picked from commit f3f05c9a3f6109ec1e102ac9677accb82eb6cc54) --- heat/engine/stack.py | 2 +- heat/tests/test_stack.py | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/heat/engine/stack.py b/heat/engine/stack.py index 9a58bcf66..b0e3b4a37 100644 --- a/heat/engine/stack.py +++ b/heat/engine/stack.py @@ -2099,7 +2099,7 @@ class Stack(collections.Mapping): start_time = timeutils.round_to_seconds(self.updated_time or self.created_time) nowish = timeutils.round_to_seconds(datetime.datetime.utcnow()) - return (nowish - start_time).seconds + return int((nowish - start_time).total_seconds()) def time_remaining(self): """Time left before stack times out.""" diff --git a/heat/tests/test_stack.py b/heat/tests/test_stack.py index 13cd050b5..b0f2cac8b 100644 --- a/heat/tests/test_stack.py +++ b/heat/tests/test_stack.py @@ -118,6 +118,16 @@ class StackTest(common.HeatTestCase): 10, 10, 0) self.assertEqual(600, self.stack.time_elapsed()) + @mock.patch.object(stack, 'datetime') + def test_time_elapsed_negative(self, mock_dt): + self.stack = stack.Stack(self.ctx, 'test_stack', self.tmpl) + # dummy create time 10:00:00 + self.stack.created_time = datetime.datetime(2015, 7, 27, 10, 0, 0) + # mock utcnow set to 09:59:50 (-10s offset) + mock_dt.datetime.utcnow.return_value = datetime.datetime(2015, 7, 27, + 9, 59, 50) + self.assertEqual(-10, self.stack.time_elapsed()) + @mock.patch.object(stack, 'datetime') def test_time_elapsed_ms(self, mock_dt): self.stack = stack.Stack(self.ctx, 'test_stack', self.tmpl)