Alexandros Kosiaris has submitted this change and it was merged.

Change subject: Modularize backups.pp
......................................................................


Modularize backups.pp

Move all the DRY defines in a WMF specific module
Add (incomplete) RSpec tests
Add README.md
Delete backup::mysql which was unused

Change-Id: I7e2d1f933d57dc27f5933d826fadec2f64f74e47
---
D manifests/backups.pp
M manifests/site.pp
A modules/backup/.rspec
A modules/backup/README.md
A modules/backup/Rakefile
A modules/backup/manifests/mysqlset.pp
A modules/backup/manifests/schedule.pp
A modules/backup/manifests/set.pp
A modules/backup/manifests/weeklyschedule.pp
A modules/backup/spec/defines/schedule_spec.rb
A modules/backup/spec/defines/set_spec.rb
A modules/backup/spec/defines/weeklyschedule_spec.rb
A modules/backup/spec/fixtures/manifests/site.pp
A modules/backup/spec/spec_helper.rb
14 files changed, 254 insertions(+), 133 deletions(-)

Approvals:
  Alexandros Kosiaris: Verified; Looks good to me, approved



diff --git a/manifests/backups.pp b/manifests/backups.pp
deleted file mode 100644
index a316ba9..0000000
--- a/manifests/backups.pp
+++ /dev/null
@@ -1,132 +0,0 @@
-# backup::set is probably what you want
-define backup::set($jobdefaults=$role::backup::host::jobdefaults) {
-    if $jobdefaults != undef {
-        @bacula::client::job { "${name}-${jobdefaults}":
-            fileset     => $name,
-            jobdefaults => $jobdefaults,
-        }
-
-        $motd_content = "#!/bin/sh\necho \"Backed up on this host: ${name}\""
-        @file { "/etc/update-motd.d/06-backups-${name}":
-            ensure  => 'present',
-            owner   => 'root',
-            group   => 'root',
-            mode    => '0555',
-            content => $motd_content,
-            tag     => 'backup-motd',
-        }
-    }
-}
-
-define backup::mysqlset($method='bpipe',
-                        $xtrabackup=true,
-                        $per_db=false,
-                        $innodb_only=false,
-                        $local_dump_dir=undef,
-                        $password_file=undef,
-                        $mysql_binary=undef,
-                        $mysqldump_binary=undef,
-                        $jobdefaults=$role::backup::host::jobdefaults,
-) {
-
-    $allowed_methods = [ 'bpipe', 'predump' ]
-    if !($method in $allowed_methods) {
-        fail("${method} is not allowed")
-    }
-
-    if !defined(Package['pigz']) {
-        package { 'pigz':
-            ensure => present,
-        }
-    }
-    if $method == 'predump' {
-        $extras = {
-                'ClientRunBeforeJob' => '/etc/bacula/scripts/predump',
-        }
-        $basefileset = regsubst(regsubst($local_dump_dir,'/',''),'/','-','G')
-        $fileset = "mysql-${basefileset}"
-
-        file { '/etc/bacula/scripts/predump':
-            ensure  => 'present',
-            owner   => 'root',
-            group   => 'root',
-            mode    => '0500',
-            content => template('backups/mysql-predump.erb'),
-        }
-
-    } elsif $method == 'bpipe' {
-        bacula::client::mysql-bpipe { 
"mysql-bpipe-x${xtrabackup}-p${per_db}-i${innodb_only}":
-            per_database          => $per_db,
-            xtrabackup            => $xtrabackup,
-            mysqldump_innodb_only => $innodb_only,
-            local_dump_dir        => $local_dump_dir,
-            password_file         => $password_file,
-            mysql_binary          => $mysql_binary,
-            mysqldump_binary      => $mysqldump_binary,
-        }
-        $extras = undef
-        $fileset = "mysql-${method}-x${xtrabackup}-p${per_db}-i${innodb_only}"
-    }
-
-    if $jobdefaults != undef {
-        @bacula::client::job { "mysql-${method}-${name}-${jobdefaults}":
-            fileset     => $fileset,
-            jobdefaults => $jobdefaults,
-            extras      => $extras,
-        }
-    }
-}
-
-# Utility definition used internally to deduplicate code
-define backup::schedule($pool) {
-    bacula::director::schedule { "Monthly-1st-${name}":
-        runs => [
-            { 'level' => 'Full',
-              'at'    => "1st ${name} at 02:05",
-            },
-            { 'level' => 'Differential',
-              'at'    => "3rd ${name} at 03:05",
-            },
-            { 'level' => 'Incremental',
-              'at'    => 'at 04:05',
-            },
-                ],
-    }
-
-    bacula::director::jobdefaults { "Monthly-1st-${name}-${pool}":
-        when => "Monthly-1st-${name}",
-        pool => $pool,
-    }
-
-}
-# Same for weekly backups
-define backup::weeklyschedule($pool) {
-    bacula::director::schedule { "Weekly-${name}":
-        runs => [
-            { 'level' => 'Full',
-              'at'    => "${name} at 02:05",
-            },
-                ],
-    }
-
-    bacula::director::jobdefaults { "Weekly-${name}-${pool}":
-        when => "Weekly-${name}",
-        pool => $pool,
-    }
-}
-
-class backup::mysql {
-    file { '/usr/local/sbin/snaprotate.pl':
-        owner  => 'root',
-        group  => 'root',
-        mode   => '0755',
-        source => 'puppet:///files/backup/snaprotate.pl',
-    }
-
-    cron { 'snaprotate':
-        command => '/usr/local/sbin/snaprotate.pl -a swap -V tank -s data -L 
20G -c 1',
-        user    => 'root',
-        hour    => 1,
-        minute  => 0,
-    }
-}
diff --git a/manifests/site.pp b/manifests/site.pp
index e0ade8d..77f578e 100644
--- a/manifests/site.pp
+++ b/manifests/site.pp
@@ -2,7 +2,6 @@
 # site.pp
 
 import 'realm.pp' # These ones first
