Tim Landscheidt has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/250361

Change subject: Add support for PostgreSQL backend
......................................................................

Add support for PostgreSQL backend

This change adds support to set up a PostgreSQL backend by setting the
Vagrant configuration "db_type" to "postgres".  As HHVM does not
support PostgreSQL out of the box, the Zend Engine role is selected if
this backend is chosen.

Bug: T116604
Change-Id: I1a1f001d25e61c9816ba316144449f8a08ec8cd0
---
M lib/mediawiki-vagrant/settings/definitions.rb
M puppet/modules/mediawiki/manifests/init.pp
M puppet/modules/mediawiki/manifests/multiwiki.pp
M puppet/modules/mediawiki/manifests/wiki.pp
A puppet/modules/mediawiki/templates/wiki/check_installed_postgres.erb
M puppet/modules/php/manifests/init.pp
A puppet/modules/postgresql/manifests/init.pp
A puppet/modules/postgresql/manifests/packages.pp
M puppet/modules/role/manifests/mediawiki.pp
M spec/mediawiki_vagrant/settings/definitions_spec.rb
10 files changed, 118 insertions(+), 14 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/vagrant 
refs/changes/61/250361/1

diff --git a/lib/mediawiki-vagrant/settings/definitions.rb 
b/lib/mediawiki-vagrant/settings/definitions.rb
index 9ed2f31..f2c3bbd 100644
--- a/lib/mediawiki-vagrant/settings/definitions.rb
+++ b/lib/mediawiki-vagrant/settings/definitions.rb
@@ -67,8 +67,8 @@
 
     setting :db_type,
       description: 'Database type to use',
-      help: "Enter 'mysql' or 'sqlite'. You cannot change this for an already 
provisioned VM.",
+      help: "Enter 'mysql', 'postgres' or 'sqlite'. You cannot change this for 
an already provisioned VM.",
       default: 'mysql',
-      coercion: ->(_setting, new) { %w(mysql sqlite).include?(new) ? new : 
_setting.default }
+      coercion: ->(_setting, new) { %w(mysql postgres sqlite).include?(new) ? 
new : _setting.default }
   end
 end
diff --git a/puppet/modules/mediawiki/manifests/init.pp 
b/puppet/modules/mediawiki/manifests/init.pp
index 8a57e7e..4aa5875 100644
--- a/puppet/modules/mediawiki/manifests/init.pp
+++ b/puppet/modules/mediawiki/manifests/init.pp
@@ -15,7 +15,7 @@
 #   Initial password for admin account (example: 'secret123').
 #
 # [*db_type*]
-#   Type of database backend ('mysql' or 'sqlite').
+#   Type of database backend ('mysql', 'postgres' or 'sqlite').
 #
 # [*db_name*]
 #   Logical database name (example: 'devwiki').
@@ -140,9 +140,17 @@
         ],
     }
 
-    if $db_type == 'mysql' {
-        Exec['set_mysql_password'] -> Mediawiki::Wiki[$wiki_name]
+    # lint:ignore:case_without_default
+    case $db_type {
+        'mysql': {
+            Exec['set_mysql_password'] -> Mediawiki::Wiki[$wiki_name]
+        }
+
+        'postgres': {
+            Exec['create_postgresql_user'] -> Mediawiki::Wiki[$wiki_name]
+        }
     }
+    # lint:endignore
 
     env::var { 'MW_INSTALL_PATH':
         value => $dir,
diff --git a/puppet/modules/mediawiki/manifests/multiwiki.pp 
b/puppet/modules/mediawiki/manifests/multiwiki.pp
index 7ec886f..e454229 100644
--- a/puppet/modules/mediawiki/manifests/multiwiki.pp
+++ b/puppet/modules/mediawiki/manifests/multiwiki.pp
@@ -197,6 +197,18 @@
             }
         }
 
+        'postgres': {
+            require_package('postgresql-client-common')
+
+            file { '/usr/local/bin/sql':
+                ensure  => file,
+                owner   => 'root',
+                group   => 'root',
+                mode    => '0755',
+                content => "#!/bin/sh\npsql -U root -h localhost 
${mediawiki::db_name}\n",
+            }
+        }
+
         'sqlite': {
             require_package('sqlite3')
 
diff --git a/puppet/modules/mediawiki/manifests/wiki.pp 
b/puppet/modules/mediawiki/manifests/wiki.pp
index 850c817..0726dd2 100644
--- a/puppet/modules/mediawiki/manifests/wiki.pp
+++ b/puppet/modules/mediawiki/manifests/wiki.pp
@@ -26,7 +26,7 @@
 #   The name of your site (example: 'devwiki').
 #
 # [*db_type*]
-#   Type of database backend ('mysql' or 'sqlite').
+#   Type of database backend ('mysql', 'postgres' or 'sqlite').
 #
 # [*db_name*]
 #   Logical database name (example: 'devwiki').
@@ -122,9 +122,17 @@
         require => File[$settings_root],
     }
 
