summaryrefslogtreecommitdiffstats
path: root/common/ci/setup.sh
blob: 82fede46e692e518aaa0de1a16feee76cdccb893 (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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
#!/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'
##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 is UP
check_interface() {
  if [ -z $1 ]; then
    echo "${red}Cannot bring UP, No interface specified${reset}"
    exit 1
  fi
  local interface=$1
  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
}

setup_pxe_bridge() {
  #Check whether private interface exists
  echo "${blue}Checking whether private interface ${private_interface} exists${reset}"
  if ! ip link show ${private_interface}; then
    echo "${red}Private interface ${private_interface} does not exists!${reset}"
    exit 1
  else
    echo "${green}OK!${reset}"
  fi

  #Check whether private interface is UP
  check_interface ${private_interface}

  pxe_vid=0
  pxe_interface="${private_interface}.${pxe_vid}"

  #Check whether VLAN 0 (PXE) interface exists
  echo "${blue}Checking whether VLAN 0 (PXE) interface ${pxe_interface} exists${reset}"
  if ! ip link show ${pxe_interface}; then
    echo "${blue}Creating  VLAN 0 (PXE) interface ${pxe_interface}${reset}"
    ip link add link ${private_interface} name ${pxe_interface} type vlan id ${pxe_vid}
  else
    echo "${green}OK!${reset}"
  fi

  #Check whether VLAN 0 (PXE) interface is UP
  check_interface ${pxe_interface}

  #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 ${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 public interface exists
  echo "${blue}Checking whether public interface ${public_interface} exists${reset}"
  if ! ip link show ${public_interface}; then
    echo "${red}Public interface ${public_interface} does not exists!${reset}"
    exit 1
  else
    echo "${green}OK!${reset}"
  fi

  #Check whether public interface ${public_interface} is UP
  check_interface ${public_interface}

  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
}
##END FUNCTIONS

main() {
  install_qemu_kvm
  install_libvirt
  load_kvm_kernel_mod
  start_libvirtd_service
  setup_pxe_bridge
  check_access_enabled_to_public_network
}

main "$@"