heat_template_version: rocky

description: >
  OpenStack Octavia service configured with Puppet

parameters:
  ContainerOctaviaHousekeepingImage:
    description: image
    type: string
  ContainerOctaviaConfigImage:
    description: The container image to use for the octavia config_volume
    type: string
  OctaviaHousekeepingLoggingSource:
    type: json
    default:
      tag: openstack.octavia.housekeeping
      file: /var/log/containers/octavia/housekeeping.log
  EndpointMap:
    default: {}
    description: Mapping of service endpoint -> protocol. Typically set
                 via parameter_defaults in the resource registry.
    type: json
  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
  OctaviaAmphoraExpiryAge:
    default: 0
    description: The interval in seconds after which an unused Amphora will
                 be considered expired and cleaned up. If left to 0, the
                 configuration will not be set and the system will use
                 the service defaults.
    type: number
  MonitoringSubscriptionOctaviaHousekeeping:
    default: 'overcloud-octavia-housekeeping'
    type: string

conditions:
  amphora_expiry_is_zero: {equals: [{get_param: OctaviaAmphoraExpiryAge}, 0]}

resources:

  ContainersCommon:
    type: ../containers-common.yaml

  MySQLClient:
    type: ../database/mysql-client.yaml

  OctaviaBase:
    type: ./octavia-base.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 the Octavia housekeeping role.
    value:
      service_name: octavia_housekeeping
      monitoring_subscription: {get_param: MonitoringSubscriptionOctaviaHousekeeping}
      config_settings:
        map_merge:
          - get_attr: [OctaviaBase, role_data, config_settings]
          -
            if:
            - amphora_expiry_is_zero
            - {}
            - octavia::housekeeping::amphora_expiry_age: {get_param: OctaviaAmphoraExpiryAge}
      service_config_settings:
        rsyslog:
          tripleo_logging_sources_octavia_housekeeping:
            - {get_param: OctaviaHousekeepingLoggingSource}
      # BEGIN DOCKER SETTINGS #
      puppet_config:
        config_volume: octavia
        puppet_tags: octavia_config
        step_config:
          list_join:
            - "\n"
            - - "include tripleo::profile::base::octavia::housekeeping"
              - {get_attr: [MySQLClient, role_data, step_config]}
        config_image: {get_param: ContainerOctaviaConfigImage}
      kolla_config:
        /var/lib/kolla/config_files/octavia_housekeeping.json:
          command: /usr/bin/octavia-housekeeping --config-file /usr/share/octavia/octavia-dist.conf --config-file /etc/octavia/octavia.conf --config-file /etc/octavia/post-deploy.conf --log-file /var/log/octavia/housekeeping.log --config-dir /etc/octavia/conf.d/octavia-housekeeping
          config_files:
            - source: "/var/lib/kolla/config_files/src/*"
              dest: "/"
              merge: true
              preserve_properties: true
          permissions:
            - path: /var/log/octavia
              owner: octavia:octavia
              recurse: true
      docker_config:
        step_2:
          octavia_housekeeping_init_dirs:
            start_order: 0
            image: &octavia_housekeeping_image {get_param: ContainerOctaviaHousekeepingImage}
            user: root
            net: none
            volumes:
              # NOTE(mandre) we need extra dir for the service in /etc/octavia/conf.d
              # It is normally created as part of the RPM install, but it is
              # missing here because we use the same config_volume for all
              # octavia services, hence the same container image to generate
              # configuration.
              - /var/lib/config-data/puppet-generated/octavia/etc/octavia:/etc/octavia/:z
            command: ['/bin/bash', '-c', 'mkdir -p /etc/octavia/conf.d/octavia-housekeeping; chown -R octavia:octavia /etc/octavia/conf.d/octavia-housekeeping']
        step_5:
          octavia_housekeeping:
            start_order: 2
            image: *octavia_housekeeping_image
            net: host
            privileged: false
            restart: always
            healthcheck:
              test: /openstack/healthcheck
            volumes:
              list_concat:
                - {get_attr: [ContainersCommon, volumes]}
                -
                  - /var/lib/kolla/config_files/octavia_housekeeping.json:/var/lib/kolla/config_files/config.json:ro
                  - /var/lib/config-data/puppet-generated/octavia/:/var/lib/kolla/config_files/src:ro
                  - /var/log/containers/octavia:/var/log/octavia:z
            environment:
              KOLLA_CONFIG_STRATEGY: COPY_ALWAYS
      host_prep_tasks:
        - name: create persistent directories
          file:
            path: "{{ item.path }}"
            state: directory
            setype: "{{ item.setype }}"
          with_items:
            - { 'path': /var/log/containers/octavia, 'setype': svirt_sandbox_file_t, 'mode': '0750' }
      upgrade_tasks: []
      post_upgrade_tasks:
        - name: remove directory /etc/octavia/conf.d/common
          when: step|int == 5
          file:
            path: "/var/lib/config-data/puppet-generated/octavia/etc/octavia/conf.d/common"
            state: absent
      post_update_tasks:
        - name: remove directory /etc/octavia/conf.d/common
          when: step|int == 5
          file:
            path: "/var/lib/config-data/puppet-generated/octavia/etc/octavia/conf.d/common"
            state: absent
