Browse code

Merge "xenapi - cleanup network configuration"

Jenkins authored on 2013/05/25 01:34:59
Showing 5 changed files
... ...
@@ -8,6 +8,34 @@ The Openstack services are configured to run within a "privileged" virtual
8 8
 machine on the Xenserver host (called OS domU). The VM uses the XAPI toolstack
9 9
 to communicate with the host.
10 10
 
11
+The provided localrc helps to build a basic environment.
12
+The requirements are:
13
+ - An internet-enabled network with a DHCP server on it
14
+ - XenServer box plugged in to the same network
15
+This network will be used as the OpenStack management network. The VM Network
16
+and the Public Network will not be connected to any physical interfaces, only
17
+new virtual networks will be created by the `install_os_domU.sh` script.
18
+
19
+Steps to follow:
20
+ - Install XenServer
21
+ - Download Devstack to XenServer
22
+ - Customise `localrc`
23
+ - Start `install_os_domU.sh` script
24
+
25
+The `install_os_domU.sh` script will:
26
+ - Setup XenAPI plugins
27
+ - Create the named networks, if they don't exist
28
+ - Install an Ubuntu Virtual Machine, with 4 network interfaces:
29
+   - eth0 - internal xapi interface
30
+   - eth1 - VM interface, connected to `VM_BRIDGE_OR_NET_NAME` defaults to
31
+   `"OpenStack VM Network"`.
32
+   - eth2 - Management interface, connected to `MGT_BRIDGE_OR_NET_NAME`,
33
+     defaults to `xenbr0`, XenServer's bridge associated with the Hypervisors
34
+     `eth0`.
35
+   - eth3 - Public interface, connected to `PUB_BRIDGE_OR_NET_NAME` defaults to
36
+   `"OpenStack Public Network"`.
37
+ - Start devstack inside the created OpenStack VM
38
+
11 39
 ## Step 1: Install Xenserver
12 40
 Install XenServer 5.6+ on a clean box. You can get XenServer by signing
13 41
 up for an account on citrix.com, and then visiting:
... ...
@@ -15,13 +43,12 @@ https://www.citrix.com/English/ss/downloads/details.asp?downloadId=2311504&produ
15 15
 
16 16
 For details on installation, see: http://wiki.openstack.org/XenServer/Install
17 17
 
18
-Here are some sample Xenserver network settings for when you are just
19
-getting started (Settings like this have been used with a laptop + cheap wifi router):
20
-
21
-* XenServer Host IP: 192.168.1.10
22
-* XenServer Netmask: 255.255.255.0
23
-* XenServer Gateway: 192.168.1.1
24
-* XenServer DNS: 192.168.1.1
18
+The XenServer IP configuration depends on your local network setup. If you are
19
+using dhcp, make a reservation for XenServer, so its IP address won't change
20
+over time. Make a note of the XenServer's IP address, as it has to be specified
21
+in `localrc`. The other option is to manually specify the IP setup for the
22
+XenServer box. Please make sure, that a gateway and a nameserver is configured,
23
+as `install_os_domU.sh` will connect to github.com to get source-code snapshots.
25 24
 
26 25
 ## Step 2: Download devstack
27 26
 On your XenServer host, run the following commands as root:
... ...
@@ -32,45 +59,63 @@ On your XenServer host, run the following commands as root:
32 32
 
33 33
 ## Step 3: Configure your localrc inside the devstack directory
34 34
 Devstack uses a localrc for user-specific configuration.  Note that
35
-the XENAPI_PASSWORD must be your dom0 root password.
35
+the `XENAPI_PASSWORD` must be your dom0 root password.
36 36
 Of course, use real passwords if this machine is exposed.
37 37
 
38 38
     cat > ./localrc <<EOF
39
+    # Passwords
40
+    # NOTE: these need to be specified, otherwise devstack will try
41
+    # to prompt for these passwords, blocking the install process.
42
+
39 43
     MYSQL_PASSWORD=my_super_secret
