heat_template_version: pike

description: >
  Do some configuration, then reboot - sometimes needed for early-boot
  changes such as modifying kernel configuration

parameters:
  server:
    type: string
  # Deprecated Parameters, these configuration are deprecated in favor or role-specific parameters.
  # Use: extraconfig/pre_network/host_config_and_reboot.yaml.
  # Deprecated in Pike and will be removed in Queens.
  {{role}}KernelArgs:
    type: string
    default: ""
  {{role}}TunedProfileName:
    type: string
    default: ""
  {{role}}HostCpusList:
    type: string
    default: ""
  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.

parameter_group:
  - label: deprecated
    parameters:
      - {{role}}KernelArgs
      - {{role}}TunedProfileName
      - {{role}}HostCpusList

conditions:
  param_exists:
    or:
      - not:
          equals:
          - get_param: {{role}}KernelArgs
          - ""
      - not:
          equals:
          - get_param: {{role}}TunedProfileName
          - ""
  deployment_actions_empty:
    equals:
      - {get_param: deployment_actions}
      - []

resources:

  HostParametersConfig:
    type: OS::Heat::SoftwareConfig
    condition: param_exists
    properties:
      group: ansible
      inputs:
        - name: _KERNEL_ARGS_
        - name: _TUNED_PROFILE_NAME_
        - name: _HOST_CPUS_LIST_
      outputs:
        - name: result
      config:
        get_file: ansible_host_config.ansible

  HostParametersDeployment:
    type: OS::Heat::SoftwareDeployment
    condition: param_exists
    properties:
      name: HostParametersDeployment
      server:  {get_param: server}
      config: {get_resource: HostParametersConfig}
      actions:
        if:
          - deployment_actions_empty
          - []
          - ['CREATE'] # Only do this on CREATE
      input_values:
        _KERNEL_ARGS_: {get_param: {{role}}KernelArgs}
        _TUNED_PROFILE_NAME_: {get_param: {{role}}TunedProfileName}
        _HOST_CPUS_LIST_: {get_param: {{role}}HostCpusList}

  RebootConfig:
    type: OS::Heat::SoftwareConfig
    condition: param_exists
    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
    condition: param_exists
    depends_on: HostParametersDeployment
    properties:
      name: RebootDeployment
      server:  {get_param: server}
      config: {get_resource: RebootConfig}
      actions:
        if:
          - deployment_actions_empty
          - []
          - ['CREATE'] # Only do this on CREATE
      signal_transport: NO_SIGNAL

outputs:
  result:
    value:
      get_attr: [HostParametersDeployment, result]
    condition: param_exists
  stdout:
    value:
      get_attr: [HostParametersDeployment, deploy_stdout]
    condition: param_exists
  stderr:
    value:
      get_attr: [HostParametersDeployment, deploy_stderr]
    condition: param_exists
  status_code:
    value:
      get_attr: [HostParametersDeployment, deploy_status_code]
    condition: param_exists
