Adding "Real Time KVM" support 17/29817/13
authordavidjchou <david.j.chou@intel.com>
Mon, 6 Mar 2017 02:39:24 +0000 (17:39 -0900)
committerDan Radez <dradez@redhat.com>
Thu, 9 Mar 2017 17:54:20 +0000 (17:54 +0000)
Adding the support to run the "Real Time KVM" kernel in the compute
node(s) to reduce the network latency caused by the virtualization of
the network functions. Since the current "Real Time KVM" kernel
doesn't support physical to logical network interface mapping yet, we
need to use the real physical interface name rather than the logical
interface name for all compute interfaces in network_settings.yaml.

Also updates tests for the network settings changes and fixes a bug
where interface was being queried on the controller nics before it
interfaces were validated.

JIRA: APEX-128

Change-Id: Iccb6c9fbdcf7e3b482f4283039ef17c38e0a6df7
Signed-off-by: davidjchou <david.j.chou@intel.com>
Signed-off-by: Tim Rozet <trozet@redhat.com>
Signed-off-by: Dan Radez <dradez@redhat.com>
14 files changed:
build/enable_rt_kvm.yaml [new file with mode: 0644]
build/kvm4nfv-1st-boot.yaml [new file with mode: 0644]
build/overcloud-full.sh
build/rpm_specs/opnfv-apex-common.spec
build/undercloud.sh
build/variables.sh
config/deploy/deploy_settings.yaml
config/deploy/os-nosdn-kvm-ha.yaml [new file with mode: 0644]
config/deploy/os-nosdn-kvm-noha.yaml [new file with mode: 0644]
config/network/network_settings.yaml
lib/overcloud-deploy-functions.sh
lib/python/apex/deploy_settings.py
lib/python/apex/network_settings.py
tests/test_apex_network_settings.py

diff --git a/build/enable_rt_kvm.yaml b/build/enable_rt_kvm.yaml
new file mode 100644 (file)
index 0000000..0059021
--- /dev/null
@@ -0,0 +1,4 @@
+parameter_defaults:
+    ComputeKernelArgs: 'kvmfornfv_kernel.rpm'
+resource_registry:
+    OS::TripleO::NodeUserData: kvm4nfv-1st-boot.yaml
diff --git a/build/kvm4nfv-1st-boot.yaml b/build/kvm4nfv-1st-boot.yaml
new file mode 100644 (file)
index 0000000..0dad3e3
--- /dev/null
@@ -0,0 +1,60 @@
+heat_template_version: 2014-10-16
+
+description: >
+  This is the firstboot configuration for kvmfornfv kernel of the compute nodes
+  via cloud-init. To enable this, replace the default
+  mapping of OS::TripleO::NodeUserData in ../overcloud_resource_registry*
+
+parameters:
+  ComputeKernelArgs:
+    description: >
+      Name of the kvmfornfv kernel rpm.
+      Example: "kvmfornfv_kernel.rpm"
+    type: string
+    default: ""
+  ComputeHostnameFormat:
+    type: string
+    default: ""
+
+resources:
+  userdata:
+    type: OS::Heat::MultipartMime
+    properties:
+      parts:
+      - config: {get_resource: compute_kernel_args}
+
+  # Verify the logs on /var/log/cloud-init.log on the overcloud node
+  compute_kernel_args:
+    type: OS::Heat::SoftwareConfig
+    properties:
+      config:
+        str_replace:
+          template: |
+            #!/bin/bash
+            set -x
+            FORMAT=$COMPUTE_HOSTNAME_FORMAT
+            if [[ -z $FORMAT ]] ; then
+              FORMAT="compute" ;
+            else
+              # Assumption: only %index% and %stackname% are the variables in Host name format
+              FORMAT=$(echo $FORMAT | sed  's/\%index\%//g' | sed 's/\%stackname\%//g') ;
+            fi
+            if [[ $(hostname) == *$FORMAT* ]] ; then
+              yum install -y /root/$KVMFORNFV_KERNEL_RPM
+              grub2-mkconfig -o /etc/grub2.cfg
+              sleep 5
+              reboot
+            fi
+          params:
+            $KVMFORNFV_KERNEL_RPM: {get_param: ComputeKernelArgs}
+            $COMPUTE_HOSTNAME_FORMAT: {get_param: ComputeHostnameFormat}
+
+outputs:
+  # This means get_resource from the parent template will get the userdata, see:
+  # http://docs.openstack.org/developer/heat/template_guide/composition.html#making-your-template-resource-more-transparent
+  # Note this is new-for-kilo, an alternative is returning a value then using
+  # get_attr in the parent template instead.
+  OS::stack_id:
+    value: {get_resource: userdata}
+
+
index c4c31c8..b94c0cb 100755 (executable)
@@ -77,6 +77,9 @@ enabled=1
 gpgcheck=0
 EOF
 
