Skip to content

Commit d107b0c

Browse files
MAGECLOUD-3443: [TD] Rewrite ElasticSearch configuration resolving (#444)
1 parent 0b69ee8 commit d107b0c

23 files changed

+478
-413
lines changed

src/App/Container.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ function () {
249249
ValidatorInterface::LEVEL_WARNING => [
250250
$this->container->make(ConfigValidator\Deploy\AdminData::class),
251251
$this->container->make(ConfigValidator\Deploy\PhpVersion::class),
252-
$this->container->make(ConfigValidator\Deploy\SearchEngine::class),
252+
$this->container->make(ConfigValidator\Deploy\SolrIntegrity::class),
253253
$this->container->make(ConfigValidator\Deploy\ElasticSearchUsage::class),
254254
$this->container->make(ConfigValidator\Deploy\ElasticSearchVersion::class),
255255
$this->container->make(ConfigValidator\Deploy\AppropriateVersion::class),
Lines changed: 72 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,23 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6-
namespace Magento\MagentoCloud\Process\Deploy\InstallUpdate\ConfigUpdate\SearchEngine;
6+
declare(strict_types=1);
7+
8+
namespace Magento\MagentoCloud\Config;
79

810
use Composer\Semver\Semver;
911
use Magento\MagentoCloud\Config\ConfigMerger;
1012
use Magento\MagentoCloud\Config\Environment;
13+
use Magento\MagentoCloud\Config\SearchEngine\ElasticSearch;
14+
use Magento\MagentoCloud\Config\SearchEngine\ElasticSuite;
1115
use Magento\MagentoCloud\Config\Stage\DeployInterface;
1216
use Magento\MagentoCloud\Package\MagentoVersion;
17+
use Magento\MagentoCloud\Package\UndefinedPackageException;
1318

1419
/**
1520
* Returns search configuration.
1621
*/
17-
class Config
22+
class SearchEngine
1823
{
1924
/**
2025
* @var Environment
@@ -46,6 +51,11 @@ class Config
4651
*/
4752
private $elasticSuite;
4853

54+
/**
55+
* @var array
56+
*/
57+
private $config;
58+
4959
/**
5060
* @param Environment $environment
5161
* @param DeployInterface $stageConfig
@@ -74,35 +84,78 @@ public function __construct(
7484
* Returns search engine configuration. At least contains 'engine' option.
7585
*
7686
* @return array
87+
*
88+
* @throws UndefinedPackageException
7789
*/
78-
public function get(): array
90+
public function getConfig(): array
7991
{
80-
$envSearchConfig = (array)$this->stageConfig->get(DeployInterface::VAR_SEARCH_CONFIGURATION);
81-
82-
if ($this->isSearchConfigValid($envSearchConfig)
83-
&& !$this->configMerger->isMergeRequired($envSearchConfig)
84-
) {
85-
return $this->configMerger->clear($envSearchConfig);
92+
if ($this->config === null) {
93+
$resolveMerge = function () {
94+
$searchConfig = (array)$this->stageConfig->get(DeployInterface::VAR_SEARCH_CONFIGURATION);
95+
96+
if (isset($searchConfig['engine']) && !$this->configMerger->isMergeRequired($searchConfig)) {
97+
return $this->configMerger->clear($searchConfig);
98+
}
99+
100+
return $this->configMerger->mergeConfigs(
101+
$this->getSearchConfig(),
102+
$searchConfig
103+
);
104+
};
105+
106+
$this->config['system']['default']['catalog']['search'] = $resolveMerge();
107+
108+
if ($this->elasticSuite->isInstalled()) {
109+
$this->config['system']['default']['smile_elasticsuite_core_base_settings'] =
110+
$this->elasticSuite->get();
111+
$this->config['system']['default']['catalog']['search']['engine'] = ElasticSuite::ENGINE_NAME;
112+
}
86113
}
87114

88-
return $this->configMerger->mergeConfigs($this->getSearchConfig(), $envSearchConfig);
115+
return $this->config;
116+
}
117+
118+
/**
119+
* @return string
120+
*
121+
* @throws UndefinedPackageException
122+
*/
123+
public function getName(): string
124+
{
125+
return $this->getConfig()['system']['default']['catalog']['search']['engine'];
126+
}
127+
128+
/**
129+
* Checks if search engine is a prt of ElasticSearch family (i.e. ElasticSuite).
130+
*
131+
* @return bool
132+
*/
133+
public function isESFamily(): bool
134+
{
135+
$searchEngine = $this->getName();
136+
137+
return (strpos($searchEngine, ElasticSearch::ENGINE_NAME) === 0)
138+
|| ($searchEngine === ElasticSuite::ENGINE_NAME);
89139
}
90140

91141
/**
92142
* @return array
143+
*
144+
* @throws UndefinedPackageException
93145
*/
94146
private function getSearchConfig(): array
95147
{
96-
$relationships = $this->environment->getRelationships();
97-
$searchConfig = ['engine' => 'mysql'];
148+
if ($esConfig = $this->elasticSearch->getRelationship()) {
149+
return $this->getElasticSearchConfiguration($esConfig);
150+
}
98151

99-
if (isset($relationships['elasticsearch'])) {
100-
$searchConfig = $this->getElasticSearchConfiguration($relationships['elasticsearch'][0]);
101-
} elseif (isset($relationships['solr']) && $this->magentoVersion->satisfies('<2.2')) {
102-
$searchConfig = $this->getSolrConfiguration($relationships['solr'][0]);
152+
$solrConfig = $this->environment->getRelationship('solr');
153+
154+
if ($solrConfig && $this->magentoVersion->satisfies('<2.2')) {
155+
return $this->getSolrConfiguration($solrConfig[0]);
103156
}
104157

105-
return $searchConfig;
158+
return ['engine' => 'mysql'];
106159
}
107160

108161
/**
@@ -130,11 +183,11 @@ private function getSolrConfiguration(array $config): array
130183
*/
131184
private function getElasticSearchConfiguration(array $config): array
132185
{
133-
$engine = 'elasticsearch';
186+
$engine = ElasticSearch::ENGINE_NAME;
134187

135188
$esVersion = $this->elasticSearch->getVersion();
136189
if (Semver::satisfies($esVersion, '>= 5')) {
137-
$engine = 'elasticsearch' . intval($esVersion);
190+
$engine .= (int)$esVersion;
138191
}
139192

140193
$elasticSearchConfig = [
@@ -147,21 +200,6 @@ private function getElasticSearchConfiguration(array $config): array
147200
$elasticSearchConfig["{$engine}_index_prefix"] = $config['query']['index'];
148201
}
149202

150-
if ($this->elasticSuite->isInstalled()) {
151-
$elasticSearchConfig['engine'] = ElasticSuite::ENGINE_NAME;
152-
}
153-
154203
return $elasticSearchConfig;
155204
}
156-
157-
/**
158-
* Checks that given configuration is valid.
159-
*
160-
* @param array $searchConfiguration
161-
* @return bool
162-
*/
163-
private function isSearchConfigValid(array $searchConfiguration): bool
164-
{
165-
return isset($searchConfiguration['engine']);
166-
}
167205
}
Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6-
namespace Magento\MagentoCloud\Process\Deploy\InstallUpdate\ConfigUpdate\SearchEngine;
6+
declare(strict_types=1);
7+
8+
namespace Magento\MagentoCloud\Config\SearchEngine;
79

810
use Magento\MagentoCloud\Config\Environment;
911
use Magento\MagentoCloud\Http\ClientFactory;
@@ -67,7 +69,7 @@ public function isInstalled(): bool
6769
*
6870
* @return array
6971
*/
70-
public function getConfig(): array
72+
public function getRelationship(): array
7173
{
7274
return $this->environment->getRelationship(self::RELATIONSHIP_KEY)[0] ?? [];
7375
}
@@ -115,7 +117,7 @@ public function getVersion(): string
115117
*/
116118
public function getTemplate(): array
117119
{
118-
$config = $this->getConfig();
120+
$config = $this->getRelationship();
119121

120122
if (!$config) {
121123
return [];
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
*/
66
declare(strict_types=1);
77

8-
namespace Magento\MagentoCloud\Process\Deploy\InstallUpdate\ConfigUpdate\SearchEngine;
8+
namespace Magento\MagentoCloud\Config\SearchEngine;
99

1010
use Magento\MagentoCloud\Config\ConfigMerger;
1111
use Magento\MagentoCloud\Config\Stage\DeployInterface;
@@ -95,7 +95,7 @@ public function isInstalled(): bool
9595
*/
9696
private function getConfig(): array
9797
{
98-
$esConfig = $this->elasticSearch->getConfig();
98+
$esConfig = $this->elasticSearch->getRelationship();
9999

100100
if (!isset($esConfig['host'], $esConfig['port'])) {
101101
return [];

src/Config/Validator/Deploy/ElasticSearchUsage.php

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,47 +3,47 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
declare(strict_types=1);
7+
68
namespace Magento\MagentoCloud\Config\Validator\Deploy;
79

8-
use Magento\MagentoCloud\Config\Environment;
910
use Magento\MagentoCloud\Config\Validator;
1011
use Magento\MagentoCloud\Config\ValidatorInterface;
11-
use Magento\MagentoCloud\Process\Deploy\InstallUpdate\ConfigUpdate\SearchEngine\Config as SearchEngineConfig;
12-
use Magento\MagentoCloud\Process\Deploy\InstallUpdate\ConfigUpdate\SearchEngine\ElasticSuite;
12+
use Magento\MagentoCloud\Config\SearchEngine;
1313

1414
/**
1515
* Validates that different search engine configured when elasticsearch service is installed.
1616
*/
1717
class ElasticSearchUsage implements ValidatorInterface
1818
{
1919
/**
20-
* @var SearchEngineConfig
20+
* @var SearchEngine
2121
*/
22-
private $searchEngineConfig;
22+
private $searchEngine;
2323

2424
/**
2525
* @var Validator\ResultFactory
2626
*/
2727
private $resultFactory;
2828

2929
/**
30-
* @var Environment
30+
* @var SearchEngine\ElasticSearch
3131
*/
32-
private $environment;
32+
private $elasticSearch;
3333

3434
/**
35-
* @param Environment $environment
36-
* @param SearchEngineConfig $searchEngineConfig
35+
* @param SearchEngine $searchEngine
3736
* @param Validator\ResultFactory $resultFactory
37+
* @param SearchEngine\ElasticSearch $elasticSearch
3838
*/
3939
public function __construct(
40-
Environment $environment,
41-
SearchEngineConfig $searchEngineConfig,
42-
Validator\ResultFactory $resultFactory
40+
SearchEngine $searchEngine,
41+
Validator\ResultFactory $resultFactory,
42+
SearchEngine\ElasticSearch $elasticSearch
4343
) {
44-
$this->searchEngineConfig = $searchEngineConfig;
44+
$this->searchEngine = $searchEngine;
4545
$this->resultFactory = $resultFactory;
46-
$this->environment = $environment;
46+
$this->elasticSearch = $elasticSearch;
4747
}
4848

4949
/**
@@ -56,16 +56,11 @@ public function __construct(
5656
*/
5757
public function validate(): Validator\ResultInterface
5858
{
59-
$relationships = $this->environment->getRelationships();
60-
if (!isset($relationships['elasticsearch'])) {
59+
if (!$this->elasticSearch->isInstalled()) {
6160
return $this->resultFactory->success();
6261
}
6362

64-
$searchEngine = $this->searchEngineConfig->get()['engine'];
65-
$isElasticSearchInstalled = strpos($searchEngine, 'elasticsearch') === 0
66-
|| $searchEngine === ElasticSuite::ENGINE_NAME;
67-
68-
if ($isElasticSearchInstalled) {
63+
if ($this->searchEngine->isESFamily()) {
6964
return $this->resultFactory->success();
7065
}
7166

src/Config/Validator/Deploy/ElasticSearchVersion.php

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,18 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
declare(strict_types=1);
7+
68
namespace Magento\MagentoCloud\Config\Validator\Deploy;
79

810
use Composer\Semver\Semver;
11+
use Magento\MagentoCloud\Config\SearchEngine;
912
use Magento\MagentoCloud\Config\Validator;
1013
use Magento\MagentoCloud\Config\ValidatorInterface;
1114
use Magento\MagentoCloud\Package\MagentoVersion;
1215
use Magento\MagentoCloud\Package\Manager;
1316
use Magento\MagentoCloud\Package\UndefinedPackageException;
14-
use Magento\MagentoCloud\Process\Deploy\InstallUpdate\ConfigUpdate\SearchEngine\ElasticSearch;
15-
use Magento\MagentoCloud\Process\Deploy\InstallUpdate\ConfigUpdate\SearchEngine\Config as SearchEngineConfig;
17+
use Magento\MagentoCloud\Config\SearchEngine\ElasticSearch;
1618
use Psr\Log\LoggerInterface;
1719

1820
/**
@@ -41,9 +43,9 @@ class ElasticSearchVersion implements ValidatorInterface
4143
private $logger;
4244

4345
/**
44-
* @var SearchEngineConfig
46+
* @var SearchEngine
4547
*/
46-
private $searchEngineConfig;
48+
private $searchEngine;
4749

4850
/**
4951
* @var MagentoVersion
@@ -53,7 +55,7 @@ class ElasticSearchVersion implements ValidatorInterface
5355
/**
5456
* @var array
5557
*/
56-
private $versionsMap = [
58+
private static $versionsMap = [
5759
[
5860
'packageVersion' => '~6.0',
5961
'esVersion' => '~6.0',
@@ -76,22 +78,22 @@ class ElasticSearchVersion implements ValidatorInterface
7678
* @param Manager $manager
7779
* @param ElasticSearch $elasticSearch
7880
* @param LoggerInterface $logger
79-
* @param SearchEngineConfig $searchEngineConfig
81+
* @param SearchEngine $searchEngine
8082
* @param MagentoVersion $magentoVersion
8183
*/
8284
public function __construct(
8385
Validator\ResultFactory $resultFactory,
8486
Manager $manager,
8587
ElasticSearch $elasticSearch,
8688
LoggerInterface $logger,
87-
SearchEngineConfig $searchEngineConfig,
89+
SearchEngine $searchEngine,
8890
MagentoVersion $magentoVersion
8991
) {
9092
$this->resultFactory = $resultFactory;
9193
$this->manager = $manager;
9294
$this->elasticSearch = $elasticSearch;
9395
$this->logger = $logger;
94-
$this->searchEngineConfig = $searchEngineConfig;
96+
$this->searchEngine = $searchEngine;
9597
$this->magentoVersion = $magentoVersion;
9698
}
9799

@@ -105,19 +107,19 @@ public function __construct(
105107
public function validate(): Validator\ResultInterface
106108
{
107109
$esServiceVersion = $this->elasticSearch->getVersion();
110+
108111
if ($esServiceVersion === '0') {
109112
return $this->resultFactory->success();
110113
}
111114

112-
$searchEngine = $this->searchEngineConfig->get()['engine'];
113-
if (strpos($searchEngine, 'elasticsearch') !== 0) {
115+
if (!$this->searchEngine->isESFamily()) {
114116
return $this->resultFactory->success();
115117
}
116118

117119
try {
118120
$esPackageVersion = $this->manager->get('elasticsearch/elasticsearch')->getVersion();
119121

120-
foreach ($this->versionsMap as $versionInfo) {
122+
foreach (self::$versionsMap as $versionInfo) {
121123
if (Semver::satisfies($esPackageVersion, $versionInfo['packageVersion'])
122124
&& !Semver::satisfies($esServiceVersion, $versionInfo['esVersion'])
123125
) {

0 commit comments

Comments
 (0)