BBlack has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/324942 )

Change subject: VCL refactor: split cache/app backend support
......................................................................


VCL refactor: split cache/app backend support

This splits the old "directors" aka "varnish_directors" into two
distinct subsets "backend_caches" and "app_directors", with
separate requirements, defaults, and supporting code for their
simplified use-cases.

Keys "type" and "dynamic" removed from all types of director
definitions.  Type is always random for app, always the pair of
vslp+random defs for cache.  Dynamic is always false for app and
true for backend cache.

backend_caches assumes a bunch of things:
* dynamic from conftool
** (except when disabled for e.g. beta / cp1008 / varnishtest)
* vslp for primary director, plus auto-generated _random director
* always array-form "backends"
* always probe "varnish"

app_director assumes:
* static config
* singular "backend" host, using "random" director
* no probe

Other random simplifications ensued as well, including getting rid
of the fake/additional conftool service "varnish-be-rand".  Both
vslp and random directors now use "varnish-be" as it should be.

Bug: T110717
Change-Id: I8053dcf318cb31576d16b4360c8a4836ca9ef11e
---
M hieradata/hosts/cp1008.yaml
M hieradata/labs.yaml
M modules/role/manifests/cache/instances.pp
M modules/role/manifests/cache/maps.pp
M modules/role/manifests/cache/misc.pp
M modules/role/manifests/cache/text.pp
M modules/role/manifests/cache/upload.pp
M modules/varnish/manifests/common/directors.pp
M modules/varnish/manifests/instance.pp
M modules/varnish/manifests/wikimedia_vcl.pp
M modules/varnish/templates/vcl/directors.vcl.tpl.erb
M modules/varnish/templates/vcl/wikimedia-common.inc.vcl.erb
12 files changed, 145 insertions(+), 246 deletions(-)

Approvals:
  BBlack: Verified; Looks good to me, approved



diff --git a/hieradata/hosts/cp1008.yaml b/hieradata/hosts/cp1008.yaml
index 13a26b6..b07ce38 100644
--- a/hieradata/hosts/cp1008.yaml
+++ b/hieradata/hosts/cp1008.yaml
@@ -1,7 +1,7 @@
 debdeploy::grains:
   debdeploy-cp:
     value: canary
-varnish::dynamic_directors: false
+varnish::dynamic_backend_caches: false
 cache::text::nodes:
     eqiad:
       - 'cp1008.wikimedia.org'
diff --git a/hieradata/labs.yaml b/hieradata/labs.yaml
index cb9b193..000fa7d 100644
--- a/hieradata/labs.yaml
+++ b/hieradata/labs.yaml
@@ -98,7 +98,7 @@
 role::cache::base::storage_parts:
   - vdb
   - vdb
-varnish::dynamic_directors: false
+varnish::dynamic_backend_caches: false
 
 swift::proxy::tld: 'beta.wmflabs.org'
 
