xenapi: kernel_cmdline moved out from template

The kernel's cmdline was set during the initial devstack machine
installation. Thus, during second runs, the kernel's cmdline was not
updated. This patch extracts append_kernel_cmdline, and configures
domU's kernel cmdline every time. As some networking parameters are
passed through the kernel cmdline, this patch makes it possible to
change the network configuration, even if a cached devstack exists.

Related to blueprint xenapi-devstack-cleanup

Change-Id: I3b7175f4e83326c3e28825ac50625f6bd2a9a029
diff --git a/tools/xen/functions b/tools/xen/functions
index 3458263..ebfd483 100644
--- a/tools/xen/functions
+++ b/tools/xen/functions
@@ -94,6 +94,14 @@
     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
@@ -135,17 +143,17 @@
 }
 
 function add_interface() {
-    local vm_name
+    local vm_name_label
     local bridge_or_network_name
 
-    vm_name="$1"
+    vm_name_label="$1"
     bridge_or_network_name="$2"
     device_number="$3"
 
     local vm
     local net
 
-    vm=$(xe vm-list name-label="$vm_name" --minimal)
+    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
 }
@@ -200,3 +208,19 @@
 
     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
+}
diff --git a/tools/xen/install_os_domU.sh b/tools/xen/install_os_domU.sh
index 8b2a687..a744869 100755
--- a/tools/xen/install_os_domU.sh
+++ b/tools/xen/install_os_domU.sh
@@ -200,21 +200,13 @@
 
     # create a new VM with the given template
     # creating the correct VIFs and metadata
-    FLAT_NETWORK_BRIDGE=$(bridge_for "$VM_BRIDGE_OR_NET_NAME")
-
-    KERNEL_PARAMS_FOR_QUANTUM=""
-    if is_service_enabled quantum; then
-        XEN_INTEGRATION_BRIDGE=$(bridge_for "$XEN_INT_BRIDGE_OR_NET_NAME")
-        KERNEL_PARAMS_FOR_QUANTUM="xen_integration_bridge=${XEN_INTEGRATION_BRIDGE}"
-    fi
     $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" \
         -l "$GUEST_NAME" \
-        -r "$OSDOMU_MEM_MB" \
-        -k "flat_network_bridge=${FLAT_NETWORK_BRIDGE} ${KERNEL_PARAMS_FOR_QUANTUM}"
+        -r "$OSDOMU_MEM_MB"
 
     # wait for install to finish
     wait_for_VM_to_halt
@@ -253,11 +245,20 @@
 $THIS_DIR/build_xva.sh "$GUEST_NAME"
 
 # Attach a network interface for the integration network (so that the bridge
-# is created by XenServer). This is required for Quantum.
+# is created by XenServer). This is required for Quantum. Also pass that as a
+# kernel parameter for DomU
 if is_service_enabled quantum; then
     add_interface "$GUEST_NAME" "$XEN_INT_BRIDGE_OR_NET_NAME" "4"
+
+    XEN_INTEGRATION_BRIDGE=$(bridge_for "$XEN_INT_BRIDGE_OR_NET_NAME")
+    append_kernel_cmdline \
+        "$GUEST_NAME" \
+        "xen_integration_bridge=${XEN_INTEGRATION_BRIDGE}"
 fi
 
+FLAT_NETWORK_BRIDGE=$(bridge_for "$VM_BRIDGE_OR_NET_NAME")
+append_kernel_cmdline "$GUEST_NAME" "flat_network_bridge=${FLAT_NETWORK_BRIDGE}"
+
 # 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"
diff --git a/tools/xen/scripts/install-os-vpx.sh b/tools/xen/scripts/install-os-vpx.sh
index 6105a1e..c82f870 100755
--- a/tools/xen/scripts/install-os-vpx.sh
+++ b/tools/xen/scripts/install-os-vpx.sh
@@ -25,7 +25,6 @@
 DATA_VDI_SIZE="500MiB"
 BRIDGE_M=
 BRIDGE_P=
-KERNEL_PARAMS=
 VPX_FILE=os-vpx.xva
 AS_TEMPLATE=
 FROM_TEMPLATE=
@@ -38,7 +37,7 @@
 cat << EOF
 
   Usage: $0 [-f FILE_PATH] [-d DISK_SIZE] [-v BRIDGE_NAME] [-m BRIDGE_NAME] [-p BRIDGE_NAME]
-            [-k PARAMS] [-r RAM] [-i|-c] [-w] [-b] [-l NAME_LABEL] [-t TEMPLATE_NW_INSTALL]
+            [-r RAM] [-i|-c] [-w] [-b] [-l NAME_LABEL] [-t TEMPLATE_NW_INSTALL]
 
   Installs XenServer OpenStack VPX.
 
@@ -57,7 +56,6 @@
                   Defaults to xenbr0.
      -v bridge    Specifies the bridge for the vm network
      -p bridge    Specifies the bridge for the externally facing network.
-     -k params    Specifies kernel parameters.
      -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.
@@ -81,15 +79,12 @@
      using the default for management traffic:
             install-os-vpx.sh -m xapi4
 
-     Create a VPX that automatically becomes the master:
-            install-os-vpx.sh -k geppetto_master=true
-
 EOF
 }
 
 get_params()
 {
-  while getopts "hicwbf:d:v:m:p:k:r:l:t:" OPTION;
+  while getopts "hicwbf:d:v:m:p:r:l:t:" OPTION;
   do
     case $OPTION in
       h) usage
@@ -119,9 +114,6 @@
       p)
          BRIDGE_P=$OPTARG
          ;;
-      k)
-         KERNEL_PARAMS=$OPTARG
-         ;;
       r)
          RAM=$OPTARG
          ;;
@@ -328,20 +320,6 @@
 }
 
 
-set_kernel_params()
-{
-  local v="$1"
-  local args=$KERNEL_PARAMS
-  if [ "$args" != "" ]
-  then
-    echo "Passing Geppetto args to VPX: $args."
-    pvargs=$(xe vm-param-get param-name=PV-args uuid="$v")
-    args="$pvargs $args"
-    xe vm-param-set PV-args="$args" uuid="$v"
-  fi
-}
-
-
 set_memory()
 {
   local v="$1"
@@ -367,7 +345,6 @@
 set_all()
 {
   local v="$1"
-  set_kernel_params "$v"
   set_memory "$v"
   set_auto_start "$v"
   label_system_disk "$v"
@@ -430,7 +407,6 @@
   create_vm_vif "$vm_uuid"
   create_management_vif "$vm_uuid"
   create_public_vif "$vm_uuid"
-  set_kernel_params "$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"