From fb8c23c5413ee7c820f7c947fb1bb007d5d4cf95 Mon Sep 17 00:00:00 2001 From: davidjchou Date: Sun, 5 Mar 2017 17:39:24 -0900 Subject: Adding "Real Time KVM" support 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 Signed-off-by: Tim Rozet Signed-off-by: Dan Radez --- build/enable_rt_kvm.yaml | 4 +++ build/kvm4nfv-1st-boot.yaml | 60 ++++++++++++++++++++++++++++++++++ build/overcloud-full.sh | 5 +++ build/rpm_specs/opnfv-apex-common.spec | 5 +++ build/undercloud.sh | 5 +++ build/variables.sh | 3 ++ config/deploy/deploy_settings.yaml | 4 +++ config/deploy/os-nosdn-kvm-ha.yaml | 11 +++++++ config/deploy/os-nosdn-kvm-noha.yaml | 11 +++++++ config/network/network_settings.yaml | 10 +++--- lib/overcloud-deploy-functions.sh | 16 +++++---- lib/python/apex/deploy_settings.py | 3 +- lib/python/apex/network_settings.py | 2 +- tests/test_apex_network_settings.py | 9 +++-- 14 files changed, 132 insertions(+), 16 deletions(-) create mode 100644 build/enable_rt_kvm.yaml create mode 100644 build/kvm4nfv-1st-boot.yaml create mode 100644 config/deploy/os-nosdn-kvm-ha.yaml create mode 100644 config/deploy/os-nosdn-kvm-noha.yaml diff --git a/build/enable_rt_kvm.yaml b/build/enable_rt_kvm.yaml new file mode 100644 index 00000000..0059021c --- /dev/null +++ b/build/enable_rt_kvm.yaml @@ -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 index 00000000..0dad3e3b --- /dev/null +++ b/build/kvm4nfv-1st-boot.yaml @@ -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} + + diff --git a/build/overcloud-full.sh b/build/overcloud-full.sh index c4c31c8a..b94c0cb0 100755 --- a/build/overcloud-full.sh +++ b/build/overcloud-full.sh @@ -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 diff --git a/build/rpm_specs/opnfv-apex-common.spec b/build/rpm_specs/opnfv-apex-common.spec index 40b25290..a004542b 100644 --- a/build/rpm_specs/opnfv-apex-common.spec +++ b/build/rpm_specs/opnfv-apex-common.spec @@ -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 - 4.0-5 - Commenting out ONOS, unsupported in Danube +- Adding kvm4nfv files * Tue Feb 14 2017 Feng Pan - 4.0-4 - Add network_settings_vpp.yaml * Fri Feb 3 2017 Nikolas Hermanns - 4.0-3 diff --git a/build/undercloud.sh b/build/undercloud.sh index 1101da87..4e1b963a 100755 --- a/build/undercloud.sh +++ b/build/undercloud.sh @@ -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" \ diff --git a/build/variables.sh b/build/variables.sh index 93ae83df..4ba591c4 100644 --- a/build/variables.sh +++ b/build/variables.sh @@ -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)}') diff --git a/config/deploy/deploy_settings.yaml b/config/deploy/deploy_settings.yaml index b3d3ac2b..73535795 100644 --- a/config/deploy/deploy_settings.yaml +++ b/config/deploy/deploy_settings.yaml @@ -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 index 00000000..cb68a313 --- /dev/null +++ b/config/deploy/os-nosdn-kvm-ha.yaml @@ -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 index 00000000..bf737d71 --- /dev/null +++ b/config/deploy/os-nosdn-kvm-noha.yaml @@ -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 diff --git a/config/network/network_settings.yaml b/config/network/network_settings.yaml index 1cba64bb..be0b6836 100644 --- a/config/network/network_settings.yaml +++ b/config/network/network_settings.yaml @@ -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 diff --git a/lib/overcloud-deploy-functions.sh b/lib/overcloud-deploy-functions.sh index f05e611f..d7e9b7e0 100755 --- a/lib/overcloud-deploy-functions.sh +++ b/lib/overcloud-deploy-functions.sh @@ -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" <