heat_template_version: rocky

description: Template file to add a swap partition to a node.

parameters:
  servers:
    type: json
  swap_partition_label:
    type: string
    description: Swap partition label
    default: 'swap1'

resources:
  SwapConfig:
    type: OS::Heat::SoftwareConfig
    properties:
      group: script
      config: |
        #!/bin/bash
        set -eux
        swap_partition=$(realpath /dev/disk/by-label/$swap_partition_label)
        if [ -f "$swap_partition" ]; then
          swapon $swap_partition
          echo "$swap_partition swap swap defaults 0 0" >> /etc/fstab
        else
          echo "$swap_partition needs to be a valid path"
          echo "Check that $swap_partition_label is a valid partition label"
        fi
      inputs:
        - name: swap_partition_label
          description: Swap partition label
          default: 'swap1'

{% for role in roles %}
  {{role.name}}SwapDeployment:
    type: OS::Heat::SoftwareDeploymentGroup
    properties:
      name: {{role.name}}SwapDeployment
      config: {get_resource: SwapConfig}
      servers: {get_param: [servers, {{role.name}}]}
      input_values:
        swap_partition_label: {get_param: swap_partition_label}
      actions: ["CREATE"]
{% endfor %}

heat_template_version: rocky

description: Template file to add a swap partition to a node.

parameters:
  servers:
    type: json
  swap_partition_label:
    type: string
    description: Swap partition label
    default: 'swap1'

resources:
  SwapConfig:
    type: OS::Heat::SoftwareConfig
    properties:
      group: script
      config: |
        #!/bin/bash
        set -eux
        if [ -e "/dev/disk/by-label/${swap_partition_label}" ]; then
          swap_partition=$(realpath /dev/disk/by-label/${swap_partition_label})
          if ! grep -qe "${swap_partition}" /etc/fstab; then
            echo "$swap_partition swap swap defaults 0 0" | tee -a /etc/fstab
          fi
        else
          for item in $(lsblk -f --output FSTYPE,UUID | awk '/swap/ {print $2}'); do
            if ! grep -qe "${item}" /etc/fstab; then
              echo -e "UUID=${item} swap swap defaults 0 0" | tee -a /etc/fstab
            fi
          done
        fi
        swapon -a
      inputs:
        - name: swap_partition_label
          description: Swap partition label
          default: 'swap1'

{% for role in roles %}
  {{role.name}}SwapDeployment:
    type: OS::Heat::SoftwareDeploymentGroup
    properties:
      name: {{role.name}}SwapDeployment
      config: {get_resource: SwapConfig}
      servers: {get_param: [servers, {{role.name}}]}
      input_values:
        swap_partition_label: {get_param: swap_partition_label}
      actions: ["CREATE"]
{% endfor %}

Improve the ability to enable swap
Improve the ability to enable swap

This change will imporve the ability to enable a swap partition should
one be present. The updated script will now use the label when defined
and found, it then will look for a partition in the /etc/fstab file prior
to writing the file system entry. This resolves an issue where if this
template was executed more than once, a given partition would be written
to the /etc/fstab file repeatedly. If a given label is undefined the
script will look for swap filesystem types and use the UUID of the given
swap filesystem to enable swap functionality. This improvement will
ensure hosts that have swap partition already created, but potentially
unlabled, are able to be handled correctly. This will work with LVM,
Logical, Primary partition types.

Change-Id: I60a1f427d4f58ae559c797f37f8230d6eb694e1d
Signed-off-by: Kevin Carter <1d9a750a4fc7026fb02029431dc8a87d24487135@redhat.com>