diff --git a/modules/role/manifests/cache/instances.pp 
b/modules/role/manifests/cache/instances.pp
index a334ba9..52058ad 100644
--- a/modules/role/manifests/cache/instances.pp
+++ b/modules/role/manifests/cache/instances.pp
@@ -15,8 +15,6 @@
     $cluster_nodes
 ) {
 
-    $chash_dir = 'vslp'
-
     $cache_route_table = hiera('cache::route_table')
     $cache_route = $cache_route_table[$::site]
 
@@ -30,34 +28,14 @@
 
     $backend_caches = {
         'cache_eqiad' => {
-            'dynamic'  => 'yes',
-            'type'     => $chash_dir,
             'dc'       => 'eqiad',
             'service'  => 'varnish-be',
-            'backends' => $cluster_nodes['eqiad'],
-            'be_opts'  => $be_cache_be_opts,
-        },
-        'cache_eqiad_random' => {
-            'dynamic'  => 'yes',
-            'type'     => 'random',
-            'dc'       => 'eqiad',
-            'service'  => 'varnish-be-rand',
             'backends' => $cluster_nodes['eqiad'],
             'be_opts'  => $be_cache_be_opts,
         },
         'cache_codfw' => {
-            'dynamic'  => 'yes',
-            'type'     => $chash_dir,
             'dc'       => 'codfw',
             'service'  => 'varnish-be',
-            'backends' => $cluster_nodes['codfw'],
-            'be_opts'  => $be_cache_be_opts,
-        },
-        'cache_codfw_random' => {
-            'dynamic'  => 'yes',
-            'type'     => 'random',
-            'dc'       => 'codfw',
-            'service'  => 'varnish-be-rand',
             'backends' => $cluster_nodes['codfw'],
             'be_opts'  => $be_cache_be_opts,
         },
@@ -73,7 +51,6 @@
     }
 
     $our_backend_caches = hash_deselect_re("^cache_${::site}", 
$becaches_filtered)
-    $be_directors = merge($app_directors, $our_backend_caches)
 
     varnish::instance { "${title}-backend":
         name               => '',
@@ -85,7 +62,8 @@
         runtime_parameters => $be_runtime_params,
         storage            => $be_storage,
         vcl_config         => $be_vcl_config,
-        directors          => $be_directors,
+        app_directors      => $app_directors,
+        backend_caches     => $our_backend_caches,
     }
 
     # lint:ignore:arrow_alignment
@@ -99,20 +77,10 @@
         runtime_parameters => $fe_runtime_params,
         storage            => "-s malloc,${fe_mem_gb}G",
         jemalloc_conf      => $fe_jemalloc_conf,
-        directors          => {
+        backend_caches     => {
             'cache_local' => {
-                'dynamic'  => 'yes',
-                'type'     => $chash_dir,
                 'dc'       => $::site,
                 'service'  => 'varnish-be',
-                'backends' => $cluster_nodes[$::site],
-                'be_opts'  => $fe_cache_be_opts,
-            },
-            'cache_local_random' => {
-                'dynamic'  => 'yes',
-                'type'     => 'random',
-                'dc'       => $::site,
-                'service'  => 'varnish-be-rand',
                 'backends' => $cluster_nodes[$::site],
                 'be_opts'  => $fe_cache_be_opts,
             },
diff --git a/modules/role/manifests/cache/maps.pp 
b/modules/role/manifests/cache/maps.pp
index 2dab52b..90f40eb 100644
--- a/modules/role/manifests/cache/maps.pp
+++ b/modules/role/manifests/cache/maps.pp
@@ -36,9 +36,7 @@
     $apps = hiera('cache::maps::apps')
     $app_directors = {
         'kartotherian'   => {
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => 
$apps['kartotherian']['backends'][$apps['kartotherian']['route']],
+            'backend' => 
$apps['kartotherian']['backends'][$apps['kartotherian']['route']],
             'be_opts' => {
                 'port'                  => 6533,
                 'connect_timeout'       => '5s',
diff --git a/modules/role/manifests/cache/misc.pp 
b/modules/role/manifests/cache/misc.pp
index a7b9229..2b7000b 100644
--- a/modules/role/manifests/cache/misc.pp
+++ b/modules/role/manifests/cache/misc.pp
@@ -43,16 +43,12 @@
     #
     $app_directors = {
         'analytics1027' => { # Hue (Hadoop GUI)
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => ['analytics1027.eqiad.wmnet'],
+            'backend'  => 'analytics1027.eqiad.wmnet',
             'be_opts'  => merge($app_def_be_opts, { 'port' => 8888 }),
             'req_host' => 'hue.wikimedia.org',
         },
         'bromine' => { # ganeti VM for misc. static HTML sites
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => ['bromine.eqiad.wmnet'],
+            'backend'  => 'bromine.eqiad.wmnet',
             'be_opts'  => $app_def_be_opts,
             'req_host' => [
                 'static-bugzilla.wikimedia.org',
@@ -64,16 +60,12 @@
             ],
         },
         'bohrium' => {
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => ['bohrium.eqiad.wmnet'],
+            'backend'  => 'bohrium.eqiad.wmnet',
             'be_opts'  => $app_def_be_opts,
             'req_host' => 'piwik.wikimedia.org',
         },
         'californium' => {
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => ['californium.wikimedia.org'],
+            'backend'  => 'californium.wikimedia.org',
             'be_opts'  => $app_def_be_opts,
             'req_host' => [
                 'horizon.wikimedia.org',
@@ -81,44 +73,32 @@
             ],
         },
         'darmstadtium' => {
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => ['darmstadtium.eqiad.wmnet'],
+            'backend'  => 'darmstadtium.eqiad.wmnet',
             'be_opts'  => merge($app_def_be_opts, {'port' => 81, 
'max_connections' => 5}),
             'req_host' => 'docker-registry.wikimedia.org',
         },
         'labtestweb2001' => {
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => ['labtestweb2001.wikimedia.org'],
+            'backend'  => 'labtestweb2001.wikimedia.org',
             'be_opts'  => $app_def_be_opts,
             'req_host' => 'labtesthorizon.wikimedia.org',
         },
         'labtestspice' => {
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => ['labtestcontrol2001.wikimedia.org'],
+            'backend'  => 'labtestcontrol2001.wikimedia.org',
             'be_opts'  => merge($app_def_be_opts, { 'port' => 6082 }),
             'req_host' => 'labtestspice.wikimedia.org',
         },
         'labspice' => {
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => ['labcontrol1001.wikimedia.org'],
+            'backend'  => 'labcontrol1001.wikimedia.org',
             'be_opts'  => merge($app_def_be_opts, { 'port' => 6082 }),
             'req_host' => 'labspice.wikimedia.org',
         },
         'etherpad1001' => {
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => ['etherpad1001.eqiad.wmnet'],
+            'backend'  => 'etherpad1001.eqiad.wmnet',
             'be_opts'  => merge($app_def_be_opts, { 'port' => 9001 }),
             'req_host' => 'etherpad.wikimedia.org',
         },
         'contint1001' => { # CI server
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => ['contint1001.wikimedia.org' ],
+            'backend'  => 'contint1001.wikimedia.org',
             'be_opts'  => $app_def_be_opts,
             'req_host' => [
                 'doc.wikimedia.org',
@@ -126,9 +106,7 @@
             ],
         },
         'graphite1001' => {
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => ['graphite1001.eqiad.wmnet'],
+            'backend'  => 'graphite1001.eqiad.wmnet',
             'be_opts'  => $app_def_be_opts,
             'req_host' => [
                 'performance.wikimedia.org',
@@ -136,9 +114,7 @@
             ],
         },
         'iridium' => { # main phab
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => ['iridium.eqiad.wmnet'],
+            'backend'  => 'iridium.eqiad.wmnet',
             'be_opts'  => $app_def_be_opts,
             'req_host' => [
                 'phabricator.wikimedia.org',
@@ -149,9 +125,7 @@
             ],
         },
         'krypton' => { # ganeti VM for misc. PHP apps
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => ['krypton.eqiad.wmnet'],
+            'backend'  => 'krypton.eqiad.wmnet',
             'be_opts'  => $app_def_be_opts,
             'req_host' => [
                 'scholarships.wikimedia.org',
@@ -162,9 +136,7 @@
             ],
         },
         'labmon1001' => {
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => ['labmon1001.eqiad.wmnet'],
+            'backend'  => 'labmon1001.eqiad.wmnet',
             'be_opts'  => $app_def_be_opts,
             'req_host' => [
                 'grafana-labs.wikimedia.org',
@@ -173,9 +145,7 @@
             ],
         },
         'netmon1001' => { # servermon
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => ['netmon1001.wikimedia.org'],
+            'backend'  => 'netmon1001.wikimedia.org',
             'be_opts'  => $app_def_be_opts,
             'req_host' => [
                 'servermon.wikimedia.org',
@@ -184,9 +154,7 @@
             ],
         },
         'noc' => { # noc.wikimedia.org and dbtree.wikimedia.org
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => ['terbium.eqiad.wmnet'],
+            'backend'  => 'terbium.eqiad.wmnet',
             'be_opts'  => $app_def_be_opts,
             'req_host' => [
                 'noc.wikimedia.org',
@@ -194,45 +162,33 @@
             ],
         },
         'planet1001' => {
-            'dynamic'     => 'no',
-            'type'        => 'random',
-            'backends'    => ['planet1001.eqiad.wmnet'],
+            'backend'     => 'planet1001.eqiad.wmnet',
             'be_opts'     => $app_def_be_opts,
             'req_host_re' => '^([^.]+\.)?planet\.wikimedia\.org$'
         },
         'pybal_config' => {
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => ['puppetmaster1001.eqiad.wmnet'],
+            'backend'  => 'puppetmaster1001.eqiad.wmnet',
             'be_opts'  => $app_def_be_opts,
             'req_host' => 'config-master.wikimedia.org',
         },
         'rcstream' => {
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => ['rcs1001.eqiad.wmnet'],
-            # 'backends' => ['rcs1002.eqiad.wmnet'], # manual backup option if 
1001 fails
+            'backend'  => 'rcs1001.eqiad.wmnet',
+            # 'backend'  => 'rcs1002.eqiad.wmnet', # manual backup option if 
1001 fails
             'be_opts'  => merge($app_def_be_opts, { max_connections => 1000 }),
             'req_host' => 'stream.wikimedia.org',
         },
         'ruthenium' => { # parsoid rt test server
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => ['ruthenium.eqiad.wmnet'],
+            'backend'  => 'ruthenium.eqiad.wmnet',
             'be_opts'  => merge($app_def_be_opts, { 'port' => 8001 }),
             'req_host' => 'parsoid-tests.wikimedia.org',
         },
         'rutherfordium' => { # people.wikimedia.org
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => ['rutherfordium.eqiad.wmnet'],
+            'backend'  => 'rutherfordium.eqiad.wmnet',
             'be_opts'  => $app_def_be_opts,
             'req_host' => 'people.wikimedia.org',
         },
         'stat1001' => { # metrics and metrics-api
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => ['stat1001.eqiad.wmnet'],
+            'backend'  => 'stat1001.eqiad.wmnet',
             'be_opts'  => $app_def_be_opts,
             'req_host' => [
                 'metrics.wikimedia.org',
@@ -244,37 +200,27 @@
             ],
         },
         'ununpentium' => { # rt.wikimedia.org
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => ['ununpentium.wikimedia.org'],
+            'backend'  => 'ununpentium.wikimedia.org',
             'be_opts'  => $app_def_be_opts,
             'req_host' => 'rt.wikimedia.org',
         },
         'mendelevium' => { # OTRS
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => ['mendelevium.eqiad.wmnet'],
+            'backend'  => 'mendelevium.eqiad.wmnet',
             'be_opts'  => $app_def_be_opts,
             'req_host' => 'ticket.wikimedia.org',
         },
         'logstash_director' => {
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => [ 'kibana.svc.eqiad.wmnet' ],
+            'backend'  => 'kibana.svc.eqiad.wmnet',
             'be_opts'  => $app_def_be_opts,
             'req_host' => 'logstash.wikimedia.org',
         },
         'wdqs_director' => {
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => [ 'wdqs.svc.eqiad.wmnet', ],
+            'backend'  => 'wdqs.svc.eqiad.wmnet',
             'be_opts'  => $app_def_be_opts,
             'req_host' => 'query.wikidata.org',
         },
         'ores' => {
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => [ 'ores.svc.eqiad.wmnet', ],
+            'backend'  => 'ores.svc.eqiad.wmnet',
             'be_opts'  => merge($app_def_be_opts, { 'port' => 8081 }),
             'req_host' => 'ores.wikimedia.org',
         },
diff --git a/modules/role/manifests/cache/text.pp 
b/modules/role/manifests/cache/text.pp
index 165f62b..249c76d 100644
--- a/modules/role/manifests/cache/text.pp
+++ b/modules/role/manifests/cache/text.pp
@@ -49,51 +49,35 @@
     $apps = hiera('cache::text::apps')
     $app_directors = {
         'appservers'       => {
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => 
$apps['appservers']['backends'][$apps['appservers']['route']],
+            'backend' => 
$apps['appservers']['backends'][$apps['appservers']['route']],
             'be_opts'  => $app_def_be_opts,
         },
         'api'              => {
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => $apps['api']['backends'][$apps['api']['route']],
+            'backend' => $apps['api']['backends'][$apps['api']['route']],
             'be_opts'  => $app_def_be_opts,
         },
         'rendering'        => {
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => 
$apps['rendering']['backends'][$apps['rendering']['route']],
+            'backend' => 
$apps['rendering']['backends'][$apps['rendering']['route']],
             'be_opts'  => $app_def_be_opts,
         },
         'security_audit'   => {
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => 
$apps['security_audit']['backends'][$apps['security_audit']['route']],
+            'backend' => 
$apps['security_audit']['backends'][$apps['security_audit']['route']],
             'be_opts'  => $app_def_be_opts,
         },
         'appservers_debug'   => {
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => 
$apps['appservers_debug']['backends'][$apps['appservers_debug']['route']],
+            'backend' => 
$apps['appservers_debug']['backends'][$apps['appservers_debug']['route']],
             'be_opts'  => merge($app_def_be_opts, { 'max_connections' => 20 }),
         },
         'restbase_backend' => {
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => 
$apps['restbase']['backends'][$apps['restbase']['route']],
+            'backend' => 
$apps['restbase']['backends'][$apps['restbase']['route']],
             'be_opts'  => merge($app_def_be_opts, { 'port' => 7231, 
'max_connections' => 5000 }),
         },
         'cxserver_backend' => { # LEGACY: should be removed eventually
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => 
$apps['cxserver']['backends'][$apps['cxserver']['route']],
+            'backend' => 
$apps['cxserver']['backends'][$apps['cxserver']['route']],
             'be_opts'  => merge($app_def_be_opts, { 'port' => 8080 }),
         },
         'citoid_backend'   => { # LEGACY: should be removed eventually
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => 
$apps['citoid']['backends'][$apps['citoid']['route']],
+            'backend' => $apps['citoid']['backends'][$apps['citoid']['route']],
             'be_opts'  => merge($app_def_be_opts, { 'port' => 1970 }),
         },
     }
diff --git a/modules/role/manifests/cache/upload.pp 
b/modules/role/manifests/cache/upload.pp
index 80f722b..79b07d6 100644
--- a/modules/role/manifests/cache/upload.pp
+++ b/modules/role/manifests/cache/upload.pp
@@ -38,9 +38,7 @@
     $apps = hiera('cache::upload::apps')
     $app_directors = {
         'swift'   => {
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => $apps['swift']['backends'][$apps['swift']['route']],
+            'backend' => $apps['swift']['backends'][$apps['swift']['route']],
             'be_opts'  => {
                 'port'                  => 80,
                 'connect_timeout'       => '5s',
@@ -49,9 +47,7 @@
             }
         },
         'swift_thumbs'   => {
-            'dynamic'  => 'no',
-            'type'     => 'random',
-            'backends' => 
$apps['swift_thumbs']['backends'][$apps['swift_thumbs']['route']],
+            'backend' => 
$apps['swift_thumbs']['backends'][$apps['swift_thumbs']['route']],
             'be_opts'  => {
                 'port'                  => 80,
                 'connect_timeout'       => '5s',
diff --git a/modules/varnish/manifests/common/directors.pp 
b/modules/varnish/manifests/common/directors.pp
index f832ec7..b217840 100644
--- a/modules/varnish/manifests/common/directors.pp
+++ b/modules/varnish/manifests/common/directors.pp
@@ -21,7 +21,7 @@
     $group = hiera('cluster', $::cluster)
 
     # 
https://bibwild.wordpress.com/2012/04/12/ruby-hash-select-1-8-7-and-1-9-3-simultaneously-compatible/
-    $keyspaces_str = inline_template("<%= Hash[ @directors.select{ |_k, v| 
v['dynamic'] == 'yes' } ].values.map{ |v| 
\"#{@conftool_namespace}/#{v['dc']}/#{@group}/#{v['service']}\" }.join('|') %>")
+    $keyspaces_str = inline_template("<%= @directors.values.map{ |v| 
\"#{@conftool_namespace}/#{v['dc']}/#{@group}/#{v['service']}\" }.join('|') %>")
     $keyspaces = sort(unique(split($keyspaces_str, '\|')))
     confd::file { "/etc/varnish/directors.${instance}.vcl":
         ensure     => present,
diff --git a/modules/varnish/manifests/instance.pp 
b/modules/varnish/manifests/instance.pp
index c05d6b5..a4d21ee 100644
--- a/modules/varnish/manifests/instance.pp
+++ b/modules/varnish/manifests/instance.pp
@@ -8,7 +8,8 @@
     $storage='-s malloc,1G',
     $jemalloc_conf=undef,
     $runtime_parameters=[],
-    $directors={},
+    $app_directors={},
+    $backend_caches={},
     $extra_vcl = []
 ) {
 
@@ -28,8 +29,7 @@
 
     $netmapper_dir = '/var/netmapper'
 
-    $varnish_directors = $directors
-    $dynamic_directors = hiera('varnish::dynamic_directors', true)
+    $dynamic_backend_caches = hiera('varnish::dynamic_backend_caches', true)
 
     # Install VCL include files shared by all instances
     require varnish::common::vcl
@@ -39,31 +39,21 @@
         before => Service["varnish${instancesuffix}"]
     }
 
-    # Write the dynamic directors configuration, if we need it
+    # Write the dynamic backend caches configuration, if we need it
     if $name == '' {
         $inst = 'backend'
     } else {
         $inst = $name
     }
 
-    # lint:ignore:quoted_booleans lint:ignore:double_quoted_strings
-    if inline_template("<%= @directors.map{|k,v| v['dynamic'] 
}.include?('yes') %>") == "true" {
-        $use_dynamic_directors = true
-    } else {
-        $use_dynamic_directors = false
-    }
-    # lint:endignore
-
-    if $use_dynamic_directors {
-        varnish::common::directors { $vcl:
-            instance  => $inst,
-            directors => $directors,
-            extraopts => $extraopts,
-            before    => [
-                File["/etc/varnish/wikimedia_${vcl}.vcl"],
-                Service["varnish${instancesuffix}"]
-            ],
-        }
+    varnish::common::directors { $vcl:
+        instance  => $inst,
+        directors => $backend_caches,
+        extraopts => $extraopts,
+        before    => [
+            File["/etc/varnish/wikimedia_${vcl}.vcl"],
+            Service["varnish${instancesuffix}"]
+        ],
     }
 
     # Hieradata switch to shut users out of a DC/cluster. T129424
diff --git a/modules/varnish/manifests/wikimedia_vcl.pp 
b/modules/varnish/manifests/wikimedia_vcl.pp
index a5af94d..36a970a 100644
--- a/modules/varnish/manifests/wikimedia_vcl.pp
+++ b/modules/varnish/manifests/wikimedia_vcl.pp
@@ -1,7 +1,7 @@
 define varnish::wikimedia_vcl($varnish_testing, $template_path) {
     if $varnish_testing  {
         $varnish_include_path = '/usr/share/varnish/tests/'
-        $dynamic_directors = false
+        $dynamic_backend_caches = false
         $netmapper_dir = $varnish_include_path
     }
 
diff --git a/modules/varnish/templates/vcl/directors.vcl.tpl.erb 
b/modules/varnish/templates/vcl/directors.vcl.tpl.erb
index feadcdf..0a8fc4c 100644
--- a/modules/varnish/templates/vcl/directors.vcl.tpl.erb
+++ b/modules/varnish/templates/vcl/directors.vcl.tpl.erb
@@ -1,22 +1,12 @@
 
 <% @directors.keys.sort.each do |director_name|
-director = @directors[director_name]
-if director['dynamic'] == 'yes' -%>
-<% if director['type'] == 'vslp' -%>
-new <%= director_name %> = vslp.<%= director['type'] %>();
-<% else -%>
-new <%= director_name %> = directors.<%= director['type'] %>();
-<% end -%>
+director = @directors[director_name] -%>
+new <%= director_name %> = vslp.vslp();
+new <%= director_name %>_random = directors.random();
 <%- keyspace = 
"#{@conftool_namespace}/#{director['dc']}/#{@group}/#{director['service']}" -%>
        {{range $node := ls "<%= keyspace %>/"}}{{ $key := printf "<%= keyspace 
%>/%s" $node }}{{ $data := json (getv $key) }}{{ if eq $data.pooled "yes"}}
-       <% if director['type'] == 'vslp' -%>
     <%= director_name %>.add_backend(be_{{ $parts := split $node "." }}{{ join 
$parts "_" }});
-    <% else -%>
-    <%= director_name %>.add_backend(be_{{ $parts := split $node "." }}{{ join 
$parts "_" }}, {{ $data.weight }});
-    <% end -%>
+    <%= director_name %>_random.add_backend(be_{{ $parts := split $node "." 
}}{{ join $parts "_" }}, {{ $data.weight }});
        {{end}}{{end}}
-<% if director['type'] == 'vslp' -%>
 <%= director_name %>.init_hashcircle(150);
-<% end -%>
-<% end # if director['dynamic'] == 'yes' %>
 <% end # directors loop %>
diff --git a/modules/varnish/templates/vcl/wikimedia-common.inc.vcl.erb 
b/modules/varnish/templates/vcl/wikimedia-common.inc.vcl.erb
index a61ede5..44d48cb 100644
--- a/modules/varnish/templates/vcl/wikimedia-common.inc.vcl.erb
+++ b/modules/varnish/templates/vcl/wikimedia-common.inc.vcl.erb
@@ -64,21 +64,31 @@
 }
 
 <%
-# Directors / Backends
-
-# Expected directors data format:
-# @varnish_directors = {
-#     'director name' => {
-#         'dynamic'  => 'yes', # or 'no', required
-#         'type'     => 'vslp', # required
-#         'dc'       => 'eqiad', # required if dynamic==yes
-#         'service'  => 'foo',   # required if dynamic==yes
-#         'backends' => [ "backend1", "backend2" ], # required: array or 
single value
-#         'be_opts'  => { # every option but 'probe' and 
'between_bytes_timeout' is required!
+# backend_caches and app_directors (two different kinds of backend!)
+# refactoring here is a W-I-P
+#
+# Expected data format:
+# @backend_caches = { # always defined
+#     'cache_eqiad' => {
+#         'dc'       => 'eqiad',
+#         'service'  => 'foo',
+#         'backends' => [ "backend1", "backend2" ], # required: array
+#         'be_opts'  => { # every option is required!
 #             'port' = 80,
 #             'connect_timeout' = '2s',
 #             'first_byte_timeout' = '4s',
-#             'between_bytes_timeout' = '4s',
+#             'max_connections' = 100, # per-backend!
+#         },
+#     },
+# }
+#
+# @app_directors = { # not always defined (e.g. frontends, for now)
+#     'foo' => {
+#         'backend' => "foo.svc.eqiad.wmnet", # required service hostname
+#         'be_opts' => { # every option is required!
+#             'port' = 80,
+#             'connect_timeout' = '2s',
+#             'first_byte_timeout' = '4s',
 #             'max_connections' = 100, # per-backend!
 #         },
 #     },
@@ -90,57 +100,69 @@
 # we have no cases where this is necessary! (whereas we do have cases of
 # duplicate backend hosts where the options are always identical, for
 # vslp-vs-random cache backends)
-#
+%>
 
-# Puppet-generated the Backend host definitions, regardless of 'dynamic'
+<% if not @varnish_testing -%>
 
-be_seen = {}
-@varnish_directors.keys.sort.each do |director_name|
-       director = @varnish_directors[director_name]
+# Generated list of cache backend hosts for director consumption
+
+<%
+becache_seen = {}
+@backend_caches.keys.sort.each do |director_name|
+       director = @backend_caches[director_name]
        be_opts = director['be_opts']
        [*director['backends']].each do |backend|
-               next if be_seen.key?(backend)
-               be_seen[backend] = 1
+               next if becache_seen.key?(backend)
+               becache_seen[backend] = 1
                name = 'be_' + backend.gsub(/[-.]/, '_')
 -%>
 
-<% if not @varnish_testing -%>
 backend <%= name %> {
        .host = "<%= backend %>";
        .port = "<%= be_opts['port'] %>";
        .connect_timeout = <%= be_opts['connect_timeout'] %>;
        .first_byte_timeout = <%= be_opts['first_byte_timeout'] %>;
-<% if be_opts.key?('between_bytes_timeout') -%>
-       .between_bytes_timeout = <%= be_opts['between_bytes_timeout'] %>;
-<% end -%>
        .max_connections = <%= be_opts['max_connections'] %>;
-<% if be_opts.key?('probe') -%>
-       .probe = <%= be_opts['probe'] %>;
-<% end -%>
+       .probe = varnish;
 }
-<% end -%>
 
 <% end # backend loop -%>
 <% end # director loop -%>
 
-sub wm_common_directors_init {
-<% if @use_dynamic_directors and @dynamic_directors -%>
-include "directors.<%= @inst %>.vcl";
-<% end -%>
+# Generated list of applayer backend hosts for director consumption
 
-<% @varnish_directors.keys.sort.each do |director_name|
-director = @varnish_directors[director_name]
-if (!@dynamic_directors or director['dynamic'] != 'yes')
-       backends = [*director['backends']]
-       if (!backends.empty?)
+<%
+apphost_seen = {}
+@app_directors.keys.sort.each do |director_name|
+       director = @app_directors[director_name]
+       be_opts = director['be_opts']
+       backend = director['backend']
+       next if apphost_seen.key?(backend)
+       apphost_seen[backend] = 1
+       name = 'be_' + backend.gsub(/[-.]/, '_')
 -%>
-<% if director['type'] == 'vslp' -%>
-// Yes, the vslp director gets instantiated with vslp.vslp() instead of
-// directors.vslp(). Nobody said this would have been pretty.
-new <%= director_name %> = vslp.<%= director['type'] %>();
+
+backend <%= name %> {
+       .host = "<%= backend %>";
+       .port = "<%= be_opts['port'] %>";
+       .connect_timeout = <%= be_opts['connect_timeout'] %>;
+       .first_byte_timeout = <%= be_opts['first_byte_timeout'] %>;
+       .max_connections = <%= be_opts['max_connections'] %>;
+}
+
+<% end # app_directors loop -%>
+
+<% end # !varnish_testing -%>
+
+sub wm_common_directors_init {
+<% if @dynamic_backend_caches -%>
+include "directors.<%= @inst %>.vcl";
 <% else -%>
-new <%= director_name %> = directors.<%= director['type'] %>();
-<% end %>
+<% @backend_caches.keys.sort.each do |director_name|
+director = @backend_caches[director_name]
+backends = director['backends'] -%>
+       new <%= director_name %> = vslp.vslp();
+       new <%= director_name %>_random = directors.random();
 <%
        backends.each do |backend|
                name = 'be_' + backend.gsub(/[-.]/, '_')
@@ -151,23 +173,28 @@
                        name = "vtc_backend";
                end
 -%>
-       <% if director['type'] == 'vslp' -%>
-       # VSLP has no per-backend weighting. We might want to add it as a
-       # functionality to the vmod.
-       # See https://phabricator.wikimedia.org/T126206
-       <%= director_name %>.add_backend(<%= name %>);
-       <% else -%>
-       <%= director_name %>.add_backend(<%= name %>, 100);
-       <% end -%>
+               <%= director_name %>.add_backend(<%= name %>);
+               <%= director_name %>_random.add_backend(<%= name %>, 100);
 <%     end #backends loop -%>
-<%     if director['type'] == 'vslp' -%>
-       # We should think about this value, probably setting it in a
-       # backend-count-sensitive manner.
        <%= director_name %>.init_hashcircle(150);
-<%     end -%>
-<% end #if !empty -%>
-<% end #if !dynamic -%>
 <% end #director loop -%>
+
+<% end #dynamic_backend_caches -%>
+
+<% @app_directors.keys.sort.each do |director_name|
+director = @app_directors[director_name]
+backend = director['backend']
+if @varnish_testing
+       name = "vtc_backend";
+else
+       name = 'be_' + backend.gsub(/[-.]/, '_')
+end
+-%>
+       new <%= director_name %> = directors.random();
+
+               <%= director_name %>.add_backend(<%= name %>, 100);
+<% end # app_directors loop -%>
+
 } # end wm_common_directors_init
 
 # Functions

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

Gerrit-MessageType: merged
Gerrit-Change-Id: I8053dcf318cb31576d16b4360c8a4836ca9ef11e
Gerrit-PatchSet: 14
Gerrit-Project: operations/puppet
Gerrit-Branch: production
Gerrit-Owner: BBlack <bbl...@wikimedia.org>
Gerrit-Reviewer: BBlack <bbl...@wikimedia.org>
Gerrit-Reviewer: Ema <e...@wikimedia.org>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to