Ottomata has submitted this change and it was merged.

Change subject: Adding puppet Limn module.
......................................................................


Adding puppet Limn module.

Change-Id: Idb71d214135faac6d3c381aef8fcb2536f54644e
---
A modules/limn/README.md
A modules/limn/manifests/init.pp
A modules/limn/manifests/instance.pp
A modules/limn/manifests/instance/proxy.pp
A modules/limn/templates/init-limn.conf.erb
A modules/limn/templates/vhost-limn-proxy.conf.erb
6 files changed, 307 insertions(+), 0 deletions(-)

Approvals:
  Faidon: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/modules/limn/README.md b/modules/limn/README.md
new file mode 100644
index 0000000..c2b5477
--- /dev/null
+++ b/modules/limn/README.md
@@ -0,0 +1,53 @@
+[Limn][https://github.com/wikimedia/limn] puppet module.
+
+# Usage
+
+```puppet
+
+# Spawn up a limn instance called 'my-instance'.
+# Data files are expected to be at
+# /var/lib/limn/my-instance/data.
+limn::instance { "my-instance": }
+
+```
+
+The above will start a Limn instance listening on port 8081, with an
+apache VirtualHost reverse proxying to it on port 80.  If the defaults
+for the VirtualHost don't work for you, you can set proxy => false
+on the instance and set it up yourself or using the limn::instance::proxy
+define.
+
+Note that the limn class by default does not attempt to install a limn
+package.  There is not currently a supported limn .deb package, so we
+recommend cloning the [limn repository][https://github.com/wikimedia/limn]
+directly into /usr/local/share/limn (or elsewhere if you set base_directory to 
something non default on limn::instance).  Or deploy limn to wherever you
+see fit.
+
+## Example:
+
+```bash
+# Install Limn at /usr/local/share/limn
+sudo git clone https://github.com/wikimedia/limn.git /usr/local/share/limn
+```
+
+```puppet
+
+class role::analytics::reportcard {
+  # spawn up a limn instance called 'reportcard'
+  # using the defaults.
+  limn::instance { 'reportcard': }
+
+  # We want an Apache VirtualHost to proxy
+  # 'reportcard.wmflabs.org' to the reportcard
+  # limn instance.
+  limn::instance::proxy { 'reportcard':
+    server_name => 'reportcard.wmflabs.org',
+    require     => Limn::Instance['reportcard'],
+  }
+}
+```
+
+# Requirements
+* puppet-labs' apache puppet module.
+
+
diff --git a/modules/limn/manifests/init.pp b/modules/limn/manifests/init.pp
new file mode 100644
index 0000000..84d1b14
--- /dev/null
+++ b/modules/limn/manifests/init.pp
@@ -0,0 +1,65 @@
+# == Class limn
+# Installs limn.
+# To spawn up a limn server instance, use the limn::instance define.
+#
+# NOTE: This does not install limn.  You must do that youself.
+# When you use limn::instance, set $base_directory to the location
+# in which you installed limn.
+#
+# == Parameters
+# $var_directory  - Default path to Limn var directory.  This will also be 
limn user's home directory.  Default: /var/lib/limn
+# $log_directory  - Default path to Limn server logs.  Default: /var/log/limn
+# $user           - Limn user.  Default: limn
+# $group          - Limn group.  Default: limn
+#
+class limn(
+  $var_directory  = '/var/lib/limn',
+  $log_directory  = '/var/log/limn',
+  $install        = false)
+{
+  $user  = 'limn'
+  $group = 'limn'
+
+  # Make sure nodejs is installed.
+  if (!defined(Package['nodejs'])) {
+    package { 'nodejs':
+      ensure => installed,
+    }
+  }
+
+  group { $group:
+    ensure => present,
+    system => true,
+  }
+
+  user { $user:
+    ensure     => present,
+    gid        => $group,
+    home       => $var_directory,
+    managehome => false,
+    system     => true,
+    require    => Group[$group],
+  }
+
+  # Default limn containing data directory.
+  # Instances default to storing data in
+  # $var_directory/$name
+  file { $var_directory:
+    ensure  => 'directory',
+    owner   => $user,
+    group   => $group,
+    mode    => '0755',
+    require => [User[$user], Group[$group]],
+  }
+
+  # Default limn log directory.
+  # Instances will log to
+  # $log_directory/limn-$name.log
+  file { $log_directory:
+    ensure  => 'directory',
+    owner   => $user,
+    group   => $group,
+    mode    => '0755',
+    require => [User[$user], Group[$group]],
+  }
+}
\ No newline at end of file
diff --git a/modules/limn/manifests/instance.pp 
b/modules/limn/manifests/instance.pp
new file mode 100644
index 0000000..5d0128d
--- /dev/null
+++ b/modules/limn/manifests/instance.pp
@@ -0,0 +1,97 @@
+# == Define limn::instance
+# Starts up a Limn Server instance.
+#
+# == Parameters:
+# $port           - Listen port for Limn instance.  Default: 8081
+# $environment    - Node environment.  Default: production
+# $base_directory - Limn install base directory.  Default: 
/usr/local/share/limn
+# $var_directory  - Limn instance var directory.  Limn datafiles live here.  
Default: /var/lib/limn/$name
+# $log_file       - Limn instance log file.  Default: 
/var/log/limn/limn-$name.log
+# $ensure         - present|absent.  Default: present
+#
+define limn::instance (
+  $port           = 8081,
+  $environment    = 'production',
+  $base_directory = '/usr/local/share/limn',
+  $var_directory  = "/var/lib/limn/${name}",
+  $log_file       = "/var/log/limn/limn-${name}.log",
+  $proxy          = true,
+  $ensure         = 'present')
+{
+  require limn
+
+  file { $base_directory:
+    ensure => 'directory',
+    owner  => $limn::user,
+    group  => $limn::group,
+    mode   => '0775',
+  }
+
+  file { $var_directory:
+    ensure => 'directory',
+    owner  => $limn::user,
+    group  => $limn::group,
+    mode   => '0775',
+  }
+
+  # The upstart init conf will start server.co
+  # logging to this file.
+  file { $log_file:
+    ensure => 'file',
+    owner  => $limn::user,
+    group  => $limn::group,
+    mode   => '0775',
+  }
+
+  # symlink $base_directory/var/{css,js,vendor}
+  # in $var_directory
+  $symlink_ensure = $ensure ? {
+    present => 'link',
+    default => 'absent',
+  }
+  file { "${var_directory}/css":
+    ensure => $symlink_ensure,
+    target => "${base_directory}/var/css",
+  }
+  file { "${var_directory}/js":
+    ensure => $symlink_ensure,
+    target => "${base_directory}/var/js",
+  }
+  file { "${var_directory}/vendor":
+    ensure => $symlink_ensure,
+    target => "${base_directory}/var/vendor",
+  }
+
+  # Install an upstart init file for this limn server instance.
+  file { "/etc/init/limn-${name}.conf":
+    ensure    => $ensure,
+    content   => template('limn/init-limn.conf.erb'),
+    owner     => 'root',
+    group     => 'root',
+    mode      => '0444',
+    require   => [File[$var_directory], File[$log_file]],
+  }
+
+  # Symlink an /etc/init.d script to upstart-job
+  # for SysV compatibility.
+  $sysv_ensure = $ensure ? {
+    present   => 'link',
+    default   => 'absent',
+  }
+  file { "/etc/init.d/limn-${name}":
+    ensure  => $sysv_ensure,
+    target  => '/lib/init/upstart-job',
+    require => File["/etc/init/limn-${name}.conf"],
+  }
+
+  # Start the service.
+  $service_ensure = $ensure ? {
+    present   => 'running',
+    default   => 'stopped',
+  }
+  service { "limn-${name}":
+    ensure     => $service_ensure,
+    provider   => 'upstart',
+    subscribe  => File["/etc/init/limn-${name}.conf"],
+  }
+}
\ No newline at end of file
diff --git a/modules/limn/manifests/instance/proxy.pp 
b/modules/limn/manifests/instance/proxy.pp
new file mode 100644
index 0000000..d144575
--- /dev/null
+++ b/modules/limn/manifests/instance/proxy.pp
@@ -0,0 +1,40 @@
+# == Define limn::instance::proxy
+# Sets up an apache mod_rewrite proxy for proxying to a Limn instance.
+# Static files in $document_root will be served by apache.
+# This define depends on the apache puppet module.
+#
+# == Parameters:
+# $port           - Apache port to Listen on.  Default: 80.
+# $limn_host      - Hostname or IP of Limn instnace.  Default: 127.0.0.1
+# $limn_port      - Port of Limn instance. Default: 8081
+# $document_root  - Path to Apache document root.   This should be the 
limn::instance $var_directory.  Default: /usr/local/limn/var.
+# $server_name    - Named VirtualHost.    Default: "$name.$domain"
+# $server_aliases - Server name aliases.  Default: none.
+#
+define limn::instance::proxy (
+  $port            = 80,
+  $limn_host       = '127.0.0.1',
+  $limn_port       = '8081',
+  $document_root   = '/usr/local/share/limn/var',
+  $server_name     = "${name}.${::domain}",
+  $server_aliases  = '')
+{
+  # need apache and mod_rewrite
+  class { 'apache':
+    serveradmin  => $server_admin,
+    default_mods => true,
+  }
+  apache::mod { 'rewrite': }
+
+  # Configure the Apache Limn instance proxy VirtualHost.
+  $priority      = 10
+  file { "${priority}-limn-${name}.conf":
+    path    => "${apache::params::vdir}/${priority}-limn-${name}.conf",
+    content => template('limn/vhost-limn-proxy.conf.erb'),
+    owner   => 'root',
+    group   => 'root',
+    mode    => '0444',
+    require => [Package['httpd'], Apache::Mod['rewrite']],
+    notify  => Service['httpd'],
+  }
+}
diff --git a/modules/limn/templates/init-limn.conf.erb 
b/modules/limn/templates/init-limn.conf.erb
new file mode 100644
index 0000000..018ca13
--- /dev/null
+++ b/modules/limn/templates/init-limn.conf.erb
@@ -0,0 +1,26 @@
+# Note: This file is managed by Puppet.
+
+# Limn <%= name %> Server Instance
+
+description "Limn <%= name %> Server Instance"
+
+start on runlevel [2345]
+stop on starting rc RUNLEVEL=[016]
+
+respawn
+respawn limit 2 5
+
+umask 007
+
+kill timeout 300
+
+env NODE_ENV=<%= environment %>
+env LIMN_PORT=<%= port %>
+env LIMN_VARDIR=<%= var_directory %>
+
+setuid <%= scope.lookupvar('limn::user')  %>
+setgid <%= scope.lookupvar('limn::group') %>
+
+console output
+chdir <%= base_directory %>
+exec ./node_modules/.bin/coco ./server/server.co >> <%= log_file %>
diff --git a/modules/limn/templates/vhost-limn-proxy.conf.erb 
b/modules/limn/templates/vhost-limn-proxy.conf.erb
new file mode 100644
index 0000000..dd613f4
--- /dev/null
+++ b/modules/limn/templates/vhost-limn-proxy.conf.erb
@@ -0,0 +1,26 @@
+<VirtualHost *:80>
+  ServerName <%= server_name %>
+<% if server_aliases.is_a? Array -%>
+<% server_aliases.each do |name| %><%= "  ServerAlias #{name}\n" %><% end %>
+<% elsif server_aliases != '' -%>
+<%= "  ServerAlias #{server_aliases}" %>
+<% end -%>
+
+  DocumentRoot <%= document_root %>
+
+  LogLevel warn
+  ErrorLog /var/log/<%= scope.lookupvar("apache::params::apache_name") %>/<%= 
name %>_error.log
+  CustomLog /var/log/<%= scope.lookupvar("apache::params::apache_name") %>/<%= 
name %>_access.log combined
+
+  ProxyRequests Off
+  <Proxy *>
+    Order allow,deny
+    Allow from all
+  </Proxy>
+
+  # If the file does not exist, assume this is a dynamic
+  # request and send it to the Limn instance.
+  RewriteEngine On
+  RewriteCond <%= document_root %>/%{REQUEST_FILENAME} !-s
+  RewriteRule "^(.*)" "http://<%= limn_host %>:<%= limn_port %>$1" [P]
+</VirtualHost>

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

Gerrit-MessageType: merged
Gerrit-Change-Id: Idb71d214135faac6d3c381aef8fcb2536f54644e
Gerrit-PatchSet: 19
Gerrit-Project: operations/puppet
Gerrit-Branch: production
Gerrit-Owner: Ottomata <[email protected]>
Gerrit-Reviewer: Diederik <[email protected]>
Gerrit-Reviewer: Dsc <[email protected]>
Gerrit-Reviewer: Faidon <[email protected]>
Gerrit-Reviewer: Jgreen <[email protected]>
Gerrit-Reviewer: Mark Bergsma <[email protected]>
Gerrit-Reviewer: Milimetric <[email protected]>
Gerrit-Reviewer: Ottomata <[email protected]>
Gerrit-Reviewer: Stefan.petrea <[email protected]>
Gerrit-Reviewer: jenkins-bot

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

Reply via email to