From: Jan Fajerski Date: Wed, 12 Aug 2020 09:17:15 +0000 (+0200) Subject: pybing/mgr/snap_schedule: normalize dates to utc and ignore microseconds X-Git-Tag: v16.1.0~1299^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4823e657f59dc852fbe2d3fb1adb68a9559e45dd;p=ceph.git pybing/mgr/snap_schedule: normalize dates to utc and ignore microseconds Signed-off-by: Jan Fajerski --- diff --git a/src/pybind/mgr/snap_schedule/fs/schedule.py b/src/pybind/mgr/snap_schedule/fs/schedule.py index d22ae6a27e39..cee7a3c763d9 100644 --- a/src/pybind/mgr/snap_schedule/fs/schedule.py +++ b/src/pybind/mgr/snap_schedule/fs/schedule.py @@ -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 diff --git a/src/pybind/mgr/snap_schedule/tests/fs/test_schedule.py b/src/pybind/mgr/snap_schedule/tests/fs/test_schedule.py index 0461892f234a..1e984ab64ba5 100644 --- a/src/pybind/mgr/snap_schedule/tests/fs/test_schedule.py +++ b/src/pybind/mgr/snap_schedule/tests/fs/test_schedule.py @@ -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): diff --git a/src/pybind/mgr/snap_schedule/tox.ini b/src/pybind/mgr/snap_schedule/tox.ini index 1fde27980f84..756dc044bdcd 100644 --- a/src/pybind/mgr/snap_schedule/tox.ini +++ b/src/pybind/mgr/snap_schedule/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py3 +envlist = py36, py3 skipsdist = true ; toxworkdir = {env:CEPH_BUILD_DIR}/snap-schedule ; minversion = 2.8.1