Ori.livneh has submitted this change and it was merged.

Change subject: Add tessera module and role; apply on graphite1001
......................................................................


Add tessera module and role; apply on graphite1001

* tessera cloned to gerrit:operations/software/tessera.
* Served by Apache / uWSGI.
* Deployed via Trebuchet.
* Behind misc-varnish. (DNS change: Ie4b68b2480).

See the inline documentation in init.pp for details.

Change-Id: I2e47c63c08492963edf3a7286032f931676519a9
---
M hieradata/common/role/deployment.yaml
A manifests/role/tessera.pp
M manifests/site.pp
A modules/tessera/manifests/init.pp
A modules/tessera/templates/config.py.erb
A templates/apache/sites/tessera.wikimedia.org.erb
M templates/varnish/misc.inc.vcl.erb
7 files changed, 171 insertions(+), 1 deletion(-)

Approvals:
  Ori.livneh: Verified; Looks good to me, approved
  Filippo Giunchedi: Looks good to me, but someone else must approve



diff --git a/hieradata/common/role/deployment.yaml 
b/hieradata/common/role/deployment.yaml
index a676eee..6f3323e 100644
--- a/hieradata/common/role/deployment.yaml
+++ b/hieradata/common/role/deployment.yaml
@@ -15,6 +15,8 @@
   jobrunner/jobrunner:
     upstream: https://gerrit.wikimedia.org/r/mediawiki/services/jobrunner
     service_name: jobrunner
+  tessera/tessera:
+    upstream: https://gerrit.wikimedia.org/r/operations/software/tessera
   grafana/grafana:
     upstream: https://gerrit.wikimedia.org/r/operations/software/grafana
   parsoid/deploy:
diff --git a/manifests/role/tessera.pp b/manifests/role/tessera.pp
new file mode 100644
index 0000000..1d02cda
--- /dev/null
+++ b/manifests/role/tessera.pp
@@ -0,0 +1,27 @@
+# == Class: role::tessera
+#
+# tessera is a dashboarding webapp for Graphite.
+# It powers <https://tessera.wikimedia.org>.
+#
+class role::tessera {
+    include ::apache::mod::headers
+    include ::apache::mod::rewrite
+    include ::apache::mod::uwsgi
+
+    include ::passwords::tessera
+
+    class { '::tessera':
+        graphite_url => 'https://graphite.wikimedia.org',
+        secret_key   => $passwords::tessera::secret_key,
+    }
+
+    apache::site { 'tessera.wikimedia.org':
+        content => template('apache/sites/tessera.wikimedia.org.erb'),
+        require => Class['::tessera'],
+    }
+
+    monitoring::service { 'tessera':
+        description   => 'tessera.wikimedia.org',
+        check_command => 'check_http_url!tessera.wikimedia.org!/',
+    }
+}
diff --git a/manifests/site.pp b/manifests/site.pp
index 17abcfa..4138ca4 100644
--- a/manifests/site.pp
+++ b/manifests/site.pp
@@ -1090,6 +1090,7 @@
     include role::graphite::production
     include role::statsdlb
     include role::gdash
+    include role::tessera
     include role::performance
     include role::graphite::production::alerts
     include role::restbase::alerts
