heat_template_version: pike

description: >
  Ceph Monitor service.

parameters:
  ServiceData:
    default: {}
    description: Dictionary packing service data
    type: json
  ServiceNetMap:
    default: {}
    description: Mapping of service_name -> network name. Typically set
                 via parameter_defaults in the resource registry.  This
                 mapping overrides those in ServiceNetMapDefaults.
    type: json
  DefaultPasswords:
    default: {}
    type: json
  RoleName:
    default: ''
    description: Role name on which the service is applied
    type: string
  RoleParameters:
    default: {}
    description: Parameters specific to the role
    type: json
  EndpointMap:
    default: {}
    description: Mapping of service endpoint -> protocol. Typically set
                 via parameter_defaults in the resource registry.
    type: json
  CephIPv6:
    default: False
    type: boolean
  CephMonKey:
    description: The Ceph monitors key. Can be created with ceph-authtool --gen-print-key.
    type: string
    hidden: true
  CinderRbdPoolName:
    default: volumes
    type: string
  ManilaCephFSDataPoolName:
    default: manila_data
    type: string
  ManilaCephFSMetadataPoolName:
    default: manila_metadata
    type: string
  CinderBackupRbdPoolName:
    default: backups
    type: string
  GlanceRbdPoolName:
    default: images
    type: string
  GnocchiRbdPoolName:
    default: metrics
    type: string
  NovaRbdPoolName:
    default: vms
    type: string
  CephPools:
    description: >
      It can be used to override settings for one of the predefined pools, or to create
      additional ones. Example:
      {
        "volumes": {
          "size": 5,
          "pg_num": 128,
          "pgp_num": 128
         }
      }
    default: {}
    type: json
  CephValidationRetries:
    type: number
    default: 40
    description: Number of retry attempts for Ceph validation
  CephValidationDelay:
    type: number
    default: 30
    description: Interval (in seconds) in between validation checks
  MonitoringSubscriptionCephMon:
    default: 'overcloud-ceph-mon'
    type: string
  CephPoolDefaultSize:
    description: default minimum replication for RBD copies
    type: number
    default: 3

resources:
  CephBase:
    type: ./ceph-base.yaml
    properties:
      ServiceData: {get_param: ServiceData}
      ServiceNetMap: {get_param: ServiceNetMap}
      DefaultPasswords: {get_param: DefaultPasswords}
      EndpointMap: {get_param: EndpointMap}
      RoleName: {get_param: RoleName}
      RoleParameters: {get_param: RoleParameters}

outputs:
  role_data:
    description: Role data for the Ceph Monitor service.
    value:
      service_name: ceph_mon
      monitoring_subscription: {get_param: MonitoringSubscriptionCephMon}
      config_settings:
        map_merge:
          - get_attr: [CephBase, role_data, config_settings]
          - ceph::profile::params::ms_bind_ipv6: {get_param: CephIPv6}
            ceph::profile::params::mon_key: {get_param: CephMonKey}
            ceph::profile::params::osd_pool_default_pg_num: 128
            ceph::profile::params::osd_pool_default_pgp_num: 128
            ceph::profile::params::osd_pool_default_size: {get_param: CephPoolDefaultSize}
            # repeat returns items in a list, so we need to map_merge twice
            tripleo::profile::base::ceph::mon::ceph_pools:
              map_merge:
                - map_merge:
                    repeat:
                      for_each:
                        <%pool%>:
                          - {get_param: CinderRbdPoolName}
                          - {get_param: ManilaCephFSDataPoolName}
                          - {get_param: ManilaCephFSMetadataPoolName}
                          - {get_param: CinderBackupRbdPoolName}
                          - {get_param: NovaRbdPoolName}
                          - {get_param: GlanceRbdPoolName}
                          - {get_param: GnocchiRbdPoolName}
                      template:
                        <%pool%>:
                          pg_num: "%{hiera('ceph::profile::params::osd_pool_default_pg_num')}"
                          pgp_num: "%{hiera('ceph::profile::params::osd_pool_default_pgp_num')}"
                          size: "%{hiera('ceph::profile::params::osd_pool_default_size')}"
                - {get_param: CephPools}
            tripleo.ceph_mon.firewall_rules:
              '110 ceph_mon':
                dport:
                  - 6789
      service_config_settings:
        get_attr: [CephBase, role_data, service_config_settings]
      step_config: |
        include ::tripleo::profile::base::ceph::mon
      upgrade_batch_tasks:
        # Note we perform these tasks in list order, but they are all step0 so
        # we can perform a rolling upgrade of all mon nodes in step0, then a
        # rolling upgrade of all osd nodes in step1
        - name: Check status
          tags: step0,validation
          shell: ceph health | egrep -sq "HEALTH_OK|HEALTH_WARN"
        - name: Stop CephMon
          tags: step0
          service:
            name: ceph-mon@{{ ansible_hostname }}
            state: stopped
        - name: Update Ceph packages
          tags: step0
          yum:
            name: ceph-mon
            state: latest
        - name: Start CephMon
          tags: step0
          service:
            name: ceph-mon@{{ ansible_hostname }}
            state: started
        # ceph-ansible
        # https://github.com/ceph/ceph-ansible/blob/master/infrastructure-playbooks/rolling_update.yml#L149-L157
        - name: Wait for the monitor to join the quorum...
          tags: step0,ceph_quorum_validation
          shell: |
            ceph -s | grep monmap | sed 's/.*quorum//' | egrep -sq {{ ansible_hostname }}
          register: ceph_quorum_nodecheck
          until: ceph_quorum_nodecheck.rc == 0
          retries: {get_param: CephValidationRetries}
          delay: {get_param: CephValidationDelay}
        - name: ceph osd crush tunables default
          tags: step0
          shell: ceph osd crush tunables default
