From 02d32f4a0e46fbaf4873ed406cff04cc14f83e7f Mon Sep 17 00:00:00 2001
From: Armin Pech <a.pech@babiel.com>
Date: Thu, 1 Nov 2018 16:45:28 +0100
Subject: [PATCH 1/6] server: support arbiter node config introduced by PR#182

---
 README.md                   |  7 ++++++-
 manifests/server.pp         |  6 ++++--
 spec/classes/server_spec.rb | 30 ++++++++++++++++++++++++++++++
 3 files changed, 40 insertions(+), 3 deletions(-)

diff --git a/README.md b/README.md
index d9ef22cbf..0e2727798 100644
--- a/README.md
+++ b/README.md
@@ -418,6 +418,11 @@ set name as an argument to this set. All hosts must have the same set name.
 An array of member hosts for the replica set.
 Mutually exclusive with `replset_config` param.
 
+##### `replset_arbiter`
+A string to identify an arbiter instance for the replica set.
+The arbiter node must also appear in `replset_members`.
+Mutually exclusive with `replset_config` param.
+
 ##### `replset_config`
 A hash that is used to configure the replica set.
 Mutually exclusive with `replset_members` param.
@@ -425,7 +430,7 @@ Mutually exclusive with `replset_members` param.
 ```puppet
 class mongodb::server {
   replset        => 'rsmain',
-  replset_config => { 'rsmain' => { ensure  => present, settings => { heartbeatTimeoutSecs => 15, getLastErrorModes => { ttmode => { dc => 1 } } }, members => [{'host'=>'host1:27017', 'tags':{ 'dc' : 'east'}}, { 'host' => 'host2:27017'}, 'host3:27017']  }  }
+  replset_config => { 'rsmain' => { ensure  => present, settings => { heartbeatTimeoutSecs => 15, getLastErrorModes => { ttmode => { dc => 1 } } }, members => [{'host'=>'host1:27017', 'tags':{ 'dc' : 'east'}}, { 'host' => 'host2:27017'}, 'host3:27017'] }, arbiter => ['host3:27017'] }
 
 }
 ```
diff --git a/manifests/server.pp b/manifests/server.pp
index 007f52f76..bb41fbe06 100644
--- a/manifests/server.pp
+++ b/manifests/server.pp
@@ -53,6 +53,7 @@
   Optional[String] $replset                             = undef,
   Optional[Hash] $replset_config                        = undef,
   Optional[Array] $replset_members                      = undef,
+  Optional[String] $replset_arbiter                     = undef,
   Optional[Boolean] $configsvr                          = undef,
   Optional[Boolean] $shardsvr                           = undef,
   Optional[Boolean] $rest                               = undef,
@@ -113,8 +114,8 @@
   # Set-up replicasets
   if $replset {
     # Check that we've got either a members array or a replset_config hash
-    if $replset_members and $replset_config {
-      fail('You can provide either replset_members or replset_config, not both.')
+    if ( $replset_members or $replset_arbiter ) and $replset_config {
+     fail('You can provide either replset_members incl. replset_arbiter or replset_config, not both.')
     } elsif !$replset_members and !$replset_config {
       # No members or config provided. Warn about it.
       warning('Replset specified, but no replset_members or replset_config provided.')
@@ -129,6 +130,7 @@
           "${replset}" => {
             'ensure'   => 'present',
             'members'  => $replset_members,
+            'arbiter'  => $replset_arbiter,
           },
         }
       }
diff --git a/spec/classes/server_spec.rb b/spec/classes/server_spec.rb
index fe0e50072..41fa9e1e7 100644
--- a/spec/classes/server_spec.rb
+++ b/spec/classes/server_spec.rb
@@ -381,6 +381,36 @@
 
           it { is_expected.to contain_class('mongodb::replset').with_sets(rsConf) }
         end
+
+        describe 'should setup using replset_members with replset_arbiter' do
+          let(:rsConf) do
+            {
+              'rsTest' => {
+                'ensure'  => 'present',
+                'members' => [
+                  'mongo1:27017',
+                  'mongo2:27017',
+                  'mongo3:27017'
+                ],
+                'arbiter' => 'mongo3:27017'
+              }
+            }
+          end
+
+          let(:params) do
+            {
+              replset: 'rsTest',
+              replset_members: [
+                'mongo1:27017',
+                'mongo2:27017',
+                'mongo3:27017'
+              ],
+              'arbiter' => 'mongo3:27017'
+            }
+          end
+
+          it { is_expected.to contain_class('mongodb::replset').with_sets(rsConf) }
+        end
       end
     end
   end

From 32c4cfcacfd4c7b81451c0d4009d11c57fe82cce Mon Sep 17 00:00:00 2001
From: Armin Pech <a.pech@babiel.com>
Date: Thu, 1 Nov 2018 17:00:10 +0100
Subject: [PATCH 2/6] fixup! server: support arbiter node config introduced by
 PR#182

---
 manifests/server.pp | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/manifests/server.pp b/manifests/server.pp
index bb41fbe06..504c91e43 100644
--- a/manifests/server.pp
+++ b/manifests/server.pp
@@ -114,8 +114,10 @@
   # Set-up replicasets
   if $replset {
     # Check that we've got either a members array or a replset_config hash
-    if ( $replset_members or $replset_arbiter ) and $replset_config {
-     fail('You can provide either replset_members incl. replset_arbiter or replset_config, not both.')
+    if $replset_members and $replset_config {
+      fail('You can provide either replset_members or replset_config, not both.')
+    } elsif $replset_arbiter and $replset_config {
+      fail('You can use replset_arbiter only with replset_members not when using replset_config.')
     } elsif !$replset_members and !$replset_config {
       # No members or config provided. Warn about it.
       warning('Replset specified, but no replset_members or replset_config provided.')

From bfe02c951369a4ed1beb4054ee3920daccb4f614 Mon Sep 17 00:00:00 2001
From: Armin Pech <a.pech@babiel.com>
Date: Thu, 1 Nov 2018 17:12:01 +0100
Subject: [PATCH 3/6] fixup server spec when arbiter is not set

---
 spec/classes/server_spec.rb | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/spec/classes/server_spec.rb b/spec/classes/server_spec.rb
index 41fa9e1e7..bd594b9e0 100644
--- a/spec/classes/server_spec.rb
+++ b/spec/classes/server_spec.rb
@@ -363,7 +363,8 @@
                   'mongo1:27017',
                   'mongo2:27017',
                   'mongo3:27017'
-                ]
+                ],
+                'arbiter' => undef,
               }
             }
           end

