Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
50.00% covered (danger)
50.00%
3 / 6
CRAP
68.75% covered (warning)
68.75%
22 / 32
ClusterSettings
0.00% covered (danger)
0.00%
0 / 1
50.00% covered (danger)
50.00%
3 / 6
19.98
68.75% covered (warning)
68.75%
22 / 32
 __construct
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
3 / 3
 isPrivateCluster
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
4 / 4
 getShardCount
0.00% covered (danger)
0.00%
0 / 1
3.79
55.56% covered (warning)
55.56%
5 / 9
 getReplicaCount
0.00% covered (danger)
0.00%
0 / 1
4.18
77.78% covered (warning)
77.78%
7 / 9
 getMaxShardsPerNode
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
3 / 3
 getConnectTimeout
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 4
<?php
namespace CirrusSearch;
/**
 * Handles resolving configuration variables into specific settings
 * for a specific cluster.
 */
class ClusterSettings {
    /**
     * @var SearchConfig
     */
    protected $config;
    /**
     * @var string
     */
    protected $cluster;
    /**
     * @param SearchConfig $config
     * @param string $cluster
     */
    public function __construct( SearchConfig $config, $cluster ) {
        $this->config = $config;
        $this->cluster = $cluster;
    }
    /**
     * @return bool True when the cluster is allowed to contain private indices
     */
    public function isPrivateCluster() {
        $privateClusters = $this->config->get( 'CirrusSearchPrivateClusters' );
        if ( $privateClusters === null ) {
            return true;
        } else {
            return in_array( $this->cluster, $privateClusters );
        }
    }
    /**
     * @param string $indexSuffix
     * @return int Number of shards the index should have
     */
    public function getShardCount( $indexSuffix ) {
        $settings = $this->config->get( 'CirrusSearchShardCount' );
        if ( isset( $settings[$this->cluster][$indexSuffix] ) ) {
            return $settings[$this->cluster][$indexSuffix];
        } elseif ( isset( $settings[$indexSuffix] ) ) {
            return $settings[$indexSuffix];
        }
        throw new \Exception( "Could not find a shard count for "
            . "{$indexSuffix}. Did you add an index to "
            . "\$wgCirrusSearchNamespaceMappings but forget to "
            . "add it to \$wgCirrusSearchShardCount?" );
    }
    /**
     * @param string $indexSuffix
     * @return string Number of replicas Elasticsearch can expand or contract to
     *  in the format of '0-2' for the minimum and maximum number of replicas. May
     *  also be the string 'false' when replicas are disabled.
     */
    public function getReplicaCount( $indexSuffix ) {
        $settings = $this->config->get( 'CirrusSearchReplicas' );
        if ( !is_array( $settings ) ) {
            return $settings;
        } elseif ( isset( $settings[$this->cluster][$indexSuffix] ) ) {
            return $settings[$this->cluster][$indexSuffix];
        } elseif ( isset( $settings[$indexSuffix] ) ) {
            return $settings[$indexSuffix];
        }
        throw new \Exception( "If \$wgCirrusSearchReplicas is " .
            "an array it must contain all index types." );
    }
    /**
     * @param string $indexSuffix
     * @return int Number of shards per node, or 'unlimited'.
     */
    public function getMaxShardsPerNode( $indexSuffix ) {
        $settings = $this->config->get( 'CirrusSearchMaxShardsPerNode' );
        $max = $settings[$this->cluster][$indexSuffix] ?? $settings[$indexSuffix] ?? -1;
        // Allow convenience setting of 'unlimited' which translates to elasticsearch -1 (unbounded).
        return $max === 'unlimited' ? -1 : $max;
    }
    /**
     * @return int Connect timeout to use when initializing connection.
     * Fallback to 0 (300 sec) if not specified in cirrus config.
     */
    public function getConnectTimeout() {
        $timeout = $this->config->get( 'CirrusSearchClientSideConnectTimeout' );
        if ( is_int( $timeout ) ) {
            return $timeout;
        }
        // 0 means no timeout (defaults to 300 sec)
        return $timeout[$this->cluster] ?? 0;
    }
}