From fe86a93482ca3d90b1a19112827bd98eb71ea4e1 Mon Sep 17 00:00:00 2001 From: Mykola Grygoriev Date: Tue, 14 Jul 2020 12:22:51 -0400 Subject: [PATCH] Add a new `date_time` fact to provide DST timezone PR #70449 --- .../70449-facts-add-dst-timezone.yml | 2 + .../module_utils/facts/system/date_time.py | 1 + .../module_utils/facts/tests_date_time.py | 61 +++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 changelogs/fragments/70449-facts-add-dst-timezone.yml create mode 100644 test/units/module_utils/facts/tests_date_time.py diff --git a/changelogs/fragments/70449-facts-add-dst-timezone.yml b/changelogs/fragments/70449-facts-add-dst-timezone.yml new file mode 100644 index 00000000000..3f9aaa842d3 --- /dev/null +++ b/changelogs/fragments/70449-facts-add-dst-timezone.yml @@ -0,0 +1,2 @@ +minor_changes: + - facts - add new fact ``date_time['tz_dst']``, which returns the daylight saving timezone (https://github.com/ansible/ansible/issues/69004). diff --git a/lib/ansible/module_utils/facts/system/date_time.py b/lib/ansible/module_utils/facts/system/date_time.py index f4e59705ef8..baa4c946abc 100644 --- a/lib/ansible/module_utils/facts/system/date_time.py +++ b/lib/ansible/module_utils/facts/system/date_time.py @@ -53,6 +53,7 @@ class DateTimeFactCollector(BaseFactCollector): date_time_facts['iso8601_basic'] = now.strftime("%Y%m%dT%H%M%S%f") date_time_facts['iso8601_basic_short'] = now.strftime("%Y%m%dT%H%M%S") date_time_facts['tz'] = time.strftime("%Z") + date_time_facts['tz_dst'] = time.tzname[1] date_time_facts['tz_offset'] = time.strftime("%z") facts_dict['date_time'] = date_time_facts diff --git a/test/units/module_utils/facts/tests_date_time.py b/test/units/module_utils/facts/tests_date_time.py new file mode 100644 index 00000000000..e64c6f8d18a --- /dev/null +++ b/test/units/module_utils/facts/tests_date_time.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2020 Ansible Project +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function +__metaclass__ = type + +import pytest +import datetime + +from ansible.module_utils.facts.system.date_time import DateTimeFactCollector + +TIMESTAMP = datetime.datetime(2020, 7, 11, 12, 34, 56, 124356) + + +@pytest.fixture +def fake_now(monkeypatch): + """Patch `datetime.datetime.now()` to return a deterministic value.""" + class FakeNow: + @classmethod + def now(cls): + return TIMESTAMP + + monkeypatch.setattr(datetime, 'datetime', FakeNow) + + +@pytest.fixture +def date_facts(monkeypatch, fake_now): + """Return a predictable instance of collected date_time facts.""" + monkeypatch.setenv('TZ', 'Australia/Melbourne') + + collector = DateTimeFactCollector() + data = collector.collect() + + return data + + +@pytest.mark.parametrize( + ('fact_name', 'fact_value'), + ( + ('year', '2020'), + ('month', '07'), + ('weekday', 'Saturday'), + ('weekday_number', '6'), + ('weeknumber', '27'), + ('day', '11'), + ('hour', '12'), + ('minute', '34'), + ('second', '56'), + ('epoch', '1594434896'), + ('date', '2020-07-11'), + ('time', '12:34:56'), + ('iso8601_basic', '20200711T123456124356'), + ('iso8601_basic_short', '20200711T123456'), + ('tz', 'AEST'), + ('tz_dst', 'AEDT'), + ('tz_offset', '+1000') + ), +) +def test_date_time_facts(date_facts, fact_name, fact_value): + assert date_facts['date_time'][fact_name] == fact_value