]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/orchestrator: fix broken `device ls` 26094/head
authorSebastian Wagner <sebastian.wagner@suse.com>
Tue, 5 Feb 2019 11:05:10 +0000 (12:05 +0100)
committerSebastian Wagner <sebastian.wagner@suse.com>
Tue, 5 Feb 2019 14:23:35 +0000 (15:23 +0100)
* Added `InventoryDevice.from_ceph_volume_inventory`
* Improved documentation

Signed-off-by: Sebastian Wagner <sebastian.wagner@suse.com>
doc/mgr/orchestrator_modules.rst
src/pybind/mgr/ansible/module.py
src/pybind/mgr/orchestrator.py
src/pybind/mgr/orchestrator_cli/module.py
src/pybind/mgr/test_orchestrator/module.py

index 7789c0b4b1405d45bb48fbed7ad9a34298061821..c114a9bb7ead4562ef9642cd90159e8f9a18df09 100644 (file)
@@ -133,7 +133,9 @@ Inventory and status
 .. automethod:: Orchestrator.get_inventory
 .. autoclass:: InventoryFilter
 .. autoclass:: InventoryNode
+
 .. autoclass:: InventoryDevice
+   :members:
 
 .. automethod:: Orchestrator.describe_service
 .. autoclass:: ServiceDescription
index 919bff4e0fb5fb7a54302bd92c9b2542f8b397a2..0183d8389e12020e2d5e8b2417d4f35fdbc757bc 100644 (file)
@@ -424,19 +424,11 @@ def process_inventory_json(inventory_events, ar_client, playbook_uuid, logger):
             event_data = json.loads(event_response.text)["data"]["event_data"]
 
             host = event_data["host"]
-            devices =  json.loads(event_data["res"]["stdout"])
+            devices = json.loads(event_data["res"]["stdout"])
 
             devs = []
             for storage_device in devices:
-                dev = orchestrator.InventoryDevice()
-                dev.id = storage_device["path"]
-                dev.type = 'hdd' if storage_device["sys_api"]["rotational"] == "1" else 'sdd/nvme'
-                dev.size = storage_device["sys_api"]["human_readable_size"]
-                dev.rotates = storage_device["sys_api"]["rotational"] == "1"
-                dev.available = storage_device["available"]
-                dev.dev_id = "%s/%s" % (storage_device["sys_api"]["vendor"],
-                                        storage_device["sys_api"]["model"])
-
+                dev = orchestrator.InventoryDevice.from_ceph_volume_inventory(storage_device)
                 devs.append(dev)
 
             inventory_nodes.append(orchestrator.InventoryNode(host, devs))
index 9f90d907eeb4a3f7a539cc3d1649ef5dfc18593d..9b3daabb3b4d4732e4c720866a08abe38278f996 100644 (file)
@@ -6,6 +6,8 @@ Please see the ceph-mgr module developer's guide for more information.
 """
 import six
 
+from mgr_util import format_bytes
+
 try:
     from typing import TypeVar, Generic, List, Optional, Union, Tuple
     T = TypeVar('T')
@@ -694,26 +696,59 @@ class InventoryDevice(object):
     is permitted to support no extended properties (only normal block
     devices)
     """
-    def __init__(self):
-        self.blank = False
-        self.type = None  # 'ssd', 'hdd', 'nvme'
-        self.id = None  # unique within a node (or globally if you like).
-        self.size = None  # byte integer.
-        self.rotates = False # indicates if it is a spinning disk
-        self.available = False # can be used to create a new OSD?
-        self.dev_id = None  # vendor/model
-        self.extended = {}  # arbitrary JSON-serializable object
+    def __init__(self, blank=False, type=None, id=None, size=None,
+                 rotates=False, available=False, dev_id=None, extended=None,
+                 metadata_space_free=None):
+        # type: (bool, str, str, int, bool, bool. str, dict, bool) -> None
+
+        self.blank = blank
+
+        #: 'ssd', 'hdd', 'nvme'
+        self.type = type
+
+        #: unique within a node (or globally if you like).
+        self.id = id
+
+        #: byte integer.
+        self.size = size
+
+        #: indicates if it is a spinning disk
+        self.rotates = rotates
+
+        #: can be used to create a new OSD?
+        self.available = available
+
+        #: vendor/model
+        self.dev_id = dev_id
+
+        #: arbitrary JSON-serializable object
+        self.extended = extended if extended is not None else extended
 
         # If this drive is not empty, but is suitable for appending
         # additional journals, wals, or bluestore dbs, then report
         # how much space is available.
-        self.metadata_space_free = None
+        self.metadata_space_free = metadata_space_free
 
     def to_json(self):
         return dict(type=self.type, blank=self.blank, id=self.id,
                     size=self.size, rotates=self.rotates,
                     available=self.available, dev_id=self.dev_id,
-                    **self.extended)
+                    extended=self.extended)
+
+    @classmethod
+    def from_ceph_volume_inventory(cls, data):
+        # TODO: change InventoryDevice itself to mirror c-v inventory closely!
+
+        dev = InventoryDevice()
+        dev.id = data["path"]
+        dev.type = 'hdd' if data["sys_api"]["rotational"] == "1" else 'sdd/nvme'
+        dev.size = data["sys_api"]["size"]
+        dev.rotates = data["sys_api"]["rotational"] == "1"
+        dev.available = data["available"]
+        dev.dev_id = "%s/%s" % (data["sys_api"]["vendor"],
+                                data["sys_api"]["model"])
+        dev.extended = data
+        return dev
 
     def pretty_print(self, only_header=False):
         """Print a human friendly line with the information of the device
@@ -730,7 +765,7 @@ class InventoryDevice(object):
             return row_format.format("Device Path", "Type", "Size", "Rotates",
                                      "Available", "Model")
         else:
-            return row_format.format(self.id, self.type, self.size,
+            return row_format.format(self.id, self.type, format_bytes(self.size, 5, colored=False),
                                      str(self.rotates), str(self.available),
                                      self.dev_id)
 
index 94eb267000abfac90ff14acf5099759ce4f2dcff..211b6c957ac3711cca76e62ac72fde185ccd9799 100644 (file)
@@ -2,12 +2,11 @@ import errno
 import json
 
 try:
-    from typing import Dict
+    from typing import Dict, List
 except ImportError:
     pass  # just for type checking.
 
 from functools import wraps
-from typing import List
 
 from mgr_module import MgrModule, HandleCommandResult, CLIWriteCommand, CLIReadCommand
 
index bfc6cf9f3857aa99fc90e9bc4d1ff7b6eb1dd3d6..de0a819eab953c276f4da134136174e98dfa5c29 100644 (file)
@@ -223,16 +223,7 @@ class TestOrchestrator(MgrModule, orchestrator.Orchestrator):
                 self.log.error(out)
                 devs = []
                 for device in json.loads(out):
-                    dev = orchestrator.InventoryDevice()
-                    if device["sys_api"]["rotational"] == "1":
-                        dev.type = 'hdd'  # 'ssd', 'hdd', 'nvme'
-                    elif 'nvme' in device["path"]:
-                        dev.type = 'nvme'
-                    else:
-                        dev.type = 'ssd'
-                    dev.size = device['sys_api']['size']
-                    dev.id = device['path']
-                    dev.extended = device
+                    dev = orchestrator.InventoryDevice.from_ceph_volume_inventory(device)
                     devs.append(dev)
                 return [orchestrator.InventoryNode('localhost', devs)]
         self.log.error('c-v failed: ' + str(c_v_out))