Merge "Fix allows fuel-migrate script work under centos-7."

This commit is contained in:
Jenkins 2015-12-23 00:55:53 +00:00 committed by Gerrit Code Review
commit 7a7c93e8b5
5 changed files with 125 additions and 63 deletions

View File

@ -46,7 +46,7 @@ fd=200
banner_file="c-msg.sh"
prog_name="fuel-migrate"
fuel_migrate_vars=/root/fuel-migrate.var
udev_rule=/etc/udev/rules.d/70-persistent-net.rules
file_lock() {
# create lock file
@ -60,7 +60,6 @@ file_lock() {
echo "Only one instance of $prog_name can run at a time."
return 1
fi
}
@ -179,7 +178,6 @@ create_vm(){
# create disk
ssh "${dkvm_ip}" qemu-img create -f raw "${dkvm_folder}/${fvm_name}.img" "${fvm_disk_size}"
# make template for virsh
IFS=","
cat >/tmp/vm.xml <<EOF
<domain type='kvm'>
<name>${fvm_name}</name>
@ -215,7 +213,11 @@ create_vm(){
${admin_net_b_type}
<model type='virtio'/>
</interface>
$(ifaces $other_net_bridges)
EOF
IFS=","
ifaces ${other_net_bridges} >>/tmp/vm.xml
IFS=" "
cat >>/tmp/vm.xml <<EOF
<input type='mouse' bus='ps2'/>
<graphics type='vnc' autoport='yes' listen='0.0.0.0'/>
<video>
@ -226,7 +228,6 @@ $(ifaces $other_net_bridges)
</devices>
</domain>
EOF
IFS=" "
virsh -c "${dkvm_uri}" define /tmp/vm.xml
virsh -c "${dkvm_uri}" autostart ${fvm_name}
virsh -c "${dkvm_uri}" start ${fvm_name}
@ -269,21 +270,16 @@ mark_dst_disk(){
mk_lvs_fs(){
# to-do get current fuel data
cecho "Create lvm volumes and file-systems"
ssh "${admin_net_ip_bs}" vgcreate os ${dst_disk}4
ssh "${admin_net_ip_bs}" vgcreate os ${dst_disk}5
ssh "${admin_net_ip_bs}" lvcreate os -n root -L ${os_root}
ssh "${admin_net_ip_bs}" lvcreate os -n swap -L ${os_swap}
ssh "${admin_net_ip_bs}" lvcreate os -n var -l${os_var}free
ssh "${admin_net_ip_bs}" lvcreate os -n varlibdocker -l${os_varlibdocker}free
ssh "${admin_net_ip_bs}" lvcreate os -n varlog -l${os_varlog}free
ssh "${admin_net_ip_bs}" "mkfs.ext4 /dev/os/root; mkfs.ext4 /dev/os/var; mkfs.ext4 /dev/os/varlog; mkfs.ext4 /dev/os/varlibdocker; mkswap /dev/os/swap"
ssh "${admin_net_ip_bs}" "mkfs.ext4 /dev/os/root; mkfs.ext4 /dev/os/var; mkfs.ext4 /dev/os/varlog; mkswap /dev/os/swap"
}
rsync_vol(){
cecho "Start syncing $2"
ssh "${admin_net_ip_bs}" "mkdir -p ${s_base}${1};"
@ -292,42 +288,51 @@ rsync_vol(){
time rsync -z -axAHS --numeric-ids ${1}/ $admin_net_ip_bs:${s_base}${1}/
}
rsync_data(){
ddopt="bs=1048576"
# use dd to create small 1:1 partitions to avoid FS issues
dd if="${src_disk}1" | ssh "${admin_net_ip_bs}" "dd of=${dst_disk}1"
dd if="${src_disk}2" | ssh "${admin_net_ip_bs}" "dd of=${dst_disk}2"
dd if="${src_disk}3" | ssh "${admin_net_ip_bs}" "dd of=${dst_disk}3"
dd if="${src_disk}1" ${ddopt} | ssh "${admin_net_ip_bs}" "dd of=${dst_disk}1 ${ddopt}"
dd if="${src_disk}2" ${ddopt} | ssh "${admin_net_ip_bs}" "dd of=${dst_disk}2 ${ddopt}"
dd if="${src_disk}3" ${ddopt} | ssh "${admin_net_ip_bs}" "dd of=${dst_disk}3 ${ddopt}"
dd if="${src_disk}4" ${ddopt} | ssh "${admin_net_ip_bs}" "dd of=${dst_disk}4 ${ddopt}"
rsync_vol / /dev/os/root
rsync_vol /var /dev/os/var
rsync_vol /var/lib/docker /dev/os/varlibdocker
rsync_vol /var/log /dev/os/varlog
}
fix_config(){
cecho "Make grub-loader and fix config files"
# make grub loader
ssh "${admin_net_ip_bs}" "sed -i 's#${src_disk}#${dst_disk}#' ${s_base}/etc/mtab"
ssh "${admin_net_ip_bs}" "mount -o bind /dev/ ${s_base}/dev/"
ssh "${admin_net_ip_bs}" "mount -o bind /proc/ ${s_base}/proc/"
ssh "${admin_net_ip_bs}" "mount ${dst_disk}3 ${s_base}/boot/"
ssh "${admin_net_ip_bs}" "chroot ${s_base} grub-install --recheck ${dst_disk}"
ssh "${admin_net_ip_bs}" "chroot ${s_base} grub2-install ${dst_disk}"
# fix configs
ssh "${admin_net_ip_bs}" "ln -fs /proc/self/mounts ${s_base}/etc/mtab"
ssh "${admin_net_ip_bs}" "sed -i '/HWADDR=/d' ${s_base}/etc/sysconfig/network-scripts/ifcfg-*"
ssh "${admin_net_ip_bs}" "sed -i 's/${admin_net_mac}/${fvm_admin_mac}/' ${s_base}${fuel_astute}"
ssh "${admin_net_ip_bs}" "cp /etc/udev/rules.d/70-persistent-net.rules ${s_base}/etc/udev/rules.d/70-persistent-net.rules"
ssh "${admin_net_ip_bs}" "cat /root/.ssh/authorized_keys >>${s_base}/root/.ssh/authorized_keys"
ssh "${admin_net_ip_bs}" "umount ${s_base}/var/log ${s_base}/var/lib/docker ${s_base}/var ${s_base}/boot ${s_base}/dev ${s_base}" || true
ssh "${admin_net_ip_bs}" "umount ${s_base}/var/log ${s_base}/var ${s_base}/boot ${s_base}/dev ${s_base}/proc ${s_base}" || true
}
fix_udev_rule(){
new_udev_line(){
echo 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="'${1}'", ATTR{type}=="1", KERNEL=="eth*", NAME="'${2}'"'
}
get_if_list(){
virsh -c "${dkvm_uri}" domiflist "${fvm_name}"
}
new_udev_rule(){
# make udev on destination vm use the same network interface name as on source
fvm_admin_mac=$(virsh -c "${dkvm_uri}" domiflist "${fvm_name}" | awk "/vfm_${admin_net_if}/ { print \$5}")
ssh "${admin_net_ip_bs}" "sed -i -e 's/\(${fvm_admin_mac}.* NAME=\"\)[^\"]*\(\".*\)/\1${admin_net_if}\2/' /etc/udev/rules.d/70-persistent-net.rules"
fvm_mac=$(get_if_list | awk -F " " "/vfm_${admin_net_if}/ { print \$5}")
echo "# Generated by fuel-migrate"
new_udev_line "${fvm_mac}" "${admin_net_if}"
until [[ -z $1 ]] ; do
vfm_mac=$(virsh -c "${dkvm_uri}" domiflist "${fvm_name}" | awk "/vfm_$1/ { print \$5}")
ssh "${admin_net_ip_bs}" "sed -i -e 's/\(${vfm_mac}.* NAME=\"\)[^\"]*\(\".*\)/\1${1}\2/' /etc/udev/rules.d/70-persistent-net.rules"
vfm_mac=$(get_if_list | awk -F " " "/vfm_${1}/ {print \$5}")
new_udev_line "${vfm_mac}" ${1}
shift || true
shift || true
shift || true
@ -336,14 +341,13 @@ fix_udev_rule(){
wait_connection(){
te="$(( $(date +%s) + ${1:-300}))"
until ssh $SSHO "${admin_net_ip_bs}" exit 0 ; do
until ssh $SSHO "${2:-${admin_net_ip_bs}}" exit 0 ; do
sleep 2
[[ "${te}" -lt "$(date +%s)" ]] && return 1
done
return 0
}
set_log(){
# keep current console output on file descriptor &6 and redirect stderr and stdout into file
if [[ ! -z "$migrate_log" ]] ; then
@ -362,8 +366,17 @@ timeout(){
return 0
}
# Stub for required umm functionality
umm(){
if [[ "$1" == "on" ]] ; then
/usr/bin/systemctl set-default umm-mg.target
reboot
fi
}
# Stop script execution if script is sourced
[[ "${BASH_SOURCE[0]}" != "${0}" ]] && return
# Show usage if run without parameters.
[[ -z $1 ]] && usage
# Show usage if help is chosen
@ -377,28 +390,14 @@ if [[ "$1" == "start" ]] && [[ -f "$fuel_migrate_vars" ]] ; then
set_log
cecho "Start data sync phase"
mv -f "$fuel_migrate_vars" "${fuel_migrate_vars}.old"
ifup "$admin_net_if"
/etc/init.d/network start
/etc/init.d/sshd start
initctl start tty TTY=/dev/tty2
cecho "You may login from tty2. Switch by Ctr-Alt-F2"
wait_connection 600
wait_connection 60 "${dkvm_ip}"
time rsync_data
fix_config
rm -f /etc/rc3.d/S00fuel_migrate
cecho "Reboot destination VM"
ssh -tt "${admin_net_ip_bs}" "reboot"
cecho "Stop network and up with new settings"
/etc/init.d/network stop
cecho "Source fuelmaster can be obtained by ssh ${admin_net_ip_bs}"
ifconfig "$admin_net_if" "${admin_net_ip_bs}" netmask "$admin_net_nm"
until ssh -tt ${admin_net_ip} ls ; do
timeout || reboot
sleep 20
done
ssh "${admin_net_ip_bs}" "echo 'Not ready'>${s_base}/notready"
fvm_admin_mac=$(get_if_list | awk "/vfm_${admin_net_if}/ { print \$5}")
IFS=","
new_udev_rule ${other_net_bridges} | ssh "${admin_net_ip_bs}" "cat >${s_base}${udev_rule}"
IFS=" "
cat >/tmp/${banner_file} <<EOF
#!/bin/bash
echo "
@ -429,7 +428,7 @@ you may do so by running the following:
If the new Fuel master is not functioning correctly, you may return the
source Fuel master back into an operational state by running:
# ssh ${admin_net_ip_bs} reboot && ssh -tt ${dkvm_ip} virsh destroy ${fvm_name}
# ssh ${admin_net_ip_bs} reboot ; ssh -tt ${dkvm_ip} virsh destroy ${fvm_name}
This command will reboot the source Fuel master and remove the new
Fuel master clone. To prevent IP conflict, this command should be as indicated.
@ -439,12 +438,36 @@ need to reestablish your ssh connection.
"
EOF
chmod +x /tmp/${banner_file}
rsync /tmp/${banner_file} ${admin_net_ip}:/etc/profile.d/${banner_file}
rsync /tmp/${banner_file} ${admin_net_ip_bs}:${s_base}/etc/profile.d/${banner_file}
fix_config
cecho "Reboot destination VM"
ssh -tt "${admin_net_ip_bs}" "reboot"
cecho "Stop network and up with new settings"
service network stop
cecho "Source fuelmaster can be obtained by ssh ${admin_net_ip_bs}"
# remove restriction provided by https://review.openstack.org/#/c/255734/
/usr/bin/systemctl set-environment OPTIONS="-f /tmp/mg-ss"
/usr/bin/sed -i /ListenAddress/d /etc/ssh/sshd_config >/tmp/mg-ss
/usr/bin/systemctl restart sshd.service
ifconfig "$admin_net_if" "${admin_net_ip_bs}" netmask "$admin_net_nm"
until ssh -tt ${admin_net_ip} fuel node; do
timeout || reboot
sleep 20
done
# Fix nailgun MAC updating bug https://bugs.launchpad.net/fuel/+bug/1528523
ssh "${admin_net_ip}" dockerctl stop nailgun
ssh "${admin_net_ip}" dockerctl start nailgun
until ssh -tt ${admin_net_ip} fuel node ; do sleep 10; done
# refresh log on destination node
rsync ${migrate_log} ${admin_net_ip}:${migrate_log}
ssh "${admin_net_ip}" rm -f /notready
while true ; do sleep 3600 ; done
else
@ -508,21 +531,16 @@ else
del_vm=${del_vm:-no}
create_vm
IFS=","
# no ""
fix_udev_rule $other_net_bridges
IFS=" "
mark_dst_disk
mk_lvs_fs
save_vars $config_bundle $work_bundle
# create fake service for rsyncing
ln -fsv "$(readlink -e $0)" /etc/rc3.d/S00fuel_migrate
flock -u $fd
if [[ "$fm_reboot" == "yes" ]] ; then
cecho "Rebooting to begin the data sync process"
reboot
umm on -c $0 start
else
cecho "Destination VM has been created. Please reboot node to begin data sync process."
/usr/bin/systemctl set-default umm-mg.target
cecho " Destination VM has been created. Please perform reboot to begin data sync process."
fi
trap - EXIT
fi

View File

@ -0,0 +1,12 @@
[Unit]
Description=Unified maintenance mode (stub for fuel migration)
DefaultDependencies=no
After=sysinit.target plymouth-start.service network.target
[Service]
Environment=HOME=/root
WorkingDirectory=/root
ExecStartPre=-/bin/plymouth quit
ExecStart=-/bin/sh -c "/usr/bin/systemctl set-default multi-user.target; /bin/fuel-migrate start;"
Type=idle
StandardInput=tty-force

View File

@ -0,0 +1,6 @@
[Unit]
Description=Unified maintenance mode
Requires=sysinit.target sshd.service network.service umm-mg.service
After=sysinit.target network.target
AllowIsolate=yes

View File

@ -122,7 +122,11 @@ install -m 0644 %{files_source}/fuel-notify/monit-free-space.conf %{buildroot}/e
install -m 0644 %{files_source}/fuel-notify/free_disk_space_check.yaml %{buildroot}/etc/fuel/free_disk_space_check.yaml
install -m 0755 %{files_source}/fuel-notify/fuel_notify.py %{buildroot}/usr/bin/fuel_notify.py
#fuel-migrate
mkdir -p %{buildroot}/etc/systemd/system
mkdir -p %{buildroot}/usr/bin
install -m 0755 %{files_source}/fuel-migrate/fuel-migrate %{buildroot}/usr/bin/fuel-migrate
install -m 0644 %{files_source}/fuel-migrate/umm-mg.service %{buildroot}/etc/systemd/system/umm-mg.service
install -m 0644 %{files_source}/fuel-migrate/umm-mg.target %{buildroot}/etc/systemd/system/umm-mg.target
#UMM
mkdir -p %{buildroot}/etc/init
mkdir -p %{buildroot}/etc/profile.d/
@ -284,6 +288,8 @@ Script for migrate Fuel master into vm
%files -n fuel-migrate
%defattr(-,root,root)
/usr/bin/fuel-migrate
/etc/systemd/system/umm-mg.service
/etc/systemd/system/umm-mg.target
#

View File

@ -52,6 +52,7 @@ NTP1: 0.pool.ntp.org
[ "${lines[0]}" = "two" ]
}
@test "Check save_vars" {
varone=one
run save_vars varone
@ -61,9 +62,9 @@ NTP1: 0.pool.ntp.org
@test "Check ifaces transformer" {
other_net_bridges="eth1,br10,,ems1,virbr1,<xml test >,"
other_net_bridges="eth1,br10,,ems1,virbr4,<xml test >,"
IFS=","
run ifaces $other_net_bridges
run ifaces ${other_net_bridges}
IFS=" "
[ "${lines[0]}" = " <interface type='bridge'>" ]
[ "${lines[1]}" = " <source bridge='br10'/>" ]
@ -71,13 +72,32 @@ NTP1: 0.pool.ntp.org
[ "${lines[3]}" = " <model type='virtio'/>" ]
[ "${lines[4]}" = " </interface>" ]
[ "${lines[5]}" = " <interface type='bridge'>" ]
[ "${lines[6]}" = " <source bridge='virbr1'/>" ]
[ "${lines[6]}" = " <source bridge='virbr4'/>" ]
[ "${lines[7]}" = " <target dev='vfm_ems1'/>" ]
[ "${lines[8]}" = "<xml test >" ]
[ "${lines[9]}" = " <model type='virtio'/>" ]
[ "${lines[10]}" = " </interface>" ]
}
@test "Check udev creater" {
get_if_list(){
cat <<EOF
Interface Type Source Model MAC
-------------------------------------------------------
vfm_eth0 network default virtio 52:54:00:ea:11:22
vfm_eth1 network default virtio 52:54:00:eb:22:33
vfm_ems1 network default virtio 52:54:00:ec:33:44
EOF
}
other_net_bridges="eth1,br10,,ems1,virbr4,<xml test >,"
admin_net_if=eth0
IFS=","
run new_udev_rule ${other_net_bridges}
IFS=" "
[ "${lines[0]}" = "# Generated by fuel-migrate" ]
}
@test "Check echo with indent" {