Skip to content

Commit 2fba45e

Browse files
authored
ENGCOM-4791: Backport Magento 2.2 Set cache id prefix on installation #22439
2 parents 66baef7 + 2e8f086 commit 2fba45e

File tree

4 files changed

+174
-6
lines changed

4 files changed

+174
-6
lines changed

setup/src/Magento/Setup/Model/ConfigOptionsList/Cache.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,14 @@ class Cache implements ConfigOptionsListInterface
2727
const INPUT_KEY_CACHE_BACKEND_REDIS_DATABASE = 'cache-backend-redis-db';
2828
const INPUT_KEY_CACHE_BACKEND_REDIS_PORT = 'cache-backend-redis-port';
2929
const INPUT_KEY_CACHE_BACKEND_REDIS_PASSWORD = 'cache-backend-redis-password';
30+
const INPUT_KEY_CACHE_ID_PREFIX = 'cache-id-prefix';
3031

3132
const CONFIG_PATH_CACHE_BACKEND = 'cache/frontend/default/backend';
3233
const CONFIG_PATH_CACHE_BACKEND_SERVER = 'cache/frontend/default/backend_options/server';
3334
const CONFIG_PATH_CACHE_BACKEND_DATABASE = 'cache/frontend/default/backend_options/database';
3435
const CONFIG_PATH_CACHE_BACKEND_PORT = 'cache/frontend/default/backend_options/port';
3536
const CONFIG_PATH_CACHE_BACKEND_PASSWORD = 'cache/frontend/default/backend_options/password';
37+
const CONFIG_PATH_CACHE_ID_PREFIX = 'cache/frontend/default/id_prefix';
3638

3739
/**
3840
* @var array
@@ -112,6 +114,12 @@ public function getOptions()
112114
TextConfigOption::FRONTEND_WIZARD_TEXT,
113115
self::CONFIG_PATH_CACHE_BACKEND_PASSWORD,
114116
'Redis server password'
117+
),
118+
new TextConfigOption(
119+
self::INPUT_KEY_CACHE_ID_PREFIX,
120+
TextConfigOption::FRONTEND_WIZARD_TEXT,
121+
self::CONFIG_PATH_CACHE_ID_PREFIX,
122+
'ID prefix for cache keys'
115123
)
116124
];
117125
}
@@ -122,6 +130,11 @@ public function getOptions()
122130
public function createConfig(array $options, DeploymentConfig $deploymentConfig)
123131
{
124132
$configData = new ConfigData(ConfigFilePool::APP_ENV);
133+
if (isset($options[self::INPUT_KEY_CACHE_ID_PREFIX])) {
134+
$configData->set(self::CONFIG_PATH_CACHE_ID_PREFIX, $options[self::INPUT_KEY_CACHE_ID_PREFIX]);
135+
} else {
136+
$configData->set(self::CONFIG_PATH_CACHE_ID_PREFIX, $this->generateCachePrefix());
137+
}
125138

126139
if (isset($options[self::INPUT_KEY_CACHE_BACKEND])) {
127140
if ($options[self::INPUT_KEY_CACHE_BACKEND] == self::INPUT_VALUE_CACHE_REDIS) {
@@ -241,4 +254,14 @@ private function getDefaultConfigValue($inputKey)
241254
return '';
242255
}
243256
}
257+
258+
/**
259+
* Generate default cache ID prefix based on installation dir
260+
*
261+
* @return string
262+
*/
263+
private function generateCachePrefix(): string
264+
{
265+
return substr(\md5(dirname(__DIR__, 6)), 0, 3) . '_';
266+
}
244267
}

setup/src/Magento/Setup/Model/ConfigOptionsList/PageCache.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,15 @@ class PageCache implements ConfigOptionsListInterface
2828
const INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_PORT = 'page-cache-redis-port';
2929
const INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_COMPRESS_DATA = 'page-cache-redis-compress-data';
3030
const INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_PASSWORD = 'page-cache-redis-password';
31+
const INPUT_KEY_PAGE_CACHE_ID_PREFIX = 'page-cache-id-prefix';
3132

3233
const CONFIG_PATH_PAGE_CACHE_BACKEND = 'cache/frontend/page_cache/backend';
3334
const CONFIG_PATH_PAGE_CACHE_BACKEND_SERVER = 'cache/frontend/page_cache/backend_options/server';
3435
const CONFIG_PATH_PAGE_CACHE_BACKEND_DATABASE = 'cache/frontend/page_cache/backend_options/database';
3536
const CONFIG_PATH_PAGE_CACHE_BACKEND_PORT = 'cache/frontend/page_cache/backend_options/port';
3637
const CONFIG_PATH_PAGE_CACHE_BACKEND_COMPRESS_DATA = 'cache/frontend/page_cache/backend_options/compress_data';
3738
const CONFIG_PATH_PAGE_CACHE_BACKEND_PASSWORD = 'cache/frontend/page_cache/backend_options/password';
39+
const CONFIG_PATH_PAGE_CACHE_ID_PREFIX = 'cache/frontend/page_cache/id_prefix';
3840

