From b731e48bf4c4fba3b80edfdd0e058a5241ee1aab Mon Sep 17 00:00:00 2001
From: Dan Prince <dprince@redhat.com>
Date: Thu, 11 Feb 2016 19:41:55 -0500
Subject: [PATCH] Add zaqar::messaging::mongodb

This class is used to enable and configure the mongodb
messaging driver.

Change-Id: I1843aa1506103f92dd3bb8057eca9d2120a5d7b1
---
 manifests/messaging/mongodb.pp               | 96 ++++++++++++++++++++
 spec/classes/zaqar_messaging_mongodb_spec.rb | 63 +++++++++++++
 2 files changed, 159 insertions(+)
 create mode 100644 manifests/messaging/mongodb.pp
 create mode 100644 spec/classes/zaqar_messaging_mongodb_spec.rb

diff --git a/manifests/messaging/mongodb.pp b/manifests/messaging/mongodb.pp
new file mode 100644
index 0000000..9b28400
--- /dev/null
+++ b/manifests/messaging/mongodb.pp
@@ -0,0 +1,96 @@
+# == class: zaqar::messaging::mongodb
+#
+# [*uri*]
+#   Mongodb Connection URI. Required.
+#
+# [*ssl_keyfile*]
+#   The private keyfile used to identify the local connection against
+#   mongod. Default $::os_service_default
+#   Defaults to $::os_service_default.
+#
+# [*ssl_certfile*]
+#   The certificate file used to identify the local connection against
+#   mongod. (string value)
+#   Defaults to $::os_service_default.
+#
+# [*ssl_cert_reqs*]
+#   Specifies whether a certificate is required from the other side of
+#   the connection, and whether it will be validated if provided. It
+#   must be one of the three values ``CERT_NONE``(certificates ignored),
+#   ``CERT_OPTIONAL``(not required, but validated if provided), or
+#   ``CERT_REQUIRED``(required and validated).
+#   Defaults to $::os_service_default.
+#
+# [*ssl_ca_certs*]
+#   The ca_certs file contains a set of concatenated "certification
+#   authority" certificates, which are used to validate certificates
+#   passed from the other end of the connection.
+#   Defaults to $::os_service_default.
+#
+# [*database*]
+#   Database name. (string value). Defaults to $::os_service_default.
+#
+# [*max_attempts*]
+#   Maximum number of times to retry a failed operation. Currently only
+#   used for retrying a message post.
+#   Defaults to $::os_service_default.
+#
+# [*max_retry_sleep*]
+#   Maximum sleep interval between retries (actual sleep time increases
+#   linearly according to number of attempts performed).
+#   Defaults to $::os_service_default.
+#
+# [*max_retry_jitter*]
+#   Maximum jitter interval, to be added to the sleep interval, in order
+#   to decrease probability that parallel requests will retry at the
+#   same instant. (floating point value)
+#   Defaults to $::os_service_default.
+#
+# [*max_reconnect_attempts*]
+#   Maximum number of times to retry an operation that failed due to a
+#   primary node failover. (integer value)
+#   Defaults to $::os_service_default.
+#
+# [*reconnect_sleep*]
+#   Base sleep interval between attempts to reconnect after a primary
+#   node failover. The actual sleep time increases exponentially (power
+#   of 2) each time the operation is retried. (floating point value)
+#   Defaults to $::os_service_default.
+#
+# [*partitions*]
+#   Number of databases across which to partition message data, in order
+#   to reduce writer lock %. DO NOT change this setting after initial
+#   deployment. It MUST remain static.
+#   Defaults to $::os_service_default.
+class zaqar::messaging::mongodb(
+  $uri,
+  $ssl_keyfile            = $::os_service_default,
+  $ssl_certfile           = $::os_service_default,
+  $ssl_cert_reqs          = $::os_service_default,
+  $ssl_ca_certs           = $::os_service_default,
+  $database               = $::os_service_default,
+  $max_attempts           = $::os_service_default,
+  $max_retry_sleep        = $::os_service_default,
+  $max_retry_jitter       = $::os_service_default,
+  $max_reconnect_attempts = $::os_service_default,
+  $reconnect_sleep        = $::os_service_default,
+  $partitions             = $::os_service_default,
+) {
+
+  zaqar_config {
+    'drivers/message_store': value => 'mongodb';
+    'drivers:message_store:mongodb/uri': value => $uri, secret => true;
+    'drivers:message_store:mongodb/ssl_keyfile': value => $ssl_keyfile;
+    'drivers:message_store:mongodb/ssl_certfile': value => $ssl_certfile;
+    'drivers:message_store:mongodb/ssl_cert_reqs': value => $ssl_cert_reqs;
+    'drivers:message_store:mongodb/ssl_ca_certs': value => $ssl_ca_certs;
+    'drivers:message_store:mongodb/database': value => $database;
+    'drivers:message_store:mongodb/max_attempts': value => $max_attempts;
+    'drivers:message_store:mongodb/max_retry_sleep': value => $max_retry_sleep;
+    'drivers:message_store:mongodb/max_retry_jitter': value => $max_retry_jitter;
+    'drivers:message_store:mongodb/max_reconnect_attempts': value => $max_reconnect_attempts;
+    'drivers:message_store:mongodb/reconnect_sleep': value => $reconnect_sleep;
+    'drivers:message_store:mongodb/partitions': value => $partitions;
+  }
+
+}
diff --git a/spec/classes/zaqar_messaging_mongodb_spec.rb b/spec/classes/zaqar_messaging_mongodb_spec.rb
new file mode 100644
index 0000000..e068c8e
--- /dev/null
+++ b/spec/classes/zaqar_messaging_mongodb_spec.rb
@@ -0,0 +1,63 @@
+require 'spec_helper'
+
+describe 'zaqar::messaging::mongodb' do
+
+  let :req_params do
+    {
+      :uri   => 'mongodb://127.0.0.1:27017',
+    }
+  end
+
+  let :facts do
+    { :osfamily => 'RedHat' }
+  end
+
+  describe 'with only required params' do
+    let :params do
+      req_params
+    end
+
+    it 'should config mongo messaging driver' do
+      is_expected.to contain_zaqar_config('drivers/message_store').with(
+       :value => 'mongodb'
+      )
+      is_expected.to contain_zaqar_config('drivers:message_store:mongodb/uri').with(
+       :value => 'mongodb://127.0.0.1:27017'
+      )
+    end
+
+  end
+
+  describe 'with custom values' do
+    let :params do
+      req_params.merge!({
+        :ssl_keyfile  => 'keyfile',
+        :ssl_certfile  => 'certfile',
+        :ssl_cert_reqs  => 'cert_reqs',
+        :ssl_ca_certs  => 'ca_certs',
+        :database  => 'zaqar_db',
+        :max_attempts  => '1',
+        :max_retry_sleep => '2',
+        :max_retry_jitter => '3',
+        :max_reconnect_attempts => '4',
+        :reconnect_sleep => '5',
+        :partitions => '6',
+      })
+    end
+
+    it 'configures custom values' do
+      is_expected.to contain_zaqar_config('drivers:message_store:mongodb/ssl_keyfile').with_value('keyfile')
+      is_expected.to contain_zaqar_config('drivers:message_store:mongodb/ssl_certfile').with_value('certfile')
+      is_expected.to contain_zaqar_config('drivers:message_store:mongodb/ssl_cert_reqs').with_value('cert_reqs')
+      is_expected.to contain_zaqar_config('drivers:message_store:mongodb/ssl_ca_certs').with_value('ca_certs')
+      is_expected.to contain_zaqar_config('drivers:message_store:mongodb/database').with_value('zaqar_db')
+      is_expected.to contain_zaqar_config('drivers:message_store:mongodb/max_attempts').with_value('1')
+      is_expected.to contain_zaqar_config('drivers:message_store:mongodb/max_retry_sleep').with_value('2')
+      is_expected.to contain_zaqar_config('drivers:message_store:mongodb/max_retry_jitter').with_value('3')
+      is_expected.to contain_zaqar_config('drivers:message_store:mongodb/max_reconnect_attempts').with_value('4')
+      is_expected.to contain_zaqar_config('drivers:message_store:mongodb/reconnect_sleep').with_value('5')
+      is_expected.to contain_zaqar_config('drivers:message_store:mongodb/partitions').with_value('6')
+    end
+  end
+
+end