heat_template_version: pike

description: >
  OpenStack Swift Ringbuilder

parameters:
  DockerSwiftConfigImage:
    description: The container image to use for the swift config_volume
    type: string
  DockerSwiftRingbuilderConfigImage:
    description: Fake parameter to bypass config_volume yaml validation
    type: string
    default: ''
  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
  SwiftMinPartHours:
    type: number
    default: 1
    description: The minimum time (in hours) before a partition in a ring can be moved following a rebalance.
  SwiftPartPower:
    default: 10
    description: Partition Power to use when building Swift rings
    type: number
  SwiftRingBuild:
    default: true
    description: Whether to manage Swift rings or not
    type: boolean
  SwiftReplicas:
    type: number
    default: 3
    description: How many replicas to use in the swift rings.
  SwiftRawDisks:
    default: {}
    description: 'A hash of additional raw devices to use as Swift backend (eg. {sdb: {}})'
    type: json
  SwiftUseLocalDir:
    default: true
    description: 'Use a local directory for Swift storage services when building rings'
    type: boolean
  SwiftRingGetTempurl:
    default: ''
    description: A temporary Swift URL to download rings from.
    type: string
  SwiftRingPutTempurl:
    default: ''
    description: A temporary Swift URL to upload rings to.
    type: string

resources:

  SwiftRingbuilderBase:
    type: ../../puppet/services/swift-ringbuilder.yaml
    properties:
      EndpointMap: {get_param: EndpointMap}
      ServiceData: {get_param: ServiceData}
      ServiceNetMap: {get_param: ServiceNetMap}
      DefaultPasswords: {get_param: DefaultPasswords}
      RoleName: {get_param: RoleName}
      RoleParameters: {get_param: RoleParameters}

outputs:
  role_data:
    description: Role data for Swift Ringbuilder configuration in containers.
    value:
      service_name: {get_attr: [SwiftRingbuilderBase, role_data, service_name]}
      config_settings:
        map_merge:
          - {get_attr: [SwiftRingbuilderBase, role_data, config_settings]}
          - tripleo::profile::base::swift::ringbuilder:skip_consistency_check: true
      logging_source: {get_attr: [SwiftRingbuilderBase, role_data, logging_source]}
      logging_groups: {get_attr: [SwiftRingbuilderBase, role_data, logging_groups]}
      step_config: &step_config
        get_attr: [SwiftRingbuilderBase, role_data, step_config]
      service_config_settings: {get_attr: [SwiftRingbuilderBase, role_data, service_config_settings]}
      # BEGIN DOCKER SETTINGS
      puppet_config:
        config_volume: 'swift_ringbuilder'
        puppet_tags: exec,fetch_swift_ring_tarball,extract_swift_ring_tarball,ring_object_device,swift::ringbuilder::create,tripleo::profile::base::swift::add_devices,swift::ringbuilder::rebalance,create_swift_ring_tarball,upload_swift_ring_tarball
        step_config: *step_config
        config_image: &swift_ringbuilder_image {get_param: DockerSwiftConfigImage}
      kolla_config: {}
      docker_config:
        step_3:
          swift_copy_rings:
            image: *swift_ringbuilder_image
            user: root
            detach: false
            command:
              # Use bash to run the cp command so that wildcards can be used
              - '/bin/bash'
              - '-c'
              - 'cp -v -a -t /etc/swift /swift_ringbuilder/etc/swift/*.gz /swift_ringbuilder/etc/swift/*.builder /swift_ringbuilder/etc/swift/backups'
            volumes:
              - /var/lib/config-data/puppet-generated/swift/etc/swift:/etc/swift:rw
              - /var/lib/config-data/swift_ringbuilder:/swift_ringbuilder:ro
