Removing --flat and network_isolation variables
[apex.git] / lib / undercloud-functions.sh
1 #!/usr/bin/env bash
2 ##############################################################################
3 # Copyright (c) 2015 Tim Rozet (Red Hat), Dan Radez (Red Hat) and others.
4 #
5 # All rights reserved. This program and the accompanying materials
6 # are made available under the terms of the Apache License, Version 2.0
7 # which accompanies this distribution, and is available at
8 # http://www.apache.org/licenses/LICENSE-2.0
9 ##############################################################################
10
11 ##verify vm exists, an has a dhcp lease assigned to it
12 ##params: none
13 function setup_undercloud_vm {
14   if ! virsh list --all | grep undercloud > /dev/null; then
15       undercloud_nets="default admin"
16       if [[ $enabled_network_list =~ "external" ]]; then
17         undercloud_nets+=" external"
18       fi
19       define_vm undercloud hd 30 "$undercloud_nets" 4 12288
20
21       ### this doesn't work for some reason I was getting hangup events so using cp instead
22       #virsh vol-upload --pool default --vol undercloud.qcow2 --file $CONFIG/stack/undercloud.qcow2
23       #2015-12-05 12:57:20.569+0000: 8755: info : libvirt version: 1.2.8, package: 16.el7_1.5 (CentOS BuildSystem <http://bugs.centos.org>, 2015-11-03-13:56:46, worker1.bsys.centos.org)
24       #2015-12-05 12:57:20.569+0000: 8755: warning : virKeepAliveTimerInternal:143 : No response from client 0x7ff1e231e630 after 6 keepalive messages in 35 seconds
25       #2015-12-05 12:57:20.569+0000: 8756: warning : virKeepAliveTimerInternal:143 : No response from client 0x7ff1e231e630 after 6 keepalive messages in 35 seconds
26       #error: cannot close volume undercloud.qcow2
27       #error: internal error: received hangup / error event on socket
28       #error: Reconnected to the hypervisor
29
30       local undercloud_dst=/var/lib/libvirt/images/undercloud.qcow2
31       cp -f $RESOURCES/undercloud.qcow2 $undercloud_dst
32
33       # resize Undercloud machine
34       echo "Checking if Undercloud needs to be resized..."
35       undercloud_size=$(LIBGUESTFS_BACKEND=direct virt-filesystems --long -h --all -a $undercloud_dst |grep device | grep -Eo "[0-9\.]+G" | sed -n 's/\([0-9][0-9]*\).*/\1/p')
36       if [ "$undercloud_size" -lt 30 ]; then
37         qemu-img resize /var/lib/libvirt/images/undercloud.qcow2 +25G
38         LIBGUESTFS_BACKEND=direct virt-resize --expand /dev/sda1 $RESOURCES/undercloud.qcow2 $undercloud_dst
39         LIBGUESTFS_BACKEND=direct virt-customize -a $undercloud_dst --run-command 'xfs_growfs -d /dev/sda1 || true'
40         new_size=$(LIBGUESTFS_BACKEND=direct virt-filesystems --long -h --all -a $undercloud_dst |grep filesystem | grep -Eo "[0-9\.]+G" | sed -n 's/\([0-9][0-9]*\).*/\1/p')
41         if [ "$new_size" -lt 30 ]; then
42           echo "Error resizing Undercloud machine, disk size is ${new_size}"
43           exit 1
44         else
45           echo "Undercloud successfully resized"
46         fi
47       else
48         echo "Skipped Undercloud resize, upstream is large enough"
49       fi
50
51   else
52       echo "Found existing Undercloud VM, exiting."
53       exit 1
54   fi
55
56   # if the VM is not running update the authkeys and start it
57   if ! virsh list | grep undercloud > /dev/null; then
58     echo "Injecting ssh key to Undercloud VM"
59     LIBGUESTFS_BACKEND=direct virt-customize -a $undercloud_dst --run-command "mkdir -p /root/.ssh/" \
60         --upload ~/.ssh/id_rsa.pub:/root/.ssh/authorized_keys \
61         --run-command "chmod 600 /root/.ssh/authorized_keys && restorecon /root/.ssh/authorized_keys" \
62         --run-command "cp /root/.ssh/authorized_keys /home/stack/.ssh/" \
63         --run-command "chown stack:stack /home/stack/.ssh/authorized_keys && chmod 600 /home/stack/.ssh/authorized_keys"
64     virsh start undercloud
65   fi
66
67   sleep 10 # let undercloud get started up
68
69   # get the undercloud VM IP
70   CNT=10
71   echo -n "${blue}Waiting for Undercloud's dhcp address${reset}"
72   undercloud_mac=$(virsh domiflist undercloud | grep default | awk '{ print $5 }')
73   while ! $(arp -e | grep ${undercloud_mac} > /dev/null) && [ $CNT -gt 0 ]; do
74       echo -n "."
75       sleep 10
76       CNT=$((CNT-1))
77   done
78   UNDERCLOUD=$(arp -e | grep ${undercloud_mac} | awk {'print $1'})
79
80   if [ -z "$UNDERCLOUD" ]; then
81     echo "\n\nCan't get IP for Undercloud. Can Not Continue."
82     exit 1
83   else
84      echo -e "${blue}\rUndercloud VM has IP $UNDERCLOUD${reset}"
85   fi
86
87   CNT=10
88   echo -en "${blue}\rValidating Undercloud VM connectivity${reset}"
89   while ! ping -c 1 $UNDERCLOUD > /dev/null && [ $CNT -gt 0 ]; do
90       echo -n "."
91       sleep 3
92       CNT=$((CNT-1))
93   done
94   if [ "$CNT" -eq 0 ]; then
95       echo "Failed to contact Undercloud. Can Not Continue"
96       exit 1
97   fi
98   CNT=10
99   while ! ssh -T ${SSH_OPTIONS[@]} "root@$UNDERCLOUD" "echo ''" 2>&1> /dev/null && [ $CNT -gt 0 ]; do
100       echo -n "."
101       sleep 3
102       CNT=$((CNT-1))
103   done
104   if [ "$CNT" -eq 0 ]; then
105       echo "Failed to connect to Undercloud. Can Not Continue"
106       exit 1
107   fi
108
109   # extra space to overwrite the previous connectivity output
110   echo -e "${blue}\r                                                                 ${reset}"
111   sleep 1
112
113   # ssh key fix for stack user
114   ssh -T ${SSH_OPTIONS[@]} "root@$UNDERCLOUD" "restorecon -r /home/stack"
115 }
116
117 ##Copy over the glance images and instackenv json file
118 ##params: none
119 function configure_undercloud {
120   local controller_nic_template compute_nic_template
121   echo
122   echo "Copying configuration files to Undercloud"
123   echo -e "${blue}Network Environment set for Deployment: ${reset}"
124   cat $APEX_TMP_DIR/network-environment.yaml
125   scp ${SSH_OPTIONS[@]} $APEX_TMP_DIR/network-environment.yaml "stack@$UNDERCLOUD":
126
127   # check for ODL L3/ONOS
128   if [ "${deploy_options_array['sdn_l3']}" == 'True' ]; then
129     ext_net_type=br-ex
130   fi
131
132   if [ "${deploy_options_array['dataplane']}" == 'ovs_dpdk' ]; then
133     ovs_dpdk_bridge='br-phy'
134   else
135     ovs_dpdk_bridge=''
136   fi
137
138   if ! controller_nic_template=$(python3 -B $LIB/python/apex_python_utils.py nic-template -r controller -s $NETSETS -t $CONFIG/nics-template.yaml.jinja2 -e "br-ex"); then
139     echo -e "${red}ERROR: Failed to generate controller NIC heat template ${reset}"
140     exit 1
141   fi
142
143   if ! compute_nic_template=$(python3 -B $LIB/python/apex_python_utils.py nic-template -r compute -s $NETSETS -t $CONFIG/nics-template.yaml.jinja2 -e $ext_net_type -d "$ovs_dpdk_bridge"); then
144     echo -e "${red}ERROR: Failed to generate compute NIC heat template ${reset}"
145     exit 1
146   fi
147   ssh -T ${SSH_OPTIONS[@]} "stack@$UNDERCLOUD" << EOI
148 mkdir nics/
149 cat > nics/controller.yaml << EOF
150 $controller_nic_template
151 EOF
152 cat > nics/compute.yaml << EOF
153 $compute_nic_template
154 EOF
155 EOI
156
157   # ensure stack user on Undercloud machine has an ssh key
158   ssh -T ${SSH_OPTIONS[@]} "stack@$UNDERCLOUD" "if [ ! -e ~/.ssh/id_rsa.pub ]; then ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa; fi"
159
160   if [ "$virtual" == "TRUE" ]; then
161
162       # copy the Undercloud VM's stack user's pub key to
163       # root's auth keys so that Undercloud can control
164       # vm power on the hypervisor
165       ssh ${SSH_OPTIONS[@]} "stack@$UNDERCLOUD" "cat /home/stack/.ssh/id_rsa.pub" >> /root/.ssh/authorized_keys
166   fi
167
168   # allow stack to control power management on the hypervisor via sshkey
169   # only if this is a virtual deployment
170   if [ "$virtual" == "TRUE" ]; then
171       ssh -T ${SSH_OPTIONS[@]} "stack@$UNDERCLOUD" <<EOI
172 while read -r line; do
173   stack_key=\${stack_key}\\\\\\\\n\${line}
174 done < <(cat ~/.ssh/id_rsa)
175 stack_key=\$(echo \$stack_key | sed 's/\\\\\\\\n//')
176 sed -i 's~INSERT_STACK_USER_PRIV_KEY~'"\$stack_key"'~' instackenv.json
177 EOI
178   fi
179
180   # copy stack's ssh key to this users authorized keys
181   ssh -T ${SSH_OPTIONS[@]} "root@$UNDERCLOUD" "cat /home/stack/.ssh/id_rsa.pub" >> ~/.ssh/authorized_keys
182
183   # disable requiretty for sudo
184   ssh -T ${SSH_OPTIONS[@]} "root@$UNDERCLOUD" "sed -i 's/Defaults\s*requiretty//'" /etc/sudoers
185
186   # configure undercloud on Undercloud VM
187   echo "Running undercloud configuration."
188   echo "Logging undercloud configuration to undercloud:/home/stack/apex-undercloud-install.log"
189   ssh -T ${SSH_OPTIONS[@]} "stack@$UNDERCLOUD" << EOI
190 sed -i 's/#local_ip/local_ip/' undercloud.conf
191 sed -i 's/#network_gateway/network_gateway/' undercloud.conf
192 sed -i 's/#network_cidr/network_cidr/' undercloud.conf
193 sed -i 's/#dhcp_start/dhcp_start/' undercloud.conf
194 sed -i 's/#dhcp_end/dhcp_end/' undercloud.conf
195 sed -i 's/#inspection_iprange/inspection_iprange/' undercloud.conf
196 sed -i 's/#undercloud_debug/undercloud_debug/' undercloud.conf
197
198 openstack-config --set undercloud.conf DEFAULT local_ip ${admin_installer_vm_ip}/${admin_cidr##*/}
199 openstack-config --set undercloud.conf DEFAULT network_gateway ${admin_installer_vm_ip}
200 openstack-config --set undercloud.conf DEFAULT network_cidr ${admin_cidr}
201 openstack-config --set undercloud.conf DEFAULT dhcp_start ${admin_dhcp_range%%,*}
202 openstack-config --set undercloud.conf DEFAULT dhcp_end ${admin_dhcp_range##*,}
203 openstack-config --set undercloud.conf DEFAULT inspection_iprange ${admin_introspection_range}
204 openstack-config --set undercloud.conf DEFAULT undercloud_debug false
205 openstack-config --set undercloud.conf DEFAULT undercloud_hostname "undercloud.${domain_name}"
206 sudo openstack-config --set /etc/ironic/ironic.conf disk_utils iscsi_verify_attempts 30
207 sudo openstack-config --set /etc/ironic/ironic.conf disk_partitioner check_device_max_retries 40
208
209 sudo sed -i '/CephClusterFSID:/c\\  CephClusterFSID: \\x27$(cat /proc/sys/kernel/random/uuid)\\x27' /usr/share/openstack-tripleo-heat-templates/environments/storage-environment.yaml
210 sudo sed -i '/CephMonKey:/c\\  CephMonKey: \\x27'"\$(ceph-authtool --gen-print-key)"'\\x27' /usr/share/openstack-tripleo-heat-templates/environments/storage-environment.yaml
211 sudo sed -i '/CephAdminKey:/c\\  CephAdminKey: \\x27'"\$(ceph-authtool --gen-print-key)"'\\x27' /usr/share/openstack-tripleo-heat-templates/environments/storage-environment.yaml
212
213 # we assume that packages will not need to be updated with undercloud install
214 # and that it will be used only to configure the undercloud
215 # packages updates would need to be handled manually with yum update
216 sudo cp -f /usr/share/diskimage-builder/elements/yum/bin/install-packages /usr/share/diskimage-builder/elements/yum/bin/install-packages.bak
217 cat << 'EOF' | sudo tee /usr/share/diskimage-builder/elements/yum/bin/install-packages > /dev/null
218 #!/bin/sh
219 exit 0
220 EOF
221
222 openstack undercloud install &> apex-undercloud-install.log || {
223     # cat the undercloud install log incase it fails
224     echo "ERROR: openstack undercloud install has failed. Dumping Log:"
225     cat apex-undercloud-install.log
226     exit 1
227 }
228
229 sleep 30
230 sudo systemctl restart openstack-glance-api
231 # Set nova domain name
232 sudo openstack-config --set /etc/nova/nova.conf DEFAULT dns_domain ${domain_name}
233 sudo openstack-config --set /etc/nova/nova.conf DEFAULT dhcp_domain ${domain_name}
234 sudo systemctl restart openstack-nova-conductor
235 sudo systemctl restart openstack-nova-compute
236 sudo systemctl restart openstack-nova-api
237 sudo systemctl restart openstack-nova-scheduler
238
239 # Set neutron domain name
240 sudo openstack-config --set /etc/neutron/neutron.conf DEFAULT dns_domain ${domain_name}
241 sudo systemctl restart neutron-server
242 sudo systemctl restart neutron-dhcp-agent
243
244 sudo sed -i '/num_engine_workers/c\num_engine_workers = 2' /etc/heat/heat.conf
245 sudo sed -i '/#workers\s=/c\workers = 2' /etc/heat/heat.conf
246 sudo systemctl restart openstack-heat-engine
247 sudo systemctl restart openstack-heat-api
248 EOI
249
250 # configure external network
251   ssh -T ${SSH_OPTIONS[@]} "root@$UNDERCLOUD" << EOI
252 if [[ "$external_installer_vm_vlan" != "native" ]]; then
253   cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-vlan${external_installer_vm_vlan}
254 DEVICE=vlan${external_installer_vm_vlan}
255 ONBOOT=yes
256 DEVICETYPE=ovs
257 TYPE=OVSIntPort
258 BOOTPROTO=static
259 IPADDR=${external_installer_vm_ip}
260 PREFIX=${external_cidr##*/}
261 OVS_BRIDGE=br-ctlplane
262 OVS_OPTIONS="tag=${external_installer_vm_vlan}"
263 EOF
264   ifup vlan${external_installer_vm_vlan}
265 else
266   if ! ip a s eth2 | grep ${external_installer_vm_ip} > /dev/null; then
267       ip a a ${external_installer_vm_ip}/${external_cidr##*/} dev eth2
268       ip link set up dev eth2
269   fi
270 fi
271 EOI
272
273 # WORKAROUND: must restart the above services to fix sync problem with nova compute manager
274 # TODO: revisit and file a bug if necessary. This should eventually be removed
275 # as well as glance api problem
276 echo -e "${blue}INFO: Sleeping 15 seconds while services come back from restart${reset}"
277 sleep 15
278
279 }