def get_inventory(self, node_filter=None): """ There is no guarantee which devices are returned by get_inventory. """ try: c_v_out = check_output(['ceph_volume', 'inventory', '--format', 'json']) except OSError: cmd = """ . /tmp/ceph-volume-virtualenv/bin/activate ceph-volume inventory --format json """ c_v_out = check_output(cmd, shell=True) for out in c_v_out.splitlines(): if not out.startswith(b'-->') and not out.startswith(b' stderr'): 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 devs.append(dev) return [orchestrator.InventoryNode('localhost', devs)] self.log.error('c-v failed: ' + str(c_v_out)) raise Exception('c-v failed')
def process_inventory_json(inventory_events, ar_client, playbook_uuid): """ Adapt the output of the playbook used in 'get_inventory' to the Orchestrator expected output (list of InventoryNode) @param inventory_events: events dict with the results Example: inventory_events = {'37-100564f1-9fed-48c2-bd62-4ae8636dfcdb': {'host': '192.168.121.254', 'task': 'RESULTS', 'event': 'runner_on_ok'}, '36-2016b900-e38f-7dcd-a2e7-00000000000e': {'host': '192.168.121.252' 'task': 'RESULTS', 'event': 'runner_on_ok'}} @param ar_client: Ansible Runner Service client @param playbook_uuid: Palybooud identifier @return : list of InventoryNode """ #Obtain the needed data for each result event inventory_nodes = [] # Loop over the result events and request the event data for event_key, data in inventory_events.items(): event_response = ar_client.http_get(EVENT_DATA_URL % (playbook_uuid, event_key)) # Process the data for each event if event_response: event_data = json.loads(event_response.text)["data"]["event_data"] free_disks = event_data["res"]["disks_catalog"] for item, data in free_disks.items(): if item not in [host.name for host in inventory_nodes]: devs = [] for dev_key, dev_data in data.items(): if dev_key not in [device.id for device in devs]: dev = orchestrator.InventoryDevice() dev.id = dev_key dev.type = 'hdd' if dev_data[ "rotational"] else "sdd/nvme" dev.size = dev_data["sectorsize"] * dev_data[ "sectors"] devs.append(dev) inventory_nodes.append( orchestrator.InventoryNode(item, devs)) return inventory_nodes
def process_result(event_data): result = [] if event_data['success']: for node_name, node_devs in event_data["return"].items(): devs = [] for d in node_devs: dev = orchestrator.InventoryDevice() dev.blank = d['blank'] dev.type = d['type'] dev.id = d['id'] dev.size = d['size'] dev.extended = d['extended'] dev.metadata_space_free = d['metadata_space_free'] devs.append(dev) result.append(orchestrator.InventoryNode(node_name, devs)) return result
def process_result(raw_event): result = [] raw_event = json.loads(raw_event) if raw_event['data']['success']: for node_name, node_devs in raw_event["data"]["return"].items( ): devs = [] for d in node_devs: dev = orchestrator.InventoryDevice() dev.blank = d['blank'] dev.type = d['type'] dev.id = d['id'] dev.size = d['size'] dev.extended = d['extended'] dev.metadata_space_free = d['metadata_space_free'] devs.append(dev) result.append(orchestrator.InventoryNode(node_name, devs)) return result
def get_inventory(self, node_filter=None): node_list = None if node_filter and node_filter.nodes: # Explicit node list node_list = node_filter.nodes elif node_filter and node_filter.labels: # TODO: query k8s API to resolve to node list, and pass # it into RookCluster.get_discovered_devices raise NotImplementedError() devs = self.rook_cluster.get_discovered_devices(node_list) result = [] for node_name, node_devs in devs.items(): devs = [] for d in node_devs: dev = orchestrator.InventoryDevice() # XXX CAUTION! https://github.com/rook/rook/issues/1716 # Passing this through for the sake of completeness but it # is not trustworthy! dev.blank = d['empty'] dev.type = 'hdd' if d['rotational'] else 'ssd' dev.id = d['name'] dev.size = d['size'] if d['filesystem'] == "" and not d['rotational']: # Empty or partitioned SSD partitioned_space = sum( [p['size'] for p in d['Partitions']]) dev.metadata_space_free = max(0, d[ 'size'] - partitioned_space) devs.append(dev) result.append(orchestrator.InventoryNode(node_name, devs)) return result