From 3ad2c9e666301748b7fcecc2918c231155c7b90a Mon Sep 17 00:00:00 2001 From: Agniva De Sarker Date: Tue, 19 Nov 2024 09:46:44 +0530 Subject: [PATCH] MM-59935: Add system console UI for Redis (#29143) https://mattermost.atlassian.net/browse/MM-59935 ```release-note Redis is now available as an alternative cache backend for all enterprise customers. It can be leveraged to run Mattermost at very high scale. There is a new section in config.json that can be updated to use Redis. CacheSettings.CacheType: This can be either lru or redis. "lru" is the default choice which will use the in-memory cache store that we use currently. CacheSettings.RedisAddress: The hostname of the Redis host CacheSettings.RedisPassword: The password of the Redis host. (Can be left blank if there is no password) CacheSettings.RedisDB: The database of the Redis host. Typically 0. CacheSettings.DisableClientCache: This can be set to true if you decide to disable the client-side cache of Redis. Typically there is no need to do this in production, and this is mainly used as a test option. ``` Co-authored-by: Carrie Warner (Mattermost) <74422101+cwarnermm@users.noreply.github.com> Co-authored-by: Mattermost Build --- .../admin_console/admin_definition.tsx | 115 +++++++++++++++++- .../__snapshots__/admin_sidebar.test.tsx.snap | 11 ++ webapp/channels/src/i18n/en.json | 15 +++ webapp/channels/src/utils/constants.tsx | 5 + 4 files changed, 145 insertions(+), 1 deletion(-) diff --git a/webapp/channels/src/components/admin_console/admin_definition.tsx b/webapp/channels/src/components/admin_console/admin_definition.tsx index 083cc8e2c4..0f8437003d 100644 --- a/webapp/channels/src/components/admin_console/admin_definition.tsx +++ b/webapp/channels/src/components/admin_console/admin_definition.tsx @@ -35,7 +35,7 @@ import {searchableStrings as teamAnalyticsSearchableStrings} from 'components/an import ExternalLink from 'components/external_link'; import RestrictedIndicator from 'components/widgets/menu/menu_items/restricted_indicator'; -import {Constants, CloudProducts, LicenseSkus, AboutLinks, DocLinks, DeveloperLinks} from 'utils/constants'; +import {Constants, CloudProducts, LicenseSkus, AboutLinks, DocLinks, DeveloperLinks, CacheTypes} from 'utils/constants'; import {isCloudLicense} from 'utils/license_utils'; import {ID_PATH_PATTERN} from 'utils/path'; import {getSiteURL} from 'utils/url'; @@ -294,6 +294,24 @@ const getRestrictedIndicator = (displayBlocked = false, minimumPlanRequiredForFe const adminDefinitionMessages = defineMessages({ data_retention_title: {id: 'admin.data_retention.title', defaultMessage: 'Data Retention Policy'}, ip_filtering_title: {id: 'admin.sidebar.ip_filtering', defaultMessage: 'IP Filtering'}, + cache_settings_title: {id: 'admin.cacheSettings.title', defaultMessage: 'Cache Settings'}, + + cache_type_title: {id: 'admin.cacheSettings.cacheTypeTitle', defaultMessage: 'Cache Type'}, + cache_type_desc: {id: 'admin.cacheSettings.cacheTypeDesc', defaultMessage: 'The type of the cache backend. E.g.: "redis" or "lru"'}, + + redis_address_title: {id: 'admin.cacheSettings.redisAddress', defaultMessage: 'Redis Address'}, + redis_address_desc: {id: 'admin.cacheSettings.redisAddressDesc', defaultMessage: 'The hostname:port of the Redis server. E.g.: "localhost:6379"'}, + redis_address_placeholder: {id: 'admin.cacheSettings.redisAddressPlaceholder', defaultMessage: 'localhost:6379'}, + + redis_password_title: {id: 'admin.cacheSettings.redisPassword', defaultMessage: 'Redis Password'}, + redis_password_desc: {id: 'admin.cacheSettings.redisPasswordDesc', defaultMessage: 'The password of the Redis server.'}, + + redis_db_title: {id: 'admin.cacheSettings.redisDB', defaultMessage: 'Redis DB'}, + redis_db_desc: {id: 'admin.cacheSettings.redisDBDesc', defaultMessage: 'The database of the Redis server. E.g.: "0"'}, + redis_db_placeholder: {id: 'admin.cacheSettings.redisDBPlaceholder', defaultMessage: '0'}, + + redis_clientcache_title: {id: 'admin.cacheSettings.redisClientCache', defaultMessage: 'Disable Client Cache'}, + redis_clientcache_desc: {id: 'admin.cacheSettings.redisClientCacheDesc', defaultMessage: 'When true, client-side caching is disabled.'}, }); const AdminDefinition: AdminDefinitionType = { about: { @@ -1524,6 +1542,101 @@ const AdminDefinition: AdminDefinitionType = { component: ClusterSettings, }, }, + cache_settings: { + url: 'environment/cache_settings', + title: adminDefinitionMessages.cache_settings_title, + isHidden: it.any( + it.not(it.licensedForFeature('Cluster')), + it.configIsTrue('ExperimentalSettings', 'RestrictSystemAdmin'), + it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.HIGH_AVAILABILITY)), + ), + searchableStrings: [ + adminDefinitionMessages.cache_settings_title, + adminDefinitionMessages.cache_type_title, + adminDefinitionMessages.cache_type_desc, + adminDefinitionMessages.redis_address_title, + adminDefinitionMessages.redis_address_desc, + adminDefinitionMessages.redis_password_title, + adminDefinitionMessages.redis_password_desc, + adminDefinitionMessages.redis_db_title, + adminDefinitionMessages.redis_db_desc, + adminDefinitionMessages.redis_clientcache_title, + adminDefinitionMessages.redis_clientcache_desc, + ], + isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.HIGH_AVAILABILITY)), + schema: { + id: 'CacheSettings', + name: adminDefinitionMessages.cache_settings_title, + settings: [ + { + type: 'banner', + label: defineMessage({id: 'admin.rate.noteDescription', defaultMessage: 'Changing properties in this section will require a server restart before taking effect.'}), + banner_type: 'info', + }, + { + type: 'dropdown', + key: 'CacheSettings.CacheType', + label: adminDefinitionMessages.cache_type_title, + help_text: adminDefinitionMessages.cache_type_desc, + help_text_markdown: true, + options: [ + { + value: CacheTypes.LRU, + display_name: defineMessage({id: 'admin.cacheSettings.cacheType.lru', defaultMessage: 'LRU'}), + }, + { + value: CacheTypes.REDIS, + display_name: defineMessage({id: 'admin.cacheSettings.cacheType.redis', defaultMessage: 'Redis'}), + }, + ], + isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.HIGH_AVAILABILITY)), + }, + { + type: 'text', + key: 'CacheSettings.RedisAddress', + label: adminDefinitionMessages.redis_address_title, + help_text: adminDefinitionMessages.redis_address_desc, + placeholder: adminDefinitionMessages.redis_address_placeholder, + isDisabled: it.any( + it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.HIGH_AVAILABILITY)), + it.not(it.stateEquals('CacheSettings.CacheType', CacheTypes.REDIS)), + ), + }, + { + type: 'text', + key: 'CacheSettings.RedisPassword', + label: adminDefinitionMessages.redis_password_title, + help_text: adminDefinitionMessages.redis_password_desc, + isDisabled: it.any( + it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.HIGH_AVAILABILITY)), + it.not(it.stateEquals('CacheSettings.CacheType', CacheTypes.REDIS)), + ), + }, + { + type: 'number', + key: 'CacheSettings.RedisDB', + label: adminDefinitionMessages.redis_db_title, + help_text: adminDefinitionMessages.redis_db_desc, + placeholder: adminDefinitionMessages.redis_db_placeholder, + isDisabled: it.any( + it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.HIGH_AVAILABILITY)), + it.not(it.stateEquals('CacheSettings.CacheType', CacheTypes.REDIS)), + ), + }, + { + type: 'bool', + key: 'CacheSettings.DisableClientCache', + label: adminDefinitionMessages.redis_clientcache_title, + help_text: adminDefinitionMessages.redis_clientcache_desc, + help_text_markdown: false, + isDisabled: it.any( + it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.HIGH_AVAILABILITY)), + it.not(it.stateEquals('CacheSettings.CacheType', CacheTypes.REDIS)), + ), + }, + ], + }, + }, rate_limiting: { url: 'environment/rate_limiting', title: defineMessage({id: 'admin.sidebar.rateLimiting', defaultMessage: 'Rate Limiting'}), diff --git a/webapp/channels/src/components/admin_console/admin_sidebar/__snapshots__/admin_sidebar.test.tsx.snap b/webapp/channels/src/components/admin_console/admin_sidebar/__snapshots__/admin_sidebar.test.tsx.snap index 2d1cdc5ca2..9bccb1107c 100644 --- a/webapp/channels/src/components/admin_console/admin_sidebar/__snapshots__/admin_sidebar.test.tsx.snap +++ b/webapp/channels/src/components/admin_console/admin_sidebar/__snapshots__/admin_sidebar.test.tsx.snap @@ -3651,6 +3651,17 @@ exports[`components/AdminSidebar should match snapshot, with license (with all f /> } /> + + } + />