Yuvipanda has submitted this change and it was merged.
Change subject: Wikimetrics: Puppet module for wikimetrics
......................................................................
Wikimetrics: Puppet module for wikimetrics
- Added base.pp for new module, sets up user and config repo
- Old role class is being replaced
- Add web, queue, and scheduler service classes
Bug: T101763
(This reverts commit 3ce062a5b2ee27e833c36d4bf5152c776ad395b9)
Change-Id: I75659ac832586a45c4a184fc2f54dc3fedcf651f
---
M manifests/role/wikimetrics.pp
A modules/wikimetrics/manifests/base.pp
A modules/wikimetrics/manifests/queue.pp
A modules/wikimetrics/manifests/redis.pp
A modules/wikimetrics/manifests/scheduler.pp
A modules/wikimetrics/manifests/web.pp
A modules/wikimetrics/templates/initscripts/wikimetrics-queue.systemd.erb
A modules/wikimetrics/templates/initscripts/wikimetrics-scheduler.systemd.erb
8 files changed, 216 insertions(+), 372 deletions(-)
Approvals:
Yuvipanda: Verified; Looks good to me, approved
diff --git a/manifests/role/wikimetrics.pp b/manifests/role/wikimetrics.pp
index 41a8bcd..73987fa 100644
--- a/manifests/role/wikimetrics.pp
+++ b/manifests/role/wikimetrics.pp
@@ -1,389 +1,54 @@
# == Class role::wikimetrics
-# Installs and hosts wikimetrics.
-# NOTE: This class does not (yet) work in production!
-#
-# role::wikimetrics requires class passwords::wikimetrics to
-# exist and populated with variables.
-# passwords::wikimetrics is not a real class checked in to any repository.
-# In labs on your self hosted puppetmaster, you must do two
-# things to make this exist:
-# 1. Edit /var/lib/git/operations/puppet/manifests/passwords.pp
-# and add this class with the variables below.
-# 2. Edit /var/lib/git/operations/puppet/manifests/site.pp
-# and add an 'import "passwords.pp" line near the top.
-#
-# == Globals
-# These parameters can be set globally or via wikitech.
-# $wikimetrics_web_mode - Either 'apache' or 'daemon'. If apache,
-# wikimetrics will be run in WSGI. If
-# daemon, wikimetrics will be managed
-# as a python daemon process via upstart.
-# Default: apache
-# $wikimetrics_ssl_redirect - If true, apache will force redirect any
-# requests made to https:://$server_name...
-# This does nothing if you are running in
-# daemon mode. Default: false
-# $wikimetrics_server_name - Apache ServerName. This is not used if
-# $web_mode is daemon. Default: $::fqdn
-# $wikimetrics_server_aliases - comma separated list of Apache ServerAlias-es.
-# Default: undef
-# $wikimetrics_server_port - port on which to listen for wikimetrics web
requests.
-# If in apache mode, this defaults to 80, else
-# this defaults to 5000.
-# $wikimetrics_backup - If it the evaluates to true, backup gets set
up.
-# Otherwise, backup gets turned off.
-#
+# This is the production wikimetrics role
class role::wikimetrics {
- # wikimetrics does not yet run via puppet in production
- if $::realm == 'production' {
- fail('Cannot include role::wikimetrics in production (yet).')
- }
-
- include passwords::wikimetrics
-
- $wikimetrics_path = '/srv/wikimetrics'
-
- # Wikimetrics Database Creds
- $db_user_wikimetrics = $::passwords::wikimetrics::db_user_wikimetrics
- $db_pass_wikimetrics = $::passwords::wikimetrics::db_pass_wikimetrics
- $db_host_wikimetrics = 'localhost'
- $db_name_wikimetrics = 'wikimetrics'
-
- # Centralauth Database Creds
- $db_user_centralauth = $::passwords::wikimetrics::db_user_labsdb
- $db_pass_centralauth = $::passwords::wikimetrics::db_pass_labsdb
- $db_host_centralauth = 'labsdb1001.eqiad.wmnet'
- $db_name_centralauth = 'centralauth_p'
-
- # Use the LabsDB for editor cohort analysis
- $db_user_mediawiki = $::passwords::wikimetrics::db_user_labsdb
- $db_pass_mediawiki = $::passwords::wikimetrics::db_pass_labsdb
- $db_host_mediawiki = 'labsdb1001.eqiad.wmnet'
- $db_name_mediawiki = '{0}_p'
-
- # OAuth and Google Auth
- $flask_secret_key = $::passwords::wikimetrics::flask_secret_key
- $google_client_id = $::passwords::wikimetrics::google_client_id
- $google_client_email = $::passwords::wikimetrics::google_client_email
- $google_client_secret = $::passwords::wikimetrics::google_client_secret
- $meta_mw_consumer_key = $::passwords::wikimetrics::meta_mw_consumer_key
- $meta_mw_client_secret = $::passwords::wikimetrics::meta_mw_client_secret
-
- # base directory settings
-
- # We keep vardir under /srv so that wikimetrics
- # has enough space to write files.
- $var_directory = '/srv/var/wikimetrics'
- $public_subdirectory = 'public'
- $public_directory = "${var_directory}/${public_subdirectory}"
-
- # Run as daemon python process or in Apache WSGI.
- $web_mode = $::wikimetrics_web_mode ? {
- undef => 'apache',
- default => $::wikimetrics_web_mode,
- }
- $wikimetrics_user = 'wikimetrics'
- # Make wikimetrics group 'www-data' if running in apache mode.
- # This allows for apache to write files to wikimetrics var directories.
- $wikimetrics_group = $web_mode ? {
- 'apache' => 'www-data',
- default => 'wikimetrics',
- }
-
-
- # if the global variable $::wikimetrics_server_name is set,
- # use it as the server_name. This allows
- # configuration via the Labs Instance configuration page.
- $server_name = $::wikimetrics_server_name ? {
- undef => $::fqdn,
- default => $::wikimetrics_server_name,
- }
- $server_aliases = $::wikimetrics_server_aliases ? {
- undef => undef,
- default => split($::wikimetrics_server_aliases, ','),
- }
-
- $server_port = $::wikimetrics_server_port ? {
- # If $::wikimetrics_server_port is not set,
- # default to port 80 for apache web mode,
- # or port 5000 for daemon web mode.
- undef => $web_mode ? {
- 'apache' => 80,
- default => 5000,
- },
- default => $::wikimetrics_server_port,
- }
- $ssl_redirect = $::wikimetrics_ssl_redirect ? {
- undef => false,
- default => $::wikimetrics_ssl_redirect,
- }
-
- # If the global variable $::wikimetrics_debug is set, then
- # use it. Otherwise, default to true.
- $debug = $::wikimetrics_debug ? {
- undef => true,
- default => $::wikimetrics_debug,
- }
-
- $celery_concurrency = $debug ? {
- true => 16,
- # Run at 24 concurrency in non debug environments.
- false => 24,
- }
-
- $db_pool_wikimetrics = $debug ? {
- true => 20,
- # Run at 100 concurrency in non debug environments.
- false => 100,
- }
-
- $db_pool_mediawiki = $debug ? {
- true => 32,
- # Run at 200 concurrency in non debug environments.
- false => 200,
- }
-
- # need pip :/
- if !defined(Package['python-pip']) {
- package { 'python-pip':
- ensure => 'installed',
- }
- }
- # Put data on /srv so it has room to grow
- include role::labs::lvm::srv
-
- # Make sure /srv/var exists.
- # The wikimetrics module will manage $var_directory.
- if !defined(File['/srv/var']) {
- file { '/srv/var':
- ensure => 'directory',
- mode => '0755',
- owner => 'root',
- group => 'root',
- require => Labs_lvm::Volume['second-local-disk'],
- before => Class['::wikimetrics'],
- }
- }
-
-
- # Setup mysql, put data in /srv
- class { 'mysql::server':
- config_hash => {
- 'datadir' => '/srv/mysql'
- },
- before => Class['::wikimetrics::database'],
- require => Labs_lvm::Volume['second-local-disk']
- }
-
- class { '::wikimetrics':
- path => $wikimetrics_path,
- user => $wikimetrics_user,
- group => $wikimetrics_group,
-
- # clone wikimetrics as root user so it can write to /srv
- repository_owner => 'root',
-
- debug => $debug,
-
- server_name => $server_name,
- server_aliases => $server_aliases,
- server_port => $server_port,
- ssl_redirect => $ssl_redirect,
- celery_concurrency => $celery_concurrency,
-
- flask_secret_key => $flask_secret_key,
- google_client_id => $google_client_id,
- google_client_email => $google_client_email,
- google_client_secret => $google_client_secret,
- meta_mw_consumer_key => $meta_mw_consumer_key,
- meta_mw_client_secret => $meta_mw_client_secret,
-
- db_user_wikimetrics => $db_user_wikimetrics,
- db_pass_wikimetrics => $db_pass_wikimetrics,
- db_host_wikimetrics => $db_host_wikimetrics,
- db_name_wikimetrics => $db_name_wikimetrics,
- db_pool_wikimetrics => $db_pool_wikimetrics,
-
- db_user_centralauth => $db_user_centralauth,
- db_pass_centralauth => $db_pass_centralauth,
- db_host_centralauth => $db_host_centralauth,
- db_name_centralauth => $db_name_centralauth,
-
- db_user_mediawiki => $db_user_mediawiki,
- db_pass_mediawiki => $db_pass_mediawiki,
- db_host_mediawiki => $db_host_mediawiki,
- db_name_mediawiki => $db_name_mediawiki,
- db_pool_mediawiki => $db_pool_mediawiki,
- db_replication_lag_dbs => [
- 'enwiki', # s1
- 'eowiki', # s2
- 'elwiki', # s3
- 'commonswiki', # s4
- 'dewiki', # s5
- 'frwiki', # s6
- 'eswiki', # s7
- ],
- db_replication_lag_threshold => 3,
-
- # wikimetrics runs on the LabsDB usually,
- # where the archive and revision tables have _userindex variants
- # These are preferable to use for performance reasons
- revision_tablename => 'revision_userindex',
- archive_tablename => 'archive_userindex',
-
- var_directory => $var_directory,
- public_subdirectory => $public_subdirectory,
-
- require => Labs_lvm::Volume['second-local-disk'],
- }
-
- # Run the wikimetrics/scripts/install script
- # in order to pip install proper dependencies.
- # Note: This is not in the wikimetrics puppet module
- # because it is an improper way to do things in
- # WMF production.
- exec { 'install_wikimetrics_dependencies':
- command => "${wikimetrics_path}/scripts/install ${wikimetrics_path}",
- creates => '/usr/local/bin/wikimetrics',
- path => '/usr/local/bin:/usr/bin:/bin',
- user => 'root',
- require => [Package['python-pip'], Class['::wikimetrics']],
- }
-
- class { '::wikimetrics::database':
- require => Exec['install_wikimetrics_dependencies'],
- }
-
- # The redis module by default sets up redis in /a. Oh well!
- if !defined(File['/a']) {
- file { '/a':
- ensure => directory,
- before => Class['::wikimetrics::queue']
- }
- }
-
- # Install redis and use a custom config template.
- # Wikimetrics needs redis to save data for longer
- # than the default redis.conf.erb template allows.
- $redis_dir = '/a/redis'
- $redis_dbfilename = "${hostname}-6379.rdb"
-
-
- redis::instance { 6379:
- settings => {
- dbfilename => "${::hostname}-${port}.rdb",
- dir => '/srv/redis',
- maxmemory => '1Gb',
- maxmemory_policy => 'volatile-lru',
- maxmemory_samples => 5,
- no_appendfsync_on_rewrite => true,
- save => '60 20',
- slave_read_only => false,
- },
- }
-
- # TODO: Support installation of queue, web and database
- # classes on different nodes (maybe?).
- class { '::wikimetrics::queue':
- require => [
- Exec['install_wikimetrics_dependencies'],
- ],
- }
+ include ::wikimetrics::base
class { '::wikimetrics::web':
- mode => $web_mode,
- require => Exec['install_wikimetrics_dependencies'],
+ workers => 4,
+ }
+
+ class { '::wikimetrics::redis':
+ queue_maxmemory => '1Gb',
+ }
+
+ class { '::wikimetrics::queue':
+ require => Class['::wikimetrics::redis']
}
class { '::wikimetrics::scheduler':
- require => Exec['install_wikimetrics_dependencies'],
+ require => Class['::wikimetrics::redis']
+ }
+}
+
+# == Class role::wikimetrics::staging
+# This is the staging specific wikimetrics role
+class role::wikimetrics::staging {
+ include ::wikimetrics::base
+
+ # The mysql server is only included in staging role
+ # This is because we are setting up local databases in staging for
+ # testing purposes but using the labsdb for the production role.
+ # Labsdb gives us automatic backups and keeps our instance nfs free.
+ class { '::mysql::server':
+ config_hash => {
+ 'datadir' => '/srv/mysql',
+ 'bind_address' => '127.0.0.1',
+ },
}
- # backup regardless of whether we are in debug mode or not
- if $::wikimetrics_backup {
- $backup_ensure = 'present'
- } else {
- $backup_ensure = 'absent'
- }
- class { '::wikimetrics::backup':
- ensure => $backup_ensure,
- destination => "/data/project/wikimetrics/backup/${::hostname}",
- db_user => $db_user_wikimetrics,
- db_pass => $db_pass_wikimetrics,
- db_name => $db_name_wikimetrics,
- db_host => $db_host_wikimetrics,
- redis_db_file => "${redis_dir}/${redis_dbfilename}",
- public_files => $public_directory,
- keep_days => 10,
+ class { '::wikimetrics::web':
+ workers => 1,
}
- # Get aggregated projectcounts files from git repo
- # Note that this repo is for legacy projectcounts
- # It should be analytics/aggregator/projectcounts/data.git
- # but we keep it as is from legacy.
- $aggregator_projectcounts_data_directory =
'/srv/aggregator-projectcounts-data'
- git::clone { 'aggregator_projectcounts_data':
- ensure => 'latest',
- directory => $aggregator_projectcounts_data_directory,
- origin =>
'https://gerrit.wikimedia.org/r/p/analytics/aggregator/data.git',
- owner => $wikimetrics_user,
- group => $wikimetrics_group,
+ class { '::wikimetrics::redis':
+ queue_maxmemory => '1Gb',
}
- # Get aggregated projectview files from git repo
- $aggregator_projectview_data_directory = '/srv/aggregator-projectview-data'
- git::clone { 'aggregator_projectview_data':
- ensure => 'latest',
- directory => $aggregator_projectview_data_directory,
- origin =>
'https://gerrit.wikimedia.org/r/p/analytics/aggregator/projectview/data.git',
- owner => $wikimetrics_user,
- group => $wikimetrics_group,
+ class { '::wikimetrics::queue':
+ require => Class['::wikimetrics::redis']
}
- # Create public datafiles folder
- file { "${public_directory}/datafiles":
- ensure => 'directory',
- owner => $wikimetrics_user,
- group => $wikimetrics_group,
- require => File[$public_directory],
- }
-
- # Link public DailyPageviews_legacy folder to
aggregator_projectcounts_data folder
- file { "${public_directory}/datafiles/LegacyPageviews":
- ensure => 'link',
- target =>
"${aggregator_projectcounts_data_directory}/projectcounts/daily",
- owner => $wikimetrics_user,
- group => $wikimetrics_group,
- require => File["${public_directory}/datafiles"]
- }
-
- # Link public DailyPageviews folder to aggregator_projectview_data folder
- file { "${public_directory}/datafiles/Pageviews":
- ensure => 'link',
- target =>
"${aggregator_projectview_data_directory}/projectview/daily",
- owner => $wikimetrics_user,
- group => $wikimetrics_group,
- require => File["${public_directory}/datafiles"]
- }
-
- # Using logster to send wikimetrics stats to statsd -> graphite.
- # hardcoded labs statsdhost: labmon1001.eqiad.wmnet
- # crontab should run once a day at 23 hours
- if !$debug {
- logster::job { 'wikimetrics-apache-requests':
- minute => '0',
- hour => '23',
- parser => 'LineCountLogster',
- logfile => '/var/log/apache2/access.wikimetrics.log',
- logster_options => "-o statsd
--statsd-host=labmon1001.eqiad.wmnet:8125
--metric-prefix='analytics.wikimetrics.requests.ui' --parser-options
'--regex=.*(report|cohort|metrics|login|about|contact).*'"
- }
-
- logster::job { 'wikimetrics-number-of-successful-reports':
- minute => '10',
- hour => '23',
- parser => 'LineCountLogster',
- logfile => '/var/log/apache2/access.wikimetrics.log',
- logster_options => "-o statsd
--statsd-host=labmon1001.eqiad.wmnet:8125
--metric-prefix='analytics.wikimetrics.successful_reports' --parser-options
'--regex=.* succeeded .*'"
- }
+ class { '::wikimetrics::scheduler':
+ require => Class['::wikimetrics::redis']
}
}
diff --git a/modules/wikimetrics/manifests/base.pp
b/modules/wikimetrics/manifests/base.pp
new file mode 100644
index 0000000..e168358
--- /dev/null
+++ b/modules/wikimetrics/manifests/base.pp
@@ -0,0 +1,69 @@
+# == Class: wikimetrics
+# This class sets up the wikimetrics user and the deploy repo
+#
+class wikimetrics::base (
+ $branch = 'master',
+) {
+
+ $user = 'wikimetrics'
+ $group = 'wikimetrics'
+ $venv_path = '/srv/wikimetrics/venv'
+ $config_path = '/srv/wikimetrics/config'
+ $source_path = '/srv/wikimetrics/src'
+
+ # We use virtualenv and pip install requirements because not all of them
+ # have debian packages available
+ ensure_packages(['virtualenv', 'gcc', 'python-dev', 'libmysqlclient-dev'])
+
+ group { $group:
+ ensure => 'present',
+ system => true,
+ }
+
+ user { $user:
+ ensure => 'present',
+ gid => $group,
+ shell => '/bin/false',
+ home => '/nonexistent',
+ managehome => false,
+ system => true,
+ }
+
+ file { '/srv':
+ ensure => directory,
+ owner => 'root',
+ group => 'root',
+ mode => '0775',
+ }
+
+ file { '/srv/wikimetrics':
+ ensure => directory,
+ owner => $user,
+ group => $group,
+ mode => '0775',
+ require => [File['/srv'], User[$user], Group[$group]],
+ }
+
+ # Setup the deployment repository
+ git::clone { 'wikimetrics-deploy':
+ ensure => present,
+ origin =>
'https://gerrit.wikimedia.org/r/analytics/wikimetrics-deploy',
+ directory => $config_path,
+ branch => $branch,
+ owner => $user,
+ group => $group,
+ require => File['/srv/wikimetrics'],
+ }
+
+ # Setup the source repository
+ git::clone { 'wikimetrics':
+ ensure => present,
+ origin => 'https://gerrit.wikimedia.org/r/analytics/wikimetrics',
+ directory => $source_path,
+ branch => $branch,
+ owner => $user,
+ group => $group,
+ require => File['/srv/wikimetrics'],
+ }
+
+}
diff --git a/modules/wikimetrics/manifests/queue.pp
b/modules/wikimetrics/manifests/queue.pp
new file mode 100644
index 0000000..c019d6d
--- /dev/null
+++ b/modules/wikimetrics/manifests/queue.pp
@@ -0,0 +1,15 @@
+# == Class: wikimetrics::queue
+# Sets up the celery queue for wikimetrics
+# This is done by launching the wikimetrics init script,
+# with the queue mode and passing relevant config files
+
+class wikimetrics::queue {
+ require wikimetrics::base
+
+ $config_path = $::wikimetrics::base::config_path
+ $venv_path = $::wikimetrics::base::venv_path
+
+ base::service_unit { 'wikimetrics-queue':
+ systemd => true,
+ }
+}
diff --git a/modules/wikimetrics/manifests/redis.pp
b/modules/wikimetrics/manifests/redis.pp
new file mode 100644
index 0000000..ad3c939
--- /dev/null
+++ b/modules/wikimetrics/manifests/redis.pp
@@ -0,0 +1,24 @@
+# == Class: wikimetrics::redis
+# Sets up redis for use by wikimetrics queue and scheduler
+
+class wikimetrics::redis(
+ $queue_maxmemory = '1Gb',
+) {
+
+ file {'/srv/redis/queue':
+ ensure => directory,
+ owner => 'redis',
+ group => 'redis',
+ mode => '0774'
+ }
+
+ redis::instance { '6379':
+ settings => {
+ bind => '0.0.0.0',
+ dir => '/srv/redis/queue',
+ maxmemory => $queue_maxmemory,
+ tcp_keepalive => 60,
+ },
+ require => File['/srv/redis/queue']
+ }
+}
diff --git a/modules/wikimetrics/manifests/scheduler.pp
b/modules/wikimetrics/manifests/scheduler.pp
new file mode 100644
index 0000000..7b3e03d
--- /dev/null
+++ b/modules/wikimetrics/manifests/scheduler.pp
@@ -0,0 +1,16 @@
+# == Class: wikimetrics::scheduler
+# Sets up the celery beat based scheduler for wikimetrics
+# This is done by launching the wikimetrics init script,
+# with the scheduler mode and passing relevant config files.
+# The scheduler runs recurrent reports
+
+class wikimetrics::scheduler {
+ require wikimetrics::base
+
+ $config_path = $::wikimetrics::base::config_path
+ $venv_path = $::wikimetrics::base::venv_path
+
+ base::service_unit { 'wikimetrics-scheduler':
+ systemd => true,
+ }
+}
diff --git a/modules/wikimetrics/manifests/web.pp
b/modules/wikimetrics/manifests/web.pp
new file mode 100644
index 0000000..fddbd0f
--- /dev/null
+++ b/modules/wikimetrics/manifests/web.pp
@@ -0,0 +1,24 @@
+# == Class: wikimetrics::web
+# Sets up a uwsgi based web server for Wikimetrics
+
+class wikimetrics::web(
+ $workers = 1,
+) {
+ require wikimetrics::base
+
+ uwsgi::app { 'wikimetrics-web':
+ settings => {
+ uwsgi => {
+ plugins => 'python, router_redirect',
+ 'wsgi-file' =>
"${wikimetrics::base::source_path}/wikimetrics/api.wsgi",
+ master => true,
+ chdir => $wikimetrics::base::source_path,
+ http-socket => '0.0.0.0:8080',
+ venv => $wikimetrics::base::venv_path,
+ processes => $workers,
+ # Look at the X_FORWARDED_PROTO, and if it's http, redirect to
https
+ route-if => "equal:${HTTP_X_FORWARDED_PROTO};http
redirect-permanent:https://${HTTP_HOST}${REQUEST_URI}",
+ }
+ }
+ }
+}
diff --git
a/modules/wikimetrics/templates/initscripts/wikimetrics-queue.systemd.erb
b/modules/wikimetrics/templates/initscripts/wikimetrics-queue.systemd.erb
new file mode 100644
index 0000000..0657b65
--- /dev/null
+++ b/modules/wikimetrics/templates/initscripts/wikimetrics-queue.systemd.erb
@@ -0,0 +1,15 @@
+[Unit]
+Description=wikimetrics queue
+
+[Service]
+# Launching the wikimetrics script with the queue mode launches the celery
task queue
+ExecStart=<%= @venv_path %>/bin/wikimetrics \
+ --mode=queue \
+ --db-config=<%= @config_path %>/db_config.yaml \
+ --queue-config=<%= @config_path %>/queue_config.yaml \
+ --web-config=<%= @config_path %>/web_config.yaml
+User = wikimetrics
+Group = wikimetrics
+
+[Install]
+WantedBy=multi-user.target
diff --git
a/modules/wikimetrics/templates/initscripts/wikimetrics-scheduler.systemd.erb
b/modules/wikimetrics/templates/initscripts/wikimetrics-scheduler.systemd.erb
new file mode 100644
index 0000000..532bc77
--- /dev/null
+++
b/modules/wikimetrics/templates/initscripts/wikimetrics-scheduler.systemd.erb
@@ -0,0 +1,16 @@
+[Unit]
+Description=wikimetrics scheduler
+
+[Service]
+# Launching the wikimetrics script with the scheduler mode launches the
+# celery beat based scheduler for running recurrent reports
+ExecStart=<%= @venv_path %>/bin/wikimetrics \
+ --mode=scheduler \
+ --db-config=<%= @config_path %>/db_config.yaml \
+ --queue-config=<%= @config_path %>/queue_config.yaml \
+ --web-config=<%= @config_path %>/web_config.yaml
+User = wikimetrics
+Group = wikimetrics
+
+[Install]
+WantedBy=multi-user.target
--
To view, visit https://gerrit.wikimedia.org/r/264134
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I75659ac832586a45c4a184fc2f54dc3fedcf651f
Gerrit-PatchSet: 4
Gerrit-Project: operations/puppet
Gerrit-Branch: production
Gerrit-Owner: Yuvipanda <[email protected]>
Gerrit-Reviewer: Madhuvishy <[email protected]>
Gerrit-Reviewer: Yuvipanda <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits