Skip to content

Commit b46716e

Browse files
committed
MC-20710: Add Elasticsearch configuration parameters to console
1 parent f3df323 commit b46716e

File tree

12 files changed

+481
-1
lines changed

12 files changed

+481
-1
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Elasticsearch\Setup;
9+
10+
use Magento\AdvancedSearch\Model\Client\ClientResolver;
11+
use Magento\Setup\Model\SearchConfigOptionsList;
12+
13+
/**
14+
* Validate Elasticsearch connection
15+
*/
16+
class ConnectionValidator
17+
{
18+
/**
19+
* @var ClientResolver
20+
*/
21+
private $clientResolver;
22+
23+
/**
24+
* @param ClientResolver $clientResolver
25+
*/
26+
public function __construct(ClientResolver $clientResolver)
27+
{
28+
$this->clientResolver = $clientResolver;
29+
}
30+
31+
/**
32+
* Checks Elasticsearch Connection
33+
*
34+
* @param array $configuration
35+
* @return bool true if the connection succeeded, false otherwise
36+
*/
37+
public function validate($configuration)
38+
{
39+
if (isset($configuration[SearchConfigOptionsList::INPUT_KEY_ELASTICSEARCH_SKIP_VALIDATION])
40+
&& $configuration[SearchConfigOptionsList::INPUT_KEY_ELASTICSEARCH_SKIP_VALIDATION]
41+
) {
42+
return true;
43+
}
44+
45+
$configOptions = [
46+
'hostname' => $configuration[SearchConfigOptionsList::INPUT_KEY_ELASTICSEARCH_HOST],
47+
'port' => $configuration[SearchConfigOptionsList::INPUT_KEY_ELASTICSEARCH_PORT],
48+
'index' => $configuration[SearchConfigOptionsList::INPUT_KEY_ELASTICSEARCH_INDEX_PREFIX],
49+
'enableAuth' => $configuration[SearchConfigOptionsList::INPUT_KEY_ELASTICSEARCH_ENABLE_AUTH],
50+
'username' => $configuration[SearchConfigOptionsList::INPUT_KEY_ELASTICSEARCH_USERNAME] ?? null,
51+
'password' => $configuration[SearchConfigOptionsList::INPUT_KEY_ELASTICSEARCH_PASSWORD] ?? null,
52+
'timeout' => $configuration[SearchConfigOptionsList::INPUT_KEY_ELASTICSEARCH_TIMEOUT]
53+
];
54+
55+
try {
56+
$client = $this->clientResolver->create($configuration['search-engine'], $configOptions);
57+
return $client->testConnection();
58+
} catch (\Exception $e) {
59+
return false;
60+
}
61+
}
62+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Elasticsearch\Setup;
9+
10+
use Magento\Framework\App\Config\Storage\WriterInterface;
11+
use Magento\Framework\Exception\InputException;
12+
use Magento\Setup\Model\SearchConfigOptionsList;
13+
use Magento\Search\Setup\InstallConfigInterface;
14+
15+
class InstallConfig implements InstallConfigInterface
16+
{
17+
private const CATALOG_SEARCH = 'catalog/search/';
18+
19+
/**
20+
* @var array
21+
*/
22+
private $searchConfigMapping = [
23+
SearchConfigOptionsList::INPUT_KEY_SEARCH_ENGINE => 'engine'
24+
];
25+
26+
/**
27+
* @var ConnectionValidator
28+
*/
29+
private $validator;
30+
31+
/**
32+
* @var WriterInterface
33+
*/
34+
private $configWriter;
35+
36+
/**
37+
* @param WriterInterface $configWriter
38+
* @param ConnectionValidator $validator
39+
* @param array $searchConfigMapping
40+
*/
41+
public function __construct(
42+
WriterInterface $configWriter,
43+
ConnectionValidator $validator,
44+
array $searchConfigMapping
45+
) {
46+
$this->configWriter = $configWriter;
47+
$this->validator = $validator;
48+
$this->searchConfigMapping = array_merge($this->searchConfigMapping, $searchConfigMapping);
49+
}
50+
51+
/**
52+
* @inheritDoc
53+
*/
54+
public function configure(array $inputOptions)
55+
{
56+
if (!isset($inputOptions['skip-elasticsearch-validation']) || !$inputOptions['skip-elasticsearch-validation']) {
57+
if (!$this->validator->validate($inputOptions)) {
58+
throw new InputException(__('Could not connect to Elasticsearch server.'));
59+
}
60+
}
61+
62+
foreach ($inputOptions as $inputKey => $inputValue) {
63+
if (null === $inputValue) {
64+
continue;
65+
}
66+
$configKey = $this->searchConfigMapping[$inputKey] ?? null;
67+
if (empty($configKey)) {
68+
continue;
69+
}
70+
71+
$this->configWriter->save(self::CATALOG_SEARCH . $configKey, $inputValue);
72+
}
73+
}
74+
}

app/code/Magento/Elasticsearch/etc/di.xml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -508,4 +508,26 @@
508508
</argument>
509509
</arguments>
510510
</type>
511+
512+
<type name="Magento\Elasticsearch\Setup\InstallConfig">
513+
<arguments>
514+
<argument name="searchConfigMapping" xsi:type="array">
515+
<item name="elasticsearch-host" xsi:type="string">elasticsearch5_server_hostname</item>
516+
<item name="elasticsearch-port" xsi:type="string">elasticsearch5_server_port</item>
517+
<item name="elasticsearch-timeout" xsi:type="string">elasticsearch5_server_timeout</item>
518+
<item name="elasticsearch-index-prefix" xsi:type="string">elasticsearch5_index_prefix</item>
519+
<item name="elasticsearch-enable-auth" xsi:type="string">elasticsearch5_enable_auth</item>
520+
<item name="elasticsearch-username" xsi:type="string">elasticsearch5_username</item>
521+
<item name="elasticsearch-password" xsi:type="string">elasticsearch5_password</item>
522+
</argument>
523+
</arguments>
524+
</type>
525+
526+
<type name="Magento\Search\Setup\CompositeInstallConfig">
527+
<arguments>
528+
<argument name="installConfigList" xsi:type="array">
529+
<item name="elasticsearch5" xsi:type="object">Magento\Elasticsearch\Setup\InstallConfig</item>
530+
</argument>
531+
</arguments>
532+
</type>
511533
</config>

app/code/Magento/Elasticsearch6/etc/di.xml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,4 +219,25 @@
219219
</argument>
220220
</arguments>
221221
</type>
222+
223+
<virtualType name="Magento\Elasticsearch6\Setup\InstallConfig" type="Magento\Elasticsearch\Setup\InstallConfig">
224+
<arguments>
225+
<argument name="searchConfigMapping" xsi:type="array">
226+
<item name="elasticsearch-host" xsi:type="string">elasticsearch6_server_hostname</item>
227+
<item name="elasticsearch-port" xsi:type="string">elasticsearch6_server_port</item>
228+
<item name="elasticsearch-timeout" xsi:type="string">elasticsearch6_server_timeout</item>
229+
<item name="elasticsearch-index-prefix" xsi:type="string">elasticsearch6_index_prefix</item>
230+
<item name="elasticsearch-enable-auth" xsi:type="string">elasticsearch6_enable_auth</item>
231+
<item name="elasticsearch-username" xsi:type="string">elasticsearch6_username</item>
232+
<item name="elasticsearch-password" xsi:type="string">elasticsearch6_password</item>
233+
</argument>
234+
</arguments>
235+
</virtualType>
236+
<type name="Magento\Search\Setup\CompositeInstallConfig">
237+
<arguments>
238+
<argument name="installConfigList" xsi:type="array">
239+
<item name="elasticsearch6" xsi:type="object">Magento\Elasticsearch6\Setup\InstallConfig</item>
240+
</argument>
241+
</arguments>
242+
</type>
222243
</config>

app/code/Magento/Elasticsearch7/etc/di.xml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,4 +221,26 @@
221221
</argument>
222222
</arguments>
223223
</type>
224+
225+
226+
<virtualType name="Magento\Elasticsearch7\Setup\InstallConfig" type="Magento\Elasticsearch\Setup\InstallConfig">
227+
<arguments>
228+
<argument name="searchConfigMapping" xsi:type="array">
229+
<item name="elasticsearch-host" xsi:type="string">elasticsearch7_server_hostname</item>
230+
<item name="elasticsearch-port" xsi:type="string">elasticsearch7_server_port</item>
231+
<item name="elasticsearch-timeout" xsi:type="string">elasticsearch7_server_timeout</item>
232+
<item name="elasticsearch-index-prefix" xsi:type="string">elasticsearch7_index_prefix</item>
233+
<item name="elasticsearch-enable-auth" xsi:type="string">elasticsearch7_enable_auth</item>
234+
<item name="elasticsearch-username" xsi:type="string">elasticsearch7_username</item>
235+
<item name="elasticsearch-password" xsi:type="string">elasticsearch7_password</item>
236+
</argument>
237+
</arguments>
238+
</virtualType>
239+
<type name="Magento\Search\Setup\CompositeInstallConfig">
240+
<arguments>
241+
<argument name="installConfigList" xsi:type="array">
242+
<item name="elasticsearch7" xsi:type="object">Magento\Elasticsearch7\Setup\InstallConfig</item>
243+
</argument>
244+
</arguments>
245+
</type>
224246
</config>
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Search\Setup;
9+
10+
use Magento\Framework\Exception\InputException;
11+
12+
class CompositeInstallConfig implements InstallConfigInterface
13+
{
14+
/**
15+
* @var InstallConfigInterface[]
16+
*/
17+
private $installConfigList;
18+
19+
/**
20+
* @param InstallConfigInterface[] $installConfigList
21+
*/
22+
public function __construct(array $installConfigList)
23+
{
24+
$this->installConfigList = $installConfigList;
25+
}
26+
27+
/**
28+
* @inheritDoc
29+
*/
30+
public function configure(array $inputOptions)
31+
{
32+
$searchEngine = $inputOptions['search-engine'];
33+
34+
if (!isset($this->installConfigList[$searchEngine])) {
35+
//TODO better exception handling
36+
throw new InputException(__('Unable to configure search engine ' . $searchEngine));
37+
}
38+
$installConfig = $this->installConfigList[$searchEngine];
39+
40+
$installConfig->configure($inputOptions);
41+
}
42+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Search\Setup;
9+
10+
use Magento\Framework\Exception\InputException;
11+
12+
interface InstallConfigInterface
13+
{
14+
/**
15+
* Configure search engine based in input options
16+
*
17+
* @param array $inputOptions
18+
* @throws InputException
19+
*/
20+
public function configure(array $inputOptions);
21+
}

app/code/Magento/Search/etc/di.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,4 +78,6 @@
7878
<argument name="dataStorage" xsi:type="object">Magento\Search\Model\SearchEngine\Config\Data</argument>
7979
</arguments>
8080
</type>
81+
82+
<preference for="Magento\Search\Setup\InstallConfigInterface" type="Magento\Search\Setup\CompositeInstallConfig"/>
8183
</config>

setup/src/Magento/Setup/Console/Command/InstallCommand.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Magento\Setup\Model\ConfigModel;
1616
use Magento\Setup\Model\InstallerFactory;
1717
use Magento\Framework\Setup\ConsoleLogger;
18+
use Magento\Setup\Model\SearchConfigOptionsList;
1819
use Symfony\Component\Console\Input\InputInterface;
1920
use Symfony\Component\Console\Output\OutputInterface;
2021
use Symfony\Component\Console\Input\InputOption;
@@ -110,24 +111,32 @@ class InstallCommand extends AbstractSetupCommand
110111
*/
111112
protected $adminUser;
112113

114+
/**
115+
* @var SearchConfigOptionsList
116+
*/
117+
protected $searchConfigOptionsList;
118+
113119
/**
114120
* Constructor
115121
*
116122
* @param InstallerFactory $installerFactory
117123
* @param ConfigModel $configModel
118124
* @param InstallStoreConfigurationCommand $userConfig
119125
* @param AdminUserCreateCommand $adminUser
126+
* @param SearchConfigOptionsList $searchConfigOptionsList
120127
*/
121128
public function __construct(
122129
InstallerFactory $installerFactory,
123130
ConfigModel $configModel,
124131
InstallStoreConfigurationCommand $userConfig,
125-
AdminUserCreateCommand $adminUser
132+
AdminUserCreateCommand $adminUser,
133+
SearchConfigOptionsList $searchConfigOptionsList
126134
) {
127135
$this->installerFactory = $installerFactory;
128136
$this->configModel = $configModel;
129137
$this->userConfig = $userConfig;
130138
$this->adminUser = $adminUser;
139+
$this->searchConfigOptionsList = $searchConfigOptionsList;
131140
parent::__construct();
132141
}
133142

@@ -139,6 +148,7 @@ protected function configure()
139148
$inputOptions = $this->configModel->getAvailableOptions();
140149
$inputOptions = array_merge($inputOptions, $this->userConfig->getOptionsList());
141150
$inputOptions = array_merge($inputOptions, $this->adminUser->getOptionsList(InputOption::VALUE_OPTIONAL));
151+
$inputOptions = array_merge($inputOptions, $this->searchConfigOptionsList->getOptionsList());
142152
$inputOptions = array_merge($inputOptions, [
143153
new InputOption(
144154
self::INPUT_KEY_CLEANUP_DB,

setup/src/Magento/Setup/Model/Installer.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,7 @@ public function install($request)
339339
}
340340
$script[] = ['Installing database schema:', 'installSchema', [$request]];
341341
$script[] = ['Installing user configuration...', 'installUserConfig', [$request]];
342+
// $script[] = ['Installing core configuration...', 'installCoreConfig', [$request]];
342343
$script[] = ['Enabling caches:', 'updateCaches', [true]];
343344
$script[] = ['Installing data...', 'installDataFixtures', [$request]];
344345
if (!empty($request[InstallCommand::INPUT_KEY_SALES_ORDER_INCREMENT_PREFIX])) {
@@ -1104,6 +1105,10 @@ public function installUserConfig($data)
11041105
$configModel->setDataByPath($key, $val);
11051106
$configModel->save();
11061107
}
1108+
1109+
/** @var SearchConfig $searchConfig */
1110+
$searchConfig = $this->objectManagerProvider->get()->get(SearchConfig::class);
1111+
$searchConfig->saveConfiguration($data);
11071112
}
11081113

11091114
/**

0 commit comments

Comments
 (0)