From a57a1befd5f0e22d0f5898e679d5bf26925e1b72 Mon Sep 17 00:00:00 2001
From: Armin Pech <a.pech@babiel.com>
Date: Thu, 1 Nov 2018 17:21:29 +0100
Subject: [PATCH 4/6] fixup! fixup server spec when arbiter is not set

---
 spec/classes/server_spec.rb | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/spec/classes/server_spec.rb b/spec/classes/server_spec.rb
index bd594b9e0..b06f652ba 100644
--- a/spec/classes/server_spec.rb
+++ b/spec/classes/server_spec.rb
@@ -364,7 +364,7 @@
                   'mongo2:27017',
                   'mongo3:27017'
                 ],
-                'arbiter' => undef,
+                'arbiter' => :undef
               }
             }
           end
@@ -406,7 +406,7 @@
                 'mongo2:27017',
                 'mongo3:27017'
               ],
-              'arbiter' => 'mongo3:27017'
+              'replset_arbiter' => 'mongo3:27017'
             }
           end
 

From 200ba8d0fb81a619c7ed648c824afdcdbf4c8f5f Mon Sep 17 00:00:00 2001
From: Armin Pech <a.pech@babiel.com>
Date: Thu, 1 Nov 2018 17:45:38 +0100
Subject: [PATCH 5/6] fixup! fixup server spec when arbiter is not set

---
 spec/classes/server_spec.rb | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/spec/classes/server_spec.rb b/spec/classes/server_spec.rb
index b06f652ba..37dba11d3 100644
--- a/spec/classes/server_spec.rb
+++ b/spec/classes/server_spec.rb
@@ -376,7 +376,8 @@
                 'mongo1:27017',
                 'mongo2:27017',
                 'mongo3:27017'
-              ]
+              ],
+              'replset_arbiter' => :undef
             }
           end
 

From a32aac9cceb61962e2df095881e2e6e28a923b33 Mon Sep 17 00:00:00 2001
From: Armin Pech <github@arminpech.de>
Date: Fri, 7 Dec 2018 09:20:46 +0100
Subject: [PATCH 6/6] enforce min string length for opt replset_arbiter

see suggestion by @bastelfreak from
https://github.com/voxpupuli/puppet-mongodb/pull/433#discussion_r230343052
---
 manifests/server.pp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/manifests/server.pp b/manifests/server.pp
index 504c91e43..bdf0f02e8 100644
--- a/manifests/server.pp
+++ b/manifests/server.pp
@@ -53,7 +53,7 @@
   Optional[String] $replset                             = undef,
   Optional[Hash] $replset_config                        = undef,
   Optional[Array] $replset_members                      = undef,
-  Optional[String] $replset_arbiter                     = undef,
+  Optional[String[1]] $replset_arbiter                  = undef,
   Optional[Boolean] $configsvr                          = undef,
   Optional[Boolean] $shardsvr                           = undef,
   Optional[Boolean] $rest                               = undef,