Add new kickstart bundle to support a miniboot Local Install

This update introduces a new miniboot kickstart bundle and
kickstart file in support of a new subcloud 'Local Install'
method.

This new install method makes subcloud install more
resilient to network latency and loss while at the same
time offering a moderate install time improvement by not
having to copy boot image fragments over the network.

The new 'miniboot' kickstart attempts to mount
/opt/platform-backup/<sw_version>/bootimage.iso. If
successful, miniboot proceeds with a 'Local Install'
of the subcloud using this locally found iso image.

Otherwise, miniboot will default to a 'Remote Install'
of the subcloud using the existing remote method,
over the, network from the system controller.

Test Plan:

PASS: Verify Subcloud Install defaults to remote install
      in the following cases:
      - no local iso image present
      - in correct release dir
      - iso validity check fails
      - iso validity check file missing

PASS: Verify logging for over Local and Remote Installs for
      Anaconda kickstart, dcmanager and subcloud add.

PASS: Verify subcloud Local Install on ZT Server
PASS: Verify subcloud Local Install on HP Proliant e910 Server
PASS: Verify subcloud Local Install auto patching

PASS: Verify simultaneous subcloud install in cases
      - one local and one remote
      - two remote installs
      - two local installs

PASS: Verify local and remote subcloud install as a patch
PASS: Verify local and remote subcloud install from full iso build

Soak: iterations across diff DC systems and hosts

PASS: Verify subcloud Remote install 10+ times
PASS: Verify subcloud Local install 20+ times

Regression:

PASS: Verify subcloud Remote Install on ZT Server
PASS: Verify subcloud Remote Install on HP Proliant e910 Server
PASS: Verify subcloud Remote Install auto patching

Change-Id: I0694ceb2331e26f4150aaee7c0b5cecf9a6c2d33
Story: 2009291
Task: 43595
Author: Matt Peters <matt.peters@windriver.com>
Signed-off-by: Eric MacDonald <eric.macdonald@windriver.com>
This commit is contained in:
Eric MacDonald 2021-11-10 09:40:52 -05:00
parent 13d18b98ad
commit 0e2e0702d3
2 changed files with 356 additions and 1 deletions

View File

