diff --git a/build/components/component.py b/build/components/component.py index ba6a6e73da..2e895e28e9 100644 --- a/build/components/component.py +++ b/build/components/component.py @@ -3,27 +3,28 @@ import os import shutil -import semver -import uuid from typing import Tuple from urllib.parse import urlparse, ParseResult -from .markdown import Markdown +import requests + from .structured_data import load_dict, dump_dict -from .syntax import Command -from .util import die, mkdir_p, rsync, regex_in_file, run, rm_rf, command_filename, slugify +from .util import die, mkdir_p, rsync, run, rm_rf from .example import Example def parseUri(uri: str) -> Tuple[ParseResult, str, str]: + logging.debug("ENTERING: ") _uri = urlparse(uri) dirname = os.path.dirname(uri) _, name = os.path.split(_uri.path) _, ext = os.path.splitext(name) + logging.debug("EXITING: ") return _uri, dirname, name, ext class Component(dict): def __init__(self, filepath: str = None, root: dict = None, args: dict = None): + logging.debug("ENTERING: ") super().__init__() self._root = root self._args = args @@ -37,201 +38,103 @@ def __init__(self, filepath: str = None, root: dict = None, args: dict = None): self._desc = self.get('description', '') self._stack_path = self.get('stack_path', '') self._repository = self.get('repository', None) - - @staticmethod - def _dump_payload(spath: str, dpath: str, payload: list, repo: str = None, repo_branch: str = None) -> None: - if not payload: - return [] - files = [] - for dump in payload: - src = dump.get('src') - dst = dump.get('dst', src) - proc_md = dump.get('proc_md') - s = os.path.join(spath, src) - d = os.path.join(dpath, dst) - if os.path.isfile(s): - mkdir_p(os.path.dirname(d)) - else: - mkdir_p(d) - files += rsync(s, d) - - # if proc_md: - #Component._add_meta_fm(repo, repo_branch, d, src) - - search = dump.get('search', None) - replace = dump.get('replace', None) - if search: - if os.path.isdir(s): - files = next(os.walk(d), (None, None, []))[2] - else: - files = [d] - for file in files: - regex_in_file(file, search, replace) - - @staticmethod - def _get_dev_branch(repository: dict) -> str: - branch = repository.get("dev_branch") - post = repository .get("branches_postfix", "") - return f'{branch}{post}' - - @staticmethod - def _add_meta_fm(repo: str, branch: str, base: str, path: str) -> None: - _, dirs, files = next(os.walk(base)) - for d in dirs: - spath = path.split('/')[-1] - if spath == d: - Component._add_meta_fm(repo, branch, os.path.join(base, d), path) - else: - Component._add_meta_fm(repo, branch, os.path.join(base, d), os.path.join(path, d)) - for f in files: - if not f.endswith('.md'): - continue - md = Markdown(os.path.join(base, f)) - md.add_github_metadata(repo, branch, os.path.join(path, f)) - md.persist() + logging.debug("EXITING: ") def _git_clone(self, repo) -> str: + logging.debug("ENTERING: ") + git_uri = repo.get('git_uri') private = repo.get('private', False) uri, _, name, ext = parseUri(git_uri) to = f'{self._root._tempdir}/{name}' + if uri.scheme == 'https' and ext in ['', '.git'] and self._repo_uri() != git_uri: if not self._root._skip_clone and git_uri not in self._root._clones: rm_rf(to) mkdir_p(to) - logging.debug( - f'Cloning {private and "private" or "public"} {git_uri} to {to}') + + # Extract owner and repo name from git_uri + path_parts = uri.path.strip('/').split('/') + if len(path_parts) >= 2: + owner, repo_name = path_parts[0], path_parts[1].replace('.git', '') + + # Get latest release tag from GitHub API + api_url = f"https://api.github.com/repos/{owner}/{repo_name}/releases/latest" + github_token = os.environ.get('PRIVATE_ACCESS_TOKEN') + headers = {"Authorization": f"Bearer {github_token}"} if github_token else {} + + try: + response = requests.get(api_url, headers=headers) + response.raise_for_status() + latest_tag = response.json()["tag_name"] + logging.debug(f'Found latest release tag: {latest_tag}') + use_latest_tag = True + except Exception as e: + logging.warning(f'Failed to get latest release tag: {str(e)}') + use_latest_tag = False + else: + use_latest_tag = False + + logging.debug(f'Cloning {private and "private" or "public"} {git_uri} to {to}') self._root._clones[git_uri] = True + if private: pat = os.environ.get('PRIVATE_ACCESS_TOKEN') if pat is None: die('Private repos without a PRIVATE_ACCESS_TOKEN - aborting.') git_uri = f'{uri.scheme}://{pat}@{uri.netloc}{uri.path}' - run(f'git clone {git_uri} {to}') - run(f'git fetch --all --tags', cwd=to) + + if use_latest_tag: + run(f'git clone --depth 1 --branch {latest_tag} {git_uri} {to}') + else: + run(f'git clone {git_uri} {to}') + run(f'git fetch --all --tags', cwd=to) else: logging.debug(f'Skipping clone {git_uri}') + logging.debug("EXITING: ") return to elif self._repo_uri() == git_uri: + logging.debug("EXITING: ") return self._repo_env_dir() elif (uri.scheme == 'file' or uri.scheme == '') and ext == '': + logging.debug("EXITING: ") return uri.path else: die('Cannot determine git repo - aborting.') - def _get_commands(self) -> list: - commands = self.get('commands') - repo = self._git_clone(commands) - branch = Component._get_dev_branch(commands) - self._checkout(branch, repo, commands) - path = commands.get('path', '') - - logging.info(f'Copying {self._id} commands') - filename = commands.get('defs', 'commands.json') - filepath = f'{repo}/{filename}' - logging.info( - f'Reading {self._id} {self._type} commands.json from {branch}/{filename}') - cmds = load_dict(filepath) - - sinter = set(cmds).intersection(set(self._root._commands)) - if len(sinter) != 0: - logging.error(f'Duplicate command(s) found in {self._id}:') - logging.error(sinter) - die() - - if self._type == 'module': - for key in cmds: - cmds[key]['module'] = self._name - cmds[key]['stack_path'] = self._stack_path - self._root._commands.update(cmds) - - base = f'{repo}/{path}/' - dst = f'{self._root._website.get("content")}/commands/' - srcs = [f'{base}{command_filename(cmd)}.md' for cmd in cmds] - files = rsync(' '.join(srcs), dst)[1:-5] - self._dump_payload(base, dst, cmds.get('payload', None)) - #self._add_meta_fm(commands.get('git_uri'), branch, dst, path) - if self._type == 'module': - for file in files: - path = f'{dst}/{file}' - md = Markdown(path) - md.patch_module_paths(self._id, self._stack_path) - md.persist() - return files - - def _get_groups(self) -> None: - for key, val in self.get('groups').items(): - d = { - 'display': val.get('display', self._name), - 'description': val.get('description', self._desc), - 'weight': self.get('stack_weight', 0) - } - if self._type == 'module': - top = 'stack' - vdt = {} - else: - top = 'core' - vdt = [] - if not self._root._groups.get(top): - self._root._groups[top] = {} - self._root._versions[top] = vdt - if self._type == 'module': - self._root._versions[top][key] = [] - self._root._groups[top][key] = d - - def _get_docs(self) -> list: - docs = self.get('docs') - if docs is None: - return [] - - repo = self._git_clone(docs) - branch = Component._get_dev_branch(docs) - self._checkout(branch, repo, docs) - path = docs.get('path', '') - logging.info(f'Copying {self._id} docs') - src = f'{repo}/{path}/' - dst = f'{self._content}' - mkdir_p(dst) - files = rsync(src, dst)[1:-5] - Component._dump_payload(src, dst, docs.get('payload', None)) - #Component._add_meta_fm(docs.get('git_uri'), branch, dst, path) - return files - - def _get_misc(self) -> None: - misc = self.get('misc') - payload = misc.get('payload') - repo = self._git_clone(misc) - branch = Component._get_dev_branch(misc) - self._checkout(branch, repo, misc) - Component._dump_payload(repo, self._root._content, payload, misc.get('git_uri'), branch) - return - def _repo_env_dir(self) -> str: + logging.debug("ENTERING: ") if os.getenv(f'REPO_DIR'): + logging.debug("EXITING: ") return os.getenv(f'REPO_DIR') + logging.debug("EXITING: ") return '' def _repo_uri(self) -> str: + logging.debug("ENTERING: ") if(os.getenv('REPOSITORY_URL')): + logging.debug("EXITING: ") return os.getenv('REPOSITORY_URL') + logging.debug("EXITING: ") return '' - def _preview_mode(self) -> bool: - if(os.getenv("PREVIEW_MODE") == 1): - return True - return False - def _skip_checkout(self, obj) -> bool: + logging.debug("ENTERING: ") if obj.get('git_uri') == self._repo_uri() and self._preview_mode(): + logging.debug("EXITING: ") return True + logging.debug("EXITING: ") return False def _checkout(self, ref, dest, obj): + logging.debug("ENTERING: ") if not self._skip_checkout(obj): run(f'git checkout {ref}', cwd=dest) + logging.debug("EXITING: ") class All(Component): def __init__(self, filepath: str, root: dict = None, args: dict = None): + logging.debug("ENTERING: ") super().__init__(filepath, root, args) self._groups = {} self._commands = {} @@ -244,79 +147,17 @@ def __init__(self, filepath: str, root: dict = None, args: dict = None): self._content = f'{self._website.get("path")}/{self._website.get("content")}' self._examples = {} mkdir_p(self._content) - - def _persist_commands(self) -> None: - filepath = f'{self._website.get("path")}/{self._website.get("commands")}' - logging.info(f'Persisting {self._id} commands: {filepath}') - dump_dict(filepath, self._commands) - - def _persist_groups(self) -> None: - filepath = f'{self._website.get("path")}/{self._website.get("groups")}' - logging.info(f'Persisting {self._id} groups: {filepath}') - dump_dict(filepath, self._groups) + logging.debug("EXITING: ") def _persist_examples(self) -> None: + logging.debug("ENTERING: ") filepath = f'{self._website.get("path")}/{self._website.get("examples")}' logging.info(f'Persisting {self._id} examples: {filepath}') dump_dict(filepath, self._examples) - - def _persist_versions(self) -> None: - filepath = f'{self._website.get("path")}/{self._website.get("versions")}' - logging.info(f'Persisting {self._id} versions: {filepath}') - for cmd in self._commands.values(): - since = semver.VersionInfo.parse(cmd.get('since')) - since = f'{since.major}.{since.minor}' - if not cmd.get('module'): - vers = self._versions['core'] - else: - vers = self._versions['stack'][cmd.get('group')] - if since not in vers: - vers.append(since) - vers.sort(reverse=True) - dump_dict(filepath, self._versions) - - def _make_repos(self) -> None: - logging.info(f'Making {self._id} repositories') - meta = load_dict(self.get('website').get('meta')) - for kname, kind in self._repos.items(): - for gname, group in kind.items(): - path = f'{self._content}/resources/{kname}' - mkdir_p(path) - for pname, project in group.items(): - filename = f'{path}/{slugify(gname)}_{slugify(pname)}.md' - # cheap hack to workaround two (or more) clients that resolve to the same filename - if kname == 'clients' and os.path.isfile(filename): - uu = uuid.uuid4().hex[0:7] - filename = f'{path}/{slugify(gname)}_{slugify(pname)}{uu}.md' - md = Markdown(filename, True) - md.payload = '' - md.fm_data['recommended'] = False - md.fm_data['official'] = False - md.fm_data.update(project) - md.fm_data.update({'title': pname}) - md.fm_data.update({'group': gname}) - md.fm_data.update({'kind': kname}) - md.fm_data.update(meta.get(project.get('repository'), {})) - md.persist() - dump_dict(f'data/repos.json', self._repos) - - def _process_commands(self) -> None: - logging.info(f'Processing {self._id} commands') - for name in self._commands: - path = f'{self._content}/commands/{command_filename(name)}.md' - md = Markdown(path) - md.process_command(name, self._commands) - # Note: SVG generation removed as part of directory structure simplification - - def _process_docs(self) -> None: - logging.info(f'Processing {self._id} docs') - out = run( - f'find {self._content} -type f -name "*.md" | grep -ive "{self._content}/commands"').strip().split('\n') - for md_path in out: - md = Markdown(md_path, True) - md.process_doc(self._commands) + logging.debug("EXITING: ") def apply(self) -> None: + logging.debug("ENTERING: ") for kind in ['clients','core', 'docs', 'modules', 'assets']: for component in self.get(kind): if type(component) == str: @@ -340,166 +181,67 @@ def apply(self) -> None: else: die(f'Unknown component definition for {component}') c.apply() - # self._persist_commands() - # self._persist_groups() self._persist_examples() - # self._persist_versions() - # self._process_commands() - # self._process_docs() - self._make_repos() - + logging.debug("EXITING: ") -class Core(Component): - def __init__(self, filepath: str, root: dict = None): - super().__init__(filepath, root) - self._content = f'{self._root._content}/{self._stack_path}' - - @staticmethod - def _make_data(path: str) -> dict: - data = {} - for root, _, files in os.walk(path, topdown=False): - for filename in files: - fullpath = os.path.join(root, filename) - name, _ = os.path.splitext(filename) - s = root[len(path)+1:].split('/') - key, domain = s[0], s[1] - if len(s) > 2: - org = f'{s[2]}/' - else: - org = '' - d = load_dict(fullpath) - field = d.pop('name') - d.update({ - 'repository': f'{domain}/{org}{name}', - }) - if key not in data: - data.update({ - key: {} - }) - data.get(key).update({ - field: d - }) - return data - - def _get_data(self) -> None: - data = self.get('data') - repo = self._git_clone(data) - branch = Component._get_dev_branch(data) - self._checkout(branch, repo, data) - logging.info(f'Getting {self._id} data') - for src in ['languages', 'tool_types', 'resp2_replies', 'resp3_replies']: - filename = data.get(src) - filepath = f'{repo}/{filename}' - rsync(filepath, 'data/') - for src in ['clients', 'libraries', 'modules', 'tools']: - data = self._make_data(f'{repo}/{src}') - self._root._repos[src] = data - - def _get_conf_file(self) -> None: - ''' Gets the unstable redis.conf and embeds it in the "template" ''' - proj = self.get('repository') - repo = self._git_clone(proj) - branch = Component._get_dev_branch(proj) - self._checkout(branch, repo, proj) - src = f'{repo}/redis.conf' - dst = f'{self._content}/{self.get("config_file_template")}' - logging.info(f'Embedding {self._id} redis.conf into {dst}') - md = Markdown(dst) - with open(src, 'r') as f: - md.payload = f.read() - md.payload = f'\n```\n{md.payload}\n```\n' - md.persist() - - def apply(self) -> None: - logging.info(f'Applying core {self._id}') - files = self._get_docs() - files += self._get_commands() - self._get_misc() - self._get_groups() - self._get_data() - self._get_conf_file() - return files - - -class Docs(Component): - def __init__(self, filepath: str, root: dict = None): - super().__init__(filepath, root) - self._content = f'{self._root._content}/{self._stack_path}' - - def apply(self) -> None: - logging.info(f'Applying docs {self._id}') - files = self._get_docs() - self._get_misc() - return files - - -class Module(Component): - def __init__(self, filepath: str, root: dict = None): - super().__init__(filepath, root) - self._content = f'{self._root._content}/{self._stack_path}' - - def _process_module_docs(self, files: list) -> None: - if self.get('type') == 'module': - foes = [f'{self._content}/{f}' for f in ['index.md', '_index.md']] - l = len(foes) - while l > 0: - f = foes.pop(0) - l -= 1 - if os.path.isfile(f): - foes.append(f) - if len(foes) == 0: - logging.warning( - f'no index.md nor _index.md found in {self._content} - please rectify the situation stat!!') - if len(foes) > 1: - logging.warning( - f'both index.md and _index.md exist in {self._content} - please address this immediately!!!') - - stack_weight = self.get('stack_weight') - for f in foes: - md = Markdown(f) - md.fm_data['weight'] = stack_weight - md.persist() - - files = run( - f'find {self._content} -regex ".*\.md"').strip().split('\n') - for f in files: - md = Markdown(f) - t = md.fm_data.pop('type', None) - if t: - logging.warning( - f'the file {f} has a type set to `{t}` - please prevent future harm by acting now, thank you.') - md.patch_module_paths(self._id, self._stack_path) - md.persist() - - def apply(self) -> None: - logging.info(f'Applying module {self._id}') - files = self._get_docs() - self._process_module_docs(files) - files += self._get_commands() - self._get_groups() - return files class Client(Component): def __init__(self, filepath: str, root: dict = None): + logging.debug("ENTERING: ") print(str("file_path = {}".format(filepath))) super().__init__(filepath, root) + logging.debug("EXITING: ") def _get_example_id_from_file(self, path): + logging.debug("ENTERING: ") with open(path) as cf: fline = cf.readline() if 'EXAMPLE:' in fline: + logging.debug("EXITING: ") return fline.split(':')[1].strip() + logging.debug("EXITING: ") return None + def _get_default_branch(self, git_uri): + """Get the default branch name for a GitHub repository.""" + logging.debug("ENTERING: ") + try: + # Extract owner and repo name from git_uri + from urllib.parse import urlparse + uri = urlparse(git_uri) + path_parts = uri.path.strip('/').split('/') + if len(path_parts) >= 2: + owner, repo_name = path_parts[0], path_parts[1].replace('.git', '') + + # Get repository info from GitHub API + api_url = f"https://api.github.com/repos/{owner}/{repo_name}" + github_token = os.environ.get('PRIVATE_ACCESS_TOKEN') + headers = {"Authorization": f"Bearer {github_token}"} if github_token else {} + + response = requests.get(api_url, headers=headers) + response.raise_for_status() + default_branch = response.json()["default_branch"] + logging.debug(f'Found default branch: {default_branch} for {git_uri}') + logging.debug("EXITING: ") + return default_branch + except Exception as e: + logging.warning(f'Failed to get default branch for {git_uri}: {str(e)}') + + # Fallback to 'main' if API call fails + logging.debug("EXITING: ") + return 'main' + def _copy_examples(self): + logging.debug("ENTERING: ") if ex := self.get('examples'): repo = self._git_clone(ex) - dev_branch = ex.get('dev_branch') - self._checkout(dev_branch, repo, ex) path = ex.get('path', '') + # Get the default branch for sourceUrl generation + default_branch = self._get_default_branch(ex.get('git_uri')) + src = f'{repo}/{path}/' dst = f'{self._root._website.get("path")}/{self._root._website.get("examples_path")}' @@ -529,7 +271,7 @@ def _copy_examples(self): example_metadata['hidden'] = e.hidden example_metadata['named_steps'] = e.named_steps example_metadata['sourceUrl'] = ( - f'{ex["git_uri"]}/tree/{ex["dev_branch"]}/{ex["path"]}/{os.path.basename(f)}' + f'{ex["git_uri"]}/tree/{default_branch}/{ex["path"]}/{os.path.basename(f)}' ) examples = self._root._examples if example_id not in examples: @@ -537,18 +279,10 @@ def _copy_examples(self): logging.info(f'Example {example_id} processed successfully.') examples[example_id][self.get('label')] = example_metadata + logging.debug("EXITING: ") def apply(self) -> None: + logging.debug("ENTERING: ") logging.info(f'Applying client {self._id}') self._copy_examples() - -class Asset(Component): - def __init__(self, filepath: str, root: dict = None): - super().__init__(filepath, root) - - def apply(self) -> None: - logging.info(f'Applying asset {self._id}') - repo = self._git_clone(self._repository) - dev_branch = self._repository.get('dev_branch') - self._checkout(dev_branch, repo, self._repository) # - return Component._dump_payload(repo, './', self._repository.get('payload')) + logging.debug("EXITING: ") diff --git a/build/components/example.py b/build/components/example.py index 855776dd1a..f615d4f168 100644 --- a/build/components/example.py +++ b/build/components/example.py @@ -14,7 +14,7 @@ 'java-sync': '@Test', 'java-async': '@Test', 'java-reactive': '@Test', - 'c#': '\[Fact\]|\[SkipIfRedis\(.*\)\]' + 'c#': r'\[Fact]|\[SkipIfRedis\(.*\)]' } PREFIXES = { 'python': '#', @@ -39,8 +39,10 @@ class Example(object): named_steps = None def __init__(self, language: str, path: str) -> None: + logging.debug("ENTERING: ") if not PREFIXES.get(language.lower()): logging.error(f'Unknown language "{language}" for example {path}') + logging.debug("EXITING: ") return self.language = language.lower() self.path = path @@ -51,14 +53,18 @@ def __init__(self, language: str, path: str) -> None: self.named_steps = {} self.make_ranges() self.persist(self.path) + logging.debug("EXITING: ") def persist(self, path: str = None) -> None: + logging.debug("ENTERING: ") if not path: path = self.path with open(path,'w') as f: f.writelines(self.content) + logging.debug("EXITING: ") def make_ranges(self) -> None: + logging.debug("ENTERING: ") curr = 0 highlight = 1 hidden = None @@ -154,8 +160,10 @@ def make_ranges(self) -> None: if hidden is not None: logging.error(f'Unclosed hidden anchor in {self.path}:L{hidden+1} - aborting.') + logging.debug("EXITING: ") return if highlight < len(content): self.highlight.append(f'{highlight}-{len(content)}') self.content = content + logging.debug("EXITING: ") diff --git a/build/components/github.py b/build/components/github.py deleted file mode 100644 index c77bade2e3..0000000000 --- a/build/components/github.py +++ /dev/null @@ -1,49 +0,0 @@ -import logging -import os -import requests -from datetime import datetime, timedelta -from urllib.parse import urlparse - - -class Repository(dict): - _props = ['archived', 'description', 'forks_count', 'stargazers_count', - 'open_issues_count', ] - - def __init__(self, uri, gh_token=None): - super().__init__() - self.uri = urlparse(f'https://{uri}') - self.gh_token = gh_token - self.owner, self.name = os.path.split(self.uri.path) - self.owner = self.owner[1:] - for prop in self._props: - self[prop] = None - self._get_gh_stats() - - def _get_gh_stats(self) -> None: - if self.uri.netloc != 'github.com': - logging.warning( - f'Unknown repository provider {self.uri.netloc} - skipping stats.') - return - if not self.gh_token: - logging.warning( - f'No PRIVATE_ACCESS_TOKEN for {self.uri.netloc} - skipping stats.') - return - r = requests.get( - f'https://api.github.com/repos/{self.owner}/{self.name}', - headers={ - 'Authorization': f'token {self.gh_token}' - }) - j = r.json() - for prop in self: - p = j.get(prop) - if p and (type(p) != str or len(p) > 0): - self[prop] = p - license = j.get('license') - if license and license.get('key') != 'other': - self['license'] = license.get('spdx_id') - p = j.get('pushed_at') - if p: - fmt = '%Y-%m-%dT%H:%M:%SZ' - d = datetime.strptime(p, fmt) - self['pushed_at'] = d.timestamp() - self['active'] = d > (datetime.now() - timedelta(days=30*6)) diff --git a/build/components/markdown.py b/build/components/markdown.py index c21178d7e4..544c037d3a 100644 --- a/build/components/markdown.py +++ b/build/components/markdown.py @@ -1,9 +1,7 @@ import logging import os -import re from .structured_data import StructuredData -from .syntax import Command -from .util import die, command_filename +from .util import die class Markdown: @@ -23,6 +21,7 @@ class Markdown: } def __init__(self, filepath: str, warnings: bool = False): + logging.debug("ENTERING: ") self.filepath = filepath self.warnings = warnings self.fm_data = dict() @@ -30,12 +29,14 @@ def __init__(self, filepath: str, warnings: bool = False): self.fm_ext = self.fm_type.get('ext') self.payload = '' if not self.filepath or not os.path.exists(self.filepath): + logging.debug("EXITING: ") return with open(self.filepath, 'r') as f: payload = f.readlines() if len(payload) == 0: self.fm_type = self.FM_TYPES.get('---\n') self.fm_ext = self.fm_type.get('ext') + logging.debug("EXITING: ") return i = 0 while i < len(payload): @@ -51,6 +52,7 @@ def __init__(self, filepath: str, warnings: bool = False): self.payload = ''.join(payload) self.fm_type = self.FM_TYPES.get('---\n') self.fm_ext = self.fm_type.get('ext') + logging.debug("EXITING: ") return eof, self.fm_ext = self.fm_type.get('eof'), self.fm_type.get('ext') found = False @@ -68,28 +70,10 @@ def __init__(self, filepath: str, warnings: bool = False): self.fm_data.update(StructuredData.loads( self.fm_ext, ''.join(payload[i+1:j]))) self.payload = ''.join(payload[j+1:]) - - def add_github_metadata(self, github_repo: str, github_branch: str, github_path: str) -> None: - if self.fm_data.get('github_repo'): - return - self.fm_data['github_repo'] = github_repo - self.fm_data['github_branch'] = github_branch - self.fm_data['github_path'] = github_path - - def report_links(self) -> None: - links = re.findall(r'(\[.+\])(\(.+\))', self.payload) - exc = ['./', '#', '/commands', '/community', '/docs', '/topics'] - for link in links: - ex = False - for e in exc: - if link[1].startswith(f'({e}'): - ex = True - break - if not ex: - print(f'"{link[1]}","{link[0]}","{self.filepath}"') + logging.debug("EXITING: ") def persist(self) -> None: - # self.report_links() + logging.debug("ENTERING: ") payload = self.payload if self.fm_type: fm = StructuredData.dumps(self.fm_ext, self.fm_data) @@ -105,146 +89,4 @@ def persist(self) -> None: with open(self.filepath, 'w') as f: f.write(payload) - - @staticmethod - def get_command_tokens(arguments: dict) -> set: - """ Extract tokens from command arguments """ - rep = set() - if type(arguments) is list: - for arg in arguments: - rep = rep.union(Markdown.get_command_tokens(arg)) - else: - if 'token' in arguments: - rep.add(arguments['token']) - if 'arguments' in arguments: - for arg in arguments['arguments']: - rep = rep.union(Markdown.get_command_tokens(arg)) - return rep - - @staticmethod - def make_command_linkifier(commands: dict, name: str): - """ - Returns a function (for re.sub) that converts valid ticked command names to - markdown links. This excludes the command in the context, as well as any of - its arguments' tokens. - """ - if name: - exclude = set([name]) - tokens = Markdown.get_command_tokens(commands.get(name)) - exclude.union(tokens) - else: - exclude = set() - - def linkifier(m): - command = m.group(1) - if command in commands and command not in exclude: - return f'[`{command}`]({{{{< relref "/commands/{command_filename(command)}" >}}}})' - else: - return m.group(0) - return linkifier - - def generate_commands_links(self, name: str, commands: dict, payload: str) -> str: - """ Generate markdown links for back-ticked commands """ - linkifier = Markdown.make_command_linkifier(commands, name) - rep = re.sub(r'`([A-Z][A-Z-_ \.]*)`', linkifier, payload) - rep = re.sub(r'`!([A-Z][A-Z-_ \.]*)`', lambda x: f'`{x[1]}`', rep) - return rep - - @staticmethod - def get_cli_shortcode(m): - snippet = m[1] - start = f'{{{{% redis-cli %}}}}' - end = f'{{{{% /redis-cli %}}}}' - return f'{start}\n{snippet.strip()}\n{end}\n' - - @staticmethod - def convert_cli_snippets(payload): - """ Convert the ```cli notation to Hugo shortcode syntax """ - rep = re.sub(r'```cli(.*?)```', - Markdown.get_cli_shortcode, payload, flags=re.S) - return rep - - @staticmethod - def convert_reply_shortcuts(payload): - """ Convert RESP reply type shortcuts to links """ - def reply(x): - resp = { - 'simple-string': ('simple-strings', 'Simple string reply'), - 'simple-error': ('simple-errors', 'Simple error reply'), - 'integer': ('integers', 'Integer reply'), - 'bulk-string': ('bulk-strings', 'Bulk string reply'), - 'array': ('arrays', 'Array reply'), - 'nil': ('bulk-strings', 'Nil reply'), - 'null': ('nulls', 'Null reply'), - 'boolean': ('booleans', 'Boolean reply'), - 'double': ('doubles', 'Double reply'), - 'big-number': ('big-numbers', 'Big number reply'), - 'bulk-error': ('bulk-errors', 'Bulk error reply'), - 'verbatim-string': ('verbatim-strings', 'Verbatim string reply'), - 'map': ('maps', 'Map reply'), - 'set': ('sets', 'Set reply'), - 'push': ('pushes', 'Push reply') - } - rep = resp.get(x.group(1), None) - if rep: - return f'[{rep[1]}](/docs/reference/protocol-spec#{rep[0]})' - return f'[]' - - rep = re.sub(r'@([a-z\-]+)-reply', reply, payload) - return rep - - @staticmethod - def convert_command_sections(payload): - """ Converts redis-doc section headers to MD """ - rep = re.sub(r'@examples\n', - '## Examples\n', payload) - rep = re.sub(r'@return\n', - '## Return\n', rep) - return rep - - def add_command_frontmatter(self, name, commands): - """ Sets a JSON FrontMatter payload for a command page """ - data = commands.get(name) - c = Command(name, data) - data.update({ - 'title': name, - 'linkTitle': name, - 'description': data.get('summary'), - 'syntax_str': str(c), - 'syntax_fmt': c.syntax(), - 'hidden': c.isPureContainer() or c.isHelpCommand() - }) - if 'replaced_by' in data: - data['replaced_by'] = self.generate_commands_links( - name, commands, data.get('replaced_by')) - self.fm_type = self.FM_TYPES.get('---\n') - self.fm_ext = self.fm_type.get('ext') - self.fm_data.update(data) - - def process_command(self, name, commands): - """ New command processing logic """ - logging.debug(f'Processing command {self.filepath}') - self.payload = self.generate_commands_links( - name, commands, self.payload) - self.payload = self.convert_command_sections(self.payload) - self.payload = self.convert_reply_shortcuts(self.payload) - self.payload = self.convert_cli_snippets(self.payload) - self.add_command_frontmatter(name, commands) - self.persist() - - def process_doc(self, commands): - """ New doc processing logic """ - logging.debug(f'Processing document {self.filepath}') - self.payload = self.generate_commands_links( - None, commands, self.payload) - self.persist() - - def patch_module_paths(self, module_id: str, module_path) -> None: - """ Replaces absolute module documentation links """ - def rep(x): - if x.group(2).startswith(f'(/{module_id}/'): - r = f'{x.group(1)}(/{module_path}/{x.group(2)[len(module_id)+3:-1]})' - return r - else: - return x.group(0) - self.payload = re.sub(f'(\[.+?\])(\(.+?\))', rep, self.payload) + logging.debug("EXITING: ") diff --git a/build/components/structured_data.py b/build/components/structured_data.py index 96c0194064..ebc86b2b6f 100644 --- a/build/components/structured_data.py +++ b/build/components/structured_data.py @@ -1,5 +1,6 @@ import io import json +import logging import os import pytoml import yaml @@ -29,46 +30,68 @@ class StructuredData: } def __init__(self): + logging.debug("ENTERING: ") pass + logging.debug("EXITING: ") @staticmethod def dump(ext: str, d: dict, f: Any) -> None: + logging.debug("ENTERING: ") if ext in StructuredData.PARSERS: - return StructuredData.PARSERS.get(ext).get('dump')(d, f) + result = StructuredData.PARSERS.get(ext).get('dump')(d, f) + logging.debug("EXITING: ") + return result else: + logging.debug("EXITING: ") raise RuntimeError(f'unknown extension {ext}') @staticmethod def dumps(ext: str, d: dict) -> None: + logging.debug("ENTERING: ") if ext in StructuredData.PARSERS: - return StructuredData.PARSERS.get(ext).get('dumps')(d) + result = StructuredData.PARSERS.get(ext).get('dumps')(d) + logging.debug("EXITING: ") + return result else: + logging.debug("EXITING: ") raise RuntimeError(f'unknown extension {ext}') @staticmethod def load(ext: str, f: Any) -> dict: + logging.debug("ENTERING: ") if ext in StructuredData.PARSERS: - return StructuredData.PARSERS.get(ext).get('load')(f) + result = StructuredData.PARSERS.get(ext).get('load')(f) + logging.debug("EXITING: ") + return result else: + logging.debug("EXITING: ") raise RuntimeError(f'unknown extension {ext}') @staticmethod def loads(ext: str, s: str) -> dict: + logging.debug("ENTERING: ") if ext in StructuredData.PARSERS: - return StructuredData.PARSERS.get(ext).get('loads')(s) + result = StructuredData.PARSERS.get(ext).get('loads')(s) + logging.debug("EXITING: ") + return result else: + logging.debug("EXITING: ") raise RuntimeError(f'unknown extension {ext}') def load_dict(filepath: str) -> dict: + logging.debug("ENTERING: ") # _, name = os.path.split(filepath) _, ext = os.path.splitext(filepath) with open(filepath, 'r') as f: o = StructuredData.load(ext, f) + logging.debug("EXITING: ") return o def dump_dict(filepath: str, d: dict) -> None: + logging.debug("ENTERING: ") _, ext = os.path.splitext(filepath) with open(filepath, 'w') as f: StructuredData.dump(ext, d, f) + logging.debug("EXITING: ") diff --git a/build/components/syntax.py b/build/components/syntax.py index 5c70b705c4..39afe53651 100644 --- a/build/components/syntax.py +++ b/build/components/syntax.py @@ -1,9 +1,7 @@ from enum import Enum -from io import StringIO -from re import M +import logging from textwrap import fill from typing import List -from railroad import * # Non-breaking space NBSP = '\xa0' @@ -26,6 +24,7 @@ class ArgumentType(Enum): class Argument: def __init__(self, data: dict = {}, level: int = 0, max_width: int = 640) -> None: + logging.debug("ENTERING: ") self._stack = [] self._level: int = level self._max_width: int = max_width @@ -40,8 +39,10 @@ def __init__(self, data: dict = {}, level: int = 0, max_width: int = 640) -> Non self._token = '""' self._arguments: List[Argument] = [ Argument(arg, self._level+1) for arg in data.get('arguments', [])] + logging.debug("EXITING: ") def syntax(self, **kwargs) -> str: + logging.debug("ENTERING: ") show_types = kwargs.get('show_types') args = '' if self._type == ArgumentType.BLOCK: @@ -78,68 +79,13 @@ def syntax(self, **kwargs) -> str: if self._optional: syntax = f'{syntax.rstrip()}]' + logging.debug("EXITING: ") return f'{syntax}' - def diagram(self) -> DiagramItem: - if self._type == ArgumentType.COMMAND: - s = [] - i = 0 - optionals = [] - while i < len(self._arguments): - arg = self._arguments[i].diagram() - if type(arg) is Optional: - optionals.append(arg) - else: - if len(optionals) != 0: - optionals.sort(key=lambda x: x.width) - s += optionals - optionals = [] - s.append(arg) - i += 1 - if len(optionals) != 0: - optionals.sort(key=lambda x: x.width) - s += optionals - - self._stack.append(Sequence(Terminal(self._display))) - for arg in s: - if type(arg) is not Sequence: - items = [arg] - else: - items = arg.items - for a in items: - width = self._stack[-1].width - w = a.width - if width + w >= self._max_width: - self._stack.append(Sequence(a)) - else: - self._stack[-1] = Sequence(*self._stack[-1].items, a) - else: - if self._type in [ArgumentType.BLOCK, ArgumentType.ONEOF] and len(self._arguments) > 0: - args = [arg.diagram() for arg in self._arguments] - if self._type == ArgumentType.BLOCK: - el = Sequence(*args) - elif self._type == ArgumentType.ONEOF: - el = Choice(round(len(args)/2), *args) - elif self._type != ArgumentType.PURE_TOKEN: - el = NonTerminal(self._display, title=self._type.value) - - if self._multiple: - if self._multiple_token: - el = Sequence(Terminal(self._token), el) - el = OneOrMore(el) - elif self._token: - if self._type == ArgumentType.PURE_TOKEN: - el = Terminal(self._token) - else: - el = Sequence(Terminal(self._token), el) - if self._optional: - el = Optional(el, True) - - return el - class Command(Argument): def __init__(self, cname: str, data: dict, max_width: int = 640) -> None: + logging.debug("ENTERING: ") self._cname = cname self._cdata = data carg = { @@ -148,18 +94,16 @@ def __init__(self, cname: str, data: dict, max_width: int = 640) -> None: 'arguments': data.get('arguments', []) } super().__init__(carg, 0, max_width) + logging.debug("EXITING: ") def __str__(self): + logging.debug("ENTERING: ") s = ' '.join([arg.syntax() for arg in self._arguments[1:]]) + logging.debug("EXITING: ") return s - def isPureContainer(self) -> bool: - return self._cdata.get('arguments') is None and self._cdata.get('arity',0) == -2 and len(self._cname.split(' ')) == 1 - - def isHelpCommand(self) -> bool: - return self._cname.endswith(' HELP') - def syntax(self, **kwargs): + logging.debug("ENTERING: ") opts = { 'width': kwargs.get('width', 68), 'subsequent_indent': ' ' * 2, @@ -167,18 +111,6 @@ def syntax(self, **kwargs): 'break_on_hyphens': False } args = [self._name] + [arg.syntax() for arg in self._arguments] - return fill(' '.join(args), **opts) - - def diagram(self) -> str: - super().diagram() - d = Diagram(Stack(*self._stack),css=None) - s = StringIO() - d.writeSvg(s.write) - # Hack: strip out the 'width' and 'height' attrs from the svg - s = s.getvalue() - for attr in ['width', 'height']: - a = f'{attr}="' - x = s.find(a) - y = s.find('"', x + len(a)) - s = s[:x-1] + s[y+1:] - return s + result = fill(' '.join(args), **opts) + logging.debug("EXITING: ") + return result diff --git a/build/components/util.py b/build/components/util.py index 5f718cfa07..d26dc51258 100644 --- a/build/components/util.py +++ b/build/components/util.py @@ -2,80 +2,45 @@ import errno import logging import os -import re import shutil import subprocess import sys -import tempfile -import unicodedata from textwrap import TextWrapper -from urllib.request import urlopen - -# ------------------------------------------------------------------------------ -# Utilites - - -@contextmanager -def cwd(path): - d0 = os.getcwd() - os.chdir(str(path)) - try: - yield - finally: - os.chdir(d0) def mkdir_p(dir): + logging.debug("ENTERING: ") if dir == '': + logging.debug("EXITING: ") return try: - return os.makedirs(dir, exist_ok=True) + result = os.makedirs(dir, exist_ok=True) + logging.debug("EXITING: ") + return result except TypeError: pass try: - return os.makedirs(dir) + result = os.makedirs(dir) + logging.debug("EXITING: ") + return result except OSError as e: if e.errno != errno.EEXIST or os.path.isfile(dir): + logging.debug("EXITING: ") raise - - -def relpath(dir, rel): - return os.path.abspath(os.path.join(dir, rel)) + logging.debug("EXITING: ") def rm_rf(path): + logging.debug("ENTERING: ") if os.path.isdir(path) and not os.path.islink(path): shutil.rmtree(path) elif os.path.exists(path): os.remove(path) - - -def tempfilepath(prefix=None, suffix=None): - if sys.version_info < (3, 0): - if prefix is None: - prefix = '' - if suffix is None: - suffix = '' - fd, path = tempfile.mkstemp(prefix=prefix, suffix=suffix) - os.close(fd) - return path - - -def wget(url, dest="", tempdir=False): - if dest == "": - dest = os.path.basename(url) - if dest == "": - dest = tempfilepath() - elif tempdir: - dest = os.path.join('/tmp', dest) - ufile = urlopen(url) - data = ufile.read() - with open(dest, "wb") as file: - file.write(data) - return os.path.abspath(dest) + logging.debug("EXITING: ") def run(cmd, cwd=None, nop=None, _try=False): + logging.debug("ENTERING: ") if cmd.find('\n') > -1: cmds1 = str.lstrip(TextWrapper.dedent(cmd)) cmds = filter(lambda s: str.lstrip(s) != '', cmds1.split("\n")) @@ -86,6 +51,7 @@ def run(cmd, cwd=None, nop=None, _try=False): logging.debug(f'run: {cmd}') sys.stdout.flush() if nop: + logging.debug("EXITING: ") return sp = subprocess.Popen(["bash", "-e", "-c", cmd], cwd=cwd, @@ -97,108 +63,37 @@ def run(cmd, cwd=None, nop=None, _try=False): logging.error(err.decode('utf-8')) if not _try: die() - return out.decode('utf-8') + result = out.decode('utf-8') + logging.debug("EXITING: ") + return result def die(msg: str = 'aborting - have a nice day!') -> None: + logging.debug("ENTERING: ") logging.error(msg) exit(1) def rsync(src: str, dst: str, exclude: list = ['.*'], include: list = ['*']): + logging.debug("ENTERING: ") ex = [f'"{x}"' for x in exclude] ix = [f'"{x}"' for x in include] cmd = f'rsync -av --no-owner --no-group --include={{{",".join(ix)}}} --exclude={{{",".join(ex)}}} {src} {dst}' ret = run(cmd) - return ret.split('\n') + result = ret.split('\n') + logging.debug("EXITING: ") + return result def log_func(args: list) -> None: + logging.debug("ENTERING: ") caller = sys._getframe(1).f_code.co_name logging.debug('called %s(%s)', caller, args) + logging.debug("EXITING: ") def log_dict(msg, obj, *props): + logging.debug("ENTERING: ") d = {prop: obj.get(prop, None) for prop in props} logging.info(f'{msg} {d}') - - -# def filter_by_res(elems: list, include: str, exclude: list) -> list: -# log_func(locals()) -# e = [re.match(include, elem) for elem in elems] -# e = [elem[1] for elem in e if elem] -# for ex in exclude: -# e = [x for x in e if not re.match(ex, x)] -# e.sort(reverse=True) -# return e - - -# def get_tags(repo_path: str, res: dict) -> list: -# tags = do_or_die(['git', 'tag'], cwd=repo_path).split('\n') -# tags = filter_by_res(tags, res.get('include_tag_regex'), -# res.get('exclude_tag_regexes')) -# return tags - - -# def get_branches(repo_path: str, res: dict) -> list: -# branches = do_or_die(['git', 'branch', '-r'], cwd=repo_path).split('\n') -# branches = [branch.strip() for branch in branches] -# branches = filter_by_res(branches, f'origin/({res.get("include_branch_regex")})', -# [f'origin/({bre})' for bre in res.get('exclude_branch_regexes')]) -# return branches - - -# def get_dev_docs(website: dict, piece: dict, piece_path: str, commands: dict) -> dict: -# rels = piece.get('releases', None) -# rels_repo = f'{piece_path}/rels_repo' -# if type(rels) is dict: -# source = rels.get('source', None) -# if source not in piece: -# logging.error( -# f'Invalid releases source key for {id} - aborting.') -# if source == 'docs': -# rels_repo = docs_repo -# elif source == 'repository': -# git_get(piece.get(source).get( -# 'git_uri'), rels_repo, args.skip_clone) - -# if rels: -# tags = [] -# if rels.get('tags', False): -# tags = get_tags(rels_repo, rels) -# branches = get_branches(rels_repo, rels) - -# for (s, d) in payload: -# do_or_die(['rsync', '-av', '--no-owner', '--no-group', s, d]) - -# return commands - - -# ------------------------------------------------------------------------------ -def command_filename(name: str) -> str: - return name.lower().replace(' ', '-') - - -def regex_in_file(path: str, search: str, replace: str): - with open(path, 'r') as f: - p = f.read() - r = re.compile(search) - p = r.sub(replace, p) - with open(path, 'w') as f: - f.write(p) - -def slugify(value, allow_unicode=False): - """ - Taken from https://github.com/django/django/blob/master/django/utils/text.py - Convert to ASCII if 'allow_unicode' is False. Convert spaces or repeated - dashes to single dashes. Remove characters that aren't alphanumerics, - underscores, or hyphens. Convert to lowercase. Also strip leading and - trailing whitespace, dashes, and underscores. - """ - value = str(value) - if allow_unicode: - value = unicodedata.normalize('NFKC', value) - else: - value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore').decode('ascii') - value = re.sub(r'[^\w\s-]', '', value.lower()) - return re.sub(r'[-\s]+', '-', value).strip('-_') \ No newline at end of file + logging.debug("EXITING: ") diff --git a/build/make.py b/build/make.py index 4ffabda8f7..b278806553 100644 --- a/build/make.py +++ b/build/make.py @@ -1,7 +1,6 @@ import argparse from datetime import datetime import logging -import sys import tempfile from components.component import All @@ -31,12 +30,18 @@ def parse_args() -> argparse.Namespace: ARGS = parse_args() mkdir_p(ARGS.tempdir) + # Configure logging BEFORE creating objects + log_level = getattr(logging, ARGS.loglevel.upper()) + logging.basicConfig( + level=log_level, + format='%(message)s %(filename)s:%(lineno)d - %(funcName)s', + force=True # Force reconfiguration in case logging was already configured + ) + # Load settings ALL = All(ARGS.stack, None, ARGS.__dict__) # Make the stack - logging.basicConfig( - level=ARGS.loglevel, format=f'{sys.argv[0]}: %(levelname)s %(asctime)s %(message)s') print(f'Applying all configured components"{ALL._name}"') start = datetime.now() ALL.apply() diff --git a/build/migrate.py b/build/migrate.py deleted file mode 100755 index 883c226b06..0000000000 --- a/build/migrate.py +++ /dev/null @@ -1,1181 +0,0 @@ -import shutil -import os -import re -import fnmatch -import tempfile -import yaml -import sys -import logging -from git import Repo -from components.component import All -from components.util import mkdir_p -import csv - - -''' -Set the migration environment -''' -def set_env(): - globals()['WORK_DIR'] = parent_dir(parent_dir(os.path.abspath(__file__))) - globals()['DATA_ROOT'] = slash(WORK_DIR, 'data/') - globals()['DOCS_ROOT'] = slash(WORK_DIR, 'content/') - globals()['STATIC_ROOT'] = slash(WORK_DIR, 'static/') - globals()['DOC_SRC_TMP'] = slash(DOCS_ROOT, 'tmp/') - globals()['DOCS_SRC_DOCS'] = slash(DOC_SRC_TMP, 'docs/') - globals()['DOCS_SRC_CMD'] = slash(DOC_SRC_TMP, 'commands/') - globals()['DOCS_CMD'] = slash(DOCS_ROOT, 'commands/') - globals()['DOCS_DEV'] = slash(DOCS_ROOT, 'develop/') - globals()['DOCS_OPS'] = slash(DOCS_ROOT, 'operate/') - globals()['DOCS_INT'] = slash(DOCS_ROOT, 'integrate/') - globals()['TMP'] = '/tmp' - - return globals() - - -''' -Get the parent directory -''' -def parent_dir(dir): - return os.path.dirname(dir) - -''' -Make a folder -''' -def mkdir(dir): - return os.makedirs(dir, exist_ok=True) - - -''' -Check if a file exists -''' -def file_exists(fpath): - return os.path.isfile(fpath) - -''' -Creates an _index.md file in a specific folder -''' -def create_index_file(folder_path, title, desc, linkTitle=None): - - if linkTitle is None: - linkTitle = title - - tmpl = '''--- -title: {} -description: {} -linkTitle: {} ----''' - - contents = tmpl.format(title, desc, linkTitle) - with open(slash(folder_path, '_index.md'), 'w', encoding='utf-8') as file: - file.write(contents) - - - -''' -Concatenate two paths -''' -def slash(dir1, dir2, strip_slash=False): - if dir2.startswith('/') and strip_slash: - dir2 = dir2.lstrip('/') - return os.path.join(dir1, dir2) - -''' -Delete a folder -''' -def delete_folder(folder_path): - shutil.rmtree(folder_path) - - -''' -Create a folder -''' -def create_folder(folder_path): - os.makedirs(folder_path) - -''' -Delete a single file -''' -def delete_file(file_path): - os.remove(file_path) - - -''' -Copy files recursively -''' -def copy_files(src_folder, dest_folder): - - if not os.path.exists(dest_folder): - os.makedirs(dest_folder) - - for root, dirs, files in os.walk(src_folder): - for file in files: - src_path = os.path.join(root, file) - dest_path = os.path.join(dest_folder, os.path.relpath(src_path, src_folder)) - os.makedirs(os.path.dirname(dest_path), exist_ok=True) - shutil.copy2(src_path, dest_path) - -''' -Copy a single file -''' -def copy_file(src_file, dest_folder): - return shutil.copy(src_file, dest_folder) - -''' -Replace the link in text -''' -def replace_links(markdown_content, old_prefix, new_prefix): - link_pattern = re.compile(r'(\[.*?\]\()(' + re.escape(old_prefix) + r')(.*?\))') - updated_content = re.sub(link_pattern, r'\1' + new_prefix + r'\3', markdown_content) - return updated_content - -def _load_csv_file(file_path): - - result = {} - - script_path = os.getcwd() + '/' + __file__ - csv_file = slash(os.path.dirname(script_path), file_path) - - with open(csv_file) as cf: - reader = csv.DictReader(cf, delimiter=';') - for row in reader: - key = row['broken_ref'] - value = row['fixed_ref'] - result[key] = value - - return result - - -''' -The replace link function that is passed over to re.sub -''' -def _replace_link(match, new_prefix): - # Relrefs don't like dots in the link - if '.' in match.group(3): - result = match.group(1) + '{{< baseurl >}}' + new_prefix + match.group(3) + match.group(4) - - # Some command pages have a . in them which causes issues - if new_prefix == "/commands": - result = match.group(1) + '{{< baseurl >}}' + new_prefix + match.group(3) + "/" + match.group(4) - else: - result = match.group(1) + '{{< relref "' + new_prefix + match.group(3) + '" >}}' + match.group(4) - - return result - -''' -Helps to substitute the prefix https://redis.io with e.g. / within a link -''' -def fq_link_to_page_link_in_file(file_path, old_prefix, new_prefix): - with open(file_path, 'r', encoding='utf-8') as file: - file_content = file.read() - link_pattern = re.compile(r'(\[.*?\]\()(' + re.escape(old_prefix) + r')(.*?)' + r'(\))') - updated_content = re.sub(link_pattern, r'\1' + new_prefix + r'\3' + r'\4', file_content) - - with open(file_path, 'w', encoding='utf-8') as file: - file.write(updated_content) - - -''' -Returns the content of a file as string -''' -def _read_file(file_path): - file = open(file_path, 'r', encoding='utf-8') - file_content = file.read() - file.close() - return file_content - - -''' -Writes a string to the file -''' -def _write_file(file_path, updated_content): - file = open(file_path, 'w', encoding='utf-8') - file.write(updated_content) - file.close() - - -''' -The documentation currently uses the shortcode in a way like: - -{{Use the Cloud Account tab of the Account Settings screen to define cloud accounts for your Redis Cloud subscription.}}Test regexp{{< /image >}} - -However, none of the files uses the text below the image because it's strictly seen really just plain text. Instead the alt property is used for the file caption. So we are rewriting the {{< image >}}{{< /image >}} to just {{< image >}} -''' -def replace_img_short_code(file_path): - print("Replacing file " + file_path) - file_content = _read_file(file_path) - img_pattern = re.compile(r'({{<.*image.*>}})' + r'(.*{{<.*/image.*>}})') - updated_content = re.sub(img_pattern, r'\1', file_content) - updated_content = updated_content.replace('{{< /image >}}', '') - _write_file(file_path, updated_content) - - - -''' -Assumes that there is an image tag with an absolute path to the image - - - -''' -def replace_img_tag_in_file(file_path, old_prefix, new_prefix): - - file_content = _read_file(file_path) - img_pattern = re.compile(r'(|"/>)') - updated_content = re.sub(img_pattern, '{{< image filename="' + new_prefix + r'\3' + '" >}}', file_content) - _write_file(file_path, updated_content) - - -''' -Assumes that there is image markdown syntax. Here an example. - -![Pending status icon](/images/rc/icon-database-update-status-pending.png#no-click "Pending database status") -''' -def replace_img_md_in_file(file_path, old_prefix, new_prefix): - file_content = _read_file(file_path) - - # TODO: Some markdown uses a space in between the round brackets - #img_pattern = re.compile(r'\!\[(.*?)\]\((' + re.escape(old_prefix) + r')(.*?)\s*(?:"(.*?)")?\)') - img_pattern = re.compile(r'\!\[(.*?)\]\(\s*(' + re.escape(old_prefix) + r')(.*?)\s*(?:"(.*?)")?\)') - updated_content = re.sub(img_pattern, '{{< image filename="' + new_prefix + r'\3' + '" alt="' + r'\4' + '" >}}', file_content) - updated_content = updated_content.replace(' alt=""', '') - _write_file(file_path, updated_content) - -''' -Replace the link within the file -''' -def replace_links_in_file(file_path, old_prefix, new_prefix, correct_links=True): - - file_content = _read_file(file_path) - - link_pattern = re.compile(r'(\[.*?\]\()(' + re.escape(old_prefix) + r')(.*?)' + r'(\))') - updated_content = re.sub(link_pattern, lambda match: _replace_link(match, new_prefix), file_content) - - if correct_links: - # Correct links based on a list - corrected_links = _load_csv_file('./migrate/corrected_refs.csv') - - for k in corrected_links: - # Relrefs don't like dots and hashtags in the link - if '.' in corrected_links[k]: - updated_content = updated_content.replace('{{< relref "' + k + '" >}}', '{{< baseurl >}}' + corrected_links[k]) - elif '#' in k: - updated_content = updated_content.replace('{{< relref "' + k + '" >}}', '{{< baseurl >}}' + corrected_links[k] + '#' + k.split('#')[1]) - else: - updated_content = updated_content.replace('{{< relref "' + k + '" >}}', '{{< relref "' + corrected_links[k] + '" >}}') - - _write_file(file_path, updated_content) - -''' -Read the front matter from a markdown file -''' -def _read_front_matter(file_path): - - markdown_content = _read_file(file_path) - - front_matter_match = re.match(r'^\s*---\n(.*?\n)---\n', markdown_content, re.DOTALL) - - if front_matter_match: - front_matter_content = front_matter_match.group(1) - return yaml.safe_load(front_matter_content) - else: - return None - -''' -Write the front matter to a markdown file -''' -def _write_front_matter(file_path, front_matter): - - markdown_content = _read_file(file_path) - - try: - updated_front_matter = yaml.dump(front_matter, default_flow_style=False) - updated_content = re.sub(r'^\s*---\n.*?\n---\n', '---\n' + updated_front_matter + '---\n', markdown_content, flags=re.DOTALL) - _write_file(file_path, updated_content) - except Exception as e: - print("ERR: Could not write front matter to file {}".format(file_path)) - - - -''' -Removes the aliases section from the markdown file's front matter -''' -def remove_prop_from_file(file_path, prop): - - front_matter = _read_front_matter(file_path) - if front_matter: - if prop in front_matter: - del front_matter[prop] - _write_front_matter(file_path, front_matter) - -''' -Adds categories meta data to the markdown file -''' -def add_categories(file_path, ctg_name, ctgs_arr): - front_matter = _read_front_matter(file_path) - if front_matter: - front_matter[ctg_name] = ctgs_arr - _write_front_matter(file_path, front_matter) - - -''' -Adds type meta data to the markdown file -''' -def add_properties(file_path, prop_dict): - front_matter = _read_front_matter(file_path) - if front_matter: - for k in prop_dict: - front_matter[k] = prop_dict[k] - _write_front_matter(file_path, front_matter) - -# TODO: Why did I use two patterns here? -#def _get_short_code_patterns(tag): -# return [r'{{<\s*' + re.escape(tag) + r'\s*[^>]*\s*/\s*>}}', r'{{<\s*' + re.escape(tag) + r'\s*[^>]*\s*>}}'] - - -''' -Removes a short code entirely from Markdown -''' -def remove_short_code(file_path, tag): - markdown_content = _read_file(file_path) - pattern = r'{{<\s*' + re.escape(tag) + r'.*' + r'\s*>}}' - updated_content = re.sub(pattern, '', markdown_content) - _write_file(file_path, updated_content) - -''' -Prepends a prefix to the rel refs -''' -def prepend_to_rel_ref_short_code(file_path, new_prefix): - - with open(file_path, 'r', encoding='utf-8') as file: - markdown_content = file.read() - - starts_with_slash = r'{{<\s*relref\s+"(/[^"]*)"\s*>}}' - starts_with_char = r'{{<\s*relref\s+"([a-z][^"]*)"\s*>}}' - starts_with_dot = r'{{<\s*relref\s+"(\.[^"]*)"\s*>}}' - - - updated_content = re.sub(starts_with_slash, r'{{< relref "' + re.escape('/' + new_prefix ) + r'\1' + r'" >}}', markdown_content) - updated_content = re.sub(starts_with_char, r'{{< relref "' + re.escape('/' + new_prefix + '/') + r'\1' + r'" >}}', updated_content) - updated_content = re.sub(starts_with_dot, r'{{< relref "' + r'\1' + r'" >}}', updated_content) - - - with open(file_path, 'w', encoding='utf-8') as file: - file.write(updated_content) - - -''' -Does a simple find and replace -''' -def find_and_replace(file_path, old, new): - with open(file_path, 'r', encoding='utf-8') as file: - markdown_content = file.read() - - updated_content = markdown_content.replace(old, new) - - with open(file_path, 'w', encoding='utf-8') as file: - file.write(updated_content) - -''' -Clone a repo -''' -def clone_repo(url): - #tmpdir = tempfile.mkdtemp() - tmpdir = slash(TMP, 'redislabs-docs') - Repo.clone_from(url, tmpdir) - return tmpdir - - -''' -Find all files that match a specific name pattern -''' -def find_files(directory, filter): - resulting_files = [] - for root, dirs, files in os.walk(directory): - for file in fnmatch.filter(files, filter): - resulting_files.append(os.path.join(root, file)) - return resulting_files - -''' -Find all markdown files -''' -def find_markdown_files(directory): - return find_files(directory, '*.md') - - - -''' -Read a markdown file -''' -def read_markdown_file(file_path): - with open(file_path, 'r', encoding='utf-8') as file: - return file.read() - - - -''' -Fetch the documentation from the several sources that make redis.io -''' -def fetch_io(): - comp_args = { - 'stack': str(slash(DATA_ROOT, 'components/index_migrate.json')), - 'skip-clone': False, - 'loglevel': 'INFO', - 'tempdir': f'{tempfile.gettempdir()}', - 'module' : '*' - } - - ALL = All(comp_args.get('stack'), None, comp_args) - logging.basicConfig(level=comp_args.get('loglevel'), format=f'{sys.argv[0]}: %(levelname)s %(asctime)s %(message)s') - ALL.apply() - -''' -Copy the command reference docs -''' -def migrate_commands(): - copy_files(DOCS_SRC_CMD, DOCS_CMD) - markdown_files = find_markdown_files(DOCS_CMD) - - for f in markdown_files: - add_categories(f, 'categories', ['docs', 'develop', 'stack', 'oss', 'rs', 'rc', 'oss', 'kubernetes', 'clients']) - remove_prop_from_file(f, "aliases") - - replace_links_in_file(f, '/docs', '/develop') - replace_links_in_file(f, '/commands', '/commands') - replace_links_in_file(f, 'https://redis.io/', '/') -''' -Migrate the developer documentation -''' -def migrate_developer_docs(): - - create_index_file(DOCS_DEV, 'Develop', 'Learn how to develop with Redis') - - dev_content = ['get-started', 'connect', 'data-types', 'interact', 'manual', 'reference'] - - for topic in dev_content: - source = slash(DOCS_SRC_DOCS, topic) - target = slash(DOCS_DEV, topic) - - # Rename manual to use - if (topic == 'manual'): - target = slash(DOCS_DEV, 'use') - - copy_files(source, target) - - excluded_content = ['reference/signals.md', 'reference/cluster-spec.md', 'reference/arm.md', 'reference/internals'] - - for sub_topic in excluded_content: - if sub_topic.endswith('.md'): - os.remove(slash(DOCS_DEV, sub_topic)) - else: - delete_folder(slash(DOCS_DEV, sub_topic)) - - markdown_files = find_markdown_files(DOCS_DEV) - - for f in markdown_files: - print("Replacing links in {}".format(f)) - - # Links - fq_link_to_page_link_in_file(f, 'https://redis.io/', '/') - replace_links_in_file(f, '/docs', '/develop') - replace_links_in_file(f, '/commands', '/commands') - - # Images - replace_img_tag_in_file(f, '/docs', '/develop') - replace_img_md_in_file(f, '/docs', '/develop') - - # Front matter - remove_prop_from_file(f, "aliases") - add_categories(f, 'categories', ['docs', 'develop', 'stack', 'oss', 'rs', 'rc', 'oss', 'kubernetes', 'clients']) - -''' -Migrate the operational documentation from redis.io -''' -def migrate_oss_ops_docs(): - DOCS_OPS_OSS_STACK = slash(DOCS_OPS, 'oss_and_stack') - DOCS_OPS_OSS_RI = slash(DOCS_OPS, "redisinsight") - mkdir(DOCS_OPS_OSS_STACK) - mkdir(DOCS_OPS_OSS_RI) - mkdir(slash(DOCS_OPS_OSS_STACK, 'reference')) - create_index_file(DOCS_OPS_OSS_STACK, 'Redis OSS and Stack', 'Operate Redis OSS and Redis Stack') - create_index_file(slash(DOCS_OPS_OSS_STACK, 'reference'), 'Reference', 'Redis OSS and Redis Stack reference documentation') - create_index_file(DOCS_OPS_OSS_RI, 'RedisInsight', 'Install and manage RedisInsight') - ops_content = ['install/install-redis', 'install/install-stack', 'install/_index.md', 'install/install-redisinsight', 'management', 'reference/internals', 'reference/signals.md', 'reference/cluster-spec.md', 'reference/arm.md'] - - for topic in ops_content: - source = slash(DOCS_SRC_DOCS, topic) - - if str(topic).endswith('.md'): - target = slash(DOCS_OPS_OSS_STACK, topic.split('/')[0]) - copy_file(source, target) - else: - target = slash(DOCS_OPS_OSS_STACK, topic) - - if topic == "install/install-redisinsight": - target = slash(DOCS_OPS_OSS_RI, "install") - - copy_files(source, target) - - markdown_files = find_markdown_files(DOCS_OPS_OSS_STACK) - for f in markdown_files: - print("Replacing links in {}".format(f)) - - # Links - replace_links_in_file(f, '/docs', '/operate/oss_and_stack') - remove_prop_from_file(f, 'aliases') - - # Images - replace_img_tag_in_file(f, '/docs', '/operate/oss_and_stack') - replace_img_md_in_file(f, '/docs', '/operate/oss_and_stack') - - # Front matter - remove_prop_from_file(f, "aliases") - add_categories(f, 'categories', ['docs', 'operate', 'stack', 'oss']) - - markdown_files = find_markdown_files(DOCS_OPS_OSS_RI) - for f in markdown_files: - print("Replacing links in {}".format(f)) - - # Links - replace_links_in_file(f, '/docs', '/operate/redisinsight') - remove_prop_from_file(f, 'aliases') - - # Images - replace_img_tag_in_file(f, '/docs', '/operate/redisinsight') - replace_img_md_in_file(f, '/docs', '/operate/redisinsight') - - # Front matter - remove_prop_from_file(f, "aliases") - add_categories(f, 'categories', ['docs', 'operate', 'redisinsight']) - -''' -Fetch all the docs of docs.redis.com -''' -def fetch_docs_redis_com(): - repo = clone_repo("https://github.com/RedisLabs/redislabs-docs") - return repo - - -def _test_img_short_code_rewrite(): - - for t in ['rc', 'rs', 'kubernetes', 'oss_and_stack']: - target = slash(DOCS_OPS, t) - markdown_files = find_markdown_files(target) - for f in markdown_files: - replace_img_short_code(f) - - # Most images in the Enterprise docs are taken from the static images folder - replace_img_md_in_file(f,'/images', '/images') - -''' -Migrate the docs from docs.redis.com -''' -def migrate_enterprise_ops_docs(repo): - - create_index_file(DOCS_OPS, "Operate", "Operate any Redis, from Redis OSS to Redis Cloud") - - repo_content = slash(repo, 'content/') - content = ['rs', 'rc', 'kubernetes', 'stack', 'embeds'] - - for topic in content: - source = slash(repo_content, topic) - - if topic == 'stack': - target = slash(DOCS_OPS, 'oss_and_stack/stack-with-enterprise') - elif topic == 'embeds': - target = slash(DOCS_ROOT, 'embeds') - else: - target = slash(DOCS_OPS, topic) - - copy_files(source, target) - - markdown_files = find_markdown_files(target) - for f in markdown_files: - try: - # Front matter - remove_prop_from_file(f, 'aliases') - remove_prop_from_file(f, 'categories') - add_categories(f, 'categories', ['docs', 'operate', topic]) - - # Short codes - remove_short_code(f, 'allchildren') - remove_short_code(f, 'embed-html') - - # Links - # TODO: See if we can use the replace_links_in_file function for all of that - prepend_to_rel_ref_short_code(f,'operate') - find_and_replace(f, '/operate/glossary', '/glossary') - find_and_replace(f, '/operate/stack', '/operate/oss_and_stack/stack-with-enterprise') - - # Causes to fix links with that prefix from the CSV file - replace_links_in_file(f, '/glossary', '/glossary') - replace_links_in_file(f, '/operate', '/operate') - replace_links_in_file(f, '/develop', '/develop') - - # Images - replace_img_short_code(f) - replace_img_tag_in_file(f, '/images', '/images') - replace_img_md_in_file(f, '/images', '/images') - - - except Exception as e: - print("ERR: Error processing file {} with error {}".format(f, e)) - - -''' -Migrate the glossary from docs.redis.com -''' -def migrate_gloassary(repo): - repo_content = slash(repo, 'content/') - source = slash(repo_content, 'glossary') - target = slash(DOCS_ROOT, 'glossary') - copy_files(source, target) - - markdown_files = find_markdown_files(target) - for f in markdown_files: - find_and_replace(f, '/rs/', '/operate/rs/') - find_and_replace(f, '/rc/', '/operate/rc/') - find_and_replace(f, '/kubernetes/', '/operate/kubernetes/') - -''' -Migrate static files over -''' -def migrate_static_files(repo): - static = slash(repo, 'static/') - content = ['code', 'images', 'pkgs', 'tables' ] - - for folder in content: - source = slash(static, folder) - target = slash(STATIC_ROOT, folder) - copy_files(source, target) - -''' -Creates a slug name from a file name -''' -def _slug(name): - return name.replace(".", " ").replace(" ", "-").replace('--', '-').lower() - - -''' -Move some integrations documentation from the operational docs to the integrations section -''' -def migrate_integration_docs(repo): - - create_index_file(DOCS_INT, "Integrations and frameworks", "", "Integrate") - - integrations = { - "Amazon Bedrock" : {"weight" : 3, "source" : "operate/rc/cloud-integrations/aws-marketplace/aws-bedrock/", "type": "cloud-service", "desc": "With Amazon Bedrock, users can access foundational AI models from a variety of vendors through a single API, streamlining the process of leveraging generative artificial intelligence."}, - "Confluent with Redis Cloud" : {"weight" : 8, "source" : "operate/rc/cloud-integrations/confluent-cloud.md", "type": "di", "desc" : "The Redis Sink connector for Confluent Cloud allows you to send data from Confluent Cloud to your Redis Cloud database." }, - "Prometheus with Redis Cloud" : { "weight" : 6, "source" : "operate/rc/cloud-integrations/prometheus-integration.md", "type": "observability", "desc" : "You can use Prometheus and Grafana to collect and visualize your Redis Cloud metrics."}, - "Prometheus with Redis Enterprise" : {"weight" : 5, "source" : "operate/rs/clusters/monitoring/prometheus-integration.md", "type": "observability", "desc" : "You can use Prometheus and Grafana to collect and visualize your Redis Enterprise Software metrics."}, - "Prometheus metrics" : { "weight" : 5, "source" : "operate/rs/clusters/monitoring/prometheus-metrics-definitions.md", "type": "subpage", "target" : "Prometheus with Redis Enterprise", "desc" : "You can use Prometheus and Grafana to collect and visualize your Redis Enterprise Software metrics."}, - "Uptrace with Redis Enterprise" : { "weight" : 7, "source" : "operate/rs/clusters/monitoring/uptrace-integration.md", "type": "observability", "desc" : "To collect, view, and monitor metrics data from your databases and other cluster components, you can connect Uptrace to your Redis Enterprise cluster using OpenTelemetry Collector."}, - "Nagios with Redis Enterprise" : { "weight" : 7, "source" : "operate/rs/clusters/monitoring/nagios-plugin.md", "type": "observability", "desc" : "This Nagios plugin enables you to monitor the status of Redis Enterprise related components and alerts."}, - "Pulumi provider for Redis Cloud" : { "weight" : 4, "source" : "operate/rc/cloud-integrations/pulumi/", "type": "provisioning", "desc" : "With the Redis Cloud Resource Provider you can provision Redis Cloud resources by using the programming language of your choice."}, - "Terraform provider for Redis Cloud" : { "weight" : 4, "source" : "operate/rc/cloud-integrations/terraform/", "type": "provisioning", "desc" : "The Redis Cloud Terraform provider allows you to provision and manage Redis Cloud resources." }, - "Redis Data Integration" : { "weight" : 1, "source" : "repo/content/rdi", "type" : "di", "desc" : "Redis Data Integration keeps Redis in sync with the primary database in near real time."}, - "RedisOM for Java" : { "weight" : 9, "source" : "develop/connect/clients/om-clients/stack-spring.md", "type" : "library", "desc" : "The Redis OM for Java library is based on the Spring framework and provides object-mapping abstractions.", "images" : "images/*_spring.png", "parent_page" : "_index.md" }, - "RedisOM for .NET" : { "weight" : 9, "source" : "develop/connect/clients/om-clients/stack-dotnet.md", "type" : "library", "desc" : "Redis OM for .NET is an object-mapping library for Redis.", "parent_page" : "_index.md"}, - "RedisOM for Python" : { "weight" : 9, "source" : "develop/connect/clients/om-clients/stack-python.md", "type" : "library", "desc" : "Redis OM for Python is an object-mapping library for Redis.", "images" : "images/python_*.png", "parent_page" : "_index.md"}, - "RedisOM for Node.js" : { "weight" : 9, "source" : "develop/connect/clients/om-clients/stack-node.md", "type" : "library", "desc" : "Redis OM for Node.js is an object-mapping library for Redis.", "images" : "images/* | grep -e '^[A-Z]'", "parent_page" : "_index.md"} - } - - for k in integrations: - data = integrations[k] - source = data['source'] - ctype = data['type'] - desc = data['desc'] - weight = data.get('weight') - - ## Move files from operate to integrate - if source.startswith('operate'): - - source = slash(DOCS_ROOT, source) - - if ctype != "subpage": - - slug = _slug(k) - target = slash(DOCS_INT, slug) - print("Copying from {} to {} ...".format(source, target)) - - try: - if source.endswith('/'): - copy_files(source, target) - elif source.endswith('.md'): - if not os.path.exists(target): - mkdir(target) - copy_file(source, slash(target, '_index.md')) - except FileNotFoundError as e: - print("Skipping {}".format(source)) - - - else: - sptarget = data['target'] - slug = _slug(sptarget) - target = slash(DOCS_INT, slug) - print("Copying from {} to {} ...".format(source, target)) - - try: - copy_file(source, target) - except FileNotFoundError as e: - print("Skipping {}".format(source)) - - # Delete the old folder under /operate - try: - if source.endswith('.md'): - delete_file(source) - else: - delete_folder(source) - except FileNotFoundError as e: - print("Skipping deletion of {}".format(source)) - - - elif source.startswith('develop'): - - source = slash(DOCS_ROOT, source) - img_src_folder=slash(os.path.dirname(source), 'images') - slug = _slug(k) - target = slash(DOCS_INT, slug) - mkdir(slash(target, 'images')) - - try: - print("Copying from {} to {}".format(source, target)) - # Copy files - copy_file(source, slash(target, '_index.md')) - - if slug.endswith('java'): - images = find_files(img_src_folder, '*_spring.png') - elif slug.endswith('python'): - images = find_files(img_src_folder, 'python_*.png') - elif slug.endswith('net'): - images = [slash(img_src_folder, 'Add_Redis_Database_button.png'), - slash(img_src_folder, 'Configure_Redis_Insight_Database.png'), - slash(img_src_folder, 'Accept_EULA.png') - ] - else: - images = [] - - for img in images: - copy_file(img, slash(target, 'images')) - except FileNotFoundError as e: - print("Skipping ...") - - # Delete files - try: - delete_file(source) - for img in images: - delete_file(img) - except FileNotFoundError as e: - print("Skipping deletion of {}".format(source)) - elif source.startswith('repo'): - source = source.replace('repo', repo) - slug = _slug(k) - target = slash(DOCS_INT, slug) - print("Copying from {} to {} ...".format(source, target)) - copy_files(source, target) - - # Post-process files within the target - markdown_files = find_markdown_files(target) - - for f in markdown_files: - print("Postprocessing {}".format(f)) - - ## Add front matter - categories = [ "docs", "integrate" ] - - if "cloud" in slug: - categories.append("rc") - elif "aws" in slug: - categories.append("rc") - elif "enterprise" in slug: - categories.append("rs") - elif "integration" in slug: - categories.append("rs") - categories.append("rdi") - else: - categories.append("oss") - categories.append("rs") - categories.append("rc") - - meta = {} - if f.endswith(slash(DOCS_INT, _slug(k) + "/_index.md")) and ctype != "subpage": - meta = {"weight" : int(weight)} - meta['Title'] = k - meta['LinkTitle'] = k - meta['linkTitle'] = k - - meta.update({ "type": "integration", "group" : ctype, "summary" : desc, "categories": categories}) - add_properties(f, meta) - - # Some files use linkTitle, and some other LinkTitle. Let's remove the redundant link title. - if f.endswith(slash(DOCS_INT, _slug(k) + "/_index.md")): - try: - remove_prop_from_file(f, 'linkTitle') - except KeyError as e: - print("The file {} doesn't have a property linkTitle".format(f)) - - ## Redmove short codes - remove_short_code(f, 'allchildren') - - ## Fix internal links for the rdi docs - if _slug(k) == 'redis-data-integration': - find_and_replace(f, '"/rdi', '"/integrate/{}'.format(_slug(k))) - find_and_replace(f, '"rdi/', '"/integrate/{}/'.format(_slug(k))) - find_and_replace(f, '"/stack', '"/operate/oss_and_stack/stack-with-enterprise') - find_and_replace(f, '"/rs', '"/operate/rs') - - ## Fix internal links for the stuff that was moved from /operate and /develop - if data['source'].startswith('operate') or data['source'].startswith('develop'): - old_prefix = data['source'] - - if old_prefix.endswith('.md'): - old_prefix = old_prefix.replace('.md', '') - - new_prefix = "integrate" + "/" + _slug(k) + "/" - - print("Fixing links from {} to {}".format(old_prefix, new_prefix)) - find_and_replace(f, old_prefix, new_prefix) - - # Replace the image markdown with the shortcode - replace_img_md_in_file(f, '/images', '/images') - - # Fix broken dev images - find_and_replace(f, '../images/', './images/') - - # Ensure that the right image short code is used - replace_img_short_code(f) - - - # Fix remaining links - target_folders = [DOCS_INT, DOCS_OPS, DOCS_DEV] - - for tf in target_folders: - markdown_files = find_markdown_files(tf) - corrected_links = _load_csv_file('./migrate/corrected_int_refs.csv') - - for f in markdown_files: - for k in corrected_links: - find_and_replace(f, k, corrected_links[k]) - - -''' -The redis.io template shows all children by default, whereby the -docs.redis.com needed you to use an "allchildren" shortcode. All -pages that had the "allchildren" shortcode get "hideListLinks" set -to false. All the others are getting it set to true. -''' -def fix_all_children(content_folders): - - all_chidlren_pages = _load_csv_file('./migrate/all_children_pages.csv') - - for k in all_chidlren_pages: - f = slash(DOCS_ROOT, k, True) - meta = _read_front_matter(f) - if (meta.get("hideListLinks") == None) or (meta.get("hideListLinks") == True): - add_properties(f, { "hideListLinks" : False }) - - for folder in content_folders: - source = slash(DOCS_ROOT, folder) - markdown_files = find_markdown_files(source) - - for f in markdown_files: - meta = _read_front_matter(f) - if (meta != None) and (meta.get("hideListLinks") == None) and (f.endswith('_index.md')): - add_properties(f, { "hideListLinks" : True }) - - -''' -Some images in the Kubernetes documentation were not caught before and still use the markdown image syntax -''' -def fix_missed_images(content_folders): - - for folder in content_folders: - source = slash(DOCS_ROOT, folder) - markdown_files = find_markdown_files(source) - - for f in markdown_files: - content = _read_file(f) - - if '/images' in content: - print("Handling images in {}".format(f)) - replace_img_md_in_file(f, '/images', '/images') - - -''' -The RESP2 and RESP3 responses have hard-coded references in the links, we need to rewrite them. -''' -def fix_resp_references(): - resp2 = slash(WORK_DIR, 'data/resp2_replies.json') - resp3 = slash(WORK_DIR, 'data/resp3_replies.json') - - find_and_replace(resp2, '/docs/reference/protocol-spec', '../../develop/reference/protocol-spec') - find_and_replace(resp3, '/docs/reference/protocol-spec', '../../develop/reference/protocol-spec') - - -def strip_md_ext_from_ref(file_path, prefix): - content = _read_file(file_path) - pattern = r'(\(.*' + re.escape(prefix) + r'/.*\.md.*\))' - updated_content = re.sub(pattern, lambda match: match.group(0).replace('.md', ''), content) - _write_file(file_path, updated_content) - - -''' -Some pages still use topics links. Let's try to remove them. -''' -def fix_topics_links(content_folders): - for folder in content_folders: - source = slash(DOCS_ROOT, folder) - topics_csv = _load_csv_file('./migrate/topics.csv') - - markdown_files = find_markdown_files(source) - - # Ensure that we don't use /topics links - for f in markdown_files: - for k in topics_csv: - find_and_replace(f, k, topics_csv[k]) - find_and_replace(f, 'https://redis.io/operate/', '/operate/') - find_and_replace(f, 'https://redis.io/develop/', '/develop/') - - # Rewrite to relref - replace_links_in_file(f, '/develop', '/develop', False) - replace_links_in_file(f, '/operate', '/operate', False) - - # Ensure that we have no .md refs - strip_md_ext_from_ref(f, '/develop') - strip_md_ext_from_ref(f, '/operate') - -''' -Shortcodes don't like parameters. Here is an example: -[Redis Streams command reference]({{< relref "/commands/?group=stream" >}}) - -Let's try to fix it by moving the parameter out of the shortcode link. - -[Redis Streams command reference]({{< relref "/commands/" >}}?group=stream) -''' -def fix_command_group_params(content_folders): - for folder in content_folders: - source = slash(DOCS_ROOT, folder) - markdown_files = find_markdown_files(source) - - for f in markdown_files: - content = _read_file(f) - pattern = r'(\{\{\<.*relref.*"/commands/)(\?group=.+)(".*\>\}\})' - updated_content = re.sub(pattern, r'\1\3\2', content) - _write_file(f, updated_content) - -def fix_fq_io_links(content_folders, target_folders): - links_csv = _load_csv_file('./migrate/io-links-misc-mapped.csv') - result = {} - - for k in links_csv: - # The URL was already right - if links_csv[k] == "": - url = k - else: - # The URL was redirected to this one - url = links_csv[k] - - # If it is a docs URL, then get the path under docs - if url.startswith('https://redis.io/docs/'): - path = url.split('/docs')[1] - path = path.replace('/manual', '/use') - - anchor = None - - if '#' in path: - parsed = path.split('#') - path = parsed[0] - anchor = parsed[1] - - stripped_path = path.rstrip('/') - - #Try to find a file that either matches path/_index.md, path/index.md or parent_path/name.md - for c in content_folders: - markdown_files = find_markdown_files(slash(DOCS_ROOT, c)) - - for f in markdown_files: - if not '/tmp' in f: - if f.endswith(stripped_path + '/_index.md') or f.endswith(stripped_path + '/index.md') or f.endswith(stripped_path + '.md'): - new_path = f.split('/content')[1] - - if new_path.endswith('_index.md'): - new_path = new_path.replace('_index.md', '') - else: - new_path = new_path.replace('/index.md', '') - new_path = new_path.replace('.md', '') - - if anchor: - relref = '{{< relref "' + new_path + '" >}}#' + anchor - - else: - relref = '{{< relref "' + new_path + '" >}}' - - result[k] = relref - - # Find and replace is problematic because the path https://redis.io/docs/stack gets replaced before https://redis.io/docs/stack/bloom/ - sorted_result = sorted(result, key=lambda k: len(k.split('#')[0]), reverse=True) - - #_write_file("./result.txt", str(sorted_result)) - - # Replace in files - for c in target_folders: - markdown_files = find_markdown_files(slash(DOCS_ROOT, c)) - for f in markdown_files: - - # Replace the command links - find_and_replace(f, 'https://redis.io/commands', '{{< relref "/commands" >}}') - - # Replace the previously mapped links - for k in sorted_result: - find_and_replace(f, k, result[k]) - - -''' -The release notes contain fully qualified links to the latest documentation. Let's replace them by relrefs, too. -''' -def fix_fq_docs_redis_com_links(target_folders): - links_csv = _load_csv_file('./migrate/docs-redis-com-links-mapped.csv') - result = {} - - for k in links_csv: - source_url = k - - # Preserve the anchor - anchor = None - if '#' in source_url: - parsed = source_url.split('#') - source_url = parsed[0] - anchor = parsed[1] - - # Decide if the mapped source URL is needed - if links_csv[k] != "": - source_url = links_csv[k] - - target_url = "/not_defined" - - prefixes = ["stack", "rs", "kubernetes", "rc"] - - if source_url.startswith("https://docs.redis.com/latest/stack/"): - target_url = source_url.split("/stack/")[1] - target_url = "/operate/oss_and_stack/stack-with-enterprise/" + target_url - elif source_url.startswith("https://docs.redis.com/latest/rs/"): - target_url = source_url.split("/rs/")[1] - target_url = "/operate/rs/" + target_url - elif source_url.startswith("https://docs.redis.com/latest/kubernetes/"): - target_url = source_url.split("/kubernetes/")[1] - target_url = "/operate/kubernetes/" + target_url - elif source_url.startswith("https://docs.redis.com/latest/rc/"): - target_url = source_url.split("/rc/")[1] - target_url = "/operate/rc/" + target_url - else: - print("WARN: {} not covered by the link fixing script.".format(source_url)) - - if not file_exists(target_url + '_index.md'): - target_url = target_url.rstrip('/') - - if anchor: - if not "." in target_url: - relref = '{{< relref "' + target_url + '" >}}#' + anchor - else: - relref = '{{< baseurl >}}' + target_url + "#" + anchor - else: - if not "." in target_url: - relref = '{{< relref "' + target_url + '" >}}' - else: - relref = '{{< baseurl >}}' + target_url - - result[k] = relref - - - for c in target_folders: - markdown_files = find_markdown_files(slash(DOCS_ROOT, c)) - for f in markdown_files: - # Replace the previously mapped links - for k in result: - # Some links have a _index path, e.g., https://docs.redis.com/latest/rs/installing-upgrading/_index/ - find_and_replace(f, '/_index/', '/') - find_and_replace(f, k, result[k]) - - -''' -Cleanup before starting a new migration -''' -def cleanup(): - - # Delete and recreate - folders = [DOCS_DEV, DOCS_OPS, DOCS_CMD, slash(DOCS_ROOT, 'glossary'), slash(DOCS_ROOT, 'embeds')] - - for f in folders: - delete_folder(f) - create_folder(f) - - skipped_int = ['spring-framework-cache', 'redisvl', 'riot'] - - for f in os.listdir(DOCS_INT): - if f not in skipped_int: - full_path = slash(DOCS_INT, f) - if os.path.isdir(full_path): - delete_folder(full_path) - else: - delete_file(full_path) - - - - -''' -Migration script -''' -if __name__ == "__main__": - - # The working directory is the parent folder of the directory of this script - print("## Setting the migration environment ...") - print(set_env()) - - print("## Cleaning the content folders ...") - cleanup() - - - print("## Fetching temporary development documentation content ...") - fetch_io() - - print("## Migrating commands to {}".format(DOCS_CMD)) - migrate_commands() - - print("## Migrating developer documentation to {} ...".format(DOCS_DEV)) - migrate_developer_docs() - - print("## Migrating operator documentation to {} ...".format(DOCS_OPS)) - migrate_oss_ops_docs() - - print("## Fetching temporary Enterprise documentation content ...") - repo = fetch_docs_redis_com() - migrate_enterprise_ops_docs(repo) - migrate_gloassary(repo) - migrate_static_files(repo) - - print("## Migrating the integrations docs ...") - migrate_integration_docs(repo) - - print("## Cleaning up the docs.redis.com repo folder ...") - delete_folder(repo) - - print("## Applying additional fixes ...") - print("### Fixing the all_children shortcode ...") - fix_all_children(["operate/rc", "operate/rs", "operate/kubernetes", "operate/oss_and_stack/stack-with-enterprise", "integrate/redis-data-integration"]) - - print("### Fixing missing images in Kubernetes ...") - fix_missed_images(["operate/kubernetes"]) - - print("### Fixing RESP references ...") - fix_resp_references() - - print("### Fixing topics links ...") - # Don't include the RS folder at this point! - fix_topics_links(["operate/oss_and_stack", "commands", "integrate", "develop", "embeds", "glossary"]) - - print("### Fixing command group parameters ...") - fix_command_group_params(["commands", "develop", "operate/oss_and_stack", "integrate"]) - - print("### Fixing fully qualified redis.io links ...") - fix_fq_io_links(["commands", "develop", "operate/oss_and_stack"], ["commands", "develop", "operate", "integrate", "embeds", "glossary"]) - - print("### Fixing fully qualified docs.redis.com links ...") - fix_fq_docs_redis_com_links(["operate"]) \ No newline at end of file diff --git a/build/migrate/.DS_Store b/build/migrate/.DS_Store deleted file mode 100644 index 50f486dd5e..0000000000 Binary files a/build/migrate/.DS_Store and /dev/null differ diff --git a/build/migrate/all_children_pages.csv b/build/migrate/all_children_pages.csv deleted file mode 100644 index 75ec7484c5..0000000000 --- a/build/migrate/all_children_pages.csv +++ /dev/null @@ -1,25 +0,0 @@ -broken_ref;fixed_ref;comment -/operate/rs/databases/_index.md; -/operate/rs/security/access-control/manage-users/_index.md; -/operate/rs/security/access-control/_index.md; -/operate/rs/clusters/configure/_index.md; -/operate/rs/installing-upgrading/configuring/_index.md; -/operate/kubernetes/re-clusters/_index.md; -/operate/kubernetes/security/_index.md; -/operate/kubernetes/old-index.md; -/operate/kubernetes/recommendations/_index.md; -/operate/kubernetes/deployment/openshift/old-index.md; -/operate/kubernetes/deployment/_index.md; -/operate/kubernetes/re-databases/_index.md; -/operate/kubernetes/reference/_index.md; -/operate/kubernetes/_index.md; -/operate/rc/databases/configuration/_index.md; -/operate/rc/api/examples/_index.md; -/integrate/redis-data-integration/installation/_index.md; -/integrate/redis-data-integration/quickstart/_index.md; -/integrate/redis-data-integration/write-behind/_index.md; -/integrate/redis-data-integration/data-transformation/_index.md; -/integrate/redis-data-integration/reference/cli/_index.md; -/integrate/redis-data-integration/reference/data-transformation-block-types/_index.md; -/integrate/redis-data-integration/reference/_index.md; -/integrate/redis-data-integration/reference/debezium/_index.md; \ No newline at end of file diff --git a/build/migrate/corrected_int_refs.csv b/build/migrate/corrected_int_refs.csv deleted file mode 100644 index a0cfc1d755..0000000000 --- a/build/migrate/corrected_int_refs.csv +++ /dev/null @@ -1,17 +0,0 @@ -broken_ref;fixed_ref;comment -#-- Integrations docs;; -/operate/rc/cloud-integrations/pulumi;/integrate/pulumi-provider-for-redis-cloud/; -/operate/rc/cloud-integrations/terraform;/integrate/terraform-provider-for-redis-cloud/; -/operate/rs/clusters/monitoring/prometheus-integration.md;/integrate/prometheus-with-redis-enterprise/; -/operate/rs/clusters/monitoring/prometheus-integration;/integrate/prometheus-with-redis-enterprise/; -/operate/rs/clusters/monitoring/prometheus-metrics-definitions.md;/integrate/prometheus-with-redis-enterprise/prometheus-metrics-definitions; -/operate/rs/clusters/monitoring/prometheus-metrics-definitions;/integrate/prometheus-with-redis-enterprise/prometheus-metrics-definitions; -/operate/rc/cloud-integrations/prometheus-integration;/integrate/prometheus-with-redis-cloud/; -/operate/rs/clusters/monitoring/uptrace-integration.md;/integrate/uptrace-with-redis-enterprise/; -/operate/rs/clusters/monitoring/uptrace-integration;/integrate/uptrace-with-redis-enterprise/; -/develop/connect/clients/om-clients/stack-dotnet;/integrate/redisom-for-net; -/develop/connect/clients/om-clients/stack-node;/integrate/redisom-for-node-js/; -/develop/connect/clients/om-clients/stack-python;/integrate/redisom-for-python/; -/develop/connect/clients/om-clients/stack-spring;/integrate/redisom-for-java/; - - diff --git a/build/migrate/corrected_refs.csv b/build/migrate/corrected_refs.csv deleted file mode 100644 index 55ca74bc40..0000000000 --- a/build/migrate/corrected_refs.csv +++ /dev/null @@ -1,190 +0,0 @@ -broken_ref;fixed_ref;comment -#-- Developer docs;; -/develop/about/about-stack/;/operate/oss_and_stack/;Misses an introduction of Redis and Redis Stack -/develop/clients/om-clients/stack-dotnet/;/develop/connect/clients/om-clients/stack-dotnet;Referenced files should not have a trailing slash -/develop/clients/om-clients/stack-node/;/develop/connect/clients/om-clients/stack-node; -/develop/clients/om-clients/stack-python/;/develop/connect/clients/om-clients/stack-python; -/develop/clients/om-clients/stack-spring/;/develop/connect/clients/om-clients/stack-spring; -/develop/commands/ft.create.md;/commands/ft.create; -/develop/connect/clients/om-clients/stack-dotnet/;/develop/connect/clients/om-clients/stack-dotnet; -/develop/connect/clients/om-clients/stack-node/;/develop/connect/clients/om-clients/stack-node; -/develop/connect/clients/om-clients/stack-python/;/develop/connect/clients/om-clients/stack-python; -/develop/connect/clients/om-clients/stack-spring/;/develop/connect/clients/om-clients/stack-spring; -/develop/connect/clients/python/;/develop/connect/clients/python; -/develop/data-types/bitfields/;/develop/data-types/bitfields; -/develop/data-types/bitmaps/;/develop/data-types/bitmaps; -/develop/data-types/geospatial/;/develop/data-types/geospatial; -/develop/data-types/hashes/;/develop/data-types/hashes; -/develop/data-types/hyperloglogs;/develop/data-types/probabilistic/hyperloglogs; -/develop/data-types/json/path/;/develop/data-types/json/path; -/develop/data-types/lists/;/develop/data-types/lists; -/develop/data-types/sets/;/develop/data-types/sets; -/develop/data-types/streams/;/develop/data-types/streams; -/develop/manual/data-types/streams/#consumer-groups;/develop/data-types/streams; -/develop/data-types/streams-tutorial;/develop/data-types/streams; -/develop/data-types/strings/;/develop/data-types/strings; -/develop/get-started/data-store/;/develop/get-started/data-store; -/develop/get-started/document-database/;/develop/get-started/document-database; -/develop/get-started/faq/;/develop/get-started/faq; -/develop/get-started/vector-database/;/develop/get-started/vector-database; -/develop/getting-started/;/operate/oss_and_stack/install/; -/develop/getting-started/install-stack/;/operate/oss_and_stack/install/install-stack/; -/develop/stack/get-started/install/;/operate/oss_and_stack/install/install-stack/; -/develop/ui/insight/;/develop/connect/insight/; -/develop/manual/keyspace-notifications/;/develop/use/keyspace-notifications; -/develop/manual/keyspace-notifications/#events-generated-by-different-commands/?utm_source=redis\&utm_medium=app\&utm_campaign=redisinsight_triggers_and_functions_guide;/develop/use/keyspace-notifications; -/develop/manual/keyspace-notifications/#events-generated-by-different-commands;/develop/use/keyspace-notifications; -/commands/blpop/;/commands/blpop; -/develop/getting-started/install-stack/docker;/operate/oss_and_stack/install/install-stack/docker; -/develop/install/install-stack;/operate/oss_and_stack/install/install-stack/; -/develop/install/install-stack/;/operate/oss_and_stack/install/install-stack/; -/develop/interact/programmability/triggers-and-functions/concepts/function_flags/;/develop/interact/programmability/triggers-and-functions/concepts/Function_Flags; -/develop/interact/programmability/triggers-and-functions/concepts/javascript_api/;/develop/interact/programmability/triggers-and-functions/concepts/JavaScript_API; -/develop/interact/programmability/triggers-and-functions/concepts/javascript_api/#clientcall;/develop/interact/programmability/triggers-and-functions/concepts/JavaScript_API;Hugo didn't like the links that contained '#' -/develop/interact/programmability/triggers-and-functions/concepts/sync_async/;/develop/interact/programmability/triggers-and-functions/concepts/Sync_Async; -/develop/interact/programmability/triggers-and-functions/concepts/triggers/keyspace_triggers/;/develop/interact/programmability/triggers-and-functions/concepts/triggers/Keyspace_Triggers; -/develop/interact/programmability/triggers-and-functions/concepts/triggers/stream_triggers/;/develop/interact/programmability/triggers-and-functions/concepts/triggers/Stream_Triggers; -/develop/interact/programmability/triggers-and-functions/configuration/;/develop/interact/programmability/triggers-and-functions/Configuration; -/develop/interact/programmability/triggers-and-functions/configuration/#remote-task-default-timeout;/develop/interact/programmability/triggers-and-functions/Configuration; -/develop/interact/programmability/triggers-and-functions/quick_start;/develop/interact/programmability/triggers-and-functions/Quick_Start_CLI; -/develop/interact/programmability/triggers-and-functions/quick_start/;/develop/interact/programmability/triggers-and-functions/Quick_Start_CLI; -/develop/interact/pubsub/;/develop/interact/pubsub; -/develop/interact/search-and-query/administration/design/;/develop/interact/search-and-query/administration/design; -/develop/interact/search-and-query/administration/design/#query-execution-engine;/develop/interact/search-and-query/administration/design; -/develop/interact/search-and-query/administration/extensions/;/develop/interact/search-and-query/administration/extensions; -/develop/interact/search-and-query/administration/overview/;/develop/interact/search-and-query/administration/overview; -/develop/interact/search-and-query/administration/overview/#auto-complete;/develop/interact/search-and-query/administration/overview; -/develop/interact/search-and-query/advanced-concepts/chinese/;/develop/interact/search-and-query/advanced-concepts/chinese; -/develop/interact/search-and-query/advanced-concepts/chinese/#using-custom-dictionaries;/develop/interact/search-and-query/advanced-concepts/chinese; -/develop/interact/search-and-query/advanced-concepts/phonetic_matching/;/develop/interact/search-and-query/advanced-concepts/phonetic_matching; -/develop/interact/search-and-query/advanced-concepts/query_syntax/;/develop/interact/search-and-query/advanced-concepts/query_syntax; -/develop/interact/search-and-query/advanced-concepts/sorting/;/develop/interact/search-and-query/advanced-concepts/sorting; -/develop/interact/search-and-query/advanced-concepts/stemming/;/develop/interact/search-and-query/advanced-concepts/stemming; -/develop/interact/search-and-query/advanced-concepts/stemming//;/develop/interact/search-and-query/advanced-concepts/stemming; -/develop/interact/search-and-query/advanced-concepts/stemming//#supported-languages;/develop/interact/search-and-query/advanced-concepts/stemming; -/develop/interact/search-and-query/advanced-concepts/stopwords/;/develop/interact/search-and-query/advanced-concepts/stopwords; -/develop/interact/search-and-query/advanced-concepts/tags/;/develop/interact/search-and-query/advanced-concepts/tags; -/develop/interact/search-and-query/advanced-concepts/vectors/;/develop/interact/search-and-query/advanced-concepts/vectors; -/develop/interact/search-and-query/advanced-concepts/vectors/#querying-vector-fields;/develop/interact/search-and-query/advanced-concepts/vectors; -/develop/interact/search-and-query/advanced-concepts/vectors/#vector-search-examples;/develop/interact/search-and-query/advanced-concepts/vectors; -/develop/interact/search-and-query/basic-constructs/configuration-parameters/;/develop/interact/search-and-query/basic-constructs/configuration-parameters; -/develop/interact/search-and-query/basic-constructs/configuration-parameters/#default_dialect;/develop/interact/search-and-query/basic-constructs/configuration-parameters; -/develop/interact/search-and-query/basic-constructs/schema-definition/;/develop/interact/search-and-query/basic-constructs/schema-definition; -/develop/interact/search-and-query/img/polygons.png;/develop/interact/search-and-query/img/polygons.png;Markdown image reference, RelRefs don’t work with images. Markdown syntax ![Name](Ref) -/develop/interact/search-and-query/query/combined/;/develop/interact/search-and-query/query/combined; -/develop/interact/search-and-query/query/vector-search/;/develop/interact/search-and-query/query/vector-search; -/develop/interact/search-and-query/query/geo-spatial/;/develop/interact/search-and-query/query/geo-spatial; -/develop/manual/pipelining/;/develop/use/pipelining; -/develop/interact/search-and-query/quickstart/;/develop/get-started/document-database; -/develop/interact/search-and-query/search/aggregations/;/develop/interact/search-and-query/advanced-concepts/aggregations; -/develop/interact/search-and-query/search/aggregations/#cursor-api;/develop/interact/search-and-query/advanced-concepts/aggregations; -/develop/interact/search-and-query/search/vectors/;/develop/get-started/vector-database; -/develop/interact/search-and-query/search/vectors/#creation-attributes-per-algorithm;/develop/get-started/vector-database; -/develop/management/;/operate/oss_and_stack/management/; -/develop/management/security/;/operate/oss_and_stack/management/security/; -/develop/management/security/#protected-mode;/operate/oss_and_stack/management/security/; -/develop/manual/cli;/develop/connect/cli; -/develop/manual/cli/;/develop/connect/cli; -/develop/manual/client-side-caching/;/develop/use/client-side-caching; -/develop/manual/config/;/operate/oss_and_stack/management/config; -/develop/manual/data-types/streams;/develop/data-types/streams; -/develop/manual/data-types/streams/;/develop/data-types/streams; -/develop/manual/eviction/;/develop/reference/eviction; -/develop/manual/keyspace/;/develop/use/keyspace; -/develop/manual/programmability/;/develop/interact/programmability/; -/develop/manual/programmability/#read-only_scripts;/develop/interact/programmability/; -/develop/manual/programmability/eval-intro;/develop/interact/programmability/eval-intro; -/develop/manual/programmability/eval-intro/#eval-flags;/develop/interact/programmability/eval-intro; -/develop/manual/programmability/eval-intro/;/develop/interact/programmability/eval-intro; -/develop/manual/programmability/functions-intro;/develop/interact/programmability/functions-intro; -/develop/manual/programmability/functions-intro/;/develop/interact/programmability/functions-intro; -/develop/manual/programmability/functions-intro/#function-flags;/develop/interact/programmability/functions-intro; -/develop/manual/pubsub;/develop/interact/pubsub; -/develop/modules/;/operate/oss_and_stack/stack-with-enterprise/; -/develop/reference/cluster-spec;/operate/oss_and_stack/reference/cluster-spec; -/develop/stack;/operate/oss_and_stack/; -/develop/stack/;/operate/oss_and_stack/; -/develop/stack/bloom;/develop/data-types/probabilistic/bloom-filter; -/develop/stack/json;/develop/data-types/json/; -/develop/stack/json/;/develop/data-types/json/; -/develop/stack/json/path;/develop/data-types/json/path; -/develop/stack/json/path/;/develop/data-types/json/path; -/develop/stack/search;/develop/interact/search-and-query/; -/develop/stack/search/;/develop/interact/search-and-query/; -/develop/stack/search/indexing_json;/develop/interact/search-and-query/indexing/; -/develop/stack/search/indexing_json/;/develop/interact/search-and-query/indexing/; -/develop/stack/search/indexing_json/#index-json-arrays-as-vector;/develop/interact/search-and-query/indexing/; -/develop/stack/search/indexing_json/#index-json-arrays-as-text;/develop/interact/search-and-query/indexing/; -/develop/stack/search/indexing_json/#index-json-arrays-as-tag;/develop/interact/search-and-query/indexing/; -/develop/stack/search/indexing_json/#index-json-arrays-as-numeric;/develop/interact/search-and-query/indexing/; -/develop/stack/search/indexing_json/#index-json-arrays-as-geo;/develop/interact/search-and-query/indexing/; -/develop/stack/search/reference/highlight;/develop/interact/search-and-query/advanced-concepts/highlight; -/develop/stack/search/reference/query_syntax;/develop/interact/search-and-query/advanced-concepts/query_syntax; -/develop/stack/search/reference/query_syntax/;/develop/interact/search-and-query/advanced-concepts/query_syntax; -/develop/stack/search/reference/query_syntax/#query-attributes;/develop/interact/search-and-query/advanced-concepts/query_syntax; -/develop/stack/search/reference/vectors/;/develop/interact/search-and-query/advanced-concepts/vectors; -/develop/stack/search/reference/vectors/#runtime-attributes;/develop/interact/search-and-query/advanced-concepts/vectors; -/develop/stack/timeseries/;/develop/data-types/timeseries/; -/commands/blpop/;/commands/blpop; -#-- Command docs;; -/commands/module-load/;/commands/module-load; -/commands/auth/;/commands/auth; -/commands/scan/;/commands/scan; -/develop/management/security/acl;/operate/oss_and_stack/management/security/acl; -/develop/management/security/acl#selectors;/operate/oss_and_stack/management/security/acl; -/develop/management/security/acl/#command-categories;/operate/oss_and_stack/management/security/acl; -/develop/management/security/acl/;/operate/oss_and_stack/management/security/acl; -/develop/manual/programmability/;/develop/interact/programmability/; -/develop/manual/programmability/#read-only-scripts;/develop/interact/programmability; -/develop/interact/search-and-query/search/aggregations/;/develop/interact/search-and-query/advanced-concepts/aggregations; -/develop/interact/search-and-query/search/aggregations;/develop/interact/search-and-query/advanced-concepts/aggregations; -/develop/interact/search-and-query/search/aggregations/#supported-groupby-reducers;/develop/interact/search-and-query/advanced-concepts/aggregations; -/develop/stack/search/reference/aggregations/;/develop/interact/search-and-query/advanced-concepts/aggregations; -/develop/stack/search/reference/aggregations;/develop/interact/search-and-query/advanced-concepts/aggregations; -/develop/stack/search/reference/aggregations/#cursor-api;/develop/interact/search-and-query/advanced-concepts/aggregations; -/develop/reference/protocol-spec/;/develop/reference/protocol-spec; -/develop/reference/protocol-spec/#resp-integers;/develop/reference/protocol-spec; -/develop/reference/protocol-spec/#resp-arrays;/develop/reference/protocol-spec; -/develop/reference/protocol-spec/#resp-simple-strings;/develop/reference/protocol-spec; -/develop/reference/protocol-spec/#resp-errors;/develop/reference/protocol-spec; -/develop/stack/search/configuring;/develop/interact/search-and-query/administration; -/develop/interact/search-and-query/advanced-concepts/spellcheck/;/develop/interact/search-and-query/advanced-concepts/spellcheck; -/develop/interact/search-and-query/advanced-concepts/highlight/;/develop/interact/search-and-query/advanced-concepts/highlight; -/develop/interact/search-and-query/advanced-concepts/scoring/;/develop/interact/search-and-query/advanced-concepts/scoring; -/develop/stack/search/reference/tags;/develop/interact/search-and-query/advanced-concepts/tags; -/develop/manual/keyspace;/develop/use/keyspace; -/develop/stack/timeseries/configuration/;/develop/data-types/timeseries/configuration; -/develop/stack/timeseries/configuration/#compaction_policy;/develop/data-types/timeseries/configuration; -/develop/stack/timeseries/configuration/#duplicate_policy;/develop/data-types/timeseries/configuration; -/develop/stack/timeseries/configuration/#retention_policy;/develop/data-types/timeseries/configuration; -/develop/stack/timeseries/configuration/#chunk_size_bytes;/develop/data-types/timeseries/configuration; -/develop/stack/timeseries;/develop/data-types/timeseries/; -/develop/manual/;/develop/use/; -/topics/distlock;/develop/use/patterns/distributed-locks; -#-- Ops docs;; -/operate/rs/administering/_index.md;/operate/rs/; -/operate/oss_and_stack/getting-started/install-stack/docker/;/operate/oss_and_stack/install/install-stack/docker; -/operate/oss_and_stack/getting-started/install-stack/linux;/operate/oss_and_stack/install/install-stack/linux; -/operate/oss_and_stack/clients;/develop/connect/clients/; -/operate/oss_and_stack/manual/scaling;/operate/oss_and_stack/management/scaling; -/operate/oss_and_stack/reference/eviction;/develop/reference/eviction/; -/operate/ri;/develop/connect/insight/; -/operate/ri/using-redisinsight/add-instance#add-a-standalone-redis-database;/develop/connect/insight/; -/operate/ri/using-redisinsight/add-instance;/develop/connect/insight/; -/operate/ri/using-redisinsight/auto-discover-databases#auto-discovery-for-redis-cloud-databases;/develop/connect/insight/; -/operate/ri/;/develop/connect/insight/; -/operate/ri/installing/install-redis-desktop;/develop/connect/insight/; -/operate/configuring-aws-instances.md;/operate/rs/installing-upgrading/install/plan-deployment/configuring-aws-instances; -/operate/rs/developing/modules/upgrading/_index.md;/operate/oss_and_stack/stack-with-enterprise/install/upgrade-module; -/operate/http://localhost:1313/rs/security/certificates/updating-certificates#use-the-cli;/operate/rs/security/certificates/updating-certificates; -rs/databases/active-active/develop/_index.md;/operate/rs/databases/active-active/develop/; -/operate/rs/security/ldap/_index.md;/operate/rs/security/access-control/ldap/; -/operate/openshift-operatorhub.md;/operate/kubernetes/deployment/openshift/openshift-operatorhub; -/operate/oss_and_stack/about/about-stack;/operate/oss_and_stack/; -/operate/oss_and_stack/install/install-redis-from-source/;/operate/oss_and_stack/install/install-redis/install-redis-from-source; -/operate/oss_and_stack/management/admin/;/operate/oss_and_stack/management/admin; -/operate/oss_and_stack/management/persistence/;/operate/oss_and_stack/management/persistence; -/operate/oss_and_stack/management/config-file/;/operate/oss_and_stack/management/config-file; -/operate/oss_and_stack/management/config/;/operate/oss_and_stack/management/config; -/operate/oss_and_stack/management/security/acl/;/operate/oss_and_stack/management/security/acl; -/operate/content/rs/databases/active-active/syncer.md;/operate/rs/databases/active-active/syncer; diff --git a/build/migrate/docs-redis-com-links-mapped.csv b/build/migrate/docs-redis-com-links-mapped.csv deleted file mode 100644 index 22de554df6..0000000000 --- a/build/migrate/docs-redis-com-links-mapped.csv +++ /dev/null @@ -1,83 +0,0 @@ -broken_ref;fixed_ref; -https://docs.redis.com/latest/modules/redisbloom/redisbloom-quickstart/;https://docs.redis.com/latest/stack/bloom/; -https://docs.redis.com/latest/modules/redisbloom/;https://docs.redis.com/latest/stack/bloom/; -https://docs.redis.com/latest/rs/databases/active-active/;; -https://docs.redis.com/latest/kubernetes/;; -https://docs.redis.com/latest/modules/redisgears/jvm/;https://docs.redis.com/latest/stack/gears-v1/jvm/; -https://docs.redis.com/latest/modules/redisearch/release-notes/redisearch-2.4-release-notes/#v2411-july-2022;https://docs.redis.com/latest/stack/release-notes/redisearch/redisearch-2.4-release-notes/; -https://docs.redis.com/latest/modules/redisjson/release-notes/redisjson-2.2-release-notes/#v220-july-2022;https://docs.redis.com/latest/stack/release-notes/redisjson/redisjson-2.2-release-notes/; -https://docs.redis.com/latest/modules/redisbloom/release-notes/redisbloom-2.2-release-notes/#v2218-july-2022;https://docs.redis.com/latest/stack/release-notes/redisbloom/redisbloom-2.2-release-notes/; -https://docs.redis.com/latest/modules/redisgraph/release-notes/redisgraph-2.8-release-notes/#v2817-july-2022;https://docs.redis.com/latest/stack/release-notes/redisgraph/redisgraph-2.8-release-notes/; -https://docs.redis.com/latest/modules/redistimeseries/release-notes/redistimeseries-1.6-release-notes/#v1617-july-2022;https://docs.redis.com/latest/stack/release-notes/redistimeseries/redistimeseries-1.6-release-notes/; -https://docs.redis.com/latest/modules/install/upgrade-module/;https://docs.redis.com/latest/stack/install/upgrade-module/; -https://docs.redis.com/latest/modules/install/upgrade-module;https://docs.redis.com/latest/stack/install/upgrade-module; -https://docs.redis.com/latest/modules/redisearch/release-notes/redisearch-2.4-release-notes/#v2414-august-2022;https://docs.redis.com/latest/stack/release-notes/redisearch/redisearch-2.4-release-notes/; -https://docs.redis.com/latest/modules/redisgraph/release-notes/redisgraph-2.8-release-notes/#v2819-august-2022;https://docs.redis.com/latest/stack/release-notes/redisgraph/redisgraph-2.8-release-notes/; -https://docs.redis.com/latest/rs/installing-upgrading/upgrading/;; -https://docs.redis.com/latest/rs/release-notes/rs-6-2-4-august-2021/;; -https://docs.redis.com/latest/rs/release-notes/rs-6-2-8-october-2021/;; -https://docs.redis.com/latest/rs/databases/active-active/manage/#data-persistence;; -https://docs.redis.com/latest/rs/administering/product-lifecycle/;https://docs.redis.com/latest/rs/installing-upgrading/product-lifecycle/; -https://docs.redis.com/latest/modules/modules-lifecycle/;https://docs.redis.com/latest/stack/modules-lifecycle/; -https://docs.redis.com/latest/modules/redisearch/release-notes/redisearch-2.4-release-notes/#v2416-november-2022;https://docs.redis.com/latest/stack/release-notes/redisearch/redisearch-2.4-release-notes/; -https://docs.redis.com/latest/modules/redisgraph/release-notes/redisgraph-2.8-release-notes/#v2820-september-2022;https://docs.redis.com/latest/stack/release-notes/redisgraph/redisgraph-2.8-release-notes/; -https://docs.redis.com/latest/rs/installing-upgrading/product-lifecycle/;; -https://docs.redis.com/latest/modules/redisearch/release-notes/;https://docs.redis.com/latest/stack/release-notes/redisearch/; -https://docs.redis.com/latest/modules/redisjson/release-notes/;https://docs.redis.com/latest/stack/release-notes/redisjson/; -https://docs.redis.com/latest/modules/redisbloom/release-notes/;https://docs.redis.com/latest/stack/release-notes/redisbloom/; -https://docs.redis.com/latest/modules/redisgraph/release-notes/;https://docs.redis.com/latest/stack/release-notes/redisgraph/; -https://docs.redis.com/latest/modules/redistimeseries/release-notes/;https://docs.redis.com/latest/stack/release-notes/redistimeseries/; -https://docs.redis.com/latest/modules/add-module-to-cluster/#upgrading-the-module-for-the-database;https://docs.redis.com/latest/stack/install/add-module-to-cluster/; -https://docs.redis.com/latest/rs/databases/active-active/#syncer-process;; -https://docs.redis.com/latest/rs/databases/active-active#syncer-process;; -https://docs.redis.com/latest/stack/install/upgrade-module/;; -https://docs.redis.com/latest/rs/release-notes/rs-6-2-4-august-2021/#deprecation-notices;; -https://docs.redis.com/latest/rs/databases/active-active/develop/develop-for-aa/; -https://docs.redis.com/latest/modules/redisearch/;https://docs.redis.com/latest/stack/search/; -https://docs.redis.com/latest/modules/redisjson/;https://docs.redis.com/latest/stack/json/; -https://docs.redis.com/latest/rs/installing-upgrading/get-started-docker;; -https://docs.redis.com/latest/rs/security/ldap/;; -https://docs.redis.com/latest/rs/references/rlcheck;; -https://docs.redis.com/latest/rs/clusters/new-cluster-setup/;; -https://docs.redis.com/latest/rs/security/tls-ssl;; -https://docs.redis.com/latest/rs/installing-upgrading/upgrading#upgrading-crdbs/;; -https://docs.redis.com/latest/rs/databases/import-export/schedule-backups/;; -https://docs.redis.com/latest/rs/administering/designing-production/access-control/;; -https://docs.redis.com/latest/rs/clusters/maintenance-mode;; -https://docs.redis.com/latest/rs/administering/cluster-operations/updating-certificates;; -https://docs.redis.com/latest/rs/installing-upgrading/get-started-redis-enterprise-software/;https://docs.redis.com/latest/rs/installing-upgrading/quickstarts/redis-enterprise-software-quickstart/; -https://docs.redis.com/latest/rs/clusters/add-node/;; -https://docs.redis.com/latest/rs/installing-upgrading/upgrading#upgrade-activeactive-databases;; -https://docs.redis.com/latest/modules/modules-lifecycle#modules-endoflife-schedule;https://docs.redis.com/latest/stack/modules-lifecycle; -https://docs.redis.com/latest/rs/installing-upgrading/supported-platforms;; -https://docs.redis.com/latest/rs/installing-upgrading/_index/;https://docs.redis.com/latest/rs/installing-upgrading/; -https://docs.redis.com/latest/rs/databases/active-active/develop/hyperloglog-active-active.md;https://docs.redis.com/latest/rs/databases/active-active/develop/hyperloglog-active-active; -https://docs.redis.com/latest/rs/databases/import-export/replica-of/;; -https://docs.redis.com/latest/rs/databases/configure/replica-ha/;; -https://docs.redis.com/latest/rs/clusters/remove-node/;; -https://docs.redis.com/latest/modules/redisearch/release-notes/redisearch-2.6-release-notes/#v264-december-2022;https://docs.redis.com/latest/stack/release-notes/redisearch/redisearch-2.6-release-notes/; -https://docs.redis.com/latest/modules/redisjson/release-notes/redisjson-2.4-release-notes/#v245-february-2023;https://docs.redis.com/latest/stack/release-notes/redisjson/redisjson-2.4-release-notes/; -https://docs.redis.com/latest/modules/redisbloom/release-notes/redisbloom-2.4-release-notes/#v24-ga-v243-november-2022;https://docs.redis.com/latest/stack/release-notes/redisbloom/redisbloom-2.4-release-notes/; -https://docs.redis.com/latest/modules/redisgraph/release-notes/redisgraph-2.10-release-notes/#v2105-december-2022;https://docs.redis.com/latest/stack/release-notes/redisgraph/redisgraph-2.10-release-notes/; -https://docs.redis.com/latest/modules/redistimeseries/release-notes/redistimeseries-1.8-release-notes/#v185-january-2023;https://docs.redis.com/latest/stack/release-notes/redistimeseries/redistimeseries-1.8-release-notes/; -https://docs.redis.com/latest/rs/references/cli-utilities/rlcheck/;; -https://docs.redis.com/latest/stack/release-notes/redisearch/redisearch-2.6-release-notes/;; -https://docs.redis.com/latest/stack/release-notes/redisjson/redisjson-2.4-release-notes/;; -https://docs.redis.com/latest/stack/release-notes/redisbloom/redisbloom-2.4-release-notes/;; -https://docs.redis.com/latest/stack/release-notes/redisgraph/redisgraph-2.10-release-notes/;; -https://docs.redis.com/latest/stack/release-notes/redistimeseries/redistimeseries-1.8-release-notes/;; -https://docs.redis.com/latest/modules/redisearch;https://docs.redis.com/latest/stack/search/; -https://docs.redis.com/latest/modules/redisjson;https://docs.redis.com/latest/stack/json/; -https://docs.redis.com/latest/modules/redisbloom;https://docs.redis.com/latest/stack/bloom/; -https://docs.redis.com/latest/modules/redisgraph;https://docs.redis.com/latest/stack/deprecated-features/graph/; -https://docs.redis.com/latest/modules/redistimeseries;https://docs.redis.com/latest/stack/timeseries/; -https://docs.redis.com/latest/rs/security/tls/enable-tls/;https://docs.redis.com/latest/rs/security/encryption/tls/enable-tls/; -https://docs.redis.com/latest/rs/references/rest-api/objects/bdb/;; -https://docs.redis.com/latest/rs/references/cli-utilities/rladmin/tune/#tune-cluster;; -https://docs.redis.com/latest/rs/security/certificates/ocsp-stapling/;; -https://docs.redis.com/latest/rs/security/access-control/manage-users/manage-passwords/#password-complexity-rules;https://docs.redis.com/latest/rs/security/access-control/manage-passwords/; -https://docs.redis.com/latest/rs/security/access-control/ldap/migrate-to-role-based-ldap/;; -https://docs.redis.com/latest/rs/databases/configure/database-persistence/;; -https://docs.redis.com/latest/rc/rc-quickstart/;; -https://docs.redis.com/latest/modules/;https://docs.redis.com/latest/stack/; -https://docs.redis.com/latest/rs/security/;; \ No newline at end of file diff --git a/build/migrate/io-links-misc-mapped.csv b/build/migrate/io-links-misc-mapped.csv deleted file mode 100644 index aac14da327..0000000000 --- a/build/migrate/io-links-misc-mapped.csv +++ /dev/null @@ -1,156 +0,0 @@ -broken_ref;fixed_ref -https://redis.io; -https://redis.io/docs/manual/keyspace-notifications; -https://redis.io/docs/data-types/hashes/; -https://redis.io/docs/getting-started/install-stack/docker/;https://redis.io/docs/install/install-stack/docker/ -https://redis.io/docs/connect/insight/; -https://redis.io/docs/getting-started/;https://redis.io/docs/install/ -https://redis.io/docs/manual/data-types/streams/;https://redis.io/docs/data-types/streams/ -https://redis.io/docs/data-types/json/; -https://redis.io/docs/data-types/sets/; -https://redis.io/docs/data-types/sorted-sets/; -https://redis.io/docs/data-types/streams/; -https://redis.io/docs/data-types/strings/; -https://redis.io/docs/manual/keyspace-notifications/#events-generated-by-different-commands; -https://redis.io/topics/streams-intro;https://redis.io/docs/data-types/streams/ -https://redis.io/topics/replication;https://redis.io/docs/management/replication/ -https://redis.io/docs/manual/cli/;https://redis.io/docs/connect/cli/ -https://redis.io/topics/sentinel;https://redis.io/docs/management/sentinel/ -https://redis.io/docs/reference/cluster-spec/#hash-tags; -https://redis.io/docs/management/sentinel/#sentinel-api; -https://redis.io/docs/management/optimization/latency/; -https://redis.io/clients; -https://redis.io/docs/clients/python/;https://redis.io/docs/connect/clients/python/ -https://redis.io/docs/clients/java/;https://redis.io/docs/connect/clients/java/ -https://redis.io/docs/clients/dotnet/;https://redis.io/docs/connect/clients/dotnet/ -https://redis.io/docs/clients/go/;https://redis.io/docs/connect/clients/go/ -https://redis.io/docs/connect/clients/; -https://redis.io/docs/manual/security/acl/#acl-rules;https://redis.io/docs/management/security/acl/#acl-rules -https://redis.io/docs/management/security/acl/; -https://redis.io/docs/management/security/acl/#command-categories; -https://redis.io/docs/manual/pubsub/;https://redis.io/docs/interact/pubsub/ -https://redis.io/docs/management/security/acl/#selectors; -https://redis.io/docs/manual/security/acl/#acl-rules;https://redis.io/docs/management/security/acl/ -https://redis.io/docs/clients/;https://redis.io/docs/connect/clients/ -https://redis.io/docs/getting-started/installation/;https://redis.io/docs/install/install-redis/ -https://redis.io/docs/manual/cli/#command-line-usage;https://redis.io/docs/connect/cli/ -https://redis.io/docs/manual/cli/#interactive-mode;https://redis.io/docs/connect/cli/ -https://redis.io/docs/manual/cli/#preferences;https://redis.io/docs/connect/cli/ -https://redis.io/docs/manual/cli/#showing-help-about-redis-commands;https://redis.io/docs/connect/cli/ -https://redis.io/docs/connect/cli/#scanning-for-big-keys; -https://redis.io/docs/clients/nodejs/;https://redis.io/docs/connect/clients/nodejs/ -https://redis.io/resources/clients/#other-clients; -https://redis.io/docs/interact/programmability/functions-intro/; -https://redis.io/docs/management/persistence/#append-only-file; -https://redis.io/docs/interact/pubsub/#sharded-pubsub; -https://redis.io/docs/interact/programmability/triggers-and-functions/quick_start/;https://redis.io/docs/interact/programmability/triggers-and-functions/quick_start_cli/ -https://redis.io/docs/management/security/acl/#key-permissions; -https://redis.io/docs/reference/command-tips/; -https://redis.io/docs/stack/;https://redis.io/docs/about/about-stack/ -https://redis.io/docs/install/install-stack/; -https://redis.io/docs/connect/cli/; -https://redis.io/docs/interact/programmability/triggers-and-functions; -https://redis.io/docs/management/security/acl/#acl-rules; -https://redis.io/docs/management/persistence/; -https://redis.io/docs/about/; -https://redis.io/docs/management/optimization/latency/#latency-induced-by-transparent-huge-pages; -https://redis.io/docs/stack/timeseries/configuration/#chunk_size_bytes;https://redis.io/docs/data-types/timeseries/configuration/ -https://redis.io/docs/stack/timeseries/configuration/#compaction_policy;https://redis.io/docs/data-types/timeseries/configuration/ -https://redis.io/docs/stack/timeseries/configuration/#duplicate_policy;https://redis.io/docs/data-types/timeseries/configuration/ -https://redis.io/docs/stack/timeseries/configuration/#encoding;https://redis.io/docs/data-types/timeseries/configuration/ -https://redis.io/docs/stack/timeseries/configuration/#num_threads;https://redis.io/docs/data-types/timeseries/configuration/ -https://redis.io/docs/stack/timeseries/configuration/#retention_policy;https://redis.io/docs/data-types/timeseries/configuration/ -https://redis.io/docs/stack/timeseries/quickstart/#downsampling;https://redis.io/docs/data-types/timeseries/quickstart/ -https://redis.io/docs/stack/timeseries/quickstart/#labels;https://redis.io/docs/data-types/timeseries/quickstart/ -https://redis.io/docs/stack/timeseries/quickstart/#aggregation;https://redis.io/docs/data-types/timeseries/quickstart/ -https://redis.io/docs/stack/timeseries/quickstart/;https://redis.io/docs/data-types/timeseries/quickstart/ -https://redis.io/docs/stack/bloom/configuration/#cf_max_expansions; -https://redis.io/docs/stack/bloom/configuration/#error_rate; -https://redis.io/docs/stack/bloom/configuration/#initial_size; -https://redis.io/docs/data-types/probabilistic/bloom-filter/; -https://redis.io/docs/stack/search/configuring/#concurrent_write_mode;https://redis.io/docs/interact/search-and-query/basic-constructs/configuration-parameters/ -https://redis.io/docs/stack/search/configuring/#cursor_max_idle;https://redis.io/docs/interact/search-and-query/basic-constructs/configuration-parameters/ -https://redis.io/docs/stack/search/configuring/#default_dialect;https://redis.io/docs/interact/search-and-query/basic-constructs/configuration-parameters/ -https://redis.io/docs/stack/search/configuring/#extload;https://redis.io/docs/interact/search-and-query/basic-constructs/configuration-parameters/ -https://redis.io/docs/stack/search/configuring/#fork_gc_clean_threshold;https://redis.io/docs/interact/search-and-query/basic-constructs/configuration-parameters/ -https://redis.io/docs/stack/search/configuring/#fork_gc_retry_interval;https://redis.io/docs/interact/search-and-query/basic-constructs/configuration-parameters/ -https://redis.io/docs/stack/search/configuring/#fork_gc_run_interval;https://redis.io/docs/interact/search-and-query/basic-constructs/configuration-parameters/ -https://redis.io/docs/stack/search/configuring/#frisoini;https://redis.io/docs/interact/search-and-query/basic-constructs/configuration-parameters/ -https://redis.io/docs/stack/search/configuring/#gc_policy;https://redis.io/docs/interact/search-and-query/basic-constructs/configuration-parameters/ -https://redis.io/docs/stack/search/configuring/#gc_scansize;https://redis.io/docs/interact/search-and-query/basic-constructs/configuration-parameters/ -https://redis.io/docs/stack/search/configuring/#maxaggregateresults;https://redis.io/docs/interact/search-and-query/basic-constructs/configuration-parameters/ -https://redis.io/docs/stack/search/configuring/#maxdoctablesize;https://redis.io/docs/interact/search-and-query/basic-constructs/configuration-parameters/ -https://redis.io/docs/stack/search/configuring/#maxprefixexpansions;https://redis.io/docs/interact/search-and-query/basic-constructs/configuration-parameters/ -https://redis.io/docs/stack/search/configuring/#maxsearchresults;https://redis.io/docs/interact/search-and-query/basic-constructs/configuration-parameters/ -https://redis.io/docs/stack/search/configuring/#minprefix;https://redis.io/docs/interact/search-and-query/basic-constructs/configuration-parameters/ -https://redis.io/docs/stack/search/configuring/#nogc;https://redis.io/docs/interact/search-and-query/basic-constructs/configuration-parameters/ -https://redis.io/docs/stack/search/configuring/#on_timeout;https://redis.io/docs/interact/search-and-query/basic-constructs/configuration-parameters/ -https://redis.io/docs/stack/search/configuring/#oss_global_password;https://redis.io/docs/interact/search-and-query/basic-constructs/configuration-parameters/ -https://redis.io/docs/stack/search/configuring/#partial_indexed_docs;https://redis.io/docs/interact/search-and-query/basic-constructs/configuration-parameters/ -https://redis.io/docs/stack/search/configuring/#timeout;https://redis.io/docs/interact/search-and-query/basic-constructs/configuration-parameters/ -https://redis.io/docs/stack/search/configuring/#upgrade_index;https://redis.io/docs/interact/search-and-query/basic-constructs/configuration-parameters/ -https://redis.io/docs/stack/search/reference/synonyms/;https://redis.io/docs/interact/search-and-query/advanced-concepts/synonyms/ -https://redis.io/docs/stack/search/reference/query_syntax/#fuzzy-matching;https://redis.io/docs/interact/search-and-query/advanced-concepts/query_syntax/ -https://redis.io/docs/stack/search/design/overview/#auto-completion;https://redis.io/docs/interact/search-and-query/administration/overview/ -https://redis.io/docs/stack/search/reference/query_syntax/;https://redis.io/docs/interact/search-and-query/advanced-concepts/query_syntax/ -https://redis.io/docs/stack/search/reference/query_syntax/#numeric-filters-in-query;https://redis.io/docs/interact/search-and-query/advanced-concepts/query_syntax/ -https://redis.io/docs/stack/search/reference/query_syntax/#geo-filters-in-query;https://redis.io/docs/interact/search-and-query/advanced-concepts/query_syntax/ -https://redis.io/docs/manual/data-types/#hashes;https://redis.io/docs/data-types/ -https://redis.io/docs/stack/search/indexing_json/;https://redis.io/docs/interact/search-and-query/indexing/ -https://redis.io/docs/stack/search/reference/stemming#supported-languages;https://redis.io/docs/interact/search-and-query/advanced-concepts/stemming/ -https://redis.io/docs/stack/search/quick_start/;https://redis.io/docs/get-started/document-database/ -https://redis.io/docs/stack/search/reference/;https://redis.io/docs/interact/search-and-query/advanced-concepts/ -https://redis.io/docs/stack/json/path;https://redis.io/docs/data-types/json/path/ -https://redis.io/docs/stack/json/path/#jsonpath-support;https://redis.io/docs/data-types/json/path/ -https://redis.io/docs/stack/json/path/#jsonpath-syntax;https://redis.io/docs/data-types/json/path/ -https://redis.io/docs/stack/json/path/#jsonpath-examples;https://redis.io/docs/data-types/json/path/ -https://redis.io/docs/stack/json/path/#legacy-path-syntax;https://redis.io/docs/data-types/json/path/ -https://redis.io/docs/stack/json/#use-redisjson;https://redis.io/docs/data-types/json/ -https://redis.io/docs/stack/bloom/quick_start/; -https://redis.io/docs/interact/programmability/triggers-and-functions/; -https://redis.io/docs/manual/transactions/;https://redis.io/docs/interact/transactions/ -https://redis.io/docs/reference/modules/modules-api-ref/#redismodule_call; -https://redis.io/topics/modules-intro;https://redis.io/docs/reference/modules/ -https://redis.io/topics/replication#partial-resynchronizations-after-restarts-and-failovers;https://redis.io/docs/management/replication/ -https://redis.io/community; -https://redis.io/docs/getting-started/install-stack/;https://redis.io/docs/install/install-stack/ -https://redis.io/docs/stack/get-started/install/;https://redis.io/docs/install/install-stack/ -https://redis.io/docs/ui/insight/;https://redis.io/docs/connect/insight/ -https://redis.io/download/; -https://redis.io/docs/stack/timeseries/;https://redis.io/docs/data-types/timeseries/; -https://redis.io/docs/interact/search-and-query/query/vector-search/; -https://redis.io/topics/modules-intro;https://redis.io/docs/reference/modules/; -https://redis.io/docs/manual/keyspace-notifications/#events-generated-by-different-commands/?utm_source=redis&utm_medium=app&utm_campaign=redisinsight_triggers_and_functions_guide; -https://redis.io/docs/manual/data-types/streams/;https://redis.io/docs/data-types/streams/; -https://redis.io/docs/manual/data-types/streams/#consumer-groups;https://redis.io/docs/data-types/streams/; -https://redis.io/topics/command-tips;https://redis.io/docs/reference/command-tips/; -https://redis.io/topics/streams-intro;https://redis.io/docs/data-types/streams/; -https://redis.io/topics/modules-native-types;https://redis.io/docs/reference/modules/modules-native-types/; -https://redis.io/topics/modules-blocking-ops;https://redis.io/docs/reference/modules/modules-blocking-ops/; -https://redis.io/topics/notifications;https://redis.io/docs/manual/keyspace-notifications/; -https://redis.io/docs/stack/json/;https://redis.io/docs/data-types/json/; -https://redis.io/docs/interact/search-and-query/; -https://redis.io/topics/distlock;https://redis.io/docs/manual/patterns/distributed-locks/; -https://redis.io/docs/management/security/acl/;/operate/oss_and_stack/management/security/acl; -https://redis.io/docs/ui/insight;/develop/connect/insight/; -https://redis.io/resources/clients/;/develop/connect/clients/; -https://redis.io/clients;/develop/connect/clients/; -https://redis.io/docs/reference/protocol-spec/; -https://redis.io/docs/stack/insight/#cli;https://redis.io/docs/connect/insight/; -https://redis.io/resources/clients/#other-clients;https://redis.io/docs/connect/clients/; -https://redis.io/resources/clients/;https://redis.io/docs/connect/clients/; -https://redis.io/docs/stack/;https://redis.io/docs/get-started/; -https://redis.io/docs/reference/protocol-spec/#resp-versions; -https://redis.io/clients;https://redis.io/docs/connect/clients/; -https://redis.io/docs/about/;https://redis.io; -https://redis.io/docs/get-started/faq/#background-saving-fails-with-a-fork-error-on-linux; -https://redis.io/docs/stack/bloom/configuration/#redisbloom-configuration-parameters;https://redis.io/docs/data-types/probabilistic/configuration/; -https://redis.io/docs/stack/bloom/configuration/#cf_max_expansions;https://redis.io/docs/data-types/probabilistic/configuration/#cf_max_expansions; -https://redis.io/docs/stack/bloom/configuration/#error_rate;https://redis.io/docs/data-types/probabilistic/configuration/#error_rate; -https://redis.io/docs/stack/bloom/configuration/#initial_size;https://redis.io/docs/data-types/probabilistic/configuration/#initial_size; -https://redis.io/docs/manual/persistence/;https://redis.io/docs/management/persistence/; -https://redis.io/docs/manual/eviction/;https://redis.io/docs/reference/eviction/; -https://redis.io/docs/stack/bloom/quick_start/;https://redis.io/docs/data-types/probabilistic/; -https://redis.io/docs/stack/search/;https://redis.io/docs/interact/search-and-query/; -https://redis.io/docs/stack/json/#use-redisjson;https://redis.io/docs/data-types/json/#use-redisjson; -https://redis.io/docs/stack/bloom/;https://redis.io/docs/data-types/probabilistic/; diff --git a/build/migrate/logs/broken_front_matter.log b/build/migrate/logs/broken_front_matter.log deleted file mode 100644 index fbe7fb613f..0000000000 --- a/build/migrate/logs/broken_front_matter.log +++ /dev/null @@ -1,3 +0,0 @@ -/content/operate/rc/api/faq.md -/content/integrate/redis-data-integration/upgrade.md -/content/integrate/redis-data-integration/quickstart/ingest-guide.md \ No newline at end of file diff --git a/build/migrate/logs/broken_links.log b/build/migrate/logs/broken_links.log deleted file mode 100644 index f7886a4d31..0000000000 --- a/build/migrate/logs/broken_links.log +++ /dev/null @@ -1,30 +0,0 @@ -WARN 2024/03/30 15:35:55 [en] REF_NOT_FOUND: Ref "/develop/management/scaling/": "/Users/david/Projects/Git/redis-learn/redis-docs-final-sync/redis-docs/content/commands/keys/index.md:67:28": page not found -WARN 2024/03/30 15:35:55 [en] REF_NOT_FOUND: Ref "/develop/reference/cluster-spec/": "/Users/david/Projects/Git/redis-learn/redis-docs-final-sync/redis-docs/content/commands/keys/index.md:72:47": page not found -WARN 2024/03/30 15:35:55 [en] REF_NOT_FOUND: Ref "/develop/management/scaling/": "/Users/david/Projects/Git/redis-learn/redis-docs-final-sync/redis-docs/content/commands/scan/index.md:209:28": page not found -WARN 2024/03/30 15:35:55 [en] REF_NOT_FOUND: Ref "/develop/reference/cluster-spec/": "/Users/david/Projects/Git/redis-learn/redis-docs-final-sync/redis-docs/content/commands/scan/index.md:214:47": page not found -WARN 2024/03/30 15:35:56 [en] REF_NOT_FOUND: Ref "/develop/reference/cluster-spec/": "/Users/david/Projects/Git/redis-learn/redis-docs-final-sync/redis-docs/content/commands/sort/index.md:238:47": page not found -WARN 2024/03/30 15:35:56 [en] REF_NOT_FOUND: Ref "/operate/oss_and_stack/management/sentinel-clients": "/Users/david/Projects/Git/redis-learn/redis-docs-final-sync/redis-docs/content/operate/oss_and_stack/management/sentinel.md:894:324": page not found -WARN 2024/03/30 15:35:56 [en] REF_NOT_FOUND: Ref "/develop/reference/eviction/": "/Users/david/Projects/Git/redis-learn/redis-docs-final-sync/redis-docs/content/operate/oss_and_stack/management/optimization/memory-optimization.md:241:89": page not found -WARN 2024/03/30 15:35:56 [en] REF_NOT_FOUND: Ref "/operate/kubernetes/_index": "/Users/david/Projects/Git/redis-learn/redis-docs-final-sync/redis-docs/content/operate/oss_and_stack/stack-with-enterprise/stack-quickstart.md:19:21": page not found -WARN 2024/03/30 15:35:56 [en] REF_NOT_FOUND: Ref "/operate/redisinsight/install/install-redisinsight/install-on-aws/": "/Users/david/Projects/Git/redis-learn/redis-docs-final-sync/redis-docs/content/operate/redisinsight/install/install-on-docker.md:14:59": page not found -WARN 2024/03/30 15:35:56 [en] REF_NOT_FOUND: Ref "/operate/rs/installing-upgrading/get-started-docker": "/Users/david/Projects/Git/redis-learn/redis-docs-final-sync/redis-docs/content/operate/rs/release-notes/legacy-release-notes/redis-enterprise-5.md:94:10": page not found -WARN 2024/03/30 15:35:56 [en] REF_NOT_FOUND: Ref "/operate/rs/security/ldap": "/Users/david/Projects/Git/redis-learn/redis-docs-final-sync/redis-docs/content/operate/rs/release-notes/legacy-release-notes/redis-enterprise-5.md:105:14": page not found -WARN 2024/03/30 15:35:56 [en] REF_NOT_FOUND: Ref "/operate/rs/references/rlcheck": "/Users/david/Projects/Git/redis-learn/redis-docs-final-sync/redis-docs/content/operate/rs/release-notes/legacy-release-notes/rlec-4-3-aug-2016.md:51:14": page not found -WARN 2024/03/30 15:35:56 [en] REF_NOT_FOUND: Ref "/operate/rs/security/tls-ssl": "/Users/david/Projects/Git/redis-learn/redis-docs-final-sync/redis-docs/content/operate/rs/release-notes/legacy-release-notes/rlec-4-3-aug-2016.md:58:10": page not found -WARN 2024/03/30 15:35:56 [en] REF_NOT_FOUND: Ref "/operate/rs/administering/cluster-operations/updating-certificates": "/Users/david/Projects/Git/redis-learn/redis-docs-final-sync/redis-docs/content/operate/rs/release-notes/legacy-release-notes/rs-5-4-14-february-2020.md:69:113": page not found -WARN 2024/03/30 15:35:56 [en] REF_NOT_FOUND: Ref "/operate/rs/administering/cluster-operations/updating-certificates": "/Users/david/Projects/Git/redis-learn/redis-docs-final-sync/redis-docs/content/operate/rs/release-notes/legacy-release-notes/rs-5-4-14-february-2020.md:95:98": page not found -WARN 2024/03/30 15:35:56 [en] REF_NOT_FOUND: Ref "/operate/rs/administering/cluster-operations/updating-certificates": "/Users/david/Projects/Git/redis-learn/redis-docs-final-sync/redis-docs/content/operate/rs/release-notes/legacy-release-notes/rs-5-4-10-december-2019.md:60:113": page not found -WARN 2024/03/30 15:35:56 [en] REF_NOT_FOUND: Ref "/operate/rs/administering/cluster-operations/updating-certificates": "/Users/david/Projects/Git/redis-learn/redis-docs-final-sync/redis-docs/content/operate/rs/release-notes/legacy-release-notes/rs-5-4-10-december-2019.md:95:98": page not found -WARN 2024/03/30 15:35:56 [en] REF_NOT_FOUND: Ref "/operate/rs/administering/designing-production/access-control": "/Users/david/Projects/Git/redis-learn/redis-docs-final-sync/redis-docs/content/operate/rs/release-notes/legacy-release-notes/rs-5-4-2-april-2019.md:44:41": page not found -WARN 2024/03/30 15:35:56 [en] REF_NOT_FOUND: Ref "/operate/rs/security/tls-ssl": "/Users/david/Projects/Git/redis-learn/redis-docs-final-sync/redis-docs/content/operate/rs/release-notes/legacy-release-notes/rs-5-4-2-april-2019.md:49:47": page not found -WARN 2024/03/30 15:35:56 [en] REF_NOT_FOUND: Ref "/operate/rs/administering/cluster-operations/updating-certificates": "/Users/david/Projects/Git/redis-learn/redis-docs-final-sync/redis-docs/content/operate/rs/release-notes/legacy-release-notes/rs-5-4-2-april-2019.md:94:71": page not found -WARN 2024/03/30 15:35:56 [en] REF_NOT_FOUND: Ref "/operate/rs/administering/cluster-operations/updating-certificates": "/Users/david/Projects/Git/redis-learn/redis-docs-final-sync/redis-docs/content/operate/rs/release-notes/legacy-release-notes/rs-5-4-4-june-2019.md:99:181": page not found -WARN 2024/03/30 15:35:56 [en] REF_NOT_FOUND: Ref "/operate/rs/administering/cluster-operations/updating-certificates": "/Users/david/Projects/Git/redis-learn/redis-docs-final-sync/redis-docs/content/operate/rs/release-notes/legacy-release-notes/rs-5-4-6-july-2019.md:72:98": page not found -WARN 2024/03/30 15:35:56 [en] REF_NOT_FOUND: Ref "/operate/rs/installing-upgrading/supported-platforms": "/Users/david/Projects/Git/redis-learn/redis-docs-final-sync/redis-docs/content/operate/rs/release-notes/legacy-release-notes/rs-5-6-0-april-2020.md:38:90": page not found -WARN 2024/03/30 15:35:56 [en] REF_NOT_FOUND: Ref "/operate/rs/installing-upgrading/supported-platforms": "/Users/david/Projects/Git/redis-learn/redis-docs-final-sync/redis-docs/content/operate/rs/release-notes/legacy-release-notes/rs-5-6-0-april-2020.md:100:72": page not found -WARN 2024/03/30 15:35:57 [en] REF_NOT_FOUND: Ref "/develop/data-types-intro": "/Users/david/Projects/Git/redis-learn/redis-docs-final-sync/redis-docs/content/develop/interact/programmability/_index.md:26:64": page not found -WARN 2024/03/30 15:35:57 [en] REF_NOT_FOUND: Ref "/operate/rs/databases/active-active/_index": "/Users/david/Projects/Git/redis-learn/redis-docs-final-sync/redis-docs/content/glossary/_index.md:1:1": page not found -WARN 2024/03/30 15:35:57 [en] REF_NOT_FOUND: Ref "/operate/rc/subscriptions/create-fixed-subscription": "/Users/david/Projects/Git/redis-learn/redis-docs-final-sync/redis-docs/content/get-started/_index.md:47:33": page not found -WARN 2024/03/30 15:35:57 [en] REF_NOT_FOUND: Ref "rs/databases/active-active/develop/_index": "/Users/david/Projects/Git/redis-learn/redis-docs-final-sync/redis-docs/content/glossary/_index.md:1:1": page not found -WARN 2024/03/30 15:35:57 [en] REF_NOT_FOUND: Ref "/operate/rc/subscriptions/create-flexible-subscription": "/Users/david/Projects/Git/redis-learn/redis-docs-final-sync/redis-docs/content/get-started/_index.md:48:36": page not found -WARN 2024/03/30 15:35:57 [en] REF_NOT_FOUND: Ref "/operate/rs/security/ldap/_index": "/Users/david/Projects/Git/redis-learn/redis-docs-final-sync/redis-docs/content/glossary/_index.md:1:1": page not found diff --git a/build/migrate/logs/images.log b/build/migrate/logs/images.log deleted file mode 100644 index 342a6d1afe..0000000000 --- a/build/migrate/logs/images.log +++ /dev/null @@ -1,776 +0,0 @@ -./develop/interact/programmability/triggers-and-functions/Quick_Start_RI.md:{{< image filename="/develop/interact/programmability/triggers-and-functions/images/tf-rdi-0.png" >}} -./develop/interact/programmability/triggers-and-functions/Quick_Start_RI.md:{{< image filename="/develop/interact/programmability/triggers-and-functions/images/tf-rdi-1.png" >}} -./develop/interact/programmability/triggers-and-functions/Quick_Start_RI.md:{{< image filename="/develop/interact/programmability/triggers-and-functions/images/tf-rdi-2.png" >}} -./develop/interact/programmability/triggers-and-functions/Quick_Start_RI.md:{{< image filename="/develop/interact/programmability/triggers-and-functions/images/tf-rdi-3.png" >}} -./develop/interact/programmability/triggers-and-functions/Quick_Start_RI.md:{{< image filename="/develop/interact/programmability/triggers-and-functions/images/tf-rdi-3a.png" >}} -./develop/interact/programmability/triggers-and-functions/Quick_Start_RI.md:{{< image filename="/develop/interact/programmability/triggers-and-functions/images/tf-rdi-4.png" >}} -./develop/interact/programmability/triggers-and-functions/Quick_Start_RI.md:{{< image filename="/develop/interact/programmability/triggers-and-functions/images/tf-rdi-5.png" >}} -./integrate/riot/replication.md:{{< image filename="/integrate/riot/images/dump-and-restore.svg" alt="dump-and-restore" >}} -./integrate/riot/architecture.md:{{< image filename="/integrate/riot/images/architecture.svg" >}} -./integrate/riot/architecture.md:{{< image filename="/integrate/riot/images/mapping.png" >}} -./integrate/uptrace-with-redis-enterprise/_index.md:{{< image filename="/images/rs/uptrace-redis-nodes.png" >}} -./integrate/amazon-bedrock/set-up-redis.md: {{< image filename="/images/rc/connection-wizard-button.png#no-click" alt="Connect button." >}} -./integrate/redis-data-integration/architecture.md:{{< image filename="/images/rdi/redis-di-simplified.png" >}} -./integrate/redis-data-integration/architecture.md:{{< image filename="/images/rdi/redis-di.png" >}} -./integrate/redis-data-integration/installation/pacemaker.md:{{< image filename="/images/rdi/redis-di-ha.png" >}} -./integrate/redis-data-integration/installation/multiple-debezium-connectors.md:{{< image filename="/images/rdi/redis-di-multi-debezium.png" >}} -./integrate/redis-data-integration/monitoring-guide.md:{{< image filename="/images/rdi/monitoring-diagram.png" >}} -./integrate/redis-data-integration/monitoring-guide.md:{{< image filename="/images/rdi/monitoring-grafana-new-dash.png" >}} -./integrate/redis-data-integration/monitoring-guide.md:{{< image filename="/images/rdi/monitoring-grafana-dash-configure.png" >}} -./integrate/redis-data-integration/monitoring-guide.md:{{< image filename="/images/rdi/monitoring-grafana-dash-running.png" >}} -./integrate/redis-data-integration/quickstart/ingest-guide.md:{{< image filename="/images/rdi/config-yaml-diagram.png" >}} -./integrate/redis-data-integration/quickstart/ingest-guide.md:{{< image filename="/images/rdi/application-properties-diagram.png" >}} -./integrate/redis-data-integration/quickstart/write-behind-guide.md:{{< image filename="/images/rdi/redis-di-write-behind.png" >}} -./integrate/redis-data-integration/benchmark.md:{{< image filename="/images/rdi/monitoring-grafana-dash-running.png" >}} -./integrate/redis-data-integration/upgrade.md: {{< image filename="/images/rdi/cluster-redis-modules.png" >}} -./integrate/redis-data-integration/upgrade.md: {{< image filename="/images/rdi/redis-di-db-update-available.png" >}} -./integrate/redis-data-integration/upgrade.md: {{< image filename="/images/rdi/rladmin-status-modules.png" >}} -./integrate/redis-data-integration/upgrade.md: {{< image filename="/images/rdi/redis-di-upgraded-redisgears.png" >}} -./integrate/redis-data-integration/data-transformation/data-transformation-pipeline.md:{{< image filename="/images/rdi/data-transformation-pipeline.png" >}} -./integrate/redis-data-integration/data-transformation/data-denormalization.md:{{< image filename="/images/rdi/nest-flow.png" >}} -./integrate/redis-data-integration/data-transformation/_index.md:{{< image filename="/images/rdi/data-transformation-flow.png" >}} -./integrate/redis-data-integration/_index.md: {{< image filename="/images/rdi/ingest.png" >}} -./integrate/redis-data-integration/_index.md: {{< image filename="/images/rdi/write-behind.png" >}} -./operate/rs/databases/active-active/manage.md:{{< image filename="/images/rs/add-active-active-participants.png" >}} -./operate/rs/databases/active-active/causal-consistency.md:{{< image filename="/images/rs/create_db_causal.png" >}} -./operate/rs/databases/active-active/connect.md:{{< image filename="/images/rs/crdb-diagram.png" >}} -./operate/rs/databases/active-active/create.md: 1. Go to **access control > users** and select {{< image filename="/images/rs/icon_add.png#no-click" alt="Add" >}}. -./operate/rs/databases/active-active/create.md: 1. Enter the name, email, and password for the user, select the **Admin** role, and select {{< image filename="/images/rs/icon_save.png#no-click" alt="Save" >}}. -./operate/rs/databases/active-active/create.md: {{< image filename="/images/rs/create-service-account.png" >}} -./operate/rs/databases/active-active/create.md:1. In **databases**, click {{< image filename="/images/rs/icon_add.png#no-click" alt="Add" >}}. -./operate/rs/databases/active-active/create.md: {{< image filename="/images/rs/new_geo-distrbuted.png" >}} -./operate/rs/databases/active-active/create.md: 1. In the Access control list section of the database configuration, click {{< image filename="/images/rs/icon_add.png#no-click" alt="Add" >}}. -./operate/rs/databases/active-active/create.md: 1. In the **Participating Clusters** list, click {{< image filename="/images/rs/icon_add.png#no-click" alt="Add" >}} to add clusters. -./operate/rs/databases/active-active/create.md: enter the credentials (email address and password) for the service account that you created, and click {{< image filename="/images/rs/icon_save.png#no-click" alt="Save" >}}. -./operate/rs/databases/active-active/get-started.md: {{< image filename="/images/rs/getstarted-setup.png" >}} -./operate/rs/databases/active-active/get-started.md: {{< image filename="/images/rs/getstarted-nodeconfig.png" >}} -./operate/rs/databases/active-active/get-started.md: {{< image filename="/images/rs/getstarted-admincredentials.png" >}} -./operate/rs/databases/active-active/get-started.md: {{< image filename="/images/rs/new_geo-distrbuted.png" >}} -./operate/rs/databases/active-active/get-started.md: {{< image filename="/images/rs/crdb-activate.png" >}} -./operate/rs/databases/configure/replica-ha.md: 1. On the **Databases** screen, select {{< image filename="/images/rs/buttons/button-toggle-actions-vertical.png#no-click" alt="Toggle actions button" width="22px" >}} to open a list of additional actions. -./operate/rs/databases/configure/db-upgrade.md:1. On the **Databases** screen, select {{< image filename="/images/rs/buttons/button-toggle-actions-vertical.png#no-click" alt="Toggle actions button" width="22px" >}} to open a list of additional actions. -./operate/rs/databases/configure/shard-placement.md:{{< image filename="/images/rs/shard_placement_info_cluster.png" >}} -./operate/rs/databases/configure/shard-placement.md:{{< image filename="/images/rs/shard_placement_rladmin_status.png" >}} -./operate/rs/databases/configure/db-defaults.md:1. On the **Databases** screen, select {{< image filename="/images/rs/buttons/button-toggle-actions-vertical.png#no-click" alt="Toggle actions button" width="22px" >}} to open a list of additional actions. -./operate/rs/databases/durability-ha/consistency.md:{{< image filename="/images/rs/weak-consistency.png" >}} -./operate/rs/databases/durability-ha/consistency.md:{{< image filename="/images/rs/strong-consistency.png" >}} -./operate/rs/databases/import-export/migrate-to-active-active.md: {{< image filename="/images/rs/replicaof-source-url.png" >}} -./operate/rs/databases/import-export/migrate-to-active-active.md: 1. In the destination database, paste the URL of the source endpoint in the **Replica Of** box, and click {{< image filename="/images/rs/icon_save.png#no-click" alt="Save" >}}. -./operate/rs/databases/import-export/migrate-to-active-active.md:1. When the synchronization icon turns green {{< image filename="/images/rs/icon_sync_green.png#no-click" alt="Synchronization complete" >}}, the migration is complete. Note that migration can take minutes to hours to complete depending on the dataset size and network quality. -./operate/rs/databases/import-export/export-data.md:1. Click {{< image filename="/images/rs/buttons/button-toggle-actions-vertical.png#no-click" alt="Toggle actions button" width="22px" >}} to open a list of additional actions. -./operate/rs/databases/import-export/import-data.md:1. Click {{< image filename="/images/rs/buttons/button-toggle-actions-vertical.png#no-click" alt="Toggle actions button" width="22px" >}} to open a list of additional actions. -./operate/rs/databases/import-export/replica-of/create.md:1. Point to the source database entry and select {{< image filename="/images/rs/buttons/edit-button.png#no-click" alt="The Edit button" width="25px" >}} to edit it. -./operate/rs/databases/delete.md:1. Select {{< image filename="/images/rs/icons/delete-icon.png#no-click" alt="Delete button" width="22px" >}} **Delete**. -./operate/rs/databases/memory-performance/shard-placement-policy.md:{{< image filename="/images/rs/dense_placement.png" >}} -./operate/rs/databases/memory-performance/shard-placement-policy.md:{{< image filename="/images/rs/sparse_placement.png" >}} -./operate/rs/databases/memory-performance/_index.md:{{< image filename="/images/rs/sharding.png" >}} -./operate/rs/security/encryption/internode-encryption.md: 1. On the **Databases** screen, select {{< image filename="/images/rs/buttons/button-toggle-actions-vertical.png#no-click" alt="Toggle actions button" width="22px" >}} to open a list of additional actions. -./operate/rs/security/encryption/tls/enable-tls.md:{{< image filename="/images/rs/general-settings-syncer-cert.png" alt="general-settings-syncer-cert" >}} -./operate/rs/security/encryption/tls/enable-tls.md: {{< image filename="/images/rs/crdb-tls-all.png" alt="crdb-tls-all" >}} -./operate/rs/security/encryption/tls/enable-tls.md:1. Select **Add** {{< image filename="/images/rs/icon_add.png#no-click" alt="Add" >}} -./operate/rs/security/encryption/tls/enable-tls.md: {{< image filename="/images/rs/database-tls-replica-certs.png" alt="Database TLS Configuration" >}} -./operate/rs/security/encryption/tls/enable-tls.md:1. Save the syncer certificate. {{< image filename="/images/rs/icon_save.png#no-click" alt="Save" >}} -./operate/rs/security/access-control/rbac/assign-user-role.md: - Point to an existing user and select {{< image filename="/images/rs/buttons/edit-button.png#no-click" alt="The Edit button" width="25px" >}} to edit the user. -./operate/rs/security/access-control/rbac/configure-acl.md: - Point to a Redis ACL and select {{< image filename="/images/rs/buttons/edit-button.png#no-click" alt="The Edit button" width="25px" >}} to edit an existing Redis ACL. -./operate/rs/security/access-control/rbac/create-roles.md: - Point to a role and select {{< image filename="/images/rs/buttons/edit-button.png#no-click" alt="The Edit button" width="25px" >}} to edit an existing role. -./operate/rs/security/access-control/rbac/create-roles.md:1. Select the check mark {{< image filename="/images/rs/buttons/checkmark-button.png#no-click" alt="The Check button" width="25px" >}} to confirm. -./operate/rs/references/compatibility/resp.md: 1. On the **Databases** screen, select {{< image filename="/images/rs/buttons/button-toggle-actions-vertical.png#no-click" alt="Toggle actions button" width="22px" >}} to open a list of additional actions. -./operate/rs/references/rest-api/objects/bdb/status.md:{{< image filename="/images/rs/rest-api-bdb-status.png#no-click" alt="BDB status" >}} -./operate/rs/references/rest-api/objects/bdb/replica_sync.md:{{< image filename="/images/rs/rest-api-bdb-sync.png#no-click" alt="BDB sync" >}} -./operate/rs/references/rest-api/objects/bdb/replica_sources_status.md:{{< image filename="/images/rs/rest-api-replica-sources-status.png#no-click" alt="Replica sources status" >}} -./operate/rs/references/rest-api/objects/action.md:{{< image filename="/images/rs/rest-api-action-cycle.png#no-click" alt="Action lifecycle" >}} -./operate/rs/networking/configuring-aws-route53-dns-redis-enterprise.md:{{< image filename="/images/rs/00-CreateHostedZone-en.png" >}} -./operate/rs/networking/configuring-aws-route53-dns-redis-enterprise.md:{{< image filename="/images/rs/03-HostedZoneSelection-en.png" >}} -./operate/rs/networking/configuring-aws-route53-dns-redis-enterprise.md:{{< image filename="/images/rs/05-NS1Configuration-en.png" >}} -./operate/rs/networking/configuring-aws-route53-dns-redis-enterprise.md:{{< image filename="/images/rs/06-NSList-en.png" >}} -./operate/rs/networking/configuring-aws-route53-dns-redis-enterprise.md:{{< image filename="/images/rs/07-NSRecord-en.png" >}} -./operate/rs/networking/configuring-aws-route53-dns-redis-enterprise.md:{{< image filename="/images/rs/08-FinalConfig-en.png" >}} -./operate/rs/networking/cluster-lba-setup.md:{{< image filename="/images/rs/cluster-behind-load-balancer-top-down.png" alt="cluster-behind-load-balancer-top-down" >}} -./operate/rs/clusters/maintenance-mode.md: {{< image filename="/images/rs/maintenance_mode.png" >}} -./operate/rs/clusters/optimize/memtier-benchmark.md:{{< image filename="/images/rs/memtier_metrics_page.png" >}} -./operate/rs/clusters/optimize/wait.md:{{< image filename="/images/rs/weak-consistency.png" >}} -./operate/rs/clusters/optimize/wait.md:{{< image filename="/images/rs/strong-consistency.png" >}} -./operate/rs/clusters/replace-node.md:A failed node will appear as `Down` ({{< image filename="/images/rs/icons/node-down-icon.png" >}}) in the **Nodes** list. -./operate/rs/clusters/monitoring/_index.md:- As a notification on the status icon ( {{< image filename="/images/rs/icons/icon_warning.png#no-click" alt="Warning" width="18px" >}} ) for the node and cluster -./operate/rs/clusters/monitoring/_index.md:- As a notification on the status icon ( {{< image filename="/images/rs/icons/icon_warning.png#no-click" alt="Warning" width="18px" >}} ) for the database -./operate/rs/installing-upgrading/upgrading/upgrade-active-active.md: {{< image filename="/images/rs/crdb-upgrade-node.png" >}} -./operate/rs/installing-upgrading/upgrading/upgrade-active-active.md: {{< image filename="/images/rs/crdb-upgrade-protocol.png" >}} -./operate/rs/installing-upgrading/upgrading/upgrade-database.md: - Use the admin console to open the **Configuration** tab for the database and select {{< image filename="/images/rs/icons/info-icon.png#no-click" alt="The About database button" width="18px" >}} **About**. -./operate/rs/installing-upgrading/upgrading/upgrade-database.md: - Use the admin console to open the **Configuration** tab for the database and select {{< image filename="/images/rs/icons/info-icon.png#no-click" alt="The About database button" width="18px" >}} **About**. -./operate/rs/installing-upgrading/quickstarts/docker-quickstart.md:{{< image filename="/images/rs/RS-Docker-container.png" >}} -./operate/rs/installing-upgrading/quickstarts/docker-quickstart.md:{{< image filename="/images/rs/RS-Docker-cluster-single-host.png" >}} -./operate/rs/installing-upgrading/quickstarts/docker-quickstart.md:{{< image filename="/images/rs/RS-Docker-cluster-multi-host.png" >}} -./operate/kubernetes/faqs/_index.md:{{< image filename="/images/rs/openshift-password-retrieval.png" >}} -./operate/kubernetes/architecture/operator.md:{{< image filename="/images/rs/k8-high-level-architecture-diagram-of-redis-enterprise.png" >}} -./operate/kubernetes/architecture/_index.md:{{< image filename="/images/rs/kubernetes-overview-layered-orchestration.png" >}} -./operate/kubernetes/architecture/_index.md:{{< image filename="/images/rs/kubernetes-overview-unified-deployment.png" >}} -./operate/kubernetes/architecture/_index.md:{{< image filename="/images/rs/kubernetes-overview-network-attached-persistent-storage.png" >}} -./operate/kubernetes/architecture/_index.md:{{< image filename="/images/rs/kubernetes-overview-performance-improvements-read.png" >}}{{< image filename="/images/rs/kubernetes-overview-performance-improvements-write.png" >}} -./operate/kubernetes/architecture/_index.md:{{< image filename="/images/rs/kubernetes-overview-multiple-services-per-pod.png" >}} -./operate/kubernetes/deployment/deployment-options.md:{{< image filename="/images/platforms/k8s-deploy-one-to-one.png" >}} -./operate/kubernetes/deployment/deployment-options.md:{{< image filename="/images/platforms/k8s-deploy-one-to-many.png" >}} -./operate/kubernetes/deployment/deployment-options.md:{{< image filename="/images/platforms/k8s-deploy-many-to-many.png" >}} -./operate/kubernetes/deployment/deployment-options.md:{{< image filename="/images/platforms/k8s-deploy-cross-namespaces.png" >}} -./operate/kubernetes/deployment/deployment-options.md:{{< image filename="/images/platforms/k8s-deploy-multicluster-antipattern.png" >}} -./operate/kubernetes/deployment/openshift/old-index.md: {{< image filename="/images/rs/getting-started-kubernetes-openshift-image1.png" >}} -./operate/kubernetes/deployment/openshift/old-index.md: {{< image filename="/images/rs/getting-started-kubernetes-openshift-image4.png" >}} -./operate/kubernetes/deployment/openshift/old-index.md:{{< image filename="/images/rs/getting-started-kubernetes-openshift-image2.png" >}} -./operate/kubernetes/deployment/openshift/old-index.md: {{< image filename="/images/rs/getting-started-kubernetes-openshift-image5.png" >}} -./operate/kubernetes/deployment/openshift/old-index.md: {{< image filename="/images/rs/getting-started-kubernetes-openshift-image3.png" >}} -./operate/kubernetes/deployment/openshift/old-index.md:{{< image filename="/images/rs/getting-started-kubernetes-openshift-image6.png" >}} -./operate/kubernetes/deployment/openshift/old-getting-started-openshift-crdb.md: {{< image filename="/images/rs/openshift-crdb-catalog.png" >}} -./operate/kubernetes/deployment/openshift/old-getting-started-openshift-crdb.md: {{< image filename="/images/rs/openshift-crdb-information.png" >}} -./operate/kubernetes/deployment/openshift/old-getting-started-openshift-crdb.md: {{< image filename="/images/rs/openshift-crdb-plan.png" >}} -./operate/kubernetes/deployment/openshift/old-getting-started-openshift-crdb.md: {{< image filename="/images/rs/openshift-crdb-configuration.png" >}} -./operate/kubernetes/deployment/openshift/old-getting-started-openshift-crdb.md: {{< image filename="/images/rs/openshift-crdb-binding.png" >}} -./operate/kubernetes/deployment/openshift/old-getting-started-openshift-crdb.md:{{< image filename="/images/rs/openshift-crdb-results.png" >}} -./operate/kubernetes/deployment/openshift/old-getting-started-openshift-crdb.md:{{< image filename="/images/rs/openshift-crdb-secret.png" >}} -./operate/rc/databases/configuration/clustering.md:{{< image filename="/images/rc/clustering-subscription.png" >}} -./operate/rc/rc-quickstart.md: {{< image filename="/images/rc/icon-database-update-status-pending.png#no-click" alt="Pending database status" class="inline" >}}   {{< image filename="/images/rc/icon-database-update-status-active.png#no-click" alt="Active database status" class="inline" >}} -./operate/rc/rc-quickstart.md:{{< image filename="/images/rc/connection-wizard-button.png#no-click" alt="Connect button." >}} -./operate/rc/subscriptions/view-flexible-subscription.md: Select the {{< image filename="/images/rc/icon-subscription-detail-change-payment-flexible.png" >}} button to change the credit card associated with this subscription. -./operate/rc/logs-reports/usage-reports.md:{{< image filename="/images/rc/usage-report-memory-usage.png" >}} -./operate/rc/api/how-to/manage-api-keys.md:1. Click {{< image filename="/images/rs/icon_add.png#no-click" alt="Add" >}} to add a new whitelist subnet. -./operate/rc/api/examples/create-database.md:{{< image filename="/images/rv/api/swagger-database-create-documentation.png" >}} -./operate/rc/api/get-started/process-lifecycle.md:{{< image filename="/images/rv/api/processing-and-provisioning.png" >}} -./operate/rc/api/get-started/use-rest-api.md: {{< image filename="/images/rv/api/swagger-authorize-and-try-now.png" >}} -./operate/rc/api/get-started/use-rest-api.md: {{< image filename="/images/rv/api/swagger-authorizations.png" >}} -./operate/rc/api/get-started/use-rest-api.md:{{< image filename="/images/rv/api/swagger-closed-lock.png" >}} -./operate/rc/api/get-started/use-rest-api.md: {{< image filename="/images/rv/api/swagger-payment-methods-try-it-now.png" >}} -./operate/rc/api/get-started/use-rest-api.md: {{< image filename="/images/rv/api/swagger-query-results.png" >}} -./operate/rc/api/get-started/use-rest-api.md: {{< image filename="/images/rv/api/swagger-parameters.png" >}} -./operate/rc/api/get-started/use-rest-api.md: {{< image filename="/images/rv/api/swagger-post-body-model.png" >}} -./operate/rc/api/get-started/use-rest-api.md: {{< image filename="/images/rv/api/swagger-post-edit-body.png" >}} -./operate/oss_and_stack/stack-with-enterprise/install/upgrade-module.md: {{< image filename="/images/rs/rladmin_status.png" >}} -./operate/oss_and_stack/stack-with-enterprise/install/upgrade-module.md: {{< image filename="/images/rs/module_info.png" >}} -./operate/oss_and_stack/stack-with-enterprise/timeseries/_index.md:| {{< image filename="/images/rs/TimeSeries-downsampling1.png" >}} | {{< image filename="/images/rs/TimeSeries-downsampling2.png" >}} | -./operate/oss_and_stack/stack-with-enterprise/timeseries/_index.md:{{< image filename="/images/rs/TimeSeries-integrations.png" >}} -./operate/oss_and_stack/stack-with-enterprise/timeseries/_index.md:{{< image filename="/images/rs/TimeSeries-modeling1.jpg" >}} -./operate/oss_and_stack/stack-with-enterprise/timeseries/_index.md:{{< image filename="/images/rs/TimeSeries-modeling2.jpg" >}} -./operate/oss_and_stack/stack-with-enterprise/timeseries/_index.md:{{< image filename="/images/rs/TimeSeries-modeling3.jpg" >}} -./operate/oss_and_stack/stack-with-enterprise/timeseries/_index.md:{{< image filename="/images/rs/TimeSeries-modeling4.jpg" >}} -./operate/oss_and_stack/stack-with-enterprise/timeseries/_index.md:{{< image filename="/images/rs/TimeSeries-DataIngestion.png" >}} -./operate/oss_and_stack/stack-with-enterprise/timeseries/_index.md:{{< image filename="/images/rs/TimeSeries-ReadQueries.png" >}} -./operate/oss_and_stack/stack-with-enterprise/timeseries/_index.md:{{< image filename="/images/rs/TimeSeries-UsedMemory.png" >}} -./operate/oss_and_stack/stack-with-enterprise/bloom/_index.md:{{< image filename="/images/rs/rebloom-hash1.png" >}} -./operate/oss_and_stack/stack-with-enterprise/bloom/_index.md:{{< image filename="/images/rs/rebloom-hash3.png" >}} -./operate/oss_and_stack/stack-with-enterprise/search/redisearch-2-upgrade.md: {{< image filename="/images/rs/upgrade_module.png" >}} -./embeds/create-db.md:1. In **databases**, click {{< image filename="/images/rs/icon_add.png#no-click" alt="Add" >}}. -./embeds/tls-configuration-procedure.md: {{< image filename="/images/rs/database-tls-config.png" alt="Database TLS Configuration" >}} -./embeds/tls-configuration-procedure.md: {{< image filename="/images/rs/icon_add.png#no-click" alt="Add button" >}} -./embeds/tls-configuration-procedure.md: {{< image filename="/images/rs/database-tls-replica-certs.png" alt="Database TLS Configuration" >}} -./embeds/tls-configuration-procedure.md: {{< image filename="/images/rs/icon_save.png#no-click" alt="Save button" >}} -./embeds/tls-configuration-procedure.md: {{< image filename="/images/rs/database-tls-all.png" alt="database-tls-all" >}} -./embeds/tls-configuration-procedure.md: {{< image filename="/images/rs/icon_add.png#no-click" alt="Add button" >}} -./embeds/tls-configuration-procedure.md: {{< image filename="/images/rs/database-tls-replica-certs.png" alt="Database TLS Configuration" >}} -./embeds/tls-configuration-procedure.md: {{< image filename="/images/rs/icon_save.png#no-click" alt="Save button" >}} -./integrate/confluent-with-redis-cloud/_index.md: {{The Confluent integration tile.}} -./integrate/confluent-with-redis-cloud/_index.md: {{Select your environment and cluster from the Create a Connector selector.}} -./integrate/prometheus-with-redis-enterprise/_index.md:{{Graphic showing how Prometheus and Grafana collect and display data from a Redis Enterprise Cluster. Prometheus collects metrics from the Redis Enterprise cluster, and Grafana queries those metrics for visualization.}} -./integrate/prometheus-with-redis-enterprise/_index.md: {{The Redis Enterprise target showing that Prometheus is connected to the Redis Enterprise Cluster.}} -./integrate/prometheus-with-redis-enterprise/_index.md: {{The Prometheus data source in the list of data sources on Grafana.}} -./integrate/prometheus-with-redis-enterprise/_index.md: {{The Prometheus connection form in Grafana.}} -./integrate/prometheus-with-redis-cloud/_index.md: {{The Redis Enterprise target showing that Prometheus is connected to the Redis Enterprise Cluster.}} -./integrate/prometheus-with-redis-cloud/_index.md: {{The Prometheus data source in the list of data sources on Grafana.}} -./integrate/prometheus-with-redis-cloud/_index.md: {{The Prometheus connection form in Grafana.}} -./integrate/amazon-bedrock/set-up-redis.md: {{The Redis Cloud - Flexible plan listing on AWS Marketplace}} -./integrate/amazon-bedrock/set-up-redis.md: {{Use the Set Up Your Account button after subscribing to Redis Cloud with your AWS Marketplace account.}} -./integrate/amazon-bedrock/set-up-redis.md: {{Use the AWS Marketplace dialog to map your Redis Cloud account to your AWS Marketplace account.}} -./integrate/amazon-bedrock/set-up-redis.md: {{The AWS Marketplace badge appears when your Redis Cloud account is mapped to an AWS Marketplace account.}} -./integrate/amazon-bedrock/set-up-redis.md: {{The New subscriptions button in the admin console menu.}} -./integrate/amazon-bedrock/set-up-redis.md: {{Available subscription plans; Flexible plan is selected.}} -./integrate/amazon-bedrock/set-up-redis.md: {{The General settings of the Setup tab.}} -./integrate/amazon-bedrock/set-up-redis.md: {{Version selection between Redis 6.2 and 7.2}} -./integrate/amazon-bedrock/set-up-redis.md: {{The Multi-AZ toggle set to on.}} -./integrate/amazon-bedrock/set-up-redis.md: {{The Deployment CIDR field.}} -./integrate/amazon-bedrock/set-up-redis.md: {{Select the Continue button to continue to the next step.}} -./integrate/amazon-bedrock/set-up-redis.md: {{The Sizing tab when creating a new Flexible subscription.}} -./integrate/amazon-bedrock/set-up-redis.md: {{Use the Add button to define a new database for your subscription.}} -./integrate/amazon-bedrock/set-up-redis.md: {{The New Database dialog with basic settings.}} -./integrate/amazon-bedrock/set-up-redis.md: {{Select the Save Database button to define your new database.}} -./integrate/amazon-bedrock/set-up-redis.md: {{Select Create subscription to create your new subscription.}} -./integrate/amazon-bedrock/set-up-redis.md: {{The Edit database button lets you change selected database properties.}} -./integrate/amazon-bedrock/set-up-redis.md: {{Use the Transport Layer Security toggle to enable TLS.}} -./integrate/amazon-bedrock/set-up-redis.md: {{Use the Download server certificate button to download the Redis Cloud CA certificates.}} -./integrate/amazon-bedrock/set-up-redis.md: {{The Add client certificate button.}} -./integrate/amazon-bedrock/set-up-redis.md: {{Provide or generate a certificate for Mutual TLS.}} -./integrate/amazon-bedrock/set-up-redis.md: {{The Download certificate button.}} -./integrate/amazon-bedrock/set-up-redis.md: {{The Download certificate button.}} -./integrate/amazon-bedrock/set-up-redis.md: {{Use the Save database button to save database changes.}} -./integrate/amazon-bedrock/set-up-redis.md: {{The RedisInsight Add CA Certificate section.}} -./integrate/amazon-bedrock/set-up-redis.md: {{The RedisInsight Add Client Certificate section.}} -./integrate/amazon-bedrock/set-up-redis.md: {{The RedisInsight workbench icon.}} -./integrate/amazon-bedrock/set-up-redis.md: {{The RedisInsight run button.}} -./integrate/amazon-bedrock/create-knowledge-base.md: {{The Create knowledge base button.}} -./integrate/amazon-bedrock/create-knowledge-base.md: {{The Redis Cloud selection for your vector database.}} -./integrate/amazon-bedrock/create-knowledge-base.md: {{The Create knowledge base button.}} -./integrate/amazon-bedrock/create-knowledge-base.md:{{A Bedrock knowledge base with a Ready status.}} -./integrate/amazon-bedrock/create-knowledge-base.md:{{A Bedrock data source with a Ready status.}} -./integrate/amazon-bedrock/create-agent.md: {{The Create Agent button.}} -./integrate/amazon-bedrock/create-agent.md: {{The Add another knowledge base button.}} -./integrate/amazon-bedrock/create-agent.md: {{The Create Agent button.}} -./integrate/amazon-bedrock/create-agent.md:{{A Bedrock agent with a Ready status.}} -./operate/rs/databases/active-active/manage.md:{{Select switch to legacy admin console from the dropdown.}} -./operate/rs/databases/active-active/create.md: {{Select switch to legacy admin console from the dropdown.}} -./operate/rs/databases/active-active/get-started.md: {{Select switch to legacy admin console from the dropdown.}} -./operate/rs/databases/configure/oss-cluster-api.md: {{Use the *OSS Cluster API* setting to enable the API for the selected database.}} -./operate/rs/databases/import-export/flush.md: {{Select switch to legacy admin console from the dropdown.}} -./operate/rs/databases/import-export/migrate-to-active-active.md:{{Active-Active data migration process}} -./operate/rs/databases/import-export/migrate-to-active-active.md: {{Select switch to legacy admin console from the dropdown.}} -./operate/rs/databases/import-export/migrate-to-active-active.md:{{disable migration using replica of}} -./operate/rs/databases/import-export/replica-of/create.md: {{Copy the Replica Of source URL from the Connection link to destination dialog.}} -./operate/rs/databases/import-export/replica-of/create.md: {{Syncer certificate for Replica Of and Active-Active authentication.}} -./operate/rs/databases/auto-tiering/quickstart.md: {{Create a quick database with Runs on Flash selected.}} -./operate/rs/databases/connect/test-client-connectivity.md: {{View public and private endpoints from the General section of the database's Configuration screen.}} -./operate/rs/databases/connect/_index.md:{{View public and private endpoints from the General section of the database's Configuration screen.}} -./operate/rs/security/encryption/internode-encryption.md:{{A diagram showing the interaction between data plane encryption, control plane encryption, and various elements of a cluster.}} -./operate/rs/security/encryption/tls/enable-tls.md: {{Mutual TLS authentication configuration.}} -./operate/rs/security/encryption/tls/enable-tls.md: {{An example that shows adding a certificate validation with multiple organizational units.}} -./operate/rs/security/encryption/tls/enable-tls.md: {{Select switch to legacy admin console from the dropdown.}} -./operate/rs/security/access-control/manage-users/add-users.md: {{Add role with name}} -./operate/rs/security/access-control/manage-users/add-users.md: {{Add role with name}} -./operate/rs/security/access-control/manage-users/add-users.md: {{Add role with name}} -./operate/rs/security/access-control/manage-users/login-lockout.md: {{The Lockout threshold configuration section}} -./operate/rs/security/access-control/manage-users/default-user.md:{{Select Password-only authentication to require a password to access the database.}} -./operate/rs/security/access-control/manage-users/default-user.md: {{Select Using ACL only to deactivate default user access to the database.}} -./operate/rs/security/access-control/rbac/create-roles.md: {{Add role with name}} -./operate/rs/security/access-control/rbac/create-roles.md: {{Add role with name}} -./operate/rs/security/access-control/rbac/create-roles.md: {{Add role database acl}} -./operate/rs/security/access-control/rbac/create-roles.md: {{Add databases to access}} -./operate/rs/security/access-control/rbac/create-roles.md: {{Add databases to access}} -./operate/rs/security/access-control/ldap/update-database-acls.md: {{Updating a database access control list (ACL)}} -./operate/rs/security/access-control/ldap/enable-role-based-ldap.md: {{The LDAP configuration screen in the Cluster Manager UI}} -./operate/rs/security/access-control/ldap/map-ldap-groups-to-roles.md: {{Enable LDAP mappings Panel}} -./operate/rs/security/access-control/ldap/map-ldap-groups-to-roles.md: {{Enable LDAP mappings Panel}} -./operate/rs/security/access-control/ldap/_index.md:{{LDAP overview}} -./operate/rs/security/access-control/ldap/_index.md: {{Enable LDAP Panel}} -./operate/rs/networking/private-public-endpoints.md: {{The endpoint support setting appears in the **Configuration section** of the **Cluster** setup screen.}} -./operate/rs/networking/private-public-endpoints.md:{{View public and private endpoints from the General section of the database's Configuration screen.}} -./operate/rs/clusters/configure/rack-zone-awareness.md: {{Select the Rack-zone awareness checkbox to enable rack-zone awareness for the database.}} -./operate/rs/clusters/remove-node.md: {{Select switch to legacy admin console from the dropdown.}} -./operate/rs/clusters/logging/_index.md:{{Logs screen in the new Cluster Manager UI.}} -./operate/rs/release-notes/rs-7-2-4-releases/rs-7-2-4-52.md:{{Select switch to legacy admin console from the dropdown.}} -./operate/rs/installing-upgrading/creating-support-package.md: {{Select Support and create a support package.}} -./operate/rc/databases/monitor-performance.md:{{The Metrics tab of the View Database screen.}} -./operate/rc/databases/monitor-performance.md:{{The Metrics tab of the View Database screen.}} -./operate/rc/databases/monitor-performance.md:{{Promoting graphs to primary positions}} -./operate/rc/databases/create-database.md: {{The Databases tab summarizes databases created for a given subscription.}} -./operate/rc/databases/create-database.md: {{The New Database button creates a new database for your subscription.}} -./operate/rc/databases/create-database.md:{{Use the New Database screen to create a new database for your subscription.}} -./operate/rc/databases/create-database.md:{{Use the Activate database button to create and activate your database.}} -./operate/rc/databases/create-database.md:{{For Fixed and Free subscriptions, the Type setting in the General section includes an option for Redis Stack.}} -./operate/rc/databases/create-database.md:{{For Fixed and Free subscriptions, the Database details page lists the capabilities and versions added by Redis Stack.}} -./operate/rc/databases/create-database.md:{{For Flexible and Annual subscriptions, you can select the capabilites included in your database.}} -./operate/rc/databases/create-database.md:{{To remove a selected capability, clear the checkbox in the menu.}} {{You can also use the delete icon to remove a capability.}} -./operate/rc/databases/create-database.md:{{Use the Scalability section to control the size, throughput, and hashing policy for a database.}} -./operate/rc/databases/create-database.md:{{Use the Durability settings to keep your database (and data) available when problems occur.}} -./operate/rc/databases/create-database.md:{{Use the Tag settings to add tags to the database.}} -./operate/rc/databases/create-database.md:{{Use the Security settings to control access to your database.}} -./operate/rc/databases/create-database.md:{{The Alerts section defines the notification emails and their triggering conditions.}} -./operate/rc/databases/delete-database.md: {{The Databases tab summarizes databases created for a given subscription.}} -./operate/rc/databases/delete-database.md: {{The Configuration tab of the Database details screen.}} -./operate/rc/databases/delete-database.md: {{The Danger Zone of the Database details screen.}} -./operate/rc/databases/delete-database.md: {{The Delete button is located in the Danger zone section of the database Configuration tab.}} -./operate/rc/databases/delete-database.md: {{A different delete database confirmation dialog asks you to consider deleting the subscription as well.}} -./operate/rc/databases/delete-database.md: {{The Delete database button is located in the Danger zone section of the database Configuration tab.}} {{The Delete both button is located in the Danger zone section of the database Configuration tab.}} -./operate/rc/databases/view-edit-database.md: {{The Configuration tab of the Database details screen.}} -./operate/rc/databases/view-edit-database.md:{{Use the Scalability section to control the size, throughput, and hashing policy for a database.}} -./operate/rc/databases/view-edit-database.md:{{Use the Durability  section to protect your data from unexpected problems.}} -./operate/rc/databases/view-edit-database.md:{{Use the Security settings to control access to your database.}} -./operate/rc/databases/view-edit-database.md:{{The Alerts section defines the notification emails and their triggering conditions.}} -./operate/rc/databases/view-edit-database.md:{{The Danger Zone includes activities that impact data, such as deleting a database.  Use with care.}} -./operate/rc/databases/view-edit-database.md: {{The Import data dialog helps you import data into a database.}} -./operate/rc/databases/view-edit-database.md: {{Use the search bar to filter the list.}} -./operate/rc/databases/view-edit-database.md: {{Use the filter toggle to display filter options.}} -./operate/rc/databases/view-edit-database.md: {{Use the filter toggle to display filter options.}} -./operate/rc/databases/view-edit-database.md: {{Use the arrows in the list header to sort the list.}} {{The direction of the arrow corresponds to the direction of the sort.}} -./operate/rc/databases/view-edit-database.md:{{The Edit database button lets you change selected database properties.}} -./operate/rc/databases/view-edit-database.md:{{Use the Save database button to save database changes.}} -./operate/rc/databases/back-up-data.md: {{The Databases tab summarizes databases created for a given subscription.}} -./operate/rc/databases/back-up-data.md: {{The Configuration tab of the Database details screen.}} -./operate/rc/databases/back-up-data.md: {{The Remote backup setting is located in the Durability section of the Configuration tab of the database details screen.}} -./operate/rc/databases/back-up-data.md:{{Backup settings appear when you enable the Remote backup settings.}} -./operate/rc/databases/back-up-data.md:{{Use the Backup Now button to make backups on demand.}} -./operate/rc/databases/flush-data.md: {{You can use RedisInsight to issue commands to a database.}} -./operate/rc/databases/tag-database.md:{{The Configuration tab of the Database details screen.}} -./operate/rc/databases/tag-database.md:{{The Manage tags button.}} -./operate/rc/databases/tag-database.md:{{The database list with databases that are tagged.}} -./operate/rc/databases/tag-database.md:{{Manage tags button.}} -./operate/rc/databases/tag-database.md:{{More actions button.}} -./operate/rc/databases/tag-database.md:{{The tag manager.}} -./operate/rc/databases/tag-database.md:{{The Save tags button.}} -./operate/rc/databases/migrate-databases.md: {{Select the source database from the database list.}} -./operate/rc/databases/migrate-databases.md: {{The Copy button copies the public endpoint details to the Clipboard.}} -./operate/rc/databases/migrate-databases.md: {{Use the database list drop-down to select the target database.}} -./operate/rc/databases/migrate-databases.md: {{Use the **Edit Database** button to change the configuration of the target database.}} -./operate/rc/databases/migrate-databases.md: {{Active-Passive settings are located in the **Durability** section of the database **Configuration** tab.}} -./operate/rc/databases/migrate-databases.md: {{Use the **Add URI** button to specify the source of the Active-Passive replica.}} -./operate/rc/databases/migrate-databases.md: {{The source URI must be specified using the 'redis://' protocol.}} -./operate/rc/databases/migrate-databases.md: {{The **Save** button verifies the Source URI and you can't save until it validates.}} -./operate/rc/databases/migrate-databases.md: {{Use the **Save Database** button to save your changes, deploy the database, and to start data migration.}} -./operate/rc/databases/migrate-databases.md: {{When the status is 'Pending', your changes are still being deployed.}} -./operate/rc/databases/migrate-databases.md: {{When the status becomes 'Active', data begins to sync.}} -./operate/rc/databases/migrate-databases.md: {{When the data is migrated, the target database status displays `Synced`.}} -./operate/rc/cloud-integrations/aws-marketplace/_index.md: {{The Redis Cloud - Flexible plan listing on AWS Marketplace}} -./operate/rc/cloud-integrations/aws-marketplace/_index.md: {{Use the Set Up Your Account button after subscribing to Redis Cloud with your AWS Marketplace account.}} -./operate/rc/cloud-integrations/aws-marketplace/_index.md: {{Use the AWS Marketplace dialog to map your Redis Cloud account to your AWS Marketplace account.}} -./operate/rc/cloud-integrations/aws-marketplace/_index.md: {{The AWS Marketplace badge appears when your Redis Cloud account is mapped to an AWS Marketplace account.}} -./operate/rc/cloud-integrations/aws-marketplace/_index.md:{{The AWS Marketplace billing confirmation.}} -./operate/rc/cloud-integrations/gcp-marketplace/_index.md: {{The Redis Cloud - Pay as You Go plan listing on Google Cloud Marketplace}} -./operate/rc/cloud-integrations/gcp-marketplace/_index.md: {{Use the GCP Marketplace dialog to map your Redis Cloud account to your Google Cloud Marketplace account.}} -./operate/rc/cloud-integrations/gcp-marketplace/_index.md: {{The Google Cloud Marketplace badge appears when your Redis Cloud account is mapped to a Google Cloud Marketplace account.}} -./operate/rc/cloud-integrations/gcp-marketplace/_index.md: {{The Manage on Provider button}} -./operate/rc/cloud-integrations/aws-cloud-accounts/_index.md: {{Use the Cloud Account tab of the Account Settings screen to define cloud accounts for your Redis Cloud subscription.}} -./operate/rc/cloud-integrations/aws-cloud-accounts/_index.md:{{Use the Add button to add new cloud accounts to your Redis Cloud subscription.}} -./operate/rc/cloud-integrations/aws-cloud-accounts/_index.md:{{Use the Add cloud account prompt to enter the details of the cloud account.}} -./operate/rc/cloud-integrations/aws-cloud-accounts/_index.md:{{Use the Add account button to save the details of your new cloud account.}} -./operate/rc/cloud-integrations/aws-cloud-accounts/_index.md:{{When errors occur, the field is highlighted in red and a notification icon appears.  The icon tooltip describes the problem.}} -./operate/rc/cloud-integrations/aws-cloud-accounts/_index.md:{{Use the Edit button to update cloud account details.}} -./operate/rc/cloud-integrations/aws-cloud-accounts/_index.md:{{Use the Edit cloud account prompt to update the details of the cloud account.}} -./operate/rc/cloud-integrations/aws-cloud-accounts/_index.md:{{Use the Update account button to save the updated cloud account details.}} -./operate/rc/cloud-integrations/aws-cloud-accounts/_index.md:{{Use the Delete button to remove cloud account details.}} -./operate/rc/rc-quickstart.md: {{Dialog to create your free subscription.}} -./operate/rc/rc-quickstart.md: {{Dialog to create your free subscription.}} -./operate/rc/rc-quickstart.md: {{Overview tab showing your new subscription and database.}} -./operate/rc/rc-quickstart.md: {{Configuration tab showing details of your new database.}} -./operate/rc/rc-quickstart.md:{{The Security section of the Configuration tab of the database details page.}} -./operate/rc/rc-quickstart.md:{{The connection wizard.}} -./operate/rc/rc-quickstart.md:{{The connection wizard clients.}} -./operate/rc/security/private-service-connect.md: {{Use the Create connection button to configure a new PSC endpoint.}} -./operate/rc/security/private-service-connect.md: {{Use the Accept and continue button to acknowledge PSC's impact on latency and cost.}} -./operate/rc/security/private-service-connect.md: {{Use the Continue button to proceed to the Add connections step.}} -./operate/rc/security/private-service-connect.md: {{Use the Download or Copy buttons to save the gcloud script for later use.}} -./operate/rc/security/private-service-connect.md: {{Use the Continue button to save the PSC endpoint configuration.}} -./operate/rc/security/private-service-connect.md: {{Use the Complete setup button if you need access to the gcloud script again.}} -./operate/rc/security/private-service-connect.md: {{Use the Accept button to finish PSC endpoint setup.}} -./operate/rc/security/private-service-connect.md: {{Use the Connect button to retrieve PSC connection details.}} -./operate/rc/security/private-service-connect.md: {{Use the Delete PSC endpoint button to remove an endpoint.}} -./operate/rc/security/private-service-connect.md: {{Use the Toggle actions button to see a list of actions.}} -./operate/rc/security/private-service-connect.md: {{Use the Confirm button to deactivate Private Service Connect.}} -./operate/rc/security/database-security/tls-ssl.md: {{The Edit database button lets you change selected database properties.}} -./operate/rc/security/database-security/tls-ssl.md: {{Use the Transport Layer Security toggle to enable TLS.}} -./operate/rc/security/database-security/tls-ssl.md: {{Use the Download server certificate button to download the Redis Cloud CA certificates.}} -./operate/rc/security/database-security/tls-ssl.md: {{The Add client certificate button.}} -./operate/rc/security/database-security/tls-ssl.md: {{Provide or generate a certificate for Mutual TLS.}} -./operate/rc/security/database-security/tls-ssl.md: {{The Download certificate button.}} -./operate/rc/security/database-security/tls-ssl.md: {{The Download certificate button.}} -./operate/rc/security/database-security/tls-ssl.md: {{The Add client certificate button.}} -./operate/rc/security/database-security/tls-ssl.md: {{Use the Save database button to save database changes.}} -./operate/rc/security/database-security/tls-ssl.md: {{Use the Download button to download the Redis Cloud CA certificates.}} -./operate/rc/security/database-security/tls-ssl.md: {{Use the Download server certificate button to download the Redis Cloud CA certificates.}} -./operate/rc/security/vpc-peering.md: {{Select the Add CIDR button to add another VPC CIDR.}} -./operate/rc/security/vpc-peering.md: {{View VPC peering list.}} -./operate/rc/security/vpc-peering.md:{{Modify Route Table.}} -./operate/rc/security/vpc-peering.md: {{The Initiate peering button creates a VPC peering request.}} -./operate/rc/security/vpc-peering.md: {{View VPC peering list.}} -./operate/rc/security/access-control/data-access-control/role-based-access-control.md:{{Data access control screen.}} -./operate/rc/security/access-control/data-access-control/role-based-access-control.md:{{Data access control screen.}} -./operate/rc/security/access-control/data-access-control/role-based-access-control.md:{{Data access control screen.}} -./operate/rc/security/access-control/data-access-control/configure-acls.md: {{Menu for database access control.}} -./operate/rc/security/access-control/data-access-control/configure-acls.md: {{Redis ACLs area.}} -./operate/rc/security/access-control/data-access-control/configure-acls.md: {{Add or Update Redis ACL.}} -./operate/rc/security/access-control/data-access-control/configure-acls.md: {{Add Redis ACL.}} -./operate/rc/security/access-control/data-access-control/configure-acls.md: {{Saved Redis ACL.}} -./operate/rc/security/access-control/data-access-control/create-roles.md: {{Menu for database access control.}} -./operate/rc/security/access-control/data-access-control/create-roles.md: {{Role configuration area.}} -./operate/rc/security/access-control/data-access-control/create-roles.md: {{Add or edit a role.}} -./operate/rc/security/access-control/data-access-control/create-roles.md: {{Role add screen.}} -./operate/rc/security/access-control/data-access-control/create-roles.md: {{Select an ACL Rule.}} -./operate/rc/security/access-control/data-access-control/create-roles.md: {{Select an databases.}} -./operate/rc/security/access-control/data-access-control/create-assign-users.md: {{Menu for database access control.}} -./operate/rc/security/access-control/data-access-control/create-assign-users.md: {{User configuration area.}} -./operate/rc/security/access-control/data-access-control/create-assign-users.md: {{User add or edit.}} -./operate/rc/security/access-control/data-access-control/create-assign-users.md: {{User add username.}} -./operate/rc/security/access-control/data-access-control/create-assign-users.md: {{User select role.}} -./operate/rc/security/access-control/data-access-control/create-assign-users.md: {{User add password and finish.}} -./operate/rc/security/access-control/data-access-control/create-assign-users.md: {{Menu for database access control.}} -./operate/rc/security/access-control/data-access-control/create-assign-users.md: {{User configuration area.}} -./operate/rc/security/access-control/data-access-control/create-assign-users.md: {{User add or edit.}} -./operate/rc/security/access-control/data-access-control/create-assign-users.md: {{User select role.}} -./operate/rc/security/access-control/data-access-control/create-assign-users.md: {{User add password and finish.}} -./operate/rc/security/access-control/data-access-control/active-active-roles.md: {{List of subscriptions. Active-Active subscriptions are marked with a globe icon.}} -./operate/rc/security/access-control/data-access-control/active-active-roles.md: {{Assign different ACL rules for different regions.}} -./operate/rc/security/access-control/data-access-control/default-user.md:{{The Default user password appears in the Security section of the Configuration tab on the database details screen.}} -./operate/rc/security/access-control/data-access-control/default-user.md:{{Use the Copy button to copy the default user password.}} -./operate/rc/security/access-control/data-access-control/default-user.md: {{The Edit database button lets you change the database's default user password.}} -./operate/rc/security/access-control/data-access-control/default-user.md: {{Use the Save database button to save the new password.}} -./operate/rc/security/access-control/data-access-control/default-user.md: {{The Edit database button lets you change the database's default user password.}} -./operate/rc/security/access-control/data-access-control/default-user.md: {{Use the Save database button to save the new password.}} -./operate/rc/security/access-control/multi-factor-authentication.md: {{Use the user drop down menu to get to the User Profile section.}} -./operate/rc/security/access-control/multi-factor-authentication.md: {{Multi-factor authentication is located on the user profile page.}} -./operate/rc/security/access-control/multi-factor-authentication.md: {{Multi-factor authentication toggle for all users on.}} -./operate/rc/security/access-control/access-management.md:{{The Access management tab helps you manage the people allowed to access your subscription.}} -./operate/rc/security/access-control/access-management.md:| {{Use the Add button to add members to your team.}} | The **Add** button lets you add members to your team | -./operate/rc/security/access-control/access-management.md:| {{Use the Edit button change details for a team member.}} | The **Edit** button lets you edit the settings for the selected team member | -./operate/rc/security/access-control/access-management.md:| {{Use the Delete button to remove a member from your team.}} | The **Delete** button lets you remove members from your team -./operate/rc/security/access-control/access-management.md:| {{Use the Filter button to display team members that match specified conditions.}} | **Filter** icons let you display team members matching conditions you specify | -./operate/rc/security/access-control/access-management.md:| {{The Sort ascending button displays members in ascending order according to the values of the selected field.}}{{The Sort descending button displays members in descending order according to the values of the selected field.}} | The **Sort ascending** and **Sort descending** icons display the list according to the selected order | -./operate/rc/security/access-control/access-management.md:{{Use the Add User dialog to specify the details for your new user.}} -./operate/rc/security/access-control/access-management.md:{{Use the Edit User dialog to change the details for a user}} -./operate/rc/security/access-control/access-management.md:{{Confirm that you want to remove a user from your team}} -./operate/rc/security/access-control/saml-sso/saml-integration-auth0.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-auth0.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-auth0.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-auth0.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-auth0.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-auth0.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-auth0.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-auth0.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-auth0.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-auth0.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-auth0.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-auth0.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-auth0.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-auth0.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-auth0.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-auth0.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-auth0.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-auth0.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-ping-identity.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-ping-identity.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-ping-identity.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-ping-identity.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-ping-identity.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-ping-identity.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-ping-identity.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-ping-identity.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-ping-identity.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-ping-identity.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-ping-identity.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-ping-identity.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-ping-identity.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-ping-identity.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-ping-identity.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-ping-identity.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-ping-identity.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-ping-identity.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-ping-identity.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-ping-identity.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-ping-identity.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-ping-identity.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-ping-identity.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-ping-identity.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-ping-identity.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md:{{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md:{{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md:{{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md:{{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md:{{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md:{{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md:{{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-generic.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-azure-ad.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-azure-ad.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-azure-ad.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-azure-ad.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-azure-ad.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-azure-ad.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-azure-ad.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-azure-ad.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-azure-ad.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-azure-ad.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-azure-ad.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-azure-ad.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-azure-ad.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-azure-ad.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-azure-ad.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-azure-ad.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-azure-ad.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-azure-ad.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-azure-ad.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-azure-ad.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-azure-ad.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-azure-ad.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-azure-ad.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-azure-ad.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-azure-ad.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-azure-ad.md:{{}} -./operate/rc/security/access-control/saml-sso/saml-integration-azure-ad.md:{{}} -./operate/rc/security/access-control/saml-sso/saml-integration-azure-ad.md:{{}} -./operate/rc/security/access-control/saml-sso/saml-integration-azure-ad.md:{{}} -./operate/rc/security/access-control/saml-sso/saml-integration-azure-ad.md:{{}} -./operate/rc/security/access-control/saml-sso/saml-integration-aws-identity-center.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-aws-identity-center.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-aws-identity-center.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-aws-identity-center.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-aws-identity-center.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-aws-identity-center.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-aws-identity-center.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-aws-identity-center.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-aws-identity-center.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-aws-identity-center.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-aws-identity-center.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-aws-identity-center.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-aws-identity-center.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-aws-identity-center.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-aws-identity-center.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-aws-identity-center.md:{{}} -./operate/rc/security/access-control/saml-sso/saml-integration-aws-identity-center.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-aws-identity-center.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-aws-identity-center.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-aws-identity-center.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-aws-identity-center.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{Use the Okta admin console to locate the Org2Org application template.}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{Data transformaiton Pipeline}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{Use the Okta admin console to locate the Org2Org application template.}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{Use the Okta admin console to locate the Org2Org application template.}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{Use the Okta admin console to locate the Org2Org application template.}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{Use the Okta admin console to locate the Org2Org application template.}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{Use the Okta admin console to locate the Org2Org application template.}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{Use the Okta admin console to locate the Org2Org application template.}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{Use the Okta admin console to locate the Org2Org application template.}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{Use the Okta admin console to locate the Org2Org application template.}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{Use the Okta admin console to locate the Org2Org application template.}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{Use the Okta admin console to locate the Org2Org application template.}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{Use the Okta admin console to locate the Org2Org application template.}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{Use the Okta admin console to locate the Org2Org application template.}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{Use the Okta admin console to locate the Org2Org application template.}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{Use the Okta admin console to locate the Org2Org application template.}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{Use the Okta admin console to locate the Org2Org application template.}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{Use the Okta admin console to locate the Org2Org application template.}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{Use the Okta admin console to locate the Org2Org application template.}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{Use the Okta admin console to locate the Org2Org application template.}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{Use the Okta admin console to locate the Org2Org application template.}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md:{{Use the Okta admin console to locate the Org2Org application template.}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md:{{Use the Okta admin console to locate the Org2Org application template.}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md:{{Use the Okta admin console to locate the Org2Org application template.}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md:{{Use the Okta admin console to locate the Org2Org application template.}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md:{{Use the Okta admin console to locate the Org2Org application template.}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md:{{Use the Okta admin console to locate the Org2Org application template.}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md:{{Use the Okta admin console to locate the Org2Org application template.}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{Use the Okta admin console to locate the Org2Org application template.}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-okta-org2org.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-google.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-google.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-google.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-google.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-google.md:{{}} -./operate/rc/security/access-control/saml-sso/saml-integration-google.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-google.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-google.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-google.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-google.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-google.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-google.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-google.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-google.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-google.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-google.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-google.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-google.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-google.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-google.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-google.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-google.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-google.md: {{}} -./operate/rc/security/access-control/saml-sso/saml-integration-google.md:{{}} -./operate/rc/security/access-control/saml-sso/_index.md: {{Sign in with SSO button}} -./operate/rc/security/access-control/saml-sso/_index.md: {{Setup SSO button}} -./operate/rc/security/access-control/saml-sso/_index.md: {{SAML Single Sign-On configuration screen.}} -./operate/rc/security/access-control/saml-sso/_index.md: {{Get Token popup}} -./operate/rc/security/access-control/saml-sso/_index.md: {{The Link Account button}} -./operate/rc/security/access-control/saml-sso/_index.md: {{The Convert users popup}} -./operate/rc/security/cidr-whitelist.md: {{Add the first IP address to the CIDR allow list.}} -./operate/rc/security/cidr-whitelist.md: {{Add a new IP address to the CIDR allow list.}} -./operate/rc/security/cidr-whitelist.md: {{Select the type of entry to add to the allow list from the Type list.}} -./operate/rc/security/cidr-whitelist.md: {{Define the new entry and select the Submit entry button to add it to the allow list.}} -./operate/rc/security/aws-transit-gateway.md: {{The Share Transit Gateway section.}} -./operate/rc/security/aws-transit-gateway.md: {{The AWS Add principal field.}} -./operate/rc/security/aws-transit-gateway.md: {{The Share Transit Gateway section.}} -./operate/rc/security/aws-transit-gateway.md: {{The Share Transit Gateway section.}} -./operate/rc/security/aws-transit-gateway.md: {{The Accept resource shares section.}} -./operate/rc/security/aws-transit-gateway.md: {{The Create attachment button.}} -./operate/rc/security/aws-transit-gateway.md: {{The Add CIDRs button.}} -./operate/rc/security/aws-transit-gateway.md: {{The Add button for adding additional CIDRs.}} -./operate/rc/security/aws-transit-gateway.md: {{The More actions menu.}} -./operate/rc/security/aws-transit-gateway.md: {{The Producer deployment CIDRs in the Attachment settings. }} -./operate/rc/subscriptions/create-fixed-subscription.md: {{The New subscriptions button in the admin console menu.}} -./operate/rc/subscriptions/create-fixed-subscription.md: {{Available subscription plan options.}} -./operate/rc/subscriptions/create-fixed-subscription.md: {{Available cloud vendor options and Redis 7.2 regions.}} -./operate/rc/subscriptions/create-fixed-subscription.md: {{Turn on the Redis 7.2 regions toggle.}} -./operate/rc/subscriptions/create-fixed-subscription.md: {{Available tiers for Fixed size subscription plans.}} -./operate/rc/subscriptions/create-fixed-subscription.md: {{The Create Subscription button.}} -./operate/rc/subscriptions/create-fixed-subscription.md: {{The Add credit card icon.}} -./operate/rc/subscriptions/create-fixed-subscription.md:{{The Subscription details screen with no databases.}} -./operate/rc/subscriptions/create-flexible-subscription.md: {{The New subscriptions button in the admin console menu.}} -./operate/rc/subscriptions/create-flexible-subscription.md: {{Available subscription plans; Flexible plan is selected.}} -./operate/rc/subscriptions/create-flexible-subscription.md:{{The Setup tab of the new Fixed subscription process.}} -./operate/rc/subscriptions/create-flexible-subscription.md:{{The General settings of the Setup tab.}} -./operate/rc/subscriptions/create-flexible-subscription.md:{{Version selection between Redis 6.2 and 7.2}} -./operate/rc/subscriptions/create-flexible-subscription.md:{{The Advanced settings of the Setup tab.}} -./operate/rc/subscriptions/create-flexible-subscription.md:{{Select one availability zone when Multi-AZ is turned off.}} -./operate/rc/subscriptions/create-flexible-subscription.md:{{For hosted AWS clusters, select availability zone IDs from the Zone IDs list.}} -./operate/rc/subscriptions/create-flexible-subscription.md:{{Select Manual selection to select three availability zones when Multi-AZ is enabled.}} -./operate/rc/subscriptions/create-flexible-subscription.md:{{Select the Continue button to continue to the next step.}} -./operate/rc/subscriptions/create-flexible-subscription.md:{{The Sizing tab when creating a new Flexible subscription.}} -./operate/rc/subscriptions/create-flexible-subscription.md:{{Use the Add button to define a new database for your subscription.}} -./operate/rc/subscriptions/create-flexible-subscription.md:{{The New Database dialog with basic settings.}} -./operate/rc/subscriptions/create-flexible-subscription.md:{{The New Database dialog with advanced settings.}} -./operate/rc/subscriptions/create-flexible-subscription.md:{{Select the Save Database button to define your new database.}} -./operate/rc/subscriptions/create-flexible-subscription.md:{{Use the Edit button to change database settings.}} {{Use the Delete button to remove a database.}} -./operate/rc/subscriptions/create-flexible-subscription.md:{{The Review & Create tab of the New Flexible subscription screen.}} -./operate/rc/subscriptions/create-flexible-subscription.md:{{Select Create subscription to create your new subscription.}} -./operate/rc/subscriptions/view-flexible-subscription.md: {{The Subscription list shows your current subscriptions.}} -./operate/rc/subscriptions/view-flexible-subscription.md: {{The Databases tab of the subscription details page is the default view.}} -./operate/rc/subscriptions/view-flexible-subscription.md: {{Use the **New database** button to create a new database for your subscription.}} -./operate/rc/subscriptions/view-flexible-subscription.md: {{When a subscription is active, the status icon displays a green circle with a checkmark.}}   {{When a subscription is pending, the status icon displays a gre, animated circle.}} -./operate/rc/subscriptions/view-flexible-subscription.md:{{The Databases tab of the subscription details page is the default view.}} -./operate/rc/subscriptions/view-flexible-subscription.md:| **Status** | An icon indicating whether the database is active (a green circle) or pending (yellow circle)
{{Active status is indicated by a teal circle.}} {{Pending status is indicated by a yellow circle.}} | -./operate/rc/subscriptions/view-flexible-subscription.md:{{The Overview tab displays the settings used to create your Flexible subscription.}} -./operate/rc/subscriptions/view-flexible-subscription.md: {{Use the **Edit** button to change the subscription name.}} -./operate/rc/subscriptions/view-flexible-subscription.md:{{The Connectivity tab helps you secure your subscription.}} -./operate/rc/subscriptions/delete-subscription.md: {{The number of databases is shown in the bottom, left of the subscription in the subscription list.}} -./operate/rc/subscriptions/delete-subscription.md: {{The Overview tab displays the details of your Fixed subscription.}} -./operate/rc/subscriptions/delete-subscription.md: {{Use the Delete subscription button to delete your subscription plan.}} -./operate/rc/subscriptions/delete-subscription.md: {{Select the Yes, cancel button to confirm the subscription cancellation.}} -./operate/rc/subscriptions/maintenance/set-maintenance-windows.md: {{The set maintenance windows panel}} -./operate/rc/subscriptions/create-active-active-subscription.md:{{When you enable Active-Actve, you need to specify the regions for each database instance.}} -./operate/rc/subscriptions/create-active-active-subscription.md:{{Use the Region drop-down to select the regions for your Active-Active database.}} -./operate/rc/subscriptions/create-active-active-subscription.md:{{Select the Delete button to remove a region from the list.}} -./operate/rc/subscriptions/create-active-active-subscription.md:{{Each region needs a unique CIDR address block to communicate securely with other instances.}} -./operate/rc/subscriptions/create-active-active-subscription.md:{{Greem chackmarks indicate valid CIDR address values.}} -./operate/rc/subscriptions/create-active-active-subscription.md:{{Red exclamation points indicate CIDR address problems.}} -./operate/rc/subscriptions/create-active-active-subscription.md:{{When you create an Active-Active database, you can select the JSON advanced capability.}} -./operate/rc/subscriptions/create-active-active-subscription.md:{{When you create an Active-Active database, you define throughput for each region.}} -./operate/rc/subscriptions/upgrade-fixed-flexible.md: {{The Edit database button lets you change selected database properties.}} -./operate/rc/subscriptions/upgrade-fixed-flexible.md: {{Use the Add Account's Path button to specify the source of the Active-Passive replica.}} -./operate/rc/subscriptions/upgrade-fixed-flexible.md: {{Select the Source database from the database list.}} -./operate/rc/subscriptions/upgrade-fixed-flexible.md: {{Use the **Save Database** button to save your changes, deploy the database, and to start data migration.}} -./operate/rc/subscriptions/upgrade-fixed-flexible.md: {{When the status is 'Pending', your changes are still being deployed.}} -./operate/rc/subscriptions/upgrade-fixed-flexible.md: {{When the status becomes 'Active', data begins to sync.}} -./operate/rc/subscriptions/upgrade-fixed-flexible.md: {{When the data is migrated, the target database status displays `Synced`.}} -./operate/rc/subscriptions/view-fixed-subscription.md: {{The Subscription list shows your current subscriptions.}} -./operate/rc/subscriptions/view-fixed-subscription.md: {{The Databases tab of the subscription details page is the default view.}} -./operate/rc/subscriptions/view-fixed-subscription.md: {{Select the Upgrade plan button to update your subscription settings.}} -./operate/rc/subscriptions/view-fixed-subscription.md:{{Use the Upgrade plan button to change selected Fixed subscription detils.}} -./operate/rc/subscriptions/view-fixed-subscription.md:{{Select the desired subscription tier from the ones shown.}} -./operate/rc/subscriptions/view-fixed-subscription.md:{{Use the High availability panel to set Fixed subscription replication settings.}} -./operate/rc/subscriptions/view-fixed-subscription.md:{{Use the Credit card drop-down to set your subscription payment method.}} -./operate/rc/subscriptions/view-fixed-subscription.md:{{Use the Upgrade plan button to save your subscription plan changes.}} -./operate/rc/subscriptions/view-fixed-subscription.md:{{The Overview tab displays the details of your Fixed subscription.}} -./operate/rc/subscriptions/view-fixed-subscription.md:{{Use the **Edit** button to change the subscription name.}} -./operate/rc/subscriptions/view-fixed-subscription.md:{{Use the Delete subscription button to delete your subscription plan.}} -./operate/rc/accounts/account-settings.md:{{Use the Account tab of the Account Settings screen to review and update settings associated with your Redis Cloud account.}} -./operate/rc/accounts/account-settings.md: {{Select the Edit button to change the account's billing address.}} -./operate/rc/accounts/account-settings.md: {{The Edit account billing address screen.}} -./operate/rc/accounts/account-settings.md:{{Use the Discard Changes and the Save Changes buttons to manage changes to account settings.}} -./operate/rc/accounts/user-profile.md:{{Use the Profile control to manage your user account profile and to switch between Redis Cloud accounts.}} -./operate/rc/accounts/user-profile.md:{{The User Profile screen lets you manage selected settings associated with your user account.}} -./operate/rc/accounts/user-profile.md:{{To switch between Redis Cloud accounts, select the desired account from the list shown on the Profile control.}} -./operate/rc/logs-reports/system-logs.md:{{Choose the Logs command from the Redis Cloud admin console menu to view your subscription system log.}} -./operate/rc/logs-reports/system-logs.md: {{Use the arrows in the list header to sort the list.}} {{The direction of the arrow corresponds to the direction of the sort.}} -./operate/rc/logs-reports/system-logs.md: {{Use the export all button in the top right to export all logs to a CSV file}} -./operate/rc/logs-reports/system-logs.md: {{Use the refresh button in the top right to refresh the system logs}} -./operate/rc/api/examples/audit-system-logs.md:{{Choose the Logs command from the Redis Cloud admin console menu to view your subscription system log.}} -./operate/rc/api/get-started/enable-the-api.md: {{Use the **API Keys** tab of the **Access Management** screen to manage your REST API keys.}} -./operate/rc/api/get-started/enable-the-api.md: {{Use the **Copy** button to copy the access key to the Clipboard.}} -./operate/rc/api/get-started/enable-the-api.md: {{Use the **Enable API** button to enable the REST API for your account.}} -./operate/rc/api/get-started/manage-api-keys.md: {{Use the **API Keys** tab of the **Access Management** screen to manage your REST API keys.}} -./operate/rc/api/get-started/manage-api-keys.md:{{Use the **Enable API** button to enable the REST API for your account.}} -./operate/rc/api/get-started/manage-api-keys.md:{{The **Show** button displays the account key.}}   {{The **Hide** button masks the account key.}} -./operate/rc/api/get-started/manage-api-keys.md:{{The **Copy** button copies the account key to the Clipboard.}} -./operate/rc/api/get-started/manage-api-keys.md:{{Use the **Add** button to begin creating a new user key.}} -./operate/rc/api/get-started/manage-api-keys.md:{{When you add a user key, you're prompted to specify the name of the key and the asscoiated user.}} -./operate/rc/api/get-started/manage-api-keys.md:{{Use the **Create** button to create the new user key.}} -./operate/rc/api/get-started/manage-api-keys.md:{{The **API user key** dialog lets you copy the value of the new key to the Clipboard.}}
-./operate/rc/api/get-started/manage-api-keys.md: {{The **Delete** button appears to the right of the selected user key.}}
-./operate/rc/api/get-started/manage-api-keys.md: {{Select the **Delete** button to begin deleting the selected user key.}} -./operate/rc/api/get-started/manage-api-keys.md: {{The **Delete** button appears to the right of the selected user key.}}
-./operate/rc/api/get-started/manage-api-keys.md: {{The **Manage** link appears to the right of the user name for the selected user key.}} -./operate/rc/api/get-started/manage-api-keys.md: {{Select the **Manage** link to define the **CIDR allow list** dialog.}} -./operate/rc/api/get-started/manage-api-keys.md: {{Use the **Save** button to save a CIDR allow list rule.}} -./operate/rc/api/get-started/manage-api-keys.md: {{Use the **Add Rule** button to add a new address to the CIDR allow list.}} -./operate/rc/api/get-started/manage-api-keys.md: {{Use the **Edit** button to change the address for a CIDR allow list rule.}}   {{Use the **Delete** button to remove an address from the CIDR allow list.}} -./operate/rc/billing-and-payments.md:{{The Billing & Payments screen shows billing transactions and manage payment methods.}} -./operate/rc/billing-and-payments.md: {{Use the Pay Now button to Pay your invoice in selected regions.}} -./operate/rc/billing-and-payments.md: {{The Payments Methods tab helps you manage payments for your subscriptions.}} -./operate/rc/billing-and-payments.md: {{The Credits tab lets you apply coupons to your account and shows credits that have already been applied.}} -./operate/rc/billing-and-payments.md: {{Use the download icon to download a PDF for the selected invoice.}} -./operate/rc/billing-and-payments.md: {{Select Add Credit Card to add a new payment method}} -./operate/rc/billing-and-payments.md: {{Deactivate the Use account address slider to specify a different billing address.}} -./operate/rc/billing-and-payments.md: {{Use the Save Card button to save new payment details.}} -./operate/rc/billing-and-payments.md: {{The Credit card options menu on the upper-right hand corner of the payment method.}} -./operate/rc/billing-and-payments.md: {{The Edit account billing address screen.}} -./operate/rc/billing-and-payments.md: {{The Edit account billing address screen.}} -./operate/rc/billing-and-payments.md: {{The Credit card options menu on the upper-right hand corner of the payment method.}} -./operate/rc/billing-and-payments.md: {{The Edit mailing address screen.}} -./operate/rc/billing-and-payments.md: {{Use the Apply button to redeem a coupon.}} -./operate/oss_and_stack/stack-with-enterprise/gears-v1/python/install.md: {{The Add icon}} -./operate/oss_and_stack/stack-with-enterprise/gears-v1/python/install.md: {{The Save icon}} -./operate/oss_and_stack/stack-with-enterprise/gears-v1/jvm/install.md: {{The Add icon}} -./operate/oss_and_stack/stack-with-enterprise/gears-v1/jvm/install.md: {{The Save icon}} -./operate/oss_and_stack/stack-with-enterprise/install/add-module-to-database.md: {{Select which modules to add to your database.}} -./operate/oss_and_stack/stack-with-enterprise/deprecated-features/graph/graph-quickstart.md: {{The Workbench icon}} -./operate/oss_and_stack/stack-with-enterprise/deprecated-features/graph/graph-quickstart.md: {{The Run command icon}} -./operate/oss_and_stack/stack-with-enterprise/deprecated-features/graph/graph-quickstart.md:{{Visualize a graph with RedisInsight workbench.}} -./operate/oss_and_stack/stack-with-enterprise/release-notes/redistimeseries/redistimeseries-1.8-release-notes.md: {{A graph showing the difference between average and time-weighted average.}} -./operate/oss_and_stack/stack-with-enterprise/release-notes/redistimeseries/redistimeseries-1.8-release-notes.md: {{A graph that illustrates gap-filling.}} -./operate/oss_and_stack/stack-with-enterprise/release-notes/redisearch/redisearch-2.0-release-notes.md:{{Compares the architecture of RediSearch 2.0 to architecture of earlier versions.}} -./operate/oss_and_stack/stack-with-enterprise/search/redisearch-2-upgrade.md: {{The Add icon}} -./operate/oss_and_stack/stack-with-enterprise/search/redisearch-2-upgrade.md: {{The Save icon}} -./operate/oss_and_stack/stack-with-enterprise/stack-quickstart.md: {{The New subscriptions button in the admin console menu.}} -./operate/oss_and_stack/stack-with-enterprise/stack-quickstart.md: {{The Create Subscription button.}} -./operate/oss_and_stack/stack-with-enterprise/stack-quickstart.md: {{The New Database button creates a new database for your subscription.}} -./operate/oss_and_stack/stack-with-enterprise/stack-quickstart.md: {{Use the Activate database button to create and activate your database.}} -./embeds/rc-cost-report-csv.md:{{The cost report download button.}} -./embeds/replica-of-tls-config.md: {{Syncer certificate for Replica Of and Active-Active authentication.}} -./embeds/replica-of-tls-config.md: {{Replica Of TLS authentication configuration.}} -./embeds/cluster-setup.md: {{When you first install Redis Enterprise Software, you need to set up a cluster.}} -./embeds/cluster-setup.md: {{Set the credentials for your admin user.}} -./embeds/cluster-setup.md: {{Enter your cluster license key if you have one.}} -./embeds/cluster-setup.md: {{Configure the cluster FQDN.}} -./embeds/cluster-setup.md: {{Configure the node specific settings.}} -./embeds/cluster-setup.md: {{Modal shown when a page refresh is needed because the certificates have been updated.}} -./embeds/quick-db-setup.md: {{Select Quick database on the Databases screen.}} -./embeds/quick-db-setup.md: {{Create a quick database.}} -./embeds/quick-db-setup.md:{{Database active icon.}} -./embeds/rc-tags-tag-module.md: {{The Add tag button.}} -./embeds/rc-tags-tag-module.md: {{The New tag fields.}} -./embeds/rc-tags-tag-module.md: {{Delete button.}} -./embeds/rc-opt-in-to-72.md:{{Opt-in to 7.2 button.}} diff --git a/build/migrate/logs/missed_io-links-misc.log b/build/migrate/logs/missed_io-links-misc.log deleted file mode 100644 index c5b32ed806..0000000000 --- a/build/migrate/logs/missed_io-links-misc.log +++ /dev/null @@ -1,36 +0,0 @@ -./develop/connect/clients/go.md: Username: "default", // use your Redis user. More info https://redis.io/docs/management/security/acl/ -./develop/connect/clients/python.md: username="default", # use your Redis user. More info https://redis.io/docs/management/security/acl/ -./develop/connect/clients/dotnet.md: User = "default", // use your Redis user. More info https://redis.io/docs/management/security/acl/ -./develop/connect/clients/java/jedis.md: .user("default") // use your Redis user. More info https://redis.io/docs/management/security/acl/ -./develop/connect/clients/nodejs.md: username: 'default', // use your Redis user. More info https://redis.io/docs/management/security/acl/ -./integrate/redisom-for-java/_index.md:* RedisInsight: See [https://redis.io/docs/ui/insight]({{< relref "/develop/connect/insight/" >}}) -./integrate/redisom-for-python/_index.md:* A [Redis Stack](https://redis.io) database, or Redis with the [Search and Query]({{< relref "/develop/interact/search-and-query/" >}}) and [JSON]({{< relref "/develop/data-types/json/" >}}) features installed. We've provided a `docker-compose.yml` for this. You can also [sign up for a free 30Mb database with Redis Cloud](https://redis.com/try-free/?utm_source=redisio&utm_medium=referral&utm_campaign=2023-09-try_free&utm_content=cu-redis_cloud_users) - be sure to check the Redis Stack option when creating your cloud database. -./operate/redisinsight/install/install-on-k8s.md:This is an easy way to use RedisInsight with a [Redis Enterprise K8s deployment](https://redis.io/docs/about/redis-enterprise/#:~:text=and%20Multi%2Dcloud-,Redis%20Enterprise%20Software,-Redis%20Enterprise%20Software). -./operate/rs/references/compatibility/config-settings.md:Redis Enterprise Software and [Redis Cloud]({{< relref "/operate/rc" >}}) only support a subset of [open source Redis configuration settings](https://redis.io/docs/manual/config/). Using [`CONFIG GET`]({{< relref "/commands" >}}/config-get/) or [`CONFIG SET`]({{< relref "/commands" >}}/config-set/) with unsupported configuration settings returns an error. -./operate/rs/references/compatibility/commands/cluster.md:[Clustering in Redis Enterprise Software]({{< relref "/operate/rs/databases/durability-ha/clustering" >}}) and [Redis Cloud]({{< relref "/operate/rc/databases/configuration/clustering" >}}) differs from the [open source Redis cluster](https://redis.io/docs/manual/scaling/) and works with all standard Redis clients. -./operate/rs/references/compatibility/commands/server.md:| [ACL CAT]({{< relref "/commands" >}}/acl-cat) | ✅ Standard
✅ Active-Active | ✅ Standard
✅ Active-Active | Not supported for [scripts](https://redis.io/docs/manual/programmability/). | -./operate/rs/references/compatibility/commands/server.md:| [ACL GETUSER]({{< relref "/commands" >}}/acl-getuser) | ✅ Standard
✅ Active-Active | ✅ Standard
✅ Active-Active | Not supported for [scripts](https://redis.io/docs/manual/programmability/). | -./operate/rs/references/compatibility/commands/server.md:| [ACL HELP]({{< relref "/commands" >}}/acl-help) | ✅ Standard
✅ Active-Active | ✅ Standard
✅ Active-Active | Not supported for [scripts](https://redis.io/docs/manual/programmability/). | -./operate/rs/references/compatibility/commands/server.md:| [ACL LIST]({{< relref "/commands" >}}/acl-list) | ✅ Standard
✅ Active-Active | ✅ Standard
✅ Active-Active | Not supported for [scripts](https://redis.io/docs/manual/programmability/). | -./operate/rs/references/compatibility/commands/server.md:| [ACL USERS]({{< relref "/commands" >}}/acl-users) | ✅ Standard
✅ Active-Active | ✅ Standard
✅ Active-Active | Not supported for [scripts](https://redis.io/docs/manual/programmability/). | -./operate/rs/references/compatibility/commands/server.md:| [ACL WHOAMI]({{< relref "/commands" >}}/acl-whoami) | ✅ Standard
✅ Active-Active | ✅ Standard
✅ Active-Active | Not supported for [scripts](https://redis.io/docs/manual/programmability/). | -./operate/rs/references/compatibility/commands/server.md:| [INFO]({{< relref "/commands" >}}/info) | ✅ Standard
✅ Active-Active | ✅ Standard
✅ Active-Active | In Redis Enterprise, `INFO` returns a different set of fields than open source Redis.
Not supported for [scripts](https://redis.io/docs/manual/programmability/). | -./operate/rs/references/compatibility/commands/server.md:| [SLOWLOG GET]({{< relref "/commands" >}}/slowlog-get) | ✅ Standard
✅ Active-Active | ✅ Standard
✅ Active-Active | Not supported for [scripts](https://redis.io/docs/manual/programmability/). | -./operate/rs/references/compatibility/commands/server.md:| [SLOWLOG LEN]({{< relref "/commands" >}}/slowlog-len) | ✅ Standard
✅ Active-Active | ✅ Standard
✅ Active-Active | Not supported for [scripts](https://redis.io/docs/manual/programmability/). | -./operate/rs/references/compatibility/commands/server.md:| [SLOWLOG RESET]({{< relref "/commands" >}}/slowlog-reset) | ✅ Standard
✅ Active-Active | ✅ Standard
✅ Active-Active | Not supported for [scripts](https://redis.io/docs/manual/programmability/). | -./operate/rs/release-notes/legacy-release-notes/rs-5-4-6-july-2019.md:This release includes the latest version of [Redis 5 (5.0.5](https://redis.io/)), bundles the GA release of the new RedisTimeSeries module, -./operate/rs/release-notes/legacy-release-notes/rs-5-4-6-july-2019.md:- [Latest version of Redis 5](https://redis.io/) (5.0.5) was merged into RS 5.4.6. -./operate/rs/release-notes/rs-6-4-2-releases/rs-6-4-2-30.md:Redis is continuously enhancing its ACL (access control list) functionality and coverage. Redis version 6.2 enhances [ACLs](https://redis.io/docs/management/security/acl/) to allow and disallow pub/sub channels. -./operate/rs/_index.md:- [Open source Redis](https://redis.io/) (redis.io) -./operate/rc/changelog/july-2023.md:- You are no longer able to [create an ACL rule]({{< relref "/operate/rc/security/access-control/data-access-control/configure-acls" >}}) using the rule builder. Instead, use [ACL syntax](https://redis.io/docs/management/security/acl/) to define your ACL rules. -./operate/rc/_index.md:- [Redis](https://redis.io/) and [Redis Stack]({{< relref "/operate/oss_and_stack/stack-with-enterprise" >}}) support -./operate/rc/_index.md:- [Open source Redis](https://redis.io/) (redis.io) -./operate/oss_and_stack/install/_index.md:You can install [Redis](https://redis.io/docs/about/) or [Redis Stack]({{< relref "/operate/oss_and_stack/" >}}) locally on your machine. Redis and Redis Stack are available on Linux, macOS, and Windows. -./operate/oss_and_stack/management/config-file.md:# available at https://redis.io web site. -./operate/oss_and_stack/stack-with-enterprise/search/commands.md:| [FT.EXPLAINCLI]({{< relref "/commands" >}}/ft.explaincli/) | ✅ Supported | ✅ Supported | ✅ Supported | Returns the execution plan for a complex query as an [array](https://redis.io/docs/reference/protocol-spec#resp-arrays). | -./embeds/modules.html:
  • Documentation
  • -./embeds/modules.html:
  • Quick start
  • -./embeds/modules.html:
  • Documentation
  • -./embeds/modules.html:
  • Documentation
  • -./embeds/modules.html:
  • Quick start
  • -./embeds/modules.html:
  • Documentation
  • diff --git a/build/migrate/logs/missed_topics.log b/build/migrate/logs/missed_topics.log deleted file mode 100644 index a6171f0c79..0000000000 --- a/build/migrate/logs/missed_topics.log +++ /dev/null @@ -1,3 +0,0 @@ -./operate/rs/references/connecting-to-redis.md:- Code your own Redis client based on the [Redis Serialization Protocol (RESP)](http://redis.io/topics/protocol) -./operate/rs/references/clustering-redis.md:There are several solutions to clustering Redis, most notable of which is the [open source Redis cluster](http://redis.io/topics/cluster-spec). -./operate/kubernetes/faqs/_index.md:While [Helm charts](https://helm.sh/docs/topics/charts/) help automate multi-resource deployments, they do not provide the lifecycle management and lack many of the benefits provided by the operator: diff --git a/build/migrate/topics.csv b/build/migrate/topics.csv deleted file mode 100644 index 7632f8d458..0000000000 --- a/build/migrate/topics.csv +++ /dev/null @@ -1,61 +0,0 @@ -broken_ref;fixed_ref;comment -/topics/admin;/operate/oss_and_stack/management/admin; -/topics/rdd;/operate/oss_and_stack/reference/internals/rdd; -/topics/rdd-1;/operate/oss_and_stack/reference/internals/rdd; -/topics/rdd-2;/operate/oss_and_stack/reference/internals/rdd; -/topics/gopher;/develop/reference/gopher; -/topics/ARM;/operate/oss_and_stack/reference/arm; -/topics/arm;/operate/oss_and_stack/reference/arm; -/topics/pubsub;/develop/interact/pubsub; -/topics/releases;/about/releases;This goes to the about section which goes away -/topics/command-arguments;/develop/reference/command-arguments; -/topics/signals;/operate/oss_and_stack/reference/signals; -/topics/clients;/develop/connect/clients/; -/topics/license;/about/license; -/topics/governance;/about/governance; -/topics/internals-sds;/operate/oss_and_stack/reference/internals/internals-sds; -/topics/lru_cache;/develop/reference/eviction; -/topics/lru-cache;/develop/reference/eviction; -/topics/latency-monitor;/operate/oss_and_stack/management/optimization/latency-monitor.md; -/topics/encryption;/operate/oss_and_stack/management/security/encryption.md; -/topics/lua-api;/develop/interact/programmability/lua-api.md; -/topics/command-tips;/develop/reference/command-tips.md; -/topics/cluster-tutorial;/operate/oss_and_stack/management/scaling; -/topics/partitioning;/operate/oss_and_stack/management/scaling; -/topics/persistence;/operate/oss_and_stack/management/persistence; -/topics/replication;/operate/oss_and_stack/management/replication; -/topics/key-specs;/develop/reference/key-specs.md; -/topics/pipelining;/develop/use/pipelining; -/topics/sentinel;/operate/oss_and_stack/management/sentinel; -/topics/protocol;/develop/reference/protocol-spec; -/topics/streams-intro;/develop/data-types/streams; -/topics/acl;/operate/oss_and_stack/management/security/acl; -/topics/internals-eventlib;/operate/oss_and_stack/reference/internals/internals-rediseventlib; -/topics/internals-rediseventlib;/operate/oss_and_stack/reference/internals/internals-rediseventlib; -/topics/notifications;/develop/use/keyspace-notifications; -/topics/client-side-caching;/develop/use/client-side-caching; -/topics/ldb;/develop/interact/programmability/lua-debugging; -/topics/latency;/operate/oss_and_stack/management/optimization/latency; -/topics/distlock;/develop/use/patterns/distributed-locks; -/topics/internals-vm;/operate/oss_and_stack/reference/internals/internals-vm; -/topics/virtual-memory;/operate/oss_and_stack/reference/internals/internals-vm; -/topics/indexing;/develop/use/patterns/indexes; -/topics/benchmarks;/operate/oss_and_stack/management/optimization/benchmarks; -/topics/performance-on-cpu;/operate/oss_and_stack/management/optimization/cpu-profiling; -/topics/modules-blocking-ops;/develop/reference/modules/modules-blocking-ops; -/topics/cluster-spec;/operate/oss_and_stack/reference/cluster-spec; -/topics/transactions;/develop/interact/transactions; -/topics/eval-intro;/develop/interact/programmability/eval-intro; -/topics/programmability;/develop/interact/programmability/; -/topics/functions-intro;/develop/interact/programmability/functions-intro; -/topics/data-types;/develop/data-types; -/topics/data-types-intro;/develop/data-types; -/topics/memory-optimization;/operate/oss_and_stack/management/optimization/memory-optimization; -/topics/mass-insert;/develop/use/patterns/bulk-loading; -/topics/modules-intro;/develop/reference/modules/; -/topics/rediscli;/develop/connect/cli; -/topics/modules-native-types;/develop/reference/modules/modules-native-types; -/topics/modules-api-ref;/develop/reference/modules/modules-api-ref; -/topics/debugging;/operate/oss_and_stack/management/debugging; -/topics/security;/operate/oss_and_stack/management/security/; -/topics/quickstart;/develop/get-started/; \ No newline at end of file diff --git a/build/update_cmds.py b/build/update_cmds.py index bb8d1a98cf..0c92a16a54 100755 --- a/build/update_cmds.py +++ b/build/update_cmds.py @@ -1,9 +1,31 @@ #!/usr/bin/env python3 +import argparse +import json +import logging + from components.syntax import Command from components.markdown import Markdown -import json + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser(description='Updates command metadata') + parser.add_argument('--loglevel', type=str, + default='INFO', + help='Python logging level (overwrites LOGLEVEL env var)') + return parser.parse_args() + if __name__ == '__main__': + ARGS = parse_args() + + # Configure logging BEFORE creating objects + log_level = getattr(logging, ARGS.loglevel.upper()) + logging.basicConfig( + level=log_level, + format='%(message)s %(filename)s:%(lineno)d - %(funcName)s', + force=True # Force reconfiguration in case logging was already configured + ) + with open('data/commands_core.json', 'r') as f: j = json.load(f) diff --git a/content/develop/ai/search-and-query/advanced-concepts/tags.md b/content/develop/ai/search-and-query/advanced-concepts/tags.md index 17e7cedc22..8e36a26263 100644 --- a/content/develop/ai/search-and-query/advanced-concepts/tags.md +++ b/content/develop/ai/search-and-query/advanced-concepts/tags.md @@ -1,6 +1,7 @@ --- aliases: - /develop/interact/search-and-query/advanced-concepts/tags +- /develop/ai/search-and-query/advanced-concepts/tags categories: - docs - develop @@ -11,52 +12,78 @@ categories: - oss - kubernetes - clients -description: Details about tag fields -linkTitle: Tags -title: Tags +description: How to use tag fields for exact match searches and high-performance filtering +linkTitle: Tag fields +title: Tag fields weight: 6 --- -Tag fields are similar to full-text fields but they interpret the text as a simple -list of *tags* delimited by a -[separator](#creating-a-tag-field) character (which is a comma "," by default). -This limitation means that tag fields can use simpler -[tokenization]({{< relref "/develop/ai/search-and-query/advanced-concepts/escaping" >}}) -and encoding in the index, which is more efficient than full-text indexing. +Tag fields provide exact match search capabilities with high performance and memory efficiency. Use tag fields when you need to filter documents by specific values without the complexity of full-text search tokenization. -The values in tag fields cannot be accessed by general field-less search and can be used only with a special syntax. +Tag fields interpret text as a simple list of *tags* delimited by a [separator](#separator-options) character (comma "`,`" by default). This approach enables simpler [tokenization]({{< relref "/develop/ai/search-and-query/advanced-concepts/escaping/#tokenization-rules-for-tag-fields" >}}) and encoding, making tag indexes much more efficient than full-text indexes. Note: even though tag and text fields both use text, they are two separate field types and so you don't query them the same way. -The main differences between tag and full-text fields are: +## Tag fields vs text fields -1. [Tokenization]({{< relref "/develop/ai/search-and-query/advanced-concepts/escaping#tokenization-rules-for-tag-fields" >}}) - is very simple for tags. +Tag fields excel in scenarios requiring exact matching rather than full-text search. Choose tag fields when you need to index categorical data such as: -1. Stemming is not performed on tag indexes. +- **Product categories**: Electronics, Clothing, Books +- **User roles**: Admin, Editor, Viewer +- **Status values**: Active, Pending, Completed +- **Geographic regions**: US, EU, APAC +- **Content types**: Video, Image, Document -1. Tags cannot be found from a general full-text search. If a document has a field called "tags" - with the values "foo" and "bar", searching for foo or bar without a special tag modifier (see below) will not return this document. +### Key differences -1. The index is much simpler and more compressed: frequencies or offset vectors of field flags - are not stored. The index contains only document IDs encoded as deltas. This means that an entry in - a tag index is usually one or two bytes long. This makes them very memory-efficient and fast. +| Feature | Tag fields | Text fields | +|---------|------------|-------------| +| **Search type** | Exact match | Full-text search | +| **Tokenization** | Simple delimiter splitting | Complex word tokenization | +| **Stemming** | None | Language-specific stemming | +| **Memory usage** | Very low (1-2 bytes per entry) | Higher (frequencies, positions) | +| **Performance** | Fastest | Slower for exact matches | +| **Multiple values** | Support comma-separated lists | Single text content | +| **Case control** | Optional case-sensitive matching | Typically case-insensitive | +| **Use case** | Categories, filters, IDs | Content search, descriptions | -1. You can create up to 1024 tag fields per index. +## Technical details -## Creating a tag field +### Index structure +- **Compressed storage**: Only document IDs encoded as deltas (1-2 bytes per entry) +- **No frequencies**: Unlike TEXT fields, tag indexes don't store term frequencies +- **No positions**: No offset vectors or field flags stored +- **Limit**: You can create up to 1024 tag fields per index -Tag fields can be added to the schema with the following syntax: +### Tokenization differences +- **Simple splitting**: Text is split only at separator characters +- **No stemming**: Words are indexed exactly as written +- **Case handling**: Optional case-sensitive or case-insensitive matching +- **No stop words**: All tag values are indexed regardless of content + +## Create a tag field + +Add tag fields to your schema using this syntax: ``` FT.CREATE ... SCHEMA ... {field_name} TAG [SEPARATOR {sep}] [CASESENSITIVE] ``` -For hashes, SEPARATOR can be any printable ASCII character; the default is a comma (`,`). For JSON, there is no default separator; you must declare one explicitly if needed. +### Separator options -For example: +- **Hash documents**: Default separator is comma (`,`). You can use any printable ASCII character +- **JSON documents**: No default separator - you must specify one explicitly if needed +- **Custom separators**: Use semicolon (`;`), pipe (`|`), or other characters as needed -``` -JSON.SET key:1 $ '{"colors": "red, orange, yellow"}' -FT.CREATE idx on JSON PREFIX 1 key: SCHEMA $.colors AS colors TAG SEPARATOR "," +### Case sensitivity + +- **Default**: Case-insensitive matching (`red` matches `Red`, `RED`) +- **CASESENSITIVE**: Preserves original case for exact matching + +### Examples + +**Basic tag field with JSON:** +```sql +JSON.SET key:1 $ '{"colors": "red, orange, yellow"}' +FT.CREATE idx ON JSON PREFIX 1 key: SCHEMA $.colors AS colors TAG SEPARATOR "," > FT.SEARCH idx '@colors:{orange}' 1) "1" @@ -65,105 +92,203 @@ FT.CREATE idx on JSON PREFIX 1 key: SCHEMA $.colors AS colors TAG SEPARATOR "," 2) "{\"colors\":\"red, orange, yellow\"}" ``` -CASESENSITIVE can be specified to keep the original case. +**Case-sensitive tags with Hash:** +```sql +HSET product:1 categories "Electronics,Gaming,PC" +FT.CREATE products ON HASH PREFIX 1 product: SCHEMA categories TAG CASESENSITIVE -## Querying tag fields +> FT.SEARCH products '@categories:{PC}' +1) "1" +2) "product:1" +``` -As mentioned above, just searching for a tag without any modifiers will not retrieve documents -containing it. +**Custom separator:** +```sql +HSET book:1 genres "Fiction;Mystery;Thriller" +FT.CREATE books ON HASH PREFIX 1 book: SCHEMA genres TAG SEPARATOR ";" +``` -The syntax for matching tags in a query is as follows (the curly braces are part of the syntax): +## Query tag fields - ``` - @:{ | | ...} - ``` +**Important**: Tag fields require special query syntax - you cannot find tag values with general field-less searches. -For example, this query finds documents with either the tag `hello world` or `foo bar`: +### Basic tag query syntax + +Use curly braces to specify tag values (the braces are part of the syntax): ``` - FT.SEARCH idx "@tags:{ hello world | foo bar }" +@:{ | | ...} ``` -Tag clauses can be combined into any sub-clause, used as negative expressions, optional expressions, etc. For example, given the following index: +### Single tag match +Find documents with a specific tag: + +```sql +FT.SEARCH idx "@category:{Electronics}" +FT.SEARCH idx "@status:{Active}" ``` -FT.CREATE idx ON HASH PREFIX 1 test: SCHEMA title TEXT price NUMERIC tags TAG SEPARATOR ";" -``` -You can combine a full-text search on the title field, a numerical range on price, and match either the `foo bar` or `hello world` tag like this: +### Multiple tag match (OR) + +Find documents with any of the specified tags: +```sql +FT.SEARCH idx "@tags:{ hello world | foo bar }" +FT.SEARCH idx "@category:{ Electronics | Gaming | Software }" ``` -FT.SEARCH idx "@title:hello @price:[0 100] @tags:{ foo bar | hello world } + +### Combining with other queries + +Tag queries work seamlessly with other field types: + +```sql +FT.CREATE idx ON HASH PREFIX 1 product: SCHEMA + title TEXT + price NUMERIC + category TAG SEPARATOR ";" + +# Combine text search, numeric range, and tag filter +FT.SEARCH idx "@title:laptop @price:[500 1500] @category:{ Electronics | Gaming }" ``` -Tags support prefix matching with the regular `*` character: +### Prefix matching + +Use the `*` wildcard for prefix matching: +```sql +FT.SEARCH idx "@tags:{ tech* }" # Matches: technology, technical, tech +FT.SEARCH idx "@tags:{ hello\\ w* }" # Matches: "hello world", "hello web" ``` -FT.SEARCH idx "@tags:{ hell* }" -FT.SEARCH idx "@tags:{ hello\\ w* }" +### Negative matching + +Exclude documents with specific tags: + +```sql +FT.SEARCH idx "-@category:{Discontinued}" +FT.SEARCH idx "@title:phone -@category:{Refurbished}" ``` -## Multiple tags in a single filter +## Advanced tag queries -Notice that including multiple tags in the same clause creates a union of all documents that contain any of the included tags. To create an intersection of documents containing all of the given tags, you should repeat the tag filter several times. +### OR vs AND logic -For example, imagine an index of travelers, with a tag field for the cities each traveler has visited: +**Single clause (OR logic)**: Find documents with ANY of the specified tags +```sql +@cities:{ New York | Los Angeles | Barcelona } +# Returns: Documents with New York OR Los Angeles OR Barcelona +``` +**Multiple clauses (AND logic)**: Find documents with ALL of the specified tags +```sql +@cities:{ New York } @cities:{ Los Angeles } @cities:{ Barcelona } +# Returns: Documents with New York AND Los Angeles AND Barcelona ``` -FT.CREATE myIndex ON HASH PREFIX 1 traveler: SCHEMA name TEXT cities TAG + +### Practical example + +Consider a travel database: + +```sql +FT.CREATE travelers ON HASH PREFIX 1 traveler: SCHEMA + name TEXT + cities TAG HSET traveler:1 name "John Doe" cities "New York, Barcelona, San Francisco" +HSET traveler:2 name "Jane Smith" cities "New York, Los Angeles, Tokyo" ``` -For this index, the following query will return all the people who visited at least one of the following cities: - +**Find travelers who visited any of these cities:** +```sql +FT.SEARCH travelers "@cities:{ New York | Los Angeles | Barcelona }" +# Returns: Both John and Jane ``` -FT.SEARCH myIndex "@cities:{ New York | Los Angeles | Barcelona }" + +**Find travelers who visited all of these cities:** +```sql +FT.SEARCH travelers "@cities:{ New York } @cities:{ Barcelona }" +# Returns: Only John (has both New York and Barcelona) ``` -But the next query will return all people who have visited all three cities: +## Handle special characters -``` -FT.SEARCH myIndex "@cities:{ New York } @cities:{Los Angeles} @cities:{ Barcelona }" -``` +Tag fields can contain any punctuation except the field separator, but you need to escape certain characters in queries. -## Including punctuation and spaces in tags +### Defining tags with special characters -A tag field can contain any punctuation characters except for the field separator. -You can use punctuation without escaping when you *define* a tag field, -but you typically need to escape certain characters when you *query* the field -because the query syntax itself uses the same characters. -(See [Query syntax]({{< relref "/develop/ai/search-and-query/advanced-concepts/query_syntax#tag-filters" >}}) -for the full set of characters that require escaping.) +You can store tags with punctuation without escaping: -For example, given the following index: +```sql +FT.CREATE products ON HASH PREFIX 1 test: SCHEMA tags TAG +HSET test:1 tags "Andrew's Top 5,Justin's Top 5,5-Star Rating" +HSET test:2 tags "Best Buy,Top-Rated,Editor's Choice" ``` -FT.CREATE punctuation ON HASH PREFIX 1 test: SCHEMA tags TAG + +### Querying tags with special characters + +**Escape punctuation in queries** using backslash (`\`): + +```sql +# Query for "Andrew's Top 5" +FT.SEARCH products "@tags:{ Andrew\\'s Top 5 }" + +# Query for "5-Star Rating" +FT.SEARCH products "@tags:{ 5\\-Star Rating }" + +# Query for "Editor's Choice" +FT.SEARCH products "@tags:{ Editor\\'s Choice }" ``` -You can add tags that contain punctuation like this: +### Characters that need escaping + +In tag queries, escape these characters: +- Single quotes: `'` → `\\'` +- Hyphens: `-` → `\\-` +- Parentheses: `()` → `\\(\\)` +- Brackets: `[]{}` → `\\[\\]\\{\\}` +- Pipes: `|` → `\\|` + +### Spaces in tags +**Modern Redis** (v2.4+): Spaces don't need escaping in tag queries +```sql +FT.SEARCH products "@tags:{ Top Rated Product }" ``` -HSET test:1 tags "Andrew's Top 5,Justin's Top 5" + +**Older versions** or **dialect 1**: Escape spaces +```sql +FT.SEARCH products "@tags:{ Top\\ Rated\\ Product }" ``` -However, when you query for those tags, you must escape the punctuation characters -with a backslash (`\`). So, querying for the tag `Andrew's Top 5` in -[`redis-cli`]({{< relref "/develop/tools/cli" >}}) looks like this: +### Best practices -``` -FT.SEARCH punctuation "@tags:{ Andrew\\'s Top 5 }" +- **Use simple separators**: Stick to comma (`,`) or semicolon (`;`) +- **Avoid complex punctuation**: Keep tag values simple when possible +- **Test your queries**: Verify escaping works with your specific characters +- **Use consistent casing**: Decide on case sensitivity early in your design + +See [Query syntax]({{< relref "/develop/ai/search-and-query/advanced-concepts/query_syntax#tag-filters" >}}) for complete escaping rules. + +## An e-commerce use case + +```sql +# Product categories and attributes +FT.CREATE products ON HASH PREFIX 1 product: SCHEMA + name TEXT + category TAG + brand TAG + features TAG SEPARATOR ";" + +HSET product:1 name "Gaming Laptop" category "Electronics" brand "ASUS" features "RGB;16GB RAM;SSD" + +# Find gaming products with specific features +FT.SEARCH products "@category:{Electronics} @features:{RGB} @features:{SSD}" ``` -(Note that you need the double backslash here because the terminal app itself -uses the backslash as an escape character. -Programming languages commonly use this convention also.) +## Next steps -You can include spaces in a tag filter without escaping *unless* you are -using a version of RediSearch earlier than v2.4 or you are using -[query dialect 1]({{< relref "/develop/ai/search-and-query/advanced-concepts/dialects#dialect-1" >}}). -See -[Query syntax]({{< relref "/develop/ai/search-and-query/advanced-concepts/query_syntax#tag-filters" >}}) -for a full explanation. +- Learn about [tokenization rules]({{< relref "/develop/ai/search-and-query/advanced-concepts/escaping#tokenization-rules-for-tag-fields" >}}) for tag fields +- Explore [field and type options]({{< relref "/develop/ai/search-and-query/indexing/field-and-type-options" >}}) for other field types +- See [query syntax]({{< relref "/develop/ai/search-and-query/advanced-concepts/query_syntax" >}}) for advanced query patterns diff --git a/content/operate/kubernetes/_index.md b/content/operate/kubernetes/_index.md index d0665bc519..ec07f093f9 100644 --- a/content/operate/kubernetes/_index.md +++ b/content/operate/kubernetes/_index.md @@ -5,12 +5,104 @@ categories: - docs - operate - kubernetes -description: The Redis Enterprise operators allows you to use Redis Enterprise for - Kubernetes. -hideListLinks: false +description: Deploy and manage Redis Enterprise on Kubernetes with the Redis Enterprise operator. +hideListLinks: true linkTitle: Redis for Kubernetes weight: 30 --- -Kubernetes provides enterprise orchestration of containers and has been widely adopted. Redis Enterprise for Kubernetes provides a simple way to get a Redis Enterprise cluster on Kubernetes and enables more complex deployment scenarios. +[Redis Enterprise for Kubernetes](https://redis.io/kubernetes/) brings Redis Enterprise to Kubernetes environments through the Redis Enterprise operator. You can deploy, scale, and manage Redis Enterprise clusters and databases by using native Kubernetes resources and workflows. +Redis Enterprise for Kubernetes provides all the enterprise features of Redis Software: + +- Linear scalability with Redis clustering +- High availability with automatic failover +- Active-Active geo-distribution +- Auto Tiering for cost optimization +- Enterprise-grade security and encryption +- 24/7 support + +The Redis Enterprise operator simplifies deployment and management by providing custom resource definitions (CRDs) for Redis Enterprise clusters (REC) and databases (REDB). This approach enables GitOps workflows and Kubernetes-native operations. + +## Get started + +Deploy Redis Enterprise on your Kubernetes cluster and create your first database. + +- [Quick start deployment]({{< relref "/operate/kubernetes/deployment/quick-start" >}}) +- [Deploy with Helm]({{< relref "/operate/kubernetes/deployment/helm" >}}) +- [Deploy on OpenShift]({{< relref "/operate/kubernetes/deployment/openshift" >}}) +- [Supported Kubernetes distributions]({{< relref "/operate/kubernetes/reference/supported_k8s_distributions" >}}) + +## Redis Enterprise clusters (REC) + +Create and manage [Redis Enterprise clusters]({{< relref "/operate/kubernetes/re-clusters" >}}) on Kubernetes. + +- [Connect to admin console]({{< relref "/operate/kubernetes/re-clusters/connect-to-admin-console" >}}) +- [Auto Tiering]({{< relref "/operate/kubernetes/re-clusters/auto-tiering" >}}) +- [Multi-namespace deployment]({{< relref "/operate/kubernetes/re-clusters/multi-namespace" >}}) +- [Cluster recovery]({{< relref "/operate/kubernetes/re-clusters/cluster-recovery" >}}) +- [REC API reference]({{< relref "/operate/kubernetes/reference/redis_enterprise_cluster_api" >}}) + +## Redis Enterprise databases (REDB) + +Create and manage [Redis Enterprise databases]({{< relref "/operate/kubernetes/re-databases" >}}) using Kubernetes resources. + +- [Database controller]({{< relref "/operate/kubernetes/re-databases/db-controller" >}}) +- [Create replica databases]({{< relref "/operate/kubernetes/re-databases/replica-redb" >}}) +- [REDB API reference]({{< relref "/operate/kubernetes/reference/redis_enterprise_database_api" >}}) + +## Active-Active databases + +Set up globally distributed [Active-Active databases]({{< relref "/operate/kubernetes/active-active" >}}) across multiple Kubernetes clusters. + +- [Prepare participating clusters]({{< relref "/operate/kubernetes/active-active/prepare-clusters" >}}) +- [Create Active-Active database]({{< relref "/operate/kubernetes/active-active/create-reaadb" >}}) +- [Global configuration]({{< relref "/operate/kubernetes/active-active/global-config" >}}) +- [REAADB API reference]({{< relref "/operate/kubernetes/reference/redis_enterprise_active_active_database_api" >}}) +- [Remote cluster API reference]({{< relref "/operate/kubernetes/reference/redis_enterprise_remote_cluster_api" >}}) + +## Security + +Manage [secure connections]({{< relref "/operate/kubernetes/security" >}}) and access control for your Redis Enterprise deployment. + +- [Manage REC credentials]({{< relref "/operate/kubernetes/security/manage-rec-credentials" >}}) +- [Manage REC certificates]({{< relref "/operate/kubernetes/security/manage-rec-certificates" >}}) +- [Internode encryption]({{< relref "/operate/kubernetes/security/internode-encryption" >}}) +- [LDAP authentication]({{< relref "/operate/kubernetes/security/ldap" >}}) + +## Reference + +Use the Kubernetes API and command-line tools to manage your Redis Enterprise deployment. + +- [Redis Enterprise cluster API (REC)]({{< relref "/operate/kubernetes/reference/redis_enterprise_cluster_api" >}}) +- [Redis Enterprise database API (REDB)]({{< relref "/operate/kubernetes/reference/redis_enterprise_database_api" >}}) +- [Active-Active database API (REAADB)]({{< relref "/operate/kubernetes/reference/redis_enterprise_active_active_database_api" >}}) +- [Remote cluster API (RERC)]({{< relref "/operate/kubernetes/reference/redis_enterprise_remote_cluster_api" >}}) + +## Logs & monitoring + +Monitor and troubleshoot your Redis Enterprise deployment. + +- [Collect logs]({{< relref "/operate/kubernetes/logs/collect-logs" >}}) +- [Connect to Prometheus operator]({{< relref "/operate/kubernetes/re-clusters/connect-prometheus-operator" >}}) + +## Upgrade + +Keep your Redis Enterprise deployment up to date. + +- [Upgrade Redis cluster]({{< relref "/operate/kubernetes/upgrade/upgrade-redis-cluster" >}}) +- [Upgrade with OpenShift CLI]({{< relref "/operate/kubernetes/upgrade/openshift-cli" >}}) +- [Upgrade with OLM]({{< relref "/operate/kubernetes/upgrade/upgrade-olm" >}}) + +## Release notes + +Stay informed about new features, enhancements, and fixes. + +- [Release notes]({{< relref "/operate/kubernetes/release-notes" >}}) + +## Related info + +- [Redis Enterprise Software]({{< relref "/operate/rs" >}}) +- [Redis Cloud]({{< relref "/operate/rc" >}}) +- [Redis Open Source]({{< relref "/operate/oss_and_stack" >}}) +- [Glossary]({{< relref "/glossary" >}}) \ No newline at end of file diff --git a/content/operate/kubernetes/active-active/_index.md b/content/operate/kubernetes/active-active/_index.md index dc77e649e7..791c178aca 100644 --- a/content/operate/kubernetes/active-active/_index.md +++ b/content/operate/kubernetes/active-active/_index.md @@ -5,13 +5,15 @@ categories: - docs - operate - kubernetes -description: Content related to Active-Active Redis Enterprise databases for Kubernetes. +description: Create and manage Active-Active Redis Enterprise databases across multiple Kubernetes clusters. hideListLinks: true linkTitle: Active-Active databases weight: 40 --- -On Kubernetes, Redis Enterprise [Active-Active]({{< relref "/operate/rs/databases/active-active/" >}}) databases provide read and write access to the same dataset from different Kubernetes clusters. +Redis Enterprise [Active-Active]({{< relref "/operate/rs/databases/active-active/" >}}) databases on Kubernetes provide read and write access to the same dataset from different Kubernetes clusters. This enables globally distributed applications with local read and write access, automatic conflict resolution, and seamless failover capabilities. + +Active-Active databases use multi-master replication to keep data synchronized across participating clusters, allowing applications to read and write data locally while maintaining global consistency. ## Active-Active setup methods diff --git a/content/operate/kubernetes/deployment/_index.md b/content/operate/kubernetes/deployment/_index.md index 5aee514767..1c15a39ee5 100644 --- a/content/operate/kubernetes/deployment/_index.md +++ b/content/operate/kubernetes/deployment/_index.md @@ -5,18 +5,57 @@ categories: - docs - operate - kubernetes -description: This section lists the different ways to set up and run Redis Enterprise - for Kubernetes. You can deploy on variety of Kubernetes distributions both on-prem - and in the cloud via our Redis Enterprise operator for Kubernetes. -hideListLinks: false +description: Deploy Redis Enterprise for Kubernetes using the Redis Enterprise operator on various Kubernetes distributions. +hideListLinks: true linkTitle: Deployment weight: 11 --- -This section lists the different ways to set up and run Redis Enterprise for Kubernetes. You can deploy on variety of Kubernetes distributions both on-prem and in the cloud via our Redis Enterprise operator for Kubernetes. +Deploy Redis Enterprise for Kubernetes by using the Redis Enterprise operator. The operator provides a simple way to deploy and manage Redis Enterprise clusters on various Kubernetes distributions, both on-premises and in the cloud. + +The Redis Enterprise operator uses custom resource definitions (CRDs) to manage Redis Enterprise clusters (REC) and databases (REDB) as native Kubernetes resources. This approach enables GitOps workflows and Kubernetes-native operations. + +## Quick start + +Get started quickly with a basic Redis Enterprise deployment: + +- [Deploy Redis Enterprise for Kubernetes]({{< relref "/operate/kubernetes/deployment/quick-start" >}}) - Step-by-step guide for most Kubernetes distributions +- [Deploy on OpenShift]({{< relref "/operate/kubernetes/deployment/openshift" >}}) - Specific instructions for OpenShift environments + +## Deployment methods + +Choose the deployment method that best fits your environment: + +- [Deploy with Helm]({{< relref "/operate/kubernetes/deployment/helm" >}}) - Use Helm charts for simplified deployment and management +- [Deploy with operator bundle]({{< relref "/operate/kubernetes/deployment/quick-start" >}}) - Direct deployment using kubectl and operator manifests + +## Container images + +Understand the container images used by the Redis Enterprise operator: + +- [Container images]({{< relref "/operate/kubernetes/deployment/container-images" >}}) - Details about Redis Enterprise container images and registries ## Compatibility -Before installing, check [Supported Kubernetes distributions]({{< relref "/operate/kubernetes/reference/supported_k8s_distributions" >}}) to see which Redis Enterprise operator version supports your Kubernetes distribution. +Before installing, verify compatibility with your environment: + +- [Supported Kubernetes distributions]({{< relref "/operate/kubernetes/reference/supported_k8s_distributions" >}}) - Check which Redis Enterprise operator version supports your Kubernetes distribution + +## Prerequisites + +Before deploying Redis Enterprise for Kubernetes, ensure you have: + +- A Kubernetes cluster running a [supported distribution]({{< relref "/operate/kubernetes/reference/supported_k8s_distributions" >}}) +- Minimum of three worker nodes for high availability +- Kubernetes client (kubectl) configured to access your cluster +- Access to container registries (DockerHub, Red Hat Container Catalog, or private registry) +- Sufficient resources as outlined in [sizing recommendations]({{< relref "/operate/kubernetes/recommendations/sizing-on-kubernetes" >}}) + +## Next steps +After deployment, you can: +- [Create a Redis Enterprise cluster (REC)]({{< relref "/operate/kubernetes/re-clusters" >}}) +- [Create Redis Enterprise databases (REDB)]({{< relref "/operate/kubernetes/re-databases" >}}) +- [Configure networking]({{< relref "/operate/kubernetes/networking" >}}) +- [Set up security]({{< relref "/operate/kubernetes/security" >}}) \ No newline at end of file diff --git a/content/operate/kubernetes/logs/_index.md b/content/operate/kubernetes/logs/_index.md index 73eada98c5..00ba60e2c6 100644 --- a/content/operate/kubernetes/logs/_index.md +++ b/content/operate/kubernetes/logs/_index.md @@ -1,22 +1,27 @@ --- -Title: Redis Enterprise Software logs on Kubernetes +Title: Logs alwaysopen: false categories: - docs - operate - kubernetes -description: This section provides information about how logs are stored and accessed. +description: Access and manage Redis Enterprise logs on Kubernetes for monitoring and troubleshooting. hideListLinks: true linkTitle: Logs weight: 60 --- -## Logs +Access and manage Redis Enterprise logs on Kubernetes for monitoring, troubleshooting, and debugging your Redis Enterprise deployment. Logs provide valuable insights into cluster operations, database performance, and system health. -Each redis-enterprise container stores its logs under `/var/opt/redislabs/log`. -When using persistent storage this path is automatically mounted to the -`redis-enterprise-storage` volume. -This volume can easily be accessed by a sidecar, i.e. a container residing on the same pod. +## Log collection and access + +Learn how to collect and access logs from your Redis Enterprise deployment: + +- [Collect logs]({{< relref "/operate/kubernetes/logs/collect-logs" >}}) - Methods for collecting logs from Redis Enterprise pods and containers + +## Log storage and access + +Each Redis Enterprise container stores its logs under `/var/opt/redislabs/log`. When using persistent storage, this path is automatically mounted to the `redis-enterprise-storage` volume, making logs accessible through sidecar containers or external log collection tools. For example, in the REC (Redis Enterprise Cluster) spec you can add a sidecar container, such as a busybox, and mount the logs to there: diff --git a/content/operate/kubernetes/logs/collect-logs.md b/content/operate/kubernetes/logs/collect-logs.md index 808649ea3c..f0ef84fc8c 100644 --- a/content/operate/kubernetes/logs/collect-logs.md +++ b/content/operate/kubernetes/logs/collect-logs.md @@ -24,18 +24,37 @@ As of version 6.2.18-3, the log collector tool has two modes: 1. Download the latest [`log_collector.py`](https://github.com/RedisLabs/redis-enterprise-k8s-docs/blob/master/log_collector/log_collector.py) file. +1. Ensure your `kubectl` or `oc` CLI is configured to access the Kubernetes cluster you want to collect logs from. + 1. Have a K8s administrator run the script on the system that runs your `kubectl` or `oc` commands. - - Pass `-n` parameter to run on a different namespace than the one you are currently on - - Pass `-m` parameter to change the log collector mode (`all` or `restricted`) - - Run with `-h` to see more options ```bash - python log_collector.py + python log_collector.py ``` - {{< note >}} If you get an error because the yaml module is not found, install the pyYAML module with `pip install pyyaml`. - {{< /note >}} +## Options + +You can run `log_collector.py` with the following options: +| Option | Description | +|--------|-------------| +| `-n`, `--namespace` | Sets the namespace(s) to collect from. Can be set to a single namespace, or multiple namespaces (comma-separated). When left empty, will use the current context's namespace from kubeconfig. | +| `-o`, `--output_dir` | Sets the output directory. Defaults to current working directory. | +| `-a`, `--logs_from_all_pods` | Collect logs from all pods in the selected namespace(s), and otherwise collect only from the operator and pods run by the operator. | +| `-t`, `--timeout` | Time to wait for external commands to finish execution (Linux only). Default to 180s. Specify 0 to disable timeout. | +| `--k8s_cli` | The K8s cli client to use (kubectl/oc/auto-detect). Defaults to auto-detect (chooses between 'kubectl' and 'oc'). Full paths can also be used. | +| `-m`, `--mode` | Controls which resources are collected. In 'restricted' mode, only resources associated with the operator and have the label 'app=redis-enterprise' are collected. In 'all' mode, all resources are collected. Defaults to 'restricted' mode. | +| `--collect_istio` | Collect data from istio-system namespace to debug potential problems related to istio ingress method. | +| `--collect_empty_files` | Collect empty log files for missing resources. | +| `--helm_release_name` | Collect resources related to the given Helm release name. | +| `--collect_rbac_resources` | Temporary development flag. Collect all role based access control related custom resources. | +| `-h`, `--help` | Show help message and exit. | +{{< note >}} If you get an error because the yaml module is not found, install the pyYAML module with `pip install pyyaml`. +{{< /note >}} 1. Upload the resulting `tar.gz` file containing all the logs to [Redis Support](https://support.redislabs.com/). + +## RBAC requirements + +The log collector requires specific RBAC permissions depending on the collection mode. Contact your Kubernetes administrator to ensure the appropriate permissions are configured for your chosen collection mode. diff --git a/content/operate/kubernetes/networking/_index.md b/content/operate/kubernetes/networking/_index.md index b529254aa8..ebf66949ed 100644 --- a/content/operate/kubernetes/networking/_index.md +++ b/content/operate/kubernetes/networking/_index.md @@ -5,18 +5,27 @@ categories: - docs - operate - kubernetes -description: null +description: Configure networking and external access for Redis Enterprise clusters and databases on Kubernetes. hideListLinks: true linkTitle: Networking weight: 40 --- -Redis Enterprise for Kubernetes supports several ways to route external traffic to your RedisEnterpriseCluster: +Configure networking and external access for your Redis Enterprise deployment on Kubernetes. By default, Kubernetes doesn't allow external access to your Redis databases. Redis Enterprise for Kubernetes provides several methods to route external traffic to your clusters and databases. -- Ingress controllers [HAProxy](https://haproxy-ingress.github.io/) and [NGINX](https://kubernetes.github.io/ingress-nginx/) require an `ingress` API resource. -- [Istio](https://istio.io/latest/docs/setup/getting-started/) requires `Gateway` and `VirtualService` API resources. -- OpenShift uses [routes]({{< relref "/operate/kubernetes/networking/routes" >}}) to route external traffic. -- The RedisEnterpriseActiveActiveDatabase (REAADB) requires any of the above routing methods to be configured in the RedisEnterpriseCluster (REC) with the `ingressOrRouteSpec` field. +## External routing methods + +Choose the appropriate method for your environment to enable external access: + +- [Ingress routing]({{< relref "/operate/kubernetes/networking/ingress" >}}) - Use NGINX or HAProxy ingress controllers with `ingress` API resources +- [Istio ingress routing]({{< relref "/operate/kubernetes/networking/istio-ingress" >}}) - Use Istio service mesh with `Gateway` and `VirtualService` API resources +- [OpenShift routes]({{< relref "/operate/kubernetes/networking/routes" >}}) - Use OpenShift-specific route resources for external traffic + +## Automatic ingress configuration + +For Active-Active databases, configure automatic ingress creation: + +- [REC external routing]({{< relref "/operate/kubernetes/networking/ingressorroutespec" >}}) - Use `ingressOrRouteSpec` field in RedisEnterpriseCluster (REC) for automatic ingress creation ## External routing using Redis Enterprise for Kubernetes diff --git a/content/operate/kubernetes/re-clusters/_index.md b/content/operate/kubernetes/re-clusters/_index.md index d083222257..e1019e181e 100644 --- a/content/operate/kubernetes/re-clusters/_index.md +++ b/content/operate/kubernetes/re-clusters/_index.md @@ -5,13 +5,46 @@ categories: - docs - operate - kubernetes -description: Articles to help you manage your Redis Enterprise clusters (REC). -hideListLinks: false +description: Create and manage Redis Enterprise clusters (REC) on Kubernetes using the Redis Enterprise operator. +hideListLinks: true linkTitle: Redis Enterprise clusters (REC) weight: 30 --- -This section contains articles to help you manage your Redis Enterprise clusters (REC). +A Redis Enterprise cluster (REC) is a custom Kubernetes resource that represents a Redis Enterprise cluster deployment. The Redis Enterprise operator manages the lifecycle of REC resources, including deployment, scaling, upgrades, and recovery operations. +REC resources define the cluster configuration, including node specifications, storage requirements, security settings, and networking configuration. After you deploy the cluster, it provides a foundation for creating and managing Redis Enterprise databases (REDB). +## Cluster management +Manage your Redis Enterprise cluster lifecycle and configuration: + +- [Connect to admin console]({{< relref "/operate/kubernetes/re-clusters/connect-to-admin-console" >}}) - Access the Redis Enterprise web UI for cluster management +- [Multi-namespace deployment]({{< relref "/operate/kubernetes/re-clusters/multi-namespace" >}}) - Deploy clusters across multiple Kubernetes namespaces +- [Delete custom resources]({{< relref "/operate/kubernetes/re-clusters/delete-custom-resources" >}}) - Safely remove REC and related resources + +## Storage and performance + +Optimize storage and performance for your Redis Enterprise cluster: + +- [Auto Tiering]({{< relref "/operate/kubernetes/re-clusters/auto-tiering" >}}) - Configure automatic data tiering between RAM and flash storage +- [Expand PVC]({{< relref "/operate/kubernetes/re-clusters/expand-pvc" >}}) - Expand persistent volume claims for additional storage + +## Monitoring and observability + +Monitor cluster health and performance: + +- [Connect to Prometheus operator]({{< relref "/operate/kubernetes/re-clusters/connect-prometheus-operator" >}}) - Integrate with Prometheus for metrics collection and monitoring + +## Recovery and troubleshooting + +Handle cluster recovery and troubleshooting scenarios: + +- [Cluster recovery]({{< relref "/operate/kubernetes/re-clusters/cluster-recovery" >}}) - Recover from cluster failures and restore operations + +## Related topics + +- [Redis Enterprise databases (REDB)]({{< relref "/operate/kubernetes/re-databases" >}}) - Create and manage databases on your cluster +- [Security]({{< relref "/operate/kubernetes/security" >}}) - Configure security settings for your cluster +- [Networking]({{< relref "/operate/kubernetes/networking" >}}) - Set up networking and ingress for cluster access +- [REC API reference]({{< relref "/operate/kubernetes/reference/redis_enterprise_cluster_api" >}}) - Complete API specification for REC resources diff --git a/content/operate/kubernetes/re-databases/_index.md b/content/operate/kubernetes/re-databases/_index.md index f85e40e8d6..35ab03cece 100644 --- a/content/operate/kubernetes/re-databases/_index.md +++ b/content/operate/kubernetes/re-databases/_index.md @@ -5,13 +5,51 @@ categories: - docs - operate - kubernetes -description: Articles to help you manage your Redis Enterprise databases (REDBs). -hideListLinks: false +description: Create and manage Redis Enterprise databases (REDB) on Kubernetes using the Redis Enterprise operator. +hideListLinks: true linkTitle: Redis Enterprise databases (REDB) weight: 31 --- -This section contains articles to help you manage your Redis Enterprise databases (REDBs). +A Redis Enterprise database (REDB) is a custom Kubernetes resource that represents a Redis database running on a Redis Enterprise cluster. The Redis Enterprise operator manages REDB resources and handles database creation, configuration, scaling, and lifecycle operations. +REDB resources define database specifications including memory limits, persistence settings, security configurations, networking options, and Redis modules. You can deploy databases on existing Redis Enterprise clusters (REC) and manage them by using standard Kubernetes tools and workflows. +## Database management +Create and manage Redis Enterprise databases on your cluster: + +- [Database controller]({{< relref "/operate/kubernetes/re-databases/db-controller" >}}) - Understand how the database controller manages REDB resources and database lifecycle + +## Replication and high availability + +Set up database replication for high availability and disaster recovery: + +- [Create replica databases]({{< relref "/operate/kubernetes/re-databases/replica-redb" >}}) - Configure replica databases for read scaling and disaster recovery scenarios + +## Advanced database configurations + +Explore advanced database features and configurations: + +- [Active-Active databases]({{< relref "/operate/kubernetes/active-active" >}}) - Set up globally distributed Active-Active databases across multiple Kubernetes clusters + +## Database connectivity + +Connect applications to your Redis Enterprise databases: + +- [Networking]({{< relref "/operate/kubernetes/networking" >}}) - Configure ingress, routes, and service exposure for database access +- [Security]({{< relref "/operate/kubernetes/security" >}}) - Set up TLS, authentication, and access control for secure database connections + +## Monitoring and troubleshooting + +Monitor database performance and troubleshoot issues: + +- [Logs]({{< relref "/operate/kubernetes/logs" >}}) - Collect and analyze database logs for troubleshooting +- [Connect to Prometheus operator]({{< relref "/operate/kubernetes/re-clusters/connect-prometheus-operator" >}}) - Monitor database metrics with Prometheus + +## Related topics + +- [Redis Enterprise clusters (REC)]({{< relref "/operate/kubernetes/re-clusters" >}}) - Manage the underlying cluster infrastructure +- [REDB API reference]({{< relref "/operate/kubernetes/reference/redis_enterprise_database_api" >}}) - Complete API specification for REDB resources +- [Active-Active database API]({{< relref "/operate/kubernetes/reference/redis_enterprise_active_active_database_api" >}}) - API reference for Active-Active databases +- [Remote cluster API]({{< relref "/operate/kubernetes/reference/redis_enterprise_remote_cluster_api" >}}) - API reference for remote cluster configurations diff --git a/content/operate/kubernetes/recommendations/_index.md b/content/operate/kubernetes/recommendations/_index.md index c7a59c2d1a..5980a3f20f 100644 --- a/content/operate/kubernetes/recommendations/_index.md +++ b/content/operate/kubernetes/recommendations/_index.md @@ -5,14 +5,29 @@ categories: - docs - operate - kubernetes -description: Settings and configuration recommendations for your Redis Enterprise - deployment. +description: Best practices and configuration recommendations for Redis Enterprise on Kubernetes deployments. hideListLinks: false linkTitle: Recommendations weight: 80 --- -This section contains recommended settings and configuration for your Redis Enterprise for Kubernetes deployment. +Follow these best practices and configuration recommendations to optimize your Redis Enterprise deployment on Kubernetes for performance, reliability, and scalability. +## Infrastructure recommendations +Configure your Kubernetes infrastructure for optimal Redis Enterprise performance: +- [Node resources]({{< relref "/operate/kubernetes/recommendations/node-resources" >}}) - CPU, memory, and resource allocation recommendations +- [Node selection]({{< relref "/operate/kubernetes/recommendations/node-selection" >}}) - Best practices for selecting and configuring Kubernetes nodes +- [Persistent volumes]({{< relref "/operate/kubernetes/recommendations/persistent-volumes" >}}) - Storage configuration and persistent volume recommendations + +## Deployment recommendations + +Optimize your Redis Enterprise deployment configuration: + +- [Sizing on Kubernetes]({{< relref "/operate/kubernetes/recommendations/sizing-on-kubernetes" >}}) - Guidelines for sizing clusters and databases +- [Pod stability]({{< relref "/operate/kubernetes/recommendations/pod-stability" >}}) - Ensure stable pod operations and prevent disruptions + +## Performance optimization + +Configure your deployment for optimal performance and reliability based on your workload requirements and infrastructure capabilities. diff --git a/content/operate/kubernetes/reference/_index.md b/content/operate/kubernetes/reference/_index.md index a72577160c..6a1196188c 100644 --- a/content/operate/kubernetes/reference/_index.md +++ b/content/operate/kubernetes/reference/_index.md @@ -5,14 +5,99 @@ categories: - docs - operate - kubernetes -description: Reference material for the operator, cluster, and database deployment - options. -hideListLinks: false +description: API reference and guides for managing Redis Enterprise custom resources on Kubernetes. +hideListLinks: true linkTitle: Reference weight: 89 --- -This section contains the API reference for Redis custom resources and supported distributions. +Reference documentation for Redis Enterprise custom resources, including API specifications and practical guides for creating, configuring, and managing Redis Enterprise deployments on Kubernetes. +## Working with custom resources +Redis Enterprise for Kubernetes uses custom resources to manage clusters and databases. You can create, modify, and delete these resources using standard Kubernetes tools. +### Creating custom resources + +Create custom resources using `kubectl apply` with YAML manifests: + +```bash +kubectl apply -f my-redis-cluster.yaml +kubectl apply -f my-redis-database.yaml +``` + +### Viewing custom resources + +List and inspect existing custom resources: + +```bash +# List Redis Enterprise clusters +kubectl get rec + +# List Redis Enterprise databases +kubectl get redb + +# List Active-Active databases +kubectl get reaadb + +# List remote clusters +kubectl get rerc + +# Get detailed information about a specific resource +kubectl describe rec my-cluster +kubectl describe redb my-database +``` + +### Modifying custom resources + +Update custom resources by editing the YAML manifest and reapplying: + +```bash +# Edit and apply updated manifest +kubectl apply -f updated-redis-cluster.yaml + +# Or edit directly (not recommended for production) +kubectl edit rec my-cluster +kubectl edit redb my-database +``` + +### Deleting custom resources + +Remove custom resources when no longer needed: + +```bash +kubectl delete redb my-database +kubectl delete rec my-cluster +``` + +**Important:** Always delete databases (REDB) before deleting the cluster (REC) to ensure proper cleanup. + +## API reference + +Complete API specifications for all Redis Enterprise custom resources: + +### Core resources + +- [Redis Enterprise cluster API (REC)]({{< relref "/operate/kubernetes/reference/redis_enterprise_cluster_api" >}}) - Manage Redis Enterprise clusters +- [Redis Enterprise database API (REDB)]({{< relref "/operate/kubernetes/reference/redis_enterprise_database_api" >}}) - Manage Redis databases + +### Active-Active resources + +- [Active-Active database API (REAADB)]({{< relref "/operate/kubernetes/reference/redis_enterprise_active_active_database_api" >}}) - Manage Active-Active databases +- [Remote cluster API (RERC)]({{< relref "/operate/kubernetes/reference/redis_enterprise_remote_cluster_api" >}}) - Configure remote cluster connections + +## Compatibility + +Information about supported Kubernetes distributions and versions: + +- [Supported Kubernetes distributions]({{< relref "/operate/kubernetes/reference/supported_k8s_distributions" >}}) - Compatible Kubernetes platforms and versions + +## Best practices + +When working with custom resources: + +- **Use version control**: Store your YAML manifests in version control systems +- **Validate before applying**: Use `kubectl apply --dry-run=client` to validate changes +- **Monitor resource status**: Check resource status after applying changes +- **Follow naming conventions**: Use consistent naming for easier management +- **Document configurations**: Add annotations and labels to describe resource purpose \ No newline at end of file diff --git a/content/operate/kubernetes/security/_index.md b/content/operate/kubernetes/security/_index.md index bfa38e1a6b..58462bf151 100644 --- a/content/operate/kubernetes/security/_index.md +++ b/content/operate/kubernetes/security/_index.md @@ -5,12 +5,31 @@ categories: - docs - operate - kubernetes -description: Security settings and configuration for Redis Enterprise for Kubernetes -hideListLinks: false +description: Configure security settings for Redis Enterprise clusters and databases on Kubernetes. +hideListLinks: true linkTitle: Security weight: 50 --- -This section contains security settings and configuration for Redis Enterprise for Kubernetes. +Configure security settings for your Redis Enterprise deployment on Kubernetes. Redis Enterprise for Kubernetes provides comprehensive security features including TLS encryption, authentication, access control, and certificate management. +## Credentials and authentication +Manage cluster credentials and authentication settings: + +- [Manage REC credentials]({{< relref "/operate/kubernetes/security/manage-rec-credentials" >}}) - Configure and manage Redis Enterprise cluster credentials +- [LDAP authentication]({{< relref "/operate/kubernetes/security/ldap" >}}) - Integrate with LDAP for centralized authentication + +## Certificates and encryption + +Configure TLS certificates and encryption for secure communications: + +- [Manage REC certificates]({{< relref "/operate/kubernetes/security/manage-rec-certificates" >}}) - Configure cluster certificates for TLS encryption +- [Add client certificates]({{< relref "/operate/kubernetes/security/add-client-certificates" >}}) - Set up client certificate authentication for databases +- [Internode encryption]({{< relref "/operate/kubernetes/security/internode-encryption" >}}) - Enable encryption between cluster nodes + +## Resource management + +Configure security-related resource settings: + +- [Allow resource adjustment]({{< relref "/operate/kubernetes/security/allow-resource-adjustment" >}}) - Enable automatic adjustment of system resources for security compliance diff --git a/content/operate/kubernetes/upgrade/_index.md b/content/operate/kubernetes/upgrade/_index.md index 11122f7c28..c45319c34c 100644 --- a/content/operate/kubernetes/upgrade/_index.md +++ b/content/operate/kubernetes/upgrade/_index.md @@ -5,23 +5,30 @@ categories: - docs - operate - kubernetes -description: Information about upgrading your Redis Enterprise cluster on Kubernetes. -hideListLinks: true +description: Upgrade Redis Enterprise operator, clusters, and databases on Kubernetes. +hideListLinks: false linkTitle: Upgrade weight: 15 --- -The upgrade process includes updating three components: +Keep your Redis Enterprise deployment up to date with the latest features, security patches, and bug fixes. The upgrade process involves updating three main components in sequence: the Redis Enterprise operator, Redis Enterprise clusters (REC), and Redis Enterprise databases (REDB). - 1. Upgrade the Redis Enterprise operator - 2. Upgrade the Redis Enterprise cluster (REC) - 3. Upgrade Redis Enterprise databases (REDB) +## Upgrade methods -If you installed using Helm charts, see [Upgrade the chart]({{}}) for Helm-specific upgrade instructions. +Choose the appropriate upgrade method for your deployment: -If you are using OpenShift, see [Upgrade Redis Enterprise with OpenShift CLI]({{}}) or [Upgrade Redis Enterprise with OpenShift OperatorHub]({{}}). +- [Upgrade Redis Enterprise for Kubernetes]({{}}) - Standard upgrade process for most Kubernetes distributions +- [Upgrade with OpenShift CLI]({{}}) - OpenShift-specific upgrade using CLI tools +- [Upgrade with OpenShift OperatorHub]({{}}) - Upgrade using OpenShift OperatorHub and OLM +- [Upgrade with Helm]({{}}) - Helm-specific upgrade instructions for chart-based deployments -For all other Kubernetes distributions, see [Upgrade Redis Enterprise for Kubernetes]({{}}). +## Upgrade process + +The upgrade process includes updating three components in order: + +1. **Upgrade the Redis Enterprise operator** - Update the operator to the latest version +2. **Upgrade the Redis Enterprise cluster (REC)** - Update cluster nodes and infrastructure +3. **Upgrade Redis Enterprise databases (REDB)** - Update database versions and configurations ## Upgrade compatibility diff --git a/content/operate/kubernetes/upgrade/upgrade-redis-cluster.md b/content/operate/kubernetes/upgrade/upgrade-redis-cluster.md index 746daeea68..03b17202f8 100644 --- a/content/operate/kubernetes/upgrade/upgrade-redis-cluster.md +++ b/content/operate/kubernetes/upgrade/upgrade-redis-cluster.md @@ -1,5 +1,5 @@ --- -Title: Upgrade Redis Enterprise for Kubernetes 7.8.2-6 +Title: Upgrade Redis Enterprise for Kubernetes alwaysopen: false categories: - docs @@ -19,25 +19,25 @@ Redis implements rolling updates for software upgrades in Kubernetes deployments ## Prerequisites -The following steps ensure you have the minimum versions of all components necessary to upgrade to 7.8.2-6. **Without these minimum versions, the upgrade will freeze and require manual recovery.** +Before upgrading, ensure you have the minimum versions of all components necessary for your target version. **Without these minimum versions, the upgrade may freeze and require manual recovery.** See the [troubleshooting](#troubleshooting) section for details on recovering a failed upgrade. ### Kubernetes version -Check [Supported Kubernetes distributions]({{}}) to make sure your Kubernetes distribution is supported by 7.8.2-6. If not, upgrade your Kubernetes distribution before upgrading the Redis operator. +Check [Supported Kubernetes distributions]({{}}) to make sure your Kubernetes distribution is supported by your target Redis Enterprise operator version. If not, upgrade your Kubernetes distribution before upgrading the Redis operator. ### Redis operator version -Your Redis Enterprise clusters must be running version 7.4.2-2 or later before upgrading to 7.8.2-6. See the [7.4 upgrade](https://redis.io/docs/latest/operate/kubernetes/7.4.6/upgrade/upgrade-redis-cluster/) for detailed steps. +Check the [Redis Enterprise for Kubernetes release notes]({{}}) for the minimum operator version required for your target upgrade. Some versions may require intermediate upgrades. ### Redis database version -Your Redis databases must be running version 7.2 or later before upgrading your cluster version to 7.8.2-6. See [upgrade databases](#upgrade-databases) for detailed steps. You can find your database version in the [REDB `spec.redisVersion` field]({{}}). +Check the release notes for your target version to determine the minimum Redis database version required. See [upgrade databases](#upgrade-databases) for detailed steps. You can find your database version in the [REDB `spec.redisVersion` field]({{}}). -### RHEL9-compatible modules +### Module compatibility -Upgrading to Redis operator version 7.8.2-6 involves migrating your Redis Enterprise nodes to RHEL9 from either Ubuntu 18 or RHEL8. If your databases use modules, you need to manually install modules compatible with RHEL9. +Some Redis Enterprise operator versions may require specific module versions or involve changes to the underlying operating system. If your databases use modules, check the release notes for your target version to determine if you need to manually install updated modules. To see which modules you have installed, run: @@ -70,7 +70,7 @@ helm upgrade redis/redis-enterprise-operator --version ``` For OpenShift installations, include the `openshift.mode=true` parameter: @@ -160,7 +160,7 @@ We recommend upgrading the REC as soon as possible after updating the operator. The Redis Enterprise cluster (REC) can be updated automatically or manually. To trigger automatic upgrade of the REC after the operator upgrade completes, specify `autoUpgradeRedisEnterprise: true` in your REC spec. If you don't have automatic upgrade enabled, follow the below steps for the manual upgrade. -Before beginning the upgrade of the Redis Enterprise cluster, check the [Redis Enterprise for Kubernetes release notes]({{}}) to find the Redis Enterprise image tag. +Before beginning the upgrade of the Redis Enterprise cluster, check the [Redis Enterprise for Kubernetes release notes]({{}}) to find the Redis Enterprise image tag for your target version. After the operator upgrade is complete, you can upgrade Redis Enterprise cluster (REC). @@ -216,7 +216,7 @@ kubectl rollout status sts ### Upgrade databases -After the cluster is upgraded, you can upgrade your databases. To upgrade your REDB, specify your new database version in the `spec.redisVersion` field in the REDB custom resources. Supported database versions for operator versions include `"7.2"` and `"7.4"` (note this value is a string). +After the cluster is upgraded, you can upgrade your databases. To upgrade your REDB, specify your new database version in the `spec.redisVersion` field in the REDB custom resources. Check the release notes for your operator version to see which database versions are supported (note this value is a string). To upgrade your REAADB, see [Upgrade an Active-Active database]({{}}) for details on the `rladmin` and `crdb-cli` commands required. Reach out to Redis support if you have additional questions. diff --git a/data/components/go_redis.json b/data/components/go_redis.json index 80fb21a602..3c68eb6a56 100644 --- a/data/components/go_redis.json +++ b/data/components/go_redis.json @@ -9,7 +9,6 @@ }, "examples": { "git_uri": "https://github.com/redis/go-redis", - "dev_branch": "master", "path": "doctests", "pattern": "*_test.go" } diff --git a/data/components/index.json b/data/components/index.json index ff8b8f4518..b3b60fb253 100644 --- a/data/components/index.json +++ b/data/components/index.json @@ -17,21 +17,11 @@ "redis_vl" ], "assets": [], - "_assets": [ - "stack_theme", - "redis_cli" - ], "website": { "path": "./", "content": "content/", "examples": "data/examples.json", "examples_path": "examples", - "commands": "data/commands.json", - "groups": "data/groups.json", - "versions": "data/versions.json", - "repos": "data/repos.json", - "meta": "data/meta.json", - "languages": "data/languages.json", - "tool_types": "data/tool_types.json" + "commands": "data/commands.json" } } diff --git a/data/components/index_migrate.json b/data/components/index_migrate.json deleted file mode 100644 index caba3e5dea..0000000000 --- a/data/components/index_migrate.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "id": "index", - "name": "All", - "description": "Use this file to add components that represent external resources.", - "type": "stack", - "core": [ - "redis_docs" - ], - "docs": [ - "stack_docs" - ], - "clients": [ - "nredisstack", - "go_redis", - "node_redis", - "redis_py", - "jedis" - ], - "modules": [ - "redisearch", - "redisjson", - "redistimeseries", - "redisbloom", - "redisgears" - ], - "assets": [], - "_assets": [ - "stack_theme", - "redis_cli" - ], - "website": { - "path": "./", - "content": "content/tmp", - "examples": "data/examples.json", - "examples_path": "examples", - "commands": "data/commands.json", - "groups": "data/groups.json", - "versions": "data/versions.json", - "repos": "data/repos.json", - "meta": "data/meta.json", - "languages": "data/languages.json", - "tool_types": "data/tool_types.json" - } -} diff --git a/data/components/jedis.json b/data/components/jedis.json index c7486b6f92..bac07b20fe 100644 --- a/data/components/jedis.json +++ b/data/components/jedis.json @@ -9,7 +9,6 @@ }, "examples": { "git_uri": "https://github.com/redis/jedis", - "dev_branch": "master", "path": "src/test/java/io/redis/examples", "pattern": "*.java" } diff --git a/data/components/lettuce_async.json b/data/components/lettuce_async.json index 78aacc4e7a..619cfb3553 100644 --- a/data/components/lettuce_async.json +++ b/data/components/lettuce_async.json @@ -9,7 +9,6 @@ }, "examples": { "git_uri": "https://github.com/redis/lettuce", - "dev_branch": "main", "path": "src/test/java/io/redis/examples/async", "pattern": "*.java" } diff --git a/data/components/lettuce_reactive.json b/data/components/lettuce_reactive.json index 2ff9abf9cd..912aeee3ce 100644 --- a/data/components/lettuce_reactive.json +++ b/data/components/lettuce_reactive.json @@ -9,7 +9,6 @@ }, "examples": { "git_uri": "https://github.com/redis/lettuce", - "dev_branch": "main", "path": "src/test/java/io/redis/examples/reactive", "pattern": "*.java" } diff --git a/data/components/node_redis.json b/data/components/node_redis.json index a4a4e8a219..d169dabe3a 100644 --- a/data/components/node_redis.json +++ b/data/components/node_redis.json @@ -9,7 +9,6 @@ }, "examples": { "git_uri": "https://github.com/redis/node-redis", - "dev_branch": "master", "path": "doctests", "pattern": "*.js" } diff --git a/data/components/nredisstack.json b/data/components/nredisstack.json index 4283fdd498..e32c55b8d0 100644 --- a/data/components/nredisstack.json +++ b/data/components/nredisstack.json @@ -9,7 +9,6 @@ }, "examples": { "git_uri": "https://github.com/redis/NRedisStack", - "dev_branch": "master", "path": "tests/Doc", "pattern": "*.cs" } diff --git a/data/components/redis_cli.json b/data/components/redis_cli.json deleted file mode 100644 index 982a3501a0..0000000000 --- a/data/components/redis_cli.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "id": "redis_cli", - "type": "asset", - "name": "Redis clinterwebz", - "repository": { - "git_uri": "https://github.com/redis/redis-clinterwebz", - "dev_branch": "master", - "payload": [ - { - "src": "interwebz/static/css/cli.css", - "dst": "static/css/cli.css" - }, - { - "src": "interwebz/static/js/cli.js", - "dst": "static/js/cli.js", - "search": "const API_URL = '/'", - "replace": "const API_URL = 'http://13.59.16.114'" - } - ] - } -} \ No newline at end of file diff --git a/data/components/redis_docs.json b/data/components/redis_docs.json deleted file mode 100644 index 4b9e621362..0000000000 --- a/data/components/redis_docs.json +++ /dev/null @@ -1,137 +0,0 @@ -{ - "id": "redis_docs", - "type": "core", - "name": "Redis", - "stack_path": "docs", - "description": "Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker. Redis provides data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes, and streams. Redis has built-in replication, Lua scripting, LRU eviction, transactions, and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster", - "repository": { - "git_uri": "https://github.com/redis/redis", - "dev_branch": "unstable" - }, - "config_file_template": "management/config-file.md", - "commands": { - "git_uri": "https://github.com/redis/redis-doc", - "dev_branch": "master", - "defs": "commands.json", - "path": "commands", - "payload": [ - { - "src": "_index.md" - } - ] - }, - "groups": { - "bitmap": { - "display": "Bitmap", - "description": "Operations on the Bitmap data type", - "weight": 0 - }, - "cluster": { - "display": "Cluster management", - "description": "Cluster management operations", - "weight": 0 - }, - "connection": { - "display": "Connection management", - "description": "Client connections management", - "weight": 0 - }, - "generic": { - "display": "Generic", - "description": "Generic commands", - "weight": 0 - }, - "geo": { - "display": "Geospatial indices", - "description": "Operations on the Geospatial Index data type", - "weight": 0 - }, - "hash": { - "display": "Hash", - "description": "Operations on the Hash data type", - "weight": 0 - }, - "hyperloglog": { - "display": "HyperLogLog", - "description": "Operations on the HyperLogLog data type", - "weight": 0 - }, - "list": { - "display": "List", - "description": "Operations on the List data type", - "weight": 0 - }, - "pubsub": { - "display": "Pub/Sub", - "description": "Pub/Sub commands", - "weight": 0 - }, - "scripting": { - "display": "Scripting and Functions", - "description": "Redis server-side scripting and functions", - "weight": 0 - }, - "server": { - "display": "Server management", - "description": "Server management commands", - "weight": 0 - }, - "set": { - "display": "Set", - "description": "Operations on the Set data type", - "weight": 0 - }, - "sorted-set": { - "display": "Sorted Set", - "description": "Operations on the Sorted Set data type", - "weight": 0 - }, - "stream": { - "display": "Stream", - "description": "Operations on the Stream data type", - "weight": 0 - }, - "string": { - "display": "String", - "description": "Operations on the String data type", - "weight": 0 - }, - "transactions": { - "display": "Transactions", - "description": "Redis Transaction management", - "weight": 0 - } - }, - "docs": { - "git_uri": "https://github.com/redis/redis-doc", - "dev_branch": "master", - "path": "docs" - }, - "data": { - "git_uri": "https://github.com/redis/redis-doc", - "dev_branch": "master", - "languages": "languages.json", - "resp2_replies": "resp2_replies.json", - "resp3_replies": "resp3_replies.json", - "tool_types": "tool_types.json", - "clients": "clients/", - "libraries": "libraries/", - "modules": "modules/", - "tools": "tools/" - }, - "misc": { - "git_uri": "https://github.com/redis/redis-doc", - "dev_branch": "master", - "payload": [ - { - "src": "_index.md" - }, - { - "src": "community/" - }, - { - "src": "resources/" - } - ] - } -} diff --git a/data/components/redis_py.json b/data/components/redis_py.json index dd93419c5a..9a1dc30731 100644 --- a/data/components/redis_py.json +++ b/data/components/redis_py.json @@ -9,7 +9,6 @@ }, "examples": { "git_uri": "https://github.com/redis/redis-py", - "dev_branch": "master", "path": "doctests", "pattern": "*.py" } diff --git a/data/components/redis_vl.json b/data/components/redis_vl.json index bd05667239..e8215367f7 100644 --- a/data/components/redis_vl.json +++ b/data/components/redis_vl.json @@ -9,7 +9,6 @@ }, "examples": { "git_uri": "https://github.com/redis/redis-vl-python", - "dev_branch": "main", "path": "doctests", "pattern": "*.py" } diff --git a/data/components/redisbloom.json b/data/components/redisbloom.json deleted file mode 100644 index 63a71484ca..0000000000 --- a/data/components/redisbloom.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "id": "redisbloom", - "module_id": "bf", - "type": "module", - "name": "Bloom", - "description": "Probabilistic Data Structures", - "stack_path": "docs/data-types/probabilistic", - "stack_weight": 140, - "repository": { - "git_uri": "https://github.com/redisbloom/redisbloom" - }, - "commands": { - "git_uri": "https://github.com/redisbloom/redisbloom", - "dev_branch": "master", - "defs": "commands.json", - "path": "docs/commands" - }, - "groups": { - "bf": { - "display": "Bloom Filter", - "description": "Operations on the Bloom Filter data type" - }, - "cf": { - "display": "Cuckoo Filter", - "description": "Operations on the Cuckoo Filter data type" - }, - "cms": { - "display": "Count-min Sketch", - "description": "Operations on the Count-min Sketch data type" - }, - "tdigest": { - "display": "T-Digest", - "description": "Operations on the T-Digest data type" - }, - "topk": { - "display": "Top-K", - "description": "Operations on the Top-K data type" - } - }, - "docs": { - "git_uri": "https://github.com/redisbloom/redisbloom", - "dev_branch": "master", - "path": "docs/docs" - }, - "releases": { - "source": "docs", - "tags": true, - "include_tag_regex": "v([0-9]+\\.[0-9]+\\.[0-9]+)", - "exclude_tag_regexes": [], - "include_branch_regex": "([0-9]+\\.[0-9])", - "exclude_branch_regexes": [] - } -} \ No newline at end of file diff --git a/data/components/redisearch.json b/data/components/redisearch.json deleted file mode 100644 index 901cbfee1d..0000000000 --- a/data/components/redisearch.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "id": "redisearch", - "module_id": "search", - "type": "module", - "name": "Search", - "description": "Secondary index operations", - "stack_path": "docs/interact/search-and-query", - "stack_weight": 10, - "repository": { - "git_uri": "https://github.com/redisearch/redisearch" - }, - "commands": { - "git_uri": "https://github.com/redisearch/redisearch", - "dev_branch": "master", - "defs": "commands.json", - "path": "docs/commands" - }, - "groups": { - "search": { - "display": "Search", - "description": "Secondary index and free text search operations" - }, - "suggestion": { - "display": "Auto-Suggest", - "description": "Operations on the Auto-Suggest data type" - } - }, - "docs": { - "git_uri": "https://github.com/redisearch/redisearch", - "dev_branch": "master", - "path": "docs/docs" - }, - "releases": { - "source": "docs", - "tags": true, - "include_tag_regex": "v([0-9]+\\.[0-9]+\\.[0-9]+)", - "exclude_tag_regexes": [], - "include_branch_regex": "([0-9]+\\.[0-9])", - "exclude_branch_regexes": [] - } -} diff --git a/data/components/redisgears.json b/data/components/redisgears.json deleted file mode 100644 index 12719cea51..0000000000 --- a/data/components/redisgears.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "id": "redisgears", - "module_id": "triggers-and-functions", - "type": "module", - "name": "Triggers and functions", - "description": "React to database events and execute functions", - "stack_path": "docs/interact/programmability/triggers-and-functions", - "stack_weight": 16, - "repository": { - "git_uri": "https://github.com/RedisGears/RedisGears" - }, - "commands": { - "git_uri": "https://github.com/RedisGears/RedisGears", - "dev_branch": "master", - "defs": "commands.json", - "path": "docs/commands" - }, - "groups": { - "triggers_and_functions": { - "display": "Triggers and functions", - "description": "React to database events and execute functions" - } - }, - "docs": { - "git_uri": "https://github.com/RedisGears/RedisGears", - "dev_branch": "master", - "path": "docs/docs" - }, - "release": { - "source": "docs", - "tags": true, - "include_tag_regex": "v([0-9]+\\.[0-9]+\\.[0-9]+)", - "exclude_tag_regexes": [], - "include_branch_regex": "([0-9]+\\.[0-9])", - "exclude_branch_regexes": [] - } -} diff --git a/data/components/redisjson.json b/data/components/redisjson.json deleted file mode 100644 index ed7caf6444..0000000000 --- a/data/components/redisjson.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "id": "redisjson", - "module_id": "ReJSON", - "type": "module", - "name": "JSON", - "description": "JSON data structure", - "stack_path": "docs/data-types/json", - "stack_weight": 11, - "repository": { - "git_uri": "https://github.com/redisjson/redisjson" - }, - "commands": { - "git_uri": "https://github.com/redisjson/redisjson", - "dev_branch": "master", - "defs": "commands.json", - "path": "docs/commands" - }, - "groups": { - "json": { - "display": "JSON", - "description": "Operations on the JSON data type" - } - }, - "docs": { - "git_uri": "https://github.com/redisjson/redisjson", - "dev_branch": "master", - "path": "docs/docs" - }, - "releases": { - "source": "docs", - "tags": true, - "include_tag_regex": "v([0-9]+\\.[0-9]+\\.[0-9]+)", - "exclude_tag_regexes": [], - "include_branch_regex": "([0-9]+\\.[0-9])", - "exclude_branch_regexes": [] - } -} diff --git a/data/components/redistimeseries.json b/data/components/redistimeseries.json deleted file mode 100644 index f71bbe7028..0000000000 --- a/data/components/redistimeseries.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "id": "redistimeseries", - "module_id": "timeseries", - "type": "module", - "name": "TimeSeries", - "description": "Time series data structure", - "stack_path": "docs/data-types/timeseries", - "stack_weight": 150, - "repository": { - "git_uri": "https://github.com/redistimeseries/redistimeseries" - }, - "commands": { - "git_uri": "https://github.com/redistimeseries/redistimeseries", - "dev_branch": "master", - "defs": "commands.json", - "path": "docs/commands" - }, - "groups": { - "timeseries": { - "display": "Time series", - "description": "Operations on the time series data type" - } - }, - "docs": { - "git_uri": "https://github.com/redistimeseries/redistimeseries", - "dev_branch": "master", - "path": "docs/docs" - }, - "releases": { - "source": "docs", - "tags": true, - "include_tag_regex": "v([0-9]+\\.[0-9]+\\.[0-9]+)", - "exclude_tag_regexes": [], - "include_branch_regex": "([0-9]+\\.[0-9])", - "exclude_branch_regexes": [] - } -} diff --git a/data/components/stack_docs.json b/data/components/stack_docs.json deleted file mode 100644 index 74cc353c6c..0000000000 --- a/data/components/stack_docs.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "id": "stack_docs", - "type": "docs", - "name": "Redis Stack", - "description": "Redis Stack docs", - "stack_path": "docs", - "misc": { - "git_uri": "https://github.com/redis-stack/redis-stack-docs", - "dev_branch": "main", - "payload": [ - { - "src": "community/" - }, - { - "src": "download/" - }, - { - "src": "support/" - }, - { - "src": "terms/" - }, - { - "src": "about/", - "dst": "docs/about/", - "proc_md": true - }, - { - "src": "docs/stack/get-started", - "dst": "docs/", - "proc_md": true - }, - { - "src": "docs/stack/install/install-stack", - "dst": "docs/install/", - "proc_md": true - }, - { - "src": "docs/stack/clients/om-clients", - "dst": "docs/connect/clients/", - "proc_md": true - }, - { - "src": "docs/stack/about", - "dst": "docs/", - "proc_md": true - }, - { - "src": "docs/ui/insight", - "dst": "docs/connect", - "proc_md": true - } - ] - } -} diff --git a/data/components/stack_theme.json b/data/components/stack_theme.json deleted file mode 100644 index 6ed20b85fb..0000000000 --- a/data/components/stack_theme.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "id": "stack_theme", - "type": "asset", - "name": "Redis Stack theme", - "repository": { - "git_uri": "https://github.com/redis-stack/redis-website-new-design", - "dev_branch": "master", - "private": true, - "payload": [ - { - "src": "config.toml" - }, - { - "src": "assets/" - }, - { - "src": "layouts/" - }, - { - "src": "static/" - } - ] - } -} diff --git a/data/groups.json b/data/groups.json deleted file mode 100644 index d0c28d3598..0000000000 --- a/data/groups.json +++ /dev/null @@ -1,136 +0,0 @@ -{ - "core": { - "bitmap": { - "display": "Bitmap", - "description": "Operations on the Bitmap data type", - "weight": 0 - }, - "cluster": { - "display": "Cluster management", - "description": "Cluster management operations", - "weight": 0 - }, - "connection": { - "display": "Connection management", - "description": "Client connections management", - "weight": 0 - }, - "generic": { - "display": "Generic", - "description": "Generic commands", - "weight": 0 - }, - "geo": { - "display": "Geospatial indices", - "description": "Operations on the Geospatial Index data type", - "weight": 0 - }, - "hash": { - "display": "Hash", - "description": "Operations on the Hash data type", - "weight": 0 - }, - "hyperloglog": { - "display": "HyperLogLog", - "description": "Operations on the HyperLogLog data type", - "weight": 0 - }, - "list": { - "display": "List", - "description": "Operations on the List data type", - "weight": 0 - }, - "pubsub": { - "display": "Pub/Sub", - "description": "Pub/Sub commands", - "weight": 0 - }, - "scripting": { - "display": "Scripting and Functions", - "description": "Redis server-side scripting and functions", - "weight": 0 - }, - "server": { - "display": "Server management", - "description": "Server management commands", - "weight": 0 - }, - "set": { - "display": "Set", - "description": "Operations on the Set data type", - "weight": 0 - }, - "sorted-set": { - "display": "Sorted Set", - "description": "Operations on the Sorted Set data type", - "weight": 0 - }, - "stream": { - "display": "Stream", - "description": "Operations on the Stream data type", - "weight": 0 - }, - "string": { - "display": "String", - "description": "Operations on the String data type", - "weight": 0 - }, - "transactions": { - "display": "Transactions", - "description": "Redis Transaction management", - "weight": 0 - } - }, - "stack": { - "search": { - "display": "Search", - "description": "Secondary index and free text search operations", - "weight": 10 - }, - "suggestion": { - "display": "Auto-Suggest", - "description": "Operations on the Auto-Suggest data type", - "weight": 10 - }, - "json": { - "display": "JSON", - "description": "Operations on the JSON data type", - "weight": 11 - }, - "timeseries": { - "display": "Time series", - "description": "Operations on the time series data type", - "weight": 150 - }, - "bf": { - "display": "Bloom Filter", - "description": "Operations on the Bloom Filter data type", - "weight": 140 - }, - "cf": { - "display": "Cuckoo Filter", - "description": "Operations on the Cuckoo Filter data type", - "weight": 140 - }, - "cms": { - "display": "Count-min Sketch", - "description": "Operations on the Count-min Sketch data type", - "weight": 140 - }, - "tdigest": { - "display": "T-Digest", - "description": "Operations on the T-Digest data type", - "weight": 140 - }, - "topk": { - "display": "Top-K", - "description": "Operations on the Top-K data type", - "weight": 140 - }, - "triggers_and_functions": { - "display": "Triggers and functions", - "description": "React to database events and execute functions", - "weight": 16 - } - } -} \ No newline at end of file diff --git a/data/meta.json b/data/meta.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/data/meta.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file