40 44
     SERVICE_TOKEN=my_super_secret
41 45
     ADMIN_PASSWORD=my_super_secret
42 46
     SERVICE_PASSWORD=my_super_secret
43 47
     RABBIT_PASSWORD=my_super_secret
44 48
     SWIFT_HASH="66a3d6b56c1f479c8b4e70ab5c2000f5"
45
-    # This is the password for the OpenStack VM (for both stack and root users)
49
+    # This will be the password for the OpenStack VM (both stack and root users)
46 50
     GUEST_PASSWORD=my_super_secret
47 51
 
48 52
     # XenAPI parameters
49
-    # IMPORTANT: The following must be set to your dom0 root password!
53
+    # NOTE: The following must be set to your XenServer root password!
54
+
50 55
     XENAPI_PASSWORD=my_xenserver_root_password
56
+
51 57
     XENAPI_CONNECTION_URL="http://address_of_your_xenserver"
52 58
     VNCSERVER_PROXYCLIENT_ADDRESS=address_of_your_xenserver
53 59
 
54
-    # Do not download the usual images yet!
60
+    # Do not download the usual images
55 61
     IMAGE_URLS=""
56 62
     # Explicitly set virt driver here
57 63
     VIRT_DRIVER=xenserver
58
-    # Explicitly set multi-host
64
+    # Explicitly enable multi-host
59 65
     MULTI_HOST=1
60 66
     # Give extra time for boot
61 67
     ACTIVE_TIMEOUT=45
62
-    # Host Interface, i.e. the interface on the nova vm you want to expose the
63
-    # services on. Usually eth2 (management network) or eth3 (public network) and
64
-    # not eth0 (private network with XenServer host) or eth1 (VM traffic network)
65
-    # The default is eth3.
66
-    # HOST_IP_IFACE=eth3
68
+    # Host Interface, i.e. the interface on the OpenStack vm you want to expose
69
+    # the services on. The default is eth3, which means the public network, but
70
+    # as the public network is going to be virtual, we are setting the services
71
+    # to listen on the management network, which defaults to 'xenbr0', the
72
+    # XenServer's network.
73
+    HOST_IP_IFACE=eth2
74
+
75
+    # Use DHCP server to configure the Management IP of OpenStack VM
76
+    MGT_IP="dhcp"
67 77
 
68 78
     # Settings for netinstalling Ubuntu
69
-    # UBUNTU_INST_RELEASE=precise
79
+    UBUNTU_INST_RELEASE=precise
80
+
81
+    # First time Ubuntu network install params, use the DHCP server on the
82
+    # management network
83
+    UBUNTU_INST_IFACE="eth2"
84
+    UBUNTU_INST_IP="dhcp"
85
+
86
+    # NOTE: the value of FLAT_NETWORK_BRIDGE will automatically be determined
87
+    # by install_os_domU.sh script.
70 88
 
71
-    # First time Ubuntu network install params
72
-    # UBUNTU_INST_IFACE="eth3"
73
-    # UBUNTU_INST_IP="dhcp"
89
+    # Public IP address is aligned with the devstack defaults (see FLOATING_RANGE)
90
+    PUB_IP=172.24.4.10
91
+    PUB_NETMASK=255.255.255.0
74 92
     EOF
75 93
 
76 94
 ## Step 4: Run `./install_os_domU.sh` from the `tools/xen` directory
... ...
@@ -93,3 +93,84 @@ function find_ip_by_name() {
93 93
         fi
94 94
     done
95 95
 }