+# Get Real Time Kernel from kvm4nfv
+populate_cache $kvmfornfv_uri_base/$kvmfornfv_kernel_rpm
+
 # Increase disk size by 500MB to accommodate more packages
 qemu-img resize overcloud-full_build.qcow2 +500MB
 
@@ -90,6 +93,7 @@ qemu-img resize overcloud-full_build.qcow2 +500MB
 # git clone vsperf into the overcloud image
 # upload the tacker puppet module and untar it
 # install tacker
+# upload the rt_kvm kernel
 LIBGUESTFS_BACKEND=direct virt-customize \
     --run-command "xfs_growfs /dev/sda" \
     --upload ${BUILD_DIR}/opnfv-puppet-tripleo.tar.gz:/etc/puppet/modules \
@@ -136,6 +140,7 @@ LIBGUESTFS_BACKEND=direct virt-customize \
     --run-command "cd /usr/lib/python2.7/site-packages/ && patch -p1 < neutron-patch-NSDriver.patch" \
     --upload ${BUILD_ROOT}/patches/puppet-neutron-add-odl-settings.patch:/usr/share/openstack-puppet/modules/neutron/ \
     --run-command "cd /usr/share/openstack-puppet/modules/neutron && patch -p1 <  puppet-neutron-add-odl-settings.patch" \
+    --upload ${CACHE_DIR}/$kvmfornfv_kernel_rpm:/root/ \
     -a overcloud-full_build.qcow2
 
 mv -f overcloud-full_build.qcow2 overcloud-full.qcow2
index 40b2529..a004542 100644 (file)
@@ -43,6 +43,8 @@ install config/deploy/os-nosdn-ovs-noha.yaml %{buildroot}%{_sysconfdir}/opnfv-ap
 install config/deploy/os-nosdn-nofeature-ha.yaml %{buildroot}%{_sysconfdir}/opnfv-apex/os-nosdn-nofeature-ha.yaml
 install config/deploy/os-nosdn-performance-ha.yaml %{buildroot}%{_sysconfdir}/opnfv-apex/os-nosdn-performance-ha.yaml
 install config/deploy/os-nosdn-ovs-ha.yaml %{buildroot}%{_sysconfdir}/opnfv-apex/os-nosdn-ovs-ha.yaml
+install config/deploy/os-nosdn-kvm-ha.yaml %{buildroot}%{_sysconfdir}/opnfv-apex/os-nosdn-kvm-ha.yaml
+install config/deploy/os-nosdn-kvm-noha.yaml %{buildroot}%{_sysconfdir}/opnfv-apex/os-nosdn-kvm-noha.yaml
 install config/deploy/os-odl_l2-nofeature-ha.yaml %{buildroot}%{_sysconfdir}/opnfv-apex/os-odl_l2-nofeature-ha.yaml
 install config/deploy/os-odl_l2-sfc-noha.yaml %{buildroot}%{_sysconfdir}/opnfv-apex/os-odl_l2-sfc-noha.yaml
 install config/deploy/os-odl-bgpvpn-ha.yaml %{buildroot}%{_sysconfdir}/opnfv-apex/os-odl-bgpvpn-ha.yaml
@@ -120,6 +122,8 @@ install config/inventory/pod_example_settings.yaml %{buildroot}%{_docdir}/opnfv/
 %{_sysconfdir}/opnfv-apex/os-nosdn-nofeature-ha.yaml
 %{_sysconfdir}/opnfv-apex/os-nosdn-performance-ha.yaml
 %{_sysconfdir}/opnfv-apex/os-nosdn-ovs-ha.yaml
