Esempio n. 1
0
    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')
Esempio n. 2
0
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
Esempio n. 3
0
 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
Esempio n. 4
0
 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
Esempio n. 5
0
    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