heat_template_version: rocky 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: Parameters specific to the role default: {} ServiceNames: type: comma_delimited_list default: [] OvsEnableDpdk: default: false description: Whether or not to configure enable DPDK in OVS type: boolean tags: - role_specific 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: "" tags: - role_specific OvsDpdkMemoryChannels: description: Number of memory channels per socket to be used for DPDK type: string constraints: - allowed_pattern: "[0-9]*" default: "4" tags: - role_specific 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 ", , ", where the value is specified in MB. For example: "1024,0". type: string tags: - role_specific 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: "" tags: - role_specific deployment_actions: default: ['CREATE', 'UPDATE'] type: comma_delimited_list description: > List of stack actions that will trigger any deployments in this templates. The actions will be an empty list of the server is in the toplevel DeploymentServerBlacklist parameter's value. EnableDpdkDeploymentActions: default: ['CREATE'] type: comma_delimited_list description: > Exposing the DPDK deployment action, it may be required to run DPDK config during an upgrade. By default DPDK will be enabled during the CREATE action only. But on cases when it requires for certain migration, it may be required to run it for UPDATE action too. conditions: is_dpdk_config_required: or: - yaql: expression: $.data.service_names.contains('neutron_ovs_dpdk_agent') data: service_names: {get_param: ServiceNames} - {equals: [{get_param: [RoleParameters, OvsEnableDpdk]}, true]} deployment_actions_empty: equals: - {get_param: deployment_actions} - [] resources: RoleParametersValue: type: OS::Heat::Value properties: type: json value: map_replace: - map_replace: - OvsDpdkCoreList: OvsDpdkCoreList OvsDpdkMemoryChannels: OvsDpdkMemoryChannels OvsDpdkSocketMemory: OvsDpdkSocketMemory OvsPmdCoreList: OvsPmdCoreList - values: {get_param: [RoleParameters]} - values: OvsDpdkCoreList: {get_param: OvsDpdkCoreList} OvsDpdkMemoryChannels: {get_param: OvsDpdkMemoryChannels} OvsDpdkSocketMemory: {get_param: OvsDpdkSocketMemory} OvsPmdCoreList: {get_param: OvsPmdCoreList} # With OvS2.7 (which is default with pike), ovs-vswitchd will start dpdk # immediately after setting dpdk-init (behaviour change from ovs2.6). # Starting of DPDK require the huge page configuration to be enabled. So # reboot will happen before DPDK config and we don't need an explicity # restart after dpdk-init as true because of the behavior change. # TODO(skramaja): Dependency is that till the service file workaround, is # maintained, restart of ovs is required. 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 --summarize \ --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: if: - deployment_actions_empty - [] - {get_param: EnableDpdkDeploymentActions}