xref: /plugin/elasticsearch/vendor/ruflin/elastica/src/Node/Info.php (revision d832d53af2a0f84c34c8d5f17c93ffaa85869e5d)
1<?php
2
3namespace Elastica\Node;
4
5use Elastica\Node as BaseNode;
6use Elastica\Response;
7use Elasticsearch\Endpoints\Nodes\Info as NodesInfo;
8
9/**
10 * Elastica cluster node object.
11 *
12 * @author Nicolas Ruflin <spam@ruflin.com>
13 *
14 * @see https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-status.html
15 */
16class Info
17{
18    /**
19     * Response.
20     *
21     * @var Response Response object
22     */
23    protected $_response;
24
25    /**
26     * Stats data.
27     *
28     * @var array stats data
29     */
30    protected $_data = [];
31
32    /**
33     * Node.
34     *
35     * @var BaseNode Node object
36     */
37    protected $_node;
38
39    /**
40     * Query parameters.
41     *
42     * @var array
43     */
44    protected $_params = [];
45
46    /**
47     * Unique node id.
48     *
49     * @var string
50     */
51    protected $_id;
52
53    /**
54     * Create new info object for node.
55     *
56     * @param BaseNode $node   Node object
57     * @param array    $params List of params to return. Can be: settings, os, process, jvm, thread_pool, network, transport, http
58     */
59    public function __construct(BaseNode $node, array $params = [])
60    {
61        $this->_node = $node;
62        $this->refresh($params);
63    }
64
65    /**
66     * Returns the entry in the data array based on the params.
67     * Several params possible.
68     *
69     * Example 1: get('os', 'mem', 'total') returns total memory of the system the
70     * node is running on
71     * Example 2: get('os', 'mem') returns an array with all mem infos
72     *
73     * @return mixed Data array entry or null if not found
74     */
75    public function get(...$args)
76    {
77        $data = $this->getData();
78
79        foreach ($args as $arg) {
80            if (isset($data[$arg])) {
81                $data = $data[$arg];
82            } else {
83                return null;
84            }
85        }
86
87        return $data;
88    }
89
90    /**
91     * Return port of the node.
92     *
93     * @return string Returns Node port
94     */
95    public function getPort(): string
96    {
97        // Returns string in format: inet[/192.168.1.115:9201]
98        $data = $this->get('http_address');
99        $data = \substr($data, 6, -1);
100        $data = \explode(':', $data);
101
102        return $data[1];
103    }
104
105    /**
106     * Return IP of the node.
107     *
108     * @return string Returns Node ip address
109     */
110    public function getIp(): string
111    {
112        // Returns string in format: inet[/192.168.1.115:9201]
113        $data = $this->get('http_address');
114        $data = \substr($data, 6, -1);
115        $data = \explode(':', $data);
116
117        return $data[0];
118    }
119
120    /**
121     * Return data regarding plugins installed on this node.
122     *
123     * @return array plugin data
124     *
125     * @see https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-nodes-info.html
126     */
127    public function getPlugins(): array
128    {
129        if (!\in_array('plugins', $this->_params, true)) {
130            // Plugin data was not retrieved when refresh() was called last. Get it now.
131            $this->_params[] = 'plugins';
132            $this->refresh($this->_params);
133        }
134
135        return $this->get('plugins');
136    }
137
138    /**
139     * Check if the given plugin is installed on this node.
140     *
141     * @param string $name plugin name
142     *
143     * @return bool true if the plugin is installed, false otherwise
144     */
145    public function hasPlugin($name): bool
146    {
147        foreach ($this->getPlugins() as $plugin) {
148            if ($plugin['name'] === $name) {
149                return true;
150            }
151        }
152
153        return false;
154    }
155
156    /**
157     * Return all info data.
158     *
159     * @return array Data array
160     */
161    public function getData(): array
162    {
163        return $this->_data;
164    }
165
166    /**
167     * Return node object.
168     *
169     * @return BaseNode Node object
170     */
171    public function getNode(): BaseNode
172    {
173        return $this->_node;
174    }
175
176    /**
177     * @return string Unique node id
178     */
179    public function getId(): string
180    {
181        return $this->_id;
182    }
183
184    /**
185     * @return string Node name
186     */
187    public function getName(): string
188    {
189        return $this->_data['name'];
190    }
191
192    /**
193     * Returns response object.
194     *
195     * @return Response Response object
196     */
197    public function getResponse(): Response
198    {
199        return $this->_response;
200    }
201
202    /**
203     * Reloads all nodes information. Has to be called if informations changed.
204     *
205     * @param array $params Params to return (default none). Possible options: settings, os, process, jvm, thread_pool, network, transport, http, plugin
206     *
207     * @return Response Response object
208     */
209    public function refresh(array $params = []): Response
210    {
211        $this->_params = $params;
212
213        // TODO: Use only NodesInfo when dropping support for elasticsearch/elasticsearch 7.x
214        $endpoint = \class_exists(NodesInfo::class) ? new NodesInfo() : new \Elasticsearch\Endpoints\Cluster\Nodes\Info();
215        $endpoint->setNodeId($this->getNode()->getId());
216
217        if ($params) {
218            $endpoint->setMetric($params);
219        }
220
221        $this->_response = $this->getNode()->getClient()->requestEndpoint($endpoint);
222        $data = $this->getResponse()->getData();
223
224        $this->_data = \reset($data['nodes']);
225        $this->_id = \key($data['nodes']);
226        $this->getNode()->setId($this->getId());
227
228        return $this->_response;
229    }
230}
231