summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordavidjchou <david.j.chou@intel.com>2017-03-05 17:39:24 -0900
committerDan Radez <dradez@redhat.com>2017-03-09 17:54:20 +0000
commitfb8c23c5413ee7c820f7c947fb1bb007d5d4cf95 (patch)
tree334bec4406bb7b503556911974db8150d23ae876
parent8b2ca87007c2cb477765c183325e5af03bf9f80d (diff)
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 <david.j.chou@intel.com> Signed-off-by: Tim Rozet <trozet@redhat.com> Signed-off-by: Dan Radez <dradez@redhat.com>
-rw-r--r--build/enable_rt_kvm.yaml4
-rw-r--r--build/kvm4nfv-1st-boot.yaml60
-rwxr-xr-xbuild/overcloud-full.sh5
-rw-r--r--build/rpm_specs/opnfv-apex-common.spec5
-rwxr-xr-xbuild/undercloud.sh5
-rw-r--r--build/variables.sh3
-rw-r--r--config/deploy/deploy_settings.yaml4
-rw-r--r--config/deploy/os-nosdn-kvm-ha.yaml11
-rw-r--r--config/deploy/os-nosdn-kvm-noha.yaml11
-rw-r--r--config/network/network_settings.yaml10
-rwxr-xr-xlib/overcloud-deploy-functions.sh16
-rw-r--r--lib/python/apex/deploy_settings.py3
-rw-r--r--lib/python/apex/network_settings.py2
-rw-r--r--tests/test_apex_network_settings.py9
14 files changed, 132 insertions, 16 deletions
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 <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
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" <<EOI
diff --git a/lib/python/apex/deploy_settings.py b/lib/python/apex/deploy_settings.py
index 0d1939a4..566e8bea 100644
--- a/lib/python/apex/deploy_settings.py
+++ b/lib/python/apex/deploy_settings.py
@@ -23,7 +23,8 @@ REQ_DEPLOY_SETTINGS = ['sdn_controller',
'vpn',
'vpp',
'ceph',
- 'gluon']
+ 'gluon',
+ 'rt_kvm']
OPT_DEPLOY_SETTINGS = ['performance',
'vsperf',
diff --git a/lib/python/apex/network_settings.py b/lib/python/apex/network_settings.py
index b04f141a..79b0a9d1 100644
--- a/lib/python/apex/network_settings.py
+++ b/lib/python/apex/network_settings.py
@@ -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 "
diff --git a/tests/test_apex_network_settings.py b/tests/test_apex_network_settings.py
index 955c0cf7..8f994352 100644
--- a/tests/test_apex_network_settings.py
+++ b/tests/test_apex_network_settings.py
@@ -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):