96
+
97
+function _create_new_network() {
98
+    local name_label
99
+    name_label=$1
100
+
101
+    xe network-create name-label="$name_label"
102
+}
103
+
104
+function _multiple_networks_with_name() {
105
+    local name_label
106
+    name_label=$1
107
+
108
+    # A comma indicates multiple matches
109
+    xe network-list name-label="$name_label" --minimal | grep -q ","
110
+}
111
+
112
+function _network_exists() {
113
+    local name_label
114
+    name_label=$1
115
+
116
+    ! [ -z $(xe network-list name-label="$name_label" --minimal) ]
117
+}
118
+
119
+function _bridge_exists() {
120
+    local bridge
121
+    bridge=$1
122
+
123
+    ! [ -z $(xe network-list bridge="$bridge" --minimal) ]
124
+}
125
+
126
+
127
+function setup_network() {
128
+    local bridge_or_net_name
129
+    bridge_or_net_name=$1
130
+
131
+    if ! _bridge_exists "$bridge_or_net_name"; then
132
+        if _network_exists "$bridge_or_net_name"; then
133
+            if _multiple_networks_with_name "$bridge_or_net_name"; then
134
+                cat >&2 << EOF
135
+ERROR: Multiple networks found matching name-label to "$bridge_or_net_name"
136
+please review your XenServer network configuration / localrc file.
137
+EOF
138
+                exit 1
139
+            fi
140
+        else
141
+            _create_new_network "$bridge_or_net_name"
142
+        fi
143
+    fi
144
+}
145
+
146
+function bridge_for() {
147
+    local bridge_or_net_name
148
+    bridge_or_net_name=$1
149
+
150
+    if _bridge_exists "$bridge_or_net_name"; then
151
+        echo "$bridge_or_net_name"
152
+    else
153
+        xe network-list name-label="$bridge_or_net_name" params=bridge --minimal
154
+    fi
155
+}
156
+
157
+function xenapi_ip_on() {
158
+    local bridge_or_net_name
159
+    bridge_or_net_name=$1
160
+
161
+    ifconfig $(bridge_for "$bridge_or_net_name") | grep "inet addr" | cut -d ":" -f2 | sed "s/ .*//"
162
+}
163
+
164
+function xenapi_is_listening_on() {
165
+    local bridge_or_net_name
166
+    bridge_or_net_name=$1
167
+
168
+    ! [ -z $(xenapi_ip_on "$bridge_or_net_name") ]
169
+}
170
+
171
+function parameter_is_specified() {
172
+    local parameter_name
173
+    parameter_name=$1
174
+
175
+    compgen -v | grep "$parameter_name"
176
+}
... ...
@@ -67,97 +67,28 @@ create_directory_for_kernels
67 67
 #
68 68
 # Configure Networking
69 69
 #
