diff --git a/scripts/bootstrap-aio.sh b/scripts/bootstrap-aio.sh index ce3832bde4..380f93828a 100755 --- a/scripts/bootstrap-aio.sh +++ b/scripts/bootstrap-aio.sh @@ -21,6 +21,7 @@ set -e -u -x ## Vars ---------------------------------------------------------------------- DEFAULT_PASSWORD=$(tr -dc 'a-zA-Z0-9' < /dev/urandom | head -c 32) export BOOTSTRAP_AIO="yes" +export BOOTSTRAP_AIO_DIR=${BOOTSTRAP_AIO_DIR:-"/openstack"} export HTTP_PROXY=${HTTP_PROXY:-""} export HTTPS_PROXY=${HTTPS_PROXY:-""} export ADMIN_PASSWORD=${ADMIN_PASSWORD:-$DEFAULT_PASSWORD} @@ -140,9 +141,9 @@ else echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config fi -# Create /opt if it doesn't already exist -if [ ! -d "/opt" ];then - mkdir /opt +# Create the directory BOOTSTRAP_AIO_DIR if it doesn't already exist +if [ ! -d "${BOOTSTRAP_AIO_DIR}" ]; then + mkdir -p ${BOOTSTRAP_AIO_DIR} fi # Remove the pip directory if its found @@ -194,7 +195,7 @@ if [ ! "$(swapon -s | grep -v Filename)" ]; then else swap_size="8589934592" fi - loopback_create "/opt/swap.img" ${swap_size} thick swap + loopback_create "${BOOTSTRAP_AIO_DIR}/swap.img" ${swap_size} thick swap # Ensure swap will be used on the host if [ ! $(sysctl vm.swappiness | awk '{print $3}') == "10" ];then sysctl -w vm.swappiness=10 | tee -a /etc/sysctl.conf @@ -206,7 +207,7 @@ if [ "${DEPLOY_OPENSTACK}" == "yes" ]; then # Build the loopback drive for cinder to use CINDER="cinder.img" if ! vgs cinder-volumes; then - loopback_create "/opt/${CINDER}" 1073741824000 thin rc + loopback_create "${BOOTSTRAP_AIO_DIR}/${CINDER}" 1073741824000 thin rc CINDER_DEVICE=$(losetup -a | awk -F: "/${CINDER}/ {print \$1}") pvcreate ${CINDER_DEVICE} pvscan @@ -216,24 +217,36 @@ if [ "${DEPLOY_OPENSTACK}" == "yes" ]; then fi # Ensure that the cinder loopback is enabled after reboot if ! grep ${CINDER} /etc/rc.local && ! vgs cinder-volumes; then - sed -i "\$i losetup \$(losetup -f) /opt/${CINDER}" /etc/rc.local + sed -i "\$i losetup \$(losetup -f) /${BOOTSTRAP_AIO_DIR}/${CINDER}" /etc/rc.local fi fi + + # Build the loopback drive for nova instance storage + NOVA="nova.img" + if ! grep -q "${NOVA}" /proc/mounts; then + loopback_create "${BOOTSTRAP_AIO_DIR}/${NOVA}" 1073741824000 thin none + mkfs.ext4 -F "${BOOTSTRAP_AIO_DIR}/${NOVA}" + mkdir -p /var/lib/nova/instances + mount "${BOOTSTRAP_AIO_DIR}/${NOVA}" /var/lib/nova/instances + fi + if ! grep -qw "^${BOOTSTRAP_AIO_DIR}/${NOVA}" /etc/fstab; then + echo "${BOOTSTRAP_AIO_DIR}/${NOVA} /var/lib/nova/instances ext4 defaults 0 0" >> /etc/fstab + fi fi # Enable swift deployment if [ "${DEPLOY_SWIFT}" == "yes" ]; then # build the loopback drives for swift to use for SWIFT in swift1 swift2 swift3; do - if ! grep "${SWIFT}" /proc/mounts > /dev/null; then - loopback_create "/opt/${SWIFT}.img" 1073741824000 thin none - if ! grep -w "^/opt/${SWIFT}.img" /etc/fstab > /dev/null; then - echo "/opt/${SWIFT}.img /srv/${SWIFT}.img xfs loop,noatime,nodiratime,nobarrier,logbufs=8 0 0" >> /etc/fstab + if ! grep -q "${SWIFT}" /proc/mounts; then + loopback_create "${BOOTSTRAP_AIO_DIR}/${SWIFT}.img" 1073741824000 thin none + if ! grep -qw "^${BOOTSTRAP_AIO_DIR}/${SWIFT}.img" /etc/fstab; then + echo "${BOOTSTRAP_AIO_DIR}/${SWIFT}.img /srv/${SWIFT}.img xfs loop,noatime,nodiratime,nobarrier,logbufs=8 0 0" >> /etc/fstab fi # Format the lo devices - mkfs.xfs -f "/opt/${SWIFT}.img" + mkfs.xfs -f "${BOOTSTRAP_AIO_DIR}/${SWIFT}.img" mkdir -p "/srv/${SWIFT}.img" - mount "/opt/${SWIFT}.img" "/srv/${SWIFT}.img" + mount "${BOOTSTRAP_AIO_DIR}/${SWIFT}.img" "/srv/${SWIFT}.img" fi done fi diff --git a/scripts/gate-check-commit.sh b/scripts/gate-check-commit.sh index 0b2707cb5c..6c96b41bda 100755 --- a/scripts/gate-check-commit.sh +++ b/scripts/gate-check-commit.sh @@ -42,19 +42,6 @@ info_block "Checking for required libraries." 2> /dev/null || source $(dirname $ ## Main ---------------------------------------------------------------------- -# Disable Ansible color output -sed -i 's/nocolor.*/nocolor = 1/' $(dirname ${0})/../playbooks/ansible.cfg - -# Make the /openstack/log directory for openstack-infra gate check log publishing -mkdir -p /openstack/log - -# Implement the log directory link for openstack-infra log publishing -ln -sf /openstack/log $(dirname ${0})/../logs - -# Create ansible logging directory and add in a log file entry into ansible.cfg -mkdir -p /openstack/log/ansible-logging -sed -i '/\[defaults\]/a log_path = /openstack/log/ansible-logging/ansible.log' $(dirname ${0})/../playbooks/ansible.cfg - # Adjust settings based on the Cloud Provider info in OpenStack-CI if [ -f /etc/nodepool/provider -a -s /etc/nodepool/provider ]; then source /etc/nodepool/provider @@ -82,9 +69,6 @@ if [ -f /etc/nodepool/provider -a -s /etc/nodepool/provider ]; then fi -# Enable detailed task profiling -sed -i '/\[defaults\]/a callback_plugins = plugins/callbacks' $(dirname ${0})/../playbooks/ansible.cfg - # Bootstrap an AIO setup if required if [ "${BOOTSTRAP_AIO}" == "yes" ]; then source $(dirname ${0})/bootstrap-aio.sh @@ -95,6 +79,22 @@ if [ "${BOOTSTRAP_ANSIBLE}" == "yes" ]; then source $(dirname ${0})/bootstrap-ansible.sh fi +# Make the /openstack/log directory for openstack-infra gate check log publishing +mkdir -p /openstack/log + +# Implement the log directory link for openstack-infra log publishing +ln -sf /openstack/log $(dirname ${0})/../logs + +# Create ansible logging directory and add in a log file entry into ansible.cfg +mkdir -p /openstack/log/ansible-logging +sed -i '/\[defaults\]/a log_path = /openstack/log/ansible-logging/ansible.log' $(dirname ${0})/../playbooks/ansible.cfg + +# Enable detailed task profiling +sed -i '/\[defaults\]/a callback_plugins = plugins/callbacks' $(dirname ${0})/../playbooks/ansible.cfg + +# Disable Ansible color output +sed -i 's/nocolor.*/nocolor = 1/' $(dirname ${0})/../playbooks/ansible.cfg + # Enable debug logging for all services to make failure debugging easier echo "debug: True" | tee -a /etc/openstack_deploy/user_variables.yml diff --git a/scripts/scripts-library.sh b/scripts/scripts-library.sh index 0e0ac1d4de..76be68784a 100755 --- a/scripts/scripts-library.sh +++ b/scripts/scripts-library.sh @@ -18,7 +18,9 @@ ## Vars ---------------------------------------------------------------------- LINE='----------------------------------------------------------------------' MAX_RETRIES=${MAX_RETRIES:-5} -MIN_LXC_VG_SIZE_GB=${MIN_LXC_VG_SIZE_GB:-250} +BOOTSTRAP_AIO_DIR=${BOOTSTRAP_AIO_DIR:-"/openstack"} +DATA_DISK_DEVICE=${DATA_DISK_DEVICE:-} +MIN_DISK_SIZE_GB=${MIN_DISK_SIZE_GB:-80} REPORT_DATA=${REPORT_DATA:-""} ANSIBLE_PARAMETERS=${ANSIBLE_PARAMETERS:-""} STARTTIME="${STARTTIME:-$(date +%s)}" @@ -77,48 +79,68 @@ function install_bits { function configure_diskspace { # If there are any block devices available other than the one # used for the root disk, repurpose it for our needs. - MIN_LXC_VG_SIZE_B=$((MIN_LXC_VG_SIZE_GB * 1024 * 1024 * 1024)) - # only do this if the lxc vg doesn't already exist - if ! vgs lxc > /dev/null 2>&1; then - blk_devices=$(lsblk -nrdo NAME,TYPE,RO | awk '/d[b-z]+ disk [^1]/ {print $1}') - for blk_dev in ${blk_devices}; do - # dismount any mount points on the device - mount_points=$(awk "/^\/dev\/${blk_dev}[0-9]* / {print \$2}" /proc/mounts) - for mount_point in ${mount_points}; do - umount ${mount_point} - sed -i ":${mount_point}:d" /etc/fstab - done + # If DATA_DISK_DEVICE is not set or empty, then try to figure out which + # device to use + if [ -z "${DATA_DISK_DEVICE}" ]; then + # Identify the list of disk devices available, sort from largest to + # smallest, and pick the largest. + # Excludes: + # - the first device, as that is where the OS is expected + # - read only devices, as we can't write to them + DATA_DISK_DEVICE=$(lsblk -brndo NAME,TYPE,RO,SIZE | \ + awk '/d[b-z]+ disk 0/{ if ($4>m){m=$4; d=$1}}; END{print d}') + fi + + # We only want to continue if a device was found to use. If not, + # then we simply leave the disks alone. + if [ ! -z "${DATA_DISK_DEVICE}" ]; then + # Calculate the minimum disk size in bytes + MIN_DISK_SIZE_B=$((MIN_DISK_SIZE_GB * 1024 * 1024 * 1024)) + + # Determine the size in bytes of the selected device + blk_dev_size_b=$(lsblk -nrdbo NAME,TYPE,SIZE | \ + awk "/^${DATA_DISK_DEVICE} disk/ {print \$3}") + + # Determine if the device is large enough + if [ "${blk_dev_size_b}" -ge "${MIN_DISK_SIZE_B}" ]; then + # Only execute the disk partitioning process if a partition labeled + # 'openstack-data{1,2}' is not present and that partition is not + # formatted as ext4. This is an attempt to achieve idempotency just + # in case this script is run multiple times. + if ! parted --script -l -m | egrep -q ':ext4:openstack-data[12]:;$'; then + + # Dismount any mount points on the device + mount_points=$(awk "/^\/dev\/${DATA_DISK_DEVICE}[0-9]* / {print \$2}" /proc/mounts) + for mount_point in ${mount_points}; do + umount ${mount_point} + sed -i ":${mount_point}:d" /etc/fstab + done + + # Partition the whole disk for our usage + parted --script /dev/${DATA_DISK_DEVICE} mklabel gpt + parted --align optimal --script /dev/${DATA_DISK_DEVICE} mkpart openstack-data1 ext4 0% 40% + parted --align optimal --script /dev/${DATA_DISK_DEVICE} mkpart openstack-data2 ext4 40% 100% + + # Format the bootstrap partition, create the mount point, and mount it. + mkfs.ext4 /dev/${DATA_DISK_DEVICE}1 + mkdir -p ${BOOTSTRAP_AIO_DIR} + mount /dev/${DATA_DISK_DEVICE}1 ${BOOTSTRAP_AIO_DIR} + + # Format the lxc partition, create the mount point, and mount it. + mkfs.ext4 /dev/${DATA_DISK_DEVICE}2 + mkdir -p /var/lib/lxc + mount /dev/${DATA_DISK_DEVICE}2 /var/lib/lxc - # add a vg for lxc - blk_dev_size_b=$(lsblk -nrdbo NAME,TYPE,SIZE | awk "/^${blk_dev} disk/ {print \$3}") - if [ "${blk_dev_size_b}" -gt "${MIN_LXC_VG_SIZE_B}" ]; then - if ! vgs lxc > /dev/null 2>&1; then - parted --script /dev/${blk_dev} mklabel gpt - parted --align optimal --script /dev/${blk_dev} mkpart lxc 0% 80% - part_num=$(parted /dev/${blk_dev} print --machine | awk -F':' '/lxc/ {print $1}') - pvcreate -ff -y /dev/${blk_dev}${part_num} - vgcreate lxc /dev/${blk_dev}${part_num} - fi - # add a vg for cinder volumes, but only if it doesn't already exist - if ! vgs cinder-volumes > /dev/null 2>&1; then - parted --align optimal --script /dev/${blk_dev} mkpart cinder 80% 100% - part_num=$(parted /dev/${blk_dev} print --machine | awk -F':' '/cinder/ {print $1}') - pvcreate -ff -y /dev/${blk_dev}${part_num} - vgcreate cinder-volumes /dev/${blk_dev}${part_num} - fi - else - if ! grep '/var/lib/lxc' /proc/mounts 2>&1; then - parted --script /dev/${blk_dev} mklabel gpt - parted --script /dev/${blk_dev} mkpart lxc ext4 0% 100% - part_num=$(parted /dev/${blk_dev} print --machine | awk -F':' '/lxc/ {print $1}') - # Format, Create, and Mount it all up. - mkfs.ext4 /dev/${blk_dev}${part_num} - mkdir -p /var/lib/lxc - mount /dev/${blk_dev}${part_num} /var/lib/lxc - fi fi - done + # Add the fstab entries if they aren't there already + if ! grep -qw "^/dev/${DATA_DISK_DEVICE}1" /etc/fstab; then + echo "/dev/${DATA_DISK_DEVICE}1 ${BOOTSTRAP_AIO_DIR} ext4 defaults 0 0" >> /etc/fstab + fi + if ! grep -qw "^/dev/${DATA_DISK_DEVICE}2" /etc/fstab; then + echo "/dev/${DATA_DISK_DEVICE}2 /var/lib/lxc ext4 defaults 0 0" >> /etc/fstab + fi + fi fi }