Enable DPDK on boot using PreNetworkConfig
authorSaravanan KR <skramaja@redhat.com>
Wed, 24 May 2017 05:58:37 +0000 (11:28 +0530)
committerSaravanan KR <skramaja@redhat.com>
Fri, 23 Jun 2017 05:49:23 +0000 (11:19 +0530)
DPDK has to be enabled on openvswitch on the boot before
configuring the network as when the network uses DPDK ports
OvS should be ready to handle DPDK. Enabled DPDK via
PreNetworkConfig by checking if ServiceNames contains
DPDK service.
Implements: blueprint ovs-2-6-dpdk
Closes-Bug: #1654975

Depends-On: I83a540336c01a696780621fb2b39486a6abf0917
Change-Id: I7af4534d91e67c94ba559b78b9ac6a001e639db3

extraconfig/pre_network/host_config_and_reboot.yaml
puppet/blockstorage-role.yaml
puppet/cephstorage-role.yaml
puppet/compute-role.yaml
puppet/controller-role.yaml
puppet/objectstorage-role.yaml
puppet/role.role.j2.yaml
releasenotes/notes/enable-dpdk-on-boot-f5b098b10152b436.yaml [new file with mode: 0644]

index 74e716a..e4898a6 100644 (file)
@@ -11,11 +11,68 @@ parameters:
     type: json
     description: Role Specific parameters
     default: {}
+  ServiceNames:
+    type: comma_delimited_list
+    default: []
+  HostCpusList:
+    default: "0"
+    description: List of cores to be used for host process
+    type: string
+    constraints:
+      - allowed_pattern: "[0-9,-]+"
+  NeutronDpdkCoreList:
+    default: ""
+    description: List of cores to be used for DPDK Poll Mode Driver
+    type: string
+    constraints:
+      - allowed_pattern: "[0-9,-]*"
+  NeutronDpdkMemoryChannels:
+    default: ""
+    description: Number of memory channels to be used for DPDK
+    type: string
+    constraints:
+      - allowed_pattern: "[0-9]*"
+  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:
+    yaql:
+      expression: $.data.service_names.contains('neutron_ovs_dpdk_agent')
+      data:
+        service_names: {get_param: ServiceNames}
+  is_reboot_config_required:
+    or:
+      - is_host_config_required
+      - is_dpdk_config_required
 
 resources:
+  RoleParametersValue:
+    type: OS::Heat::Value
+    properties:
+      type: json
+      value:
+        map_replace:
+          - map_replace:
+            - HostCpusList: HostCpusList
+              NeutronDpdkCoreList: NeutronDpdkCoreList
+              NeutronDpdkMemoryChannels: NeutronDpdkMemoryChannels
+              NeutronDpdkSocketMemory: NeutronDpdkSocketMemory
+            - values: {get_param: [RoleParameters]}
+          - values:
+              HostCpusList: {get_param: HostCpusList}
+              NeutronDpdkCoreList: {get_param: NeutronDpdkCoreList}
+              NeutronDpdkMemoryChannels: {get_param: NeutronDpdkMemoryChannels}
+              NeutronDpdkSocketMemory: {get_param: NeutronDpdkSocketMemory}
+
   HostParametersConfig:
     type: OS::Heat::SoftwareConfig
     condition: is_host_config_required
@@ -43,9 +100,45 @@ resources:
         _TUNED_PROFILE_NAME_: {get_param: [RoleParameters, TunedProfileName]}
         _TUNED_CORES_: {get_param: [RoleParameters, HostIsolatedCoreList]}
 
+  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, HostCpusList]}
+            $PMD_CORES: {get_attr: [RoleParametersValue, value, NeutronDpdkCoreList]}
+            $MEMORY_CHANNELS: {get_attr: [RoleParametersValue, value, NeutronDpdkMemoryChannels]}
+            $SOCKET_MEMORY: {get_attr: [RoleParametersValue, value, NeutronDpdkSocketMemory]}
+
+  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_host_config_required
+    condition: is_reboot_config_required
     properties:
       group: script
       config: |
@@ -58,7 +151,7 @@ resources:
   RebootDeployment:
     type: OS::Heat::SoftwareDeployment
     depends_on: HostParametersDeployment
-    condition: is_host_config_required
+    condition: is_reboot_config_required
     properties:
       name: RebootDeployment
       server:  {get_param: server}
index 551a88c..b20cdba 100644 (file)
@@ -377,6 +377,7 @@ resources:
     properties:
       server: {get_resource: BlockStorage}
       RoleParameters: {get_param: RoleParameters}
+      ServiceNames: {get_param: ServiceNames}
 
   NetworkDeployment:
     type: OS::TripleO::SoftwareDeployment
index 4336f3e..f1320bc 100644 (file)
@@ -383,6 +383,7 @@ resources:
     properties:
       server: {get_resource: CephStorage}
       RoleParameters: {get_param: RoleParameters}
+      ServiceNames: {get_param: ServiceNames}
 
   NetworkDeployment:
     type: OS::TripleO::SoftwareDeployment
index 7bcee47..6b0beab 100644 (file)
@@ -386,6 +386,7 @@ resources:
     properties:
       server: {get_resource: NovaCompute}
       RoleParameters: {get_param: RoleParameters}
+      ServiceNames: {get_param: ServiceNames}
 
   NetworkConfig:
     type: OS::TripleO::Compute::Net::SoftwareConfig
index 6a03265..b5c3828 100644 (file)
@@ -406,6 +406,7 @@ resources:
     properties:
       server: {get_resource: Controller}
       RoleParameters: {get_param: RoleParameters}
+      ServiceNames: {get_param: ServiceNames}
 
   NetworkConfig:
     type: OS::TripleO::Controller::Net::SoftwareConfig
index 40a5d44..8556746 100644 (file)
@@ -377,6 +377,7 @@ resources:
     properties:
       server: {get_resource: SwiftStorage}
       RoleParameters: {get_param: RoleParameters}
+      ServiceNames: {get_param: ServiceNames}
 
   NetworkDeployment:
     type: OS::TripleO::SoftwareDeployment
index f3b4b6b..0a47d50 100644 (file)
@@ -399,6 +399,7 @@ resources:
     properties:
       server: {get_resource: {{role}}}
       RoleParameters: {get_param: RoleParameters}
+      ServiceNames: {get_param: ServiceNames}
 
   NetworkDeployment:
     type: OS::TripleO::SoftwareDeployment
diff --git a/releasenotes/notes/enable-dpdk-on-boot-f5b098b10152b436.yaml b/releasenotes/notes/enable-dpdk-on-boot-f5b098b10152b436.yaml
new file mode 100644 (file)
index 0000000..4cb9b80
--- /dev/null
@@ -0,0 +1,8 @@
+---
+features:
+  - DPDK is enabled in OvS  before the NetworkDeployment to ensure DPDK
+    is ready to handle new port additions.
+upgrade:
+  - A new parameter ServiceNames is added to the PreNeworkConfig resource.
+    All templates associated with PreNeworkConfig should add this new
+    parameter during the upgrade.