70
-
71
-# Helper to create networks
72
-# Uses echo trickery to return network uuid
73
-function create_network() {
74
-    br=$1
75
-    dev=$2
76
-    vlan=$3
77
-    netname=$4
78
-    if [ -z $br ]
79
-    then
80
-        pif=$(xe_min pif-list device=$dev VLAN=$vlan)
81
-        if [ -z $pif ]
82
-        then
83
-            net=$(xe network-create name-label=$netname)
84
-        else
85
-            net=$(xe_min network-list  PIF-uuids=$pif)
86
-        fi
87
-        echo $net
88
-        return 0
89
-    fi
90
-    if [ ! $(xe_min network-list  params=bridge | grep -w --only-matching $br) ]
91
-    then
92
-        echo "Specified bridge $br does not exist"
93
-        echo "If you wish to use defaults, please keep the bridge name empty"
94
-        exit 1
95
-    else
96
-        net=$(xe_min network-list  bridge=$br)
97
-        echo $net
98
-    fi
99
-}
100
-
101
-function errorcheck() {
102
-    rc=$?
103
-    if [ $rc -ne 0 ]
104
-    then
105
-        exit $rc
106
-    fi
107
-}
108
-
109
-# Create host, vm, mgmt, pub networks on XenServer
110
-VM_NET=$(create_network "$VM_BR" "$VM_DEV" "$VM_VLAN" "vmbr")
111
-errorcheck
112
-MGT_NET=$(create_network "$MGT_BR" "$MGT_DEV" "$MGT_VLAN" "mgtbr")
113
-errorcheck
114
-PUB_NET=$(create_network "$PUB_BR" "$PUB_DEV" "$PUB_VLAN" "pubbr")
115
-errorcheck
116
-
117
-# Helper to create vlans
118
-function create_vlan() {
119
-    dev=$1
120
-    vlan=$2
121
-    net=$3
122
-    # VLAN -1 refers to no VLAN (physical network)
123
-    if [ $vlan -eq -1 ]
124
-    then
125
-        return
126
-    fi
127
-    if [ -z $(xe_min vlan-list  tag=$vlan) ]
128
-    then
129
-        pif=$(xe_min pif-list  network-uuid=$net)
130
-        # We created a brand new network this time
131
-        if [ -z $pif ]
132
-        then
133
-            pif=$(xe_min pif-list  device=$dev VLAN=-1)
134
-            xe vlan-create pif-uuid=$pif vlan=$vlan network-uuid=$net
135
-        else
136
-            echo "VLAN does not exist but PIF attached to this network"
137
-            echo "How did we reach here?"
138
-            exit 1
139
-        fi
140
-    fi
141
-}
142
-
143
-# Create vlans for vm and management
144
-create_vlan $PUB_DEV $PUB_VLAN $PUB_NET
145
-create_vlan $VM_DEV $VM_VLAN $VM_NET
146
-create_vlan $MGT_DEV $MGT_VLAN $MGT_NET
147
-
148
-# Get final bridge names
149
-if [ -z $VM_BR ]; then
150
-    VM_BR=$(xe_min network-list  uuid=$VM_NET params=bridge)
151
-fi
152
-if [ -z $MGT_BR ]; then
153
-    MGT_BR=$(xe_min network-list  uuid=$MGT_NET params=bridge)
70
+setup_network "$VM_BRIDGE_OR_NET_NAME"
71
+setup_network "$MGT_BRIDGE_OR_NET_NAME"
72
+setup_network "$PUB_BRIDGE_OR_NET_NAME"
73
+
74
+if parameter_is_specified "FLAT_NETWORK_BRIDGE"; then
75
+    cat >&2 << EOF
76
+ERROR: FLAT_NETWORK_BRIDGE is specified in localrc file
77
+This is considered as an error, as its value will be derived from the
78
+VM_BRIDGE_OR_NET_NAME variable's value.
79
+EOF
80
+    exit 1
154 81
 fi
155
-if [ -z $PUB_BR ]; then
156
-    PUB_BR=$(xe_min network-list  uuid=$PUB_NET params=bridge)
82
+
83
+if ! xenapi_is_listening_on "$MGT_BRIDGE_OR_NET_NAME"; then
84
+    cat >&2 << EOF
85
+ERROR: XenAPI does not have an assigned IP address on the management network.
86
+please review your XenServer network configuration / localrc file.
87
+EOF
88
+    exit 1
157 89
 fi
158 90
 
159
-# dom0 ip, XenAPI is assumed to be listening
160
-HOST_IP=${HOST_IP:-`ifconfig xenbr0 | grep "inet addr" | cut -d ":" -f2 | sed "s/ .*//"`}
91
+HOST_IP=$(xenapi_ip_on "$MGT_BRIDGE_OR_NET_NAME")
161 92
 
162 93
 # Set up ip forwarding, but skip on xcp-xapi
163 94
 if [ -a /etc/sysconfig/network ]; then
... ...
@@ -263,7 +194,15 @@ if [ -z "$templateuuid" ]; then
263 263
 
264 264
     # create a new VM with the given template
265 265
     # creating the correct VIFs and metadata
