--- /dev/null
+# Adds a set of custom limits to the service
+#
+# @api public
+#
+# @see systemd.exec(5)
+#
+# @attr name [Pattern['^.+\.(service|socket|mount|swap)$']]
+# The name of the service that you will be modifying
+#
+# @param $ensure
+# Whether to drop a file or remove it
+#
+# @param path
+# The path to the main systemd settings directory
+#
+# @param limits
+# A Hash of service limits matching the settings in ``systemd.exec(5)``
+#
+# * Mutually exclusive with ``$source``
+#
+# @param source
+# A ``File`` resource compatible ``source``
+#
+# * Mutually exclusive with ``$limits``
+#
+# @param restart_service
+# Restart the managed service after setting the limits
+#
+define systemd::service_limits(
+ Enum['present', 'absent', 'file'] $ensure = 'present',
+ Stdlib::Absolutepath $path = '/etc/systemd/system',
+ Optional[Systemd::ServiceLimits] $limits = undef,
+ Optional[String] $source = undef,
+ Boolean $restart_service = true
+) {
+
+ include systemd
+
+ if $name !~ Pattern['^.+\.(service|socket|mount|swap)$'] {
+ fail('$name must match Pattern["^.+\.(service|socket|mount|swap)$"]')
+ }
+
+ if $limits and !empty($limits) {
+ $_content = template("${module_name}/limits.erb")
+ }
+ else {
+ $_content = undef
+ }
+
+ if $ensure != 'absent' {
+ if ($limits and !empty($limits)) and $source {
+ fail('You may not supply both limits and source parameters to systemd::service_limits')
+ }
+ elsif ($limits == undef or empty($limits)) and ($source == undef) {
+ fail('You must supply either the limits or source parameter to systemd::service_limits')
+ }
+ }
+
+ systemd::dropin_file { "${name}-90-limits.conf":
+ ensure => $ensure,
+ unit => $name,
+ filename => '90-limits.conf',
+ path => $path,
+ content => $_content,
+ source => $source,
+ }
+
+ if $restart_service {
+ exec { "restart ${name} because limits":
+ command => "systemctl restart ${name}",
+ path => $::path,
+ refreshonly => true,
+ subscribe => File["${path}/${name}.d/90-limits.conf"],
+ require => Class['systemd::systemctl::daemon_reload'],
+ }
+ }
+}