+%{_sysconfdir}/opnfv-apex/os-nosdn-kvm-ha.yaml
+%{_sysconfdir}/opnfv-apex/os-nosdn-kvm-noha.yaml
 %{_sysconfdir}/opnfv-apex/os-odl_l2-nofeature-ha.yaml
 %{_sysconfdir}/opnfv-apex/os-odl_l2-sfc-noha.yaml
 %{_sysconfdir}/opnfv-apex/os-odl-bgpvpn-ha.yaml
@@ -147,6 +151,7 @@ install config/inventory/pod_example_settings.yaml %{buildroot}%{_docdir}/opnfv/
 %changelog
 * Wed Mar 08 2017 Dan Radez <dradez@redhat.com> - 4.0-5
 - Commenting out ONOS, unsupported in Danube
+- Adding kvm4nfv files
 * Tue Feb 14 2017 Feng Pan <fpan@redhat.com> - 4.0-4
 - Add network_settings_vpp.yaml
 * Fri Feb 3 2017 Nikolas Hermanns <nikolas.hermanns@ericsson.com> - 4.0-3
index 1101da8..4e1b963 100755 (executable)
@@ -24,6 +24,9 @@ pushd opnfv-tht > /dev/null
 git archive --format=tar.gz --prefix=openstack-tripleo-heat-templates/ HEAD > ${BUILD_DIR}/opnfv-tht.tar.gz
 popd > /dev/null
 
+# inject rt_kvm kernel rpm name into the enable file
+sed -i "s/kvmfornfv_kernel.rpm/$kvmfornfv_kernel_rpm/" ${BUILD_ROOT}/enable_rt_kvm.yaml
+
 # installing forked opnfv-tht
 # enabling ceph OSDs to live on the controller
 # OpenWSMan package update supports the AMT Ironic driver for the TealBox
@@ -48,6 +51,8 @@ LIBGUESTFS_BACKEND=direct virt-customize \
     --run-command "cp /usr/share/instack-undercloud/undercloud.conf.sample /home/stack/undercloud.conf && chown stack:stack /home/stack/undercloud.conf" \
     --upload ${BUILD_ROOT}/opnfv-environment.yaml:/home/stack/ \
     --upload ${BUILD_ROOT}/first-boot.yaml:/home/stack/ \
+    --upload ${BUILD_ROOT}/kvm4nfv-1st-boot.yaml:/home/stack/ \
+    --upload ${BUILD_ROOT}/enable_rt_kvm.yaml:/home/stack/ \
     --upload ${BUILD_ROOT}/csit-environment.yaml:/home/stack/ \
     --upload ${BUILD_ROOT}/virtual-environment.yaml:/home/stack/ \
     --install "python2-congressclient" \
index 93ae83d..4ba591c 100644 (file)
@@ -33,6 +33,9 @@ dpdk_rpms=(
 'ovs4opnfv-e8acab14-openvswitch-2.5.90-0.12032.gitc61e93d6.1.el7.centos.x86_64.rpm'
 )
 
+kvmfornfv_uri_base="http://artifacts.opnfv.org/kvmfornfv"
+kvmfornfv_kernel_rpm="kernel-4.4.6_rt14_1703030237nfv-1.x86_64.rpm"
+
 tacker_repo="http://github.com/openstack/tacker"
 tacker_branch="stable/newton"
 tacker_commit=$(git ls-remote ${tacker_repo} ${tacker_branch} | awk '{print substr($1,1,7)}')
index b3d3ac2..7353579 100644 (file)
@@ -41,6 +41,10 @@ deploy_options:
   # 'ovs', 'ovs_dpdk' and 'fdio'.
   dataplane : ovs
 
+  # Whether to run the kvm real time kernel (rt_kvm) in the compute node(s) to
+  # reduce the network latencies caused by network function virtualization
+  rt_kvm: false
+
   # Whether to install and configure fdio functionality in the overcloud
   # The dataplane should be specified as fdio if this is set to true
   vpp: false
