]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/orchestrator_cli: 'ceph device {fault,ident}-{on,off}', 'ceph device ls-lights'
authorSage Weil <sage@redhat.com>
Wed, 27 Feb 2019 21:00:21 +0000 (15:00 -0600)
committerSebastian Wagner <sebastian.wagner@suse.com>
Tue, 5 Nov 2019 12:02:29 +0000 (13:02 +0100)
Add generic CLI commands to turn device lights on and off.

These will call out to orchestrator stubs, once it has the appropriate hook
implemented, which will in turn call out to salt or rook or ssh or whatever
to actually turn a light on or off.

Signed-off-by: Sage Weil <sage@redhat.com>
src/pybind/mgr/orchestrator_cli/module.py

index d4c58bcb75dd5d4a68122463e020c4cfe57c4361..b7fe15c0aec7ab2f9e8296d2619f4ea37b6141c6 100644 (file)
@@ -46,6 +46,121 @@ class OrchestratorCli(orchestrator.OrchestratorClientMixin, MgrModule):
         {'name': 'orchestrator'}
     ]
 
+    def __init__(self, *args, **kwargs):
+        super(OrchestratorCli, self).__init__(*args, **kwargs)
+        self.ident = set([])
+        self.fault = set([])
+        self.devs = {}
+        self._load()
+        self._refresh_health()
+
+    def _load(self):
+        active = self.get_store('active_devices')
+        if active:
+            decoded = json.loads(active)
+            self.ident = set(decoded.get('ident', []))
+            self.fault = set(decoded.get('fault', []))
+        self.log.debug('ident %s, fault %s' % (self.ident, self.fault))
+
+    def _save(self):
+        encoded = json.dumps({
+            'ident': list(self.ident),
+            'fault': list(self.fault),
+            })
+        self.set_store('active_devices', encoded)
+
+    def _refresh_health(self):
+        h = {}
+        if self.ident:
+            h['DEVICE_IDENT_ON'] = {
+                'severity': 'warning',
+                'summary': '%d devices have ident light turned on' % len(
+                    self.ident),
+                'detail': ['%s ident light enabled' % d for d in self.ident]
+            }
+        if self.fault:
+            h['DEVICE_FAULT_ON'] = {
+                'severity': 'warning',
+                'summary': '%d devices have fault light turned on' % len(
+                    self.fault),
+                'detail': ['%s fault light enabled' % d for d in self.fault]
+            }
+        self.set_health_checks(h)
+
+    def _get_devices(self):
+        d = self.get('devices')
+        dm = {}
+        for i in d['devices']:
+            dm[i['devid']] = i['location']
+        return dm
+
+    @CLIReadCommand(prefix='device ls-lights',
+                    desc='List currently active device indicator lights')
+    def _command_ls(self):
+        return HandleCommandResult(
+            stdout=json.dumps({
+                'ident': list(self.ident),
+                'fault': list(self.fault)
+                }, indent=4))
+
+    @CLIWriteCommand(prefix='device fault-light-on',
+                     args='name=devid,type=CephString',
+                     desc='Enable device *fault* light')
+    def _command_fault_on(self, devid):
+        self.log.debug('fault-on %s' % devid)
+        devs = self._get_devices()
+        if devid not in devs:
+            return HandleCommandResult(stderr='device %s not found' % devid,
+                                       retval=-errno.ENOENT)
+        self.fault.add(devid)
+        self._save()
+        self._refresh_health()
+        #self.remote('orchestrator', '_device_fault_on', devs[devid])
+        return HandleCommandResult(stdout='')
+
+    @CLIWriteCommand(prefix='device ident-light-on',
+                     args='name=devid,type=CephString',
+                     desc='Enable device *ident* light')
+    def _command_ident_on(self, devid):
+        self.log.debug('ident-on %s' % devid)
+        devs = self._get_devices()
+        if devid not in devs:
+            return HandleCommandResult(stderr='device %s not found' % devid,
+                                       retval=-errno.ENOENT)
+        self.ident.add(devid)
+        self._save()
+        self._refresh_health()
+        #self.remote('orchestrator', '_device_ident_on', devs[devid])
+        return HandleCommandResult(stdout='')
+
+    @CLIWriteCommand(prefix='device fault-light-off',
+                     args='name=devid,type=CephString name=force,type=CephBool,req=false',
+                     desc='Disable device *fault* light')
+    def _command_fault_off(self, devid, force=False):
+        self.log.debug('fault-off %s' % devid)
+        devs = self._get_devices()
+#        if devid in devs:
+#            self.remote('orchestrator', '_device_fault_off', devs[devid])
+        if devid in self.fault:
+            self.fault.remove(devid)
+            self._save()
+            self._refresh_health()
+        return HandleCommandResult(stdout='')
+
+    @CLIWriteCommand(prefix='device ident-light-off',
+                     args='name=devid,type=CephString name=force,type=CephBool,req=false',
+                     desc='Disable device *ident* light')
+    def _command_ident_off(self, devid, force=False):
+        self.log.debug('ident-off %s' % devid)
+        devs = self._get_devices()
+#        if devid in devs:
+#            self.remote('orchestrator', '_device_ident_off', devs[devid])
+        if devid in self.ident:
+            self.ident.remove(devid)
+            self._save()
+            self._refresh_health()
+        return HandleCommandResult(stdout='')
+
     def _select_orchestrator(self):
         return self.get_module_option("orchestrator")