From c710b8193f9262b58b83a1ac5da19e768d1fa4c4 Mon Sep 17 00:00:00 2001
From: Jonathan Gazeley <jonathan.gazeley@bristol.ac.uk>
Date: Fri, 15 Jul 2016 10:21:01 +0100
Subject: [PATCH] Provide support for virtual modules for load-balancing and
 failover config

---
 README.md                    | 24 +++++++++++++++++++++++
 manifests/virtual_module.pp  | 38 ++++++++++++++++++++++++++++++++++++
 templates/virtual_module.erb |  5 +++++
 3 files changed, 67 insertions(+)
 create mode 100644 manifests/virtual_module.pp
 create mode 100644 templates/virtual_module.erb

diff --git a/README.md b/README.md
index 426e8f8..d4e99e3 100644
--- a/README.md
+++ b/README.md
@@ -28,6 +28,7 @@
        * [`freeradius::sql`](#freeradiussql)
        * [`freeradius::statusclient`](#freeradiusstatusclient)
        * [`freeradius::template`](#freeradiustemplate)
+       * [`freeradius::virtual_module`](#freeradiusvirtual_module)
 4. [Limitations - OS compatibility, etc.](#limitations)
 5. [Development - Guide for contributing to the module](#development)
 6. [Release Notes](#release-notes)
@@ -758,6 +759,29 @@ Provide source to a file with the template item. Specify only one of `source` or
 
 Provide content of template item. Specify only one of `source` or `content`.
 
+#### `freeradius::virtual_module`
+
+Define a virtual module which consists of one or more other modules, for failover or
+load-balancing purposes.
+
+##### `name`
+##### `submodules`
+##### `type`
+
+```puppet
+freeradius::virtual_module { 'myldap':
+  submodules => ['ldap1', 'ldap2'],
+  type       => 'redundant-load-balance',
+}
+```
+yields
+```
+redundant-load-balance myldap {
+	ldap1
+	ldap2
+}
+```
+
 ## Limitations
 
 This module is targeted at FreeRADIUS 3.x running on CentOS 7. It will not work on
diff --git a/manifests/virtual_module.pp b/manifests/virtual_module.pp
new file mode 100644
index 0000000..1006f43
--- /dev/null
+++ b/manifests/virtual_module.pp
@@ -0,0 +1,38 @@
+# Define a virtual module, made up of others
+define freeradius::virtual_module (
+  $submodules,
+  $ensure = present,
+  $type = 'redundant-load-balance',
+) {
+  $fr_package  = $::freeradius::params::fr_package
+  $fr_service  = $::freeradius::params::fr_service
+  $fr_basepath = $::freeradius::params::fr_basepath
+  $fr_group    = $::freeradius::params::fr_group
+
+  # Valid types of virtual module from
+  # http://wiki.freeradius.org/config/load-balancing
+  # http://wiki.freeradius.org/config/Fail-over#virtual-modules
+  validate_re($type, [
+    '^redundant$',
+    '^load-balance$',
+    '^redundant-load-balance$',
+    '^group$',
+  ])
+
+  # Make sure $submodules is a non-zero array
+  $submodules = any2array($submodules)
+  validate_array($submodules)
+  if count($submodules) < 1 {
+    fail('Must specify at least one $submodule')
+  }
+
+  file { "${fr_basepath}/instantiate/${name}":
+    ensure  => $ensure,
+    mode    => '0640',
+    owner   => 'root',
+    group   => $fr_group,
+    content => template('freeradius/virtual_module.erb'),
+    require => [Package[$fr_package], Group[$fr_group]],
+    notify  => Service[$fr_service],
+  }
+}
diff --git a/templates/virtual_module.erb b/templates/virtual_module.erb
new file mode 100644
index 0000000..1b21227
--- /dev/null
+++ b/templates/virtual_module.erb
@@ -0,0 +1,5 @@
+<%= @type %> <%= @name %> {
+<% @submodules.each do |submod| -%>
+	<%= submod %>
+<% end -%>
+}
-- 
GitLab