]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/cephadm: store timestamp with specs
authorSage Weil <sage@redhat.com>
Wed, 4 Mar 2020 17:21:38 +0000 (11:21 -0600)
committerSage Weil <sage@redhat.com>
Thu, 5 Mar 2020 12:42:27 +0000 (06:42 -0600)
Signed-off-by: Sage Weil <sage@redhat.com>
src/pybind/mgr/cephadm/module.py
src/pybind/mgr/orchestrator/_interface.py

index 65e4fee527c339bdafa67782f92f2a8eba3854ef..40c6ea38c3ab31566d32f932d1ad87ba0c89c37b 100644 (file)
@@ -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:
index 9fa17db8a86eed9d3b6b1380fbd6beb04fd22242..25627418aeeab79aff39098f8400d1658f48f096 100644 (file)
@@ -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__)