diff --git a/REFERENCE.md b/REFERENCE.md
index cf18b5d8..46e39010 100644
--- a/REFERENCE.md
+++ b/REFERENCE.md
@@ -18,6 +18,8 @@
haproxy.cfg file on an haproxy load balancer.
* [`haproxy::balancermember`](#haproxy--balancermember): This type will setup a balancer member inside a listening service
configuration block in /etc/haproxy/haproxy.cfg on the load balancer.
+* [`haproxy::cache`](#haproxy--cache): Manage a HAProxy cache resource as documented in
+https://www.haproxy.com/documentation/haproxy-configuration-manual/latest/#6
* [`haproxy::defaults`](#haproxy--defaults): This type will setup a additional defaults configuration block inside the
haproxy.cfg file on an haproxy load balancer.
* [`haproxy::frontend`](#haproxy--frontend): This type will setup a frontend service configuration block inside
@@ -708,6 +710,79 @@ Optional. Defaults to 'server'
Default value: `'server'`
+### `haproxy::cache`
+
+Manage a HAProxy cache resource as documented in
+https://www.haproxy.com/documentation/haproxy-configuration-manual/latest/#6
+
+#### Parameters
+
+The following parameters are available in the `haproxy::cache` defined type:
+
+* [`name`](#-haproxy--cache--name)
+* [`total_max_size`](#-haproxy--cache--total_max_size)
+* [`max_object_size`](#-haproxy--cache--max_object_size)
+* [`max_age`](#-haproxy--cache--max_age)
+* [`process_vary`](#-haproxy--cache--process_vary)
+* [`max_secondary_entries`](#-haproxy--cache--max_secondary_entries)
+* [`instance`](#-haproxy--cache--instance)
+
+##### `name`
+
+Name of the cache.
+
+##### `total_max_size`
+
+Data type: `Integer[1,4095]`
+
+Size of cache in megabytes. Maximum value is 4095.
+
+##### `max_object_size`
+
+Data type: `Optional[Integer]`
+
+Maximum size of object to be cached. Must not be bigger than half of total_max_size.
+If not set, it equals to 1/256th of total cache size.
+
+Default value: `undef`
+
+##### `max_age`
+
+Data type: `Integer`
+
+Maximum expiration time in seconds. The expiration is set as the lowest
+value between the s-maxage or max-age (in this order) directive in the
+Cache-Control response header and this value.
+
+Default value: `60`
+
+##### `process_vary`
+
+Data type: `Optional[Enum['on', 'off']]`
+
+Available since HAProxy 2.4. Turn on or off the processing of the Vary header
+in a response. For more info, check https://www.haproxy.com/documentation/haproxy-configuration-manual/latest/#6.2.1-process-vary
+
+Default value: `undef`
+
+##### `max_secondary_entries`
+
+Data type: `Optional[Integer[1]]`
+
+Available since HAProxy 2.4. Define the maximum number of simultaneous secondary
+entries with the same primary key in the cache. This needs the vary support to
+be enabled. Its default value is 10 and should be passed a strictly positive integer.
+
+Default value: `undef`
+
+##### `instance`
+
+Data type: `String`
+
+Optional. Defaults to 'haproxy'.
+
+Default value: `'haproxy'`
+
### `haproxy::defaults`
This type will setup a additional defaults configuration block inside the
diff --git a/manifests/cache.pp b/manifests/cache.pp
new file mode 100644
index 00000000..8b00975f
--- /dev/null
+++ b/manifests/cache.pp
@@ -0,0 +1,64 @@
+# @summary
+# Manage a HAProxy cache resource as documented in
+# https://www.haproxy.com/documentation/haproxy-configuration-manual/latest/#6
+#
+# @param name
+# Name of the cache.
+#
+# @param total_max_size
+# Size of cache in megabytes. Maximum value is 4095.
+#
+# @param max_object_size
+# Maximum size of object to be cached. Must not be bigger than half of total_max_size.
+# If not set, it equals to 1/256th of total cache size.
+#
+# @param max_age
+# Maximum expiration time in seconds. The expiration is set as the lowest
+# value between the s-maxage or max-age (in this order) directive in the
+# Cache-Control response header and this value.
+#
+# @param process_vary
+# Available since HAProxy 2.4. Turn on or off the processing of the Vary header
+# in a response. For more info, check https://www.haproxy.com/documentation/haproxy-configuration-manual/latest/#6.2.1-process-vary
+#
+# @param max_secondary_entries
+# Available since HAProxy 2.4. Define the maximum number of simultaneous secondary
+# entries with the same primary key in the cache. This needs the vary support to
+# be enabled. Its default value is 10 and should be passed a strictly positive integer.
+#
+# @param instance
+# Optional. Defaults to 'haproxy'.
+#
+define haproxy::cache (
+ Integer[1,4095] $total_max_size,
+ Optional[Integer] $max_object_size = undef,
+ Integer $max_age = 60,
+ Optional[Enum['on', 'off']] $process_vary = undef,
+ Optional[Integer[1]] $max_secondary_entries = undef,
+ String $instance = 'haproxy',
+) {
+ include haproxy::params
+ if $instance == 'haproxy' {
+ $instance_name = 'haproxy'
+ $config_file = $haproxy::config_file
+ } else {
+ $instance_name = "haproxy-${instance}"
+ $config_file = inline_template($haproxy::params::config_file_tmpl)
+ }
+
+ $parameters = {
+ 'name' => $name,
+ 'total_max_size' => $total_max_size,
+ 'max_object_size' => $max_object_size,
+ 'max_age' => $max_age,
+ 'process_vary' => $process_vary,
+ 'max_secondary_entries' => $max_secondary_entries,
+ }
+
+ # Templates uses $ipaddresses, $server_name, $ports, $option
+ concat::fragment { "${instance_name}-cache-${name}":
+ order => "30-cache-${name}",
+ target => $config_file,
+ content => epp('haproxy/haproxy_cache.epp', $parameters),
+ }
+}
diff --git a/spec/defines/cache_spec.rb b/spec/defines/cache_spec.rb
new file mode 100644
index 00000000..237a160c
--- /dev/null
+++ b/spec/defines/cache_spec.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe 'haproxy::cache' do
+ let :pre_condition do
+ 'class{"haproxy":
+ config_file => "/tmp/haproxy.cfg"
+ }
+ '
+ end
+ let(:title) { 'dero' }
+ let(:facts) do
+ {
+ networking: {
+ ip: '1.1.1.1',
+ hostname: 'dero'
+ },
+ concat_basedir: '/foo',
+ os: {
+ family: 'RedHat'
+ }
+ }
+ end
+
+ context 'with a single cache entry' do
+ let(:params) do
+ {
+ total_max_size: 1
+ }
+ end
+
+ it {
+ is_expected.to contain_concat__fragment('haproxy-cache-dero').with(
+ 'order' => '30-cache-dero',
+ 'target' => '/tmp/haproxy.cfg',
+ 'content' => "\ncache dero\n total-max-size 1\n max-age 60\n",
+ )
+ }
+ end
+end
diff --git a/templates/haproxy_cache.epp b/templates/haproxy_cache.epp
new file mode 100644
index 00000000..b4c9f4c3
--- /dev/null
+++ b/templates/haproxy_cache.epp
@@ -0,0 +1,13 @@
+
+cache <%= $name %>
+ total-max-size <%= $total_max_size %>
+<% if $max_object_size { -%>
+ max-object-size <%= $max_object_size %>
+<% } -%>
+ max-age <%= $max_age %>
+<% if $process_vary { -%>
+ process-vary <%= $process_vary %>
+<% } -%>
+<% if $max_secondary_entries { -%>
+ max-secondary-entries <%= $max_secondary_entries %>
+<% } -%>