default_sleep_interval = 60   # seconds
 default_max_misplaced = .03   # max ratio of pgs replaced at a time
 
-TIME_FORMAT = '%Y-%m-%d %H:%M:%S %Z'
+TIME_FORMAT = '%Y-%m-%d_%H:%M:%S'
 
 
 class MappingState:
                                                    default_sleep_interval))
             if self.active:
                 self.log.debug('Running')
-                plan = self.plan_create('auto-foo')
-                self.optimize(plan)
-                #self.plan_apply(plan)
+                name = 'auto_%s' % time.strftime(TIME_FORMAT, time.gmtime())
+                plan = self.plan_create(name)
+                if self.optimize(plan):
+                    self.execute(plan)
+                self.plan_rm(name)
             self.log.debug('Sleeping for %d', sleep_interval)
             self.event.wait(sleep_interval)
             self.event.clear()
                           misplaced, max_misplaced)
         else:
             if plan.mode == 'upmap':
-                self.do_upmap(plan)
+                return self.do_upmap(plan)
             elif plan.mode == 'crush-compat':
-                self.do_crush_compat(plan)
+                return self.do_crush_compat(plan)
             elif plan.mode == 'none':
                 self.log.info('Idle')
             else:
                 self.log.info('Unrecognized mode %s' % plan.mode)
+        return False
 
         ##
 
         pools = [str(i['pool_name']) for i in ms.osdmap_dump.get('pools',[])]
         if len(pools) == 0:
             self.log.info('no pools, nothing to do')
-            return
+            return False
         # shuffle pool list so they all get equal (in)attention
         random.shuffle(pools)
         self.log.info('pools %s' % pools)
             if left <= 0:
                 break
         self.log.info('prepared %d/%d changes' % (total_did, max_iterations))
+        return True
 
     def do_crush_compat(self, plan):
         self.log.info('do_crush_compat')
         if len(overlap) > 0:
             self.log.err('error: some osds belong to multiple subtrees: %s' %
                          overlap)
-            return
+            return False
 
         key = 'pgs'  # pgs objects or bytes
 
                 self.log.debug('Reweight osd.%d %f -> %f', osd, weight,
                                new_weight)
                 plan.compat_ws[osd] = new_weight
+        return True
 
     def compat_weight_set_reweight(self, osd, new_weight):
         self.log.debug('ceph osd crush weight-set reweight-compat')