diff --git a/config/deploy/os-nosdn-kvm-ha.yaml b/config/deploy/os-nosdn-kvm-ha.yaml
new file mode 100644 (file)
index 0000000..cb68a31
--- /dev/null
@@ -0,0 +1,11 @@
+global_params:
+  ha_enabled: true
+
+deploy_options:
+  sdn_controller: false
+  sdn_l3: false
+  tacker: true
+  congress: true
+  sfc: false
+  vpn: false
+  rt_kvm: true
diff --git a/config/deploy/os-nosdn-kvm-noha.yaml b/config/deploy/os-nosdn-kvm-noha.yaml
new file mode 100644 (file)
index 0000000..bf737d7
--- /dev/null
@@ -0,0 +1,11 @@
+global_params:
+  ha_enabled: false
+
+deploy_options:
+  sdn_controller: false
+  sdn_l3: false
+  tacker: true
+  congress: true
+  sfc: false
+  vpn: false
+  rt_kvm: true
index 1cba64b..be0b683 100644 (file)
@@ -80,7 +80,7 @@ networks:                            # Network configurations
       compute:                       # Mapping for compute profile (nodes that will be used as Compute nodes)
         phys_type: interface         # Physical interface type (interface or bond)
         members:                     # Physical NIC members of this mapping (Single value allowed for interface phys_type)
-          - nic1
+          - eth0
       controller:                    # Mapping for controller profile (nodes that will be used as Controller nodes)
         phys_type: interface
         members:
@@ -99,7 +99,7 @@ networks:                            # Network configurations
         phys_type: interface         # Physical interface type (interface or bond)
         vlan: native                 # VLAN tag to use with this NIC
         members:                     # Physical NIC members of this mapping (Single value allowed for interface phys_type)
-          - nic2                     # Note, for Apex you may also use the logical nic name (found by nic order), such as "nic1"
+          - eth1                     # Note, for Apex you may also use the logical nic name (found by nic order), such as "nic1"
       controller:                    # Mapping for controller profile (nodes that will be used as Controller nodes)
         phys_type: interface
         vlan: native
@@ -130,7 +130,7 @@ networks:                            # Network configurations
           phys_type: interface       # Physical interface type (interface or bond)
           vlan: native               # VLAN tag to use with this NIC
           members:                   # Physical NIC members of this mapping (Single value allowed for interface phys_type)
-            - nic3
+            - eth2
         controller:                  # Mapping for controller profile (nodes that will be used as Controller nodes)
           phys_type: interface
           vlan: native
@@ -163,7 +163,7 @@ networks:                            # Network configurations
           phys_type: interface       # Physical interface type (interface or bond)
           vlan: 101                  # VLAN tag to use with this NIC
           members:                   # Physical NIC members of this mapping (Single value allowed for interface phys_type)
-            - nic3                   # Note, for Apex you may also use the logical nic name (found by nic order), such as "nic1"
+            - eth2                   # Note, for Apex you may also use the logical nic name (found by nic order), such as "nic1"
         controller:                  # Mapping for controller profile (nodes that will be used as Controller nodes)
           phys_type: interface
           vlan: 101
@@ -184,7 +184,7 @@ networks:                            # Network configurations
         phys_type: interface         # Physical interface type (interface or bond)
         vlan: native                 # VLAN tag to use with this NIC
         members:                     # Physical NIC members of this mapping (Single value allowed for interface phys_type)
-          - nic4                     # Note, for Apex you may also use the logical nic name (found by nic order), such as "nic1"
+          - eth3                     # Note, for Apex you may also use the logical nic name (found by nic order), such as "nic1"
       controller:                    # Mapping for controller profile (nodes that will be used as Controller nodes)
         phys_type: interface
         vlan: native
