ac7b507bc5cf4feabfc0db7a3d3de80fa759c277
[apex.git] / lib / virtual-setup-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 ##Create virtual nodes in virsh
12 ##params: vcpus, ramsize
13 function setup_virtual_baremetal {
14   local vcpus ramsize held_ramsize
15   if [ -z "$1" ]; then
16     vcpus=4
17     ramsize=8192
18   elif [ -z "$2" ]; then
19     vcpus=$1
20     ramsize=8192
21   else
22     vcpus=$1
23     ramsize=$(($2*1024))
24   fi
25   #start by generating the opening yaml for the inventory-virt.yaml file
26   cat > $APEX_TMP_DIR/inventory-virt.yaml << EOF
27 nodes:
28 EOF
29
30   # next create the virtual machines and add their definitions to the file
31   if [ "$ha_enabled" == "False" ]; then
32       controller_index=0
33   else
34       controller_index=2
35       # 3 controller + computes
36       # zero based so add 2 to compute count
37       if [ $VM_COMPUTES -lt 2 ]; then
38           VM_COMPUTES=2
39       fi
40   fi
41
42   # tmp var to hold ramsize in case modified during detection
43   held_ramsize=${ramsize}
44   for i in $(seq 0 $(($controller_index+$VM_COMPUTES))); do
45     ramsize=${held_ramsize}
46     if [ $i -gt $controller_index ]; then
47       capability="profile:compute"
48       if [ -n "$VM_COMPUTE_RAM" ]; then
49         ramsize=$((${VM_COMPUTE_RAM}*1024))
50       fi
51     else
52       capability="profile:control"
53       if [[ "${deploy_options_array['sdn_controller']}" == 'opendaylight' && "$ramsize" -lt 10240 ]]; then
54          echo "WARN: RAM per controller too low.  OpenDaylight specified in HA deployment requires at least 10GB"
55          echo "INFO: Increasing RAM per controller to 10GB"
56          ramsize=10240
57       fi
58     fi
59     if ! virsh list --all | grep baremetal${i} > /dev/null; then
60       define_vm baremetal${i} network 41 'admin' $vcpus $ramsize
61       for n in tenant external storage api; do
62         if [[ $enabled_network_list =~ $n ]]; then
63           echo -n "$n "
64           virsh attach-interface --domain baremetal${i} --type network --source $n --model virtio --config
65         fi
66       done
67     else
68       echo "Found baremetal${i} VM, using existing VM"
69     fi
70     #virsh vol-list default | grep baremetal${i} 2>&1> /dev/null || virsh vol-create-as default baremetal${i}.qcow2 41G --format qcow2
71     mac=$(virsh domiflist baremetal${i} | grep admin | awk '{ print $5 }')
72
73     cat >> $APEX_TMP_DIR/inventory-virt.yaml << EOF
74   node${i}:
75     mac_address: "$mac"
76     ipmi_ip: 192.168.122.1
77     ipmi_user: admin
78     ipmi_pass: "password"
79     pm_type: "pxe_ipmitool"
80     pm_port: "623$i"
81     cpu: $vcpus
82     memory: $ramsize
83     disk: 41
84     arch: "x86_64"
85     capabilities: "$capability"
86 EOF
87     vbmc add baremetal$i --port 623$i
88     if service firewalld status > /dev/null; then
89         firewall-cmd --permanent --zone=public --add-port=623$i/udp
90     fi
91     # TODO: add iptables check and commands too
92     vbmc start baremetal$i
93   done
94   if service firewalld status > /dev/null; then
95     firewall-cmd --reload
96   fi
97 }
98
99 ##Create virtual nodes in virsh
100 ##params: name - String: libvirt name for VM
101 ##        bootdev - String: boot device for the VM
102 ##        disksize - Number: size of the disk in GB
103 ##        ovs_bridges: - List: list of ovs bridges
104 ##        vcpus - Number of VCPUs to use (defaults to 4)
105 ##        ramsize - Size of RAM for VM in MB (defaults to 8192)
106 function define_vm () {
107   local vcpus ramsize volume_path direct_boot kernel_args
108
109   if [ -z "$5" ]; then
110     vcpus=4
111     ramsize=8388608
112   elif [ -z "$6" ]; then
113     vcpus=$5
114     ramsize=8388608
115   else
116     vcpus=$5
117     ramsize=$(($6*1024))
118   fi
119
120   # Create the libvirt storage volume
121   if virsh vol-list default | grep ${1}.qcow2 2>&1> /dev/null; then
122     volume_path=$(virsh vol-path --pool default ${1}.qcow2 || echo "/var/lib/libvirt/images/${1}.qcow2")
123     echo "Volume ${1} exists. Deleting Existing Volume $volume_path"
124     virsh vol-dumpxml ${1}.qcow2 --pool default > /dev/null || echo '' #ok for this to fail
125     touch $volume_path
126     virsh vol-delete ${1}.qcow2 --pool default
127   fi
128   virsh vol-create-as default ${1}.qcow2 ${3}G --format qcow2
129   volume_path=$(virsh vol-path --pool default ${1}.qcow2)
130   if [ ! -f $volume_path ]; then
131       echo "$volume_path Not created successfully... Aborting"
132       exit 1
133   fi
134
135   # undercloud need to be direct booted.
136   # the upstream image no longer includes the kernel and initrd
137   if [ "$1" == 'undercloud' ]; then
138       direct_boot='--direct-boot overcloud-full'
139       kernel_args='--kernel-arg console=ttyS0 --kernel-arg root=/dev/sda'
140   fi
141
142   # create the VM
143   $LIB/configure-vm --name $1 \
144                     --bootdev $2 \
145                     --image "$volume_path" \
146                     --diskbus sata \
147                     --arch $(uname -i) \
148                     --cpus $vcpus \
149                     --memory $ramsize \
150                     --libvirt-nic-driver virtio \
151                     $direct_boot \
152                     $kernel_args \
153                     --baremetal-interface $4
154 }