diff --git a/build/components/component.py b/build/components/component.py index ba6a6e73d..2e895e28e 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 855776dd1..f615d4f16 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 c77bade2e..000000000 --- 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 c21178d7e..544c037d3 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 96c019406..ebc86b2b6 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 5c70b705c..39afe5365 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 5f718cfa0..d26dc5125 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 4ffabda8f..b27880655 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 883c226b0..000000000 --- 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 50f486dd5..000000000 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 75ec7484c..000000000 --- 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 a0cfc1d75..000000000 --- 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 55ca74bc4..000000000 --- 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 22de554df..000000000 --- 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 aac14da32..000000000 --- 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 fbe7fb613..000000000 --- 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 f7886a4d3..000000000 --- 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 342a6d1af..000000000 --- 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 c5b32ed80..000000000 --- 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 a6171f0c7..000000000 --- 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 7632f8d45..000000000 --- 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 bb8d1a98c..0c92a16a5 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/data/components/go_redis.json b/data/components/go_redis.json index 80fb21a60..3c68eb6a5 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 ff8b8f451..b3b60fb25 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 caba3e5de..000000000 --- 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 c7486b6f9..bac07b20f 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 78aacc4e7..619cfb355 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 2ff9abf9c..912aeee3c 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 b1a5c4d1b..d169dabe3 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": "emb-examples", "path": "doctests", "pattern": "*.js" } diff --git a/data/components/nredisstack.json b/data/components/nredisstack.json index 4283fdd49..e32c55b8d 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 982a3501a..000000000 --- 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 4b9e62136..000000000 --- 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 dd93419c5..9a1dc3073 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 bd0566723..e8215367f 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 63a71484c..000000000 --- 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 901cbfee1..000000000 --- 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 12719cea5..000000000 --- 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 ed7caf644..000000000 --- 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 f71bbe702..000000000 --- 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 74cc353c6..000000000 --- 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 6ed20b85f..000000000 --- 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 d0c28d359..000000000 --- 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 9e26dfeeb..000000000 --- a/data/meta.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file