FIX for bringing down pxebr in clean.sh
[genesis.git] / common / ci / clean.sh
1 #!/usr/bin/env bash
2
3 #Common clean script to uninstall provisioning server
4 #author: Tim Rozet (trozet@redhat.com)
5 #
6 #Removes Libvirt, KVM, Vagrant, VirtualBox
7 #
8 #Destroys Vagrant VMs running in $vm_dir/
9 #Shuts down all nodes found in Khaleesi settings
10 #Removes hypervisor kernel modules (VirtualBox & KVM/Libvirt)
11
12 ##VARS
13 reset=`tput sgr0`
14 blue=`tput setaf 4`
15 red=`tput setaf 1`
16 green=`tput setaf 2`
17 pxe_bridge='pxebr'
18 vm_dir=/var/opt/opnfv
19 ##END VARS
20
21 ##FUNCTIONS
22 display_usage() {
23   echo -e "\n\n${blue}This script is used to uninstall and clean the OPNFV Target System${reset}\n\n"
24   echo -e "\nUsage:\n$0 [arguments] \n"
25   echo -e "\n   -no_parse : No variable parsing into config. Flag. \n"
26   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"
27 }
28
29 ##END FUNCTIONS
30
31 if [[ ( $1 == "--help") ||  $1 == "-h" ]]; then
32     display_usage
33     exit 0
34 fi
35
36 echo -e "\n\n${blue}This script is used to uninstall and clean the OPNFV Target System${reset}\n\n"
37 echo "Use -h to display help"
38 sleep 2
39
40 while [ "`echo $1 | cut -c1`" = "-" ]
41 do
42     echo $1
43     case "$1" in
44         -base_config)
45                 base_config=$2
46                 shift 2
47             ;;
48         *)
49                 display_usage
50                 exit 1
51             ;;
52 esac
53 done
54
55 if [ ! -z "$base_config" ]; then
56   # Install ipmitool
57   # Major version is pinned to force some consistency for Arno
58   if ! yum list installed | grep -i ipmitool; then
59     if ! yum -y install ipmitool-1*; then
60       echo "${red}Unable to install ipmitool!${reset}"
61       exit 1
62     fi
63   else
64     echo "${blue}Skipping ipmitool as it is already installed!${reset}"
65   fi
66
67   ###find all the bmc IPs and number of nodes
68   node_counter=0
69   output=`grep bmc_ip $base_config | grep -Eo '[0-9]+.[0-9]+.[0-9]+.[0-9]+'`
70   for line in ${output} ; do
71     bmc_ip[$node_counter]=$line
72     ((node_counter++))
73   done
74
75   max_nodes=$((node_counter-1))
76
77   ###find bmc_users per node
78   node_counter=0
79   output=`grep bmc_user $base_config | sed 's/\s*bmc_user:\s*//'`
80   for line in ${output} ; do
81     bmc_user[$node_counter]=$line
82     ((node_counter++))
83   done
84
85   ###find bmc_pass per node
86   node_counter=0
87   output=`grep bmc_pass $base_config | sed 's/\s*bmc_pass:\s*//'`
88   for line in ${output} ; do
89     bmc_pass[$node_counter]=$line
90     ((node_counter++))
91   done
92   for mynode in `seq 0 $max_nodes`; do
93     echo "${blue}Node: ${bmc_ip[$mynode]} ${bmc_user[$mynode]} ${bmc_pass[$mynode]} ${reset}"
94     if ipmitool -I lanplus -P ${bmc_pass[$mynode]} -U ${bmc_user[$mynode]} -H ${bmc_ip[$mynode]} chassis power off; then
95       echo "${blue}Node: $mynode, ${bmc_ip[$mynode]} powered off!${reset}"
96     else
97       echo "${red}Error: Unable to power off $mynode, ${bmc_ip[$mynode]} ${reset}"
98       exit 1
99     fi
100   done
101 else
102   echo "${blue}Skipping Baremetal node poweroff as base_config was not provided${reset}"
103 fi
104 ###check to see if vbox is installed
105 vboxpkg=`rpm -qa | grep VirtualBox`
106 if [ $? -eq 0 ]; then
107   skip_vagrant=0
108 else
109   skip_vagrant=1
110 fi
111
112 ###legacy VM location check
113 ###remove me later
114 if [ -d /tmp/bgs_vagrant ]; then
115   cd /tmp/bgs_vagrant
116   vagrant destroy -f
117   rm -rf /tmp/bgs_vagrant
118 fi
119
120 ###destroy vagrant
121 if [ $skip_vagrant -eq 0 ]; then
122   if [ -d $vm_dir ]; then
123     ##all vm directories
124     for vm in $( ls $vm_dir ); do
125       cd $vm_dir/$vm
126       if vagrant destroy -f; then
127         echo "${blue}Successfully destroyed $vm Vagrant VM ${reset}"
128       else
129         echo "${red}Unable to destroy $vm Vagrant VM! Attempting to killall vagrant if process is hung ${reset}"
130         killall vagrant
131         echo "${blue}Checking if vagrant was already destroyed and no process is active...${reset}"
132         if ps axf | grep vagrant; then
133           echo "${red}Vagrant process still exists after kill...exiting ${reset}"
134           exit 1
135         else
136           echo "${blue}Vagrant process doesn't exist.  Moving on... ${reset}"
137         fi
138       fi
139
140       ##Vagrant boxes appear as VboxHeadless processes
141       ##try to gracefully destroy the VBox VM if it still exists
142       if vboxmanage list runningvms | grep $vm; then
143         echo "${red} $vm VBoxHeadless process still exists...Removing${reset}"
144         vbox_id=$(vboxmanage list runningvms | grep $vm | awk '{print $1}' | sed 's/"//g')
145         vboxmanage controlvm $vbox_id poweroff
146         if vboxmanage unregistervm --delete $vbox_id; then
147           echo "${blue}$vm VM is successfully deleted! ${reset}"
148         else
149           echo "${red} Unable to delete VM $vm ...Exiting ${reset}"
150           exit 1
151         fi
152       else
153         echo "${blue}$vm VM is successfully deleted! ${reset}"
154       fi
155     done
156   else
157     echo "${blue}${vm_dir} doesn't exist, no VMs in OPNFV directory to destroy! ${reset}"
158   fi
159
160   echo "${blue}Checking for any remaining virtual box processes...${reset}"
161   ###kill virtualbox
162   if ps axf | grep virtualbox; then
163     echo "${blue}virtualbox processes are still running. Killing any remaining VirtualBox processes...${reset}"
164     killall virtualbox
165   fi
166
167   ###kill any leftover VMs (brute force)
168   if ps axf | grep VBoxHeadless; then
169     echo "${blue}VBoxHeadless processes are still running. Killing any remaining VBoxHeadless processes...${reset}"
170     killall VBoxHeadless
171   fi
172
173   ###remove virtualbox
174   echo "${blue}Removing VirtualBox... ${reset}"
175   yum -y remove $vboxpkg
176
177 else
178   echo "${blue}Skipping Vagrant destroy + VBox Removal as VirtualBox package is already removed ${reset}"
179 fi
180
181 ###remove working vm directory
182 echo "${blue}Removing working VM directory: $vm_dir ${reset}"
183 rm -rf $vm_dir
184
185 ###check to see if libvirt is installed
186 echo "${blue}Checking if libvirt/KVM is installed"
187 if rpm -qa | grep -iE 'libvirt|kvm'; then
188   echo "${blue}Libvirt/KVM is installed${reset}"
189   echo "${blue}Checking for any QEMU/KVM VMs...${reset}"
190   vm_count=0
191   while read -r line; do ((vm_count++)); done < <(virsh list --all | sed 1,2d | head -n -1)
192   if [ $vm_count -gt 0 ]; then
193     echo "${blue}VMs Found: $vm_count${reset}"
194     vm_runnning=0
195     while read -r line; do ((vm_running++)); done < <(virsh list --all | sed 1,2d | head -n -1| grep -i running)
196     echo "${blue}Powering off $vm_running VM(s)${reset}"
197     while read -r vm; do
198       if ! virsh destroy $vm; then
199         echo "${red}WARNING: Unable to power off VM ${vm}${reset}"
200       else
201         echo "${blue}VM $vm powered off!${reset}"
202       fi
203     done < <(virsh list --all | sed 1,2d | head -n -1| grep -i running | sed 's/^[ \t]*//' | awk '{print $2}')
204     echo "${blue}Destroying libvirt VMs...${reset}"
205     while read -r vm; do
206       if ! virsh undefine --remove-all-storage $vm; then
207         echo "${red}ERROR: Unable to remove the VM ${vm}${reset}"
208         exit 1
209       else
210         echo "${blue}VM $vm removed!${reset}"
211       fi
212     done < <(virsh list --all | sed 1,2d | head -n -1| awk '{print $2}')
213   else
214     echo "${blue}No VMs found for removal"
215   fi
216   echo "${blue}Removing libvirt and kvm packages"
217   yum -y remove libvirt-*
218   yum -y remove *qemu*
219 else
220   echo "${blue}libvirt/KVM is not installed${reset}"
221 fi
222
223 ###remove kernel modules
224 echo "${blue}Removing kernel modules ${reset}"
225 for kernel_mod in vboxnetadp vboxnetflt vboxpci vboxdrv kvm_intel kvm; do
226   if ! rmmod $kernel_mod; then
227     if rmmod $kernel_mod 2>&1 | grep -i 'not currently loaded'; then
228       echo "${blue} $kernel_mod is not currently loaded! ${reset}"
229     else
230       echo "${red}Error trying to remove Kernel Module: $kernel_mod ${reset}"
231       exit 1
232     fi
233   else
234     echo "${blue}Removed Kernel Module: $kernel_mod ${reset}"
235   fi
236 done
237
238 ###remove pxebr
239 echo "${blue}Checking whether PXE bridge ${pxe_bridge} exists${reset}"
240 if ! brctl show ${pxe_bridge} 2>&1 | grep -i 'No such device'; then
241   echo "${blue}PXE bridge detected. Removing...${reset}"
242   link_state=$(ip link show ${pxe_bridge} | grep -oP 'state \K[^ ]+')
243   if [[ ${link_state} != 'DOWN' ]]; then
244     ip link set dev ${pxe_bridge} down
245     sleep 5
246     link_state=$(ip link show ${pxe_bridge} | grep -oP 'state \K[^ ]+')
247     if [[ ${link_state} != 'DOWN' ]]; then
248       echo "${red}Could not bring DOWN bridge ${pxe_bridge} link state is ${link_state}${reset}"
249       exit 1
250     fi
251   fi
252   brctl delbr ${pxe_bridge}
253   if ifconfig | grep ${pxe_bridge} || brctl show | grep ${pxe_bridge}; then
254     echo "${red}Error trying to remove ${pxe_bridge}${reset}"
255     exit 1
256   else
257     echo "${blue}PXE bridge ${pxe_bridge} removed${reset}"
258   fi
259 else
260   echo "${blue}PXE bridge ${pxe_bridge} does not exist${reset}"
261 fi