From 543130927ba40a174e8674cca66ae442d5056d76 Mon Sep 17 00:00:00 2001 From: Jonas Bjurel Date: Sat, 3 Oct 2015 17:34:24 +0200 Subject: Moving tag arno.2015.2.0 from genesis to fuel/stable/arno Change-Id: I01b5f9f9125756d80d7ca666bb6d994f2b13d2a0 Signed-off-by: Jonas Bjurel --- common/ci/clean.sh | 326 +++++++++++++++++++++++++++++++++++++++++++++++++++++ common/ci/setup.sh | 270 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 596 insertions(+) create mode 100755 common/ci/clean.sh create mode 100755 common/ci/setup.sh (limited to 'common/ci') diff --git a/common/ci/clean.sh b/common/ci/clean.sh new file mode 100755 index 000000000..cc116e8d5 --- /dev/null +++ b/common/ci/clean.sh @@ -0,0 +1,326 @@ +#!/usr/bin/env bash + +#Common clean script to uninstall provisioning server +#author: Tim Rozet (trozet@redhat.com) +# +#Removes Libvirt, KVM, Vagrant, VirtualBox +# +#Destroys Vagrant VMs running in $vm_dir/ +#Shuts down all nodes found in Khaleesi settings +#Removes hypervisor kernel modules (VirtualBox & KVM/Libvirt) + +##VARS +reset=`tput sgr0` +blue=`tput setaf 4` +red=`tput setaf 1` +green=`tput setaf 2` +pxe_bridge='pxebr' +vm_dir=/var/opt/opnfv +first_interface='enp6s0' +second_interface='enp7s0' +management_vid=300 +management_interface="${first_interface}.${management_vid}" +##END VARS + +##FUNCTIONS +display_usage() { + echo -e "\n\n${blue}This script is used to uninstall and clean the OPNFV Target System${reset}\n\n" + echo -e "\nUsage:\n$0 [arguments] \n" + echo -e "\n -no_parse : No variable parsing into config. Flag. \n" + echo -e "\n -base_config : Full path of ksgen settings file to parse. Required. Will provide BMC info to shutdown hosts. Example: -base_config /opt/myinventory.yml \n" +} + +remove_interface_with_name_pattern() { + if [ -z $1 ]; then + echo "${red}Cannot remove interface. No interface name pattern specified!${reset}" + exit 1 + fi + local interface_name_pattern=$1 + echo "${blue} Looking for interface with name pattern: ${interface_name_pattern}${reset}" + interface=$(ip link show | grep -oP ${interface_name_pattern}) + if [ ! -z "${interface}" ]; then + echo "${blue}Interface ${interface} detected! Removing...${reset}" + ip link del ${interface} + if ip link show | grep -oP ${interface_name_pattern}; then + echo "${red}Could not remove interface ${interface} ${reset}" + exit 1 + else + echo "${blue}Interface ${interface} successfully removed${reset}" + fi + else + echo "${blue}Interface with name pattern ${interface_name_pattern} does not exist, nothing to remove${reset}" + fi +} +##END FUNCTIONS + +if [[ ( $1 == "--help") || $1 == "-h" ]]; then + display_usage + exit 0 +fi + +echo -e "\n\n${blue}This script is used to uninstall and clean the OPNFV Target System${reset}\n\n" +echo "Use -h to display help" +sleep 2 + +while [ "`echo $1 | cut -c1`" = "-" ] +do + echo $1 + case "$1" in + -base_config) + base_config=$2 + shift 2 + ;; + *) + display_usage + exit 1 + ;; +esac +done + +if [ ! -z "$base_config" ]; then + # Install ipmitool + # Major version is pinned to force some consistency for Arno + if ! yum list installed | grep -i ipmitool; then + if ! yum -y install ipmitool-1*; then + echo "${red}Unable to install ipmitool!${reset}" + exit 1 + fi + else + echo "${blue}Skipping ipmitool as it is already installed!${reset}" + fi + + ###find all the bmc IPs and number of nodes + node_counter=0 + output=`grep bmc_ip $base_config | grep -Eo '[0-9]+.[0-9]+.[0-9]+.[0-9]+'` + for line in ${output} ; do + bmc_ip[$node_counter]=$line + ((node_counter++)) + done + + max_nodes=$((node_counter-1)) + + ###find bmc_users per node + node_counter=0 + output=`grep bmc_user $base_config | sed 's/\s*bmc_user:\s*//'` + for line in ${output} ; do + bmc_user[$node_counter]=$line + ((node_counter++)) + done + + ###find bmc_pass per node + node_counter=0 + output=`grep bmc_pass $base_config | sed 's/\s*bmc_pass:\s*//'` + for line in ${output} ; do + bmc_pass[$node_counter]=$line + ((node_counter++)) + done + for mynode in `seq 0 $max_nodes`; do + echo "${blue}Node: ${bmc_ip[$mynode]} ${bmc_user[$mynode]} ${bmc_pass[$mynode]} ${reset}" + if ipmitool -I lanplus -P ${bmc_pass[$mynode]} -U ${bmc_user[$mynode]} -H ${bmc_ip[$mynode]} chassis power off; then + echo "${blue}Node: $mynode, ${bmc_ip[$mynode]} powered off!${reset}" + else + echo "${red}Error: Unable to power off $mynode, ${bmc_ip[$mynode]} ${reset}" + exit 1 + fi + done +else + echo "${blue}Skipping Baremetal node poweroff as base_config was not provided${reset}" +fi +###check to see if vbox is installed +vboxpkg=`rpm -qa | grep VirtualBox` +if [ $? -eq 0 ]; then + skip_vagrant=0 +else + skip_vagrant=1 +fi + +###legacy VM location check +###remove me later +if [ -d /tmp/bgs_vagrant ]; then + cd /tmp/bgs_vagrant + vagrant destroy -f + rm -rf /tmp/bgs_vagrant +fi + +###destroy vagrant +if [ $skip_vagrant -eq 0 ]; then + if [ -d $vm_dir ]; then + ##all vm directories + for vm in $( ls $vm_dir ); do + cd $vm_dir/$vm + if vagrant destroy -f; then + echo "${blue}Successfully destroyed $vm Vagrant VM ${reset}" + else + echo "${red}Unable to destroy $vm Vagrant VM! Attempting to killall vagrant if process is hung ${reset}" + killall vagrant + echo "${blue}Checking if vagrant was already destroyed and no process is active...${reset}" + if ps axf | grep vagrant; then + echo "${red}Vagrant process still exists after kill...exiting ${reset}" + exit 1 + else + echo "${blue}Vagrant process doesn't exist. Moving on... ${reset}" + fi + fi + + ##Vagrant boxes appear as VboxHeadless processes + ##try to gracefully destroy the VBox VM if it still exists + if vboxmanage list runningvms | grep $vm; then + echo "${red} $vm VBoxHeadless process still exists...Removing${reset}" + vbox_id=$(vboxmanage list runningvms | grep $vm | awk '{print $1}' | sed 's/"//g') + vboxmanage controlvm $vbox_id poweroff + if vboxmanage unregistervm --delete $vbox_id; then + echo "${blue}$vm VM is successfully deleted! ${reset}" + else + echo "${red} Unable to delete VM $vm ...Exiting ${reset}" + exit 1 + fi + else + echo "${blue}$vm VM is successfully deleted! ${reset}" + fi + done + else + echo "${blue}${vm_dir} doesn't exist, no VMs in OPNFV directory to destroy! ${reset}" + fi + + echo "${blue}Checking for any remaining virtual box processes...${reset}" + ###kill virtualbox + if ps axf | grep virtualbox; then + echo "${blue}virtualbox processes are still running. Killing any remaining VirtualBox processes...${reset}" + killall virtualbox + fi + + ###kill any leftover VMs (brute force) + if ps axf | grep VBoxHeadless; then + echo "${blue}VBoxHeadless processes are still running. Killing any remaining VBoxHeadless processes...${reset}" + killall VBoxHeadless + fi + + ###remove virtualbox + echo "${blue}Removing VirtualBox... ${reset}" + yum -y remove $vboxpkg + +else + echo "${blue}Skipping Vagrant destroy + VBox Removal as VirtualBox package is already removed ${reset}" +fi + +###remove working vm directory +echo "${blue}Removing working VM directory: $vm_dir ${reset}" +rm -rf $vm_dir + +###check to see if libvirt is installed +echo "${blue}Checking if libvirt/KVM is installed" +if rpm -qa | grep -iE 'libvirt|kvm'; then + echo "${blue}Libvirt/KVM is installed${reset}" + echo "${blue}Checking for any QEMU/KVM VMs...${reset}" + vm_count=0 + while read -r line; do ((vm_count++)); done < <(virsh list --all | sed 1,2d | head -n -1) + if [ $vm_count -gt 0 ]; then + echo "${blue}VMs Found: $vm_count${reset}" + vm_runnning=0 + while read -r line; do ((vm_running++)); done < <(virsh list --all | sed 1,2d | head -n -1| grep -i running) + echo "${blue}Powering off $vm_running VM(s)${reset}" + while read -r vm; do + if ! virsh destroy $vm; then + echo "${red}WARNING: Unable to power off VM ${vm}${reset}" + else + echo "${blue}VM $vm powered off!${reset}" + fi + done < <(virsh list --all | sed 1,2d | head -n -1| grep -i running | sed 's/^[ \t]*//' | awk '{print $2}') + echo "${blue}Destroying libvirt VMs...${reset}" + while read -r vm; do + if ! virsh undefine --remove-all-storage $vm; then + echo "${red}ERROR: Unable to remove the VM ${vm}${reset}" + exit 1 + else + echo "${blue}VM $vm removed!${reset}" + fi + done < <(virsh list --all | sed 1,2d | head -n -1| awk '{print $2}') + else + echo "${blue}No VMs found for removal" + fi + echo "${blue}Removing libvirt and kvm packages" + yum -y remove libvirt-* + yum -y remove *qemu* +else + echo "${blue}libvirt/KVM is not installed${reset}" +fi + +###remove possible VMs (needed for 'rmmod kvm_intel') +if [ -n "$(ps -ef | grep qemu-kvm | grep -v grep)" ]; then + echo "${blue}Removing existing VMs ${reset}" + killall -9 qemu-kvm +fi + +###remove kernel modules +echo "${blue}Removing kernel modules ${reset}" +for kernel_mod in vboxnetadp vboxnetflt vboxpci vboxdrv kvm_intel kvm; do + if ! rmmod $kernel_mod; then + if rmmod $kernel_mod 2>&1 | grep -i 'not currently loaded'; then + echo "${blue} $kernel_mod is not currently loaded! ${reset}" + else + echo "${red}Error trying to remove Kernel Module: $kernel_mod ${reset}" + exit 1 + fi + else + echo "${blue}Removed Kernel Module: $kernel_mod ${reset}" + fi +done + +###remove PXE bridge +echo "${blue}Checking whether PXE bridge ${pxe_bridge} exists${reset}" +if ! brctl show ${pxe_bridge} 2>&1 | grep -i 'No such device'; then + echo "${blue}PXE bridge ${pxe_bridge} detected! Removing...${reset}" + link_state=$(ip link show ${pxe_bridge} | grep -oP 'state \K[^ ]+') + if [[ ${link_state} != 'DOWN' ]]; then + ip link set dev ${pxe_bridge} down + sleep 5 + link_state=$(ip link show ${pxe_bridge} | grep -oP 'state \K[^ ]+') + if [[ ${link_state} != 'DOWN' ]]; then + echo "${red}Could not bring DOWN bridge ${pxe_bridge} link state is ${link_state}${reset}" + exit 1 + fi + fi + brctl delbr ${pxe_bridge} + if ifconfig | grep ${pxe_bridge} || brctl show | grep ${pxe_bridge}; then + echo "${red}Error trying to remove ${pxe_bridge}${reset}" + exit 1 + else + echo "${blue}PXE bridge ${pxe_bridge} removed${reset}" + fi +else + echo "${blue}PXE bridge ${pxe_bridge} does not exist${reset}" +fi + +###remove PXE interface (VLAN 0) +echo "${blue}Checking whether PXE interface (VLAN 0) exists and remove it${reset}" +remove_interface_with_name_pattern "enp.+s.+\.0" + +###remove Openstack Management interface (VLAN 300) +echo "${blue}Checking whether Openstack Management interface (VLAN 300) exists and remove it${reset}" +remove_interface_with_name_pattern "enp.+s.+\.${management_vid}" + +###bounce interfaces to restore default IP config +echo "${blue}Bouncing interfaces to restore IP config${reset}" +for interface in $first_interface $second_interface; do + echo "${blue}Bouncing interface: ${interface}${reset}" + ifdown $interface + sleep 5 + ifup $interface + tries=5 + counter=0 + while [ $counter -lt $tries ]; do + if ip addr show $interface | grep -Eo "inet [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+"; then + temp_ip=$(ip addr show $interface | grep -Eo "inet [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" | awk '{print $2}') + echo "${blue}IP found on ${interface}. IP is ${temp_ip}${reset}" + break + else + ((counter++)) + sleep 2 + fi + done + + if [ "$counter" -ge 5 ]; then + echo "${red}Error: Unable to get IP address on ${interface}${reset}" + exit 1 + fi +done diff --git a/common/ci/setup.sh b/common/ci/setup.sh new file mode 100755 index 000000000..bb54147b3 --- /dev/null +++ b/common/ci/setup.sh @@ -0,0 +1,270 @@ +#!/usr/bin/env bash + +#Script that install prerequisites +#author: Szilard Cserey (szilard.cserey@ericsson.com) +# +#Installs qemu-kvm, libvirt and prepares networking for Fuel VM + +##VARS +reset=`tput sgr0` +blue=`tput setaf 4` +red=`tput setaf 1` +green=`tput setaf 2` +private_interface='enp6s0' +public_interface='enp8s0' +pxe_bridge='pxebr' +fuel_gw_ip='10.20.0.1/16' +management_vid=300 +management_interface="${private_interface}.${management_vid}" +##END VARS + +##FUNCTIONS +###check whether qemu-kvm is installed, otherwise install it +install_qemu_kvm() { + echo "${blue}Checking whether qemu-kvm is installed, otherwise install it${reset}" + if ! rpm -qa | grep -iE 'qemu-kvm'; then + echo "${blue}qemu-kvm is not installed, installing...${reset}" + yum -y install qemu-kvm + else + echo "${green}OK!${reset}" + fi +} + +###check whether libvirt is installed, otherwise install it +install_libvirt() { + echo "${blue}Checking whether libvirt is installed, otherwise install it${reset}" + if ! rpm -qa | grep -iE 'libvirt'; then + echo "${blue}libvirt is not installed, installing...${reset}" + yum -y install libvirt + else + echo "${green}OK!${reset}" + fi +} + +###check whether kvm kernel module is loaded, otherwise load it +load_kvm_kernel_mod() { + echo "${blue}Checking whether kvm kernel module is loaded, otherwise load it${reset}" + if ! lsmod | grep -iE 'kvm'; then + if [[ `lscpu | grep 'Vendor ID' | awk 'BEGIN { FS = ":" } ; {print $2}' | tr -d ' '` == 'GenuineIntel' ]]; then + echo "${blue}Intel processor identified, loading kernel module kvm-intel${reset}" + kernel_mod='kvm-intel' + modprobe ${kernel_mod} + fi + if [[ `lscpu | grep 'Vendor ID' | awk 'BEGIN { FS = ":" } ; {print $2}' | tr -d ' '` == 'AuthenticAMD' ]]; then + echo "${blue}AMD processor identified, loading kernel module kvm-amd${reset}" + kernel_mod='kvm-amd' + modprobe ${kernel_mod} + fi + if ! lsmod | grep -iE 'kvm'; then + echo "${red}Failed to load kernel module ${kernel_mod}!${reset}" + exit 1 + fi + else + echo "${green}OK!${reset}" + fi +} + +###check whether libvirtd service is running otherwise start it +start_libvirtd_service() { + echo "${blue}Checking whether libvirtd service is running otherwise start it${reset}" + if ! sudo systemctl status libvirtd | grep -iE 'active \(running\)'; then + echo "${blue}starting libvirtd service${reset}" + systemctl start libvirtd + if ! sudo systemctl status libvirtd | grep -iE 'active \(running\)'; then + echo "${red}Failed to start libvirtd service!${reset}" + exit 1 + fi + else + echo "${green}OK!${reset}" + fi +} + + +#Check whether interface exists +check_interface_exists() { + if [ -z $1 ]; then + echo "${red}Cannot check whether interface exists! No interface specified!${reset}" + exit 1 + fi + local interface=$1 + #Check whether interface exists + echo "${blue}Checking whether interface ${interface} exists${reset}" + if ! ip link show ${interface}; then + echo "${red}Interface ${interface} does not exists!${reset}" + exit 1 + else + echo "${green}OK!${reset}" + fi +} + +#Check whether interface is UP +check_interface_up() { + if [ -z $1 ]; then + echo "${red}Cannot check whether interface is UP! No interface specified!${reset}" + exit 1 + fi + local interface=$1 + + #Check whether interface is UP + echo "${blue}Checking whether interface ${interface} is UP${reset}" + link_state=$(ip link show ${interface} | grep -oP 'state \K[^ ]+') + if [[ ${link_state} != 'UP' ]]; then + echo "${blue}${interface} state is ${link_state}. Bringing it UP!${reset}" + ip link set dev ${interface} up + sleep 5 + link_state=$(ip link show ${interface} | grep -oP 'state \K[^ ]+') + if [[ ${link_state} == 'DOWN' ]]; then + echo "${red}Could not bring UP interface ${interface} link state is ${link_state}${reset}" + exit 1 + fi + else + echo "${green}OK!${reset}" + fi +} + +#Create VLAN interface +create_vlan_interface() { + if [ -z $1 ]; then + echo "${red}Cannot create VLAN interface. No base interface specified!${reset}" + exit 1 + fi + if [ -z $2 ]; then + echo "${red}Cannot create VLAN interface. No VLAN ID specified!${reset}" + exit 1 + fi + + local base_interface=$1 + local vid=$2 + local interface="${base_interface}.${vid}" + + echo "${blue}Checking whether VLAN ${vid} interface ${interface} exists, otherwise create it${reset}" + if ! ip link show ${interface}; then + echo "${blue}Creating VLAN ${vid} interface ${interface}${reset}" + ip link add link ${base_interface} name ${interface} type vlan id ${vid} + else + echo "${green}OK!${reset}" + fi + + #Check whether VLAN interface is UP + check_interface_up ${interface} +} + +###setup PXE Bridge +setup_pxe_bridge() { + pxe_vid=0 + pxe_interface="${private_interface}.${pxe_vid}" + #Check whether VLAN 0 (PXE) interface exists, otherwise create it + create_vlan_interface ${private_interface} ${pxe_vid} + + #Check whether PXE bridge exists + echo "${blue}Checking whether PXE bridge ${pxe_bridge} exists${reset}" + if brctl show ${pxe_bridge} 2>&1 | grep 'No such device'; then + echo "${blue}Creating PXE bridge ${pxe_bridge}${reset}" + brctl addbr ${pxe_bridge} + else + echo "${green}OK!${reset}" + fi + + #Add VLAN 0 (PXE) interface to PXE bridge + echo "${blue}Checking whether VLAN 0 (PXE) interface ${pxe_interface} is added to PXE bridge ${pxe_bridge} exists${reset}" + if ! brctl show ${pxe_bridge} 2>&1 | grep ${pxe_interface}; then + echo "${blue}Adding VLAN 0 (PXE) interface ${pxe_interface} to PXE bridge ${pxe_bridge}${reset}" + brctl addif ${pxe_bridge} ${pxe_interface} + if ! brctl show ${pxe_bridge} 2>&1 | grep ${pxe_interface}; then + echo "${red}Could not add VLAN 0 (PXE) interface ${pxe_interface} to PXE bridge ${pxe_bridge}${reset}" + exit 1 + fi + else + echo "${green}OK!${reset}" + fi + + #Check whether PXE bridge is UP + check_interface_up ${pxe_bridge} + + #Add Fuel Gateway IP Address to PXE bridge + echo "${blue}Checking whether Fuel Gateway IP Address ${fuel_gw_ip} is assigned to PXE bridge ${pxe_bridge}${reset}" + if ! ip addr show ${pxe_bridge} | grep ${fuel_gw_ip}; then + echo "${blue}Adding Fuel Gateway IP Address ${fuel_gw_ip} to PXE bridge ${pxe_bridge}${reset}" + sudo ip addr add ${fuel_gw_ip} dev ${pxe_bridge} + if ! ip addr show ${pxe_bridge} | grep ${fuel_gw_ip}; then + echo "${red}Could not add Fuel Gateway IP Address ${fuel_gw_ip} to PXE bridge ${pxe_bridge}${reset}" + exit 1 + fi + else + echo "${green}OK!${reset}" + fi +} + +###check whether access to public network is granted +check_access_enabled_to_public_network() { + #Check whether IP forwarding is enabled + echo "${blue}Checking whether IP Forwarding is enabled ${reset}" + if ! sysctl net.ipv4.ip_forward | grep "net.ipv4.ip_forward = 1"; then + sysctl -w net.ipv4.ip_forward=1 + if ! sysctl net.ipv4.ip_forward | grep "net.ipv4.ip_forward = 1"; then + echo "${red}IP Forwarding could not be enabled!${reset}" + exit 1 + fi + else + echo "${green}OK!${reset}" + fi + + echo "${blue}Checking whether access is granted to public network through interface ${public_interface}${reset}" + if ! sudo iptables -t nat -L POSTROUTING -v | grep "MASQUERADE.*${public_interface}.*anywhere.*anywhere"; then + echo "${blue}Enable access to public network through interface ${public_interface}${reset}" + iptables -t nat -A POSTROUTING -o ${public_interface} -j MASQUERADE + else + echo "${green}OK!${reset}" + fi +} + +###setup Openstack Management Interface +create_openstack_management_interface() { + #Check whether Openstack Management interface exists, otherwise create it + create_vlan_interface ${private_interface} ${management_vid} + + echo "${blue}Moving IP addresses from interface ${private_interface} to VLAN ${management_vid} interface ${management_interface}${reset}" + private_interface_ip_addr_list=$(ip addr show ${private_interface} | grep -oP 'inet \K[^ ]+') + if [[ ! -z ${private_interface_ip_addr_list} ]]; then + echo -e "${blue}Found IP addresses on interface ${private_interface}:\n${private_interface_ip_addr_list}${reset}" + for private_interface_ip_addr in ${private_interface_ip_addr_list} + do + echo "${blue}Removing IP address ${private_interface_ip_addr} from interface ${private_interface}${reset}" + ip addr del ${private_interface_ip_addr} dev ${private_interface} + if ip addr show ${private_interface} | grep ${private_interface_ip_addr}; then + echo "${red}Could not remove IP address ${private_interface_ip_addr} from interface ${private_interface}${reset}" + exit 1 + fi + if ! ip addr show ${management_interface} | grep ${private_interface_ip_addr}; then + echo "${blue}Adding IP address ${private_interface_ip_addr} to VLAN ${management_vid} interface ${management_interface}${reset}" + ip addr add ${private_interface_ip_addr} dev ${management_interface} + if ! ip addr show ${management_interface} | grep ${private_interface_ip_addr}; then + echo "${red}Could not set IP address ${private_interface_ip_addr} to VLAN ${management_vid} interface ${management_interface}${reset}" + exit 1 + fi + else + echo "${blue}VLAN ${management_vid} interface ${management_interface} already has assigned to itself this IP address ${private_interface_ip_addr}${reset}" + fi + done + else + echo "${red}No IP Address is assigned to interface ${private_interface}, there isn't any IP address to move to interface ${management_interface}${reset}" + fi +} + +##END FUNCTIONS + +main() { + install_qemu_kvm + install_libvirt + load_kvm_kernel_mod + start_libvirtd_service + check_interface_exists ${private_interface} + check_interface_up ${private_interface} + check_interface_exists ${public_interface} + check_interface_up ${public_interface} + setup_pxe_bridge + check_access_enabled_to_public_network + create_openstack_management_interface +} + +main "$@" -- cgit 1.2.3-korg