266
-    $THIS_DIR/scripts/install-os-vpx.sh -t "$UBUNTU_INST_TEMPLATE_NAME" -v $VM_BR -m $MGT_BR -p $PUB_BR -l $GUEST_NAME -r $OSDOMU_MEM_MB -k "flat_network_bridge=${VM_BR}"
266
+    FLAT_NETWORK_BRIDGE=$(bridge_for "$VM_BRIDGE_OR_NET_NAME")
267
+    $THIS_DIR/scripts/install-os-vpx.sh \
268
+        -t "$UBUNTU_INST_TEMPLATE_NAME" \
269
+        -v "$VM_BRIDGE_OR_NET_NAME" \
270
+        -m "$MGT_BRIDGE_OR_NET_NAME" \
271
+        -p "$PUB_BRIDGE_OR_NET_NAME" \
272
+        -l "$GUEST_NAME" \
273
+        -r "$OSDOMU_MEM_MB" \
274
+        -k "flat_network_bridge=${FLAT_NETWORK_BRIDGE}"
267 275
 
268 276
     # wait for install to finish
269 277
     wait_for_VM_to_halt
... ...
@@ -235,7 +235,7 @@ create_gi_vif()
235 235
 create_vm_vif()
236 236
 {
237 237
   local v="$1"
238
-  echo "Installing management interface on $BRIDGE_V."
238
+  echo "Installing VM interface on $BRIDGE_V."
239 239
   local out_network_uuid=$(find_network "$BRIDGE_V")
240 240
   create_vif "$v" "$out_network_uuid" "1" >/dev/null
241 241
 }
... ...
@@ -16,6 +16,16 @@ VDI_MB=${VDI_MB:-5000}
16 16
 OSDOMU_MEM_MB=1024
17 17
 OSDOMU_VDI_GB=8
18 18
 
19
+# Network mapping. Specify bridge names or network names. Network names may
20
+# differ across localised versions of XenServer. If a given bridge/network
21
+# was not found, a new network will be created with the specified name.
22
+
23
+# The management network is specified by the bridge name. xenbr0 is usually
24
+# the name of the bridge of the network associated with the hypervisor's eth0.
25
+MGT_BRIDGE_OR_NET_NAME="xenbr0"
26
+VM_BRIDGE_OR_NET_NAME="OpenStack VM Network"
27
+PUB_BRIDGE_OR_NET_NAME="OpenStack Public Network"
28
+
19 29
 # VM Password
20 30
 GUEST_PASSWORD=${GUEST_PASSWORD:-secrete}
21 31
 
... ...
@@ -28,28 +38,17 @@ HOST_IP_IFACE=${HOST_IP_IFACE:-eth3}
28 28
 # Our nova host's network info
29 29
 #
30 30
 
31
-# A host-only ip that let's the interface come up, otherwise unused
32
-VM_IP=${VM_IP:-10.255.255.255}
31
+# Management network
33 32
 MGT_IP=${MGT_IP:-172.16.100.55}
34
-PUB_IP=${PUB_IP:-192.168.1.55}
35
-
36
-# Public network
37
-PUB_NETMASK=${PUB_NETMASK:-255.255.255.0}
38
-PUB_BR=${PUB_BR:-"xenbr0"}
39
-PUB_VLAN=${PUB_VLAN:--1}
40
-PUB_DEV=${PUB_DEV:-eth0}
33
+MGT_NETMASK=${MGT_NETMASK:-255.255.255.0}
41 34
 
42
-# VM network params
35
+# VM Network
36
+VM_IP=${VM_IP:-10.255.255.255}
43 37
 VM_NETMASK=${VM_NETMASK:-255.255.255.0}
44
-VM_BR=${VM_BR:-""}
45
-VM_VLAN=${VM_VLAN:-100}
46
-VM_DEV=${VM_DEV:-eth0}
47 38
 
48
-# MGMT network params
49
-MGT_NETMASK=${MGT_NETMASK:-255.255.255.0}
50
-MGT_BR=${MGT_BR:-""}
51
-MGT_VLAN=${MGT_VLAN:-101}
52
-MGT_DEV=${MGT_DEV:-eth0}
39
+# Public network
40
+PUB_IP=${PUB_IP:-192.168.1.55}
41
+PUB_NETMASK=${PUB_NETMASK:-255.255.255.0}
53 42
 
54 43
 # Decide if you should enable eth0,
55 44
 # the guest installer network