diff --git a/modules/tessera/manifests/init.pp 
b/modules/tessera/manifests/init.pp
new file mode 100644
index 0000000..06d8ff4
--- /dev/null
+++ b/modules/tessera/manifests/init.pp
@@ -0,0 +1,117 @@
+# == Class: tessera
+#
+# Tessera is a front-end interface for Graphite, which provides a large
+# selection of presentations, layout, and interactivity options for
+# building dashboards.
+#
+# The provisioning of a web server to reverse-proxy the tessera WSGI app
+# is left to the caller. This module simply sets up tessera to listen on
+# /run/uwsgi/tessera.sock.
+#
+# A minimal setup using Apache would look like this:
+#
+#  class role::tessera {
+#    include ::apache::mod::uwsgi
+#
+#    class { 'tessera':
+#      graphite_url => 'https://graphite.wikimedia.org',
+#      secret_key   => '9IFf0HGWKAz5GYbIQHkWAr8WjbZC1r7PScFezYmXzyo',
+#    }
+#
+#    apache::site { 'tessera.wikimedia.org':
+#      content => template('apache/sites/tessera.wikimedia.org.erb'),
+#    }
+#  }
+#
+# ..with the Apache config file containing:
+#
+#  <Location />
+#    uWSGIsocket /run/uwsgi/tessera.sock
+#    SetHandler uwsgi-handler
+#  </Location>
+#
+# === Parameters
+#
+# [*graphite_url*]
+#   URL of Graphite backend. For example: 'https://graphite.wikimedia.org'.
+#
+# [*secret_key*]
+#   A secret key for this Tessera installation.
+#
+# [*sqlalchemy_database_uri*]
+#   A SQLAlchemy database URI pointing to the database Tessera should use.
+#   Default: "sqlite:////var/lib/tessera/app.db".
+#
+# === Examples
+#
+#  class { 'tessera':
+#    graphite_url            => 'https://graphite.wikimedia.org',
+#    secret_key              => '9IFf0HGWKAz5GYbIQHkWAr8WjbZC1r7PScFezYmXzyo',
+#    sqlalchemy_database_uri => 
'postgresql://scott:tiger@localhost:5432/tessera',
+#  }
+#
+class tessera(
+    $graphite_url,
+    $secret_key,
+    $sqlalchemy_database_uri = "sqlite:////var/lib/tessera/app.db",
+) {
+    require_package('python-flask-migrate')
+    require_package('python-flask-sqlalchemy')
+    require_package('python-requests')
+    require_package('python-sqlalchemy')
+
+    package { 'tessera':
+        provider => 'trebuchet',
+    }
+
+    file { '/etc/tessera':
+        ensure  => directory,
+        owner   => 'root',
+        group   => 'root',
+        mode    => '0444',
+        require => Package['tessera'],
+    }
+
+    file { '/var/lib/tessera':
+        ensure => directory,
+        owner  => 'www-data',
+        group  => 'www-data',
+        mode   => '0755',
+        before => Exec['tessera_create_db'],
+    }
+
+    file { '/etc/tessera/config.py':
+        content => template('tessera/config.py.erb'),
+        owner   => 'root',
+        group   => 'root',
+        mode    => '0444',
+        notify  => Exec['tessera_create_db'],
+        before  => Uwsgi::App['tessera'],
+    }
+
+    exec { 'tessera_create_db':
+        command     => '/usr/bin/python -c "from tessera import db; 
db.create_all()"',
+        cwd         => '/srv/tessera/tessera',
+        environment => 'TESSERA_CONFIG=/etc/tessera/config.py',
+        user        => 'www-data',
+        refreshonly => true,
+        require     => Package['tessera'],
+        before      => Uwsgi::App['tessera'],
+    }
+
+    uwsgi::app { 'tessera':
+        settings => {
+            uwsgi => {
+                'plugins'     => 'python',
+                'env'         => 'TESSERA_CONFIG=/etc/tessera/config.py',
+                'chdir'       => '/srv/tessera/tessera',
+                'module'      => 'tessera',
+                'socket'      => '/run/uwsgi/tessera.sock',
+                'callable'    => 'app',
+                'die-on-term' => true,
+                'master'      => true,
+                'processes'   => 8,
+            },
+        },
+    }
+}
diff --git a/modules/tessera/templates/config.py.erb 
b/modules/tessera/templates/config.py.erb
new file mode 100644
index 0000000..ed8be05
--- /dev/null
+++ b/modules/tessera/templates/config.py.erb
@@ -0,0 +1,5 @@
+# Configuration for Tessera, a web-based interface for Graphite.
+# See <http://urbanairship.github.io/tessera/docs/>.
+GRAPHITE_URL="<%= @graphite_url %>"
+SECRET_KEY="<%= @secret_key %>"
+SQLALCHEMY_DATABASE_URI="<%= @sqlalchemy_database_uri %>"
diff --git a/templates/apache/sites/tessera.wikimedia.org.erb 
b/templates/apache/sites/tessera.wikimedia.org.erb
new file mode 100644
index 0000000..6d4a4bd
--- /dev/null
+++ b/templates/apache/sites/tessera.wikimedia.org.erb
@@ -0,0 +1,18 @@
+# Apache configuration for tessera.wikimedia.org
+# This file is managed by Puppet.
+<VirtualHost *:80>
+    ServerName tessera.wikimedia.org
+    ServerAdmin [email protected]
+
+    RewriteEngine On
+    RewriteCond %{HTTP:X-Forwarded-Proto} !https
+    RewriteCond %{REQUEST_URI} !^/status$
+    RewriteRule ^/(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} 
[R=301,E=ProtoRedirect]
+    Header always merge Vary X-Forwarded-Proto env=ProtoRedirect
+    Header always set Strict-Transport-Security "max-age=604800"
+
+    <Location />
+        SetHandler uwsgi-handler
+        uWSGIsocket /run/uwsgi/tessera.sock
+    </Location>
+</VirtualHost>
diff --git a/templates/varnish/misc.inc.vcl.erb 
b/templates/varnish/misc.inc.vcl.erb
index 7f19853..8f48a25 100644
--- a/templates/varnish/misc.inc.vcl.erb
+++ b/templates/varnish/misc.inc.vcl.erb
@@ -14,7 +14,7 @@
                set req.backend = ytterbium;
                // No caching
                return (pass);
-       } elsif (req.http.Host == "gdash.wikimedia.org" || req.http.Host == 
"performance.wikimedia.org" || req.http.Host == "graphite.wikimedia.org") {
+       } elsif (req.http.Host == "gdash.wikimedia.org" || req.http.Host == 
"tessera.wikimedia.org" || req.http.Host == "performance.wikimedia.org" || 
req.http.Host == "graphite.wikimedia.org") {
                set req.backend = graphite1001;
        } elsif (req.http.Host == "logstash.wikimedia.org"){
                set req.backend = logstash;

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

Gerrit-MessageType: merged
Gerrit-Change-Id: I2e47c63c08492963edf3a7286032f931676519a9
Gerrit-PatchSet: 5
Gerrit-Project: operations/puppet
Gerrit-Branch: production
Gerrit-Owner: Ori.livneh <[email protected]>
Gerrit-Reviewer: Filippo Giunchedi <[email protected]>
Gerrit-Reviewer: Ori.livneh <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

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

Reply via email to