3941
/**
4042
* @var array
@@ -122,6 +124,12 @@ public function getOptions()
122124
TextConfigOption::FRONTEND_WIZARD_TEXT,
123125
self::CONFIG_PATH_PAGE_CACHE_BACKEND_PASSWORD,
124126
'Redis server password'
127+
),
128+
new TextConfigOption(
129+
self::INPUT_KEY_PAGE_CACHE_ID_PREFIX,
130+
TextConfigOption::FRONTEND_WIZARD_TEXT,
131+
self::CONFIG_PATH_PAGE_CACHE_ID_PREFIX,
132+
'ID prefix for cache keys'
125133
)
126134
];
127135
}
@@ -132,6 +140,11 @@ public function getOptions()
132140
public function createConfig(array $options, DeploymentConfig $deploymentConfig)
133141
{
134142
$configData = new ConfigData(ConfigFilePool::APP_ENV);
143+
if (isset($options[self::INPUT_KEY_PAGE_CACHE_ID_PREFIX])) {
144+
$configData->set(self::CONFIG_PATH_PAGE_CACHE_ID_PREFIX, $options[self::INPUT_KEY_PAGE_CACHE_ID_PREFIX]);
145+
} else {
146+
$configData->set(self::CONFIG_PATH_PAGE_CACHE_ID_PREFIX, $this->generateCachePrefix());
147+
}
135148

136149
if (isset($options[self::INPUT_KEY_PAGE_CACHE_BACKEND])) {
137150
if ($options[self::INPUT_KEY_PAGE_CACHE_BACKEND] == self::INPUT_VALUE_PAGE_CACHE_REDIS) {
@@ -252,4 +265,14 @@ private function getDefaultConfigValue($inputKey)
252265
return '';
253266
}
254267
}
268+
269+
/**
270+
* Generate default cache ID prefix based on installation dir
271+
*
272+
* @return string
273+
*/
274+
private function generateCachePrefix(): string
275+
{
276+
return substr(\md5(dirname(__DIR__, 6)), 0, 3) . '_';
277+
}
255278
}

setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsList/CacheTest.php

Lines changed: 64 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ class CacheTest extends \PHPUnit\Framework\TestCase
2828
*/
2929
private $deploymentConfigMock;
3030

31+
/**
32+
* @inheritdoc
33+
*/
3134
protected function setUp()
3235
{
3336
$this->validatorMock = $this->createMock(RedisConnectionValidator::class);
@@ -39,7 +42,7 @@ protected function setUp()
3942
public function testGetOptions()
4043
{
4144
$options = $this->configOptionsList->getOptions();
42-
$this->assertCount(5, $options);
45+
$this->assertCount(6, $options);
4346

4447
$this->assertArrayHasKey(0, $options);
4548
$this->assertInstanceOf(SelectConfigOption::class, $options[0]);
@@ -60,6 +63,10 @@ public function testGetOptions()
6063
$this->assertArrayHasKey(4, $options);
6164
$this->assertInstanceOf(TextConfigOption::class, $options[4]);
6265
$this->assertEquals('cache-backend-redis-password', $options[4]->getName());
66+
67+
$this->assertArrayHasKey(5, $options);
68+
$this->assertInstanceOf(TextConfigOption::class, $options[5]);
69+
$this->assertEquals('cache-id-prefix', $options[5]->getName());
6370
}
6471

6572
public function testCreateConfigCacheRedis()
@@ -76,7 +83,8 @@ public function testCreateConfigCacheRedis()
7683
'port' => '',
7784
'database' => '',
7885
'password' => ''
79-
]
86+
],
87+
'id_prefix' => $this->expectedIdPrefix(),
8088
]
8189
]
8290
]
@@ -99,7 +107,8 @@ public function testCreateConfigWithRedisConfig()
99107
'port' => '1234',
100108
'database' => '5',
101109
'password' => ''
102-
]
110+
],
111+
'id_prefix' => $this->expectedIdPrefix(),
103112
]
104113
]
105114
]
@@ -116,6 +125,48 @@ public function testCreateConfigWithRedisConfig()
116125
$this->assertEquals($expectedConfigData, $configData->getData());
117126
}
118127

