# == Define Resource Type: haproxy::balancermember
#
# This type will setup a balancer member inside a listening service
#  configuration block in /etc/haproxy/haproxy.cfg on the load balancer.
#  currently it only has the ability to specify the instance name,
#  ip address, port, and whether or not it is a backup. More features
#  can be added as needed. The best way to implement this is to export
#  this resource for all haproxy balancer member servers, and then collect
#  them on the main haproxy load balancer.
#
# === Requirement/Dependencies:
#
# Currently requires the ripienaar/concat module on the Puppet Forge and
#  uses storeconfigs on the Puppet Master to export/collect resources
#  from all balancer members.
#
# === Parameters
#
# [*name*]
#   The title of the resource is arbitrary and only utilized in the concat
#    fragment name.
#
# [*listening_service*]
#    The haproxy service's instance name (or, the title of the
#     haproxy::listen resource). This must match up with a declared
#     haproxy::listen resource.
#
# [*ports*]
#     An array or commas-separated list of ports for which the balancer member
#     will accept connections from the load balancer. Note that cookie values
#     aren't yet supported, but shouldn't be difficult to add to the
#     configuration. If you use an array in server_names and ipaddresses, the
#     same port is used for all balancermembers.
#
# [*server_names*]
#     The name of the balancer member server as known to haproxy in the
#      listening service's configuration block. This defaults to the
#      hostname. Can be an array of the same length as ipaddresses,
#      in which case a balancermember is created for each pair of
#      server_names and ipaddresses (in lockstep).
#
# [*ipaddresses*]
#      The ip address used to contact the balancer member server.
#      Can be an array, see documentation to server_names.
#
# [*options*]
#      An array of options to be specified after the server declaration
#       in the listening service's configuration block.
#
#
# === Examples
#
#  Exporting the resource for a balancer member:
#
#  @@haproxy::balancermember { 'haproxy':
#    listening_service => 'puppet00',
#    ports             => '8140',
#    server_names      => $::hostname,
#    ipaddresses       => $::ipaddress,
#    options           => 'check',
#  }
#
#
#  Collecting the resource on a load balancer
#
#  Haproxy::Balancermember <<| listening_service == 'puppet00' |>>
#
#  Creating the resource for multiple balancer members at once
#  (for single-pass installation of haproxy without requiring a first
#  pass to export the resources if you know the members in advance):
# 
#  haproxy::balancermember { 'haproxy':
#    listening_service => 'puppet00',
#    ports             => '8140',
#    server_names      => ['server01', 'server02'],
#    ipaddresses       => ['192.168.56.200', '192.168.56.201'],
#    options           => 'check',
#  }
#  
#  (this resource can be declared anywhere)
#
define haproxy::balancermember (
  $listening_service,
  $ports,
  $server_names = $::hostname,
  $ipaddresses  = $::ipaddress,
  $options      = ''
) {
  # Template uses $ipaddresses, $server_name, $ports, $option
  concat::fragment { "${listening_service}_balancermember_${name}":
    order   => "20-${listening_service}-${name}",
    target  => '/etc/haproxy/haproxy.cfg',
    content => template('haproxy/haproxy_balancermember.erb'),
  }
}