-    if $db_type == 'mysql' {
-        Class['mysql'] -> Exec["${db_name}_setup"]
+    # lint:ignore:case_without_default
+    case $db_type {
+        'mysql': {
+            Class['mysql'] -> Exec["${db_name}_setup"]
+        }
+
+        'postgres': {
+            Class['postgresql'] -> Exec["${db_name}_setup"]
+        }
     }
+    # lint:endignore
 
     exec { "${db_name}_include_extra_settings":
         command => '/bin/echo "include_once \'/vagrant/LocalSettings.php\';" 
>> LocalSettings.php',
diff --git 
a/puppet/modules/mediawiki/templates/wiki/check_installed_postgres.erb 
b/puppet/modules/mediawiki/templates/wiki/check_installed_postgres.erb
new file mode 100644
index 0000000..646e0d0
--- /dev/null
+++ b/puppet/modules/mediawiki/templates/wiki/check_installed_postgres.erb
@@ -0,0 +1 @@
+test -f '<%= @settings_root %>/LocalSettings.php' && sudo -u postgres psql 
-Atc "SELECT 'x' FROM pg_database WHERE datname = '<%= @db_name %>';" template1 
| fgrep -x x
diff --git a/puppet/modules/php/manifests/init.pp 
b/puppet/modules/php/manifests/init.pp
index 9fd9544..010ce25 100644
--- a/puppet/modules/php/manifests/init.pp
+++ b/puppet/modules/php/manifests/init.pp
@@ -28,6 +28,7 @@
         'php5-json',
         'php5-mcrypt',
         'php5-mysql',
+        'php5-pgsql',
         'php5-readline',
         'php5-sqlite',
     ]:
diff --git a/puppet/modules/postgresql/manifests/init.pp 
b/puppet/modules/postgresql/manifests/init.pp
new file mode 100644
index 0000000..4866418
--- /dev/null
+++ b/puppet/modules/postgresql/manifests/init.pp
@@ -0,0 +1,51 @@
+# == Class: postgresql
+#
+# Configures a local PostgreSQL database server and ~/.pgpass and
+# ~/.psqlrc files for the Vagrant user.
+#
+# === Parameters
+#
+# [*root_password*]
+#   Password for the root account (default: 'vagrant').
+#
+# === Examples
+#
+#  class { 'postgresql':
+#      root_password   => 'r00tp455w0rd',
+#  }
+#
+class postgresql(
+    $root_password = 'vagrant',
+) {
+    include ::postgresql::packages
+
+    exec { 'create_postgresql_user':
+        command => "/usr/bin/psql -c \"CREATE USER root WITH CREATEDB PASSWORD 
'$root_password';\"",
+        unless  => '/usr/bin/psql -Atc "SELECT \'x\' FROM pg_user WHERE 
usename = \'root\';" | /bin/fgrep -x x',
+        user    => 'postgres',
+        require => Service['postgresql'],
+    }
+
+    service { 'postgresql':
+        ensure     => running,
+        enable     => true,
+        hasrestart => true,
+        require    => Package['postgresql'],
+    }
+
+    file { '/home/vagrant/.pgpass':
+        ensure  => file,
+        owner   => 'vagrant',
+        group   => 'vagrant',
+        mode    => '0600',
+        content => "localhost:5432:*:root:${root_password}\n",
+    }
+
+    file { '/home/vagrant/.psqlrc':
+        ensure  => file,
+        owner   => 'vagrant',
+        group   => 'vagrant',
+        mode    => '0444',
+        content => "SET search_path = mediawiki, public, pg_catalog;\n",
+    }
+}
diff --git a/puppet/modules/postgresql/manifests/packages.pp 
b/puppet/modules/postgresql/manifests/packages.pp
new file mode 100644
index 0000000..3d92758
--- /dev/null
+++ b/puppet/modules/postgresql/manifests/packages.pp
@@ -0,0 +1,11 @@
+# == Class: postgresql::packages
+#
+# PostgreSQL package resources, abstracted out to a separate,
+# unparametrized class so they can be included from multiple
+# locations.
+#
+class postgresql::packages {
+    package { 'postgresql':
+        ensure => present,
+    }
+}
diff --git a/puppet/modules/role/manifests/mediawiki.pp 
b/puppet/modules/role/manifests/mediawiki.pp
index b70a826..a1d8f7d 100644
--- a/puppet/modules/role/manifests/mediawiki.pp
+++ b/puppet/modules/role/manifests/mediawiki.pp
@@ -7,7 +7,7 @@
 #   Hostname for the main wiki.
 #
 # [*db_type*]
-#   Type of database backend ('mysql' or 'sqlite').
+#   Type of database backend ('mysql', 'postgres' or 'sqlite').
 #
 class role::mediawiki(
     $hostname,
@@ -20,10 +20,22 @@
     require ::mwv
     require ::redis
 
-    if $db_type == 'mysql' {
-      require ::mysql
-    }
+    # lint:ignore:case_without_default
+    case $db_type {
+        'mysql': {
+            require ::mysql
+        }
 
+        'postgres': {
+            require ::postgresql
+            # TODO: HHVM does not support PostgreSQL out of the box,
+            #       so the VM needs to use the Zend Engine instead.
+            #       When easy-to-install packages are available, this
+            #       can be amended.
+            require ::role::zend
+        }
+    }
+    # lint:endignore
     require_package('php5-tidy')
     require_package('tidy')
 
diff --git a/spec/mediawiki_vagrant/settings/definitions_spec.rb 
b/spec/mediawiki_vagrant/settings/definitions_spec.rb
index 8b13dc7..7cb6231 100644
--- a/spec/mediawiki_vagrant/settings/definitions_spec.rb
+++ b/spec/mediawiki_vagrant/settings/definitions_spec.rb
@@ -199,8 +199,8 @@
         it { is_expected.to have_attributes(default: 'mysql') }
 
         context 'when a new value is set' do
-          it 'takes values "mysql" and "sqlite" verbatim' do
-            %w(mysql sqlite).each do |value|
+          it 'takes values "mysql", "postgres" and "sqlite" verbatim' do
+            %w(mysql postgres sqlite).each do |value|
               subject.value = value
               expect(subject.value).to eq(value), "expected #{value} to be 
taken verbatim"
             end

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I1a1f001d25e61c9816ba316144449f8a08ec8cd0
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/vagrant
Gerrit-Branch: master
Gerrit-Owner: Tim Landscheidt <[email protected]>

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

Reply via email to