---
heat_template_version: 2014-10-16

description: >
  Example extra config for post-deployment

parameters:
  server:
    type: string
  HostCpusList:
    description: >
      List of logical cores for OVS DPDK
    type: string
    default: ""
  NeutronDpdkSocketMemory:
    description: Memory allocated for each socket
    default: ""
    type: string
  NeutronDpdkCoreList:
    description: >
      A list or range of physical CPU cores to be pinned to PMD
      The given args will be appended to the tuned cpu-partitioning profile.
      Ex. HostCpusList: '4-12' will tune cores from 4-12
    type: string
    default: ""

resources:
  OvsDpdkSetup:
    type: OS::Heat::StructuredDeployment
    properties:
      server: {get_param: server}
      config: {get_resource: OvsDpdkConfig}

  OvsDpdkConfig:
    type: OS::Heat::SoftwareConfig
    properties:
      group: script
      config:
        str_replace:
          template: |
            #!/bin/bash
            set -x
            get_mask()
            {
              local list=$1
              local mask=0
              declare -a bm
              max_idx=0
              for core in $(echo $list | sed 's/,/ /g')
              do
                  index=$(($core/32))
                  bm[$index]=0
                  if [ $max_idx -lt $index ]; then
                     max_idx=$index
                  fi
              done
              for ((i=$max_idx;i>=0;i--));
              do
                  bm[$i]=0
              done
              for core in $(echo $list | sed 's/,/ /g')
              do
                  index=$(($core/32))
                  temp=$((1<<$core))
                  bm[$index]=$((${bm[$index]} | $temp))
              done
              printf -v mask "%x" "${bm[$max_idx]}"
              for ((i=$max_idx-1;i>=0;i--));
              do
                  printf -v hex "%08x" "${bm[$i]}"
                  mask+=$hex
              done
              printf "%s" "$mask"
            }
            pmd_cpu_mask=$( get_mask $PMD_CORES )
            dpdk_lcore_mask=$( get_mask $DPDK_CORES )
            yum remove -y vpp-devel
            yum install -y /root/dpdk_rpms/*
            systemctl restart openvswitch
            sleep 5
            sed  -i "s/#user\s*=.*/user = \"root\"/" /etc/libvirt/qemu.conf
            sed  -i "s/#group\s*=.*/group = \"root\"/" /etc/libvirt/qemu.conf
            ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
            if [ -n "$SOCKET_MEMORY" ]; then
              other_config="dpdk-socket-mem=$SOCKET_MEMORY"
              ovs-vsctl --no-wait set Open_vSwitch . other_config:$other_config
            fi
            if [ -n "$pmd_cpu_mask" ]; then
              other_config="pmd-cpu-mask=$pmd_cpu_mask"
              ovs-vsctl --no-wait set Open_vSwitch . other_config:$other_config
            fi
            if [ -n "$dpdk_lcore_mask" ]; then
              other_config="dpdk-lcore-mask=$dpdk_lcore_mask"
              ovs-vsctl --no-wait set Open_vSwitch . other_config:$other_config
            fi
            systemctl restart openvswitch

          params:
            $DPDK_CORES: {get_param: HostCpusList}
            $PMD_CORES: {get_param: NeutronDpdkCoreList}
            $SOCKET_MEMORY: {get_param: NeutronDpdkSocketMemory}
outputs:
  deploy_stdout:
    description: Output of the extra dpdk ovs  deployment
    value: {get_attr: [OvsDpdkSetup, deploy_stdout]}