diff --git a/tools/xen/README.md b/tools/xen/README.md index 9f3908028d..f0e6859121 100644 --- a/tools/xen/README.md +++ b/tools/xen/README.md @@ -25,15 +25,9 @@ Steps to follow: The `install_os_domU.sh` script will: - Setup XenAPI plugins - Create the named networks, if they don't exist - - Install an Ubuntu Virtual Machine, with 4 network interfaces: - - eth0 - internal xapi interface - - eth1 - VM interface, connected to `VM_BRIDGE_OR_NET_NAME` defaults to - `"OpenStack VM Network"`. - - eth2 - Management interface, connected to `MGT_BRIDGE_OR_NET_NAME`, - defaults to `xenbr0`, XenServer's bridge associated with the Hypervisors - `eth0`. - - eth3 - Public interface, connected to `PUB_BRIDGE_OR_NET_NAME` defaults to - `"OpenStack Public Network"`. + - Preseed-Netinstall an Ubuntu Virtual Machine, 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` @@ -100,9 +94,6 @@ Of course, use real passwords if this machine is exposed. # Give extra time for boot ACTIVE_TIMEOUT=45 - # Settings for netinstalling Ubuntu - UBUNTU_INST_RELEASE=precise - # NOTE: the value of FLAT_NETWORK_BRIDGE will automatically be determined # by install_os_domU.sh script. EOF diff --git a/tools/xen/install_os_domU.sh b/tools/xen/install_os_domU.sh index be4aa16394..63295d1b51 100755 --- a/tools/xen/install_os_domU.sh +++ b/tools/xen/install_os_domU.sh @@ -198,13 +198,11 @@ if [ -z "$templateuuid" ]; then # Update the template $THIS_DIR/scripts/install_ubuntu_template.sh $PRESEED_URL - # create a new VM with the given template - # creating the correct VIFs and metadata + # 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" \ - -v "$VM_BRIDGE_OR_NET_NAME" \ - -m "$MGT_BRIDGE_OR_NET_NAME" \ - -p "$PUB_BRIDGE_OR_NET_NAME" \ + -n "$UBUNTU_INST_BRIDGE_OR_NET_NAME" \ -l "$GUEST_NAME" \ -r "$OSDOMU_MEM_MB" diff --git a/tools/xen/scripts/install-os-vpx.sh b/tools/xen/scripts/install-os-vpx.sh index c82f8702ba..8ee8b675a9 100755 --- a/tools/xen/scripts/install-os-vpx.sh +++ b/tools/xen/scripts/install-os-vpx.sh @@ -19,106 +19,48 @@ set -eux -[[ -f "/etc/xensource-inventory" ]] && source "/etc/xensource-inventory" || source "/etc/xcp/inventory" - -NAME="XenServer OpenStack VPX" -DATA_VDI_SIZE="500MiB" -BRIDGE_M= -BRIDGE_P= -VPX_FILE=os-vpx.xva -AS_TEMPLATE= -FROM_TEMPLATE= +BRIDGE= RAM= -WAIT_FOR_NETWORK= BALLOONING= +NAME_LABEL= +TEMPLATE_NAME= usage() { cat << EOF - Usage: $0 [-f FILE_PATH] [-d DISK_SIZE] [-v BRIDGE_NAME] [-m BRIDGE_NAME] [-p BRIDGE_NAME] - [-r RAM] [-i|-c] [-w] [-b] [-l NAME_LABEL] [-t TEMPLATE_NW_INSTALL] + Usage: $0 -t TEMPLATE_NW_INSTALL -l NAME_LABEL [-n BRIDGE] [-r RAM] [-b] - Installs XenServer OpenStack VPX. + Install a VM from a template OPTIONS: -h Shows this message. - -i Install OpenStack VPX as template. - -c Clone from existing template. - -w Wait for the network settings to show up before exiting. + -t template VM template to use -b Enable memory ballooning. When set min_RAM=RAM/2 max_RAM=RAM. - -f path Specifies the path to the XVA. - Default to ./os-vpx.xva. - -d disk-size Specifies the size in MiB for the data disk. - Defaults to 500 MiB. - -m bridge Specifies the bridge for the isolated management network. - Defaults to xenbr0. - -v bridge Specifies the bridge for the vm network - -p bridge Specifies the bridge for the externally facing network. -r MiB Specifies RAM used by the VPX, in MiB. By default it will take the value from the XVA. -l name Specifies the name label for the VM. - -t template Network install an openstack domU from this template - - EXAMPLES: - - Create a VPX that connects to the isolated management network using the - default bridge with a data disk of 1GiB: - install-os-vpx.sh -f /root/os-vpx-devel.xva -d 1024 - - Create a VPX that connects to the isolated management network using xenbr1 - as bridge: - install-os-vpx.sh -m xenbr1 - - Create a VPX that connects to both the management and public networks - using xenbr1 and xapi4 as bridges: - install-os-vpx.sh -m xenbr1 -p xapi4 - - Create a VPX that connects to both the management and public networks - using the default for management traffic: - install-os-vpx.sh -m xapi4 - + -n bridge The bridge/network to use for eth0. Defaults to xenbr0 EOF } get_params() { - while getopts "hicwbf:d:v:m:p:r:l:t:" OPTION; + while getopts "hbn:r:l:t:" OPTION; do case $OPTION in h) usage exit 1 ;; - i) - AS_TEMPLATE=1 - ;; - c) - FROM_TEMPLATE=1 - ;; - w) - WAIT_FOR_NETWORK=1 - ;; b) BALLOONING=1 ;; - f) - VPX_FILE=$OPTARG - ;; - d) - DATA_VDI_SIZE="${OPTARG}MiB" - ;; - m) - BRIDGE_M=$OPTARG - ;; - p) - BRIDGE_P=$OPTARG - ;; r) RAM=$OPTARG ;; - v) - BRIDGE_V=$OPTARG + n) + BRIDGE=$OPTARG ;; l) NAME_LABEL=$OPTARG @@ -132,9 +74,19 @@ get_params() ;; esac done - if [[ -z $BRIDGE_M ]] + if [[ -z $BRIDGE ]] then - BRIDGE_M=xenbr0 + 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 } @@ -147,34 +99,6 @@ xe_min() } -get_dest_sr() -{ - IFS=, - sr_uuids=$(xe sr-list --minimal other-config:i18n-key=local-storage) - dest_sr="" - for sr_uuid in $sr_uuids - do - pbd=$(xe pbd-list --minimal sr-uuid=$sr_uuid host-uuid=$INSTALLATION_UUID) - if [ "$pbd" ] - then - echo "$sr_uuid" - unset IFS - return - fi - done - unset IFS - - dest_sr=$(xe_min sr-list uuid=$(xe_min pool-list params=default-SR)) - if [ "$dest_sr" = "" ] - then - echo "No local storage and no default storage; cannot import VPX." >&2 - exit 1 - else - echo "$dest_sr" - fi -} - - find_network() { result=$(xe_min network-list bridge="$1") @@ -186,137 +110,12 @@ find_network() } -find_template() -{ - xe_min template-list other-config:os-vpx=true -} - - -renumber_system_disk() -{ - local v="$1" - local vdi_uuid=$(xe_min vbd-list vm-uuid="$v" type=Disk userdevice=xvda \ - params=vdi-uuid) - if [ "$vdi_uuid" ] - then - local vbd_uuid=$(xe_min vbd-list vm-uuid="$v" vdi-uuid="$vdi_uuid") - xe vbd-destroy uuid="$vbd_uuid" - local new_vbd_uuid=$(xe vbd-create vm-uuid="$v" vdi-uuid="$vdi_uuid" \ - device=0 bootable=true type=Disk) - xe vbd-param-set other-config:owner uuid="$new_vbd_uuid" - fi -} - - create_vif() -{ - xe vif-create vm-uuid="$1" network-uuid="$2" device="$3" -} - -create_gi_vif() { local v="$1" - # Note that we've made the outbound device eth1, so that it comes up after - # the guest installer VIF, which means that the outbound one wins in terms - # of gateway. - local gi_network_uuid=$(xe_min network-list \ - other-config:is_guest_installer_network=true) - create_vif "$v" "$gi_network_uuid" "0" >/dev/null -} - -create_vm_vif() -{ - local v="$1" - echo "Installing VM interface on $BRIDGE_V." - local out_network_uuid=$(find_network "$BRIDGE_V") - create_vif "$v" "$out_network_uuid" "1" >/dev/null -} - -create_management_vif() -{ - local v="$1" - echo "Installing management interface on $BRIDGE_M." - local out_network_uuid=$(find_network "$BRIDGE_M") - create_vif "$v" "$out_network_uuid" "2" >/dev/null -} - - -# This installs the interface for public traffic, only if a bridge is specified -# The interface is not configured at this stage, but it will be, once the admin -# tasks are complete for the services of this VPX -create_public_vif() -{ - local v="$1" - if [[ -z $BRIDGE_P ]] - then - echo "Skipping installation of interface for public traffic." - else - echo "Installing public interface on $BRIDGE_P." - pub_network_uuid=$(find_network "$BRIDGE_P") - create_vif "$v" "$pub_network_uuid" "3" >/dev/null - fi -} - - -label_system_disk() -{ - local v="$1" - local vdi_uuid=$(xe_min vbd-list vm-uuid="$v" type=Disk userdevice=0 \ - params=vdi-uuid) - xe vdi-param-set \ - name-label="$NAME system disk" \ - other-config:os-vpx=true \ - uuid=$vdi_uuid -} - - -create_data_disk() -{ - local v="$1" - - local sys_vdi_uuid=$(xe_min vbd-list vm-uuid="$v" type=Disk params=vdi-uuid) - local data_vdi_uuid=$(xe_min vdi-list other-config:os-vpx-data=true) - - if echo "$data_vdi_uuid" | grep -q , - then - echo "Multiple data disks found -- assuming that you want a new one." - data_vdi_uuid="" - else - data_in_use=$(xe_min vbd-list vdi-uuid="$data_vdi_uuid") - if [ "$data_in_use" != "" ] - then - echo "Data disk already in use -- will create another one." - data_vdi_uuid="" - fi - fi - - if [ "$data_vdi_uuid" = "" ] - then - echo -n "Creating new data disk ($DATA_VDI_SIZE)... " - sr_uuid=$(xe_min vdi-list params=sr-uuid uuid="$sys_vdi_uuid") - data_vdi_uuid=$(xe vdi-create name-label="$NAME data disk" \ - sr-uuid="$sr_uuid" \ - type=user \ - virtual-size="$DATA_VDI_SIZE") - xe vdi-param-set \ - other-config:os-vpx-data=true \ - uuid="$data_vdi_uuid" - dom0_uuid=$(xe_min vm-list is-control-domain=true) - vbd_uuid=$(xe vbd-create device=autodetect type=Disk \ - vdi-uuid="$data_vdi_uuid" vm-uuid="$dom0_uuid") - xe vbd-plug uuid=$vbd_uuid - dev=$(xe_min vbd-list params=device uuid=$vbd_uuid) - mke2fs -q -j -m0 /dev/$dev - e2label /dev/$dev vpxstate - xe vbd-unplug uuid=$vbd_uuid - xe vbd-destroy uuid=$vbd_uuid - else - echo -n "Attaching old data disk... " - fi - vbd_uuid=$(xe vbd-create device=2 type=Disk \ - vdi-uuid="$data_vdi_uuid" vm-uuid="$v") - xe vbd-param-set other-config:os-vpx-data=true uuid=$vbd_uuid - echo "done." + echo "Installing VM interface on [$BRIDGE]" + local out_network_uuid=$(find_network "$BRIDGE") + xe vif-create vm-uuid="$v" network-uuid="$out_network_uuid" device="0" } @@ -342,34 +141,6 @@ set_auto_start() } -set_all() -{ - local v="$1" - set_memory "$v" - set_auto_start "$v" - label_system_disk "$v" - create_gi_vif "$v" - create_vm_vif "$v" - create_management_vif "$v" - create_public_vif "$v" -} - - -log_vifs() -{ - local v="$1" - - (IFS=, - for vif in $(xe_min vif-list vm-uuid="$v") - do - dev=$(xe_min vif-list uuid="$vif" params=device) - mac=$(xe_min vif-list uuid="$vif" params=MAC | sed -e 's/:/-/g') - echo "eth$dev has MAC $mac." - done - unset IFS) | sort -} - - destroy_vifs() { local v="$1" @@ -384,116 +155,11 @@ destroy_vifs() get_params "$@" -thisdir=$(dirname "$0") - -if [ "$FROM_TEMPLATE" ] -then - template_uuid=$(find_template) - name=$(xe_min template-list params=name-label uuid="$template_uuid") - echo -n "Cloning $name... " - vm_uuid=$(xe vm-clone vm="$template_uuid" new-name-label="$name") - xe vm-param-set is-a-template=false uuid="$vm_uuid" - echo $vm_uuid. - - destroy_vifs "$vm_uuid" - set_all "$vm_uuid" -elif [ "$TEMPLATE_NAME" ] -then - echo $TEMPLATE_NAME - vm_uuid=$(xe_min vm-install template="$TEMPLATE_NAME" new-name-label="$NAME_LABEL") - destroy_vifs "$vm_uuid" - set_auto_start "$vm_uuid" - create_gi_vif "$vm_uuid" - create_vm_vif "$vm_uuid" - create_management_vif "$vm_uuid" - create_public_vif "$vm_uuid" - xe vm-param-set other-config:os-vpx=true uuid="$vm_uuid" - xe vm-param-set actions-after-reboot=Destroy uuid="$vm_uuid" - set_memory "$vm_uuid" -else - if [ ! -f "$VPX_FILE" ] - then - # Search $thisdir/$VPX_FILE too. In particular, this is used when - # installing the VPX from the supp-pack, because we want to be able to - # invoke this script from the RPM and the firstboot script. - if [ -f "$thisdir/$VPX_FILE" ] - then - VPX_FILE="$thisdir/$VPX_FILE" - else - echo "$VPX_FILE does not exist." >&2 - exit 1 - fi - fi - - echo "Found OS-VPX File: $VPX_FILE. " - - dest_sr=$(get_dest_sr) - - echo -n "Installing $NAME... " - vm_uuid=$(xe vm-import filename=$VPX_FILE sr-uuid="$dest_sr") - echo $vm_uuid. - - renumber_system_disk "$vm_uuid" - - nl=${NAME_LABEL:-$(xe_min vm-list params=name-label uuid=$vm_uuid)} - xe vm-param-set \ - "name-label=${nl/ import/}" \ - other-config:os-vpx=true \ - uuid=$vm_uuid - - set_all "$vm_uuid" - create_data_disk "$vm_uuid" - - if [ "$AS_TEMPLATE" ] - then - xe vm-param-set uuid="$vm_uuid" is-a-template=true \ - other-config:instant=true - echo -n "Installing VPX from template... " - vm_uuid=$(xe vm-clone vm="$vm_uuid" new-name-label="${nl/ import/}") - xe vm-param-set is-a-template=false uuid="$vm_uuid" - echo "$vm_uuid." - fi -fi - - -log_vifs "$vm_uuid" - -echo -n "Starting VM... " +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 other-config:os-vpx=true uuid="$vm_uuid" +xe vm-param-set actions-after-reboot=Destroy uuid="$vm_uuid" +set_memory "$vm_uuid" xe vm-start uuid=$vm_uuid -echo "done." - - -show_ip() -{ - ip_addr=$(echo "$1" | sed -n "s,^.*"$2"/ip: \([^;]*\).*$,\1,p") - echo -n "IP address for $3: " - if [ "$ip_addr" = "" ] - then - echo "did not appear." - else - echo "$ip_addr." - fi -} - - -if [ "$WAIT_FOR_NETWORK" ] -then - echo "Waiting for network configuration... " - i=0 - while [ $i -lt 600 ] - do - ip=$(xe_min vm-list params=networks uuid=$vm_uuid) - if [ "$ip" != "" ] - then - show_ip "$ip" "1" "$BRIDGE_M" - if [[ $BRIDGE_P ]] - then - show_ip "$ip" "2" "$BRIDGE_P" - fi - echo "Installation complete." - exit 0 - fi - sleep 10 - let i=i+1 - done -fi diff --git a/tools/xen/scripts/install_ubuntu_template.sh b/tools/xen/scripts/install_ubuntu_template.sh index b7a8eff952..f24e7b26d6 100755 --- a/tools/xen/scripts/install_ubuntu_template.sh +++ b/tools/xen/scripts/install_ubuntu_template.sh @@ -53,7 +53,7 @@ disk_size=$(($OSDOMU_VDI_GB * 1024 * 1024 * 1024)) 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=${UBUNTU_INST_IFACE} \ +netcfg/choose_interface=eth0 \ netcfg/get_hostname=os netcfg/get_domain=os auto \ url=${preseed_url}" diff --git a/tools/xen/xenrc b/tools/xen/xenrc index 2bd7be7e37..afa3d32327 100644 --- a/tools/xen/xenrc +++ b/tools/xen/xenrc @@ -60,8 +60,8 @@ PUB_IP=${PUB_IP:-172.24.4.10} PUB_NETMASK=${PUB_NETMASK:-255.255.255.0} # Ubuntu install settings -UBUNTU_INST_RELEASE="oneiric" -UBUNTU_INST_TEMPLATE_NAME="Ubuntu 11.10 (64-bit) for DevStack" +UBUNTU_INST_RELEASE="precise" +UBUNTU_INST_TEMPLATE_NAME="Ubuntu 12.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 @@ -72,11 +72,8 @@ UBUNTU_INST_HTTP_DIRECTORY="/ubuntu" UBUNTU_INST_HTTP_PROXY="" UBUNTU_INST_LOCALE="en_US" UBUNTU_INST_KEYBOARD="us" -# network configuration for ubuntu netinstall. -# TODO(matelakat): get rid of legacy network interfaces -# specify "eth2" to use the management network -# specify "eth3" to use the public network -UBUNTU_INST_IFACE="eth2" +# network configuration for ubuntu netinstall +UBUNTU_INST_BRIDGE_OR_NET_NAME=${UBUNTU_INST_BRIDGE_OR_NET_NAME:-"$MGT_BRIDGE_OR_NET_NAME"} UBUNTU_INST_IP="dhcp" UBUNTU_INST_NAMESERVERS="" UBUNTU_INST_NETMASK=""