XenAPI: remove xen tools
The xen tools have been moved to the project of *os-xenapi* since os-xenapi 0.3.0. We also did some refact work on these tools in os-xenapi. This commit is to remove these tools from devstack. So that os-xenapi will be the single place for xen tools. Change-Id: I4fdbe6bce12dfedd0d1e975ab8dd624ee3740c11
This commit is contained in:
parent
a7a8675cc1
commit
e619603bda
@ -1,173 +1,3 @@
|
|||||||
# Getting Started With XenServer and Devstack
|
Note: XenServer relative tools have been moved to `os-xenapi`_ and be maintained there.
|
||||||
|
|
||||||
The purpose of the code in this directory it to help developers bootstrap a
|
|
||||||
XenServer 6.2 (older versions may also work) + OpenStack development
|
|
||||||
environment. This file gives some pointers on how to get started.
|
|
||||||
|
|
||||||
Xenserver is a Type 1 hypervisor, so it is best installed on bare metal. The
|
|
||||||
OpenStack services are configured to run within a virtual machine (called OS
|
|
||||||
domU) on the XenServer host. The VM uses the XAPI toolstack to communicate with
|
|
||||||
the host over a network connection (see `MGT_BRIDGE_OR_NET_NAME`).
|
|
||||||
|
|
||||||
The provided localrc helps to build a basic environment.
|
|
||||||
|
|
||||||
## Introduction
|
|
||||||
|
|
||||||
### Requirements
|
|
||||||
|
|
||||||
- An internet-enabled network with a DHCP server on it
|
|
||||||
- XenServer box plugged in to the same network
|
|
||||||
This network will be used as the OpenStack management network. The VM Network
|
|
||||||
and the Public Network will not be connected to any physical interfaces, only
|
|
||||||
new virtual networks will be created by the `install_os_domU.sh` script.
|
|
||||||
|
|
||||||
### Steps to follow
|
|
||||||
|
|
||||||
- Install XenServer
|
|
||||||
- Download Devstack to XenServer
|
|
||||||
- Customise `localrc`
|
|
||||||
- Start `install_os_domU.sh` script
|
|
||||||
|
|
||||||
### Brief explanation
|
|
||||||
|
|
||||||
The `install_os_domU.sh` script will:
|
|
||||||
- Setup XenAPI plugins
|
|
||||||
- Create the named networks, if they don't exist
|
|
||||||
- Preseed-Netinstall an Ubuntu Virtual Machine (NOTE: you can save and reuse
|
|
||||||
it, see [Reuse the Ubuntu VM](#reuse-the-ubuntu-vm)), with 1 network
|
|
||||||
interface:
|
|
||||||
- `eth0` - Connected to `UBUNTU_INST_BRIDGE_OR_NET_NAME`, defaults to
|
|
||||||
`MGT_BRIDGE_OR_NET_NAME`
|
|
||||||
- After the Ubuntu install process finished, the network configuration is
|
|
||||||
modified to:
|
|
||||||
- `eth0` - Management interface, connected to `MGT_BRIDGE_OR_NET_NAME`. Xapi
|
|
||||||
must be accessible through this network.
|
|
||||||
- `eth1` - VM interface, connected to `VM_BRIDGE_OR_NET_NAME`
|
|
||||||
- `eth2` - Public interface, connected to `PUB_BRIDGE_OR_NET_NAME`
|
|
||||||
- Start devstack inside the created OpenStack VM
|
|
||||||
|
|
||||||
## Step 1: Install Xenserver
|
|
||||||
Install XenServer on a clean box. You can download the latest XenServer for
|
|
||||||
free from: http://www.xenserver.org/
|
|
||||||
|
|
||||||
The XenServer IP configuration depends on your local network setup. If you are
|
|
||||||
using dhcp, make a reservation for XenServer, so its IP address won't change
|
|
||||||
over time. Make a note of the XenServer's IP address, as it has to be specified
|
|
||||||
in `localrc`. The other option is to manually specify the IP setup for the
|
|
||||||
XenServer box. Please make sure, that a gateway and a nameserver is configured,
|
|
||||||
as `install_os_domU.sh` will connect to github.com to get source-code snapshots.
|
|
||||||
|
|
||||||
## Step 2: Download devstack
|
|
||||||
On your XenServer host, run the following commands as root:
|
|
||||||
|
|
||||||
wget --no-check-certificate https://github.com/openstack-dev/devstack/zipball/master
|
|
||||||
unzip -o master -d ./devstack
|
|
||||||
cd devstack/*/
|
|
||||||
|
|
||||||
## Step 3: Configure your localrc inside the devstack directory
|
|
||||||
Devstack uses a localrc for user-specific configuration. Note that
|
|
||||||
the `XENAPI_PASSWORD` must be your dom0 root password.
|
|
||||||
Of course, use real passwords if this machine is exposed.
|
|
||||||
|
|
||||||
cat > ./localrc <<EOF
|
|
||||||
# At the moment, we depend on github's snapshot function.
|
|
||||||
GIT_BASE="http://github.com"
|
|
||||||
|
|
||||||
# Passwords
|
|
||||||
# NOTE: these need to be specified, otherwise devstack will try
|
|
||||||
# to prompt for these passwords, blocking the install process.
|
|
||||||
|
|
||||||
DATABASE_PASSWORD=my_super_secret
|
|
||||||
ADMIN_PASSWORD=my_super_secret
|
|
||||||
SERVICE_PASSWORD=my_super_secret
|
|
||||||
RABBIT_PASSWORD=my_super_secret
|
|
||||||
SWIFT_HASH="66a3d6b56c1f479c8b4e70ab5c2000f5"
|
|
||||||
# This will be the password for the OpenStack VM (both stack and root users)
|
|
||||||
GUEST_PASSWORD=my_super_secret
|
|
||||||
|
|
||||||
# XenAPI parameters
|
|
||||||
# NOTE: The following must be set to your XenServer root password!
|
|
||||||
|
|
||||||
XENAPI_PASSWORD=my_xenserver_root_password
|
|
||||||
|
|
||||||
XENAPI_CONNECTION_URL="http://address_of_your_xenserver"
|
|
||||||
VNCSERVER_PROXYCLIENT_ADDRESS=address_of_your_xenserver
|
|
||||||
|
|
||||||
# Explicitly set virt driver
|
|
||||||
VIRT_DRIVER=xenserver
|
|
||||||
|
|
||||||
# Explicitly enable multi-host for nova-network HA
|
|
||||||
MULTI_HOST=1
|
|
||||||
|
|
||||||
# Give extra time for boot
|
|
||||||
ACTIVE_TIMEOUT=45
|
|
||||||
|
|
||||||
EOF
|
|
||||||
|
|
||||||
## Step 4: Run `./install_os_domU.sh` from the `tools/xen` directory
|
|
||||||
|
|
||||||
cd tools/xen
|
|
||||||
./install_os_domU.sh
|
|
||||||
|
|
||||||
Once this script finishes executing, log into the VM (openstack domU) that it
|
|
||||||
installed and tail the run.sh.log file. You will need to wait until it run.sh
|
|
||||||
has finished executing.
|
|
||||||
|
|
||||||
# Appendix
|
|
||||||
|
|
||||||
This section contains useful information for running devstack in CI
|
|
||||||
environments / using ubuntu network mirrors.
|
|
||||||
|
|
||||||
## Use a specific Ubuntu mirror for installation
|
|
||||||
|
|
||||||
To speed up the Ubuntu installation, you can use a specific mirror. To specify
|
|
||||||
a mirror explicitly, include the following settings in your `localrc` file:
|
|
||||||
|
|
||||||
UBUNTU_INST_HTTP_HOSTNAME="archive.ubuntu.com"
|
|
||||||
UBUNTU_INST_HTTP_DIRECTORY="/ubuntu"
|
|
||||||
|
|
||||||
These variables set the `mirror/http/hostname` and `mirror/http/directory`
|
|
||||||
settings in the ubuntu preseed file. The minimal ubuntu VM will use the
|
|
||||||
specified parameters.
|
|
||||||
|
|
||||||
## Use an http proxy to speed up Ubuntu installation
|
|
||||||
|
|
||||||
To further speed up the Ubuntu VM and package installation, an internal http
|
|
||||||
proxy could be used. `squid-deb-proxy` has prooven to be stable. To use an http
|
|
||||||
proxy, specify:
|
|
||||||
|
|
||||||
UBUNTU_INST_HTTP_PROXY="http://ubuntu-proxy.somedomain.com:8000"
|
|
||||||
|
|
||||||
in your `localrc` file.
|
|
||||||
|
|
||||||
## Reuse the Ubuntu VM
|
|
||||||
|
|
||||||
Performing a minimal ubuntu installation could take a lot of time, depending on
|
|
||||||
your mirror/network speed. If you run `install_os_domU.sh` script on a clean
|
|
||||||
hypervisor, you can speed up the installation, by re-using the ubuntu vm from
|
|
||||||
a previous installation.
|
|
||||||
|
|
||||||
### Export the Ubuntu VM to an XVA
|
|
||||||
|
|
||||||
Given you have an nfs export `TEMPLATE_NFS_DIR`:
|
|
||||||
|
|
||||||
TEMPLATE_FILENAME=devstack-jeos.xva
|
|
||||||
TEMPLATE_NAME=jeos_template_for_devstack
|
|
||||||
mountdir=$(mktemp -d)
|
|
||||||
mount -t nfs "$TEMPLATE_NFS_DIR" "$mountdir"
|
|
||||||
VM="$(xe template-list name-label="$TEMPLATE_NAME" --minimal)"
|
|
||||||
xe template-export template-uuid=$VM filename="$mountdir/$TEMPLATE_FILENAME"
|
|
||||||
umount "$mountdir"
|
|
||||||
rm -rf "$mountdir"
|
|
||||||
|
|
||||||
### Import the Ubuntu VM
|
|
||||||
|
|
||||||
Given you have an nfs export `TEMPLATE_NFS_DIR` where you exported the Ubuntu
|
|
||||||
VM as `TEMPLATE_FILENAME`:
|
|
||||||
|
|
||||||
mountdir=$(mktemp -d)
|
|
||||||
mount -t nfs "$TEMPLATE_NFS_DIR" "$mountdir"
|
|
||||||
xe vm-import filename="$mountdir/$TEMPLATE_FILENAME"
|
|
||||||
umount "$mountdir"
|
|
||||||
rm -rf "$mountdir"
|
|
||||||
|
|
||||||
|
.. _os-xenapi: https://github.com/openstack/os-xenapi/
|
||||||
|
@ -1,191 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# This script is run by install_os_domU.sh
|
|
||||||
#
|
|
||||||
# It modifies the ubuntu image created by install_os_domU.sh
|
|
||||||
# and previously moodified by prepare_guest_template.sh
|
|
||||||
#
|
|
||||||
# This script is responsible for:
|
|
||||||
# - pushing in the DevStack code
|
|
||||||
# - creating run.sh, to run the code on boot
|
|
||||||
# It does this by mounting the disk image of the VM.
|
|
||||||
#
|
|
||||||
# The resultant image is then templated and started
|
|
||||||
# by install_os_domU.sh
|
|
||||||
|
|
||||||
# Exit on errors
|
|
||||||
set -o errexit
|
|
||||||
# Echo commands
|
|
||||||
set -o xtrace
|
|
||||||
|
|
||||||
# This directory
|
|
||||||
TOP_DIR=$(cd $(dirname "$0") && pwd)
|
|
||||||
|
|
||||||
# Include onexit commands
|
|
||||||
. $TOP_DIR/scripts/on_exit.sh
|
|
||||||
|
|
||||||
# xapi functions
|
|
||||||
. $TOP_DIR/functions
|
|
||||||
|
|
||||||
# Source params - override xenrc params in your localrc to suite your taste
|
|
||||||
source xenrc
|
|
||||||
|
|
||||||
#
|
|
||||||
# Parameters
|
|
||||||
#
|
|
||||||
GUEST_NAME="$1"
|
|
||||||
|
|
||||||
function _print_interface_config {
|
|
||||||
local device_nr
|
|
||||||
local ip_address
|
|
||||||
local netmask
|
|
||||||
|
|
||||||
device_nr="$1"
|
|
||||||
ip_address="$2"
|
|
||||||
netmask="$3"
|
|
||||||
|
|
||||||
local device
|
|
||||||
|
|
||||||
device="eth${device_nr}"
|
|
||||||
|
|
||||||
echo "auto $device"
|
|
||||||
if [ $ip_address == "dhcp" ]; then
|
|
||||||
echo "iface $device inet dhcp"
|
|
||||||
else
|
|
||||||
echo "iface $device inet static"
|
|
||||||
echo " address $ip_address"
|
|
||||||
echo " netmask $netmask"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Turn off tx checksumming for better performance
|
|
||||||
echo " post-up ethtool -K $device tx off"
|
|
||||||
}
|
|
||||||
|
|
||||||
function print_interfaces_config {
|
|
||||||
echo "auto lo"
|
|
||||||
echo "iface lo inet loopback"
|
|
||||||
|
|
||||||
_print_interface_config $PUB_DEV_NR $PUB_IP $PUB_NETMASK
|
|
||||||
_print_interface_config $VM_DEV_NR $VM_IP $VM_NETMASK
|
|
||||||
_print_interface_config $MGT_DEV_NR $MGT_IP $MGT_NETMASK
|
|
||||||
}
|
|
||||||
|
|
||||||
#
|
|
||||||
# Mount the VDI
|
|
||||||
#
|
|
||||||
STAGING_DIR=$($TOP_DIR/scripts/manage-vdi open $GUEST_NAME 0 1 | grep -o "/tmp/tmp.[[:alnum:]]*")
|
|
||||||
add_on_exit "$TOP_DIR/scripts/manage-vdi close $GUEST_NAME 0 1"
|
|
||||||
|
|
||||||
# Make sure we have a stage
|
|
||||||
if [ ! -d $STAGING_DIR/etc ]; then
|
|
||||||
echo "Stage is not properly set up!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Only support DHCP for now - don't support how different versions of Ubuntu handle resolv.conf
|
|
||||||
if [ "$MGT_IP" != "dhcp" ] && [ "$PUB_IP" != "dhcp" ]; then
|
|
||||||
echo "Configuration without DHCP not supported"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Copy over devstack
|
|
||||||
rm -f /tmp/devstack.tar
|
|
||||||
cd $TOP_DIR/../../
|
|
||||||
tar --exclude='stage' --exclude='xen/xvas' --exclude='xen/nova' -cvf /tmp/devstack.tar .
|
|
||||||
mkdir -p $STAGING_DIR/opt/stack/devstack
|
|
||||||
tar xf /tmp/devstack.tar -C $STAGING_DIR/opt/stack/devstack
|
|
||||||
cd $TOP_DIR
|
|
||||||
|
|
||||||
# Create an systemd task for devstack
|
|
||||||
cat >$STAGING_DIR/etc/systemd/system/devstack.service << EOF
|
|
||||||
[Unit]
|
|
||||||
Description=Install OpenStack by DevStack
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=oneshot
|
|
||||||
RemainAfterExit=yes
|
|
||||||
ExecStartPre=/bin/rm -f /opt/stack/runsh.succeeded
|
|
||||||
ExecStart=/bin/su -c "/opt/stack/run.sh" stack
|
|
||||||
StandardOutput=tty
|
|
||||||
StandardError=tty
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# enable this service
|
|
||||||
ln -s $STAGING_DIR/etc/systemd/system/devstack.service $STAGING_DIR/etc/systemd/system/multi-user.target.wants/devstack.service
|
|
||||||
|
|
||||||
# Configure the hostname
|
|
||||||
echo $GUEST_NAME > $STAGING_DIR/etc/hostname
|
|
||||||
|
|
||||||
# Hostname must resolve for rabbit
|
|
||||||
HOSTS_FILE_IP=$PUB_IP
|
|
||||||
if [ $MGT_IP != "dhcp" ]; then
|
|
||||||
HOSTS_FILE_IP=$MGT_IP
|
|
||||||
fi
|
|
||||||
cat <<EOF >$STAGING_DIR/etc/hosts
|
|
||||||
$HOSTS_FILE_IP $GUEST_NAME
|
|
||||||
127.0.0.1 localhost localhost.localdomain
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Configure the network
|
|
||||||
print_interfaces_config > $STAGING_DIR/etc/network/interfaces
|
|
||||||
|
|
||||||
# Gracefully cp only if source file/dir exists
|
|
||||||
function cp_it {
|
|
||||||
if [ -e $1 ] || [ -d $1 ]; then
|
|
||||||
cp -pRL $1 $2
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Copy over your ssh keys and env if desired
|
|
||||||
COPYENV=${COPYENV:-1}
|
|
||||||
if [ "$COPYENV" = "1" ]; then
|
|
||||||
cp_it ~/.ssh $STAGING_DIR/opt/stack/.ssh
|
|
||||||
cp_it ~/.ssh/id_rsa.pub $STAGING_DIR/opt/stack/.ssh/authorized_keys
|
|
||||||
cp_it ~/.gitconfig $STAGING_DIR/opt/stack/.gitconfig
|
|
||||||
cp_it ~/.vimrc $STAGING_DIR/opt/stack/.vimrc
|
|
||||||
cp_it ~/.bashrc $STAGING_DIR/opt/stack/.bashrc
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Configure run.sh
|
|
||||||
cat <<EOF >$STAGING_DIR/opt/stack/run.sh
|
|
||||||
#!/bin/bash
|
|
||||||
set -eux
|
|
||||||
(
|
|
||||||
flock -n 9 || exit 1
|
|
||||||
|
|
||||||
sudo chown -R stack /opt/stack
|
|
||||||
|
|
||||||
[ -e /opt/stack/runsh.succeeded ] && rm /opt/stack/runsh.succeeded
|
|
||||||
echo \$\$ >> /opt/stack/run_sh.pid
|
|
||||||
|
|
||||||
cd /opt/stack/devstack
|
|
||||||
./unstack.sh || true
|
|
||||||
./stack.sh
|
|
||||||
|
|
||||||
# Got to the end - success
|
|
||||||
touch /opt/stack/runsh.succeeded
|
|
||||||
|
|
||||||
# Update /etc/issue
|
|
||||||
(
|
|
||||||
echo "OpenStack VM - Installed by DevStack"
|
|
||||||
IPADDR=$(ip -4 address show eth0 | sed -n 's/.*inet \([0-9\.]\+\).*/\1/p')
|
|
||||||
echo " Management IP: $IPADDR"
|
|
||||||
echo -n " Devstack run: "
|
|
||||||
if [ -e /opt/stack/runsh.succeeded ]; then
|
|
||||||
echo "SUCCEEDED"
|
|
||||||
else
|
|
||||||
echo "FAILED"
|
|
||||||
fi
|
|
||||||
echo ""
|
|
||||||
) > /opt/stack/issue
|
|
||||||
sudo cp /opt/stack/issue /etc/issue
|
|
||||||
|
|
||||||
rm /opt/stack/run_sh.pid
|
|
||||||
) 9> /opt/stack/.runsh_lock
|
|
||||||
EOF
|
|
||||||
|
|
||||||
chmod 755 $STAGING_DIR/opt/stack/run.sh
|
|
@ -1,14 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -eux
|
|
||||||
|
|
||||||
# Need to set barrier=0 to avoid a Xen bug
|
|
||||||
# https://bugs.launchpad.net/ubuntu/+source/linux/+bug/824089
|
|
||||||
sed -i -e 's/errors=/barrier=0,errors=/' /etc/fstab
|
|
||||||
|
|
||||||
# Allow root to login with a password
|
|
||||||
sed -i -e 's/.*PermitRootLogin.*/PermitRootLogin yes/g' /etc/ssh/sshd_config
|
|
||||||
|
|
||||||
# Install the XenServer tools so IP addresses are reported
|
|
||||||
wget --no-proxy @XS_TOOLS_URL@ -O /root/tools.deb
|
|
||||||
dpkg -i /root/tools.deb
|
|
||||||
rm /root/tools.deb
|
|
@ -1,471 +0,0 @@
|
|||||||
### Contents of the preconfiguration file (for squeeze)
|
|
||||||
### Localization
|
|
||||||
# Preseeding only locale sets language, country and locale.
|
|
||||||
d-i debian-installer/locale string en_US
|
|
||||||
|
|
||||||
# The values can also be preseeded individually for greater flexibility.
|
|
||||||
#d-i debian-installer/language string en
|
|
||||||
#d-i debian-installer/country string NL
|
|
||||||
#d-i debian-installer/locale string en_GB.UTF-8
|
|
||||||
# Optionally specify additional locales to be generated.
|
|
||||||
#d-i localechooser/supported-locales en_US.UTF-8, nl_NL.UTF-8
|
|
||||||
|
|
||||||
# Keyboard selection.
|
|
||||||
# Disable automatic (interactive) keymap detection.
|
|
||||||
d-i console-setup/ask_detect boolean false
|
|
||||||
#d-i keyboard-configuration/modelcode string pc105
|
|
||||||
d-i keyboard-configuration/layoutcode string us
|
|
||||||
# To select a variant of the selected layout (if you leave this out, the
|
|
||||||
# basic form of the layout will be used):
|
|
||||||
#d-i keyboard-configuration/variantcode string dvorak
|
|
||||||
|
|
||||||
### Network configuration
|
|
||||||
# Disable network configuration entirely. This is useful for cdrom
|
|
||||||
# installations on non-networked devices where the network questions,
|
|
||||||
# warning and long timeouts are a nuisance.
|
|
||||||
#d-i netcfg/enable boolean false
|
|
||||||
|
|
||||||
# netcfg will choose an interface that has link if possible. This makes it
|
|
||||||
# skip displaying a list if there is more than one interface.
|
|
||||||
d-i netcfg/choose_interface select auto
|
|
||||||
|
|
||||||
# To pick a particular interface instead:
|
|
||||||
#d-i netcfg/choose_interface select eth1
|
|
||||||
|
|
||||||
# If you have a slow dhcp server and the installer times out waiting for
|
|
||||||
# it, this might be useful.
|
|
||||||
d-i netcfg/dhcp_timeout string 120
|
|
||||||
|
|
||||||
# If you prefer to configure the network manually, uncomment this line and
|
|
||||||
# the static network configuration below.
|
|
||||||
#d-i netcfg/disable_autoconfig boolean true
|
|
||||||
|
|
||||||
# If you want the preconfiguration file to work on systems both with and
|
|
||||||
# without a dhcp server, uncomment these lines and the static network
|
|
||||||
# configuration below.
|
|
||||||
#d-i netcfg/dhcp_failed note
|
|
||||||
#d-i netcfg/dhcp_options select Configure network manually
|
|
||||||
|
|
||||||
# Static network configuration.
|
|
||||||
#d-i netcfg/get_nameservers string 192.168.1.1
|
|
||||||
#d-i netcfg/get_ipaddress string 192.168.1.42
|
|
||||||
#d-i netcfg/get_netmask string 255.255.255.0
|
|
||||||
#d-i netcfg/get_gateway string 192.168.1.1
|
|
||||||
#d-i netcfg/confirm_static boolean true
|
|
||||||
|
|
||||||
# Any hostname and domain names assigned from dhcp take precedence over
|
|
||||||
# values set here. However, setting the values still prevents the questions
|
|
||||||
# from being shown, even if values come from dhcp.
|
|
||||||
d-i netcfg/get_hostname string stack
|
|
||||||
d-i netcfg/get_domain string stackpass
|
|
||||||
|
|
||||||
# Disable that annoying WEP key dialog.
|
|
||||||
d-i netcfg/wireless_wep string
|
|
||||||
# The wacky dhcp hostname that some ISPs use as a password of sorts.
|
|
||||||
#d-i netcfg/dhcp_hostname string radish
|
|
||||||
|
|
||||||
# If non-free firmware is needed for the network or other hardware, you can
|
|
||||||
# configure the installer to always try to load it, without prompting. Or
|
|
||||||
# change to false to disable asking.
|
|
||||||
#d-i hw-detect/load_firmware boolean true
|
|
||||||
|
|
||||||
### Network console
|
|
||||||
# Use the following settings if you wish to make use of the network-console
|
|
||||||
# component for remote installation over SSH. This only makes sense if you
|
|
||||||
# intend to perform the remainder of the installation manually.
|
|
||||||
#d-i anna/choose_modules string network-console
|
|
||||||
#d-i network-console/password password r00tme
|
|
||||||
#d-i network-console/password-again password r00tme
|
|
||||||
|
|
||||||
### Mirror settings
|
|
||||||
# If you select ftp, the mirror/country string does not need to be set.
|
|
||||||
#d-i mirror/protocol string ftp
|
|
||||||
d-i mirror/country string manual
|
|
||||||
d-i mirror/http/hostname string archive.ubuntu.com
|
|
||||||
d-i mirror/http/directory string /ubuntu
|
|
||||||
d-i mirror/http/proxy string
|
|
||||||
|
|
||||||
# Alternatively: by default, the installer uses CC.archive.ubuntu.com where
|
|
||||||
# CC is the ISO-3166-2 code for the selected country. You can preseed this
|
|
||||||
# so that it does so without asking.
|
|
||||||
#d-i mirror/http/mirror select CC.archive.ubuntu.com
|
|
||||||
|
|
||||||
# Suite to install.
|
|
||||||
#d-i mirror/suite string squeeze
|
|
||||||
# Suite to use for loading installer components (optional).
|
|
||||||
#d-i mirror/udeb/suite string squeeze
|
|
||||||
# Components to use for loading installer components (optional).
|
|
||||||
#d-i mirror/udeb/components multiselect main, restricted
|
|
||||||
|
|
||||||
### Clock and time zone setup
|
|
||||||
# Controls whether or not the hardware clock is set to UTC.
|
|
||||||
d-i clock-setup/utc boolean true
|
|
||||||
|
|
||||||
# You may set this to any valid setting for $TZ; see the contents of
|
|
||||||
# /usr/share/zoneinfo/ for valid values.
|
|
||||||
d-i time/zone string US/Pacific
|
|
||||||
|
|
||||||
# Controls whether to use NTP to set the clock during the install
|
|
||||||
d-i clock-setup/ntp boolean true
|
|
||||||
# NTP server to use. The default is almost always fine here.
|
|
||||||
d-i clock-setup/ntp-server string 0.us.pool.ntp.org
|
|
||||||
|
|
||||||
### Partitioning
|
|
||||||
## Partitioning example
|
|
||||||
# If the system has free space you can choose to only partition that space.
|
|
||||||
# This is only honoured if partman-auto/method (below) is not set.
|
|
||||||
# Alternatives: custom, some_device, some_device_crypto, some_device_lvm.
|
|
||||||
#d-i partman-auto/init_automatically_partition select biggest_free
|
|
||||||
|
|
||||||
# Alternatively, you may specify a disk to partition. If the system has only
|
|
||||||
# one disk the installer will default to using that, but otherwise the device
|
|
||||||
# name must be given in traditional, non-devfs format (so e.g. /dev/hda or
|
|
||||||
# /dev/sda, and not e.g. /dev/discs/disc0/disc).
|
|
||||||
# For example, to use the first SCSI/SATA hard disk:
|
|
||||||
#d-i partman-auto/disk string /dev/sda
|
|
||||||
# In addition, you'll need to specify the method to use.
|
|
||||||
# The presently available methods are:
|
|
||||||
# - regular: use the usual partition types for your architecture
|
|
||||||
# - lvm: use LVM to partition the disk
|
|
||||||
# - crypto: use LVM within an encrypted partition
|
|
||||||
d-i partman-auto/method string regular
|
|
||||||
|
|
||||||
# If one of the disks that are going to be automatically partitioned
|
|
||||||
# contains an old LVM configuration, the user will normally receive a
|
|
||||||
# warning. This can be preseeded away...
|
|
||||||
d-i partman-lvm/device_remove_lvm boolean true
|
|
||||||
# The same applies to pre-existing software RAID array:
|
|
||||||
d-i partman-md/device_remove_md boolean true
|
|
||||||
# And the same goes for the confirmation to write the lvm partitions.
|
|
||||||
d-i partman-lvm/confirm boolean true
|
|
||||||
|
|
||||||
# For LVM partitioning, you can select how much of the volume group to use
|
|
||||||
# for logical volumes.
|
|
||||||
#d-i partman-auto-lvm/guided_size string max
|
|
||||||
#d-i partman-auto-lvm/guided_size string 10GB
|
|
||||||
#d-i partman-auto-lvm/guided_size string 50%
|
|
||||||
|
|
||||||
# You can choose one of the three predefined partitioning recipes:
|
|
||||||
# - atomic: all files in one partition
|
|
||||||
# - home: separate /home partition
|
|
||||||
# - multi: separate /home, /usr, /var, and /tmp partitions
|
|
||||||
d-i partman-auto/choose_recipe select atomic
|
|
||||||
|
|
||||||
# Or provide a recipe of your own...
|
|
||||||
# If you have a way to get a recipe file into the d-i environment, you can
|
|
||||||
# just point at it.
|
|
||||||
#d-i partman-auto/expert_recipe_file string /hd-media/recipe
|
|
||||||
|
|
||||||
# If not, you can put an entire recipe into the preconfiguration file in one
|
|
||||||
# (logical) line. This example creates a small /boot partition, suitable
|
|
||||||
# swap, and uses the rest of the space for the root partition:
|
|
||||||
#d-i partman-auto/expert_recipe string \
|
|
||||||
# boot-root :: \
|
|
||||||
# 40 50 100 ext3 \
|
|
||||||
# $primary{ } $bootable{ } \
|
|
||||||
# method{ format } format{ } \
|
|
||||||
# use_filesystem{ } filesystem{ ext3 } \
|
|
||||||
# mountpoint{ /boot } \
|
|
||||||
# . \
|
|
||||||
# 500 10000 1000000000 ext3 \
|
|
||||||
# method{ format } format{ } \
|
|
||||||
# use_filesystem{ } filesystem{ ext3 } \
|
|
||||||
# mountpoint{ / } \
|
|
||||||
# . \
|
|
||||||
# 64 512 300% linux-swap \
|
|
||||||
# method{ swap } format{ } \
|
|
||||||
# .
|
|
||||||
|
|
||||||
# If you just want to change the default filesystem from ext3 to something
|
|
||||||
# else, you can do that without providing a full recipe.
|
|
||||||
d-i partman/default_filesystem string ext3
|
|
||||||
|
|
||||||
# The full recipe format is documented in the file partman-auto-recipe.txt
|
|
||||||
# included in the 'debian-installer' package or available from D-I source
|
|
||||||
# repository. This also documents how to specify settings such as file
|
|
||||||
# system labels, volume group names and which physical devices to include
|
|
||||||
# in a volume group.
|
|
||||||
|
|
||||||
# This makes partman automatically partition without confirmation, provided
|
|
||||||
# that you told it what to do using one of the methods above.
|
|
||||||
d-i partman-partitioning/confirm_write_new_label boolean true
|
|
||||||
d-i partman/choose_partition select finish
|
|
||||||
d-i partman/confirm boolean true
|
|
||||||
d-i partman/confirm_nooverwrite boolean true
|
|
||||||
|
|
||||||
## Partitioning using RAID
|
|
||||||
# The method should be set to "raid".
|
|
||||||
#d-i partman-auto/method string raid
|
|
||||||
# Specify the disks to be partitioned. They will all get the same layout,
|
|
||||||
# so this will only work if the disks are the same size.
|
|
||||||
#d-i partman-auto/disk string /dev/sda /dev/sdb
|
|
||||||
|
|
||||||
# Next you need to specify the physical partitions that will be used.
|
|
||||||
#d-i partman-auto/expert_recipe string \
|
|
||||||
# multiraid :: \
|
|
||||||
# 1000 5000 4000 raid \
|
|
||||||
# $primary{ } method{ raid } \
|
|
||||||
# . \
|
|
||||||
# 64 512 300% raid \
|
|
||||||
# method{ raid } \
|
|
||||||
# . \
|
|
||||||
# 500 10000 1000000000 raid \
|
|
||||||
# method{ raid } \
|
|
||||||
# .
|
|
||||||
|
|
||||||
# Last you need to specify how the previously defined partitions will be
|
|
||||||
# used in the RAID setup. Remember to use the correct partition numbers
|
|
||||||
# for logical partitions. RAID levels 0, 1, 5, 6 and 10 are supported;
|
|
||||||
# devices are separated using "#".
|
|
||||||
# Parameters are:
|
|
||||||
# <raidtype> <devcount> <sparecount> <fstype> <mountpoint> \
|
|
||||||
# <devices> <sparedevices>
|
|
||||||
|
|
||||||
#d-i partman-auto-raid/recipe string \
|
|
||||||
# 1 2 0 ext3 / \
|
|
||||||
# /dev/sda1#/dev/sdb1 \
|
|
||||||
# . \
|
|
||||||
# 1 2 0 swap - \
|
|
||||||
# /dev/sda5#/dev/sdb5 \
|
|
||||||
# . \
|
|
||||||
# 0 2 0 ext3 /home \
|
|
||||||
# /dev/sda6#/dev/sdb6 \
|
|
||||||
# .
|
|
||||||
|
|
||||||
# For additional information see the file partman-auto-raid-recipe.txt
|
|
||||||
# included in the 'debian-installer' package or available from D-I source
|
|
||||||
# repository.
|
|
||||||
|
|
||||||
# This makes partman automatically partition without confirmation.
|
|
||||||
d-i partman-md/confirm boolean true
|
|
||||||
d-i partman-partitioning/confirm_write_new_label boolean true
|
|
||||||
d-i partman/choose_partition select finish
|
|
||||||
d-i partman/confirm boolean true
|
|
||||||
d-i partman/confirm_nooverwrite boolean true
|
|
||||||
|
|
||||||
## Controlling how partitions are mounted
|
|
||||||
# The default is to mount by UUID, but you can also choose "traditional" to
|
|
||||||
# use traditional device names, or "label" to try filesystem labels before
|
|
||||||
# falling back to UUIDs.
|
|
||||||
#d-i partman/mount_style select uuid
|
|
||||||
|
|
||||||
### Base system installation
|
|
||||||
# Configure APT to not install recommended packages by default. Use of this
|
|
||||||
# option can result in an incomplete system and should only be used by very
|
|
||||||
# experienced users.
|
|
||||||
#d-i base-installer/install-recommends boolean false
|
|
||||||
|
|
||||||
# The kernel image (meta) package to be installed; "none" can be used if no
|
|
||||||
# kernel is to be installed.
|
|
||||||
d-i base-installer/kernel/image string linux-virtual
|
|
||||||
|
|
||||||
### Account setup
|
|
||||||
# Skip creation of a root account (normal user account will be able to
|
|
||||||
# use sudo). The default is false; preseed this to true if you want to set
|
|
||||||
# a root password.
|
|
||||||
d-i passwd/root-login boolean true
|
|
||||||
# Alternatively, to skip creation of a normal user account.
|
|
||||||
d-i passwd/make-user boolean false
|
|
||||||
|
|
||||||
# Root password, either in clear text
|
|
||||||
d-i passwd/root-password password stackpass
|
|
||||||
d-i passwd/root-password-again password stackpass
|
|
||||||
# or encrypted using an MD5 hash.
|
|
||||||
#d-i passwd/root-password-crypted password [MD5 hash]
|
|
||||||
|
|
||||||
# To create a normal user account.
|
|
||||||
#d-i passwd/user-fullname string Ubuntu User
|
|
||||||
#d-i passwd/username string ubuntu
|
|
||||||
# Normal user's password, either in clear text
|
|
||||||
#d-i passwd/user-password password insecure
|
|
||||||
#d-i passwd/user-password-again password insecure
|
|
||||||
# or encrypted using an MD5 hash.
|
|
||||||
#d-i passwd/user-password-crypted password [MD5 hash]
|
|
||||||
# Create the first user with the specified UID instead of the default.
|
|
||||||
#d-i passwd/user-uid string 1010
|
|
||||||
# The installer will warn about weak passwords. If you are sure you know
|
|
||||||
# what you're doing and want to override it, uncomment this.
|
|
||||||
d-i user-setup/allow-password-weak boolean true
|
|
||||||
|
|
||||||
# The user account will be added to some standard initial groups. To
|
|
||||||
# override that, use this.
|
|
||||||
#d-i passwd/user-default-groups string audio cdrom video
|
|
||||||
|
|
||||||
# Set to true if you want to encrypt the first user's home directory.
|
|
||||||
d-i user-setup/encrypt-home boolean false
|
|
||||||
|
|
||||||
### Apt setup
|
|
||||||
# You can choose to install restricted and universe software, or to install
|
|
||||||
# software from the backports repository.
|
|
||||||
d-i apt-setup/restricted boolean true
|
|
||||||
d-i apt-setup/universe boolean true
|
|
||||||
d-i apt-setup/backports boolean true
|
|
||||||
# Uncomment this if you don't want to use a network mirror.
|
|
||||||
#d-i apt-setup/use_mirror boolean false
|
|
||||||
# Select which update services to use; define the mirrors to be used.
|
|
||||||
# Values shown below are the normal defaults.
|
|
||||||
#d-i apt-setup/services-select multiselect security
|
|
||||||
#d-i apt-setup/security_host string security.ubuntu.com
|
|
||||||
#d-i apt-setup/security_path string /ubuntu
|
|
||||||
|
|
||||||
# Additional repositories, local[0-9] available
|
|
||||||
#d-i apt-setup/local0/repository string \
|
|
||||||
# http://local.server/ubuntu squeeze main
|
|
||||||
#d-i apt-setup/local0/comment string local server
|
|
||||||
# Enable deb-src lines
|
|
||||||
#d-i apt-setup/local0/source boolean true
|
|
||||||
# URL to the public key of the local repository; you must provide a key or
|
|
||||||
# apt will complain about the unauthenticated repository and so the
|
|
||||||
# sources.list line will be left commented out
|
|
||||||
#d-i apt-setup/local0/key string http://local.server/key
|
|
||||||
|
|
||||||
# By default the installer requires that repositories be authenticated
|
|
||||||
# using a known gpg key. This setting can be used to disable that
|
|
||||||
# authentication. Warning: Insecure, not recommended.
|
|
||||||
#d-i debian-installer/allow_unauthenticated boolean true
|
|
||||||
|
|
||||||
### Package selection
|
|
||||||
#tasksel tasksel/first multiselect ubuntu-desktop
|
|
||||||
#tasksel tasksel/first multiselect lamp-server, print-server
|
|
||||||
#tasksel tasksel/first multiselect kubuntu-desktop
|
|
||||||
tasksel tasksel/first multiselect openssh-server
|
|
||||||
|
|
||||||
# Individual additional packages to install
|
|
||||||
d-i pkgsel/include string cracklib-runtime curl wget ssh openssh-server tcpdump ethtool git sudo python-netaddr coreutils
|
|
||||||
|
|
||||||
# Whether to upgrade packages after debootstrap.
|
|
||||||
# Allowed values: none, safe-upgrade, full-upgrade
|
|
||||||
d-i pkgsel/upgrade select safe-upgrade
|
|
||||||
|
|
||||||
# Language pack selection
|
|
||||||
#d-i pkgsel/language-packs multiselect de, en, zh
|
|
||||||
|
|
||||||
# Policy for applying updates. May be "none" (no automatic updates),
|
|
||||||
# "unattended-upgrades" (install security updates automatically), or
|
|
||||||
# "landscape" (manage system with Landscape).
|
|
||||||
d-i pkgsel/update-policy select unattended-upgrades
|
|
||||||
|
|
||||||
# Some versions of the installer can report back on what software you have
|
|
||||||
# installed, and what software you use. The default is not to report back,
|
|
||||||
# but sending reports helps the project determine what software is most
|
|
||||||
# popular and include it on CDs.
|
|
||||||
#popularity-contest popularity-contest/participate boolean false
|
|
||||||
|
|
||||||
# By default, the system's locate database will be updated after the
|
|
||||||
# installer has finished installing most packages. This may take a while, so
|
|
||||||
# if you don't want it, you can set this to "false" to turn it off.
|
|
||||||
d-i pkgsel/updatedb boolean false
|
|
||||||
|
|
||||||
### Boot loader installation
|
|
||||||
# Grub is the default boot loader (for x86). If you want lilo installed
|
|
||||||
# instead, uncomment this:
|
|
||||||
#d-i grub-installer/skip boolean true
|
|
||||||
# To also skip installing lilo, and install no bootloader, uncomment this
|
|
||||||
# too:
|
|
||||||
#d-i lilo-installer/skip boolean true
|
|
||||||
|
|
||||||
# With a few exceptions for unusual partitioning setups, GRUB 2 is now the
|
|
||||||
# default. If you need GRUB Legacy for some particular reason, then
|
|
||||||
# uncomment this:
|
|
||||||
d-i grub-installer/grub2_instead_of_grub_legacy boolean false
|
|
||||||
|
|
||||||
# This is fairly safe to set, it makes grub install automatically to the MBR
|
|
||||||
# if no other operating system is detected on the machine.
|
|
||||||
d-i grub-installer/only_debian boolean true
|
|
||||||
|
|
||||||
# This one makes grub-installer install to the MBR if it also finds some other
|
|
||||||
# OS, which is less safe as it might not be able to boot that other OS.
|
|
||||||
d-i grub-installer/with_other_os boolean true
|
|
||||||
|
|
||||||
# Alternatively, if you want to install to a location other than the mbr,
|
|
||||||
# uncomment and edit these lines:
|
|
||||||
#d-i grub-installer/only_debian boolean false
|
|
||||||
#d-i grub-installer/with_other_os boolean false
|
|
||||||
#d-i grub-installer/bootdev string (hd0,0)
|
|
||||||
# To install grub to multiple disks:
|
|
||||||
#d-i grub-installer/bootdev string (hd0,0) (hd1,0) (hd2,0)
|
|
||||||
|
|
||||||
# Optional password for grub, either in clear text
|
|
||||||
#d-i grub-installer/password password r00tme
|
|
||||||
#d-i grub-installer/password-again password r00tme
|
|
||||||
# or encrypted using an MD5 hash, see grub-md5-crypt(8).
|
|
||||||
#d-i grub-installer/password-crypted password [MD5 hash]
|
|
||||||
|
|
||||||
# Use the following option to add additional boot parameters for the
|
|
||||||
# installed system (if supported by the bootloader installer).
|
|
||||||
# Note: options passed to the installer will be added automatically.
|
|
||||||
#d-i debian-installer/add-kernel-opts string nousb
|
|
||||||
|
|
||||||
### Finishing up the installation
|
|
||||||
# During installations from serial console, the regular virtual consoles
|
|
||||||
# (VT1-VT6) are normally disabled in /etc/inittab. Uncomment the next
|
|
||||||
# line to prevent this.
|
|
||||||
d-i finish-install/keep-consoles boolean true
|
|
||||||
|
|
||||||
# Avoid that last message about the install being complete.
|
|
||||||
d-i finish-install/reboot_in_progress note
|
|
||||||
|
|
||||||
# This will prevent the installer from ejecting the CD during the reboot,
|
|
||||||
# which is useful in some situations.
|
|
||||||
#d-i cdrom-detect/eject boolean false
|
|
||||||
|
|
||||||
# This is how to make the installer shutdown when finished, but not
|
|
||||||
# reboot into the installed system.
|
|
||||||
#d-i debian-installer/exit/halt boolean true
|
|
||||||
# This will power off the machine instead of just halting it.
|
|
||||||
#d-i debian-installer/exit/poweroff boolean true
|
|
||||||
|
|
||||||
### X configuration
|
|
||||||
# X can detect the right driver for some cards, but if you're preseeding,
|
|
||||||
# you override whatever it chooses. Still, vesa will work most places.
|
|
||||||
#xserver-xorg xserver-xorg/config/device/driver select vesa
|
|
||||||
|
|
||||||
# A caveat with mouse autodetection is that if it fails, X will retry it
|
|
||||||
# over and over. So if it's preseeded to be done, there is a possibility of
|
|
||||||
# an infinite loop if the mouse is not autodetected.
|
|
||||||
#xserver-xorg xserver-xorg/autodetect_mouse boolean true
|
|
||||||
|
|
||||||
# Monitor autodetection is recommended.
|
|
||||||
xserver-xorg xserver-xorg/autodetect_monitor boolean true
|
|
||||||
# Uncomment if you have an LCD display.
|
|
||||||
#xserver-xorg xserver-xorg/config/monitor/lcd boolean true
|
|
||||||
# X has three configuration paths for the monitor. Here's how to preseed
|
|
||||||
# the "medium" path, which is always available. The "simple" path may not
|
|
||||||
# be available, and the "advanced" path asks too many questions.
|
|
||||||
xserver-xorg xserver-xorg/config/monitor/selection-method \
|
|
||||||
select medium
|
|
||||||
xserver-xorg xserver-xorg/config/monitor/mode-list \
|
|
||||||
select 1024x768 @ 60 Hz
|
|
||||||
|
|
||||||
### Preseeding other packages
|
|
||||||
# Depending on what software you choose to install, or if things go wrong
|
|
||||||
# during the installation process, it's possible that other questions may
|
|
||||||
# be asked. You can preseed those too, of course. To get a list of every
|
|
||||||
# possible question that could be asked during an install, do an
|
|
||||||
# installation, and then run these commands:
|
|
||||||
# debconf-get-selections --installer > file
|
|
||||||
# debconf-get-selections >> file
|
|
||||||
|
|
||||||
|
|
||||||
#### Advanced options
|
|
||||||
### Running custom commands during the installation
|
|
||||||
# d-i preseeding is inherently not secure. Nothing in the installer checks
|
|
||||||
# for attempts at buffer overflows or other exploits of the values of a
|
|
||||||
# preconfiguration file like this one. Only use preconfiguration files from
|
|
||||||
# trusted locations! To drive that home, and because it's generally useful,
|
|
||||||
# here's a way to run any shell command you'd like inside the installer,
|
|
||||||
# automatically.
|
|
||||||
|
|
||||||
# This first command is run as early as possible, just after
|
|
||||||
# preseeding is read.
|
|
||||||
#d-i preseed/early_command string anna-install some-udeb
|
|
||||||
# This command is run immediately before the partitioner starts. It may be
|
|
||||||
# useful to apply dynamic partitioner preseeding that depends on the state
|
|
||||||
# of the disks (which may not be visible when preseed/early_command runs).
|
|
||||||
#d-i partman/early_command \
|
|
||||||
# string debconf-set partman-auto/disk "$(list-devices disk | head -n1)"
|
|
||||||
# This command is run just before the install finishes, but when there is
|
|
||||||
# still a usable /target directory. You can chroot to /target and use it
|
|
||||||
# directly, or use the apt-install and in-target commands to easily install
|
|
||||||
# packages and run commands in the target system.
|
|
||||||
d-i preseed/late_command string
|
|
@ -1,341 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
function die_with_error {
|
|
||||||
local err_msg
|
|
||||||
|
|
||||||
err_msg="$1"
|
|
||||||
|
|
||||||
echo "$err_msg" >&2
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
function xapi_plugin_location {
|
|
||||||
for PLUGIN_DIR in "/etc/xapi.d/plugins/" "/usr/lib/xcp/plugins/" "/usr/lib/xapi/plugins" "/usr/lib64/xapi/plugins"; do
|
|
||||||
if [ -d $PLUGIN_DIR ]; then
|
|
||||||
echo $PLUGIN_DIR
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
function create_directory_for_kernels {
|
|
||||||
if [ -d "/boot/guest" ]; then
|
|
||||||
echo "INFO: /boot/guest directory already exists, using that" >&2
|
|
||||||
else
|
|
||||||
local local_path
|
|
||||||
local_path="$(get_local_sr_path)/os-guest-kernels"
|
|
||||||
mkdir -p $local_path
|
|
||||||
ln -s $local_path /boot/guest
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
function create_directory_for_images {
|
|
||||||
if [ -d "/images" ]; then
|
|
||||||
echo "INFO: /images directory already exists, using that" >&2
|
|
||||||
else
|
|
||||||
local local_path
|
|
||||||
local_path="$(get_local_sr_path)/os-images"
|
|
||||||
mkdir -p $local_path
|
|
||||||
ln -s $local_path /images
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
function get_local_sr {
|
|
||||||
xe pool-list params=default-SR minimal=true
|
|
||||||
}
|
|
||||||
|
|
||||||
function get_local_sr_path {
|
|
||||||
pbd_path="/var/run/sr-mount/$(get_local_sr)"
|
|
||||||
pbd_device_config_path=`xe pbd-list sr-uuid=$(get_local_sr) params=device-config | grep " path: "`
|
|
||||||
if [ -n "$pbd_device_config_path" ]; then
|
|
||||||
pbd_uuid=`xe pbd-list sr-uuid=$(get_local_sr) minimal=true`
|
|
||||||
pbd_path=`xe pbd-param-get uuid=$pbd_uuid param-name=device-config param-key=path || echo ""`
|
|
||||||
fi
|
|
||||||
echo $pbd_path
|
|
||||||
}
|
|
||||||
|
|
||||||
function find_ip_by_name {
|
|
||||||
local guest_name="$1"
|
|
||||||
local interface="$2"
|
|
||||||
|
|
||||||
local period=10
|
|
||||||
local max_tries=10
|
|
||||||
local i=0
|
|
||||||
|
|
||||||
while true; do
|
|
||||||
if [ $i -ge $max_tries ]; then
|
|
||||||
echo "Timeout: ip address for interface $interface of $guest_name"
|
|
||||||
exit 11
|
|
||||||
fi
|
|
||||||
|
|
||||||
ipaddress=$(xe vm-list --minimal \
|
|
||||||
name-label=$guest_name \
|
|
||||||
params=networks | sed -ne "s,^.*${interface}/ip: \([0-9.]*\).*\$,\1,p")
|
|
||||||
|
|
||||||
if [ -z "$ipaddress" ]; then
|
|
||||||
sleep $period
|
|
||||||
i=$((i+1))
|
|
||||||
else
|
|
||||||
echo $ipaddress
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
function _vm_uuid {
|
|
||||||
local vm_name_label
|
|
||||||
|
|
||||||
vm_name_label="$1"
|
|
||||||
|
|
||||||
xe vm-list name-label="$vm_name_label" --minimal
|
|
||||||
}
|
|
||||||
|
|
||||||
function _create_new_network {
|
|
||||||
local name_label
|
|
||||||
name_label=$1
|
|
||||||
|
|
||||||
xe network-create name-label="$name_label"
|
|
||||||
}
|
|
||||||
|
|
||||||
function _multiple_networks_with_name {
|
|
||||||
local name_label
|
|
||||||
name_label=$1
|
|
||||||
|
|
||||||
# A comma indicates multiple matches
|
|
||||||
xe network-list name-label="$name_label" --minimal | grep -q ","
|
|
||||||
}
|
|
||||||
|
|
||||||
function _network_exists {
|
|
||||||
local name_label
|
|
||||||
name_label=$1
|
|
||||||
|
|
||||||
! [ -z "$(xe network-list name-label="$name_label" --minimal)" ]
|
|
||||||
}
|
|
||||||
|
|
||||||
function _bridge_exists {
|
|
||||||
local bridge
|
|
||||||
bridge=$1
|
|
||||||
|
|
||||||
! [ -z "$(xe network-list bridge="$bridge" --minimal)" ]
|
|
||||||
}
|
|
||||||
|
|
||||||
function _network_uuid {
|
|
||||||
local bridge_or_net_name
|
|
||||||
bridge_or_net_name=$1
|
|
||||||
|
|
||||||
if _bridge_exists "$bridge_or_net_name"; then
|
|
||||||
xe network-list bridge="$bridge_or_net_name" --minimal
|
|
||||||
else
|
|
||||||
xe network-list name-label="$bridge_or_net_name" --minimal
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
function add_interface {
|
|
||||||
local vm_name_label
|
|
||||||
local bridge_or_network_name
|
|
||||||
|
|
||||||
vm_name_label="$1"
|
|
||||||
bridge_or_network_name="$2"
|
|
||||||
device_number="$3"
|
|
||||||
|
|
||||||
local vm
|
|
||||||
local net
|
|
||||||
|
|
||||||
vm=$(_vm_uuid "$vm_name_label")
|
|
||||||
net=$(_network_uuid "$bridge_or_network_name")
|
|
||||||
xe vif-create network-uuid=$net vm-uuid=$vm device=$device_number
|
|
||||||
}
|
|
||||||
|
|
||||||
function setup_network {
|
|
||||||
local bridge_or_net_name
|
|
||||||
bridge_or_net_name=$1
|
|
||||||
|
|
||||||
if ! _bridge_exists "$bridge_or_net_name"; then
|
|
||||||
if _network_exists "$bridge_or_net_name"; then
|
|
||||||
if _multiple_networks_with_name "$bridge_or_net_name"; then
|
|
||||||
cat >&2 << EOF
|
|
||||||
ERROR: Multiple networks found matching name-label to "$bridge_or_net_name"
|
|
||||||
please review your XenServer network configuration / localrc file.
|
|
||||||
EOF
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
_create_new_network "$bridge_or_net_name"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
function bridge_for {
|
|
||||||
local bridge_or_net_name
|
|
||||||
bridge_or_net_name=$1
|
|
||||||
|
|
||||||
if _bridge_exists "$bridge_or_net_name"; then
|
|
||||||
echo "$bridge_or_net_name"
|
|
||||||
else
|
|
||||||
xe network-list name-label="$bridge_or_net_name" params=bridge --minimal
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
function xenapi_ip_on {
|
|
||||||
local bridge_or_net_name
|
|
||||||
bridge_or_net_name=$1
|
|
||||||
|
|
||||||
ip -4 addr show $(bridge_for "$bridge_or_net_name") |\
|
|
||||||
awk '/inet/{split($2, ip, "/"); print ip[1];}'
|
|
||||||
}
|
|
||||||
|
|
||||||
function xenapi_is_listening_on {
|
|
||||||
local bridge_or_net_name
|
|
||||||
bridge_or_net_name=$1
|
|
||||||
|
|
||||||
! [ -z $(xenapi_ip_on "$bridge_or_net_name") ]
|
|
||||||
}
|
|
||||||
|
|
||||||
function parameter_is_specified {
|
|
||||||
local parameter_name
|
|
||||||
parameter_name=$1
|
|
||||||
|
|
||||||
compgen -v | grep "$parameter_name"
|
|
||||||
}
|
|
||||||
|
|
||||||
function append_kernel_cmdline {
|
|
||||||
local vm_name_label
|
|
||||||
local kernel_args
|
|
||||||
|
|
||||||
vm_name_label="$1"
|
|
||||||
kernel_args="$2"
|
|
||||||
|
|
||||||
local vm
|
|
||||||
local pv_args
|
|
||||||
|
|
||||||
vm=$(_vm_uuid "$vm_name_label")
|
|
||||||
pv_args=$(xe vm-param-get param-name=PV-args uuid=$vm)
|
|
||||||
xe vm-param-set PV-args="$pv_args $kernel_args" uuid=$vm
|
|
||||||
}
|
|
||||||
|
|
||||||
function destroy_all_vifs_of {
|
|
||||||
local vm_name_label
|
|
||||||
|
|
||||||
vm_name_label="$1"
|
|
||||||
|
|
||||||
local vm
|
|
||||||
|
|
||||||
vm=$(_vm_uuid "$vm_name_label")
|
|
||||||
IFS=,
|
|
||||||
for vif in $(xe vif-list vm-uuid=$vm --minimal); do
|
|
||||||
xe vif-destroy uuid="$vif"
|
|
||||||
done
|
|
||||||
unset IFS
|
|
||||||
}
|
|
||||||
|
|
||||||
function have_multiple_hosts {
|
|
||||||
xe host-list --minimal | grep -q ","
|
|
||||||
}
|
|
||||||
|
|
||||||
function attach_network {
|
|
||||||
local bridge_or_net_name
|
|
||||||
|
|
||||||
bridge_or_net_name="$1"
|
|
||||||
|
|
||||||
local net
|
|
||||||
local host
|
|
||||||
|
|
||||||
net=$(_network_uuid "$bridge_or_net_name")
|
|
||||||
host=$(xe host-list --minimal)
|
|
||||||
|
|
||||||
xe network-attach uuid=$net host-uuid=$host
|
|
||||||
}
|
|
||||||
|
|
||||||
function set_vm_memory {
|
|
||||||
local vm_name_label
|
|
||||||
local memory
|
|
||||||
|
|
||||||
vm_name_label="$1"
|
|
||||||
memory="$2"
|
|
||||||
|
|
||||||
local vm
|
|
||||||
|
|
||||||
vm=$(_vm_uuid "$vm_name_label")
|
|
||||||
|
|
||||||
xe vm-memory-limits-set \
|
|
||||||
static-min=${memory}MiB \
|
|
||||||
static-max=${memory}MiB \
|
|
||||||
dynamic-min=${memory}MiB \
|
|
||||||
dynamic-max=${memory}MiB \
|
|
||||||
uuid=$vm
|
|
||||||
}
|
|
||||||
|
|
||||||
function max_vcpus {
|
|
||||||
local vm_name_label
|
|
||||||
|
|
||||||
vm_name_label="$1"
|
|
||||||
|
|
||||||
local vm
|
|
||||||
local host
|
|
||||||
local cpu_count
|
|
||||||
|
|
||||||
host=$(xe host-list --minimal)
|
|
||||||
vm=$(_vm_uuid "$vm_name_label")
|
|
||||||
|
|
||||||
cpu_count=$(xe host-param-get \
|
|
||||||
param-name=cpu_info \
|
|
||||||
uuid=$host |
|
|
||||||
sed -e 's/^.*cpu_count: \([0-9]*\);.*$/\1/g')
|
|
||||||
|
|
||||||
if [ -z "$cpu_count" ]; then
|
|
||||||
# get dom0's vcpu count
|
|
||||||
cpu_count=$(cat /proc/cpuinfo | grep processor | wc -l)
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Assert cpu_count is not empty
|
|
||||||
[ -n "$cpu_count" ]
|
|
||||||
|
|
||||||
# Assert ithas a numeric nonzero value
|
|
||||||
expr "$cpu_count" + 0
|
|
||||||
|
|
||||||
# 8 VCPUs should be enough for devstack VM; avoid using too
|
|
||||||
# many VCPUs:
|
|
||||||
# 1. too many VCPUs may trigger a kernel bug which result VM
|
|
||||||
# not able to boot:
|
|
||||||
# https://kernel.googlesource.com/pub/scm/linux/kernel/git/wsa/linux/+/e2e004acc7cbe3c531e752a270a74e95cde3ea48
|
|
||||||
# 2. The remaining CPUs can be used for other purpose:
|
|
||||||
# e.g. boot test VMs.
|
|
||||||
MAX_VCPUS=8
|
|
||||||
if [ $cpu_count -ge $MAX_VCPUS ]; then
|
|
||||||
cpu_count=$MAX_VCPUS
|
|
||||||
fi
|
|
||||||
|
|
||||||
xe vm-param-set uuid=$vm VCPUs-max=$cpu_count
|
|
||||||
xe vm-param-set uuid=$vm VCPUs-at-startup=$cpu_count
|
|
||||||
}
|
|
||||||
|
|
||||||
function get_domid {
|
|
||||||
local vm_name_label
|
|
||||||
|
|
||||||
vm_name_label="$1"
|
|
||||||
|
|
||||||
xe vm-list name-label="$vm_name_label" params=dom-id minimal=true
|
|
||||||
}
|
|
||||||
|
|
||||||
function install_conntrack_tools {
|
|
||||||
local xs_host
|
|
||||||
local xs_ver_major
|
|
||||||
local centos_ver
|
|
||||||
local conntrack_conf
|
|
||||||
xs_host=$(xe host-list --minimal)
|
|
||||||
xs_ver_major=$(xe host-param-get uuid=$xs_host param-name=software-version param-key=product_version_text_short | cut -d'.' -f 1)
|
|
||||||
if [ $xs_ver_major -gt 6 ]; then
|
|
||||||
# Only support conntrack-tools in Dom0 with XS7.0 and above
|
|
||||||
if [ ! -f /usr/sbin/conntrackd ]; then
|
|
||||||
sed -i s/#baseurl=/baseurl=/g /etc/yum.repos.d/CentOS-Base.repo
|
|
||||||
centos_ver=$(yum version nogroups |grep Installed | cut -d' ' -f 2 | cut -d'/' -f 1 | cut -d'-' -f 1)
|
|
||||||
yum install -y --enablerepo=base --releasever=$centos_ver conntrack-tools
|
|
||||||
# Backup conntrackd.conf after install conntrack-tools, use the one with statistic mode
|
|
||||||
mv /etc/conntrackd/conntrackd.conf /etc/conntrackd/conntrackd.conf.back
|
|
||||||
conntrack_conf=$(find /usr/share/doc -name conntrackd.conf |grep stats)
|
|
||||||
cp $conntrack_conf /etc/conntrackd/conntrackd.conf
|
|
||||||
fi
|
|
||||||
service conntrackd restart
|
|
||||||
fi
|
|
||||||
}
|
|
@ -1,418 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# This script must be run on a XenServer or XCP machine
|
|
||||||
#
|
|
||||||
# It creates a DomU VM that runs OpenStack services
|
|
||||||
#
|
|
||||||
# For more details see: README.md
|
|
||||||
|
|
||||||
set -o errexit
|
|
||||||
set -o nounset
|
|
||||||
set -o xtrace
|
|
||||||
|
|
||||||
export LC_ALL=C
|
|
||||||
|
|
||||||
# This directory
|
|
||||||
THIS_DIR=$(cd $(dirname "$0") && pwd)
|
|
||||||
|
|
||||||
# Include onexit commands
|
|
||||||
. $THIS_DIR/scripts/on_exit.sh
|
|
||||||
|
|
||||||
# xapi functions
|
|
||||||
. $THIS_DIR/functions
|
|
||||||
|
|
||||||
#
|
|
||||||
# Get Settings
|
|
||||||
#
|
|
||||||
TOP_DIR=$(cd $THIS_DIR/../../ && pwd)
|
|
||||||
source $TOP_DIR/inc/meta-config
|
|
||||||
rm -f $TOP_DIR/.localrc.auto
|
|
||||||
extract_localrc_section $TOP_DIR/local.conf $TOP_DIR/localrc $TOP_DIR/.localrc.auto
|
|
||||||
|
|
||||||
# Source params - override xenrc params in your localrc to suit your taste
|
|
||||||
source $THIS_DIR/xenrc
|
|
||||||
|
|
||||||
xe_min()
|
|
||||||
{
|
|
||||||
local cmd="$1"
|
|
||||||
shift
|
|
||||||
xe "$cmd" --minimal "$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
#
|
|
||||||
# Prepare Dom0
|
|
||||||
# including installing XenAPI plugins
|
|
||||||
#
|
|
||||||
|
|
||||||
cd $THIS_DIR
|
|
||||||
|
|
||||||
# Die if multiple hosts listed
|
|
||||||
if have_multiple_hosts; then
|
|
||||||
cat >&2 << EOF
|
|
||||||
ERROR: multiple hosts found. This might mean that the XenServer is a member
|
|
||||||
of a pool - Exiting.
|
|
||||||
EOF
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
#
|
|
||||||
# Configure Networking
|
|
||||||
#
|
|
||||||
|
|
||||||
MGT_NETWORK=`xe pif-list management=true params=network-uuid minimal=true`
|
|
||||||
MGT_BRIDGE_OR_NET_NAME=`xe network-list uuid=$MGT_NETWORK params=bridge minimal=true`
|
|
||||||
|
|
||||||
setup_network "$VM_BRIDGE_OR_NET_NAME"
|
|
||||||
setup_network "$MGT_BRIDGE_OR_NET_NAME"
|
|
||||||
setup_network "$PUB_BRIDGE_OR_NET_NAME"
|
|
||||||
|
|
||||||
if parameter_is_specified "FLAT_NETWORK_BRIDGE"; then
|
|
||||||
if [ "$(bridge_for "$VM_BRIDGE_OR_NET_NAME")" != "$(bridge_for "$FLAT_NETWORK_BRIDGE")" ]; then
|
|
||||||
cat >&2 << EOF
|
|
||||||
ERROR: FLAT_NETWORK_BRIDGE is specified in localrc file, and either no network
|
|
||||||
found on XenServer by searching for networks by that value as name-label or
|
|
||||||
bridge name or the network found does not match the network specified by
|
|
||||||
VM_BRIDGE_OR_NET_NAME. Please check your localrc file.
|
|
||||||
EOF
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! xenapi_is_listening_on "$MGT_BRIDGE_OR_NET_NAME"; then
|
|
||||||
cat >&2 << EOF
|
|
||||||
ERROR: XenAPI does not have an assigned IP address on the management network.
|
|
||||||
please review your XenServer network configuration / localrc file.
|
|
||||||
EOF
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
HOST_IP=$(xenapi_ip_on "$MGT_BRIDGE_OR_NET_NAME")
|
|
||||||
|
|
||||||
# Set up ip forwarding, but skip on xcp-xapi
|
|
||||||
if [ -a /etc/sysconfig/network ]; then
|
|
||||||
if ! grep -q "FORWARD_IPV4=YES" /etc/sysconfig/network; then
|
|
||||||
# FIXME: This doesn't work on reboot!
|
|
||||||
echo "FORWARD_IPV4=YES" >> /etc/sysconfig/network
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
# Also, enable ip forwarding in rc.local, since the above trick isn't working
|
|
||||||
if ! grep -q "echo 1 >/proc/sys/net/ipv4/ip_forward" /etc/rc.local; then
|
|
||||||
echo "echo 1 >/proc/sys/net/ipv4/ip_forward" >> /etc/rc.local
|
|
||||||
fi
|
|
||||||
# Enable ip forwarding at runtime as well
|
|
||||||
echo 1 > /proc/sys/net/ipv4/ip_forward
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Shutdown previous runs
|
|
||||||
#
|
|
||||||
|
|
||||||
DO_SHUTDOWN=${DO_SHUTDOWN:-1}
|
|
||||||
CLEAN_TEMPLATES=${CLEAN_TEMPLATES:-false}
|
|
||||||
if [ "$DO_SHUTDOWN" = "1" ]; then
|
|
||||||
# Shutdown all domU's that created previously
|
|
||||||
clean_templates_arg=""
|
|
||||||
if $CLEAN_TEMPLATES; then
|
|
||||||
clean_templates_arg="--remove-templates"
|
|
||||||
fi
|
|
||||||
./scripts/uninstall-os-vpx.sh $clean_templates_arg
|
|
||||||
|
|
||||||
# Destroy any instances that were launched
|
|
||||||
for uuid in `xe vm-list | grep -1 instance | grep uuid | sed "s/.*\: //g"`; do
|
|
||||||
echo "Shutting down nova instance $uuid"
|
|
||||||
xe vm-uninstall uuid=$uuid force=true
|
|
||||||
done
|
|
||||||
|
|
||||||
# Destroy orphaned vdis
|
|
||||||
for uuid in `xe vdi-list | grep -1 Glance | grep uuid | sed "s/.*\: //g"`; do
|
|
||||||
xe vdi-destroy uuid=$uuid
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Create Ubuntu VM template
|
|
||||||
# and/or create VM from template
|
|
||||||
#
|
|
||||||
|
|
||||||
GUEST_NAME=${GUEST_NAME:-"DevStackOSDomU"}
|
|
||||||
TNAME="jeos_template_for_devstack"
|
|
||||||
SNAME_TEMPLATE="jeos_snapshot_for_devstack"
|
|
||||||
SNAME_FIRST_BOOT="before_first_boot"
|
|
||||||
|
|
||||||
function wait_for_VM_to_halt {
|
|
||||||
set +x
|
|
||||||
echo "Waiting for the VM to halt. Progress in-VM can be checked with XenCenter or xl console:"
|
|
||||||
mgmt_ip=$(echo $XENAPI_CONNECTION_URL | tr -d -c '1234567890.')
|
|
||||||
domid=$(get_domid "$GUEST_NAME")
|
|
||||||
echo "ssh root@$mgmt_ip \"xl console $domid\""
|
|
||||||
while true; do
|
|
||||||
state=$(xe_min vm-list name-label="$GUEST_NAME" power-state=halted)
|
|
||||||
if [ -n "$state" ]; then
|
|
||||||
break
|
|
||||||
else
|
|
||||||
echo -n "."
|
|
||||||
sleep 20
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
set -x
|
|
||||||
}
|
|
||||||
|
|
||||||
templateuuid=$(xe template-list name-label="$TNAME")
|
|
||||||
if [ -z "$templateuuid" ]; then
|
|
||||||
#
|
|
||||||
# Install Ubuntu over network
|
|
||||||
#
|
|
||||||
UBUNTU_INST_BRIDGE_OR_NET_NAME=${UBUNTU_INST_BRIDGE_OR_NET_NAME:-"$MGT_BRIDGE_OR_NET_NAME"}
|
|
||||||
|
|
||||||
# always update the preseed file, incase we have a newer one
|
|
||||||
PRESEED_URL=${PRESEED_URL:-""}
|
|
||||||
if [ -z "$PRESEED_URL" ]; then
|
|
||||||
PRESEED_URL="${HOST_IP}/devstackubuntupreseed.cfg"
|
|
||||||
|
|
||||||
HTTP_SERVER_LOCATION="/opt/xensource/www"
|
|
||||||
if [ ! -e $HTTP_SERVER_LOCATION ]; then
|
|
||||||
HTTP_SERVER_LOCATION="/var/www/html"
|
|
||||||
mkdir -p $HTTP_SERVER_LOCATION
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Copy the tools DEB to the XS web server
|
|
||||||
XS_TOOLS_URL="https://github.com/downloads/citrix-openstack/warehouse/xe-guest-utilities_5.6.100-651_amd64.deb"
|
|
||||||
ISO_DIR="/opt/xensource/packages/iso"
|
|
||||||
if [ -e "$ISO_DIR" ]; then
|
|
||||||
TOOLS_ISO=$(ls -1 $ISO_DIR/*-tools-*.iso | head -1)
|
|
||||||
TMP_DIR=/tmp/temp.$RANDOM
|
|
||||||
mkdir -p $TMP_DIR
|
|
||||||
mount -o loop $TOOLS_ISO $TMP_DIR
|
|
||||||
# the target deb package maybe *amd64.deb or *all.deb,
|
|
||||||
# so use *amd64.deb by default. If it doesn't exist,
|
|
||||||
# then use *all.deb.
|
|
||||||
DEB_FILE=$(ls $TMP_DIR/Linux/*amd64.deb || ls $TMP_DIR/Linux/*all.deb)
|
|
||||||
cp $DEB_FILE $HTTP_SERVER_LOCATION
|
|
||||||
umount $TMP_DIR
|
|
||||||
rmdir $TMP_DIR
|
|
||||||
XS_TOOLS_URL=${HOST_IP}/$(basename $DEB_FILE)
|
|
||||||
fi
|
|
||||||
|
|
||||||
cp -f $THIS_DIR/devstackubuntupreseed.cfg $HTTP_SERVER_LOCATION
|
|
||||||
cp -f $THIS_DIR/devstackubuntu_latecommand.sh $HTTP_SERVER_LOCATION/latecommand.sh
|
|
||||||
|
|
||||||
sed \
|
|
||||||
-e "s,\(d-i mirror/http/hostname string\).*,\1 $UBUNTU_INST_HTTP_HOSTNAME,g" \
|
|
||||||
-e "s,\(d-i mirror/http/directory string\).*,\1 $UBUNTU_INST_HTTP_DIRECTORY,g" \
|
|
||||||
-e "s,\(d-i mirror/http/proxy string\).*,\1 $UBUNTU_INST_HTTP_PROXY,g" \
|
|
||||||
-e "s,\(d-i passwd/root-password password\).*,\1 $GUEST_PASSWORD,g" \
|
|
||||||
-e "s,\(d-i passwd/root-password-again password\).*,\1 $GUEST_PASSWORD,g" \
|
|
||||||
-e "s,\(d-i preseed/late_command string\).*,\1 in-target mkdir -p /tmp; in-target wget --no-proxy ${HOST_IP}/latecommand.sh -O /root/latecommand.sh; in-target bash /root/latecommand.sh,g" \
|
|
||||||
-i "${HTTP_SERVER_LOCATION}/devstackubuntupreseed.cfg"
|
|
||||||
|
|
||||||
sed \
|
|
||||||
-e "s,@XS_TOOLS_URL@,$XS_TOOLS_URL,g" \
|
|
||||||
-i "${HTTP_SERVER_LOCATION}/latecommand.sh"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Update the template
|
|
||||||
$THIS_DIR/scripts/install_ubuntu_template.sh $PRESEED_URL
|
|
||||||
|
|
||||||
# create a new VM from the given template with eth0 attached to the given
|
|
||||||
# network
|
|
||||||
$THIS_DIR/scripts/install-os-vpx.sh \
|
|
||||||
-t "$UBUNTU_INST_TEMPLATE_NAME" \
|
|
||||||
-n "$UBUNTU_INST_BRIDGE_OR_NET_NAME" \
|
|
||||||
-l "$GUEST_NAME"
|
|
||||||
|
|
||||||
set_vm_memory "$GUEST_NAME" "1024"
|
|
||||||
|
|
||||||
xe vm-start vm="$GUEST_NAME"
|
|
||||||
|
|
||||||
# wait for install to finish
|
|
||||||
wait_for_VM_to_halt
|
|
||||||
|
|
||||||
# set VM to restart after a reboot
|
|
||||||
vm_uuid=$(xe_min vm-list name-label="$GUEST_NAME")
|
|
||||||
xe vm-param-set actions-after-reboot=Restart uuid="$vm_uuid"
|
|
||||||
|
|
||||||
# Make template from VM
|
|
||||||
snuuid=$(xe vm-snapshot vm="$GUEST_NAME" new-name-label="$SNAME_TEMPLATE")
|
|
||||||
xe snapshot-clone uuid=$snuuid new-name-label="$TNAME"
|
|
||||||
else
|
|
||||||
#
|
|
||||||
# Template already installed, create VM from template
|
|
||||||
#
|
|
||||||
vm_uuid=$(xe vm-install template="$TNAME" new-name-label="$GUEST_NAME")
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "${EXIT_AFTER_JEOS_INSTALLATION:-}" ]; then
|
|
||||||
echo "User requested to quit after JEOS installation"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
#
|
|
||||||
# Prepare VM for DevStack
|
|
||||||
#
|
|
||||||
xe vm-param-set other-config:os-vpx=true uuid="$vm_uuid"
|
|
||||||
|
|
||||||
# Install XenServer tools, and other such things
|
|
||||||
$THIS_DIR/prepare_guest_template.sh "$GUEST_NAME"
|
|
||||||
|
|
||||||
# Set virtual machine parameters
|
|
||||||
set_vm_memory "$GUEST_NAME" "$OSDOMU_MEM_MB"
|
|
||||||
|
|
||||||
# Max out VCPU count for better performance
|
|
||||||
max_vcpus "$GUEST_NAME"
|
|
||||||
|
|
||||||
# Wipe out all network cards
|
|
||||||
destroy_all_vifs_of "$GUEST_NAME"
|
|
||||||
|
|
||||||
# Add only one interface to prepare the guest template
|
|
||||||
add_interface "$GUEST_NAME" "$MGT_BRIDGE_OR_NET_NAME" "0"
|
|
||||||
|
|
||||||
# start the VM to run the prepare steps
|
|
||||||
xe vm-start vm="$GUEST_NAME"
|
|
||||||
|
|
||||||
# Wait for prep script to finish and shutdown system
|
|
||||||
wait_for_VM_to_halt
|
|
||||||
|
|
||||||
## Setup network cards
|
|
||||||
# Wipe out all
|
|
||||||
destroy_all_vifs_of "$GUEST_NAME"
|
|
||||||
# Tenant network
|
|
||||||
add_interface "$GUEST_NAME" "$VM_BRIDGE_OR_NET_NAME" "$VM_DEV_NR"
|
|
||||||
# Management network
|
|
||||||
add_interface "$GUEST_NAME" "$MGT_BRIDGE_OR_NET_NAME" "$MGT_DEV_NR"
|
|
||||||
# Public network
|
|
||||||
add_interface "$GUEST_NAME" "$PUB_BRIDGE_OR_NET_NAME" "$PUB_DEV_NR"
|
|
||||||
|
|
||||||
#
|
|
||||||
# Inject DevStack inside VM disk
|
|
||||||
#
|
|
||||||
$THIS_DIR/build_xva.sh "$GUEST_NAME"
|
|
||||||
|
|
||||||
FLAT_NETWORK_BRIDGE="${FLAT_NETWORK_BRIDGE:-$(bridge_for "$VM_BRIDGE_OR_NET_NAME")}"
|
|
||||||
append_kernel_cmdline "$GUEST_NAME" "flat_network_bridge=${FLAT_NETWORK_BRIDGE}"
|
|
||||||
|
|
||||||
# Add a separate xvdb, if it was requested
|
|
||||||
if [[ "0" != "$XEN_XVDB_SIZE_GB" ]]; then
|
|
||||||
vm=$(xe vm-list name-label="$GUEST_NAME" --minimal)
|
|
||||||
|
|
||||||
# Add a new disk
|
|
||||||
localsr=$(get_local_sr)
|
|
||||||
extra_vdi=$(xe vdi-create \
|
|
||||||
name-label=xvdb-added-by-devstack \
|
|
||||||
virtual-size="${XEN_XVDB_SIZE_GB}GiB" \
|
|
||||||
sr-uuid=$localsr type=user)
|
|
||||||
xe vbd-create vm-uuid=$vm vdi-uuid=$extra_vdi device=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# create a snapshot before the first boot
|
|
||||||
# to allow a quick re-run with the same settings
|
|
||||||
xe vm-snapshot vm="$GUEST_NAME" new-name-label="$SNAME_FIRST_BOOT"
|
|
||||||
|
|
||||||
#
|
|
||||||
# Run DevStack VM
|
|
||||||
#
|
|
||||||
xe vm-start vm="$GUEST_NAME"
|
|
||||||
|
|
||||||
function ssh_no_check {
|
|
||||||
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no "$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Get hold of the Management IP of OpenStack VM
|
|
||||||
OS_VM_MANAGEMENT_ADDRESS=$MGT_IP
|
|
||||||
if [ $OS_VM_MANAGEMENT_ADDRESS == "dhcp" ]; then
|
|
||||||
OS_VM_MANAGEMENT_ADDRESS=$(find_ip_by_name $GUEST_NAME $MGT_DEV_NR)
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Get hold of the Service IP of OpenStack VM
|
|
||||||
if [ $HOST_IP_IFACE == "eth${MGT_DEV_NR}" ]; then
|
|
||||||
OS_VM_SERVICES_ADDRESS=$MGT_IP
|
|
||||||
if [ $MGT_IP == "dhcp" ]; then
|
|
||||||
OS_VM_SERVICES_ADDRESS=$(find_ip_by_name $GUEST_NAME $MGT_DEV_NR)
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
OS_VM_SERVICES_ADDRESS=$PUB_IP
|
|
||||||
if [ $PUB_IP == "dhcp" ]; then
|
|
||||||
OS_VM_SERVICES_ADDRESS=$(find_ip_by_name $GUEST_NAME $PUB_DEV_NR)
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Create an ssh-keypair, and set it up for dom0 user
|
|
||||||
rm -f /root/dom0key /root/dom0key.pub
|
|
||||||
ssh-keygen -f /root/dom0key -P "" -C "dom0"
|
|
||||||
DOMID=$(get_domid "$GUEST_NAME")
|
|
||||||
|
|
||||||
xenstore-write /local/domain/$DOMID/authorized_keys/$DOMZERO_USER "$(cat /root/dom0key.pub)"
|
|
||||||
xenstore-chmod -u /local/domain/$DOMID/authorized_keys/$DOMZERO_USER r$DOMID
|
|
||||||
|
|
||||||
function run_on_appliance {
|
|
||||||
ssh \
|
|
||||||
-i /root/dom0key \
|
|
||||||
-o UserKnownHostsFile=/dev/null \
|
|
||||||
-o StrictHostKeyChecking=no \
|
|
||||||
-o BatchMode=yes \
|
|
||||||
"$DOMZERO_USER@$OS_VM_MANAGEMENT_ADDRESS" "$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Wait until we can log in to the appliance
|
|
||||||
while ! run_on_appliance true; do
|
|
||||||
sleep 1
|
|
||||||
done
|
|
||||||
|
|
||||||
# Remove authenticated_keys updater cronjob
|
|
||||||
echo "" | run_on_appliance crontab -
|
|
||||||
|
|
||||||
# Generate a passwordless ssh key for domzero user
|
|
||||||
echo "ssh-keygen -f /home/$DOMZERO_USER/.ssh/id_rsa -C $DOMZERO_USER@appliance -N \"\" -q" | run_on_appliance
|
|
||||||
|
|
||||||
# Authenticate that user to dom0
|
|
||||||
run_on_appliance cat /home/$DOMZERO_USER/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
|
|
||||||
|
|
||||||
# If we have copied our ssh credentials, use ssh to monitor while the installation runs
|
|
||||||
WAIT_TILL_LAUNCH=${WAIT_TILL_LAUNCH:-1}
|
|
||||||
COPYENV=${COPYENV:-1}
|
|
||||||
if [ "$WAIT_TILL_LAUNCH" = "1" ] && [ -e ~/.ssh/id_rsa.pub ] && [ "$COPYENV" = "1" ]; then
|
|
||||||
set +x
|
|
||||||
|
|
||||||
echo "VM Launched - Waiting for run.sh"
|
|
||||||
while ! ssh_no_check -q stack@$OS_VM_MANAGEMENT_ADDRESS "test -e /opt/stack/run_sh.pid"; do
|
|
||||||
sleep 10
|
|
||||||
done
|
|
||||||
echo -n "devstack service is running, waiting for stack.sh to start logging..."
|
|
||||||
|
|
||||||
pid=`ssh_no_check -q stack@$OS_VM_MANAGEMENT_ADDRESS "cat /opt/stack/run_sh.pid"`
|
|
||||||
if [ -n "$SCREEN_LOGDIR" ]; then
|
|
||||||
while ! ssh_no_check -q stack@$OS_VM_MANAGEMENT_ADDRESS "test -e ${SCREEN_LOGDIR}/stack.log"; do
|
|
||||||
sleep 10
|
|
||||||
done
|
|
||||||
|
|
||||||
ssh_no_check -q stack@$OS_VM_MANAGEMENT_ADDRESS "tail --pid $pid -n +1 -f ${SCREEN_LOGDIR}/stack.log"
|
|
||||||
else
|
|
||||||
echo -n "SCREEN_LOGDIR not set; just waiting for process $pid to finish"
|
|
||||||
ssh_no_check -q stack@$OS_VM_MANAGEMENT_ADDRESS "wait $pid"
|
|
||||||
fi
|
|
||||||
|
|
||||||
set -x
|
|
||||||
# Fail if devstack did not succeed
|
|
||||||
ssh_no_check -q stack@$OS_VM_MANAGEMENT_ADDRESS 'test -e /opt/stack/runsh.succeeded'
|
|
||||||
|
|
||||||
set +x
|
|
||||||
echo "################################################################################"
|
|
||||||
echo ""
|
|
||||||
echo "All Finished!"
|
|
||||||
echo "You can visit the OpenStack Dashboard"
|
|
||||||
echo "at http://$OS_VM_SERVICES_ADDRESS, and contact other services at the usual ports."
|
|
||||||
else
|
|
||||||
set +x
|
|
||||||
echo "################################################################################"
|
|
||||||
echo ""
|
|
||||||
echo "All Finished!"
|
|
||||||
echo "Now, you can monitor the progress of the stack.sh installation by "
|
|
||||||
echo "looking at the console of your domU / checking the log files."
|
|
||||||
echo ""
|
|
||||||
echo "ssh into your domU now: 'ssh stack@$OS_VM_MANAGEMENT_ADDRESS' using your password"
|
|
||||||
echo "and then do: 'sudo systemctl status devstack' to check if devstack is still running."
|
|
||||||
echo "Check that /opt/stack/runsh.succeeded exists"
|
|
||||||
echo ""
|
|
||||||
echo "When devstack completes, you can visit the OpenStack Dashboard"
|
|
||||||
echo "at http://$OS_VM_SERVICES_ADDRESS, and contact other services at the usual ports."
|
|
||||||
fi
|
|
@ -1,92 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
test ! -e "$LIST_OF_ACTIONS" && {
|
|
||||||
echo "Mocking is not set up properly."
|
|
||||||
echo "LIST_OF_ACTIONS should point to an existing file."
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
test ! -e "$LIST_OF_DIRECTORIES" && {
|
|
||||||
echo "Mocking is not set up properly."
|
|
||||||
echo "LIST_OF_DIRECTORIES should point to an existing file."
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
test ! -e "$XE_RESPONSE" && {
|
|
||||||
echo "Mocking is not set up properly."
|
|
||||||
echo "XE_RESPONSE should point to an existing file."
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
test ! -e "$XE_CALLS" && {
|
|
||||||
echo "Mocking is not set up properly."
|
|
||||||
echo "XE_CALLS should point to an existing file."
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
function mktemp {
|
|
||||||
if test "${1:-}" = "-d";
|
|
||||||
then
|
|
||||||
echo "tempdir"
|
|
||||||
else
|
|
||||||
echo "tempfile"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
function wget {
|
|
||||||
if [[ $@ =~ "failurl" ]]; then
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
echo "wget $@" >> $LIST_OF_ACTIONS
|
|
||||||
}
|
|
||||||
|
|
||||||
function mkdir {
|
|
||||||
if test "${1:-}" = "-p";
|
|
||||||
then
|
|
||||||
echo "$2" >> $LIST_OF_DIRECTORIES
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
function unzip {
|
|
||||||
echo "Random rubbish from unzip"
|
|
||||||
echo "unzip $@" >> $LIST_OF_ACTIONS
|
|
||||||
}
|
|
||||||
|
|
||||||
function rm {
|
|
||||||
echo "rm $@" >> $LIST_OF_ACTIONS
|
|
||||||
}
|
|
||||||
|
|
||||||
function ln {
|
|
||||||
echo "ln $@" >> $LIST_OF_ACTIONS
|
|
||||||
}
|
|
||||||
|
|
||||||
function [ {
|
|
||||||
if test "${1:-}" = "-d";
|
|
||||||
then
|
|
||||||
echo "[ $@" >> $LIST_OF_ACTIONS
|
|
||||||
for directory in $(cat $LIST_OF_DIRECTORIES)
|
|
||||||
do
|
|
||||||
if test "$directory" = "$2"
|
|
||||||
then
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
echo "Mock test does not implement the requested function: ${1:-}"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
function die_with_error {
|
|
||||||
echo "$1" >> $DEAD_MESSAGES
|
|
||||||
}
|
|
||||||
|
|
||||||
function xe {
|
|
||||||
cat $XE_RESPONSE
|
|
||||||
{
|
|
||||||
for i in $(seq "$#")
|
|
||||||
do
|
|
||||||
eval "echo \"\$$i\""
|
|
||||||
done
|
|
||||||
} >> $XE_CALLS
|
|
||||||
}
|
|
@ -1,123 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# This script is run on an Ubuntu VM.
|
|
||||||
# This script is inserted into the VM by prepare_guest_template.sh
|
|
||||||
# and is run when that VM boots.
|
|
||||||
# It customizes a fresh Ubuntu install, so it is ready
|
|
||||||
# to run stack.sh
|
|
||||||
#
|
|
||||||
# This includes installing the XenServer tools,
|
|
||||||
# creating the user called "stack",
|
|
||||||
# and shuts down the VM to signal the script has completed
|
|
||||||
|
|
||||||
set -o errexit
|
|
||||||
set -o nounset
|
|
||||||
set -o xtrace
|
|
||||||
|
|
||||||
# Configurable nuggets
|
|
||||||
GUEST_PASSWORD="$1"
|
|
||||||
STACK_USER="$2"
|
|
||||||
DOMZERO_USER="$3"
|
|
||||||
|
|
||||||
|
|
||||||
function setup_domzero_user {
|
|
||||||
local username
|
|
||||||
|
|
||||||
username="$1"
|
|
||||||
|
|
||||||
local key_updater_script
|
|
||||||
local sudoers_file
|
|
||||||
key_updater_script="/home/$username/update_authorized_keys.sh"
|
|
||||||
sudoers_file="/etc/sudoers.d/allow_$username"
|
|
||||||
|
|
||||||
# Create user
|
|
||||||
adduser --disabled-password --quiet "$username" --gecos "$username"
|
|
||||||
|
|
||||||
# Give passwordless sudo
|
|
||||||
cat > $sudoers_file << EOF
|
|
||||||
$username ALL = NOPASSWD: ALL
|
|
||||||
EOF
|
|
||||||
chmod 0440 $sudoers_file
|
|
||||||
|
|
||||||
# A script to populate this user's authenticated_keys from xenstore
|
|
||||||
cat > $key_updater_script << EOF
|
|
||||||
#!/bin/bash
|
|
||||||
set -eux
|
|
||||||
|
|
||||||
DOMID=\$(sudo xenstore-read domid)
|
|
||||||
sudo xenstore-exists /local/domain/\$DOMID/authorized_keys/$username
|
|
||||||
sudo xenstore-read /local/domain/\$DOMID/authorized_keys/$username > /home/$username/xenstore_value
|
|
||||||
cat /home/$username/xenstore_value > /home/$username/.ssh/authorized_keys
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Give the key updater to the user
|
|
||||||
chown $username:$username $key_updater_script
|
|
||||||
chmod 0700 $key_updater_script
|
|
||||||
|
|
||||||
# Setup the .ssh folder
|
|
||||||
mkdir -p /home/$username/.ssh
|
|
||||||
chown $username:$username /home/$username/.ssh
|
|
||||||
chmod 0700 /home/$username/.ssh
|
|
||||||
touch /home/$username/.ssh/authorized_keys
|
|
||||||
chown $username:$username /home/$username/.ssh/authorized_keys
|
|
||||||
chmod 0600 /home/$username/.ssh/authorized_keys
|
|
||||||
|
|
||||||
# Setup the key updater as a cron job
|
|
||||||
crontab -u $username - << EOF
|
|
||||||
* * * * * $key_updater_script
|
|
||||||
EOF
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
# Make a small cracklib dictionary, so that passwd still works, but we don't
|
|
||||||
# have the big dictionary.
|
|
||||||
mkdir -p /usr/share/cracklib
|
|
||||||
echo a | cracklib-packer
|
|
||||||
|
|
||||||
# Make /etc/shadow, and set the root password
|
|
||||||
pwconv
|
|
||||||
echo "root:$GUEST_PASSWORD" | chpasswd
|
|
||||||
|
|
||||||
# Put the VPX into UTC.
|
|
||||||
rm -f /etc/localtime
|
|
||||||
|
|
||||||
# Add stack user
|
|
||||||
groupadd libvirtd
|
|
||||||
useradd $STACK_USER -s /bin/bash -d /opt/stack -G libvirtd
|
|
||||||
echo $STACK_USER:$GUEST_PASSWORD | chpasswd
|
|
||||||
echo "$STACK_USER ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
|
|
||||||
|
|
||||||
setup_domzero_user "$DOMZERO_USER"
|
|
||||||
|
|
||||||
# Add an udev rule, so that new block devices could be written by stack user
|
|
||||||
cat > /etc/udev/rules.d/50-openstack-blockdev.rules << EOF
|
|
||||||
KERNEL=="xvd[b-z]", GROUP="$STACK_USER", MODE="0660"
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Give ownership of /opt/stack to stack user
|
|
||||||
chown -R $STACK_USER /opt/stack
|
|
||||||
|
|
||||||
function setup_vimrc {
|
|
||||||
if [ ! -e $1 ]; then
|
|
||||||
# Simple but usable vimrc
|
|
||||||
cat > $1 <<EOF
|
|
||||||
se ts=4
|
|
||||||
se expandtab
|
|
||||||
se shiftwidth=4
|
|
||||||
EOF
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Setup simple .vimrcs
|
|
||||||
setup_vimrc /root/.vimrc
|
|
||||||
setup_vimrc /opt/stack/.vimrc
|
|
||||||
|
|
||||||
# remove self from local.rc
|
|
||||||
# so this script is not run again
|
|
||||||
rm -rf /etc/rc.local
|
|
||||||
|
|
||||||
# Restore rc.local file
|
|
||||||
cp /etc/rc.local.preparebackup /etc/rc.local
|
|
||||||
|
|
||||||
# shutdown to notify we are done
|
|
||||||
shutdown -h now
|
|
@ -1,94 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# This script is run by install_os_domU.sh
|
|
||||||
#
|
|
||||||
# Parameters:
|
|
||||||
# - $GUEST_NAME - hostname for the DomU VM
|
|
||||||
#
|
|
||||||
# It modifies the ubuntu image created by install_os_domU.sh
|
|
||||||
#
|
|
||||||
# This script is responsible for cusomtizing the fresh ubuntu
|
|
||||||
# image so on boot it runs the prepare_guest.sh script
|
|
||||||
# that modifies the VM so it is ready to run stack.sh.
|
|
||||||
# It does this by mounting the disk image of the VM.
|
|
||||||
#
|
|
||||||
# The resultant image is started by install_os_domU.sh,
|
|
||||||
# and once the VM has shutdown, build_xva.sh is run
|
|
||||||
|
|
||||||
set -o errexit
|
|
||||||
set -o nounset
|
|
||||||
set -o xtrace
|
|
||||||
|
|
||||||
# This directory
|
|
||||||
TOP_DIR=$(cd $(dirname "$0") && pwd)
|
|
||||||
|
|
||||||
# Include onexit commands
|
|
||||||
. $TOP_DIR/scripts/on_exit.sh
|
|
||||||
|
|
||||||
# xapi functions
|
|
||||||
. $TOP_DIR/functions
|
|
||||||
|
|
||||||
# Source params - override xenrc params in your localrc to suite your taste
|
|
||||||
source xenrc
|
|
||||||
|
|
||||||
#
|
|
||||||
# Parameters
|
|
||||||
#
|
|
||||||
GUEST_NAME="$1"
|
|
||||||
|
|
||||||
# Mount the VDI
|
|
||||||
STAGING_DIR=$($TOP_DIR/scripts/manage-vdi open $GUEST_NAME 0 1 | grep -o "/tmp/tmp.[[:alnum:]]*")
|
|
||||||
add_on_exit "$TOP_DIR/scripts/manage-vdi close $GUEST_NAME 0 1"
|
|
||||||
|
|
||||||
# Make sure we have a stage
|
|
||||||
if [ ! -d $STAGING_DIR/etc ]; then
|
|
||||||
echo "Stage is not properly set up!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Copy prepare_guest.sh to VM
|
|
||||||
mkdir -p $STAGING_DIR/opt/stack/
|
|
||||||
cp $TOP_DIR/prepare_guest.sh $STAGING_DIR/opt/stack/prepare_guest.sh
|
|
||||||
|
|
||||||
# backup rc.local
|
|
||||||
cp $STAGING_DIR/etc/rc.local $STAGING_DIR/etc/rc.local.preparebackup
|
|
||||||
|
|
||||||
# run prepare_guest.sh on boot
|
|
||||||
cat <<EOF >$STAGING_DIR/etc/rc.local
|
|
||||||
#!/bin/sh -e
|
|
||||||
bash /opt/stack/prepare_guest.sh \\
|
|
||||||
"$GUEST_PASSWORD" "$STACK_USER" "$DOMZERO_USER" \\
|
|
||||||
> /opt/stack/prepare_guest.log 2>&1
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Update ubuntu repositories
|
|
||||||
cat > $STAGING_DIR/etc/apt/sources.list << EOF
|
|
||||||
deb http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE} main restricted
|
|
||||||
deb-src http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE} main restricted
|
|
||||||
deb http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE}-updates main restricted
|
|
||||||
deb-src http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE}-updates main restricted
|
|
||||||
deb http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE} universe
|
|
||||||
deb-src http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE} universe
|
|
||||||
deb http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE}-updates universe
|
|
||||||
deb-src http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE}-updates universe
|
|
||||||
deb http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE} multiverse
|
|
||||||
deb-src http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE} multiverse
|
|
||||||
deb http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE}-updates multiverse
|
|
||||||
deb-src http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE}-updates multiverse
|
|
||||||
deb http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE}-backports main restricted universe multiverse
|
|
||||||
deb-src http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE}-backports main restricted universe multiverse
|
|
||||||
|
|
||||||
deb http://security.ubuntu.com/ubuntu ${UBUNTU_INST_RELEASE}-security main restricted
|
|
||||||
deb-src http://security.ubuntu.com/ubuntu ${UBUNTU_INST_RELEASE}-security main restricted
|
|
||||||
deb http://security.ubuntu.com/ubuntu ${UBUNTU_INST_RELEASE}-security universe
|
|
||||||
deb-src http://security.ubuntu.com/ubuntu ${UBUNTU_INST_RELEASE}-security universe
|
|
||||||
deb http://security.ubuntu.com/ubuntu ${UBUNTU_INST_RELEASE}-security multiverse
|
|
||||||
deb-src http://security.ubuntu.com/ubuntu ${UBUNTU_INST_RELEASE}-security multiverse
|
|
||||||
EOF
|
|
||||||
|
|
||||||
rm -f $STAGING_DIR/etc/apt/apt.conf
|
|
||||||
if [ -n "$UBUNTU_INST_HTTP_PROXY" ]; then
|
|
||||||
cat > $STAGING_DIR/etc/apt/apt.conf << EOF
|
|
||||||
Acquire::http::Proxy "$UBUNTU_INST_HTTP_PROXY";
|
|
||||||
EOF
|
|
||||||
fi
|
|
@ -1,135 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
# Copyright (c) 2011 Citrix Systems, Inc.
|
|
||||||
# Copyright 2011 OpenStack Foundation
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
#
|
|
||||||
|
|
||||||
set -eux
|
|
||||||
|
|
||||||
BRIDGE=
|
|
||||||
NAME_LABEL=
|
|
||||||
TEMPLATE_NAME=
|
|
||||||
|
|
||||||
usage()
|
|
||||||
{
|
|
||||||
cat << EOF
|
|
||||||
|
|
||||||
Usage: $0 -t TEMPLATE_NW_INSTALL -l NAME_LABEL [-n BRIDGE]
|
|
||||||
|
|
||||||
Install a VM from a template
|
|
||||||
|
|
||||||
OPTIONS:
|
|
||||||
|
|
||||||
-h Shows this message.
|
|
||||||
-t template VM template to use
|
|
||||||
-l name Specifies the name label for the VM.
|
|
||||||
-n bridge The bridge/network to use for eth0. Defaults to xenbr0
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
|
|
||||||
get_params()
|
|
||||||
{
|
|
||||||
while getopts "hbn:r:l:t:" OPTION; do
|
|
||||||
case $OPTION in
|
|
||||||
h) usage
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
n)
|
|
||||||
BRIDGE=$OPTARG
|
|
||||||
;;
|
|
||||||
l)
|
|
||||||
NAME_LABEL=$OPTARG
|
|
||||||
;;
|
|
||||||
t)
|
|
||||||
TEMPLATE_NAME=$OPTARG
|
|
||||||
;;
|
|
||||||
?)
|
|
||||||
usage
|
|
||||||
exit
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
if [[ -z $BRIDGE ]]; then
|
|
||||||
BRIDGE=xenbr0
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -z $TEMPLATE_NAME ]]; then
|
|
||||||
echo "Please specify a template name" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -z $NAME_LABEL ]]; then
|
|
||||||
echo "Please specify a name-label for the new VM" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
xe_min()
|
|
||||||
{
|
|
||||||
local cmd="$1"
|
|
||||||
shift
|
|
||||||
xe "$cmd" --minimal "$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
find_network()
|
|
||||||
{
|
|
||||||
result=$(xe_min network-list bridge="$1")
|
|
||||||
if [ "$result" = "" ]; then
|
|
||||||
result=$(xe_min network-list name-label="$1")
|
|
||||||
fi
|
|
||||||
echo "$result"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
create_vif()
|
|
||||||
{
|
|
||||||
local v="$1"
|
|
||||||
echo "Installing VM interface on [$BRIDGE]"
|
|
||||||
local out_network_uuid
|
|
||||||
out_network_uuid=$(find_network "$BRIDGE")
|
|
||||||
xe vif-create vm-uuid="$v" network-uuid="$out_network_uuid" device="0"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Make the VM auto-start on server boot.
|
|
||||||
set_auto_start()
|
|
||||||
{
|
|
||||||
local v="$1"
|
|
||||||
xe vm-param-set uuid="$v" other-config:auto_poweron=true
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
destroy_vifs()
|
|
||||||
{
|
|
||||||
local v="$1"
|
|
||||||
IFS=,
|
|
||||||
for vif in $(xe_min vif-list vm-uuid="$v"); do
|
|
||||||
xe vif-destroy uuid="$vif"
|
|
||||||
done
|
|
||||||
unset IFS
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
get_params "$@"
|
|
||||||
|
|
||||||
vm_uuid=$(xe_min vm-install template="$TEMPLATE_NAME" new-name-label="$NAME_LABEL")
|
|
||||||
destroy_vifs "$vm_uuid"
|
|
||||||
set_auto_start "$vm_uuid"
|
|
||||||
create_vif "$vm_uuid"
|
|
||||||
xe vm-param-set actions-after-reboot=Destroy uuid="$vm_uuid"
|
|
@ -1,84 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
# This creates an Ubuntu Server 32bit or 64bit template
|
|
||||||
# on Xenserver 5.6.x, 6.0.x and 6.1.x
|
|
||||||
# The template does a net install only
|
|
||||||
#
|
|
||||||
# Based on a script by: David Markey <david.markey@citrix.com>
|
|
||||||
#
|
|
||||||
|
|
||||||
set -o errexit
|
|
||||||
set -o nounset
|
|
||||||
set -o xtrace
|
|
||||||
|
|
||||||
# This directory
|
|
||||||
BASE_DIR=$(cd $(dirname "$0") && pwd)
|
|
||||||
|
|
||||||
# For default setings see xenrc
|
|
||||||
source $BASE_DIR/../xenrc
|
|
||||||
|
|
||||||
# Get the params
|
|
||||||
preseed_url=$1
|
|
||||||
|
|
||||||
# Delete template or skip template creation as required
|
|
||||||
previous_template=$(xe template-list name-label="$UBUNTU_INST_TEMPLATE_NAME" \
|
|
||||||
params=uuid --minimal)
|
|
||||||
if [ -n "$previous_template" ]; then
|
|
||||||
if $CLEAN_TEMPLATES; then
|
|
||||||
xe template-param-clear param-name=other-config uuid=$previous_template
|
|
||||||
xe template-uninstall template-uuid=$previous_template force=true
|
|
||||||
else
|
|
||||||
echo "Template $UBUNTU_INST_TEMPLATE_NAME already present"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Get built-in template
|
|
||||||
builtin_name="Debian Squeeze 6.0 (32-bit)"
|
|
||||||
builtin_uuid=$(xe template-list name-label="$builtin_name" --minimal)
|
|
||||||
if [[ -z $builtin_uuid ]]; then
|
|
||||||
echo "Can't find the Debian Squeeze 32bit template on your XenServer."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Clone built-in template to create new template
|
|
||||||
new_uuid=$(xe vm-clone uuid=$builtin_uuid \
|
|
||||||
new-name-label="$UBUNTU_INST_TEMPLATE_NAME")
|
|
||||||
disk_size=$(($OSDOMU_VDI_GB * 1024 * 1024 * 1024))
|
|
||||||
|
|
||||||
# Some of these settings can be found in example preseed files
|
|
||||||
# however these need to be answered before the netinstall
|
|
||||||
# is ready to fetch the preseed file, and as such must be here
|
|
||||||
# to get a fully automated install
|
|
||||||
pvargs="quiet console=hvc0 partman/default_filesystem=ext3 \
|
|
||||||
console-setup/ask_detect=false locale=${UBUNTU_INST_LOCALE} \
|
|
||||||
keyboard-configuration/layoutcode=${UBUNTU_INST_KEYBOARD} \
|
|
||||||
netcfg/choose_interface=eth0 \
|
|
||||||
netcfg/get_hostname=os netcfg/get_domain=os auto \
|
|
||||||
url=${preseed_url}"
|
|
||||||
|
|
||||||
if [ "$UBUNTU_INST_IP" != "dhcp" ]; then
|
|
||||||
netcfgargs="netcfg/disable_autoconfig=true \
|
|
||||||
netcfg/get_nameservers=${UBUNTU_INST_NAMESERVERS} \
|
|
||||||
netcfg/get_ipaddress=${UBUNTU_INST_IP} \
|
|
||||||
netcfg/get_netmask=${UBUNTU_INST_NETMASK} \
|
|
||||||
netcfg/get_gateway=${UBUNTU_INST_GATEWAY} \
|
|
||||||
netcfg/confirm_static=true"
|
|
||||||
pvargs="${pvargs} ${netcfgargs}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
xe template-param-set uuid=$new_uuid \
|
|
||||||
other-config:install-methods=http \
|
|
||||||
other-config:install-repository="http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY}" \
|
|
||||||
PV-args="$pvargs" \
|
|
||||||
other-config:debian-release="$UBUNTU_INST_RELEASE" \
|
|
||||||
other-config:default_template=true \
|
|
||||||
other-config:disks='<provision><disk device="0" size="'$disk_size'" sr="" bootable="true" type="system"/></provision>' \
|
|
||||||
other-config:install-arch="$UBUNTU_INST_ARCH"
|
|
||||||
|
|
||||||
if ! [ -z "$UBUNTU_INST_HTTP_PROXY" ]; then
|
|
||||||
xe template-param-set uuid=$new_uuid \
|
|
||||||
other-config:install-proxy="$UBUNTU_INST_HTTP_PROXY"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Ubuntu template installed uuid:$new_uuid"
|
|
@ -1,96 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -eux
|
|
||||||
|
|
||||||
action="$1"
|
|
||||||
vm="$2"
|
|
||||||
device="${3-0}"
|
|
||||||
part="${4-}"
|
|
||||||
|
|
||||||
function xe_min() {
|
|
||||||
local cmd="$1"
|
|
||||||
shift
|
|
||||||
xe "$cmd" --minimal "$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
function run_udev_settle() {
|
|
||||||
which_udev=$(which udevsettle) || true
|
|
||||||
if [ -n "$which_udev" ]; then
|
|
||||||
udevsettle
|
|
||||||
else
|
|
||||||
udevadm settle
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
vm_uuid=$(xe_min vm-list name-label="$vm")
|
|
||||||
vdi_uuid=$(xe_min vbd-list params=vdi-uuid vm-uuid="$vm_uuid" \
|
|
||||||
userdevice="$device")
|
|
||||||
|
|
||||||
dom0_uuid=$(xe_min vm-list is-control-domain=true)
|
|
||||||
|
|
||||||
function get_mount_device() {
|
|
||||||
vbd_uuid=$1
|
|
||||||
|
|
||||||
dev=$(xe_min vbd-list params=device uuid="$vbd_uuid")
|
|
||||||
if [[ "$dev" =~ "sm/" || "$dev" =~ "blktap-2/" ]]; then
|
|
||||||
DEBIAN_FRONTEND=noninteractive \
|
|
||||||
apt-get --option "Dpkg::Options::=--force-confold" --assume-yes \
|
|
||||||
install kpartx &> /dev/null || true
|
|
||||||
mapping=$(kpartx -av "/dev/$dev" | sed -ne 's,^add map \([a-z0-9\-]*\).*$,\1,p' | sed -ne "s,^\(.*${part}\)\$,\1,p")
|
|
||||||
if [ -z "$mapping" ]; then
|
|
||||||
echo "Failed to find mapping"
|
|
||||||
exit -1
|
|
||||||
fi
|
|
||||||
|
|
||||||
local device="/dev/mapper/${mapping}"
|
|
||||||
for (( i = 0; i < 5; i++ )) ; do
|
|
||||||
if [ -b $device ] ; then
|
|
||||||
echo $device
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
sleep 1
|
|
||||||
done
|
|
||||||
echo "ERROR: timed out waiting for dev-mapper"
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
echo "/dev/$dev$part"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
function clean_dev_mappings() {
|
|
||||||
dev=$(xe_min vbd-list params=device uuid="$vbd_uuid")
|
|
||||||
if [[ "$dev" =~ "sm/" || "$dev" =~ "blktap-2/" ]]; then
|
|
||||||
kpartx -dv "/dev/$dev"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
function open_vdi() {
|
|
||||||
vbd_uuid=$(xe vbd-create vm-uuid="$dom0_uuid" vdi-uuid="$vdi_uuid" \
|
|
||||||
device=autodetect)
|
|
||||||
mp=$(mktemp -d)
|
|
||||||
xe vbd-plug uuid="$vbd_uuid"
|
|
||||||
|
|
||||||
run_udev_settle
|
|
||||||
|
|
||||||
mount_device=$(get_mount_device "$vbd_uuid")
|
|
||||||
mount "$mount_device" "$mp"
|
|
||||||
echo "Your vdi is mounted at $mp"
|
|
||||||
}
|
|
||||||
|
|
||||||
function close_vdi() {
|
|
||||||
vbd_uuid=$(xe_min vbd-list vm-uuid="$dom0_uuid" vdi-uuid="$vdi_uuid")
|
|
||||||
mount_device=$(get_mount_device "$vbd_uuid")
|
|
||||||
run_udev_settle
|
|
||||||
umount "$mount_device"
|
|
||||||
|
|
||||||
clean_dev_mappings
|
|
||||||
|
|
||||||
xe vbd-unplug uuid=$vbd_uuid
|
|
||||||
xe vbd-destroy uuid=$vbd_uuid
|
|
||||||
}
|
|
||||||
|
|
||||||
if [ "$action" == "open" ]; then
|
|
||||||
open_vdi
|
|
||||||
elif [ "$action" == "close" ]; then
|
|
||||||
close_vdi
|
|
||||||
fi
|
|
@ -1,24 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -e
|
|
||||||
set -o xtrace
|
|
||||||
|
|
||||||
if [ -z "${on_exit_hooks:-}" ]; then
|
|
||||||
on_exit_hooks=()
|
|
||||||
fi
|
|
||||||
|
|
||||||
on_exit()
|
|
||||||
{
|
|
||||||
for i in $(seq $((${#on_exit_hooks[*]} - 1)) -1 0); do
|
|
||||||
eval "${on_exit_hooks[$i]}"
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
add_on_exit()
|
|
||||||
{
|
|
||||||
local n=${#on_exit_hooks[*]}
|
|
||||||
on_exit_hooks[$n]="$*"
|
|
||||||
if [[ $n -eq 0 ]]; then
|
|
||||||
trap on_exit EXIT
|
|
||||||
fi
|
|
||||||
}
|
|
@ -1,88 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
# Copyright (c) 2011 Citrix Systems, Inc.
|
|
||||||
# Copyright 2011 OpenStack Foundation
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
#
|
|
||||||
|
|
||||||
set -ex
|
|
||||||
|
|
||||||
# By default, don't remove the templates
|
|
||||||
REMOVE_TEMPLATES=${REMOVE_TEMPLATES:-"false"}
|
|
||||||
if [ "$1" = "--remove-templates" ]; then
|
|
||||||
REMOVE_TEMPLATES=true
|
|
||||||
fi
|
|
||||||
|
|
||||||
xe_min()
|
|
||||||
{
|
|
||||||
local cmd="$1"
|
|
||||||
shift
|
|
||||||
xe "$cmd" --minimal "$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
destroy_vdi()
|
|
||||||
{
|
|
||||||
local vbd_uuid="$1"
|
|
||||||
local type
|
|
||||||
type=$(xe_min vbd-list uuid=$vbd_uuid params=type)
|
|
||||||
local dev
|
|
||||||
dev=$(xe_min vbd-list uuid=$vbd_uuid params=userdevice)
|
|
||||||
local vdi_uuid
|
|
||||||
vdi_uuid=$(xe_min vbd-list uuid=$vbd_uuid params=vdi-uuid)
|
|
||||||
|
|
||||||
if [ "$type" == 'Disk' ] && [ "$dev" != 'xvda' ] && [ "$dev" != '0' ]; then
|
|
||||||
xe vdi-destroy uuid=$vdi_uuid
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
uninstall()
|
|
||||||
{
|
|
||||||
local vm_uuid="$1"
|
|
||||||
local power_state
|
|
||||||
power_state=$(xe_min vm-list uuid=$vm_uuid params=power-state)
|
|
||||||
|
|
||||||
if [ "$power_state" != "halted" ]; then
|
|
||||||
xe vm-shutdown vm=$vm_uuid force=true
|
|
||||||
fi
|
|
||||||
|
|
||||||
for v in $(xe_min vbd-list vm-uuid=$vm_uuid | sed -e 's/,/ /g'); do
|
|
||||||
destroy_vdi "$v"
|
|
||||||
done
|
|
||||||
|
|
||||||
xe vm-uninstall vm=$vm_uuid force=true >/dev/null
|
|
||||||
}
|
|
||||||
|
|
||||||
uninstall_template()
|
|
||||||
{
|
|
||||||
local vm_uuid="$1"
|
|
||||||
|
|
||||||
for v in $(xe_min vbd-list vm-uuid=$vm_uuid | sed -e 's/,/ /g'); do
|
|
||||||
destroy_vdi "$v"
|
|
||||||
done
|
|
||||||
|
|
||||||
xe template-uninstall template-uuid=$vm_uuid force=true >/dev/null
|
|
||||||
}
|
|
||||||
|
|
||||||
# remove the VMs and their disks
|
|
||||||
for u in $(xe_min vm-list other-config:os-vpx=true | sed -e 's/,/ /g'); do
|
|
||||||
uninstall "$u"
|
|
||||||
done
|
|
||||||
|
|
||||||
# remove the templates
|
|
||||||
if [ "$REMOVE_TEMPLATES" == "true" ]; then
|
|
||||||
for u in $(xe_min template-list other-config:os-vpx=true | sed -e 's/,/ /g'); do
|
|
||||||
uninstall_template "$u"
|
|
||||||
done
|
|
||||||
fi
|
|
@ -1,205 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Tests for functions.
|
|
||||||
#
|
|
||||||
# The tests are sourcing the mocks file to mock out various functions. The
|
|
||||||
# mocking-out always happens in a sub-shell, thus it does not have impact on
|
|
||||||
# the functions defined here.
|
|
||||||
|
|
||||||
# To run the tests, please run:
|
|
||||||
#
|
|
||||||
# ./test_functions.sh run_tests
|
|
||||||
#
|
|
||||||
# To only print out the discovered test functions, run:
|
|
||||||
#
|
|
||||||
# ./test_functions.sh
|
|
||||||
|
|
||||||
. functions
|
|
||||||
|
|
||||||
# Setup
|
|
||||||
function before_each_test {
|
|
||||||
LIST_OF_DIRECTORIES=$(mktemp)
|
|
||||||
truncate -s 0 $LIST_OF_DIRECTORIES
|
|
||||||
|
|
||||||
LIST_OF_ACTIONS=$(mktemp)
|
|
||||||
truncate -s 0 $LIST_OF_ACTIONS
|
|
||||||
|
|
||||||
XE_RESPONSE=$(mktemp)
|
|
||||||
truncate -s 0 $XE_RESPONSE
|
|
||||||
|
|
||||||
XE_CALLS=$(mktemp)
|
|
||||||
truncate -s 0 $XE_CALLS
|
|
||||||
|
|
||||||
DEAD_MESSAGES=$(mktemp)
|
|
||||||
truncate -s 0 $DEAD_MESSAGES
|
|
||||||
}
|
|
||||||
|
|
||||||
# Teardown
|
|
||||||
function after_each_test {
|
|
||||||
rm -f $LIST_OF_DIRECTORIES
|
|
||||||
rm -f $LIST_OF_ACTIONS
|
|
||||||
rm -f $XE_RESPONSE
|
|
||||||
rm -f $XE_CALLS
|
|
||||||
}
|
|
||||||
|
|
||||||
# Helpers
|
|
||||||
function setup_xe_response {
|
|
||||||
echo "$1" > $XE_RESPONSE
|
|
||||||
}
|
|
||||||
|
|
||||||
function given_directory_exists {
|
|
||||||
echo "$1" >> $LIST_OF_DIRECTORIES
|
|
||||||
}
|
|
||||||
|
|
||||||
function assert_directory_exists {
|
|
||||||
grep "$1" $LIST_OF_DIRECTORIES
|
|
||||||
}
|
|
||||||
|
|
||||||
function assert_previous_command_failed {
|
|
||||||
[ "$?" != "0" ] || exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
function assert_xe_min {
|
|
||||||
grep -qe "^--minimal\$" $XE_CALLS
|
|
||||||
}
|
|
||||||
|
|
||||||
function assert_xe_param {
|
|
||||||
grep -qe "^$1\$" $XE_CALLS
|
|
||||||
}
|
|
||||||
|
|
||||||
function assert_died_with {
|
|
||||||
diff -u <(echo "$1") $DEAD_MESSAGES
|
|
||||||
}
|
|
||||||
|
|
||||||
function mock_out {
|
|
||||||
local FNNAME="$1"
|
|
||||||
local OUTPUT="$2"
|
|
||||||
|
|
||||||
. <(cat << EOF
|
|
||||||
function $FNNAME {
|
|
||||||
echo "$OUTPUT"
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
function assert_symlink {
|
|
||||||
grep -qe "^ln -s $2 $1\$" $LIST_OF_ACTIONS
|
|
||||||
}
|
|
||||||
|
|
||||||
# Tests
|
|
||||||
function test_plugin_directory_on_xenserver {
|
|
||||||
given_directory_exists "/etc/xapi.d/plugins/"
|
|
||||||
|
|
||||||
PLUGDIR=$(. mocks && xapi_plugin_location)
|
|
||||||
|
|
||||||
[ "/etc/xapi.d/plugins/" = "$PLUGDIR" ]
|
|
||||||
}
|
|
||||||
|
|
||||||
function test_plugin_directory_on_xcp {
|
|
||||||
given_directory_exists "/usr/lib/xcp/plugins/"
|
|
||||||
|
|
||||||
PLUGDIR=$(. mocks && xapi_plugin_location)
|
|
||||||
|
|
||||||
[ "/usr/lib/xcp/plugins/" = "$PLUGDIR" ]
|
|
||||||
}
|
|
||||||
|
|
||||||
function test_no_plugin_directory_found {
|
|
||||||
set +e
|
|
||||||
|
|
||||||
local IGNORE
|
|
||||||
IGNORE=$(. mocks && xapi_plugin_location)
|
|
||||||
|
|
||||||
assert_previous_command_failed
|
|
||||||
|
|
||||||
grep "[ -d /etc/xapi.d/plugins/ ]" $LIST_OF_ACTIONS
|
|
||||||
grep "[ -d /usr/lib/xcp/plugins/ ]" $LIST_OF_ACTIONS
|
|
||||||
}
|
|
||||||
|
|
||||||
function test_create_directory_for_kernels {
|
|
||||||
(
|
|
||||||
. mocks
|
|
||||||
mock_out get_local_sr_path /var/run/sr-mount/uuid1
|
|
||||||
create_directory_for_kernels
|
|
||||||
)
|
|
||||||
|
|
||||||
assert_directory_exists "/var/run/sr-mount/uuid1/os-guest-kernels"
|
|
||||||
assert_symlink "/boot/guest" "/var/run/sr-mount/uuid1/os-guest-kernels"
|
|
||||||
}
|
|
||||||
|
|
||||||
function test_create_directory_for_kernels_existing_dir {
|
|
||||||
(
|
|
||||||
. mocks
|
|
||||||
given_directory_exists "/boot/guest"
|
|
||||||
create_directory_for_kernels
|
|
||||||
)
|
|
||||||
|
|
||||||
diff -u $LIST_OF_ACTIONS - << EOF
|
|
||||||
[ -d /boot/guest ]
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
|
|
||||||
function test_create_directory_for_images {
|
|
||||||
(
|
|
||||||
. mocks
|
|
||||||
mock_out get_local_sr_path /var/run/sr-mount/uuid1
|
|
||||||
create_directory_for_images
|
|
||||||
)
|
|
||||||
|
|
||||||
assert_directory_exists "/var/run/sr-mount/uuid1/os-images"
|
|
||||||
assert_symlink "/images" "/var/run/sr-mount/uuid1/os-images"
|
|
||||||
}
|
|
||||||
|
|
||||||
function test_create_directory_for_images_existing_dir {
|
|
||||||
(
|
|
||||||
. mocks
|
|
||||||
given_directory_exists "/images"
|
|
||||||
create_directory_for_images
|
|
||||||
)
|
|
||||||
|
|
||||||
diff -u $LIST_OF_ACTIONS - << EOF
|
|
||||||
[ -d /images ]
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
|
|
||||||
function test_get_local_sr {
|
|
||||||
setup_xe_response "uuid123"
|
|
||||||
|
|
||||||
local RESULT
|
|
||||||
RESULT=$(. mocks && get_local_sr)
|
|
||||||
|
|
||||||
[ "$RESULT" == "uuid123" ]
|
|
||||||
|
|
||||||
assert_xe_param "pool-list" params=default-SR minimal=true
|
|
||||||
}
|
|
||||||
|
|
||||||
function test_get_local_sr_path {
|
|
||||||
local RESULT
|
|
||||||
RESULT=$(mock_out get_local_sr "uuid1" && get_local_sr_path)
|
|
||||||
|
|
||||||
[ "/var/run/sr-mount/uuid1" == "$RESULT" ]
|
|
||||||
}
|
|
||||||
|
|
||||||
# Test runner
|
|
||||||
[ "$1" = "" ] && {
|
|
||||||
grep -e "^function *test_" $0 | cut -d" " -f2
|
|
||||||
}
|
|
||||||
|
|
||||||
[ "$1" = "run_tests" ] && {
|
|
||||||
for testname in $($0); do
|
|
||||||
echo "$testname"
|
|
||||||
before_each_test
|
|
||||||
(
|
|
||||||
set -eux
|
|
||||||
$testname
|
|
||||||
)
|
|
||||||
if [ "$?" != "0" ]; then
|
|
||||||
echo "FAIL"
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
echo "PASS"
|
|
||||||
fi
|
|
||||||
|
|
||||||
after_each_test
|
|
||||||
done
|
|
||||||
}
|
|
114
tools/xen/xenrc
114
tools/xen/xenrc
@ -1,114 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
#
|
|
||||||
# XenServer specific defaults for the /tools/xen/ scripts
|
|
||||||
# Similar to stackrc, you can override these in your localrc
|
|
||||||
#
|
|
||||||
|
|
||||||
# Name of this guest
|
|
||||||
GUEST_NAME=${GUEST_NAME:-DevStackOSDomU}
|
|
||||||
|
|
||||||
# Template cleanup
|
|
||||||
CLEAN_TEMPLATES=${CLEAN_TEMPLATES:-false}
|
|
||||||
|
|
||||||
# Size of image
|
|
||||||
VDI_MB=${VDI_MB:-5000}
|
|
||||||
|
|
||||||
# Devstack now contains many components. 4GB ram is not enough to prevent
|
|
||||||
# swapping and memory fragmentation - the latter of which can cause failures
|
|
||||||
# such as blkfront failing to plug a VBD and lead to random test fails.
|
|
||||||
#
|
|
||||||
# Set to 6GB so an 8GB XenServer VM can have a 1GB Dom0 and leave 1GB for VMs
|
|
||||||
OSDOMU_MEM_MB=6144
|
|
||||||
OSDOMU_VDI_GB=8
|
|
||||||
|
|
||||||
# Network mapping. Specify bridge names or network names. Network names may
|
|
||||||
# differ across localised versions of XenServer. If a given bridge/network
|
|
||||||
# was not found, a new network will be created with the specified name.
|
|
||||||
|
|
||||||
# Get the management network from the XS installation
|
|
||||||
VM_BRIDGE_OR_NET_NAME="OpenStack VM Network"
|
|
||||||
PUB_BRIDGE_OR_NET_NAME="OpenStack Public Network"
|
|
||||||
|
|
||||||
# VM Password
|
|
||||||
GUEST_PASSWORD=${GUEST_PASSWORD:-secret}
|
|
||||||
|
|
||||||
# Extracted variables for OpenStack VM network device numbers.
|
|
||||||
# Make sure they form a continuous sequence starting from 0
|
|
||||||
MGT_DEV_NR=0
|
|
||||||
VM_DEV_NR=1
|
|
||||||
PUB_DEV_NR=2
|
|
||||||
|
|
||||||
# Host Interface, i.e. the interface on the nova vm you want to expose the
|
|
||||||
# services on. Usually the device connected to the management network or the
|
|
||||||
# one connected to the public network is used.
|
|
||||||
HOST_IP_IFACE=${HOST_IP_IFACE:-"eth${MGT_DEV_NR}"}
|
|
||||||
|
|
||||||
#
|
|
||||||
# Our nova host's network info
|
|
||||||
#
|
|
||||||
|
|
||||||
# Management network
|
|
||||||
MGT_IP=${MGT_IP:-dhcp}
|
|
||||||
MGT_NETMASK=${MGT_NETMASK:-ignored}
|
|
||||||
|
|
||||||
# VM Network
|
|
||||||
VM_IP=${VM_IP:-10.255.255.255}
|
|
||||||
VM_NETMASK=${VM_NETMASK:-255.255.255.0}
|
|
||||||
|
|
||||||
# Public network
|
|
||||||
# Aligned with stack.sh - see FLOATING_RANGE
|
|
||||||
PUB_IP=${PUB_IP:-172.24.4.10}
|
|
||||||
PUB_NETMASK=${PUB_NETMASK:-255.255.255.0}
|
|
||||||
|
|
||||||
# Ubuntu install settings
|
|
||||||
UBUNTU_INST_RELEASE="xenial"
|
|
||||||
UBUNTU_INST_TEMPLATE_NAME="Ubuntu 16.04 (64-bit) for DevStack"
|
|
||||||
# For 12.04 use "precise" and update template name
|
|
||||||
# However, for 12.04, you should be using
|
|
||||||
# XenServer 6.1 and later or XCP 1.6 or later
|
|
||||||
# 11.10 is only really supported with XenServer 6.0.2 and later
|
|
||||||
UBUNTU_INST_ARCH="amd64"
|
|
||||||
UBUNTU_INST_HTTP_HOSTNAME="archive.ubuntu.com"
|
|
||||||
UBUNTU_INST_HTTP_DIRECTORY="/ubuntu"
|
|
||||||
UBUNTU_INST_HTTP_PROXY=""
|
|
||||||
UBUNTU_INST_LOCALE="en_US"
|
|
||||||
UBUNTU_INST_KEYBOARD="us"
|
|
||||||
# network configuration for ubuntu netinstall
|
|
||||||
UBUNTU_INST_IP="dhcp"
|
|
||||||
UBUNTU_INST_NAMESERVERS=""
|
|
||||||
UBUNTU_INST_NETMASK=""
|
|
||||||
UBUNTU_INST_GATEWAY=""
|
|
||||||
|
|
||||||
# Create a separate xvdb. Tis could be used as a backing device for cinder
|
|
||||||
# volumes. Specify
|
|
||||||
# XEN_XVDB_SIZE_GB=10
|
|
||||||
# VOLUME_BACKING_DEVICE=/dev/xvdb
|
|
||||||
# in your localrc to avoid kernel lockups:
|
|
||||||
# https://bugs.launchpad.net/cinder/+bug/1023755
|
|
||||||
#
|
|
||||||
# Set the size to 0 to avoid creation of additional disk.
|
|
||||||
XEN_XVDB_SIZE_GB=0
|
|
||||||
|
|
||||||
STACK_USER=stack
|
|
||||||
DOMZERO_USER=domzero
|
|
||||||
|
|
||||||
RC_DIR="../.."
|
|
||||||
|
|
||||||
restore_nounset=$(set +o | grep nounset)
|
|
||||||
set +u
|
|
||||||
|
|
||||||
## Note that the lines below are coming from stackrc to support
|
|
||||||
## new-style config files
|
|
||||||
source $RC_DIR/functions-common
|
|
||||||
|
|
||||||
# allow local overrides of env variables, including repo config
|
|
||||||
if [[ -f $RC_DIR/localrc ]]; then
|
|
||||||
# Old-style user-supplied config
|
|
||||||
source $RC_DIR/localrc
|
|
||||||
elif [[ -f $RC_DIR/.localrc.auto ]]; then
|
|
||||||
# New-style user-supplied config extracted from local.conf
|
|
||||||
source $RC_DIR/.localrc.auto
|
|
||||||
fi
|
|
||||||
|
|
||||||
$restore_nounset
|
|
Loading…
Reference in New Issue
Block a user