heat_template_version: 2015-04-30
description: 'Common Block Storage Configuration'
parameters:
  Image:
    default: overcloud-cinder-volume
    type: string
  CinderEnableIscsiBackend:
    default: true
    description: Whether to enable or not the Iscsi backend for Cinder
    type: boolean
  CinderISCSIHelper:
    default: tgtadm
    description: The iSCSI helper to use with cinder.
    type: string
  CinderLVMLoopDeviceSize:
    default: 5000
    description: The size of the loopback file used by the cinder LVM driver.
    type: number
  CinderPassword:
    default: unset
    description: The password for the cinder service and db account, used by cinder-api.
    type: string
    hidden: true
  VirtualIP:
    default: ''
    type: string
  ExtraConfig:
    default: {}
    description: |
      Additional configuration to inject into the cluster. The JSON should have
      the following structure:
        {"FILEKEY":
          {"config":
            [{"section": "SECTIONNAME",
              "values":
                [{"option": "OPTIONNAME",
                  "value": "VALUENAME"
                 }
                ]
             }
            ]
          }
        }
      For instance:
        {"nova":
          {"config":
            [{"section": "default",
              "values":
                [{"option": "force_config_drive",
                  "value": "always"
                 }
                ]
             },
             {"section": "cells",
              "values":
                [{"option": "driver",
                  "value": "nova.cells.rpc_driver.CellsRPCDriver"
                 }
                ]
             }
            ]
          }
        }
    type: json
  BlockStorageExtraConfig:
    default: {}
    description: |
      Role specific additional configuration to inject into the cluster.
    type: json
  Flavor:
    description: Flavor for block storage nodes to request when deploying.
    type: string
    constraints:
      - custom_constraint: nova.flavor
  GlancePort:
    default: "9292"
    description: Glance port.
    type: string
  GlanceProtocol:
    default: http
    description: Protocol to use when connecting to glance, set to https for SSL.
    type: string
  KeyName:
    default: default
    description: Name of an existing EC2 KeyPair to enable SSH access to the instances
    type: string
  RabbitPassword:
    default: 'guest'
    type: string
  RabbitUserName:
    default: 'guest'
    type: string
  RabbitClientUseSSL:
    default: false
    description: >
        Rabbit client subscriber parameter to specify
        an SSL connection to the RabbitMQ host.
    type: string
  RabbitClientPort:
    default: 5672
    description: Set rabbit subscriber port, change this if using SSL
    type: number
  SnmpdReadonlyUserName:
    default: ro_snmp_user
    description: The user name for SNMPd with readonly rights running on all Overcloud nodes
    type: string
  SnmpdReadonlyUserPassword:
    default: unset
    description: The user password for SNMPd with readonly rights running on all Overcloud nodes
    type: string
    hidden: true
  UpdateIdentifier:
    default: ''
    type: string
    description: >
      Setting to a previously unused value during stack-update will trigger
      package update on all nodes
  Hostname:
    type: string
    default: '' # Defaults to Heat created hostname
  ServiceNetMap:
    default: {}
    description: Mapping of service_name -> network name. Typically set
                 via parameter_defaults in the resource registry.
    type: json
  GlanceApiVirtualIP:
    type: string
    default: ''
  MysqlVirtualIP:
    type: string
    default: ''

resources:
  BlockStorage:
    type: OS::Nova::Server
    properties:
      image:
        {get_param: Image}
      flavor: {get_param: Flavor}
      key_name: {get_param: KeyName}
      networks:
        - network: ctlplane
      user_data_format: SOFTWARE_CONFIG
      user_data: {get_resource: NodeUserData}
      name: {get_param: Hostname}

  NodeUserData:
    type: OS::TripleO::NodeUserData

  InternalApiPort:
    type: OS::TripleO::BlockStorage::Ports::InternalApiPort
    properties:
      ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}

  StoragePort:
    type: OS::TripleO::BlockStorage::Ports::StoragePort
    properties:
      ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}

  StorageMgmtPort:
    type: OS::TripleO::BlockStorage::Ports::StorageMgmtPort
    properties:
      ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}

  NetworkConfig:
    type: OS::TripleO::BlockStorage::Net::SoftwareConfig
    properties:
      InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
      StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
      StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}

  NetworkDeployment:
    type: OS::TripleO::SoftwareDeployment
    properties:
      config: {get_resource: NetworkConfig}
      server: {get_resource: BlockStorage}

  BlockStorageDeployment:
    type: OS::Heat::StructuredDeployment
    properties:
      server: {get_resource: BlockStorage}
      config: {get_resource: BlockStorageConfig}
      input_values:
        controller_virtual_ip: {get_param: VirtualIP}
        cinder_dsn: {list_join: ['', ['mysql://cinder:', {get_param: CinderPassword}, '@', {get_param: VirtualIP} , '/cinder']]}
        snmpd_readonly_user_name: {get_param: SnmpdReadonlyUserName}
        snmpd_readonly_user_password: {get_param: SnmpdReadonlyUserPassword}
      signal_transport: NO_SIGNAL
  BlockStorageConfig:
    type: OS::Heat::StructuredConfig
    properties:
      group: os-apply-config
      config:
        keystone:
          host: {get_input: controller_virtual_ip}
        cinder:
          db: {get_input: cinder_dsn}
          volume_size_mb:
            get_param: CinderLVMLoopDeviceSize
          iscsi-helper:
            get_param: CinderISCSIHelper
        snmpd:
          export_MIB: UCD-SNMP-MIB
          readonly_user_name: {get_input: snmpd_readonly_user_name}
          readonly_user_password: {get_input: snmpd_readonly_user_password}
        rabbit:
          host: {get_input: controller_virtual_ip}
          username: {get_param: RabbitUserName}
          password: {get_param: RabbitPassword}
        glance:
          host: {get_input: controller_virtual_ip}
          port: {get_param: GlancePort}
outputs:
  hosts_entry:
    value:
      str_replace:
        template: "IP HOST"
        params:
          IP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
          HOST: {get_attr: [BlockStorage, name]}
  internal_api_ip_address:
    description: IP address of the server in the internal_api network
    value: {get_attr: [InternalApiPort, ip_address]}
  storage_ip_address:
    description: IP address of the server in the storage network
    value: {get_attr: [StoragePort, ip_address]}
  storage_mgmt_ip_address:
    description: IP address of the server in the storage_mgmt network
    value: {get_attr: [StorageMgmtPort, ip_address]}
  config_identifier:
    description: identifier which changes if the node configuration may need re-applying
    value: "None - NO_SIGNAL"