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