From: Sebastian Wagner Date: Sat, 29 Aug 2020 20:30:29 +0000 (+0200) Subject: mgr/cephadm: Refactor (to,from) datetime X-Git-Tag: v15.2.9~122^2~44^2~8 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2151a66aed9eafdf1d9829fa5f8c519fc40d9a36;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 (cherry picked from commit d65092f0fa616e623993a422176fb51ecf1245bf) --- diff --git a/src/pybind/mgr/cephadm/inventory.py b/src/pybind/mgr/cephadm/inventory.py index 5040f17d9ca..30b2f5ea225 100644 --- a/src/pybind/mgr/cephadm/inventory.py +++ b/src/pybind/mgr/cephadm/inventory.py @@ -9,6 +9,7 @@ import six 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: @@ -19,7 +20,6 @@ logger = logging.getLogger(__name__) HOST_CACHE_PREFIX = "host." SPEC_STORE_PREFIX = "spec." -DATEFMT = '%Y-%m-%dT%H:%M:%S.%f' class Inventory: @@ -118,7 +118,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' % ( @@ -139,7 +139,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') @@ -199,8 +199,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 @@ -222,15 +221,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', {}) @@ -305,11 +302,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]: @@ -318,16 +313,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 91efbfa0f6a..42ee122bda0 100644 --- a/src/pybind/mgr/cephadm/module.py +++ b/src/pybind/mgr/cephadm/module.py @@ -49,7 +49,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 @@ -85,7 +85,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) @@ -1459,7 +1458,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 @@ -1551,7 +1550,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 b173bbcd74d..43238431965 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): @@ -610,7 +609,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 @@ -621,7 +620,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 @@ -632,7 +631,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}) if 'nodename' in inp: hostname = inp.pop('nodename') diff --git a/src/pybind/mgr/cephadm/tests/test_migration.py b/src/pybind/mgr/cephadm/tests/test_migration.py index 08e0abd5a61..ac2011f1b3a 100644 --- a/src/pybind/mgr/cephadm/tests/test_migration.py +++ b/src/pybind/mgr/cephadm/tests/test_migration.py @@ -5,7 +5,8 @@ import pytest 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 orchestrator import OrchestratorError from tests import mock diff --git a/src/pybind/mgr/cephadm/utils.py b/src/pybind/mgr/cephadm/utils.py index 4d2cffbe6e3..4c3d595010f 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)