Merge "MNAIO: Make galera startup cleanly when using images"

This commit is contained in:
Zuul 2018-09-02 09:09:44 +00:00 committed by Gerrit Code Review
commit f270afb08c
2 changed files with 83 additions and 6 deletions
multi-node-aio/playbooks

@ -118,11 +118,16 @@
- hostvars[item]['server_vm'] | default(false) | bool
with_items: "{{ groups['pxe_servers'] }}"
# Note (odyssey4me):
# This will only work on a host which has
# libguestfs >= 1.35.2 and >= 1.34.1
# Ubuntu bionic works, but xenial does not (even with UCA).
# ref: https://bugs.launchpad.net/ubuntu/+source/libguestfs/+bug/1615337.
# Note (odyssey4me):
# This will only work on a host which has
# libguestfs >= 1.35.2 and >= 1.34.1
# Ubuntu bionic works, but xenial does not (even with UCA).
# ref: https://bugs.launchpad.net/ubuntu/+source/libguestfs/+bug/1615337.
- name: Prepare file-based disk images
when:
- default_vm_disk_mode == "file"
- vm_use_snapshot | bool
block:
- name: Inject the host ssh key into the VM disk image
command: >-
virt-sysprep
@ -130,10 +135,12 @@
--ssh-inject root:file:/root/.ssh/id_rsa.pub
--add {{ _virt_pools.pools.default.path | default('/data/images') }}/{{ hostvars[item]['server_hostname'] }}.img
when:
- vm_use_snapshot | bool
- hostvars[item]['server_vm'] | default(false) | bool
with_items: "{{ groups['pxe_servers'] }}"
- name: Prepare the galera containers for startup
script: kvm/prepare-image-galera.sh
- name: Wait for guest capabilities to appear
command: "virsh capabilities"
register: virsh_caps

@ -0,0 +1,70 @@
#!/bin/bash -ex
# provide default images to inspect
infra_images="/data/images/infra1.img /data/images/infra2.img /data/images/infra3.img"
# declare an array to map images to container names
declare -A image_map
# declare an array to map container names to uuid's
declare -A uuid_map
# at this stage, no galera container is the master
master_cnt=""
# get the list of galera container names
for img in ${infra_images}; do
image_map[${img}]="$(virt-ls --add ${img} --mount /dev/vmvg00/openstack00 / | grep galera_container)"
done
# get the gvwstate.dat files from the image and
# put it into a local folder using the same name
# as the container
for img in ${infra_images}; do
mkdir -p /tmp/${image_map[$img]}
guestfish --ro --add ${img} --mount /dev/vmvg00/openstack00 glob copy-out /${image_map[$img]}/*.dat /tmp/${image_map[$img]}/
done
# work through the existing gvwstate files
# there may be more than one, so we need to
# find the one holding the view_id
for cnt in $(ls -1 /tmp | grep galera_container); do
gvwstate_path="/tmp/${cnt}/gvwstate.dat"
if [[ -e ${gvwstate_path} ]]; then
my_uuid=$(awk '/^my_uuid:/ { print $2 }' ${gvwstate_path})
view_id=$(awk '/^view_id:/ { print $3 }' ${gvwstate_path})
if [[ "${my_uuid}" == "${view_id}" ]]; then
master_gvwstate_path=${gvwstate_path}
master_cnt=${cnt}
fi
fi
if [[ "${cnt}" == "${master_cnt}" ]]; then
uuid_map[${cnt}]=${my_uuid}
else
uuid_map[${cnt}]=$(uuidgen)
fi
done
# prepare a new master in a temporary location
tmp_gvwstate="/tmp/gvwstate.dat"
cp ${master_gvwstate_path} ${tmp_gvwstate}
member_num=$(awk '/^member: '${my_uuid}'/ {print $3}' ${tmp_gvwstate})
# clear the existing members
sed -i.bak '/^member:/d' ${tmp_gvwstate}
# insert the new set of members
for cnt_uuid in "${uuid_map[@]}"; do
sed -i.bak "/^#vwend$/i \\
member: ${cnt_uuid} ${member_num}" ${tmp_gvwstate}
done
# copy the new version to each location
for cnt in "${!uuid_map[@]}"; do
sed "s/my_uuid: .*/my_uuid: ${uuid_map[$cnt]}/" ${tmp_gvwstate} > /tmp/${cnt}/gvwstate.dat
done
# put the gvwstate.dat files back into the image
for img in ${infra_images}; do
guestfish --rw --add ${img} --mount /dev/vmvg00/openstack00 copy-in /tmp/${image_map[$img]}/gvwstate.dat /${image_map[$img]}/
done