Configured core service 24/124/4
authorJosh Farwell <jfarwell@linuxfoundation.org>
Tue, 9 Jun 2015 01:39:55 +0000 (18:39 -0700)
committerJosh Farwell <jfarwell@linuxfoundation.org>
Tue, 9 Jun 2015 15:50:42 +0000 (08:50 -0700)
Added ::core::config, which creates an ini file for the mailman service
from a template and an options hash. Defined the default mailman.cfg file
in params. Refactored the rest of the core submodule to refer to the
service as "core" instead of "mailman" to avoid confusion.

Change-Id: Ide760844152e946020a95e4cd771c1c6e3fc4507
Signed-off-by: Josh Farwell <jfarwell@linuxfoundation.org>
manifests/core.pp
manifests/core/config.pp [new file with mode: 0644]
manifests/core/install.pp
manifests/params.pp
spec/classes/core__config_spec.rb [new file with mode: 0644]
spec/classes/core__install_spec.rb
spec/classes/core_spec.rb
templates/mailman.cfg.erb [new file with mode: 0644]

index 2301e09..ec75976 100644 (file)
 # Copyright 2015 Josh Farwell, unless otherwise noted.
 #
 class mailman3::core (
-  $install_mailman = $mailman3::params::install_mailman,
-  $mailman_version = $mailman3::params::version,
+  $install_core                = $mailman3::params::install_core,
+  $core_version                = $mailman3::params::core_version,
+  $core_manage_database        = $mailman3::params::core_manage_database,
+  $core_manage_firewall        = $mailman3::params::core_manage_firewall,
+  $core_override_options       = {},
 ) inherits mailman3::params {
 
   # Make sure parameters are properly formatted
-  validate_bool($install_mailman)
-  validate_string($mailman_version)
+  validate_bool($install_core)
+  validate_string($core_version)
+  validate_bool($core_manage_database)
+  validate_bool($core_manage_firewall)
+  validate_hash($core_override_options)
+
+  $core_options = merge($mailman3::params::core_default_options, $core_override_options)
 
   anchor { 'mailman3::core::begin': }
   anchor { 'mailman3::core::end': }
 
   class { '::mailman3::core::install':
-    install_mailman => $install_mailman,
-    mailman_version => $mailman_version,
+    install_core => $install_core,
+    core_version => $core_version,
   }
 
-  #class { '::mailman3::core::config':
-    #default_secure_options  => $mailman3::params::default_secure_options,
-    #manage_database         => $manage_database,
-    #manage_firewall         => $manage_firewall,
-    #options                 => $options,
-    #override_secure_options => $override_secure_options,
-  #}
+  class { '::mailman3::core::config':
+    core_manage_database => $core_manage_database,
+    core_manage_firewall => $core_manage_firewall,
+    core_options         => $core_options,
+  }
 
   Anchor['mailman3::core::begin'] ->
     Class['mailman3::core::install'] ->
-    #Class['mailman3::core::config'] ->
+    Class['mailman3::core::config'] ->
   Anchor['mailman3::core::end']
 
 }
