summaryrefslogtreecommitdiffstats
path: root/tests/ci/prepare_env.sh
blob: 130969fa140b87df6295c18d6c2786ed46334964 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#!/bin/bash
##############################################################################
# Copyright (c) 2015 Ericsson AB, Huawei Technologies Co.,Ltd and others.
#
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Apache License, Version 2.0
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
##############################################################################

# Perepare the environment to run yardstick ci

: ${DEPLOY_TYPE:='bm'} # Can be any of 'bm' (Bare Metal) or 'virt' (Virtual)

: ${NODE_NAME:='unknown'}
: ${EXTERNAL_NETWORK:='admin_floating_net'}

# Extract network name from EXTERNAL_NETWORK
#  e.g. EXTERNAL_NETWORK='ext-net;flat;192.168.0.2;192.168.0.253;192.168.0.1;192.168.0.0/24'
export EXTERNAL_NETWORK=$(echo $EXTERNAL_NETWORK | cut -f1 -d \;)

# Create openstack credentials
echo "INFO: Creating openstack credentials .."
OPENRC=/home/opnfv/openrc
INSTALLERS=(apex compass fuel joid)

if [ ! -f $OPENRC ]; then
    # credentials file is not given, check if environment variables are set
    # to get the creds using fetch_os_creds.sh later on
    echo "INFO: Checking environment variables INSTALLER_TYPE and INSTALLER_IP"
    if [ -z ${INSTALLER_TYPE} ]; then
        echo "environment variable 'INSTALLER_TYPE' is not defined."
        exit 1
    elif [[ ${INSTALLERS[@]} =~ ${INSTALLER_TYPE} ]]; then
        echo "INSTALLER_TYPE env variable found: ${INSTALLER_TYPE}"
    else
        echo "Invalid env variable INSTALLER_TYPE=${INSTALLER_TYPE}"
        exit 1
    fi

    if [ "$DEPLOY_TYPE" == "virt" ]; then
        FETCH_CRED_ARG="-v -d $OPENRC -i ${INSTALLER_TYPE} -a ${INSTALLER_IP}"
    else
        FETCH_CRED_ARG="-d $OPENRC -i ${INSTALLER_TYPE} -a ${INSTALLER_IP}"
    fi

    $RELENG_REPO_DIR/utils/fetch_os_creds.sh $FETCH_CRED_ARG

fi

source $OPENRC

export EXTERNAL_NETWORK INSTALLER_TYPE DEPLOY_TYPE NODE_NAME

# Prepare a admin-rc file for StorPerf integration
$YARDSTICK_REPO_DIR/tests/ci/prepare_storperf_admin-rc.sh

# copy a admin-rc file for StorPerf integration to the deployment location
if [ "$NODE_NAME" == "huawei-pod1" ]; then
    bash $YARDSTICK_REPO_DIR/tests/ci/scp_storperf_admin-rc.sh
fi

# Fetching id_rsa file from jump_server..."
verify_connectivity() {
    local ip=$1
    echo "Verifying connectivity to $ip..."
    for i in $(seq 0 10); do
        if ping -c 1 -W 1 $ip > /dev/null; then
            echo "$ip is reachable!"
            return 0
        fi
        sleep 1
    done
    error "Can not talk to $ip."
}

YARD_IMG_ARCH=amd64
export YARD_IMG_ARCH

if ! grep -q "Defaults env_keep += \"YARD_IMG_ARCH\"" "/etc/sudoers"; then
    sudo echo "Defaults env_keep += \"YARD_IMG_ARCH YARDSTICK_REPO_DIR\"" >> /etc/sudoers
fi

ssh_options="-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no"

if [ "$INSTALLER_TYPE" == "fuel" ]; then
    #ip_fuel="10.20.0.2"
    verify_connectivity $INSTALLER_IP
    echo "Fetching id_rsa file from jump_server $INSTALLER_IP..."
    sshpass -p r00tme scp 2>/dev/null $ssh_options \
    root@${INSTALLER_IP}:~/.ssh/id_rsa /root/.ssh/id_rsa &> /dev/null

    ARCH_SCRIPT="test -f /etc/fuel_openstack_arch && grep -q arm64 /etc/fuel_openstack_arch"
    sshpass -p r00tme ssh $ssh_options -l root $INSTALLER_IP "${ARCH_SCRIPT}" && YARD_IMG_ARCH=arm64

    sshpass -p r00tme ssh 2>/dev/null $ssh_options \
        root@${INSTALLER_IP} fuel node>fuel_node

    # update fuel node id and ip info according to the CI env
    controller_IDs=($(cat fuel_node|grep controller|awk '{print $1}'))
    compute_IDs=($(cat fuel_node|grep compute|awk '{print $1}'))
    controller_ips=($(cat fuel_node|grep controller|awk '{print $10}'))
    compute_ips=($(cat fuel_node|grep compute|awk '{print $10}'))

    pod_yaml="./etc/yardstick/nodes/fuel_baremetal/pod.yaml"
    node_line_num=($(grep -n node[1-5] $pod_yaml | awk -F: '{print $1}'))

    if [[ ${controller_ips[0]} ]]; then
        sed -i "${node_line_num[0]}s/node1/node${controller_IDs[0]}/;s/ip1/${controller_ips[0]}/" $pod_yaml;
    fi
    if [[ ${controller_ips[1]} ]]; then
        sed -i "${node_line_num[1]}s/node2/node${controller_IDs[1]}/;s/ip2/${controller_ips[1]}/" $pod_yaml;
    fi
    if [[ ${controller_ips[2]} ]]; then
        sed -i "${node_line_num[2]}s/node3/node${controller_IDs[2]}/;s/ip3/${controller_ips[2]}/" $pod_yaml;
    fi
    if [[ ${compute_ips[0]} ]]; then
        sed -i "${node_line_num[3]}s/node4/node${compute_IDs[0]}/;s/ip4/${compute_ips[0]}/" $pod_yaml;
    fi
    if [[ ${compute_ips[1]} ]]; then
        sed -i "${node_line_num[4]}s/node5/node${compute_IDs[1]}/;s/ip5/${compute_ips[1]}/" $pod_yaml;
    fi

