FIX for ip link state verification
[genesis.git] / common / ci / setup.sh
1 #!/usr/bin/env bash
2
3 #Script that install prerequisites
4 #author: Szilard Cserey (szilard.cserey@ericsson.com)
5 #
6 #Installs qemu-kvm, libvirt and prepares networking for Fuel VM
7
8 ##VARS
9 reset=`tput sgr0`
10 blue=`tput setaf 4`
11 red=`tput setaf 1`
12 green=`tput setaf 2`
13 interface='enp7s0'
14 pxe_bridge='pxebr'
15 fuel_gw_ip='10.20.0.1/16'
16 ##END VARS
17
18 ##FUNCTIONS
19 ###check whether qemu-kvm is installed, otherwise install it
20 install_qemu_kvm() {
21   echo "${blue}Checking whether qemu-kvm is installed, otherwise install it${reset}"
22   if ! rpm -qa | grep -iE 'qemu-kvm'; then
23     echo "${blue}qemu-kvm is not installed, installing...${reset}"
24     yum -y install qemu-kvm
25   else
26     echo "${green}OK!${reset}"
27   fi
28 }
29
30 ###check whether libvirt is installed, otherwise install it
31 install_libvirt() {
32   echo "${blue}Checking whether libvirt is installed, otherwise install it${reset}"
33   if ! rpm -qa | grep -iE 'libvirt'; then
34     echo "${blue}libvirt is not installed, installing...${reset}"
35     yum -y install libvirt
36   else
37     echo "${green}OK!${reset}"
38   fi
39 }
40
41 ###check whether kvm kernel module is loaded, otherwise load it
42 load_kvm_kernel_mod() {
43   echo "${blue}Checking whether kvm kernel module is loaded, otherwise load it${reset}"
44   if ! lsmod | grep -iE 'kvm'; then
45     if [[ `lscpu | grep 'Vendor ID' | awk 'BEGIN { FS = ":" } ; {print $2}' | tr -d ' '` == 'GenuineIntel' ]]; then
46       echo "${blue}Intel processor identified, loading kernel module kvm-intel${reset}"
47       kernel_mod='kvm-intel'
48       modprobe ${kernel_mod}
49     fi
50     if [[ `lscpu | grep 'Vendor ID' | awk 'BEGIN { FS = ":" } ; {print $2}' | tr -d ' '` == 'AuthenticAMD' ]]; then
51       echo "${blue}AMD processor identified, loading kernel module kvm-amd${reset}"
52       kernel_mod='kvm-amd'
53       modprobe ${kernel_mod}
54     fi
55     if ! lsmod | grep -iE 'kvm'; then
56       echo "${red}Failed to load kernel module ${kernel_mod}!${reset}"
57       exit 1
58     fi
59   else
60     echo "${green}OK!${reset}"
61   fi
62 }
63
64 ###check whether libvirtd service is running otherwise start it
65 start_libvirtd_service() {
66   echo "${blue}Checking whether libvirtd service is running otherwise start it${reset}"
67   if ! sudo systemctl status libvirtd | grep -iE 'active \(running\)'; then
68     echo "${blue}starting libvirtd service${reset}"
69     systemctl start libvirtd
70     if ! sudo systemctl status libvirtd | grep -iE 'active \(running\)'; then
71       echo "${red}Failed to start libvirtd service!${reset}"
72       exit 1
73     fi
74   else
75     echo "${green}OK!${reset}"
76   fi
77 }
78
79 #Check whether interface is UP
80 check_interface() {
81   if [ -z $1 ]; then
82     echo "${red}Cannot bring UP, No interface specified${reset}"
83     exit 1
84   fi
85   local interface=$1
86   echo "${blue}Checking whether interface ${interface} is UP${reset}"
87   link_state=$(ip link show ${interface} | grep -oP 'state \K[^ ]+')
88   if [[ ${link_state} != 'UP' ]]; then
89     echo "${blue}${interface} state is ${link_state}. Bringing it UP!${reset}"
90     ip link set dev ${interface} up
91     sleep 5
92     link_state=$(ip link show ${interface} | grep -oP 'state \K[^ ]+')
93     if [[ ${link_state} == 'DOWN' ]]; then
94       echo "${red}Could not bring UP interface ${interface} link state is ${link_state}${reset}"
95       exit 1
96     fi
97   else
98     echo "${green}OK!${reset}"
99   fi
100 }
101
102 setup_pxe_bridge() {
103   #Check whether base interface exists
104   echo "${blue}Checking whether base interface ${interface} exists${reset}"
105   if ! ip link show ${interface}; then
106     echo "${red}Base interface ${interface} does not exists!${reset}"
107     exit 1
108   else
109     echo "${green}OK!${reset}"
110   fi
111
112   #Check whether base interface is UP
113   check_interface ${interface}
114
115   pxe_vid=0
116   pxe_interface="${interface}.${pxe_vid}"
117
118   #Check whether VLAN 0 (PXE) interface exists
119   echo "${blue}Checking whether VLAN 0 (PXE) interface ${pxe_interface} exists${reset}"
120   if ! ip link show ${pxe_interface}; then
121     echo "${blue}Creating  VLAN 0 (PXE) interface ${pxe_interface}${reset}"
122     ip link add link ${interface} name ${pxe_interface} type vlan id ${pxe_vid}
123   else
124     echo "${green}OK!${reset}"
125   fi
126
127   #Check whether VLAN 0 (PXE) interface is UP
128   check_interface ${pxe_interface}
129
130   #Check whether PXE bridge exists
131   echo "${blue}Checking whether PXE bridge ${pxe_bridge} exists${reset}"
132   if brctl show ${pxe_bridge} 2>&1 | grep 'No such device'; then
133     echo "${blue}Creating PXE bridge ${pxe_bridge}${reset}"
134     brctl addbr ${pxe_bridge}
135   else
136     echo "${green}OK!${reset}"
137   fi
138
139   #Add VLAN 0 (PXE) interface to PXE bridge
140   echo "${blue}Checking whether VLAN 0 (PXE) interface ${pxe_interface} is added to PXE bridge ${pxe_bridge} exists${reset}"
141   if ! brctl show ${pxe_bridge} 2>&1 | grep ${pxe_interface}; then
142     echo "${blue}Adding VLAN 0 (PXE) interface ${pxe_interface} to PXE bridge ${pxe_bridge}${reset}"
143     brctl addif ${pxe_bridge} ${pxe_interface}
144     if ! brctl show ${pxe_bridge} 2>&1 | grep ${pxe_interface}; then
145       echo "${red}Could not add VLAN 0 (PXE) interface ${pxe_interface} to PXE bridge ${pxe_bridge}${reset}"
146       exit 1
147     fi
148   else
149     echo "${green}OK!${reset}"
150   fi
151
152   #Check whether PXE bridge is UP
153   check_interface ${pxe_bridge}
154
155   #Add Fuel Gateway IP Address to PXE bridge
156   echo "${blue}Checking whether Fuel Gateway IP Address ${fuel_gw_ip} is assigned to PXE bridge ${pxe_bridge}${reset}"
157   if ! ip addr show ${pxe_bridge} | grep ${fuel_gw_ip}; then
158     echo "${blue}Adding Fuel Gateway IP Address ${fuel_gw_ip} to PXE bridge ${pxe_bridge}${reset}"
159     sudo ip addr add ${fuel_gw_ip} dev ${pxe_bridge}
160     if ! ip addr show ${pxe_bridge} | grep ${fuel_gw_ip}; then
161       echo "${red}Could not add Fuel Gateway IP Address ${fuel_gw_ip} to PXE bridge ${pxe_bridge}${reset}"
162       exit 1
163     fi
164   else
165     echo "${green}OK!${reset}"
166   fi
167 }
168 ##END FUNCTIONS
169
170 main() {
171   install_qemu_kvm
172   install_libvirt
173   load_kvm_kernel_mod
174   start_libvirtd_service
175   setup_pxe_bridge
176 }
177
178 main "$@"