Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
67.74% covered (warning)
67.74%
21 / 31
50.00% covered (danger)
50.00%
3 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
ClusterSettings
67.74% covered (warning)
67.74%
21 / 31
50.00% covered (danger)
50.00%
3 / 6
20.58
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 isPrivateCluster
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 getShardCount
55.56% covered (warning)
55.56%
5 / 9
0.00% covered (danger)
0.00%
0 / 1
3.79
 getReplicaCount
77.78% covered (warning)
77.78%
7 / 9
0.00% covered (danger)
0.00%
0 / 1
4.18
 getMaxShardsPerNode
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
2
 getConnectTimeout
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3namespace CirrusSearch;
4
5use RuntimeException;
6
7/**
8 * Handles resolving configuration variables into specific settings
9 * for a specific cluster.
10 */
11class ClusterSettings {
12
13    /**
14     * @var SearchConfig
15     */
16    protected $config;
17
18    /**
19     * @var string
20     */
21    protected $cluster;
22
23    /**
24     * @param SearchConfig $config
25     * @param string $cluster
26     */
27    public function __construct( SearchConfig $config, $cluster ) {
28        $this->config = $config;
29        $this->cluster = $cluster;
30    }
31
32    /**
33     * @return bool True when the cluster is allowed to contain private indices
34     */
35    public function isPrivateCluster() {
36        $privateClusters = $this->config->get( 'CirrusSearchPrivateClusters' );
37        if ( $privateClusters === null ) {
38            return true;
39        } else {
40            return in_array( $this->cluster, $privateClusters );
41        }
42    }
43
44    /**
45     * @param string $indexSuffix
46     * @return int Number of shards the index should have
47     */
48    public function getShardCount( $indexSuffix ): int {
49        $settings = $this->config->get( 'CirrusSearchShardCount' );
50        if ( isset( $settings[$this->cluster][$indexSuffix] ) ) {
51            return $settings[$this->cluster][$indexSuffix];
52        } elseif ( isset( $settings[$indexSuffix] ) ) {
53            return $settings[$indexSuffix];
54        }
55        throw new RuntimeException( "Could not find a shard count for "
56            . "{$indexSuffix}. Did you add an index to "
57            . "\$wgCirrusSearchNamespaceMappings but forget to "
58            . "add it to \$wgCirrusSearchShardCount?" );
59    }
60
61    /**
62     * @param string $indexSuffix
63     * @return string Number of replicas Elasticsearch can expand or contract to
64     *  in the format of '0-2' for the minimum and maximum number of replicas. May
65     *  also be the string 'false' when replicas are disabled.
66     */
67    public function getReplicaCount( $indexSuffix ) {
68        $settings = $this->config->get( 'CirrusSearchReplicas' );
69        if ( !is_array( $settings ) ) {
70            return $settings;
71        } elseif ( isset( $settings[$this->cluster][$indexSuffix] ) ) {
72            return $settings[$this->cluster][$indexSuffix];
73        } elseif ( isset( $settings[$indexSuffix] ) ) {
74            return $settings[$indexSuffix];
75        }
76        throw new RuntimeException( "If \$wgCirrusSearchReplicas is " .
77            "an array it must contain all index types." );
78    }
79
80    /**
81     * @param string $indexSuffix
82     * @return int Number of shards per node, or 'unlimited'.
83     */
84    public function getMaxShardsPerNode( $indexSuffix ) {
85        $settings = $this->config->get( 'CirrusSearchMaxShardsPerNode' );
86        $max = $settings[$this->cluster][$indexSuffix] ?? $settings[$indexSuffix] ?? -1;
87        // Allow convenience setting of 'unlimited' which translates to elasticsearch -1 (unbounded).
88        return $max === 'unlimited' ? -1 : $max;
89    }
90
91    /**
92     * @return int Connect timeout to use when initializing connection.
93     * Fallback to 0 (300 sec) if not specified in cirrus config.
94     */
95    public function getConnectTimeout() {
96        $timeout = $this->config->get( 'CirrusSearchClientSideConnectTimeout' );
97        if ( is_int( $timeout ) ) {
98            return $timeout;
99        }
100        // 0 means no timeout (defaults to 300 sec)
101        return $timeout[$this->cluster] ?? 0;
102    }
103}