diff --git a/manifests/core/config.pp b/manifests/core/config.pp
new file mode 100644 (file)
index 0000000..ee25686
--- /dev/null
@@ -0,0 +1,59 @@
+# == Class: mailman3::core::config
+#
+# Full description of class mailman3 here.
+#
+# === Parameters
+#
+# Document parameters here.
+#
+# [*sample_parameter*]
+#   Explanation of what this parameter affects and what it defaults to.
+#   e.g. "Specify one or more upstream ntp servers as an array."
+#
+# === Variables
+#
+# Here you should define a list of variables that this module would require.
+#
+# [*sample_variable*]
+#   Explanation of how this variable affects the function of this class and if
+#   it has a default. e.g. "The parameter enc_ntp_servers must be set by the
+#   External Node Classifier as a comma separated list of hostnames." (Note,
+#   global variables should be avoided in favor of class parameters as
+#   of Puppet 2.6.)
+#
+# === Examples
+#
+#  class { 'mailman3':
+#    servers => [ 'pool.ntp.org', 'ntp.local.company.com' ],
+#  }
+#
+# === Authors
+#
+# Josh Farwell <jfarwell@linuxfoundation.org>
+#
+# === Copyright
+#
+# Copyright 2015 Josh Farwell, unless otherwise noted.
+#
+class mailman3::core::config (
+  $core_manage_database,
+  $core_manage_firewall,
+  $core_options,
+) {
+  validate_bool($core_manage_database)
+  validate_bool($core_manage_firewall)
+  validate_hash($core_options)
+
+  anchor{ 'mailman3::core::config::begin': }
+  anchor{ 'mailman3::core::config::end': }
+
+  # TODO: generate secure admin password for REST interface
+  file { '/etc/mailman.cfg':
+    ensure  => file,
+    owner   => 'mailman',
+    group   => 'mailman',
+    mode    => '0640',
+    content => template('mailman3/mailman.cfg.erb')
+  }
+
+}
index fadda27..bc49dbb 100644 (file)
 # Copyright 2015 Josh Farwell, unless otherwise noted.
 #
 class mailman3::core::install (
-  $install_mailman,
-  $mailman_version,
+  $install_core,
+  $core_version,
 ) {
-  validate_bool($install_mailman)
-  validate_string($mailman_version)
+  validate_bool($install_core)
+  validate_string($core_version)
 
-  if ($install_mailman) {
+  if ($install_core) {
 
     include mailman3::repo
 
     package { 'mailman3':
-      ensure  => $mailman_version,
+      ensure  => $core_version,
       require => Class['::mailman3::repo']
     }
 
index aa80c05..e97a485 100644 (file)
@@ -40,17 +40,48 @@ class mailman3::params {
   # TODO: Strategy for organizing this manifest
   # TODO: Secure_default_options hash
   # Mangement Booleans
-  $install_mailman = true
+  $core_manage_database = true
+  $core_manage_firewall = true
+  $install_core         = true
+
+  # Shared values
+  $rest_admin_user = 'restadmin'
+  $rest_admin_pass = 'restpass'
 
   # Mailman Core values
-  $mailman_version = 'installed' # could also be 3.0.0
-  $site_owner      = undef
+  $core_layout     = 'fhs'
+  $core_bin_dir    = '/usr/libexec/mailman3'
+  $core_var_dir    = '/var/lib/mailman3'
+  $core_queue_dir  = '/var/spool/mailman3'
+  $core_log_dir    = '/var/log/mailman3'
+  $core_lock_dir   = '/run/lock/mailman3'
+  $core_ext_dir    = '/etc/mailman3.d'
+  $core_pid_file   = '/run/mailman3/master.pid'
+  $core_site_owner = 'root@localhost'
+  $core_version    = 'installed' # could also be 3.0.0
+
+  # Mailman Core default options hashes
+  $core_default_options = {
+    'mailman'      => {
+      'site_owner' => $mailman3::params::core_site_owner,
+      'layout'     => $mailman3::params::core_layout,
+    },
 
-  # default options hash
-  $default_options = {
-    'core'  => {
-      'site_owner'  => $mailman3::params::site_owner_email,
+    'paths.fhs'   => {
+      'bin_dir'   => $mailman3::params::core_bin_dir,
+      'var_dir'   => $mailman3::params::core_var_dir,
+      'queue_dir' => $mailman3::params::core_queue_dir,
+      'log_dir'   => $mailman3::params::core_log_dir,
+      'lock_dir'  => $mailman3::params::core_lock_dir,
+      'ext_dir'   => $mailman3::params::core_ext_dir,
+      'pid_file'  => $mailman3::params::core_pid_file,
     },
+
+    'webservice'    => {
+      'admin_user'  => $mailman3::params::rest_admin_user,
+      'admin_pass'  => $mailman3::params::rest_admin_pass,
+    }
+
   }
 
 }
diff --git a/spec/classes/core__config_spec.rb b/spec/classes/core__config_spec.rb
new file mode 100644 (file)
index 0000000..7f377c1
--- /dev/null
@@ -0,0 +1,88 @@
+require 'spec_helper'
+
+describe 'mailman3::core::config', :type => :class do
+
+  # since we have no default parameters defined,
+  # we should fail if nothing is passed
+  context 'with defaults for all parameters' do
+    let (:params) {{}}
+    it { is_expected.to_not compile }
+  end
+
+  # assumed default parameters from params.pp
+  context 'with assumed default parameters' do
+    let (:params) {
+      {
+        'core_manage_database' => false,
+        'core_manage_firewall' => false,
+        'core_options'              => {
+          'mailman'            => {
+            'site_owner'       => 'root@localhost',
+            'layout'           => 'fhs',
+          },
+          'paths.fhs'          => {
+            'bin_dir'          => '/usr/libexec/mailman3',
+            'var_dir'          => '/var/lib/mailman3',
+            'queue_dir'        => '/var/spool/mailman3',
+            'log_dir'          => '/var/log/mailman3',
+            'lock_dir'         => '/run/lock/mailman3',
+            'ext_dir'          => '/etc/mailman3.d',
+            'pid_file'         => '/run/mailman3/master.pid',
+          },
+          'webservice'         => {
+            'admin_user'       => 'restadmin',
+            'admin_pass'       => 'GENERATE',
+          },
+        },
+      } }
+
+  it { is_expected.to contain_file('/etc/mailman.cfg').with(
+    'ensure'  => 'file',
+    'owner'   => 'mailman',
+    'group'   => 'mailman',
+    'mode'    => '0640',
+    'content' => "; MANAGED BY PUPPET\n\n[mailman]\n  layout = fhs\n  site_owner = root@localhost\n\n[paths.fhs]\n  bin_dir = /usr/libexec/mailman3\n  ext_dir = /etc/mailman3.d\n  lock_dir = /run/lock/mailman3\n  log_dir = /var/log/mailman3\n  pid_file = /run/mailman3/master.pid\n  queue_dir = /var/spool/mailman3\n  var_dir = /var/lib/mailman3\n\n[webservice]\n  admin_pass = GENERATE\n  admin_user = restadmin\n\n",
+  ) }
+
+  end
+
+  context 'with user defined parameters' do
+    let (:params) {
+      {
+        'core_manage_database' => false,
+        'core_manage_firewall' => false,
+        'core_options'              => {
+          'mailman'            => {
+            'site_owner'       => 'admin@example.com',
+            'layout'           => 'fhs',
+          },
+          'paths.fhs'          => {
+            'bin_dir'          => '/foo/libexec/mailman3',
+            'var_dir'          => '/foo/lib/mailman3',
+            'queue_dir'        => '/foo/spool/mailman3',
+            'log_dir'          => '/foo/log/mailman3',
+            'lock_dir'         => '/foo/lock/mailman3',
+            'ext_dir'          => '/foo/mailman3.d',
+            'pid_file'         => '/foo/mailman3/master.pid',
+          },
+          'webservice'         => {
+            'admin_user'       => 'fooadmin',
+            'admin_pass'       => 'bar',
+          },
+          'testsection'        => {
+            'test_value'       => 'foobar',
+          },
+        },
+      } }
+
+  it { is_expected.to contain_file('/etc/mailman.cfg').with(
+    'ensure'  => 'file',
+    'owner'   => 'mailman',
+    'group'   => 'mailman',
+    'mode'    => '0640',
+    'content' => "; MANAGED BY PUPPET\n\n[mailman]\n  layout = fhs\n  site_owner = admin@example.com\n\n[paths.fhs]\n  bin_dir = /foo/libexec/mailman3\n  ext_dir = /foo/mailman3.d\n  lock_dir = /foo/lock/mailman3\n  log_dir = /foo/log/mailman3\n  pid_file = /foo/mailman3/master.pid\n  queue_dir = /foo/spool/mailman3\n  var_dir = /foo/lib/mailman3\n\n[testsection]\n  test_value = foobar\n\n[webservice]\n  admin_pass = bar\n  admin_user = fooadmin\n\n",
+  ) }
+
+  end
+
+end
index d53e186..4bf0735 100644 (file)
@@ -5,8 +5,8 @@ describe 'mailman3::core::install', :type => :class do
   # default parameters from params.pp
   let(:params) {
     {
-      'install_mailman'  => true,
-      'mailman_version'  => 'installed',
+      'install_core'  => true,
+      'core_version'  => 'installed',
       }
     }
 
@@ -29,8 +29,8 @@ describe 'mailman3::core::install', :type => :class do
     # should not install if the flags are set
     let(:params) {
       {
-        'install_mailman'  => false,
-        'mailman_version'  => 'installed',
+        'install_core'  => false,
+        'core_version'  => 'installed',
         }
       }
 
index e320675..c1c43c2 100644 (file)
@@ -7,6 +7,7 @@ describe 'mailman3::core', :type => :class do
     it { is_expected.to contain_class('mailman3::params') }
     it { is_expected.to contain_anchor('mailman3::core::begin') }
     it { is_expected.to contain_class('mailman3::core::install') }
+    it { is_expected.to contain_class('mailman3::core::config') }
     it { is_expected.to contain_anchor('mailman3::core::end') }
   end
 end
diff --git a/templates/mailman.cfg.erb b/templates/mailman.cfg.erb
new file mode 100644 (file)
index 0000000..b0f8619
--- /dev/null
@@ -0,0 +1,15 @@
+; MANAGED BY PUPPET
+
+<% @core_options.sort.map do |section, var_hash| -%>
+[<%= section %>]
+<% var_hash.sort.map do |var, val_or_arr| -%>
+<% if val_or_arr.is_a? Array -%>
+<% val_or_arr.each do |val| -%>
+  <%= var %> = <%= val %>
+<% end -%>
+<% else -%>
+  <%= var %> = <%= val_or_arr %>
+<% end -%>
+<% end -%>
+
+<% end -%>