Fixes and updates for clean.sh and setup.sh
[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 private_interface='enp6s0'
14 public_interface='enp8s0'
15 pxe_bridge='pxebr'
16 fuel_gw_ip='10.20.0.1/16'
17 management_vid=300
18 management_interface="${private_interface}.${management_vid}"
19 ##END VARS
20
21 ##FUNCTIONS
22 ###check whether qemu-kvm is installed, otherwise install it
23 install_qemu_kvm() {
24   echo "${blue}Checking whether qemu-kvm is installed, otherwise install it${reset}"
25   if ! rpm -qa | grep -iE 'qemu-kvm'; then
26     echo "${blue}qemu-kvm is not installed, installing...${reset}"
27     yum -y install qemu-kvm
28   else
29     echo "${green}OK!${reset}"
30   fi
31 }
32
33 ###check whether libvirt is installed, otherwise install it
34 install_libvirt() {
35   echo "${blue}Checking whether libvirt is installed, otherwise install it${reset}"
36   if ! rpm -qa | grep -iE 'libvirt'; then
37     echo "${blue}libvirt is not installed, installing...${reset}"
38     yum -y install libvirt
39   else
40     echo "${green}OK!${reset}"
41   fi
42 }
43
44 ###check whether kvm kernel module is loaded, otherwise load it
45 load_kvm_kernel_mod() {
46   echo "${blue}Checking whether kvm kernel module is loaded, otherwise load it${reset}"
47   if ! lsmod | grep -iE 'kvm'; then
48     if [[ `lscpu | grep 'Vendor ID' | awk 'BEGIN { FS = ":" } ; {print $2}' | tr -d ' '` == 'GenuineIntel' ]]; then
49       echo "${blue}Intel processor identified, loading kernel module kvm-intel${reset}"
50       kernel_mod='kvm-intel'
51       modprobe ${kernel_mod}
52     fi
53     if [[ `lscpu | grep 'Vendor ID' | awk 'BEGIN { FS = ":" } ; {print $2}' | tr -d ' '` == 'AuthenticAMD' ]]; then
54       echo "${blue}AMD processor identified, loading kernel module kvm-amd${reset}"
55       kernel_mod='kvm-amd'
56       modprobe ${kernel_mod}
57     fi
58     if ! lsmod | grep -iE 'kvm'; then
59       echo "${red}Failed to load kernel module ${kernel_mod}!${reset}"
60       exit 1
61     fi
62   else
63     echo "${green}OK!${reset}"
64   fi
65 }
66
67 ###check whether libvirtd service is running otherwise start it
68 start_libvirtd_service() {
69   echo "${blue}Checking whether libvirtd service is running otherwise start it${reset}"
70   if ! sudo systemctl status libvirtd | grep -iE 'active \(running\)'; then
71     echo "${blue}starting libvirtd service${reset}"
72     systemctl start libvirtd
73     if ! sudo systemctl status libvirtd | grep -iE 'active \(running\)'; then
74       echo "${red}Failed to start libvirtd service!${reset}"
75       exit 1
76     fi
77   else
78     echo "${green}OK!${reset}"
79   fi
80 }
81
82
83 #Check whether interface exists
84 check_interface_exists() {
85   if [ -z $1 ]; then
86     echo "${red}Cannot check whether interface exists! No interface specified!${reset}"
87     exit 1
88   fi
89   local interface=$1
90   #Check whether interface exists
91   echo "${blue}Checking whether interface ${interface} exists${reset}"
92   if ! ip link show ${interface}; then
93     echo "${red}Interface ${interface} does not exists!${reset}"
94     exit 1
95   else
96     echo "${green}OK!${reset}"
97   fi
98 }
99
100 #Check whether interface is UP
101 check_interface_up() {
102   if [ -z $1 ]; then
103     echo "${red}Cannot check whether interface is UP! No interface specified!${reset}"
104     exit 1
105   fi
106   local interface=$1
107
108   #Check whether interface is UP
109   echo "${blue}Checking whether interface ${interface} is UP${reset}"
110   link_state=$(ip link show ${interface} | grep -oP 'state \K[^ ]+')
111   if [[ ${link_state} != 'UP' ]]; then
112     echo "${blue}${interface} state is ${link_state}. Bringing it UP!${reset}"
113     ip link set dev ${interface} up
114     sleep 5
115     link_state=$(ip link show ${interface} | grep -oP 'state \K[^ ]+')
116     if [[ ${link_state} == 'DOWN' ]]; then
117       echo "${red}Could not bring UP interface ${interface} link state is ${link_state}${reset}"
118       exit 1
119     fi
120   else
121     echo "${green}OK!${reset}"
122   fi
123 }
124
125 #Create VLAN interface
126 create_vlan_interface()  {
127   if [ -z $1 ]; then
128     echo "${red}Cannot create VLAN interface. No base interface specified!${reset}"
129     exit 1
130   fi
131   if [ -z $2 ]; then
132     echo "${red}Cannot create VLAN interface. No VLAN ID specified!${reset}"
133     exit 1
134   fi
135
136   local base_interface=$1
137   local vid=$2
138   local interface="${base_interface}.${vid}"
139
140   echo "${blue}Checking whether VLAN ${vid} interface ${interface} exists, otherwise create it${reset}"
141   if ! ip link show ${interface}; then
142     echo "${blue}Creating  VLAN ${vid} interface ${interface}${reset}"
143     ip link add link ${base_interface} name ${interface} type vlan id ${vid}
144   else
145     echo "${green}OK!${reset}"
146   fi
147
148   #Check whether VLAN interface is UP
149   check_interface_up ${interface}
150 }
151
152 ###setup PXE Bridge
153 setup_pxe_bridge() {
154   pxe_vid=0
155   pxe_interface="${private_interface}.${pxe_vid}"
156   #Check whether VLAN 0 (PXE) interface exists, otherwise create it
157   create_vlan_interface ${private_interface} ${pxe_vid}
158
159   #Check whether PXE bridge exists
160   echo "${blue}Checking whether PXE bridge ${pxe_bridge} exists${reset}"
161   if brctl show ${pxe_bridge} 2>&1 | grep 'No such device'; then
162     echo "${blue}Creating PXE bridge ${pxe_bridge}${reset}"
163     brctl addbr ${pxe_bridge}
164   else
165     echo "${green}OK!${reset}"
166   fi
167
168   #Add VLAN 0 (PXE) interface to PXE bridge
169   echo "${blue}Checking whether VLAN 0 (PXE) interface ${pxe_interface} is added to PXE bridge ${pxe_bridge} exists${reset}"
170   if ! brctl show ${pxe_bridge} 2>&1 | grep ${pxe_interface}; then
171     echo "${blue}Adding VLAN 0 (PXE) interface ${pxe_interface} to PXE bridge ${pxe_bridge}${reset}"
172     brctl addif ${pxe_bridge} ${pxe_interface}
173     if ! brctl show ${pxe_bridge} 2>&1 | grep ${pxe_interface}; then
174       echo "${red}Could not add VLAN 0 (PXE) interface ${pxe_interface} to PXE bridge ${pxe_bridge}${reset}"
175       exit 1
176     fi
177   else
178     echo "${green}OK!${reset}"
179   fi
180
181   #Check whether PXE bridge is UP
182   check_interface_up ${pxe_bridge}
183
184   #Add Fuel Gateway IP Address to PXE bridge
185   echo "${blue}Checking whether Fuel Gateway IP Address ${fuel_gw_ip} is assigned to PXE bridge ${pxe_bridge}${reset}"
186   if ! ip addr show ${pxe_bridge} | grep ${fuel_gw_ip}; then
187     echo "${blue}Adding Fuel Gateway IP Address ${fuel_gw_ip} to PXE bridge ${pxe_bridge}${reset}"
188     sudo ip addr add ${fuel_gw_ip} dev ${pxe_bridge}
189     if ! ip addr show ${pxe_bridge} | grep ${fuel_gw_ip}; then
190       echo "${red}Could not add Fuel Gateway IP Address ${fuel_gw_ip} to PXE bridge ${pxe_bridge}${reset}"
191       exit 1
192     fi
193   else
194     echo "${green}OK!${reset}"
195   fi
196 }
197
198 ###check whether access to public network is granted
199 check_access_enabled_to_public_network() {
200   #Check whether IP forwarding is enabled
201   echo "${blue}Checking whether IP Forwarding is enabled ${reset}"
202   if ! sysctl net.ipv4.ip_forward | grep "net.ipv4.ip_forward = 1"; then
203     sysctl -w net.ipv4.ip_forward=1
204     if ! sysctl net.ipv4.ip_forward | grep "net.ipv4.ip_forward = 1"; then
205       echo "${red}IP Forwarding could not be enabled!${reset}"
206       exit 1
207     fi
208   else
209     echo "${green}OK!${reset}"
210   fi
211
212   echo "${blue}Checking whether access is granted to public network through interface ${public_interface}${reset}"
213   if ! sudo iptables -t nat -L POSTROUTING -v | grep "MASQUERADE.*${public_interface}.*anywhere.*anywhere"; then
214     echo "${blue}Enable access to public network through interface ${public_interface}${reset}"
215     iptables -t nat -A POSTROUTING -o ${public_interface} -j MASQUERADE
216   else
217     echo "${green}OK!${reset}"
218   fi
219 }
220
221 ###setup Openstack Management Interface
222 create_openstack_management_interface() {
223   #Check whether Openstack Management interface exists, otherwise create it
224   create_vlan_interface ${private_interface} ${management_vid}
225
226   echo "${blue}Moving IP addresses from interface ${private_interface} to VLAN ${management_vid} interface ${management_interface}${reset}"
227   private_interface_ip_addr_list=$(ip addr show ${private_interface} | grep -oP 'inet \K[^ ]+')
228   if [[ ! -z ${private_interface_ip_addr_list} ]]; then
229     echo -e "${blue}Found IP addresses on interface ${private_interface}:\n${private_interface_ip_addr_list}${reset}"
230     for private_interface_ip_addr in ${private_interface_ip_addr_list}
231     do
232       echo "${blue}Removing IP address ${private_interface_ip_addr} from interface ${private_interface}${reset}"
233       ip addr del ${private_interface_ip_addr} dev ${private_interface}
234       if ip addr show ${private_interface} | grep ${private_interface_ip_addr}; then
235         echo "${red}Could not remove IP address ${private_interface_ip_addr} from interface ${private_interface}${reset}"
236         exit 1
237       fi
238       if ! ip addr show ${management_interface} | grep ${private_interface_ip_addr}; then
239         echo "${blue}Adding IP address ${private_interface_ip_addr} to VLAN ${management_vid} interface ${management_interface}${reset}"
240         ip addr add ${private_interface_ip_addr} dev ${management_interface}
241         if ! ip addr show ${management_interface} | grep ${private_interface_ip_addr}; then
242           echo "${red}Could not set IP address ${private_interface_ip_addr} to VLAN ${management_vid} interface ${management_interface}${reset}"
243           exit 1
244         fi
245       else
246         echo "${blue}VLAN ${management_vid} interface ${management_interface} already has assigned to itself this IP address ${private_interface_ip_addr}${reset}"
247       fi
248     done
249   else
250     echo "${red}No IP Address is assigned to interface ${private_interface}, there isn't any IP address to move to interface ${management_interface}${reset}"
251   fi
252 }
253
254 ##END FUNCTIONS
255
256 main() {
257   install_qemu_kvm
258   install_libvirt
259   load_kvm_kernel_mod
260   start_libvirtd_service
261   check_interface_exists ${private_interface}
262   check_interface_up ${private_interface}
263   check_interface_exists ${public_interface}
264   check_interface_up ${public_interface}
265   setup_pxe_bridge
266   check_access_enabled_to_public_network
267   create_openstack_management_interface
268 }
269
270 main "$@"