]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
pybing/mgr/snap_schedule: normalize dates to utc and ignore microseconds
authorJan Fajerski <jfajerski@suse.com>
Wed, 12 Aug 2020 09:17:15 +0000 (11:17 +0200)
committerJan Fajerski <jfajerski@suse.com>
Thu, 27 Aug 2020 13:55:46 +0000 (15:55 +0200)
Signed-off-by: Jan Fajerski <jfajerski@suse.com>
src/pybind/mgr/snap_schedule/fs/schedule.py
src/pybind/mgr/snap_schedule/tests/fs/test_schedule.py
src/pybind/mgr/snap_schedule/tox.ini

index d22ae6a27e39c7ebb683d9447c8bd8a5d23419c2..cee7a3c763d9cfcf9124f8c54707ee1d87879f1b 100644 (file)
@@ -25,13 +25,13 @@ except ImportError:
 try:
     # have mypy ignore this line. We use the attribute error to detect if we
     # have fromisoformat or not
-    parse_timestamp = datetime.fromisoformat  # type: ignore
+    ts_parser = datetime.fromisoformat  # type: ignore
     log.debug('found datetime.fromisoformat')
 except AttributeError:
     log.info(('Couldn\'t find datetime.fromisoformat, falling back to '
               f'static timestamp parsing ({SNAP_DB_TS_FORMAT}'))
 
-    def parse_timestamp(ts):
+    def ts_parser(ts):
         try:
             date = datetime.strptime(ts, SNAP_DB_TS_FORMAT)
             return date
@@ -44,6 +44,16 @@ except AttributeError:
             raise ValueError(msg)
 
 
+def parse_timestamp(ts):
+    date = ts_parser(ts)
+    # normalize any non utc timezone to utc. If no tzinfo is supplied, assume
+    # its already utc
+    # import pdb; pdb.set_trace()
+    if date.tzinfo is not timezone.utc and date.tzinfo is not None:
+        date = date.astimezone(timezone.utc)
+    return date
+
+
 def parse_retention(retention):
     ret = {}
     log.debug(f'parse_retention({retention})')
@@ -101,7 +111,7 @@ class Schedule(object):
                                   now.day,
                                   tzinfo=now.tzinfo)
         else:
-            self.start = parse_timestamp(start).astimezone(timezone.utc)
+            self.start = parse_timestamp(start)
         if created is None:
             self.created = datetime.now(timezone.utc)
         else:
@@ -246,8 +256,8 @@ class Schedule(object):
                 pass
             db.execute(self.INSERT_SCHEDULE_META,
                        (sched_id,
-                        self.start.isoformat(),
-                        self.created.isoformat(),
+                        self.start.strftime(SNAP_DB_TS_FORMAT),
+                        self.created.strftime(SNAP_DB_TS_FORMAT),
                         self.repeat,
                         self.schedule,
                         1))
@@ -337,7 +347,8 @@ class Schedule(object):
         return self.report_json()
 
     def report_json(self):
-        return json.dumps(dict(self.__dict__), default=lambda o: o.isoformat())
+        return json.dumps(dict(self.__dict__),
+                          default=lambda o: o.strftime(SNAP_DB_TS_FORMAT))
 
     @property
     def repeat(self):
@@ -369,10 +380,10 @@ class Schedule(object):
 
     def update_last(self, time, db):
         with db:
-            db.execute(self.UPDATE_LAST, (time.isoformat(),
-                                          time.isoformat(),
+            db.execute(self.UPDATE_LAST, (time.strftime(SNAP_DB_TS_FORMAT),
+                                          time.strftime(SNAP_DB_TS_FORMAT),
                                           self.path,
-                                          self.start.isoformat(),
+                                          self.start.strftime(SNAP_DB_TS_FORMAT),
                                           self.repeat))
         self.created_count += 1
         self.last = time
@@ -394,7 +405,7 @@ class Schedule(object):
         with db:
             log.debug(f'Deactivating schedule ({self.repeat}, {self.start}) on path {self.path}')
             db.execute(self.UPDATE_INACTIVE, (self.path,
-                                              self.start.isoformat(),
+                                              self.start.strftime(SNAP_DB_TS_FORMAT),
                                               self.repeat))
         self.active = False
 
@@ -413,7 +424,7 @@ class Schedule(object):
         with db:
             log.debug(f'Activating schedule ({self.repeat}, {self.start}) on path {self.path}')
             db.execute(self.UPDATE_ACTIVE, (self.path,
-                                            self.start.isoformat(),
+                                            self.start.strftime(SNAP_DB_TS_FORMAT),
                                             self.repeat))
         self.active = True
 
@@ -431,9 +442,9 @@ class Schedule(object):
 
     def update_pruned(self, time, db, pruned):
         with db:
-            db.execute(self.UPDATE_PRUNED, (time.isoformat(), pruned,
+            db.execute(self.UPDATE_PRUNED, (time.strftime(SNAP_DB_TS_FORMAT), pruned,
                                             self.path,
-                                            self.start.isoformat(),
+                                            self.start.strftime(SNAP_DB_TS_FORMAT),
                                             self.repeat))
         self.pruned_count += pruned
         self.last_pruned = time
index 0461892f234a5b90b747d8196d976c970e80b208..1e984ab64ba53a7015dbd1d9c45ed434ba5bc225 100644 (file)
@@ -20,9 +20,29 @@ def assert_updated(new, old, update_expected={}):
 
     for var in vars(new):
         if var in update_expected:
-            assert getattr(new, var) == update_expected.get(var), f'new did not update value for {var}'
+            expected_val = update_expected.get(var)
+            new_val = getattr(new, var)
+            if isinstance(expected_val, datetime.datetime):
+                assert new_val.year == expected_val.year
+                assert new_val.month == expected_val.month
+                assert new_val.day == expected_val.day
+                assert new_val.hour == expected_val.hour
+                assert new_val.minute == expected_val.minute
+                assert new_val.second == expected_val.second
+            else:
+                assert new_val == expected_val, f'new did not update value for {var}'
         else:
-            assert getattr(new, var) == getattr(old, var), f'new changed unexpectedly in value for {var}'
+            expected_val = getattr(old, var)
+            new_val = getattr(new, var)
+            if isinstance(expected_val, datetime.datetime):
+                assert new_val.year == expected_val.year
+                assert new_val.month == expected_val.month
+                assert new_val.day == expected_val.day
+                assert new_val.hour == expected_val.hour
+                assert new_val.minute == expected_val.minute
+                assert new_val.second == expected_val.second
+            else:
+                assert new_val == expected_val, f'new changed unexpectedly in value for {var}'
 
 
 class TestSchedule(object):
index 1fde27980f84b5320c5d506a84a87cf34900370d..756dc044bdcd899b29026c43386f27e3cabb519a 100644 (file)
@@ -1,5 +1,5 @@
 [tox]
-envlist = py3
+envlist = py36, py3
 skipsdist = true
 ; toxworkdir = {env:CEPH_BUILD_DIR}/snap-schedule
 ; minversion = 2.8.1