@ -120,7 +120,6 @@ write_config_file("controller-worker-lowlatency",
"post_system_aio.cfg",
"post_pxeboot_controller.cfg");
# Write same net files
write_config_file("controller",
"${output_dir}/net_controller_ks.cfg",
@ -206,6 +205,46 @@ write_config_file("storage",
"post_lvm_pv_on_rootfs.cfg",
"post_net_common.cfg");
# Write miniboot files
write_config_file("controller",
"${output_dir}/miniboot_controller_ks.cfg",
"pre_common_head.cfg",
"pre_pkglist.cfg",
"pre_disk_setup_common.cfg",
"pre_disk_controller.cfg",
"pre_disk_setup_tail.cfg",
"post_platform_conf_controller.cfg",
"post_common.cfg",
"post_kernel_controller.cfg",
"post_lvm_pv_on_rootfs.cfg",
"post_miniboot_controller.cfg");
write_config_file("controller-worker",
"${output_dir}/miniboot_smallsystem_ks.cfg",
"pre_common_head.cfg",
"pre_pkglist.cfg",
"pre_disk_setup_common.cfg",
"pre_disk_aio.cfg",
"pre_disk_setup_tail.cfg",
"post_platform_conf_aio.cfg",
"post_common.cfg",
"post_kernel_aio_and_worker.cfg",
"post_lvm_pv_on_rootfs.cfg",
"post_system_aio.cfg",
"post_miniboot_controller.cfg");
write_config_file("controller-worker-lowlatency",
"${output_dir}/miniboot_smallsystem_lowlatency_ks.cfg",
"pre_common_head.cfg",
"pre_pkglist_lowlatency.cfg",
"pre_disk_setup_common.cfg",
"pre_disk_aio.cfg",
"pre_disk_setup_tail.cfg",
"post_platform_conf_aio_lowlatency.cfg",
"post_common.cfg",
"post_kernel_aio_and_worker.cfg",
"post_lvm_pv_on_rootfs.cfg",
"post_system_aio.cfg",
"post_miniboot_controller.cfg");
system("mkdir -p ${extra_output_dir}");
# write Ottawa Lab files

View File

@ -0,0 +1,316 @@
%pre --erroronfail
# Source common functions
. /tmp/ks-functions.sh
BACKUP_PART_LABEL=Platform\\x20Backup
BACKUP_DEVICE=/dev/disk/by-partlabel/${BACKUP_PART_LABEL}
BACKUP_MOUNT=/mnt/platform-backup
BOOTIMAGE_ISO=${BACKUP_MOUNT}/xxxPLATFORM_RELEASExxx/bootimage.iso
BOOTIMAGE_MD5=${BACKUP_MOUNT}/xxxPLATFORM_RELEASExxx/bootimage.md5
BOOTIMAGE_MOUNT=/mnt/bootimage
KS="Miniboot pre:"
wlog "$KS local install check"
# Look for and validate the local iso image
if [ -e ${BACKUP_DEVICE} ]; then
mkdir -p ${BACKUP_MOUNT}
mount ${BACKUP_DEVICE} ${BACKUP_MOUNT} 2>/dev/null
if [ -f ${BOOTIMAGE_ISO} ]; then
wlog "$KS local iso found : ${BOOTIMAGE_ISO}"
# ISO Validity Check
if [ -f ${BOOTIMAGE_MD5} ] ; then
md5sum -c ${BOOTIMAGE_MD5} >> /tmp/isocheck 2>> /tmp/isocheck
if [ $? -eq 0 ] ; then
mkdir -p ${BOOTIMAGE_MOUNT}
mount -o loop ${BOOTIMAGE_ISO} ${BOOTIMAGE_MOUNT}
wlog "$KS local iso verified and mounted"
else
wlog "$KS local iso check failed"
fi
else
wlog "$KS local iso check file missing : ${BOOTIMAGE_MD5}"
fi
else
wlog "$KS local iso file not found : ${BOOTIMAGE_ISO}"
fi
fi
cat << EOF > /tmp/repo-include
repo --name=local-base --cost=100 --baseurl=file://${BOOTIMAGE_MOUNT}/
repo --name=local-updates --cost=100 --baseurl=file://${BOOTIMAGE_MOUNT}/patches/
repo --name=remote-base --cost=200 --baseurl=xxxHTTP_URLxxx/
repo --name=remote-updates --cost=200 --baseurl=xxxHTTP_URLxxx/patches/
EOF
%end
# Repository arguments from %pre
%include /tmp/repo-include
%post --erroronfail
# Source common functions
. /tmp/ks-functions.sh
KS="Miniboot post:"
wlog "$KS cmdLine: $(cat /proc/cmdline)"
if [ -e /dev/disk/by-label/oe_iso_boot ]; then
# This is a hybrid ISO/network install. Mount the media to ensure Anaconda
# ejects it on reboot.
mkdir /mnt/iso
wlog "$KS mount for eject"
mount /dev/disk/by-label/oe_iso_boot /mnt/iso
else
wlog "$KS /dev/disk/by-label/oe_iso_boot does not exist"
fi
# persist the default http port number to platform configuration. This
# will get overwritten when config_controller is run.
echo http_port=8080 >> /etc/platform/platform.conf
# Build networking scripts
cat << EOF > /etc/sysconfig/network-scripts/ifcfg-lo
DEVICE=lo
IPADDR=127.0.0.1
NETMASK=255.0.0.0
NETWORK=127.0.0.0
BROADCAST=127.255.255.255
ONBOOT=yes
IPV6_AUTOCONF=no
NAME=loopback
EOF
%end
%post --nochroot --erroronfail
# Source common functions
. /tmp/ks-functions.sh
# Mirror local software repositories
SYSIMAGE_MOUNT=/mnt/sysimage
FEED_DIR=${SYSIMAGE_MOUNT}/www/pages/feed/rel-xxxPLATFORM_RELEASExxx
UPDATES_DIR=${SYSIMAGE_MOUNT}/www/pages/updates/rel-xxxPLATFORM_RELEASExxx
PATCHING_DIR=${SYSIMAGE_MOUNT}/opt/patching
PACKAGES_DIR=${PATCHING_DIR}/packages/xxxPLATFORM_RELEASExxx/
KS="Miniboot post:"
log_count=0
if [ -d ${SYSIMAGE_MOUNT} ] ; then
files="$(ls -lrt ${SYSIMAGE_MOUNT})"
wlog "$KS ${SYSIMAGE_MOUNT} files : $files[@]"
if [ -d ${FEED_DIR} ] ; then
files=$(ls -lrt ${FEED_MOUNT})
wlog "$KS $FEED_DIR files : $files[@]"
else
wlog "$KS error : feed dir '$FEED_DIR' does not exist"
fi
# Check updates Dir
if [ -d ${UPDATES_DIR} ] ; then
files=$(ls -lrt ${UPDATES_DIR})
wlog "$KS $UPDATES_DIR files : $files[@]"
else
wlog "$KS $UPDATES_DIR does not exist"
fi
# Check Packages Dir
if [ -d ${PATCHING_DIR} ] ; then
files=$(ls -lrt ${PATCHING_DIR})
wlog "$KS $PATCHING_DIR files : $files[@]"
if [ -d ${PATCHING_DIR}/metadata ] ; then
files=$(ls -lrt ${PATCHING_DIR}/metadata)
wlog "$KS $PATCHING_DIR/metadata files : $files[@]"
if [ -d ${PATCHING_DIR}/metadata/applied ] ; then
files=$(ls -lrt ${PATCHING_DIR}/metadata/applied)
wlog "$KS $PATCHING_DIR/metadata/applied files : $files[@]"
else
wlog "$KS $PATCHING_DIR/metadata/applied does not exist"
fi
if [ -d ${PATCHING_DIR}/metadata/available ] ; then
files=$(ls -lrt ${PATCHING_DIR}/metadata/available)
wlog "$KS $PATCHING_DIR/metadata/available files : $files[@]"
else
wlog "$KS $PATCHING_DIR/metadata/available does not exist"
fi
else
wlog "$KS $PATCHING_DIR/metadata does not exist"
fi
else
wlog "$KS $PATCHING_DIR does not exist"
fi
# Check Packages Dir
if [ -d ${PACKAGES_DIR} ] ; then
files=$(ls -lrt ${PACKAGES_DIR})
wlog "$KS $PACKAGES_DIR files : $files[@]"
else
wlog "$KS $PACKAGES_DIR does not exist"
fi
else
wlog "$KS Error : $SYSIMAGE_MOUNT does not exists or is not a directory"
fi
# Decide on install mode ; local or remote
if [ -d /mnt/bootimage ]; then
srcdir=/mnt/bootimage
wlog "$KS local install - ${srcdir}"
else
# Remote System Controller
srcdir=/mnt/install/source
wlog "$KS remote install - ${srcdir}"
fi
if [ -d $srcdir/Packages ] ; then
wlog "$KS copying software repository $srcdir/Packages"
mkdir -p ${FEED_DIR}
cp -r $srcdir/Packages ${FEED_DIR}/Packages
if [ -d $srcdir/repodata ] ; then
cp -r $srcdir/repodata ${FEED_DIR}/repodata
else
wlog "$KS $srcdir/repodata dir does not exist"
fi
fi
if [ -d $srcdir/patches ]; then
if [ -d $srcdir/patches/Packages ] ; then
wlog "$KS copying patch Packages $srcdir/patches/Packages"
mkdir -p ${UPDATES_DIR}
cp -r $srcdir/patches/Packages ${UPDATES_DIR}/Packages
else
wlog "$KS $srcdir/patches/Packages does not exist"
fi
if [ -d $srcdir/patches/repodata ] ; then
wlog "$KS copying patch repository $srcdir/patches/repodata"
mkdir -p ${UPDATES_DIR}
cp -r $srcdir/patches/repodata ${UPDATES_DIR}/repodata
else
wlog "$KS $srcdir/patches/repodata does not exist"
fi
fi
if [ -d $srcdir/patches/metadata ] ; then
mkdir -p ${PATCHING_DIR}
wlog "$KS copying $srcdir/patches/metadata to ${PATCHING_DIR}"
cp -r $srcdir/patches/metadata ${PATCHING_DIR}/metadata
fi
if [ -d $srcdir/patches ]; then
mkdir -p ${PACKAGES_DIR}
wlog "$KS copying packages"
find ${UPDATES_DIR}/Packages -name '*.rpm' \
| xargs --no-run-if-empty -I files cp --preserve=all files ${PACKAGES_DIR}
fi
%end
%post --erroronfail
# Source common functions
. /tmp/ks-functions.sh
KS="Miniboot post:"
# Create a uuid specific to this installation
INSTALL_UUID=`uuidgen`
echo $INSTALL_UUID > /www/pages/feed/rel-xxxPLATFORM_RELEASExxx/install_uuid
echo "INSTALL_UUID=$INSTALL_UUID" >> /etc/platform/platform.conf
wlog "$KS updating platform.conf with install uuid : ${INSTALL_UUID}"
# Mirror remote software repositories
anaconda_logdir=/var/log/anaconda
mkdir -p $anaconda_logdir
# Check for inst.noverifyssl
if grep -q inst.noverifyssl /proc/cmdline; then
NOVERIFYSSL_WGET_OPT="--no-check-certificate"
else
NOVERIFYSSL_WGET_OPT=""
fi
# If the patch to $FEED_DIR does not exist then proceed to create it and
# fetch the ISO content in pieces from the system controller:
#
# - Packages
# - Repodata
# - Patch Packages
# - Patches repodata
# - Patches metadata
# - Save all patch packages to /opt/patching/packages/xxxPLATFORM_RELEASExxx
#
FEED_DIR=/www/pages/feed/rel-xxxPLATFORM_RELEASExxx
wlog "$KS feed dir $FEED_DIR"
if [ -d ${FEED_DIR} ]; then
mkdir -p ${FEED_DIR}/Packages
mkdir -p ${FEED_DIR}/repodata
cd ${FEED_DIR}
feed_url=xxxHTTP_URLxxx
declare -i cut_dirs=NUM_DIRS
wlog "$KS downloading software repository $feed_url"
# Fetch Packages
wget ${NOVERIFYSSL_WGET_OPT} --mirror --no-parent --no-host-directories --reject 'index.html*' \
--cut-dirs=$cut_dirs $feed_url/Packages/ -o $anaconda_logdir/rpmget.log \
|| report_post_failure_with_logfile $anaconda_logdir/rpmget.log
# Fetch Repodata
wget ${NOVERIFYSSL_WGET_OPT} --mirror --no-parent --no-host-directories --reject 'index.html*' \
--cut-dirs=$cut_dirs $feed_url/repodata/ -o $anaconda_logdir/rpmget_repo.log \
|| report_post_failure_with_logfile $anaconda_logdir/rpmget_repo.log
# Fetch Patch Package Data quietly
patches_url=xxxHTTP_URLxxx/patches
wget ${NOVERIFYSSL_WGET_OPT} -q --spider ${patches_url}/
if [ $? -eq 0 ]; then
wlog "$KS downloading patch repository $patches_url"
cd /www/pages
mkdir -p updates/rel-xxxPLATFORM_RELEASExxx/Packages
mkdir -p updates/rel-xxxPLATFORM_RELEASExxx/repodata
cd updates/rel-xxxPLATFORM_RELEASExxx
declare -i patches_cut_dirs=$((cut_dirs+1))
wlog "$KS fetch packages"
wget ${NOVERIFYSSL_WGET_OPT} --mirror --no-parent --no-host-directories --reject 'index.html*' \
--cut-dirs=$patches_cut_dirs $patches_url/Packages/ -o $anaconda_logdir/patches_rpmget.log \
|| report_post_failure_with_logfile $anaconda_logdir/patches_rpmget.log
wlog "$KS fetch package repodata"
wget ${NOVERIFYSSL_WGET_OPT} --mirror --no-parent --no-host-directories --reject 'index.html*' \
--cut-dirs=$patches_cut_dirs $patches_url/repodata/ -o $anaconda_logdir/patches_rpmget_repo.log \
|| report_post_failure_with_logfile $anaconda_logdir/patches_rpmget_repo.log
mkdir -p /opt/patching/metadata
mkdir -p /opt/patching/packages/xxxPLATFORM_RELEASExxx
cd /opt/patching
wlog "$KS fetch patch metadata"
wget ${NOVERIFYSSL_WGET_OPT} --mirror --no-parent --no-host-directories --reject 'index.html*' \
--cut-dirs=$patches_cut_dirs $patches_url/metadata/ -o $anaconda_logdir/patches_rpmget_metadata.log \
|| report_post_failure_with_logfile $anaconda_logdir/patches_rpmget_metadata.log
wlog "$KS save a copy of all patch packages, preserve attributes"
find /www/pages/updates/rel-xxxPLATFORM_RELEASExxx/Packages -name '*.rpm' \
| xargs --no-run-if-empty -I files cp --preserve=all files /opt/patching/packages/xxxPLATFORM_RELEASExxx/
else
wlog "$KS get from patches url '$patches_url' failed"
fi
else
wlog "$KS feed dir $FEED_DIR does not exist"
fi
%end