128+
public function testCreateConfigWithFileCache()
129+
{
130+
$this->deploymentConfigMock->method('get')->willReturn('');
131+
132+
$expectedConfigData = [
133+
'cache' => [
134+
'frontend' => [
135+
'default' => [
136+
'id_prefix' => $this->expectedIdPrefix(),
137+
]
138+
]
139+
]
140+
];
141+
142+
$configData = $this->configOptionsList->createConfig([], $this->deploymentConfigMock);
143+
144+
$this->assertEquals($expectedConfigData, $configData->getData());
145+
}
146+
147+
public function testCreateConfigWithIdPrefix()
148+
{
149+
$this->deploymentConfigMock->method('get')->willReturn('');
150+
151+
$explicitPrefix = 'XXX_';
152+
$expectedConfigData = [
153+
'cache' => [
154+
'frontend' => [
155+
'default' => [
156+
'id_prefix' => $explicitPrefix,
157+
]
158+
]
159+
]
160+
];
161+
162+
$configData = $this->configOptionsList->createConfig(
163+
['cache-id-prefix' => $explicitPrefix],
164+
$this->deploymentConfigMock
165+
);
166+
167+
$this->assertEquals($expectedConfigData, $configData->getData());
168+
}
169+
119170
public function testValidateWithValidInput()
120171
{
121172
$options = [
@@ -142,4 +193,14 @@ public function testValidateWithInvalidInput()
142193
$this->assertCount(1, $errors);
143194
$this->assertEquals("Invalid cache handler 'clay-tablet'", $errors[0]);
144195
}
196+
197+
/**
198+
* The default ID prefix, based on installation directory
199+
*
200+
* @return string
201+
*/
202+
private function expectedIdPrefix(): string
203+
{
204+
return substr(\md5(dirname(__DIR__, 8)), 0, 3) . '_';
205+
}
145206
}

setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsList/PageCacheTest.php

Lines changed: 64 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ class PageCacheTest extends \PHPUnit\Framework\TestCase
2828
*/
2929
private $deploymentConfigMock;
3030

31+
/**
32+
* @inheritdoc
33+
*/
3134
protected function setUp()
3235
{
3336
$this->validatorMock = $this->createMock(RedisConnectionValidator::class, [], [], '', false);
@@ -39,7 +42,7 @@ protected function setUp()
3942
public function testGetOptions()
4043
{
4144
$options = $this->configList->getOptions();
42-
$this->assertCount(6, $options);
45+
$this->assertCount(7, $options);
4346

4447
$this->assertArrayHasKey(0, $options);
4548
$this->assertInstanceOf(SelectConfigOption::class, $options[0]);
@@ -64,6 +67,10 @@ public function testGetOptions()
6467
$this->assertArrayHasKey(5, $options);
6568
$this->assertInstanceOf(TextConfigOption::class, $options[5]);
6669
$this->assertEquals('page-cache-redis-password', $options[5]->getName());
70+
71+
$this->assertArrayHasKey(6, $options);
72+
$this->assertInstanceOf(TextConfigOption::class, $options[6]);
73+
$this->assertEquals('page-cache-id-prefix', $options[6]->getName());
6774
}
6875

6976
public function testCreateConfigWithRedis()
@@ -81,7 +88,8 @@ public function testCreateConfigWithRedis()
8188
'database' => '',
8289
'compress_data' => '',
8390
'password' => ''
84-
]
91+
],
92+
'id_prefix' => $this->expectedIdPrefix(),
8593
]
8694
]
8795
]
@@ -105,7 +113,8 @@ public function testCreateConfigWithRedisConfiguration()
105113
'database' => '6',
106114
'compress_data' => '1',
107115
'password' => ''
108-
]
116+
],
117+
'id_prefix' => $this->expectedIdPrefix(),
109118
]
110119
]
111120
]
@@ -124,6 +133,48 @@ public function testCreateConfigWithRedisConfiguration()
124133
$this->assertEquals($expectedConfigData, $configData->getData());
125134
}
126135

136+
public function testCreateConfigWithFileCache()
137+
{
138+
$this->deploymentConfigMock->method('get')->willReturn('');
139+
140+
$expectedConfigData = [
141+
'cache' => [
142+
'frontend' => [
143+
'page_cache' => [
144+
'id_prefix' => $this->expectedIdPrefix(),
145+
]
146+
]
147+
]
148+
];
149+
150+
$configData = $this->configList->createConfig([], $this->deploymentConfigMock);
151+
152+
$this->assertEquals($expectedConfigData, $configData->getData());
153+
}
154+
155+
public function testCreateConfigWithIdPrefix()
156+
{
157+
$this->deploymentConfigMock->method('get')->willReturn('');
158+
159+
$explicitPrefix = 'XXX_';
160+
$expectedConfigData = [
161+
'cache' => [
162+
'frontend' => [
163+
'page_cache' => [
164+
'id_prefix' => $explicitPrefix,
165+
]
166+
]
167+
]
168+
];
169+
170+
$configData = $this->configList->createConfig(
171+
['page-cache-id-prefix' => $explicitPrefix],
172+
$this->deploymentConfigMock
173+
);
174+
175+
$this->assertEquals($expectedConfigData, $configData->getData());
176+
}
177+
127178
public function testValidationWithValidData()
128179
{
129180
$this->validatorMock->expects($this->once())
@@ -151,4 +202,14 @@ public function testValidationWithInvalidData()
151202
$this->assertCount(1, $errors);
152203
$this->assertEquals('Invalid cache handler \'foobar\'', $errors[0]);
153204
}
205+
206+
/**
207+
* The default ID prefix, based on installation directory
208+
*
209+
* @return string
210+
*/
211+
private function expectedIdPrefix(): string
212+
{
213+
return substr(\md5(dirname(__DIR__, 8)), 0, 3) . '_';
214+
}
154215
}

0 commit comments

Comments
 (0)