b30bdb6f8e
In order to deploy OpenDaylight with DPDK we need to copy the DPDK config for OVS done in the neutron-ovs-dpdk service template, without enabling OVS agent for compute nodes. To do this correctly, we should inherit and openvswitch service which is a common place to set OVS configuration and parameters. Note: vswitch::dpdk config will be called in prenetwork setup with ovs_dpdk_config.yaml so there is no need to include that in the step config for neutron-ovs-dpdk-agent service or opendaylight-ovs-dpdk. Changes Include: - Creates a common openvswitch service template, which in the future will migrate to be its own service. - Renames and fixes OVS DPDK configuration heat parameters in the openvswitch template. - neutron-ovs-dpdk-agent now inherits the common openvswitch template. - Adds opendaylight-ovs-dpdk template which also inherits common ovs template. - Uses OVS DPDK config script to allow configuring OVS DPDK in prenetwork config (before os-net-config runs). This has an issue where hieradata is not present yet, so we have to redefine the heat parameters and pass them via bash. In the future this should be corrected. - Adds opendaylight-dpdk environment file used to deploy an ODL + DPDK deployment. - Updates neutron-ovs-dpdk environment file. Closes-Bug: 1656097 Partial-Bug: 1656096 Depends-On: I3227189691df85f265cf84bd4115d8d4c9f979f3 Change-Id: Ie80e38c2a9605d85cdf867a31b6888bfcae69e29 Signed-off-by: Tim Rozet <trozet@redhat.com>
247 lines
8.7 KiB
YAML
247 lines
8.7 KiB
YAML
heat_template_version: pike
|
|
|
|
description: >
|
|
All configurations which require reboot should be initiated via PreNetworkConfig. After
|
|
this configuration is completed, the corresponding node will be rebooted.
|
|
|
|
parameters:
|
|
server:
|
|
type: string
|
|
RoleParameters:
|
|
type: json
|
|
description: Role Specific parameters
|
|
default: {}
|
|
ServiceNames:
|
|
type: comma_delimited_list
|
|
default: []
|
|
IsolCpusList:
|
|
default: "0"
|
|
description: List of cores to be isolated by tuned
|
|
type: string
|
|
constraints:
|
|
- allowed_pattern: "[0-9,-]+"
|
|
OvsEnableDpdk:
|
|
default: false
|
|
description: Whether or not to configure enable DPDK in OVS
|
|
type: boolean
|
|
OvsDpdkCoreList:
|
|
description: >
|
|
List of cores to be used for DPDK lcore threads. Note, these threads
|
|
are used by the OVS control path for validator and handling functions.
|
|
type: string
|
|
constraints:
|
|
- allowed_pattern: "[0-9,-]*"
|
|
default: ""
|
|
OvsDpdkMemoryChannels:
|
|
description: Number of memory channels per socket to be used for DPDK
|
|
type: string
|
|
constraints:
|
|
- allowed_pattern: "[0-9]*"
|
|
default: ""
|
|
OvsDpdkSocketMemory:
|
|
default: ""
|
|
description: >
|
|
Sets the amount of hugepage memory to assign per NUMA node. It is
|
|
recommended to use the socket closest to the PCIe slot used for the
|
|
desired DPDK NIC. The format should be in "<socket 0 mem>, <socket 1
|
|
mem>, <socket n mem>", where the value is specified in MB. For example:
|
|
"1024,0".
|
|
type: string
|
|
OvsDpdkDriverType:
|
|
default: "vfio-pci"
|
|
description: >
|
|
DPDK Driver type. Ensure the Overcloud NIC to be used for DPDK supports
|
|
this UIO/PMD driver.
|
|
type: string
|
|
OvsPmdCoreList:
|
|
description: >
|
|
A list or range of CPU cores for PMD threads to be pinned to. Note, NIC
|
|
location to cores on socket, number of hyper-threaded logical cores, and
|
|
desired number of PMD threads can all play a role in configuring this
|
|
setting. These cores should be on the same socket where
|
|
OvsDpdkSocketMemory is assigned. If using hyperthreading then specify
|
|
both logical cores that would equal the physical core. Also, specifying
|
|
more than one core will trigger multiple PMD threads to be spawned which
|
|
may improve dataplane performance.
|
|
constraints:
|
|
- allowed_pattern: "[0-9,-]*"
|
|
type: string
|
|
default: ""
|
|
# DEPRECATED: the following options are deprecated and are currently maintained
|
|
# for backwards compatibility. They will be removed in the Queens cycle.
|
|
HostCpusList:
|
|
description: List of cores to be used for host process
|
|
type: string
|
|
constraints:
|
|
- allowed_pattern: "[0-9,-]+"
|
|
default: '0'
|
|
NeutronDpdkCoreList:
|
|
description: List of cores to be used for DPDK Poll Mode Driver
|
|
type: string
|
|
constraints:
|
|
- allowed_pattern: "[0-9,-]*"
|
|
default: ''
|
|
NeutronDpdkMemoryChannels:
|
|
description: Number of memory channels to be used for DPDK
|
|
type: string
|
|
constraints:
|
|
- allowed_pattern: "[0-9]*"
|
|
default: ''
|
|
NeutronDpdkSocketMemory:
|
|
default: ''
|
|
description: Memory allocated for each socket
|
|
type: string
|
|
NeutronDpdkDriverType:
|
|
default: "vfio-pci"
|
|
description: DPDK Driver type
|
|
type: string
|
|
|
|
conditions:
|
|
is_host_config_required: {not: {equals: [{get_param: [RoleParameters, KernelArgs]}, ""]}}
|
|
# YAQL is enabled in conditions with https://review.openstack.org/#/c/467506/
|
|
is_dpdk_config_required:
|
|
or:
|
|
- yaql:
|
|
expression: $.data.service_names.contains('neutron_ovs_dpdk_agent')
|
|
data:
|
|
service_names: {get_param: ServiceNames}
|
|
- {get_param: OvsEnableDpdk}
|
|
- {get_param: [RoleParameters, OvsEnableDpdk]}
|
|
is_reboot_config_required:
|
|
or:
|
|
- is_host_config_required
|
|
- is_dpdk_config_required
|
|
l_cores_empty: {equals: [{get_param: OvsDpdkCoreList}, '']}
|
|
pmd_cores_empty: {equals: [{get_param: OvsPmdCoreList}, '']}
|
|
mem_channels_empty: {equals: [{get_param: OvsDpdkMemoryChannels}, '']}
|
|
socket_mem_empty: {equals: [{get_param: OvsDpdkSocketMemory}, '']}
|
|
driver_not_set: {equals: [{get_param: OvsDpdkDriverType}, 'vfio-pci']}
|
|
isol_cpus_empty: {equals: [{get_param: IsolCpusList}, '0']}
|
|
|
|
resources:
|
|
RoleParametersValue:
|
|
type: OS::Heat::Value
|
|
properties:
|
|
type: json
|
|
value:
|
|
map_replace:
|
|
- map_replace:
|
|
- IsolCpusList: IsolCpusList
|
|
OvsDpdkCoreList: OvsDpdkCoreList
|
|
OvsDpdkMemoryChannels: OvsDpdkMemoryChannels
|
|
OvsDpdkSocketMemory: OvsDpdkSocketMemory
|
|
OvsDpdkDriverType: OvsDpdkDriverType
|
|
OvsPmdCoreList: OvsDpdkCoreList
|
|
- values: {get_param: [RoleParameters]}
|
|
- values:
|
|
IsolCpusList: {if: [isol_cpus_empty, {get_param: HostCpusList}, {get_param: IsolCpusList}]}
|
|
OvsDpdkCoreList: {if: [l_cores_empty, {get_param: HostCpusList}, {get_param: OvsDpdkCoreList}]}
|
|
OvsDpdkMemoryChannels: {if: [mem_channels_empty, {get_param: NeutronDpdkMemoryChannels}, {get_param: OvsDpdkMemoryChannels}]}
|
|
OvsDpdkSocketMemory: {if: [socket_mem_empty, {get_param: NeutronDpdkSocketMemory}, {get_param: OvsDpdkSocketMemory}]}
|
|
OvsDpdkDriverType: {if: [driver_not_set, {get_param: NeutronDpdkDriverType}, {get_param: OvsDpdkDriverType}]}
|
|
OvsPmdCoreList: {if: [pmd_cores_empty, {get_param: NeutronDpdkCoreList}, {get_param: OvsPmdCoreList}]}
|
|
|
|
HostParametersConfig:
|
|
type: OS::Heat::SoftwareConfig
|
|
condition: is_host_config_required
|
|
properties:
|
|
group: ansible
|
|
inputs:
|
|
- name: _KERNEL_ARGS_
|
|
- name: _TUNED_PROFILE_NAME_
|
|
- name: _TUNED_CORES_
|
|
outputs:
|
|
- name: result
|
|
config:
|
|
get_file: ansible_host_config.yaml
|
|
|
|
HostParametersDeployment:
|
|
type: OS::Heat::SoftwareDeployment
|
|
condition: is_host_config_required
|
|
properties:
|
|
name: HostParametersDeployment
|
|
server: {get_param: server}
|
|
config: {get_resource: HostParametersConfig}
|
|
actions: ['CREATE'] # Only do this on CREATE
|
|
input_values:
|
|
_KERNEL_ARGS_: {get_param: [RoleParameters, KernelArgs]}
|
|
_TUNED_PROFILE_NAME_: {get_param: [RoleParameters, TunedProfileName]}
|
|
_TUNED_CORES_: {get_param: [RoleParameters, IsolCpusList]}
|
|
|
|
EnableDpdkConfig:
|
|
type: OS::Heat::SoftwareConfig
|
|
condition: is_dpdk_config_required
|
|
properties:
|
|
group: script
|
|
config:
|
|
str_replace:
|
|
template: |
|
|
#!/bin/bash
|
|
set -x
|
|
# DO NOT use --detailed-exitcodes
|
|
puppet apply --logdest console \
|
|
--modulepath /etc/puppet/modules:/opt/stack/puppet-modules:/usr/share/openstack-puppet/modules \
|
|
-e '
|
|
class {"vswitch::dpdk":
|
|
host_core_list => "$HOST_CORES",
|
|
pmd_core_list => "$PMD_CORES",
|
|
memory_channels => "$MEMORY_CHANNELS",
|
|
socket_mem => "$SOCKET_MEMORY",
|
|
}
|
|
'
|
|
params:
|
|
$HOST_CORES: {get_attr: [RoleParametersValue, value, OvsDpdkCoreList]}
|
|
$PMD_CORES: {get_attr: [RoleParametersValue, value, OvsPmdCoreList]}
|
|
$MEMORY_CHANNELS: {get_attr: [RoleParametersValue, value, OvsDpdkMemoryChannels]}
|
|
$SOCKET_MEMORY: {get_attr: [RoleParametersValue, value, OvsDpdkSocketMemory]}
|
|
|
|
EnableDpdkDeployment:
|
|
type: OS::Heat::SoftwareDeployment
|
|
condition: is_dpdk_config_required
|
|
properties:
|
|
name: EnableDpdkDeployment
|
|
server: {get_param: server}
|
|
config: {get_resource: EnableDpdkConfig}
|
|
actions: ['CREATE'] # Only do this on CREATE
|
|
|
|
RebootConfig:
|
|
type: OS::Heat::SoftwareConfig
|
|
condition: is_reboot_config_required
|
|
properties:
|
|
group: script
|
|
config: |
|
|
#!/bin/bash
|
|
# Stop os-collect-config to avoid any race collecting another
|
|
# deployment before reboot happens
|
|
systemctl stop os-collect-config.service
|
|
/sbin/reboot
|
|
|
|
RebootDeployment:
|
|
type: OS::Heat::SoftwareDeployment
|
|
depends_on: HostParametersDeployment
|
|
condition: is_reboot_config_required
|
|
properties:
|
|
name: RebootDeployment
|
|
server: {get_param: server}
|
|
config: {get_resource: RebootConfig}
|
|
actions: ['CREATE'] # Only do this on CREATE
|
|
signal_transport: NO_SIGNAL
|
|
|
|
outputs:
|
|
result:
|
|
condition: is_host_config_required
|
|
value:
|
|
get_attr: [HostParametersDeployment, result]
|
|
stdout:
|
|
condition: is_host_config_required
|
|
value:
|
|
get_attr: [HostParametersDeployment, deploy_stdout]
|
|
stderr:
|
|
condition: is_host_config_required
|
|
value:
|
|
get_attr: [HostParametersDeployment, deploy_stderr]
|
|
status_code:
|
|
condition: is_host_config_required
|
|
value:
|
|
get_attr: [HostParametersDeployment, deploy_status_code]
|