| #!/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=$(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 other-config:os-vpx=true uuid="$vm_uuid" |
| xe vm-param-set actions-after-reboot=Destroy uuid="$vm_uuid" |