heat_template_version: pike

description: >
  RHEL Registration and unregistration software deployments.

# Note extra parameters can be defined, then passed data via the
# environment parameter_defaults, without modifying the parent template
parameters:
  server:
    type: string
  # To be defined via a local or global environment in parameter_defaults
  rhel_reg_activation_key:
    type: string
  rhel_reg_auto_attach:
    type: string
  rhel_reg_base_url:
    type: string
  rhel_reg_environment:
    type: string
  rhel_reg_force:
    type: string
  rhel_reg_machine_name:
    type: string
  rhel_reg_org:
    type: string
  rhel_reg_password:
    type: string
  rhel_reg_pool_id:
    type: string
  rhel_reg_release:
    type: string
  rhel_reg_repos:
    type: string
  rhel_reg_sat_url:
    type: string
  rhel_reg_server_url:
    type: string
  rhel_reg_service_level:
    type: string
  rhel_reg_user:
    type: string
  rhel_reg_type:
    type: string
  rhel_reg_method:
    type: string
  rhel_reg_sat_repo:
    type: string
  rhel_reg_http_proxy_host:
    type: string
  rhel_reg_http_proxy_port:
    type: string
  rhel_reg_http_proxy_username:
    type: string
  rhel_reg_http_proxy_password:
    type: string
  UpdateOnRHELRegistration:
    type: boolean
    default: false
    description: |
      When enabled, the system will perform a yum update after performing the
      RHEL Registration process.
  DeleteOnRHELUnregistration:
    type: boolean
    default: false
    description: |
      When true, the system profile will be deleted from the registration
      service when the rhel-registration.yaml nested stack is deleted.
  RHELRegistrationActions:
    type: comma_delimited_list
    default:
      - CREATE
    description: Actions when the system profile will be registered, by default we only do this on CREATE of a new server, not for existing nodes.

conditions:
  unregister_on_delete:
    equals:
      - {get_param: DeleteOnRHELUnregistration}
      - true
  update_requested:
    equals:
      - {get_param: UpdateOnRHELRegistration}
      - true

resources:

  DeploymentActions:
    type: OS::Heat::Value
    properties:
      value:
        yaql

  RHELRegistration:
    type: OS::Heat::SoftwareConfig
    properties:
      group: script
      inputs:
        - name: REG_ACTIVATION_KEY
        - name: REG_AUTO_ATTACH
        - name: REG_BASE_URL
        - name: REG_ENVIRONMENT
        - name: REG_FORCE
        - name: REG_MACHINE_NAME
        - name: REG_ORG
        - name: REG_PASSWORD
        - name: REG_POOL_ID
        - name: REG_RELEASE
        - name: REG_REPOS
        - name: REG_SAT_URL
        - name: REG_SERVER_URL
        - name: REG_SERVICE_LEVEL
        - name: REG_USER
        - name: REG_TYPE
        - name: REG_METHOD
        - name: REG_SAT_REPO
        - name: REG_HTTP_PROXY_HOST
        - name: REG_HTTP_PROXY_PORT
        - name: REG_HTTP_PROXY_USERNAME
        - name: REG_HTTP_PROXY_PASSWORD
      config: {get_file: scripts/rhel-registration}

  RHELRegistrationDeployment:
    type: OS::Heat::SoftwareDeployment
    properties:
      name: RHELRegistrationDeployment
      server:  {get_param: server}
      config: {get_resource: RHELRegistration}
      actions: {get_param: RHELRegistrationActions}
      input_values:
        REG_ACTIVATION_KEY: {get_param: rhel_reg_activation_key}
        REG_AUTO_ATTACH: {get_param: rhel_reg_auto_attach}
        REG_BASE_URL: {get_param: rhel_reg_base_url}
        REG_ENVIRONMENT: {get_param: rhel_reg_environment}
        REG_FORCE: {get_param: rhel_reg_force}
        REG_MACHINE_NAME: {get_param: rhel_reg_machine_name}
        REG_ORG: {get_param: rhel_reg_org}
        REG_PASSWORD: {get_param: rhel_reg_password}
        REG_POOL_ID: {get_param: rhel_reg_pool_id}
        REG_RELEASE: {get_param: rhel_reg_release}
        REG_REPOS: {get_param: rhel_reg_repos}
        REG_SAT_URL: {get_param: rhel_reg_sat_url}
        REG_SERVER_URL: {get_param: rhel_reg_server_url}
        REG_SERVICE_LEVEL: {get_param: rhel_reg_service_level}
        REG_USER: {get_param: rhel_reg_user}
        REG_TYPE: {get_param: rhel_reg_type}
        REG_METHOD: {get_param: rhel_reg_method}
        REG_SAT_REPO: {get_param: rhel_reg_sat_repo}
        REG_HTTP_PROXY_HOST: {get_param: rhel_reg_http_proxy_host}
        REG_HTTP_PROXY_PORT: {get_param: rhel_reg_http_proxy_port}
        REG_HTTP_PROXY_USERNAME: {get_param: rhel_reg_http_proxy_username}
        REG_HTTP_PROXY_PASSWORD: {get_param: rhel_reg_http_proxy_password}

  RHELUnregistration:
    type: OS::Heat::SoftwareConfig
    properties:
      group: script
      config: {get_file: scripts/rhel-unregistration}
      inputs:
        - name: REG_METHOD

  RHELUnregistrationDeployment:
    type: OS::Heat::SoftwareDeployment
    properties:
      name: RHELUnregistrationDeployment
      server:  {get_param: server}
      config: {get_resource: RHELUnregistration}
      actions:
        if:
          - unregister_on_delete
          - ['DELETE']
          - []
      input_values:
        REG_METHOD: {get_param: rhel_reg_method}

  YumUpdateConfigurationAfterRHELRegistration:
    type: OS::Heat::SoftwareConfig
    properties:
      group: script
      config: |
        #!/bin/bash
        set -x
        # yum check-update exits 100 if updates are available
        set +e
        check_update=$(yum check-update 2>&1)
        check_update_exit=$?
        set -e
        if [[ "$check_update_exit" == "100" ]]; then
            full_command="yum -q -y update"
            echo "Running: $full_command"
            result=$($full_command)
            return_code=$?
            echo "$result"
            echo "yum return code: $return_code"
            exit $return_code
        elif [[ "$check_update_exit" == "1" ]]; then
            echo "Failed to check for package updates"
            echo "$check_update"
        else
           echo "No packages require updating"
           exit 0
        fi

  UpdateDeploymentAfterRHELRegistration:
    type: OS::Heat::SoftwareDeployment
    depends_on: RHELRegistrationDeployment
    condition: update_requested
    properties:
      name: UpdateDeploymentAfterRHELRegistration
      config: {get_resource: YumUpdateConfigurationAfterRHELRegistration}
      server:  {get_param: server}
      actions: {get_param: RHELRegistrationActions}

outputs:
  deploy_stdout:
    description: Deployment reference, used to trigger puppet apply on changes
    value: {get_attr: [RHELRegistrationDeployment, deploy_stdout]}

