From 38c664b4b9d300af9348c2a9877414c086936de6 Mon Sep 17 00:00:00 2001 From: Sebastian Wagner Date: Tue, 5 Feb 2019 12:05:10 +0100 Subject: [PATCH] mgr/orchestrator: fix broken `device ls` * Added `InventoryDevice.from_ceph_volume_inventory` * Improved documentation Signed-off-by: Sebastian Wagner --- doc/mgr/orchestrator_modules.rst | 2 + src/pybind/mgr/ansible/module.py | 12 +---- src/pybind/mgr/orchestrator.py | 59 +++++++++++++++++----- src/pybind/mgr/orchestrator_cli/module.py | 3 +- src/pybind/mgr/test_orchestrator/module.py | 11 +--- 5 files changed, 53 insertions(+), 34 deletions(-) diff --git a/doc/mgr/orchestrator_modules.rst b/doc/mgr/orchestrator_modules.rst index 7789c0b4b14..c114a9bb7ea 100644 --- a/doc/mgr/orchestrator_modules.rst +++ b/doc/mgr/orchestrator_modules.rst @@ -133,7 +133,9 @@ Inventory and status .. automethod:: Orchestrator.get_inventory .. autoclass:: InventoryFilter .. autoclass:: InventoryNode + .. autoclass:: InventoryDevice + :members: .. automethod:: Orchestrator.describe_service .. autoclass:: ServiceDescription diff --git a/src/pybind/mgr/ansible/module.py b/src/pybind/mgr/ansible/module.py index 919bff4e0fb..0183d8389e1 100644 --- a/src/pybind/mgr/ansible/module.py +++ b/src/pybind/mgr/ansible/module.py @@ -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)) diff --git a/src/pybind/mgr/orchestrator.py b/src/pybind/mgr/orchestrator.py index 9f90d907eeb..9b3daabb3b4 100644 --- a/src/pybind/mgr/orchestrator.py +++ b/src/pybind/mgr/orchestrator.py @@ -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) diff --git a/src/pybind/mgr/orchestrator_cli/module.py b/src/pybind/mgr/orchestrator_cli/module.py index 94eb267000a..211b6c957ac 100644 --- a/src/pybind/mgr/orchestrator_cli/module.py +++ b/src/pybind/mgr/orchestrator_cli/module.py @@ -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 diff --git a/src/pybind/mgr/test_orchestrator/module.py b/src/pybind/mgr/test_orchestrator/module.py index bfc6cf9f385..de0a819eab9 100644 --- a/src/pybind/mgr/test_orchestrator/module.py +++ b/src/pybind/mgr/test_orchestrator/module.py @@ -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)) -- 2.47.3