index f05e611..d7e9b7e 100755 (executable)
@@ -14,6 +14,11 @@ function overcloud_deploy {
   local num_compute_nodes
   local num_control_nodes
 
+  # OPNFV Default Environment and Network settings
+  DEPLOY_OPTIONS+=" -e ${ENV_FILE}"
+  DEPLOY_OPTIONS+=" -e network-environment.yaml"
+
+  # Custom Deploy Environment Templates
   if [[ "${#deploy_options_array[@]}" -eq 0 || "${deploy_options_array['sdn_controller']}" == 'opendaylight' ]]; then
     if [ "${deploy_options_array['sfc']}" == 'True' ]; then
       DEPLOY_OPTIONS+=" -e /usr/share/openstack-tripleo-heat-templates/environments/opendaylight_sfc.yaml"
@@ -65,6 +70,11 @@ function overcloud_deploy {
     DEPLOY_OPTIONS+=" -e /usr/share/openstack-tripleo-heat-templates/environments/enable_congress.yaml"
   fi
 
+  # Enable Real Time Kernel (kvm4nfv)
+  if [ "${deploy_options_array['rt_kvm']}" == 'True' ]; then
+    DEPLOY_OPTIONS+=" -e /home/stack/enable_rt_kvm.yaml"
+  fi
+
   # Make sure the correct overcloud image is available
   if [ ! -f $IMAGES/overcloud-full-${SDN_IMAGE}.qcow2 ]; then
       echo "${red} $IMAGES/overcloud-full-${SDN_IMAGE}.qcow2 is required to execute your deployment."
@@ -185,10 +195,6 @@ EOI
     DEPLOY_OPTIONS+=" -e /usr/share/openstack-tripleo-heat-templates/environments/storage-environment.yaml"
   fi
 
-  #DEPLOY_OPTIONS+=" -e /usr/share/openstack-tripleo-heat-templates/environments/network-isolation.yaml"
-  DEPLOY_OPTIONS+=" -e network-environment.yaml"
-
-
   # get number of nodes available in inventory
   num_control_nodes=$(ssh -T ${SSH_OPTIONS[@]} "root@$UNDERCLOUD" "grep -c profile:control /home/stack/instackenv.json")
   num_compute_nodes=$(ssh -T ${SSH_OPTIONS[@]} "root@$UNDERCLOUD" "grep -c profile:compute /home/stack/instackenv.json")
@@ -225,8 +231,6 @@ EOI
      DEPLOY_OPTIONS+=" -e virtual-environment.yaml"
   fi
 
-  DEPLOY_OPTIONS+=" -e ${ENV_FILE}"
-
   echo -e "${blue}INFO: Deploy options set:\n${DEPLOY_OPTIONS}${reset}"
 
   ssh -T ${SSH_OPTIONS[@]} "stack@$UNDERCLOUD" <<EOI
index 0d1939a..566e8be 100644 (file)
@@ -23,7 +23,8 @@ REQ_DEPLOY_SETTINGS = ['sdn_controller',
                        'vpn',
                        'vpp',
                        'ceph',
-                       'gluon']
+                       'gluon',
+                       'rt_kvm']
 
 OPT_DEPLOY_SETTINGS = ['performance',
                        'vsperf',
index b04f141..79b0a9d 100644 (file)
@@ -99,13 +99,13 @@ class NetworkSettings(dict):
                     logging.info("{} enabled".format(network))
                     self._config_required_settings(network)
                     nicmap = _network['nic_mapping']
+                    self._validate_overcloud_nic_order(network)
                     iface = nicmap[CONTROLLER]['members'][0]
                     self._config_ip_range(network=network,
                                           interface=iface,
                                           ip_range='overcloud_ip_range',
                                           start_offset=21, end_offset=21)
                     self.enabled_network_list.append(network)
-                    self._validate_overcloud_nic_order(network)
                     # TODO self._config_optional_settings(network)
                 else:
                     logging.info("{} disabled, will collapse with "
index 955c0cf..8f99435 100644 (file)
@@ -92,7 +92,10 @@ class TestNetworkSettings(object):
             nic_index = 1
             print(ns.nics)
             for network in ns.enabled_network_list:
-                nic = 'nic' + str(nic_index)
+                if role == 'compute':
+                    nic = 'eth' + str(nic_index - 1)
+                else:
+                    nic = 'nic' + str(nic_index)
                 assert_equal(ns.nics[role][network], nic)
                 nic_index += 1
 
@@ -104,10 +107,10 @@ class TestNetworkSettings(object):
         ns = NetworkSettings(files_dir+'network_settings.yaml')
         storage_net_nicmap = ns['networks'][STORAGE_NETWORK]['nic_mapping']
         # set duplicate nic
-        storage_net_nicmap['compute']['members'][0] = 'nic1'
+        storage_net_nicmap['controller']['members'][0] = 'nic1'
         assert_raises(NetworkSettingsException, NetworkSettings, ns)
         # remove nic members
-        storage_net_nicmap['compute']['members'] = []
+        storage_net_nicmap['controller']['members'] = []
         assert_raises(NetworkSettingsException, NetworkSettings, ns)
 
     def test_missing_vlan(self):