heat_template_version: 2015-04-30
description: 'Common Ceph Storage Configuration'
parameters:
  Image:
    type: string
    default: overcloud-ceph-storage
  KeyName:
    default: default
    description: Name of an existing EC2 KeyPair to enable SSH access to the instances
    type: string
  Flavor:
    default: baremetal
    description: Flavor for block storage nodes to request when deploying.
    type: string
  CephClusterFSID:
    default: ''
    type: string
    description: The Ceph cluster FSID. Must be a UUID.
  CephMonKey:
    default: ''
    description: The Ceph monitors key. Can be created with ceph-authtool --gen-print-key.
    type: string
    hidden: true
  CephAdminKey:
    default: ''
    description: The Ceph admin client key. Can be created with ceph-authtool --gen-print-key.
    type: string
    hidden: true
  CephMonitors:
    default: ''
    description: The list of ip/names to use as Ceph monitors
    type: json
  ServiceNetMap:
    default: {}
    description: Mapping of service_name -> network name. Typically set
                 via parameter_defaults in the resource registry.
    type: json
  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
  ExtraConfig:
    default: {}
    description: |
      Additional configuration to inject into the cluster. Note
      that CephStorageExtraConfig takes precedence over ExtraConfig.
    type: json
  CephStorageExtraConfig:
    default: {}
    description: |
      Role specific additional configuration to inject into the cluster.
    type: json


resources:
  CephStorage:
    type: OS::Nova::Server
    properties:
      image:
        {get_param: Image}
      flavor: {get_param: OvercloudCephStorageFlavor}
      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

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

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

  NetworkConfig:
    type: OS::TripleO::CephStorage::Net::SoftwareConfig
    properties:
      ControlPlaneIp: {get_attr: [CephStorage, networks, ctlplane, 0]}
      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: CephStorage}

  CephStorageDeployment:
    type: OS::Heat::StructuredDeployment
    properties:
      server: {get_resource: CephStorage}
      config: {get_resource: CephStorageConfig}
      signal_transport: NO_SIGNAL
  CephStorageConfig:
    type: OS::Heat::StructuredConfig
    properties:
      group: os-apply-config
      config:
        ceph:
          fsid: {get_param: CephClusterFSID}
          keyrings:
            admin:
              key: {get_param: CephAdminKey}
          mon_nodes: {get_param: CephMonitors}
  ControllerCephDeployment:
    type: OS::Heat::StructuredDeployment
    properties:
      server: {get_resource: Controller}
      config: {get_resource: ControllerCephConfig}
      signal_transport: NO_SIGNAL
  ControllerCephConfig:
    type: OS::Heat::StructuredConfig
    properties:
      group: os-apply-config
      config:
        cinder:
          include_ceph_backend: true
        ceph:
          fsid: {get_param: CephClusterFSID}
          keyrings:
            mon:
              key: {get_param: CephMonKey}
            admin:
              key: {get_param: CephAdminKey}
          mon_nodes: {get_param: CephMonitors}
  NovaComputeCephDeployment:
    depends_on: [ControllerCephDeployment]
    type: OS::Heat::StructuredDeployment
    properties:
      server: {get_resource: NovaCompute}
      config: {get_resource: NovaComputeCephConfig}
      signal_transport: NO_SIGNAL
  NovaComputeCephConfig:
    type: OS::Heat::StructuredConfig
    properties:
      group: os-apply-config
      config:
        ceph:
          fsid: {get_param: CephClusterFSID}
          keyrings:
            admin:
              key: {get_param: CephAdminKey}
          mon_nodes: {get_param: CephMonitors}
outputs:
  hosts_entry:
    value:
      str_replace:
        template: "IP HOST"
        params:
          IP: {get_attr: [CephStorage, networks, ctlplane, 0]}
          HOST: {get_attr: [CephStorage, name]}
  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"