Merge "Removing sdn_l3 and _l2 scenario features"
[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   local libvirt_imgs=/var/lib/libvirt/images
15   if ! virsh list --all | grep undercloud > /dev/null; then
16       undercloud_nets="default admin"
17       if [[ $enabled_network_list =~ "external" ]]; then
18         undercloud_nets+=" external"
19       fi
20       define_vm undercloud hd 30 "$undercloud_nets" 4 12288
21
22       ### this doesn't work for some reason I was getting hangup events so using cp instead
23       #virsh vol-upload --pool default --vol undercloud.qcow2 --file $BASE/stack/undercloud.qcow2
24       #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)
25       #2015-12-05 12:57:20.569+0000: 8755: warning : virKeepAliveTimerInternal:143 : No response from client 0x7ff1e231e630 after 6 keepalive messages in 35 seconds
26       #2015-12-05 12:57:20.569+0000: 8756: warning : virKeepAliveTimerInternal:143 : No response from client 0x7ff1e231e630 after 6 keepalive messages in 35 seconds
27       #error: cannot close volume undercloud.qcow2
28       #error: internal error: received hangup / error event on socket
29       #error: Reconnected to the hypervisor
30
31       cp -f $IMAGES/undercloud.qcow2 $libvirt_imgs/undercloud.qcow2
32       cp -f $IMAGES/overcloud-full.vmlinuz $libvirt_imgs/overcloud-full.vmlinuz
33       cp -f $IMAGES/overcloud-full.initrd $libvirt_imgs/overcloud-full.initrd
34
35       # resize Undercloud machine
36       echo "Checking if Undercloud needs to be resized..."
37       undercloud_size=$(LIBGUESTFS_BACKEND=direct virt-filesystems --long -h --all -a $libvirt_imgs/undercloud.qcow2 |grep device | grep -Eo "[0-9\.]+G" | sed -n 's/\([0-9][0-9]*\).*/\1/p')
38       if [ "$undercloud_size" -lt 30 ]; then
39         qemu-img resize /var/lib/libvirt/images/undercloud.qcow2 +25G
40         LIBGUESTFS_BACKEND=direct virt-resize --expand /dev/sda1 $IMAGES/undercloud.qcow2 $libvirt_imgs/undercloud.qcow2
41         LIBGUESTFS_BACKEND=direct virt-customize -a $libvirt_imgs/undercloud.qcow2 --run-command 'xfs_growfs -d /dev/sda1 || true'
42         new_size=$(LIBGUESTFS_BACKEND=direct virt-filesystems --long -h --all -a $libvirt_imgs/undercloud.qcow2 |grep filesystem | grep -Eo "[0-9\.]+G" | sed -n 's/\([0-9][0-9]*\).*/\1/p')
43         if [ "$new_size" -lt 30 ]; then
44           echo "Error resizing Undercloud machine, disk size is ${new_size}"
45           exit 1
46         else
47           echo "Undercloud successfully resized"
48         fi
49       else
50         echo "Skipped Undercloud resize, upstream is large enough"
51       fi
52
53   else
54       echo "Found existing Undercloud VM, exiting."
55       exit 1
56   fi
57
58   # if the VM is not running update the authkeys and start it
59   if ! virsh list | grep undercloud > /dev/null; then
60     if [ "$debug" == 'TRUE' ]; then
61       LIBGUESTFS_BACKEND=direct virt-customize -a $libvirt_imgs/undercloud.qcow2 --root-password password:opnfvapex
62     fi
63
64     echo "Injecting ssh key to Undercloud VM"
65     LIBGUESTFS_BACKEND=direct virt-customize -a $libvirt_imgs/undercloud.qcow2 --run-command "mkdir -p /root/.ssh/" \
66         --upload ~/.ssh/id_rsa.pub:/root/.ssh/authorized_keys \
67         --run-command "chmod 600 /root/.ssh/authorized_keys && restorecon /root/.ssh/authorized_keys" \
68         --run-command "cp /root/.ssh/authorized_keys /home/stack/.ssh/" \
69         --run-command "chown stack:stack /home/stack/.ssh/authorized_keys && chmod 600 /home/stack/.ssh/authorized_keys"
70     virsh start undercloud
71     virsh autostart undercloud
72   fi
73
74   sleep 10 # let undercloud get started up
75
76   # get the undercloud VM IP
77   CNT=10
78   echo -n "${blue}Waiting for Undercloud's dhcp address${reset}"
79   undercloud_mac=$(virsh domiflist undercloud | grep default | awk '{ print $5 }')
80   while ! $(arp -en | grep ${undercloud_mac} > /dev/null) && [ $CNT -gt 0 ]; do
81       echo -n "."
82       sleep 10
83       CNT=$((CNT-1))
84   done
85   UNDERCLOUD=$(arp -en | grep ${undercloud_mac} | awk {'print $1'})
86
87   if [ -z "$UNDERCLOUD" ]; then
88     echo "\n\nCan't get IP for Undercloud. Can Not Continue."
89     exit 1
90   else
91      echo -e "${blue}\rUndercloud VM has IP $UNDERCLOUD${reset}"
92   fi
93
94   CNT=10
95   echo -en "${blue}\rValidating Undercloud VM connectivity${reset}"
96   while ! ping -c 1 $UNDERCLOUD > /dev/null && [ $CNT -gt 0 ]; do
97       echo -n "."
98       sleep 3
99       CNT=$((CNT-1))
100   done
101   if [ "$CNT" -eq 0 ]; then
102       echo "Failed to contact Undercloud. Can Not Continue"
103       exit 1
104   fi
105   CNT=10
106   while ! ssh -T ${SSH_OPTIONS[@]} "root@$UNDERCLOUD" "echo ''" 2>&1> /dev/null && [ $CNT -gt 0 ]; do
107       echo -n "."
108       sleep 3
109       CNT=$((CNT-1))
110   done
111   if [ "$CNT" -eq 0 ]; then
112       echo "Failed to connect to Undercloud. Can Not Continue"
113       exit 1
114   fi
115
116   # extra space to overwrite the previous connectivity output
117   echo -e "${blue}\r                                                                 ${reset}"
118   sleep 1
119
120   # ensure stack user on Undercloud machine has an ssh key
121   ssh -T ${SSH_OPTIONS[@]} "stack@$UNDERCLOUD" "if [ ! -e ~/.ssh/id_rsa.pub ]; then ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa; fi"
122
123   # ssh key fix for stack user
124   ssh -T ${SSH_OPTIONS[@]} "root@$UNDERCLOUD" "restorecon -r /home/stack"
125 }
126
127 ##Copy over the glance images and instackenv json file
128 ##params: none
129 function configure_undercloud {
130   local controller_nic_template compute_nic_template
131   echo
132   echo "Copying configuration files to Undercloud"
133   echo -e "${blue}Network Environment set for Deployment: ${reset}"
134   cat $APEX_TMP_DIR/network-environment.yaml
135   scp ${SSH_OPTIONS[@]} $APEX_TMP_DIR/network-environment.yaml "stack@$UNDERCLOUD":
136
137   # check for ODL L3/ONOS
138   if [ "${deploy_options_array['dataplane']}" == 'fdio' ]; then
139     ext_net_type=vpp_interface
140   else
141     ext_net_type=br-ex
142   fi
143
144   if [ "${deploy_options_array['dataplane']}" == 'ovs_dpdk' ]; then
145     ovs_dpdk_bridge='br-phy'
146   else
147     ovs_dpdk_bridge=''
148   fi
149
150   if ! controller_nic_template=$(python3 -B $LIB/python/apex_python_utils.py nic-template -r controller -s $NETSETS -t $BASE/nics-template.yaml.jinja2 -e "br-ex" --deploy-settings-file $DEPLOY_SETTINGS_FILE); then
151     echo -e "${red}ERROR: Failed to generate controller NIC heat template ${reset}"
152     exit 1
153   fi
154
155   if ! compute_nic_template=$(python3 -B $LIB/python/apex_python_utils.py nic-template -r compute -s $NETSETS -t $BASE/nics-template.yaml.jinja2 -e $ext_net_type -d "$ovs_dpdk_bridge" --deploy-settings-file $DEPLOY_SETTINGS_FILE); then
156     echo -e "${red}ERROR: Failed to generate compute NIC heat template ${reset}"
157     exit 1
158   fi
159   ssh -T ${SSH_OPTIONS[@]} "stack@$UNDERCLOUD" << EOI
160 mkdir nics/
161 cat > nics/controller.yaml << EOF
162 $controller_nic_template
163 EOF
164 cat > nics/compute.yaml << EOF
165 $compute_nic_template
166 EOF
167 EOI
168
169   # disable requiretty for sudo
170   ssh -T ${SSH_OPTIONS[@]} "root@$UNDERCLOUD" "sed -i 's/Defaults\s*requiretty//'" /etc/sudoers
171
172   # configure undercloud on Undercloud VM
173   echo "Running undercloud installation and configuration."
174   echo "Logging undercloud installation to stack@undercloud:/home/stack/apex-undercloud-install.log"
175   ssh -T ${SSH_OPTIONS[@]} "stack@$UNDERCLOUD" << EOI
176 openstack-config --set undercloud.conf DEFAULT local_ip ${admin_installer_vm_ip}/${admin_cidr##*/}
177 openstack-config --set undercloud.conf DEFAULT network_gateway ${admin_installer_vm_ip}
178 openstack-config --set undercloud.conf DEFAULT network_cidr ${admin_cidr}
179 openstack-config --set undercloud.conf DEFAULT dhcp_start ${admin_dhcp_range%%,*}
180 openstack-config --set undercloud.conf DEFAULT dhcp_end ${admin_dhcp_range##*,}
181 openstack-config --set undercloud.conf DEFAULT inspection_iprange ${admin_introspection_range}
182 openstack-config --set undercloud.conf DEFAULT undercloud_debug false
183 openstack-config --set undercloud.conf DEFAULT undercloud_hostname "undercloud.${domain_name}"
184 openstack-config --set undercloud.conf DEFAULT enable_ui false
185 openstack-config --set undercloud.conf DEFAULT undercloud_update_packages false
186 sudo openstack-config --set /etc/ironic/ironic.conf disk_utils iscsi_verify_attempts 30
187 sudo openstack-config --set /etc/ironic/ironic.conf disk_partitioner check_device_max_retries 40
188
189 if [[ -n "${deploy_options_array['ceph_device']}" ]]; then
190     sed -i '/ExtraConfig/a\\    ceph::profile::params::osds: {\\x27${deploy_options_array['ceph_device']}\\x27: {}}' ${ENV_FILE}
191 fi
192
193 sudo sed -i '/CephClusterFSID:/c\\  CephClusterFSID: \\x27$(cat /proc/sys/kernel/random/uuid)\\x27' /usr/share/openstack-tripleo-heat-templates/environments/storage-environment.yaml
194 sudo sed -i '/CephMonKey:/c\\  CephMonKey: \\x27'"\$(ceph-authtool --gen-print-key)"'\\x27' /usr/share/openstack-tripleo-heat-templates/environments/storage-environment.yaml
195 sudo sed -i '/CephAdminKey:/c\\  CephAdminKey: \\x27'"\$(ceph-authtool --gen-print-key)"'\\x27' /usr/share/openstack-tripleo-heat-templates/environments/storage-environment.yaml
196
197 openstack undercloud install &> apex-undercloud-install.log || {
198     # cat the undercloud install log incase it fails
199     echo "ERROR: openstack undercloud install has failed. Dumping Log:"
200     cat apex-undercloud-install.log
201     exit 1
202 }
203
204 # Set nova domain name
205 sudo openstack-config --set /etc/nova/nova.conf DEFAULT dns_domain ${domain_name}
206 sudo openstack-config --set /etc/nova/nova.conf DEFAULT dhcp_domain ${domain_name}
207 sudo systemctl restart openstack-nova-conductor
208 sudo systemctl restart openstack-nova-compute
209 sudo systemctl restart openstack-nova-api
210 sudo systemctl restart openstack-nova-scheduler
211
212 # Set neutron domain name
213 sudo openstack-config --set /etc/neutron/neutron.conf DEFAULT dns_domain ${domain_name}
214 sudo systemctl restart neutron-server
215 sudo systemctl restart neutron-dhcp-agent
216 EOI
217
218 # configure external network
219 if [[ "$enabled_network_list" =~ "external" ]]; then
220   ssh -T ${SSH_OPTIONS[@]} "root@$UNDERCLOUD" << EOI
221 if [[ "$external_installer_vm_vlan" != "native" ]]; then
222   cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-vlan${external_installer_vm_vlan}
223 DEVICE=vlan${external_installer_vm_vlan}
224 ONBOOT=yes
225 DEVICETYPE=ovs
226 TYPE=OVSIntPort
227 BOOTPROTO=static
228 IPADDR=${external_installer_vm_ip}
229 PREFIX=${external_cidr##*/}
230 OVS_BRIDGE=br-ctlplane
231 OVS_OPTIONS="tag=${external_installer_vm_vlan}"
232 EOF
233   ifup vlan${external_installer_vm_vlan}
234 else
235   if ! ip a s eth2 | grep ${external_installer_vm_ip} > /dev/null; then
236       ip a a ${external_installer_vm_ip}/${external_cidr##*/} dev eth2
237       ip link set up dev eth2
238   fi
239 fi
240 EOI
241 fi
242
243 }