-import 'backups.pp'
 import 'certs.pp'
 import 'dns.pp'
 import 'facilities.pp'
diff --git a/modules/backup/.rspec b/modules/backup/.rspec
new file mode 100644
index 0000000..f449dae
--- /dev/null
+++ b/modules/backup/.rspec
@@ -0,0 +1,2 @@
+--format doc
+--color
diff --git a/modules/backup/README.md b/modules/backup/README.md
new file mode 100644
index 0000000..ccc42c4
--- /dev/null
+++ b/modules/backup/README.md
@@ -0,0 +1,21 @@
+# Backups Puppet Module #
+
+A Puppet module for deduplicating configuration puppet stanzas for WMF
+The bacula puppet module is generic enough to allow being used by third
+parties. At the same time however some simple defines must be used to
+deduplicate stuff and allow easy of use. This module contains that,
+mostly WMF specific code
+
+## Requirements ##
+- The bacula puppet module and whatever that requires
+
+## Notes ##
+
+The idea behind this module is to make it extra easy to get a host up
+and running in WMF backups.
+
+
+## Usage ##
+
+include role::backup::host
+backup::set { 'home': }
diff --git a/modules/backup/Rakefile b/modules/backup/Rakefile
new file mode 100644
index 0000000..d9226a8
--- /dev/null
+++ b/modules/backup/Rakefile
@@ -0,0 +1,37 @@
+require 'rake'
+require 'fileutils'
+
+require 'rspec/core/rake_task'
+
+modulename = File.basename(File.expand_path(File.dirname(__FILE__)))
+
+symlinks = { 'spec/fixtures/modules/%s/files' % modulename => 
'../../../../files',
+  'spec/fixtures/modules/%s/manifests' % modulename => '../../../../manifests',
+  'spec/fixtures/modules/%s/templates' % modulename => '../../../../templates',
+}
+
+
+task :setup do
+  FileUtils.mkdir_p('spec/fixtures/modules/%s' % modulename)
+  symlinks.each do |x|
+    if !File.exist?(x[0])
+      FileUtils.ln_s(x[1], x[0])
+    end
+  end
+end
+
+task :teardown do
+  symlinks.each { |x| FileUtils.rm(x[0], :force => true) }
+  FileUtils.rmdir('spec/fixtures/modules/%s' % modulename)
+  FileUtils.rmdir('spec/fixtures/modules')
+end
+
+RSpec::Core::RakeTask.new(:realspec) do |t|
+  t.fail_on_error = false
+  t.pattern = 'spec/*/*_spec.rb'
+end
+
+task :spec => [ :setup, :realspec, :teardown]
+
+task :default => :spec do
+end
diff --git a/modules/backup/manifests/mysqlset.pp 
b/modules/backup/manifests/mysqlset.pp
new file mode 100644
index 0000000..8f412e8
--- /dev/null
+++ b/modules/backup/manifests/mysqlset.pp
@@ -0,0 +1,58 @@
+define backup::mysqlset($method='bpipe',
+                        $xtrabackup=true,
+                        $per_db=false,
+                        $innodb_only=false,
+                        $local_dump_dir=undef,
+                        $password_file=undef,
+                        $mysql_binary=undef,
+                        $mysqldump_binary=undef,
+                        $jobdefaults=$role::backup::host::jobdefaults,
+) {
+
+    $allowed_methods = [ 'bpipe', 'predump' ]
+    if !($method in $allowed_methods) {
+        fail("${method} is not allowed")
+    }
+
+    if !defined(Package['pigz']) {
+        package { 'pigz':
+            ensure => present,
+        }
+    }
+    if $method == 'predump' {
+        $extras = {
+                'ClientRunBeforeJob' => '/etc/bacula/scripts/predump',
+        }
+        $basefileset = regsubst(regsubst($local_dump_dir,'/',''),'/','-','G')
+        $fileset = "mysql-${basefileset}"
+
+        file { '/etc/bacula/scripts/predump':
+            ensure  => 'present',
+            owner   => 'root',
+            group   => 'root',
+            mode    => '0500',
+            content => template('backups/mysql-predump.erb'),
+        }
+
+    } elsif $method == 'bpipe' {
+        bacula::client::mysql-bpipe { 
"mysql-bpipe-x${xtrabackup}-p${per_db}-i${innodb_only}":
+            per_database          => $per_db,
+            xtrabackup            => $xtrabackup,
+            mysqldump_innodb_only => $innodb_only,
+            local_dump_dir        => $local_dump_dir,
+            password_file         => $password_file,
+            mysql_binary          => $mysql_binary,
+            mysqldump_binary      => $mysqldump_binary,
+        }
+        $extras = undef
+        $fileset = "mysql-${method}-x${xtrabackup}-p${per_db}-i${innodb_only}"
+    }
+
+    if $jobdefaults != undef {
+        @bacula::client::job { "mysql-${method}-${name}-${jobdefaults}":
+            fileset     => $fileset,
+            jobdefaults => $jobdefaults,
+            extras      => $extras,
+        }
+    }
+}
diff --git a/modules/backup/manifests/schedule.pp 
b/modules/backup/manifests/schedule.pp
new file mode 100644
index 0000000..1ff68ad
--- /dev/null
+++ b/modules/backup/manifests/schedule.pp
@@ -0,0 +1,22 @@
+# Utility definition used internally to deduplicate code
+define backup::schedule($pool) {
+    bacula::director::schedule { "Monthly-1st-${name}":
+        runs => [
+            { 'level' => 'Full',
+              'at'    => "1st ${name} at 02:05",
+            },
+            { 'level' => 'Differential',
+              'at'    => "3rd ${name} at 03:05",
+            },
+            { 'level' => 'Incremental',
+              'at'    => 'at 04:05',
+            },
+                ],
+    }
+
+    bacula::director::jobdefaults { "Monthly-1st-${name}-${pool}":
+        when => "Monthly-1st-${name}",
+        pool => $pool,
+    }
+
+}
diff --git a/modules/backup/manifests/set.pp b/modules/backup/manifests/set.pp
new file mode 100644
index 0000000..238320a
--- /dev/null
+++ b/modules/backup/manifests/set.pp
@@ -0,0 +1,19 @@
+# backup::set is probably what you want
+define backup::set($jobdefaults=$role::backup::host::jobdefaults) {
+    if $jobdefaults != undef {
+        @bacula::client::job { "${name}-${jobdefaults}":
+            fileset     => $name,
+            jobdefaults => $jobdefaults,
+        }
+
+        $motd_content = "#!/bin/sh\necho \"Backed up on this host: ${name}\""
+        @file { "/etc/update-motd.d/06-backups-${name}":
+            ensure  => 'present',
+            owner   => 'root',
+            group   => 'root',
+            mode    => '0555',
+            content => $motd_content,
+            tag     => 'backup-motd',
+        }
+    }
+}
diff --git a/modules/backup/manifests/weeklyschedule.pp 
b/modules/backup/manifests/weeklyschedule.pp
new file mode 100644
index 0000000..040d400
--- /dev/null
+++ b/modules/backup/manifests/weeklyschedule.pp
@@ -0,0 +1,15 @@
+# Same for weekly backups
+define backup::weeklyschedule($pool) {
+    bacula::director::schedule { "Weekly-${name}":
+        runs => [
+            { 'level' => 'Full',
+              'at'    => "${name} at 02:05",
+            },
+                ],
+    }
+
+    bacula::director::jobdefaults { "Weekly-${name}-${pool}":
+        when => "Weekly-${name}",
+        pool => $pool,
+    }
+}
diff --git a/modules/backup/spec/defines/schedule_spec.rb 
b/modules/backup/spec/defines/schedule_spec.rb
new file mode 100644
index 0000000..0962a86
--- /dev/null
+++ b/modules/backup/spec/defines/schedule_spec.rb
@@ -0,0 +1,24 @@
+require 'spec_helper'
+
+describe 'backup::schedule', :type => :define do
+    let(:title) { 'something' }
+    let(:params) { {
+        :pool => 'unimportant',
+    }
+    }
+    let(:pre_condition) do
+       [
+            'define bacula::director::jobdefaults($when, $pool) {}',
+            'define bacula::director::schedule($runs) {}',
+       ]
+    end
+    it 'should create bacula::director::jobdefaults' do
+        should 
contain_bacula__director__jobdefaults("Monthly-1st-#{title}-unimportant").with({
+            'when'    => "Monthly-1st-#{title}",
+            'pool'    => 'unimportant',
+        })
+    end
+    it 'should create bacula::director::schedule' do
+        should contain_bacula__director__schedule("Monthly-1st-#{title}")
+    end
+end
diff --git a/modules/backup/spec/defines/set_spec.rb 
b/modules/backup/spec/defines/set_spec.rb
new file mode 100644
index 0000000..0ed7fc4
--- /dev/null
+++ b/modules/backup/spec/defines/set_spec.rb
@@ -0,0 +1,24 @@
+require 'spec_helper'
+
+describe 'backup::set', :type => :define do
+    let(:title) { 'something' }
+    let(:params) { {
+        :jobdefaults => 'unimportant',
+    }
+    }
+    let(:pre_condition) do
+        [
+            'File <| |>',
+            'define bacula::client::job($fileset, $jobdefaults) {}',
+        ]
+    end
+    it 'should create valid content for 
/etc/update-motd.d/06-backups-something' do
+        should contain_file("/etc/update-motd.d/06-backups-#{title}").with({
+            'ensure'  => 'present',
+            'owner'   => 'root',
+            'group'   => 'root',
+            'mode'    => '0555',
+        }) \
+        .with_content(/Backed up on this host: something/)
+    end
+end
diff --git a/modules/backup/spec/defines/weeklyschedule_spec.rb 
b/modules/backup/spec/defines/weeklyschedule_spec.rb
new file mode 100644
index 0000000..6a35dd2
--- /dev/null
+++ b/modules/backup/spec/defines/weeklyschedule_spec.rb
@@ -0,0 +1,24 @@
+require 'spec_helper'
+
+describe 'backup::weeklyschedule', :type => :define do
+    let(:title) { 'something' }
+    let(:params) { {
+        :pool => 'unimportant',
+    }
+    }
+    let(:pre_condition) do
+       [
+            'define bacula::director::jobdefaults($when, $pool) {}',
+            'define bacula::director::schedule($runs) {}',
+       ]
+    end
+    it 'should create bacula::director::jobdefaults' do
+        should 
contain_bacula__director__jobdefaults("Weekly-#{title}-unimportant").with({
+            'when'    => "Weekly-#{title}",
+            'pool'    => 'unimportant',
+        })
+    end
+    it 'should create bacula::director::schedule' do
+        should contain_bacula__director__schedule("Weekly-#{title}")
+    end
+end
diff --git a/modules/backup/spec/fixtures/manifests/site.pp 
b/modules/backup/spec/fixtures/manifests/site.pp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/modules/backup/spec/fixtures/manifests/site.pp
diff --git a/modules/backup/spec/spec_helper.rb 
b/modules/backup/spec/spec_helper.rb
new file mode 100644
index 0000000..d3923f8
--- /dev/null
+++ b/modules/backup/spec/spec_helper.rb
@@ -0,0 +1,8 @@
+require 'rspec-puppet'
+
+fixture_path = File.expand_path(File.join(__FILE__, '..', 'fixtures'))
+
+RSpec.configure do |c|
+  c.module_path = File.join(fixture_path, 'modules')
+  c.manifest_dir = File.join(fixture_path, 'manifests')
+end

-- 
To view, visit https://gerrit.wikimedia.org/r/169680
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I7e2d1f933d57dc27f5933d826fadec2f64f74e47
Gerrit-PatchSet: 2
Gerrit-Project: operations/puppet
Gerrit-Branch: production
Gerrit-Owner: Alexandros Kosiaris <[email protected]>
Gerrit-Reviewer: Alexandros Kosiaris <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to