fi
an>', numvfs, pci_handle) return False def get_sriov_numvfs(pci_handle): """ Returns the number of configured VFs :param pci_handle: PCI slot identifier with domain part :returns: the number of configured VFs """ if is_sriov_supported(pci_handle): with open(_SRIOV_NUMVFS.format(pci_handle), 'r') as numvfs: return int(numvfs.readline().rstrip('\n')) return None def get_sriov_totalvfs(pci_handle): """ Checks if sriov is supported and returns max number of supported VFs :param pci_handle: PCI slot identifier with domain part :returns: the max number of supported VFs by given NIC """ if is_sriov_supported(pci_handle): with open(_SRIOV_TOTALVFS.format(pci_handle), 'r') as total: return int(total.readline().rstrip('\n')) return None def get_sriov_vfs_list(pf_pci_handle): """ Returns list of PCI handles of VFs configured at given NIC/PF :param pf_pci_handle: PCI slot identifier of PF with domain part. :returns: list """ vfs = [] if is_sriov_supported(pf_pci_handle): for vf_name in glob.glob(os.path.join(_PCI_DIR, _SRIOV_VF_PREFIX + '*').format(pf_pci_handle)): vfs.append(os.path.basename(os.path.realpath(vf_name))) return vfs def get_sriov_pf(vf_pci_handle): """ Get PCI handle of PF which belongs to given VF :param vf_pci_handle: PCI slot identifier of VF with domain part. :returns: PCI handle of parent PF """ pf_path = os.path.join(_PCI_DIR, _SRIOV_PF).format(vf_pci_handle) if os.path.isdir(pf_path): return os.path.basename(os.path.realpath(pf_path)) return None def get_driver(pci_handle): """ Returns name of kernel driver assigned to given NIC :param pci_handle: PCI slot identifier with domain part. :returns: string with assigned kernel driver, None otherwise """ driver_path = os.path.join(_PCI_DIR, _PCI_DRIVER).format(pci_handle) if os.path.isdir(driver_path): return os.path.basename(os.path.realpath(driver_path)) return None def get_device_name(pci_handle): """ Returns name of network card device name :param pci_handle: PCI slot identifier with domain part. :returns: string with assigned NIC device name, None otherwise """ net_path = os.path.join(_PCI_DIR, _PCI_NET).format(pci_handle) try: return os.listdir(net_path)[0] except FileNotFoundError: return None except IndexError: return None return None def get_mac(pci_handle): """ Returns MAC address of given NIC :param pci_handle: PCI slot identifier with domain part. :returns: string with assigned MAC address, None otherwise """ mac_path = glob.glob(os.path.join(_PCI_DIR, _PCI_NET, '*', 'address').format(pci_handle)) # kernel driver is loaded and MAC can be read if len(mac_path) and os.path.isfile(mac_path[0]): with open(mac_path[0], 'r') as _file: return _file.readline().rstrip('\n') # MAC address is unknown, e.g. NIC is assigned to DPDK return None def get_nic_info(full_pci_handle): """ Parse given pci handle with additional info and returns requested NIC info. :param full_pci_handle: A string with extended network card PCI ID. extended PCI ID syntax: PCI_ID[|vfx][|(mac|dev)] examples: 0000:06:00.0 - returns the same value 0000:06:00.0|vf0 - returns PCI ID of 1st virtual function of given NIC 0000:06:00.0|mac - returns MAC address of given NIC 0000:06:00.0|vf0|mac - returns MAC address of 1st virtual function of given NIC :returns: A string with requested NIC data or None if data cannot be read. """ parsed_handle = full_pci_handle.split('|') if len(parsed_handle) not in (1, 2, 3): _LOGGER.error("Invalid PCI device name: '%s'", full_pci_handle) return None pci_handle = parsed_handle[0] for action in parsed_handle[1:]: # in case of SRIOV get PCI handle of given virtual function if action.lower().startswith('vf'): try: vf_num = int(action[2:]) pci_handle = get_sriov_vfs_list(pci_handle)[vf_num] except ValueError: _LOGGER.error("Pci device '%s', does not have VF with index '%s'", pci_handle, action[2:]) return None except IndexError: _LOGGER.error("Pci device '%s', does not have VF with index '%s'", pci_handle, vf_num) return None continue # return requested info for given PCI handle if action.lower() == 'mac': return get_mac(pci_handle) elif action.lower() == 'dev': return get_device_name(pci_handle) else: _LOGGER.error("Invalid item '%s' in PCI handle '%s'", action, full_pci_handle) return None return pci_handle def reinit_vfs(pf_pci_handle): """ Reinitializates all VFs, which belong to given PF :param pf_pci_handle: PCI slot identifier of PF with domain part. """ rte_pci_tool = settings.getValue('TOOLS')['bind-tool'] for vf_nic in get_sriov_vfs_list(pf_pci_handle): nic_driver = get_driver(vf_nic) if nic_driver: try: subprocess.call(['sudo', rte_pci_tool, '--unbind', vf_nic], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) subprocess.call(['sudo', rte_pci_tool, '--bind=' + nic_driver, vf_nic], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) except subprocess.CalledProcessError: _LOGGER.warning('Error during reinitialization of VF %s', vf_nic) else: _LOGGER.warning("Can't detect driver for VF %s", vf_nic)