ironic_python_agent.hardware_managers.cna

Source code for ironic_python_agent.hardware_managers.cna

# Copyright (C) 2016 Intel Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import os

from oslo_concurrency import processutils
from oslo_config import cfg
from oslo_log import log

from ironic_python_agent import hardware
from ironic_python_agent import utils

LOG = log.getLogger()
CONF = cfg.CONF


def _detect_cna_card():
    addr_path = '/sys/class/net'
    for net_dev in os.listdir(addr_path):
        link_path = '{}/{}/device/driver/module'.format(addr_path, net_dev)
        try:
            out = utils.execute('readlink', '-v', link_path)
        except OSError as e:
            LOG.warning('Something went wrong when readlink for '
                        'interface %(device)s. Error: %(error)s',
                        {'device': net_dev, 'error': e})
            continue
        except processutils.ProcessExecutionError as e:
            LOG.debug('Get driver for interface %(device)s failed. '
                      'Error: %(error)s',
                      {'device': net_dev, 'error': e})
            continue
        driver_name = os.path.basename(out[0].strip())
        if driver_name == 'i40e':
            return True
    return False


def _disable_embedded_lldp_agent_in_cna_card():
    addr_path = '/sys/kernel/debug/i40e'
    failed_dirs = []
    if os.path.exists(addr_path):
        addr_dirs = os.listdir(addr_path)
    else:
        LOG.warning('Driver i40e was not loaded properly')
        return
    for inner_dir in addr_dirs:
        try:
            command_path = '{}/{}/command'.format(addr_path, inner_dir)
            with open(command_path, 'w') as command_file:
                command_file.write('lldp stop')
        except (OSError, IOError):
            failed_dirs.append(inner_dir)
            continue
    if failed_dirs:
        LOG.warning('Failed to disable the embedded LLDP on Intel CNA network '
                    'card. Addresses of failed pci devices: {}'
                    .format(str(failed_dirs).strip('[]')))


[docs]class IntelCnaHardwareManager(hardware.HardwareManager): HARDWARE_MANAGER_NAME = 'IntelCnaHardwareManager' HARDWARE_MANAGER_VERSION = '1.0'
[docs] def evaluate_hardware_support(self): if _detect_cna_card(): LOG.debug('Found Intel CNA network card') # On Intel CNA cards, in order to make LLDP info collecting # possible, the embedded LLDP agent, which runs inside that # card, needs to be turned off. if CONF.collect_lldp: LOG.info('Disable CNA network card embedded lldp agent now') _disable_embedded_lldp_agent_in_cna_card() return hardware.HardwareSupport.MAINLINE else: LOG.debug('No Intel CNA network card found') return hardware.HardwareSupport.NONE
Creative Commons Attribution 3.0 License

Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.