From: Sage Weil Date: Wed, 4 Mar 2020 17:21:38 +0000 (-0600) Subject: mgr/cephadm: store timestamp with specs X-Git-Tag: v15.1.1~103^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0e260d299fb6efcce4bbc99034e9a7ee98d26403;p=ceph-ci.git mgr/cephadm: store timestamp with specs Signed-off-by: Sage Weil --- diff --git a/src/pybind/mgr/cephadm/module.py b/src/pybind/mgr/cephadm/module.py index 65e4fee527c..40c6ea38c3a 100644 --- a/src/pybind/mgr/cephadm/module.py +++ b/src/pybind/mgr/cephadm/module.py @@ -131,14 +131,18 @@ class SpecStore(): # type: (CephadmOrchestrator) -> None self.mgr = mgr self.specs = {} # type: Dict[str, orchestrator.ServiceSpec] + self.spec_created = {} # type: Dict[str, datetime.datetime] def load(self): # type: () -> None for k, v in six.iteritems(self.mgr.get_store_prefix(SPEC_STORE_PREFIX)): service_name = k[len(SPEC_STORE_PREFIX):] try: - spec = ServiceSpec.from_json(json.loads(v)) + v = json.loads(v) + spec = ServiceSpec.from_json(v['spec']) + created = datetime.datetime.strptime(v['created'], DATEFMT) self.specs[service_name] = spec + self.spec_created[service_name] = created self.mgr.log.debug('SpecStore: loaded spec for %s' % ( service_name)) except Exception as e: @@ -149,13 +153,20 @@ class SpecStore(): def save(self, spec): # type: (orchestrator.ServiceSpec) -> None self.specs[spec.service_name()] = spec - self.mgr.set_store(SPEC_STORE_PREFIX + spec.service_name(), - spec.to_json()) + self.spec_created[spec.service_name()] = datetime.datetime.utcnow() + self.mgr.set_store( + SPEC_STORE_PREFIX + spec.service_name(), + json.dumps({ + 'spec': spec.to_json(), + 'created': self.spec_created[spec.service_name()].strftime(DATEFMT), + }, sort_keys=True), + ) def rm(self, service_name): # type: (str) -> None if service_name in self.specs: del self.specs[service_name] + del self.spec_created[service_name] self.mgr.set_store(SPEC_STORE_PREFIX + service_name, None) def find(self, service_name): @@ -1687,6 +1698,7 @@ class CephadmOrchestrator(orchestrator.Orchestrator, MgrModule): ) if spec: sm[n].size = self._get_spec_size(spec) + sm[n].created = self.spec_store.spec_created[dd.service_name()] else: sm[n].size += 1 if dd.status == 1: diff --git a/src/pybind/mgr/orchestrator/_interface.py b/src/pybind/mgr/orchestrator/_interface.py index 9fa17db8a86..25627418aee 100644 --- a/src/pybind/mgr/orchestrator/_interface.py +++ b/src/pybind/mgr/orchestrator/_interface.py @@ -1609,8 +1609,11 @@ class ServiceSpec(object): return n def to_json(self): - return json.dumps(self, default=lambda o: o.__dict__, - sort_keys=True) + # type: () -> Dict[str, Any] + c = self.__dict__.copy() + if self.placement: + c['placement'] = self.placement.__dict__ + return c def __repr__(self): return "{}({!r})".format(self.__class__.__name__, self.__dict__)