From: Sebastian Wagner Date: Sat, 29 Aug 2020 20:30:29 +0000 (+0200) Subject: mgr/cephadm: Refactor (to,from) datetime X-Git-Tag: v16.1.0~1059^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d65092f0fa616e623993a422176fb51ecf1245bf;p=ceph.git mgr/cephadm: Refactor (to,from) datetime `datetime.datetime.strptime(input, DATEFMT)` just looks too ugly to have it everywhere. Signed-off-by: Sebastian Wagner --- diff --git a/src/pybind/mgr/cephadm/inventory.py b/src/pybind/mgr/cephadm/inventory.py index 6d6247e835f6..01869f506de6 100644 --- a/src/pybind/mgr/cephadm/inventory.py +++ b/src/pybind/mgr/cephadm/inventory.py @@ -7,6 +7,7 @@ from typing import TYPE_CHECKING, Dict, List, Iterator, Optional, Any, Tuple, Se import orchestrator from ceph.deployment import inventory from ceph.deployment.service_spec import ServiceSpec +from cephadm.utils import str_to_datetime, datetime_to_str from orchestrator import OrchestratorError, HostSpec, OrchestratorEvent if TYPE_CHECKING: @@ -17,7 +18,6 @@ logger = logging.getLogger(__name__) HOST_CACHE_PREFIX = "host." SPEC_STORE_PREFIX = "spec." -DATEFMT = '%Y-%m-%dT%H:%M:%S.%f' class Inventory: @@ -116,7 +116,7 @@ class SpecStore(): try: v = json.loads(v) spec = ServiceSpec.from_json(v['spec']) - created = datetime.datetime.strptime(v['created'], DATEFMT) + created = str_to_datetime(v['created']) self.specs[service_name] = spec self.spec_created[service_name] = created self.mgr.log.debug('SpecStore: loaded spec for %s' % ( @@ -137,7 +137,7 @@ class SpecStore(): SPEC_STORE_PREFIX + spec.service_name(), json.dumps({ 'spec': spec.to_json(), - 'created': self.spec_created[spec.service_name()].strftime(DATEFMT), + 'created': datetime_to_str(self.spec_created[spec.service_name()]), }, sort_keys=True), ) self.mgr.events.for_service(spec, OrchestratorEvent.INFO, 'service was created') @@ -197,8 +197,7 @@ class HostCache(): try: j = json.loads(v) if 'last_device_update' in j: - self.last_device_update[host] = datetime.datetime.strptime( - j['last_device_update'], DATEFMT) + self.last_device_update[host] = str_to_datetime(j['last_device_update']) else: self.device_refresh_queue.append(host) # for services, we ignore the persisted last_*_update @@ -220,15 +219,13 @@ class HostCache(): for name, d in j.get('daemon_config_deps', {}).items(): self.daemon_config_deps[host][name] = { 'deps': d.get('deps', []), - 'last_config': datetime.datetime.strptime( - d['last_config'], DATEFMT), + 'last_config': str_to_datetime(d['last_config']), } if 'last_host_check' in j: - self.last_host_check[host] = datetime.datetime.strptime( - j['last_host_check'], DATEFMT) + self.last_host_check[host] = str_to_datetime(j['last_host_check']) if 'last_etc_ceph_ceph_conf' in j: - self.last_etc_ceph_ceph_conf[host] = datetime.datetime.strptime( - j['last_etc_ceph_ceph_conf'], DATEFMT) + self.last_etc_ceph_ceph_conf[host] = str_to_datetime( + j['last_etc_ceph_ceph_conf']) self.registry_login_queue.add(host) self.scheduled_daemon_actions[host] = j.get('scheduled_daemon_actions', {}) @@ -303,11 +300,9 @@ class HostCache(): 'daemon_config_deps': {}, } if host in self.last_daemon_update: - j['last_daemon_update'] = self.last_daemon_update[host].strftime( - DATEFMT) + j['last_daemon_update'] = datetime_to_str(self.last_daemon_update[host]) if host in self.last_device_update: - j['last_device_update'] = self.last_device_update[host].strftime( - DATEFMT) + j['last_device_update'] = datetime_to_str(self.last_device_update[host]) for name, dd in self.daemons[host].items(): j['daemons'][name] = dd.to_json() for d in self.devices[host]: @@ -316,16 +311,16 @@ class HostCache(): for name, depi in self.daemon_config_deps[host].items(): j['daemon_config_deps'][name] = { 'deps': depi.get('deps', []), - 'last_config': depi['last_config'].strftime(DATEFMT), + 'last_config': datetime_to_str(depi['last_config']), } if self.osdspec_previews[host]: j['osdspec_previews'] = self.osdspec_previews[host] if host in self.last_host_check: - j['last_host_check'] = self.last_host_check[host].strftime(DATEFMT) + j['last_host_check'] = datetime_to_str(self.last_host_check[host]) if host in self.last_etc_ceph_ceph_conf: - j['last_etc_ceph_ceph_conf'] = self.last_etc_ceph_ceph_conf[host].strftime(DATEFMT) + j['last_etc_ceph_ceph_conf'] = datetime_to_str(self.last_etc_ceph_ceph_conf[host]) if self.scheduled_daemon_actions.get(host, {}): j['scheduled_daemon_actions'] = self.scheduled_daemon_actions[host] diff --git a/src/pybind/mgr/cephadm/module.py b/src/pybind/mgr/cephadm/module.py index 14d74a2ea5f1..8ed7bceccff5 100644 --- a/src/pybind/mgr/cephadm/module.py +++ b/src/pybind/mgr/cephadm/module.py @@ -46,7 +46,7 @@ from .schedule import HostAssignment, HostPlacementSpec from .inventory import Inventory, SpecStore, HostCache, EventStore from .upgrade import CEPH_UPGRADE_ORDER, CephadmUpgrade from .template import TemplateMgr -from .utils import forall_hosts, CephadmNoImage, cephadmNoImage, is_repo_digest +from .utils import forall_hosts, CephadmNoImage, cephadmNoImage, str_to_datetime, is_repo_digest try: import remoto @@ -82,7 +82,6 @@ Host * ConnectTimeout=30 """ -DATEFMT = '%Y-%m-%dT%H:%M:%S.%f' CEPH_DATEFMT = '%Y-%m-%dT%H:%M:%S.%fZ' CEPH_TYPES = set(CEPH_UPGRADE_ORDER) @@ -1426,7 +1425,7 @@ To check that the host is reachable: for k in ['created', 'started', 'last_configured', 'last_deployed']: v = d.get(k, None) if v: - setattr(sd, k, datetime.datetime.strptime(d[k], DATEFMT)) + setattr(sd, k, str_to_datetime(d[k])) sd.daemon_type = d['name'].split('.')[0] sd.daemon_id = '.'.join(d['name'].split('.')[1:]) sd.hostname = host @@ -1518,7 +1517,6 @@ To check that the host is reachable: }) return config - def _invalidate_daemons_and_kick_serve(self, filter_host=None): if filter_host: self.cache.invalidate_host_daemons(filter_host) diff --git a/src/pybind/mgr/cephadm/services/osd.py b/src/pybind/mgr/cephadm/services/osd.py index e93fddc798a8..0d94696ae576 100644 --- a/src/pybind/mgr/cephadm/services/osd.py +++ b/src/pybind/mgr/cephadm/services/osd.py @@ -8,14 +8,13 @@ from ceph.deployment.drive_selection import DriveSelection from datetime import datetime import orchestrator -from cephadm.utils import forall_hosts +from cephadm.utils import forall_hosts, datetime_to_str, str_to_datetime from orchestrator import OrchestratorError from mgr_module import MonCommandFailed from cephadm.services.cephadmservice import CephadmDaemonSpec, CephService logger = logging.getLogger(__name__) -DATEFMT = '%Y-%m-%dT%H:%M:%S.%f' class OSDService(CephService): @@ -603,7 +602,7 @@ class OSD: return 'n/a' if self.get_pg_count() < 0 else str(self.get_pg_count()) def to_json(self) -> dict: - out = dict() + out: Dict[str, Any] = dict() out['osd_id'] = self.osd_id out['started'] = self.started out['draining'] = self.draining @@ -614,7 +613,7 @@ class OSD: for k in ['drain_started_at', 'drain_stopped_at', 'drain_done_at', 'process_started_at']: if getattr(self, k): - out[k] = getattr(self, k).strftime(DATEFMT) + out[k] = datetime_to_str(getattr(self, k)) else: out[k] = getattr(self, k) return out @@ -625,7 +624,7 @@ class OSD: return None for date_field in ['drain_started_at', 'drain_stopped_at', 'drain_done_at', 'process_started_at']: if inp.get(date_field): - inp.update({date_field: datetime.strptime(inp.get(date_field, ''), DATEFMT)}) + inp.update({date_field: str_to_datetime(inp.get(date_field, ''))}) inp.update({'remove_util': ctx}) return cls(**inp) diff --git a/src/pybind/mgr/cephadm/tests/test_migration.py b/src/pybind/mgr/cephadm/tests/test_migration.py index b8951c9e29b6..13647c7ceeec 100644 --- a/src/pybind/mgr/cephadm/tests/test_migration.py +++ b/src/pybind/mgr/cephadm/tests/test_migration.py @@ -3,7 +3,8 @@ from datetime import datetime from ceph.deployment.service_spec import PlacementSpec, ServiceSpec, HostPlacementSpec from cephadm import CephadmOrchestrator -from cephadm.inventory import SPEC_STORE_PREFIX, DATEFMT +from cephadm.inventory import SPEC_STORE_PREFIX +from cephadm.utils import DATEFMT from cephadm.tests.fixtures import _run_cephadm, cephadm_module, wait, with_host from tests import mock diff --git a/src/pybind/mgr/cephadm/utils.py b/src/pybind/mgr/cephadm/utils.py index 4d2cffbe6e35..4c3d595010fd 100644 --- a/src/pybind/mgr/cephadm/utils.py +++ b/src/pybind/mgr/cephadm/utils.py @@ -1,6 +1,7 @@ import logging import re import json +import datetime from enum import Enum from functools import wraps from typing import Optional, Callable, TypeVar, List, NewType, TYPE_CHECKING @@ -14,6 +15,8 @@ logger = logging.getLogger(__name__) ConfEntity = NewType('ConfEntity', str) +DATEFMT = '%Y-%m-%dT%H:%M:%S.%f' + class CephadmNoImage(Enum): token = 1 @@ -86,3 +89,11 @@ def is_repo_digest(image_name: str) -> bool: repo digest are something like "ceph/ceph@sha256:blablabla" """ return '@' in image_name + + +def str_to_datetime(input: str) -> datetime.datetime: + return datetime.datetime.strptime(input, DATEFMT) + + +def datetime_to_str(dt: datetime.datetime) -> str: + return dt.strftime(DATEFMT)