diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index ebd56bf393..369151c429 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -4,6 +4,7 @@ Provide a one line summary of the changes in the PR **Title** field above. It should be in the form of `HDDS-1234. Short summary of the change`. Please describe your PR in detail: + - What changes are proposed in the PR and why? It would be better if it is written from third person's perspective not just for the reviewer. - Provide as much context and rationale for the pull request as possible. It could be copy-pasted from the Jira's description if the Jira is well defined. @@ -17,4 +18,3 @@ Please describe your PR in detail: ## How was this patch tested? Please explain how this patch was tested. In most cases this will just be checking the local preview of the website, but existing CI checks should also pass. - diff --git a/.github/resource/sidebar_tips.md b/.github/resource/sidebar_tips.md index 7d8a914eff..f4c50bc9ce 100644 --- a/.github/resource/sidebar_tips.md +++ b/.github/resource/sidebar_tips.md @@ -2,7 +2,7 @@ Every docs directory must have a `README.mdx` file to configure how it is displayed in the documentation sidebar. This file must contain a generated index of pages in the section by adding the following lines: -1. Add `import DocCardList from '@theme/DocCardList';` anywhere in the *README.mdx* file. +1. Add `import DocCardList from '@theme/DocCardList';` anywhere in the _README.mdx_ file. 2. Add the `` tag at the end of the file. For more information on documentation sidebar configuration, see the [contributing guide](https://github.com/apache/ozone-site/blob/HDDS-9225-website-v2/CONTRIBUTING.md#documentation-sidebar). diff --git a/.github/resource/spelling_tips.md b/.github/resource/spelling_tips.md index 54b8b2946d..315fe674a1 100644 --- a/.github/resource/spelling_tips.md +++ b/.github/resource/spelling_tips.md @@ -1,8 +1,8 @@ # Spelling Check Failed -Spelling can be checked locally by running the script *.github/scripts/spelling.sh*. This requires you to have pnpm's dev dependencies installed on your machine for cspell to work (run `pnpm install --dev`). +Spelling can be checked locally by running the script _.github/scripts/spelling.sh_. This requires you to have pnpm's dev dependencies installed on your machine for cspell to work (run `pnpm install --dev`). **If spell check fails for words that are correct but not recognized:** -- Option 1: If the word is relevant for the whole Ozone project, add it to the `words` list in *cspell.yaml* so that it is considered valid. +- Option 1: If the word is relevant for the whole Ozone project, add it to the `words` list in _cspell.yaml_ so that it is considered valid. - Option 2: If the word is only relevant for one specific page, add an [inline directive](https://cspell.org/configuration/document-settings/) as a comment in the markdown front matter of that page only. diff --git a/.github/scripts/markdownlint.sh b/.github/scripts/markdownlint.sh deleted file mode 100755 index 4d010fa49b..0000000000 --- a/.github/scripts/markdownlint.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env sh -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - - -root="$(git rev-parse --show-toplevel)" - -pnpm markdownlint "$root" - diff --git a/.github/workflows/static.yml b/.github/workflows/static.yml index 7b4550aab9..fd66ed97a3 100644 --- a/.github/workflows/static.yml +++ b/.github/workflows/static.yml @@ -73,7 +73,7 @@ jobs: if: ${{ failure() }} run: | cat ${{ env.resource_dir }}/spelling_tips.md >> $GITHUB_STEP_SUMMARY - lint-markdown: + lint: runs-on: ubuntu-latest steps: - name: Checkout project @@ -89,10 +89,8 @@ jobs: cache: pnpm - name: Install pnpm dependencies run: pnpm install --dev - - name: Run markdownlint - working-directory: ${{ env.script_dir }} - run: | - ./markdownlint.sh + - name: Run lint + run: pnpm run lint check-sidebar: runs-on: ubuntu-latest steps: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 56cb21b78a..9d1c3b6265 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -7,19 +7,19 @@ This document summarizes the contribution process. ## Quick Start 1. Review the main [Ozone contributing guide](https://github.com/apache/ozone/blob/master/CONTRIBUTING.md#contribute-your-modifications). Contributing to the new website follows a similar process with a few differences: - - You should fork the [apache/ozone-site](https://github.com/apache/ozone-site) repo instead of the main [apache/ozone](https://github.com/apache/ozone) repo. - - You should enable the `ci` workflow on your fork, which will run tests on your changes before submitting a pull request. - - Your local branch containing changes for the new website should be based off of the [HDDS-9225-website-v2](https://github.com/apache/ozone-site/tree/HDDS-9225-website-v2) branch. + - You should fork the [apache/ozone-site](https://github.com/apache/ozone-site) repo instead of the main [apache/ozone](https://github.com/apache/ozone) repo. + - You should enable the `ci` workflow on your fork, which will run tests on your changes before submitting a pull request. + - Your local branch containing changes for the new website should be based off of the [HDDS-9225-website-v2](https://github.com/apache/ozone-site/tree/HDDS-9225-website-v2) branch. 2. Use your favorite editor to write markdown content under the [docs/](docs/) and [src/pages/](src/pages/) directories. - - A good option is [Visual Studio Code](https://code.visualstudio.com/) with [markdownlint](https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint) and [cspell](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker) plugins, which will automatically detect the website's configuration files and give feedback as you type. + - A good option is [Visual Studio Code](https://code.visualstudio.com/) with [markdownlint](https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint) and [cspell](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker) plugins, which will automatically detect the website's configuration files and give feedback as you type. 3. Preview your changes locally by running `docker compose up` and opening `localhost:3001` in your browser. - - Make sure [Docker](https://docs.docker.com/engine/install/) and [Docker Compose](https://docs.docker.com/compose/install/) are installed on your system. - - If you need to update the dependencies in your Docker image at any time, run `docker compose up --build` to create an updated image. + - Make sure [Docker](https://docs.docker.com/engine/install/) and [Docker Compose](https://docs.docker.com/compose/install/) are installed on your system. + - If you need to update the dependencies in your Docker image at any time, run `docker compose up --build` to create an updated image. 4. Follow the same steps as the main [Ozone contributing guide](https://github.com/apache/ozone/blob/master/CONTRIBUTING.md#contribute-your-modifications) to create a pull request against the [apache/ozone-site](https://github.com/apache/ozone-site) repository. - - The target branch for the PR should be [HDDS-9225-website-v2](https://github.com/apache/ozone-site/tree/HDDS-9225-website-v2) for changes targeting this new unreleased version of the website. + - The target branch for the PR should be [HDDS-9225-website-v2](https://github.com/apache/ozone-site/tree/HDDS-9225-website-v2) for changes targeting this new unreleased version of the website. ⬇️ Continue reading for more details, helpful tips, and advanced usage. ⬇️ @@ -46,12 +46,26 @@ If you are migrating a page from the old website to the new website, please foll 1. Verify that the content of the original page is clear and accurate. 2. If there are issues with the original page, raise a PR with your fixes to the [current Ozone website](https://github.com/apache/ozone/tree/master/hadoop-hdds/docs) to fix the page first. 3. Once the page is merged into the current website, migrate it to the new website and raise a PR. - - Pages being brought in from the current website may be enhanced with [additional markdown functionality](#page-format) supported by the new website. + - Pages being brought in from the current website may be enhanced with [additional markdown functionality](#page-format) supported by the new website. ## Modifying the Website The Apache Ozone Website uses [Docusaurus](https://docusaurus.io/) as a static site generator. Most simple updates to the website can be done with little knowledge of Docusaurus, but for more complex modifications to the website or a better understanding of how it is built, see the Docusaurus [documentation](https://docusaurus.io/docs) and [API](https://docusaurus.io/docs/cli). +### Linting and Formatting + +The website uses ESLint and Prettier for JavaScript/CSS linting and formatting, and markdownlint for Markdown/MDX linting. There is one intentional style conflict: Prettier uses `_underscores_` for emphasis, while markdownlint is configured to require `*asterisks*`. To keep markdownlint as the source of truth for Markdown emphasis, run markdownlint *after* Prettier. + +Use these commands when working on the site: + +```bash +pnpm run lint +pnpm run lint:fix +``` + +- `pnpm run lint` runs checks only (no files are modified). +- `pnpm run lint:fix` applies auto-fixes from ESLint, markdownlint, and Prettier. + ### Directory Layout - [docusaurus.config.js](https://docusaurus.io/docs/configuration) @@ -206,13 +220,13 @@ When creating a new *docs* subdirectory (which will be rendered as a sidebar sec 1. Use the `sidebar_label` front matter key to give the section a brief title that will be shown in the sidebar. 2. Add a descriptive title on the markdown page itself. - - This should be more verbose than the sidebar label as described in [Best Practices](#best-practices) for documentation pages. + - This should be more verbose than the sidebar label as described in [Best Practices](#best-practices) for documentation pages. 3. Write a brief summary (usually just one sentence) about the content in that section. - - Avoid placing actual documentation on these pages, since it may be missed by readers clicking through the sidebar. - - If an overview of content in a section is required, add a dedicated "Overview" page to the section. + - Avoid placing actual documentation on these pages, since it may be missed by readers clicking through the sidebar. + - If an overview of content in a section is required, add a dedicated "Overview" page to the section. 4. Add an automatically generated index of the content in this section as the last line in the markdown file. Adding this index is described in the [Docusaurus docs](https://docusaurus.io/docs/sidebar/items#embedding-generated-index-in-doc-page), but in summary it only requires two lines: - 1. Add `import DocCardList from '@theme/DocCardList';` anywhere in the *README.mdx* file. - 2. Add the `` tag at the end of the file. + 1. Add `import DocCardList from '@theme/DocCardList';` anywhere in the *README.mdx* file. + 2. Add the `` tag at the end of the file. ### Updating Graphics @@ -267,29 +281,24 @@ Currently all `@docusaurus/*` packages are pinned to an exact version for websit #### `pnpm` Command Cheat-Sheet - **To install all packages after cloning the repo**: `pnpm install` - - This will read the metadata for the packages and their transitive dependencies from *pnpm-lock.yaml*, which is generated from *package.json* - and install the required dependencies for the project in the *node_modules* folder. - This should make no modifications to *package.json* or *pnpm-lock.yaml* if all explicit versions in *pnpm-lock.yaml* comply with the version specifiers in *package.json*. - - This should always be true for committed code, because the CI build of the website uses `pnpm install --frozen-lockfile` to fail the build if the two files do not match. - **To update all packages to their latest versions allowed by package.json**: `pnpm update` - - This will update *package.json* to match the exact versions that were installed, but this is for reference only. Exact version information still comes from *pnpm-lock.yaml* - Version specifiers like `^` and `~` will not be modified, and the new version will be the latest that still complies with the existing version specifiers. - This will update *pnpm-lock.yaml* to reflect the exact versions of all top level and transitive dependencies installed. - **To update docusaurus to a specific version**: - 1. Update the version of all `@docusaurus/*` packages in *package.json* to the desired docusaurus version. 2. Run `pnpm update '@docusaurus/*'` to update to the new version. + - This should modify *pnpm-lock.yaml* with the exact versions of docusaurus and its transitive dependencies that were installed. - - This should modify *pnpm-lock.yaml* with the exact versions of docusaurus and its transitive dependencies that were installed. - - - If pnpm needed to update other top level dependencies when updating docusaurus, this command may modify *package.json* as well. + - If pnpm needed to update other top level dependencies when updating docusaurus, this command may modify *package.json* as well. 3. Commit *package.json* and *pnpm-lock.yaml* to git. @@ -308,13 +317,11 @@ The project includes a `Dockerfile` and a `compose.yml` file to build and run th 2. Install [Docker Compose](https://docs.docker.com/compose/install/). 3. Run `docker compose up` from the repository root. - - - **Note**: This will continue to use the last locally built version of the `ozone-site-dev` image, which saves time on future runs. - - Run `docker compose up --build` to rebuild the image and incorporate any package dependency updates that may have been committed since the last build. + - **Note**: This will continue to use the last locally built version of the `ozone-site-dev` image, which saves time on future runs. + - Run `docker compose up --build` to rebuild the image and incorporate any package dependency updates that may have been committed since the last build. 4. Preview the website at `localhost:3001` in your browser. - - - Any changes made in the repository will be reflected in the preview. + - Any changes made in the repository will be reflected in the preview. 5. Press `Ctrl+C` or run `docker compose down` to stop the preview. @@ -327,7 +334,6 @@ Build and run the website locally with the `pnpm` package manager. 2. Install dependencies required to build the website by running `pnpm install` at the website root. - [**Development Server**](https://docusaurus.io/docs/installation#running-the-development-server): This option will start the Docusaurus development server, which allows updates to website files to be displayed in the browser in real time. It will not produce a `build` directory with build artifacts. - 1. Run `pnpm start` from the repository root to start the development server. 2. Preview the website at `localhost:3001` in your browser. @@ -335,7 +341,6 @@ Build and run the website locally with the `pnpm` package manager. 3. Press `Ctrl+C` to stop the preview. - [**Local Build**](https://docusaurus.io/docs/installation#build): This option will do a production build, putting artifacts in the `build` directory. This can still be previewed locally, but will not automatically reflect changes to website files. - 1. Run `pnpm build` from the repository root to build the content. 2. Run `pnpm serve` to preview the built website locally. diff --git a/docs/02-quick-start/01-installation/01-docker.md b/docs/02-quick-start/01-installation/01-docker.md index eb67a1e38a..ca93ff3361 100644 --- a/docs/02-quick-start/01-installation/01-docker.md +++ b/docs/02-quick-start/01-installation/01-docker.md @@ -42,29 +42,29 @@ This command will: 1. Check the status of your Ozone cluster components: - ```bash - docker compose ps - ``` - - You should see output similar to this: - - ```bash - NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS - docker-datanode-1 apache/ozone:1.4.1-rocky "/usr/local/bin/dumb…" datanode 14 seconds ago Up 13 seconds 0.0.0.0:32958->9864/tcp, :::32958->9864/tcp - docker-datanode-2 apache/ozone:1.4.1-rocky "/usr/local/bin/dumb…" datanode 14 seconds ago Up 13 seconds 0.0.0.0:32957->9864/tcp, :::32957->9864/tcp - docker-datanode-3 apache/ozone:1.4.1-rocky "/usr/local/bin/dumb…" datanode 14 seconds ago Up 12 seconds 0.0.0.0:32959->9864/tcp, :::32959->9864/tcp - docker-om-1 apache/ozone:1.4.1-rocky "/usr/local/bin/dumb…" om 14 seconds ago Up 13 seconds 0.0.0.0:9874->9874/tcp, :::9874->9874/tcp - docker-recon-1 apache/ozone:1.4.1-rocky "/usr/local/bin/dumb…" recon 14 seconds ago Up 13 seconds 0.0.0.0:9888->9888/tcp, :::9888->9888/tcp - docker-s3g-1 apache/ozone:1.4.1-rocky "/usr/local/bin/dumb…" s3g 14 seconds ago Up 13 seconds 0.0.0.0:9878->9878/tcp, :::9878->9878/tcp - docker-scm-1 apache/ozone:1.4.1-rocky "/usr/local/bin/dumb…" scm 14 seconds ago Up 13 seconds 0.0.0.0:9876->9876/tcp, :::9876->9876/tcp - ``` + ```bash + docker compose ps + ``` + + You should see output similar to this: + + ```bash + NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS + docker-datanode-1 apache/ozone:1.4.1-rocky "/usr/local/bin/dumb…" datanode 14 seconds ago Up 13 seconds 0.0.0.0:32958->9864/tcp, :::32958->9864/tcp + docker-datanode-2 apache/ozone:1.4.1-rocky "/usr/local/bin/dumb…" datanode 14 seconds ago Up 13 seconds 0.0.0.0:32957->9864/tcp, :::32957->9864/tcp + docker-datanode-3 apache/ozone:1.4.1-rocky "/usr/local/bin/dumb…" datanode 14 seconds ago Up 12 seconds 0.0.0.0:32959->9864/tcp, :::32959->9864/tcp + docker-om-1 apache/ozone:1.4.1-rocky "/usr/local/bin/dumb…" om 14 seconds ago Up 13 seconds 0.0.0.0:9874->9874/tcp, :::9874->9874/tcp + docker-recon-1 apache/ozone:1.4.1-rocky "/usr/local/bin/dumb…" recon 14 seconds ago Up 13 seconds 0.0.0.0:9888->9888/tcp, :::9888->9888/tcp + docker-s3g-1 apache/ozone:1.4.1-rocky "/usr/local/bin/dumb…" s3g 14 seconds ago Up 13 seconds 0.0.0.0:9878->9878/tcp, :::9878->9878/tcp + docker-scm-1 apache/ozone:1.4.1-rocky "/usr/local/bin/dumb…" scm 14 seconds ago Up 13 seconds 0.0.0.0:9876->9876/tcp, :::9876->9876/tcp + ``` 2. Check the Ozone version - ```bash - docker compose exec om bash - ozone version - ``` + ```bash + docker compose exec om bash + ozone version + ``` 3. Access the Ozone Recon server, which provides monitoring and management capabilities by navigating to the [Recon server home page](http://localhost:9888). diff --git a/docs/02-quick-start/01-installation/02-kubernetes.md b/docs/02-quick-start/01-installation/02-kubernetes.md index d57508b9dd..b8cd755b54 100644 --- a/docs/02-quick-start/01-installation/02-kubernetes.md +++ b/docs/02-quick-start/01-installation/02-kubernetes.md @@ -50,14 +50,14 @@ The `kubernetes/examples` directory of the Ozone distribution contains Kubernete To deploy it to minikube, use the minikube configuration set: -``` bash +```bash cd kubernetes/examples/minikube kubectl apply -k . ``` And you can check the results with -``` bash +```bash kubectl get pod kubectl exec scm-0 -- ozone version ``` @@ -75,7 +75,7 @@ the `kubernetes/examples/minikube` resource set is optimized for minikube usage: Now you can access any of the services. For each web endpoint an additional NodeType service is defined in the minikube k8s resource set. NodeType services are available via a generated port on any of the host nodes: -``` bash +```bash kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE datanode ClusterIP None 27s @@ -90,7 +90,7 @@ scm-public NodePort 10.105.231.28 9876:32171/TCP 27s Minikube provides a convenience command to access any of the NodePort services: -``` bash +```bash minikube service s3g-public Opening kubernetes service default/s3g-public in default browser... ``` @@ -110,14 +110,14 @@ As [apache/ozone](https://hub.docker.com/r/apache/ozone) images are available fr To deploy to a hosted cluster, use the Ozone subdirectory: -``` bash +```bash cd kubernetes/examples/ozone kubectl apply -k . ``` And you can check the results with -``` bash +```bash kubectl get pod kubectl exec scm-0 -- ozone version ``` @@ -126,7 +126,7 @@ kubectl exec scm-0 -- ozone version Now you can access any of the services. By default the services are not published but you can access them with port-forward rules. -``` bash +```bash kubectl port-forward s3g-0 9878:9878 kubectl port-forward scm-0 9876:9876 ``` diff --git a/docs/02-quick-start/01-installation/README.mdx b/docs/02-quick-start/01-installation/README.mdx index cbf05164be..5da47216ec 100644 --- a/docs/02-quick-start/01-installation/README.mdx +++ b/docs/02-quick-start/01-installation/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Installation # Ozone Installation Quick Start -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section provides instructions to quickly install an Ozone instance on your local machine that can be used for testing and evaluation. For instructions to install a production Ozone instance, see the [Administrator Guide](../../administrator-guide/installation). - + diff --git a/docs/02-quick-start/02-reading-writing-data.md b/docs/02-quick-start/02-reading-writing-data.md index 9c4afd5cac..4bb469bb05 100644 --- a/docs/02-quick-start/02-reading-writing-data.md +++ b/docs/02-quick-start/02-reading-writing-data.md @@ -19,7 +19,7 @@ docker compose up -d --scale datanode=5 ## Interface Comparison | Interface | Strengths | Use Cases | -|:----------------|:----------------------------------------------------------------------------------------|:---------------------------------------------------------------------------| +| :-------------- | :-------------------------------------------------------------------------------------- | :------------------------------------------------------------------------- | | **Ozone Shell** | - Full feature access Advanced operations Detailed metadata | - Administrative tasks Bucket/volume management Quota/ACL management | | **ofs** | - Familiar HDFS-like commands Works with existing Hadoop applications Full cluster view | - Hadoop ecosystem integration Applications that need filesystem semantics | | **S3 API** | - Industry standard Works with existing S3 clients Language-independent | - Web applications Multi-language environments Existing S3 applications | @@ -145,7 +145,7 @@ ozone sh key delete /vol1/bucket1/renamed_shell.txt ## Using ofs (Ozone File System) - ofs provides a Hadoop-compatible file system interface (`ofs://`), making it seamless to use with applications designed +ofs provides a Hadoop-compatible file system interface (`ofs://`), making it seamless to use with applications designed for HDFS. ### Basic ofs Operations @@ -253,7 +253,7 @@ Ozone allows accessing the same data through different interfaces. ### Namespace Mapping | Data Location | Ozone Shell Path | ofs Path | S3 Path | -|:----------------------|:-------------------------|:-------------------------------------------------|:---------------------------------------------------------------| +| :-------------------- | :----------------------- | :----------------------------------------------- | :------------------------------------------------------------- | | vol1/bucket1/file.txt | `/vol1/bucket1/file.txt` | `ofs:///vol1/bucket1/file.txt` | `s3://bucket1/file.txt`
(if S3V configured to serve vol1) | | s3v/s3bucket/file.txt | `/s3v/s3bucket/file.txt` | `ofs:///s3v/s3bucket/file.txt` | `s3://s3bucket/file.txt` | diff --git a/docs/02-quick-start/README.mdx b/docs/02-quick-start/README.mdx index 66546a4e42..b358ab4dda 100644 --- a/docs/02-quick-start/README.mdx +++ b/docs/02-quick-start/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Quick Start # Quick Start -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section provides instructions to quickly start an Ozone instance on your local machine and run basic operations against it. - + diff --git a/docs/03-core-concepts/01-architecture/02-ozone-manager.md b/docs/03-core-concepts/01-architecture/02-ozone-manager.md index 9169a8e99d..c57af830d9 100644 --- a/docs/03-core-concepts/01-architecture/02-ozone-manager.md +++ b/docs/03-core-concepts/01-architecture/02-ozone-manager.md @@ -92,8 +92,8 @@ The following data is persisted in Ozone Manager side in a specific RocksDB dire ## Notable Configurations -| Key | Default | Description | -|-----|---------|-------------| -| `ozone.om.address` | 0.0.0.0:9862 | RPC address of the OM. Required by the client. | -| `ozone.om.http-address` | 0.0.0.0:9874 | Default port of the HTTP server. | -| `ozone.metadata.dirs` | none | Directory to store persisted data (RocksDB). | +| Key | Default | Description | +| ----------------------- | ------------ | ---------------------------------------------- | +| `ozone.om.address` | 0.0.0.0:9862 | RPC address of the OM. Required by the client. | +| `ozone.om.http-address` | 0.0.0.0:9874 | Default port of the HTTP server. | +| `ozone.metadata.dirs` | none | Directory to store persisted data (RocksDB). | diff --git a/docs/03-core-concepts/01-architecture/03-storage-container-manager.md b/docs/03-core-concepts/01-architecture/03-storage-container-manager.md index 9e6951eb70..5a2c224583 100644 --- a/docs/03-core-concepts/01-architecture/03-storage-container-manager.md +++ b/docs/03-core-concepts/01-architecture/03-storage-container-manager.md @@ -21,10 +21,10 @@ SCM is in charge of creating an Ozone cluster. When an SCM is booted up via `ini 2. SCM keeps track of all the block replicas. If there is a loss of data node or a disk, SCM detects it and instructs data nodes to make copies of the missing blocks to ensure high availability. 3. **SCM's Certificate Authority** is in -charge of issuing identity certificates for each and every -service in the cluster. This certificate infrastructure makes -it easy to enable mTLS at network layer and the block -token infrastructure depends on this certificate infrastructure. + charge of issuing identity certificates for each and every + service in the cluster. This certificate infrastructure makes + it easy to enable mTLS at network layer and the block + token infrastructure depends on this certificate infrastructure. ## Main components @@ -88,10 +88,10 @@ This means that SCM will wait for a minimum number of Datanodes to be available ## Notable configurations -| Key | Default | Description | -| --- | ------- | ----------- | -| `ozone.scm.container.size` | 5GB | Default container size used by Ozone | -| `ozone.scm.block.size` | 256MB | The default size of a data block. | -| `hdds.scm.safemode.min.datanode` | 3 | Minimum number of Datanodes to start the real work. | -| `ozone.scm.http-address` | 0.0.0.0:9876 | HTTP address of the SCM server | -| `ozone.metadata.dirs` | none | Directory to store persisted data (RocksDB). | +| Key | Default | Description | +| -------------------------------- | ------------ | --------------------------------------------------- | +| `ozone.scm.container.size` | 5GB | Default container size used by Ozone | +| `ozone.scm.block.size` | 256MB | The default size of a data block. | +| `hdds.scm.safemode.min.datanode` | 3 | Minimum number of Datanodes to start the real work. | +| `ozone.scm.http-address` | 0.0.0.0:9876 | HTTP address of the SCM server | +| `ozone.metadata.dirs` | none | Directory to store persisted data (RocksDB). | diff --git a/docs/03-core-concepts/01-architecture/04-s3-gateway.md b/docs/03-core-concepts/01-architecture/04-s3-gateway.md index 621f7c3f7b..b4cde14b68 100644 --- a/docs/03-core-concepts/01-architecture/04-s3-gateway.md +++ b/docs/03-core-concepts/01-architecture/04-s3-gateway.md @@ -92,7 +92,7 @@ Supports AWS Signature-style authentication (if enabled): - Uses OM’s stored credentials - Relies on OM for final authorization -Supports Kerberos authentication for secure clusters; In unsecured mode, allows anonymous or dummy access. +Supports Kerberos authentication for secure clusters; In unsecured mode, allows anonymous or dummy access. ## Summary diff --git a/docs/03-core-concepts/01-architecture/05-datanodes.md b/docs/03-core-concepts/01-architecture/05-datanodes.md index 14ddffd1e3..3eadef0685 100644 --- a/docs/03-core-concepts/01-architecture/05-datanodes.md +++ b/docs/03-core-concepts/01-architecture/05-datanodes.md @@ -73,11 +73,11 @@ the property `hdds.datanode.volume.choosing.policy`. There are two main policies ### Volume-Related Configuration Properties -| Property Name | Default Value | Description | -|---------------|---------------|-------------| -| `hdds.datanode.volume.choosing.policy` | `CapacityVolumeChoosingPolicy` | The policy used to select a volume for new containers. | -| `hdds.datanode.volume.min.free.space` | `20GB` | Minimum free space required on a volume to be eligible for new containers. | -| `hdds.datanode.volume.min.free.space.percent` | `0.02` | Minimum free space percentage required on a volume to be eligible for new containers. | +| Property Name | Default Value | Description | +| --------------------------------------------- | ------------------------------ | ------------------------------------------------------------------------------------- | +| `hdds.datanode.volume.choosing.policy` | `CapacityVolumeChoosingPolicy` | The policy used to select a volume for new containers. | +| `hdds.datanode.volume.min.free.space` | `20GB` | Minimum free space required on a volume to be eligible for new containers. | +| `hdds.datanode.volume.min.free.space.percent` | `0.02` | Minimum free space percentage required on a volume to be eligible for new containers. | ### Disk Balancer @@ -87,11 +87,11 @@ For more information on using the Disk Balancer, refer to the [Disk Balancer doc ## Notable Configurations -| Key | Default | Description | -|-----|---------|-------------| -| `dfs.container.ratis.datanode.storage.dir` | none | This directory is used for storing Ratis metadata like logs. | -| `ozone.scm.datanode.id.dir` | none | The path that Datanodes will use to store the Datanode ID. | -| `hdds.datanode.dir` | none | Determines where HDDS data will be stored on the local filesystem. | -| `hdds.datanode.dir.du.reserved` | none | Reserved space in bytes per volume. Always leave this much space free for non dfs use. | -| `ozone.metadata.dirs` | none | Directory to store persisted data (RocksDB). | -| `ozone.recon.address` | 0.0.0.0:9891 | RPC address of the Recon. Use host:port to connect Recon. | +| Key | Default | Description | +| ------------------------------------------ | ------------ | -------------------------------------------------------------------------------------- | +| `dfs.container.ratis.datanode.storage.dir` | none | This directory is used for storing Ratis metadata like logs. | +| `ozone.scm.datanode.id.dir` | none | The path that Datanodes will use to store the Datanode ID. | +| `hdds.datanode.dir` | none | Determines where HDDS data will be stored on the local filesystem. | +| `hdds.datanode.dir.du.reserved` | none | Reserved space in bytes per volume. Always leave this much space free for non dfs use. | +| `ozone.metadata.dirs` | none | Directory to store persisted data (RocksDB). | +| `ozone.recon.address` | 0.0.0.0:9891 | RPC address of the Recon. Use host:port to connect Recon. | diff --git a/docs/03-core-concepts/01-architecture/06-recon.md b/docs/03-core-concepts/01-architecture/06-recon.md index dedb7b6dcd..5a66c2b968 100644 --- a/docs/03-core-concepts/01-architecture/06-recon.md +++ b/docs/03-core-concepts/01-architecture/06-recon.md @@ -81,25 +81,25 @@ The following data is stored in the configured SQL database (**default is Derby* ## Notable configurations -| Key | Default | Description | -|-----|------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------| -| `ozone.recon.http-address` | 0.0.0.0:9888 | The address and the base port where the Recon web UI will listen on. | -| `ozone.recon.address` | 0.0.0.0:9891 | RPC address of the Recon. | -| `ozone.recon.heatmap.provider` | none | HeatMapProvider for Recon. | -| `ozone.recon.db.dir` | none | Directory where the Recon Server stores its metadata. | -| `ozone.recon.om.db.dir` | none | Directory where the Recon Server stores its OM snapshot DB. | -| `ozone.recon.om.snapshot.task.interval.delay` | 10m | Interval in MINUTES by Recon to request OM DB Snapshot / delta updates. | -| `ozone.recon.task.missingcontainer.interval` | 300s | Time interval of the periodic check for Unhealthy Containers in the cluster. | -| `ozone.recon.task.safemode.wait.threshold` | 300s | Max time for Recon to wait before it exits out of safe or warmup mode. | -| `ozone.recon.sql.db.jooq.dialect` | DERBY | Please refer to [SQL Dialect](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/SQLDialect.html) to specify a different dialect. | -| `ozone.recon.sql.db.jdbc.url` | `jdbc:derby:${ozone.recon.db.dir}`

`/ozone_recon_derby.db` | Recon SQL database jdbc url. | -| `ozone.recon.sql.db.username` | none | Recon SQL database username. | -| `ozone.recon.sql.db.password` | none | Recon SQL database password. | -| `ozone.recon.sql.db.driver` | `org.apache.derby.jdbc.EmbeddedDriver` | Recon SQL database jdbc driver. | -| `ozone.recon.prometheus.http.endpoint` | none | Prometheus HTTP endpoint URL for Recon to integrate with Prometheus. Enables display of metrics in Recon UI and exposes a proxy endpoint to query Prometheus. Example: `http://prometheus:9090`. | -| `ozone.recon.scmconfig` | none | Prefix for SCM configuration. | -| `ozone.recon.db.dirs.permissions` | `750` | Permissions for the metadata directories for Recon. The permissions can either be octal or symbolic. If the default permissions are not set then the default value of 750 will be used. | -| `ozone.recon.datanode.address` | none | Datanode address for Recon. | -| `ozone.recon.heatmap.enable` | `false` | To enable/disable Recon heatmap feature. Along with this config, user must also provide the implementation of `org.apache.hadoop.ozone.recon.heatmap.IHeatMapProvider` interface and configure in `ozone.recon.heatmap.provider` configuration. | -| `ozone.recon.https-address` | `0.0.0.0:9889` | The address and the base port where the Recon web UI will listen on using HTTPS. If the port is 0 then the server will start on a free port. | -| `ozone.recon.datanode.bind.host` | `0.0.0.0` | Bind host for Datanode address. | +| Key | Default | Description | +| --------------------------------------------- | ---------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ozone.recon.http-address` | 0.0.0.0:9888 | The address and the base port where the Recon web UI will listen on. | +| `ozone.recon.address` | 0.0.0.0:9891 | RPC address of the Recon. | +| `ozone.recon.heatmap.provider` | none | HeatMapProvider for Recon. | +| `ozone.recon.db.dir` | none | Directory where the Recon Server stores its metadata. | +| `ozone.recon.om.db.dir` | none | Directory where the Recon Server stores its OM snapshot DB. | +| `ozone.recon.om.snapshot.task.interval.delay` | 10m | Interval in MINUTES by Recon to request OM DB Snapshot / delta updates. | +| `ozone.recon.task.missingcontainer.interval` | 300s | Time interval of the periodic check for Unhealthy Containers in the cluster. | +| `ozone.recon.task.safemode.wait.threshold` | 300s | Max time for Recon to wait before it exits out of safe or warmup mode. | +| `ozone.recon.sql.db.jooq.dialect` | DERBY | Please refer to [SQL Dialect](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/SQLDialect.html) to specify a different dialect. | +| `ozone.recon.sql.db.jdbc.url` | `jdbc:derby:${ozone.recon.db.dir}`

`/ozone_recon_derby.db` | Recon SQL database jdbc url. | +| `ozone.recon.sql.db.username` | none | Recon SQL database username. | +| `ozone.recon.sql.db.password` | none | Recon SQL database password. | +| `ozone.recon.sql.db.driver` | `org.apache.derby.jdbc.EmbeddedDriver` | Recon SQL database jdbc driver. | +| `ozone.recon.prometheus.http.endpoint` | none | Prometheus HTTP endpoint URL for Recon to integrate with Prometheus. Enables display of metrics in Recon UI and exposes a proxy endpoint to query Prometheus. Example: `http://prometheus:9090`. | +| `ozone.recon.scmconfig` | none | Prefix for SCM configuration. | +| `ozone.recon.db.dirs.permissions` | `750` | Permissions for the metadata directories for Recon. The permissions can either be octal or symbolic. If the default permissions are not set then the default value of 750 will be used. | +| `ozone.recon.datanode.address` | none | Datanode address for Recon. | +| `ozone.recon.heatmap.enable` | `false` | To enable/disable Recon heatmap feature. Along with this config, user must also provide the implementation of `org.apache.hadoop.ozone.recon.heatmap.IHeatMapProvider` interface and configure in `ozone.recon.heatmap.provider` configuration. | +| `ozone.recon.https-address` | `0.0.0.0:9889` | The address and the base port where the Recon web UI will listen on using HTTPS. If the port is 0 then the server will start on a free port. | +| `ozone.recon.datanode.bind.host` | `0.0.0.0` | Bind host for Datanode address. | diff --git a/docs/03-core-concepts/01-architecture/README.mdx b/docs/03-core-concepts/01-architecture/README.mdx index a556727d3c..7dcaafad61 100644 --- a/docs/03-core-concepts/01-architecture/README.mdx +++ b/docs/03-core-concepts/01-architecture/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Architecture # Architecture -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section describes the architecture and components within Ozone. - + diff --git a/docs/03-core-concepts/02-replication/01-storage-containers.md b/docs/03-core-concepts/02-replication/01-storage-containers.md index 35ae271da9..0a3f90a08f 100644 --- a/docs/03-core-concepts/02-replication/01-storage-containers.md +++ b/docs/03-core-concepts/02-replication/01-storage-containers.md @@ -14,6 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. --> + # Storage Containers Storage Containers, or Containers (not to be confused with Docker containers) are the fundamental replication unit of Ozone, they are managed by the Storage Container Manager (SCM) service. @@ -31,8 +32,8 @@ When a container is created it starts in an OPEN state. When it's full (~5GB dat The fundamental differences between OPEN and CLOSED containers: -| OPEN | CLOSED | -|-----------------------------------|-----------------------------------------| -| mutable | immutable | -| replicated with RAFT (Ratis) | Replicated with async container copy | -| Raft leader is used to READ / WRITE | All the nodes can be used to READ | +| OPEN | CLOSED | +| ----------------------------------- | ------------------------------------ | +| mutable | immutable | +| replicated with RAFT (Ratis) | Replicated with async container copy | +| Raft leader is used to READ / WRITE | All the nodes can be used to READ | diff --git a/docs/03-core-concepts/02-replication/02-write-pipelines.md b/docs/03-core-concepts/02-replication/02-write-pipelines.md index 7fd4984fa3..159cc47a04 100644 --- a/docs/03-core-concepts/02-replication/02-write-pipelines.md +++ b/docs/03-core-concepts/02-replication/02-write-pipelines.md @@ -205,15 +205,15 @@ Containers are the fundamental storage units in Ozone, and their relationship wi ## Comparing Replication and Erasure Coding -| Feature | Replication (RATIS/THREE) | Erasure Coding (RS-6-3) | -| ------- | ------------------------- | ----------------------- | -| Storage Overhead | 200% (3x copies) | 50% (9 chunks for 6 data chunks) | -| Write Performance | Higher throughput for small writes | Better for large sequential writes | -| Read Performance | Consistent performance, any replica can serve | Slightly lower for intact data, reconstruction penalty for lost chunks | -| CPU Usage | Lower | Higher (encoding/decoding overhead) | -| Network Bandwidth | Higher during writes | Lower during writes | -| Minimum Nodes | 3 | Depends on config (9 for RS-6-3) | -| Use Cases | Hot data, random access, small files | Warm/cold data, large files, archival | +| Feature | Replication (RATIS/THREE) | Erasure Coding (RS-6-3) | +| ----------------- | --------------------------------------------- | ---------------------------------------------------------------------- | +| Storage Overhead | 200% (3x copies) | 50% (9 chunks for 6 data chunks) | +| Write Performance | Higher throughput for small writes | Better for large sequential writes | +| Read Performance | Consistent performance, any replica can serve | Slightly lower for intact data, reconstruction penalty for lost chunks | +| CPU Usage | Lower | Higher (encoding/decoding overhead) | +| Network Bandwidth | Higher during writes | Lower during writes | +| Minimum Nodes | 3 | Depends on config (9 for RS-6-3) | +| Use Cases | Hot data, random access, small files | Warm/cold data, large files, archival | **When to use Replication:** diff --git a/docs/03-core-concepts/02-replication/04-erasure-coding.md b/docs/03-core-concepts/02-replication/04-erasure-coding.md index eadbc19274..ef25231ac8 100644 --- a/docs/03-core-concepts/02-replication/04-erasure-coding.md +++ b/docs/03-core-concepts/02-replication/04-erasure-coding.md @@ -19,7 +19,7 @@ either `RATIS/THREE` or `EC`. Integrating EC with Ozone can improve storage efficiency while still providing similar data durability as traditional replication-based Ozone deployments. -As an example, a 3x replicated file with 6 blocks will consume 6*3 = `18` blocks of disk space. +As an example, a 3x replicated file with 6 blocks will consume 6\*3 = `18` blocks of disk space. But with EC (6 data, 3 parity) deployment, it will only consume `9` blocks of disk space. ## Architecture @@ -104,10 +104,10 @@ The EC policy encapsulates how to encode/decode a file. Each EC Replication Config defined by the following pieces of information: - 1. **data:** Data blocks number in an EC block group. - 2. **parity:** Parity blocks number in an EC block group. - 3. **ecChunkSize:** The size of a striping chunk. This determines the granularity of striped reads and writes. - 4. **codec:** This is to indicate the type of EC algorithms (e.g., `RS`(Reed-Solomon), `XOR`). +1. **data:** Data blocks number in an EC block group. +2. **parity:** Parity blocks number in an EC block group. +3. **ecChunkSize:** The size of a striping chunk. This determines the granularity of striped reads and writes. +4. **codec:** This is to indicate the type of EC algorithms (e.g., `RS`(Reed-Solomon), `XOR`). To pass the EC Replication Config in command line or configuration files, we need to use the following format: *codec*-*num data blocks*-*num parity blocks*-*EC chunk size* diff --git a/docs/03-core-concepts/02-replication/README.mdx b/docs/03-core-concepts/02-replication/README.mdx index 41904c8299..bbee1b9823 100644 --- a/docs/03-core-concepts/02-replication/README.mdx +++ b/docs/03-core-concepts/02-replication/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Replication # Data and Metadata Replication -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section describes how data and metadata are replicated consistently within Ozone. - + diff --git a/docs/03-core-concepts/03-namespace/01-volumes/01-overview.md b/docs/03-core-concepts/03-namespace/01-volumes/01-overview.md index f2137c3c60..a2321ec40f 100644 --- a/docs/03-core-concepts/03-namespace/01-volumes/01-overview.md +++ b/docs/03-core-concepts/03-namespace/01-volumes/01-overview.md @@ -28,7 +28,7 @@ Allowed Characters and Length: Prohibitions: -- Cannot contain uppercase letters or underscores (_) +- Cannot contain uppercase letters or underscores (\_) - Cannot be formatted as an IP address (e.g., 192.168.5.4) - Cannot have consecutive periods (e.g., my..bucket) or have dashes adjacent to periods (e.g., my-.bucket) - Cannot end with a dash diff --git a/docs/03-core-concepts/03-namespace/01-volumes/README.mdx b/docs/03-core-concepts/03-namespace/01-volumes/README.mdx index 260fd860f5..2256cb532a 100644 --- a/docs/03-core-concepts/03-namespace/01-volumes/README.mdx +++ b/docs/03-core-concepts/03-namespace/01-volumes/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Volumes # Volumes -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents configuration and use cases for volumes: Ozone's highest level of namespace organization. - + diff --git a/docs/03-core-concepts/03-namespace/02-buckets/01-overview.md b/docs/03-core-concepts/03-namespace/02-buckets/01-overview.md index d02b1e83d9..d73317a547 100644 --- a/docs/03-core-concepts/03-namespace/02-buckets/01-overview.md +++ b/docs/03-core-concepts/03-namespace/02-buckets/01-overview.md @@ -29,7 +29,7 @@ Allowed Characters and Length: Prohibitions: -- Cannot contain uppercase letters or underscores (_) +- Cannot contain uppercase letters or underscores (\_) - Cannot be formatted as an IP address (e.g., 192.168.5.4) - Cannot have consecutive periods (e.g., my..bucket) or have dashes adjacent to periods (e.g., my-.bucket) - Cannot end with a dash @@ -57,9 +57,9 @@ For more details on bucket operations, refer to the [Ozone CLI documentation](.. Ozone supports different bucket layouts, primarily: - **Object Store (OBS):** The traditional object storage layout, where keys are stored with their full path names. This is suitable for S3-like access patterns. -For more details, refer to the [Object Store documentation](./04-layouts/01-object-store.md). + For more details, refer to the [Object Store documentation](./04-layouts/01-object-store.md). - **File System Optimized (FSO):** An optimized layout for Hadoop Compatible File System (HCFS) semantics, where intermediate directories are stored separately, improving performance for file system operations like listing and renaming. -For more details, refer to the [Prefix FSO documentation](./04-layouts/02-file-system-optimized.md). + For more details, refer to the [Prefix FSO documentation](./04-layouts/02-file-system-optimized.md). ### Erasure Coding diff --git a/docs/03-core-concepts/03-namespace/02-buckets/04-layouts/01-object-store.md b/docs/03-core-concepts/03-namespace/02-buckets/04-layouts/01-object-store.md index 7d352a27b8..773361afc6 100644 --- a/docs/03-core-concepts/03-namespace/02-buckets/04-layouts/01-object-store.md +++ b/docs/03-core-concepts/03-namespace/02-buckets/04-layouts/01-object-store.md @@ -101,13 +101,13 @@ The output will include the `bucketLayout` field: ```json { - "volumeName" : "myvolume", - "name" : "mybucket", - "bucketLayout" : "OBJECT_STORE", - "storageType" : "DISK", - "versioning" : false, - "creationTime" : "2024-01-15T10:30:00.000Z", - "modificationTime" : "2024-01-15T10:30:00.000Z" + "volumeName": "myvolume", + "name": "mybucket", + "bucketLayout": "OBJECT_STORE", + "storageType": "DISK", + "versioning": false, + "creationTime": "2024-01-15T10:30:00.000Z", + "modificationTime": "2024-01-15T10:30:00.000Z" } ``` diff --git a/docs/03-core-concepts/03-namespace/02-buckets/04-layouts/02-file-system-optimized.md b/docs/03-core-concepts/03-namespace/02-buckets/04-layouts/02-file-system-optimized.md index b226fea718..fae4726928 100644 --- a/docs/03-core-concepts/03-namespace/02-buckets/04-layouts/02-file-system-optimized.md +++ b/docs/03-core-concepts/03-namespace/02-buckets/04-layouts/02-file-system-optimized.md @@ -65,10 +65,10 @@ Choose **Object Store (OBS)** when: To update the default layout when creating buckets, configure these properties in `ozone-site.xml`: -| Property | Default Value | Description | -|----------|---------------|-------------| -| `ozone.default.bucket.layout` | none | Sets the default layout for all buckets if no layout is specified during creation by the client | -| `ozone.client.fs.default.bucket.layout` | `FILE_SYSTEM_OPTIMIZED` | Sets the default layout for buckets created using the OFS client | -| `ozone.s3g.default.bucket.layout` | `OBJECT_STORE` | Defines the default layout for buckets created through the S3 API | +| Property | Default Value | Description | +| --------------------------------------- | ----------------------- | ----------------------------------------------------------------------------------------------- | +| `ozone.default.bucket.layout` | none | Sets the default layout for all buckets if no layout is specified during creation by the client | +| `ozone.client.fs.default.bucket.layout` | `FILE_SYSTEM_OPTIMIZED` | Sets the default layout for buckets created using the OFS client | +| `ozone.s3g.default.bucket.layout` | `OBJECT_STORE` | Defines the default layout for buckets created through the S3 API | For detailed technical information about the internal metadata structure and implementation, see the [File System Optimization System Internals](../../../../07-system-internals/07-features/01-filesystem-optimization.md) documentation. diff --git a/docs/03-core-concepts/03-namespace/02-buckets/04-layouts/README.mdx b/docs/03-core-concepts/03-namespace/02-buckets/04-layouts/README.mdx index 04ff0e1887..2b47860973 100644 --- a/docs/03-core-concepts/03-namespace/02-buckets/04-layouts/README.mdx +++ b/docs/03-core-concepts/03-namespace/02-buckets/04-layouts/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Layouts # Bucket Layouts -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents the different bucket layouts supported by Ozone and their use cases. - + diff --git a/docs/03-core-concepts/03-namespace/02-buckets/README.mdx b/docs/03-core-concepts/03-namespace/02-buckets/README.mdx index 4c2df2c8a9..5f4055b181 100644 --- a/docs/03-core-concepts/03-namespace/02-buckets/README.mdx +++ b/docs/03-core-concepts/03-namespace/02-buckets/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Buckets # Buckets -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents configuration and use cases for buckets: the second level of organization in Ozone's namespace. - + diff --git a/docs/03-core-concepts/03-namespace/03-keys/01-overview.md b/docs/03-core-concepts/03-namespace/03-keys/01-overview.md index f56ac72028..174fbbeb1a 100644 --- a/docs/03-core-concepts/03-namespace/03-keys/01-overview.md +++ b/docs/03-core-concepts/03-namespace/03-keys/01-overview.md @@ -30,6 +30,7 @@ For more details on key operations, refer to the [Ozone CLI documentation](/docs When a client writes a key, the Ozone Manager handles the metadata (key name, location of data blocks), and the Datanodes store the actual data blocks. For reads, the Ozone Manager provides the client with the locations of the data blocks, which the client then retrieves directly from the Datanodes. + For a deeper dive into the key write and read process, refer to the Ozone Manager documentation. ### Atomic Key Replacement @@ -37,6 +38,7 @@ For a deeper dive into the key write and read process, refer to the Ozone Manage Ozone supports atomic key replacement, ensuring that a key is only overwritten if it hasn't changed since it was last read. This prevents lost updates in concurrent write scenarios. + For more details, refer to the Overwriting Key Only If Unchanged design document. ### Trash diff --git a/docs/03-core-concepts/03-namespace/03-keys/README.mdx b/docs/03-core-concepts/03-namespace/03-keys/README.mdx index 6ac2896436..5cafa64234 100644 --- a/docs/03-core-concepts/03-namespace/03-keys/README.mdx +++ b/docs/03-core-concepts/03-namespace/03-keys/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Keys # Keys -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents the fundamental data objects in Ozone: keys, which are analogous to files in a traditional file system. - + diff --git a/docs/03-core-concepts/03-namespace/README.mdx b/docs/03-core-concepts/03-namespace/README.mdx index 7d7a88c452..8e21b235c0 100644 --- a/docs/03-core-concepts/03-namespace/README.mdx +++ b/docs/03-core-concepts/03-namespace/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Namespace # Namespace Layout -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents the layout of Ozone's namespace. - + diff --git a/docs/03-core-concepts/04-security/02-acls/01-native-acls.md b/docs/03-core-concepts/04-security/02-acls/01-native-acls.md index ea4d0bb88e..4755c4711d 100644 --- a/docs/03-core-concepts/04-security/02-acls/01-native-acls.md +++ b/docs/03-core-concepts/04-security/02-acls/01-native-acls.md @@ -8,9 +8,9 @@ Ozone supports a set of native ACLs. These ACLs can be used independently of Ozone ACL plugin such as Ranger. Add the following properties to the `ozone-site.xml` to enable native ACLs. -| Property | Value | -| -------- | ----- | -| `ozone.acl.enabled` | `true` | +| Property | Value | +| ---------------------------- | ------------------------------------------------------------ | +| `ozone.acl.enabled` | `true` | | `ozone.acl.authorizer.class` | `org.apache.hadoop.ozone.security.acl.OzoneNativeAuthorizer` | Ozone ACLs are a super set of Posix and S3 ACLs. @@ -19,7 +19,7 @@ The general format of an ACL is *object*:*who*:*rights*:*scope*. Where an *object* can be: -1. **Volume** - An Ozone volume. e.g. */volume* +1. **Volume** - An Ozone volume. e.g. */volume* 2. **Bucket** - An Ozone bucket. e.g. */volume/bucket* 3. **Key** - An object key or an object. e.g. */volume/bucket/key* 4. **Prefix** - A path prefix for a specific key. e.g. */volume/bucket/prefix1/prefix2* @@ -27,14 +27,14 @@ Where an *object* can be: Where a *who* can be: 1. **User** - A user in the Kerberos domain. User like in Posix world can be -named or unnamed. + named or unnamed. 2. **Group** - A group in the Kerberos domain. Group also like in Posix world -can be named or unnamed. + can be named or unnamed. 3. **World** - All authenticated users in the Kerberos domain. This maps to -others in the Posix domain. + others in the Posix domain. 4. **Anonymous** - Ignore the user field completely. This is an extension to -the Posix semantics, This is needed for S3 protocol, where we express that -we have no way of knowing who the user is or we don't care. + the Posix semantics, This is needed for S3 protocol, where we express that + we have no way of knowing who the user is or we don't care. :::tip A S3 user accessing Ozone via AWS v4 signature protocol will be translated to the appropriate Kerberos user by Ozone Manager. @@ -43,14 +43,14 @@ A S3 user accessing Ozone via AWS v4 signature protocol will be translated to th Where a *right* can be: 1. **Create** – This ACL provides a user the ability to create buckets in a -volume and keys in a bucket. Please note: Under Ozone, Only admins can create volumes. + volume and keys in a bucket. Please note: Under Ozone, Only admins can create volumes. 2. **List** – This ACL allows listing of buckets and keys. This ACL is attached - to the volume and buckets which allow listing of the child objects. Please note: The user and admins can list the volumes owned by the user. + to the volume and buckets which allow listing of the child objects. Please note: The user and admins can list the volumes owned by the user. 3. **Delete** – Allows the user to delete a volume, bucket or key. 4. **Read** – Allows the user to read the metadata of a Volume and Bucket and -data stream and metadata of a key. + data stream and metadata of a key. 5. **Write** - Allows the user to write the metadata of a Volume and Bucket and -allows the user to overwrite an existing Ozone key. + allows the user to overwrite an existing Ozone key. 6. **Read_ACL** – Allows a user to read the ACL on a specific object. 7. **Write_ACL** – Allows a user to write the ACL on a specific object. @@ -59,13 +59,12 @@ Where an *scope* can be: 1. **ACCESS** – Access ACL is applied only to the specific object and not inheritable. It controls the access to the object itself. 2. **DEFAULT** - Default ACL is applied to the specific object and will be inherited by object's descendants. Default ACLs cannot be set on keys (as there can be no objects under a key). - :::note - ACLs inherited from parent's Default ACLs will follow the following rules based on different bucket layout: + :::note + ACLs inherited from parent's Default ACLs will follow the following rules based on different bucket layout: + - **Legacy with EnableFileSystem or FSO**: inherit the immediate parent's DEFAULT ACLs. If none, inherit the bucket DEFAULT ACLs. + - **Legacy with DisableFileSystem or OBS**: inherit the bucket DEFAULT ACLs. - - **Legacy with EnableFileSystem or FSO**: inherit the immediate parent's DEFAULT ACLs. If none, inherit the bucket DEFAULT ACLs. - - **Legacy with DisableFileSystem or OBS**: inherit the bucket DEFAULT ACLs. - - ::: + ::: ## Ozone Native ACL APIs @@ -128,7 +127,7 @@ $ ozone sh bucket setacl -a world::a /vol1/bucket4 ### `getacl` ```shell -$ ozone sh bucket getacl /vol1/bucket2 +$ ozone sh bucket getacl /vol1/bucket2 [ { "type" : "USER", "name" : "om/om@EXAMPLE.COM", diff --git a/docs/03-core-concepts/04-security/02-acls/README.mdx b/docs/03-core-concepts/04-security/02-acls/README.mdx index 8423fefc72..1991af866b 100644 --- a/docs/03-core-concepts/04-security/02-acls/README.mdx +++ b/docs/03-core-concepts/04-security/02-acls/README.mdx @@ -4,8 +4,8 @@ sidebar_label: ACLs # Authorization With ACLs -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section covers Ozone's ACL support, which can be used to restrict access to different portions of the namespace once a user has authenticated with [Kerberos](../kerberos). To configure access for administrator operations that do not involve the Ozone namespace, see the [Administrator Guide](../../../administrator-guide/configuration/security/administrators). - + diff --git a/docs/03-core-concepts/04-security/README.mdx b/docs/03-core-concepts/04-security/README.mdx index 7b0006bb3e..077f870daf 100644 --- a/docs/03-core-concepts/04-security/README.mdx +++ b/docs/03-core-concepts/04-security/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Security # Using a Secure Ozone Cluster -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents the primary mechanisms Ozone uses for authentication and authorization of users and administrators. To configure encryption and other security mechanisms within an Ozone cluster, see the [Administrator Guide](../../administrator-guide/configuration/security). - + diff --git a/docs/03-core-concepts/05-high-availability/README.mdx b/docs/03-core-concepts/05-high-availability/README.mdx index 46728a6e57..04956fefa2 100644 --- a/docs/03-core-concepts/05-high-availability/README.mdx +++ b/docs/03-core-concepts/05-high-availability/README.mdx @@ -4,8 +4,8 @@ sidebar_label: High Availability # High Availability -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section describes how Ozone achieves high availability for its metadata managers to eliminate single points of failure. - + diff --git a/docs/03-core-concepts/06-comparison.md b/docs/03-core-concepts/06-comparison.md index 6e2e53393f..5814485bd5 100644 --- a/docs/03-core-concepts/06-comparison.md +++ b/docs/03-core-concepts/06-comparison.md @@ -10,42 +10,42 @@ This document provides a high-level comparison of Apache Ozone with other storag Ozone is most often compared against other open source storage systems. -| Tech | Type | Consistency | Scale | Big Data Integration | License | Notes | -| ---- | ---- | ----------- | ----- | -------------------- | ------- | ----- | -| **Ozone** | Object / File | Strong | Exabyte scale, tens of billions keys | Native | Apache 2.0 | Modern Hadoop-native object store with S3 API | -| **HDFS** | File | Strong | PBs, billions files | Native | Apache 2.0 | Classic Hadoop FS, no S3 API, tight Hadoop integration | -| **Ceph** | Object / Block / File | Tunable / Eventual | Multi-PB, very large | Via S3 Gateway/CephFS | LGPLv2.1 / Ceph Foundation | General-purpose: underlying RADOS (object), RGW (object), CephFS (file) | -| **MinIO** | Object | Strong | Petabyte scale | Via S3 connectors | AGPLv3 (SSPL-like) | Cloud-native S3 API, lightweight, fast, no FS semantics | -| **Lustre** | Parallel File (POSIX) | Strong | PB scale, HPC | None | GPLv2 | HPC clusters, high-throughput parallel file system | -| **GlusterFS** | File (POSIX) | Eventually consistent | Large, multi-PB | None | GPLv3 | General-purpose scale-out distributed file storage | -| **OpenStack Swift** | Object | Eventual | Large, multi-PB | Via connectors | Apache 2.0 | S3-like multi-tenant object storage for private clouds | +| Tech | Type | Consistency | Scale | Big Data Integration | License | Notes | +| ------------------- | --------------------- | --------------------- | ------------------------------------ | --------------------- | -------------------------- | ----------------------------------------------------------------------- | +| **Ozone** | Object / File | Strong | Exabyte scale, tens of billions keys | Native | Apache 2.0 | Modern Hadoop-native object store with S3 API | +| **HDFS** | File | Strong | PBs, billions files | Native | Apache 2.0 | Classic Hadoop FS, no S3 API, tight Hadoop integration | +| **Ceph** | Object / Block / File | Tunable / Eventual | Multi-PB, very large | Via S3 Gateway/CephFS | LGPLv2.1 / Ceph Foundation | General-purpose: underlying RADOS (object), RGW (object), CephFS (file) | +| **MinIO** | Object | Strong | Petabyte scale | Via S3 connectors | AGPLv3 (SSPL-like) | Cloud-native S3 API, lightweight, fast, no FS semantics | +| **Lustre** | Parallel File (POSIX) | Strong | PB scale, HPC | None | GPLv2 | HPC clusters, high-throughput parallel file system | +| **GlusterFS** | File (POSIX) | Eventually consistent | Large, multi-PB | None | GPLv3 | General-purpose scale-out distributed file storage | +| **OpenStack Swift** | Object | Eventual | Large, multi-PB | Via connectors | Apache 2.0 | S3-like multi-tenant object storage for private clouds | Ozone shines when users are in need of an Apache licensed, strongly consistent storage system that can scale to billions of keys/files and hundreds of PBs to EBs. ## Proprietary Scale-Out Storage Comparison -| Tech | Type | Consistency | Scale | Big Data Integration | Performance Focus | Notes | -| ---- | ---- | ----------- | ----- | -------------------- | ----------------- | ----- | -| **Isilon (Dell PowerScale)** | File (Scale-Out NAS) | Strong | PBs, billions of files | Indirect | High throughput, good mixed IO | Enterprise NAS, POSIX compliant, good for mixed workloads, backup, analytics | -| **VAST** | File / Object | Strong | PBs | Yes, AI workloads | Ultra-low latency, all-flash NVMe | All-flash, NFS/S3, great for AI/ML and large unstructured datasets | -| **WEKA** | Parallel File | Strong | PBs | HPC, AI | Ultra-low latency, high IOPS | High-performance file, GPU clusters, NFS/SMB/S3 | -| **Spectrum Scale (GPFS)** | File (POSIX) | Strong | PBs | HPC, AI | High throughput, scale-out metadata | IBM, used in HPC/AI, policy tiering, good POSIX compliance | -| **Scality** | Object | Strong | PBs | Some | Good throughput for large objects | Enterprise S3 API, multi-region, backup archives, hybrid cloud | -| **Cloudian** | Object | Strong | PBs | Some | Good throughput for backup/archive | S3-compatible object storage, ransomware protection, hybrid cloud | +| Tech | Type | Consistency | Scale | Big Data Integration | Performance Focus | Notes | +| ---------------------------- | -------------------- | ----------- | ---------------------- | -------------------- | ----------------------------------- | ---------------------------------------------------------------------------- | +| **Isilon (Dell PowerScale)** | File (Scale-Out NAS) | Strong | PBs, billions of files | Indirect | High throughput, good mixed IO | Enterprise NAS, POSIX compliant, good for mixed workloads, backup, analytics | +| **VAST** | File / Object | Strong | PBs | Yes, AI workloads | Ultra-low latency, all-flash NVMe | All-flash, NFS/S3, great for AI/ML and large unstructured datasets | +| **WEKA** | Parallel File | Strong | PBs | HPC, AI | Ultra-low latency, high IOPS | High-performance file, GPU clusters, NFS/SMB/S3 | +| **Spectrum Scale (GPFS)** | File (POSIX) | Strong | PBs | HPC, AI | High throughput, scale-out metadata | IBM, used in HPC/AI, policy tiering, good POSIX compliance | +| **Scality** | Object | Strong | PBs | Some | Good throughput for large objects | Enterprise S3 API, multi-region, backup archives, hybrid cloud | +| **Cloudian** | Object | Strong | PBs | Some | Good throughput for backup/archive | S3-compatible object storage, ransomware protection, hybrid cloud | The proprietary systems offer enterprise-grade quality, but they often require proprietary or certified hardware. Ozone shines when users look for commodity hardware, open systems and embrace the vibrant Apache big data open source community. ## Cloud-Native Object Storage Comparison -| Tech | Type | Consistency | Scale | Big Data Integration | Notes | -| ---- | ---- | ----------- | ----- | -------------------- | ----- | -| **AWS S3** | Object | Strong | Exabyte+ | Native to cloud ecosystem | The de-facto standard for object storage; massive durability, S3 API leader | -| **Azure ABFS** | File/Object (Data Lake Storage) | Strong | Exabyte+ | Azure-native | HDFS-like semantics for Spark/Hadoop; optimized for analytics | -| **Google GCS** | Object | Strong | Exabyte+ | Native to cloud ecosystem | Globally distributed; strong consistency; well-integrated with BigQuery | -| **OCI Object Storage** | Object | Strong | Exabyte+ | Via S3 API & native services | Oracle’s S3-compatible storage; integrates with OCI Data Flow | -| **Alibaba OSS** | Object | Strong | Exabyte+ | Via S3 API & native services | S3-compatible, huge China/APAC footprint | -| **IBM Cloud Object Storage** | Object | Strong | Exabyte+ | Via S3 API & native services | S3-compatible, geo-dispersed erasure coding for durability | +| Tech | Type | Consistency | Scale | Big Data Integration | Notes | +| ---------------------------- | ------------------------------- | ----------- | -------- | ---------------------------- | --------------------------------------------------------------------------- | +| **AWS S3** | Object | Strong | Exabyte+ | Native to cloud ecosystem | The de-facto standard for object storage; massive durability, S3 API leader | +| **Azure ABFS** | File/Object (Data Lake Storage) | Strong | Exabyte+ | Azure-native | HDFS-like semantics for Spark/Hadoop; optimized for analytics | +| **Google GCS** | Object | Strong | Exabyte+ | Native to cloud ecosystem | Globally distributed; strong consistency; well-integrated with BigQuery | +| **OCI Object Storage** | Object | Strong | Exabyte+ | Via S3 API & native services | Oracle’s S3-compatible storage; integrates with OCI Data Flow | +| **Alibaba OSS** | Object | Strong | Exabyte+ | Via S3 API & native services | S3-compatible, huge China/APAC footprint | +| **IBM Cloud Object Storage** | Object | Strong | Exabyte+ | Via S3 API & native services | S3-compatible, geo-dispersed erasure coding for durability | These cloud storage offerings are only available from their respective public cloud vendors. In contrast, Ozone runs on-prem or in your private cloud, giving you full control. diff --git a/docs/03-core-concepts/README.mdx b/docs/03-core-concepts/README.mdx index b129e86e25..d1695a2fc4 100644 --- a/docs/03-core-concepts/README.mdx +++ b/docs/03-core-concepts/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Core Concepts # Core Concepts -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section covers Ozone concepts that are helpful for both users and administrators to understand. Topics in this section will be referenced throughout the documentation. - + diff --git a/docs/04-user-guide/01-client-interfaces/01-o3.md b/docs/04-user-guide/01-client-interfaces/01-o3.md index 6154b80082..4517c51f8d 100644 --- a/docs/04-user-guide/01-client-interfaces/01-o3.md +++ b/docs/04-user-guide/01-client-interfaces/01-o3.md @@ -11,7 +11,7 @@ There are some functionality which couldn't be accessed without using `ozone sh` 1. Creating volumes with quota 2. Managing internal ACLs 3. Creating buckets with encryption key - + All of these are one-time, administration tasks. Applications can use Ozone without this CLI using other interface like Hadoop Compatible File System (o3fs or ofs) or S3 interface. Ozone shell help can be invoked at *object* level or at *action* level. @@ -53,10 +53,10 @@ Depending on the action, Ozone URL can point to a volume, bucket or key in the f Where, 1. **Schema** - This should be `o3` which is the native RPC protocol to access - Ozone API. The usage of the schema is optional. + Ozone API. The usage of the schema is optional. 2. **Server:Port** - This is the address of the Ozone Manager. If the port is -omitted the default port from `ozone-site.xml` will be used. + omitted the default port from `ozone-site.xml` will be used. Please see volume commands, bucket commands, and key commands section for more detail. diff --git a/docs/04-user-guide/01-client-interfaces/02-ofs.md b/docs/04-user-guide/01-client-interfaces/02-ofs.md index 3ceab69b02..cc300e7ee6 100644 --- a/docs/04-user-guide/01-client-interfaces/02-ofs.md +++ b/docs/04-user-guide/01-client-interfaces/02-ofs.md @@ -248,47 +248,47 @@ Once you have a list of APIs, compare it against the tables below to identify an The following standard `FileSystem` APIs are supported by ofs. -| Operation | NameNode audit log | Description | Support | -|-------------------------|---------------------------|-----------------------------------------------------|---------------| -| `access` | `checkAccess` | Checks if the user can access a path. | Supported | -| `create` | `create` | Creates a new file. | Supported | -| `open` | `open` | Opens a file for reading. | Supported | -| `rename` | `rename` | Renames a file or directory. | Supported [[1]](#footnote-1) | -| `delete` | `delete` | Deletes a file or directory. | Supported [[2]](#footnote-2) | -| `listStatus` | `listStatus` | Lists the status of files in a directory. | Supported [[3]](#footnote-3) | -| `mkdirs` | `mkdirs` | Creates a directory and its parents. | Supported | -| `getFileStatus` | `getfileinfo` | Gets the status of a file. | Supported | -| `setTimes` | `setTimes` | Sets the modification and access times. | Supported | -| `getLinkTarget` | `getfileinfo` | Gets the target of a symbolic link. | Supported [[4]](#footnote-4) | -| `getFileChecksum` | `open` | Gets the checksum of a file. | Supported | -| `setSafeMode` | `safemode_leave`, `safemode_enter`, `safemode_get`, `safemode_force_exit` | Enters or leaves safe mode. | Supported | -| `recoverLease` | `recoverLease` | Recovers a file lease. | Supported | -| `isFileClosed` | `isFileClosed` | Checks if a file is closed. | Supported | -| `createSnapshot` | `createSnapshot` | Creates a snapshot. | Supported [[5]](#footnote-5) | -| `deleteSnapshot` | `deleteSnapshot` | Deletes a snapshot. | Supported [[5]](#footnote-5) | -| `renameSnapshot` | `renameSnapshot` | Renames a snapshot. | Supported [[5]](#footnote-5) | -| `getSnapshotDiffReport` | `computeSnapshotDiff` | Gets a snapshot diff report. | Supported [[5]](#footnote-5) | -| `getContentSummary` | `contentSummary` | Gets the content summary of a path. | Supported | -| `getDelegationToken` | `getDelegationToken` | Gets a delegation token. | Supported | -| `globStatus` | `listStatus` | Finds files matching a pattern. | Supported | -| `copyFromLocalFile` | `getfileinfo` | Copies a file from the local filesystem. | Supported | -| `exists` | `getfileinfo` | Checks if a path exists. | Supported | -| `getFileBlockLocations` | `open` | Gets file block locations. | Supported | -| `getTrashRoot` | `listSnapshottableDirectory`, `getEZForPath` | Gets the trash root for a path. | Supported | -| `getTrashRoots` | `listStatus`, `listEncryptionZones` | Gets all trash roots. | Supported | -| `isDirectory` | `getfileinfo` | Checks if a path is a directory. | Supported | -| `isFile` | `getfileinfo` | Checks if a path is a file. | Supported | -| `listFiles` | `listStatus` | Returns a remote iterator for files. | Supported | -| `listLocatedStatus` | `listStatus` | Returns a remote iterator for located file statuses.| Supported | -| `listStatusIterator` | `listStatus` | Returns a remote iterator for file statuses. | Supported | -| `getDefaultBlockSize` | N/A | Gets the default block size. | Supported | -| `getDefaultReplication` | N/A | Gets the default replication factor. | Supported | -| `getHomeDirectory` | N/A | Gets the user's home directory. | Supported | -| `getServerDefaults` | N/A | Gets the server default values. | Supported | -| `getWorkingDirectory` | N/A | Gets the current working directory. | Supported | -| `hasPathCapability` | N/A | Queries for a path capability. | Supported | -| `setWorkingDirectory` | N/A | Sets the current working directory. | Supported | -| `supportsSymlinks` | N/A | Checks if symbolic links are supported. | Supported | +| Operation | NameNode audit log | Description | Support | +| ----------------------- | ------------------------------------------------------------------------- | ---------------------------------------------------- | ---------------------------- | +| `access` | `checkAccess` | Checks if the user can access a path. | Supported | +| `create` | `create` | Creates a new file. | Supported | +| `open` | `open` | Opens a file for reading. | Supported | +| `rename` | `rename` | Renames a file or directory. | Supported [[1]](#footnote-1) | +| `delete` | `delete` | Deletes a file or directory. | Supported [[2]](#footnote-2) | +| `listStatus` | `listStatus` | Lists the status of files in a directory. | Supported [[3]](#footnote-3) | +| `mkdirs` | `mkdirs` | Creates a directory and its parents. | Supported | +| `getFileStatus` | `getfileinfo` | Gets the status of a file. | Supported | +| `setTimes` | `setTimes` | Sets the modification and access times. | Supported | +| `getLinkTarget` | `getfileinfo` | Gets the target of a symbolic link. | Supported [[4]](#footnote-4) | +| `getFileChecksum` | `open` | Gets the checksum of a file. | Supported | +| `setSafeMode` | `safemode_leave`, `safemode_enter`, `safemode_get`, `safemode_force_exit` | Enters or leaves safe mode. | Supported | +| `recoverLease` | `recoverLease` | Recovers a file lease. | Supported | +| `isFileClosed` | `isFileClosed` | Checks if a file is closed. | Supported | +| `createSnapshot` | `createSnapshot` | Creates a snapshot. | Supported [[5]](#footnote-5) | +| `deleteSnapshot` | `deleteSnapshot` | Deletes a snapshot. | Supported [[5]](#footnote-5) | +| `renameSnapshot` | `renameSnapshot` | Renames a snapshot. | Supported [[5]](#footnote-5) | +| `getSnapshotDiffReport` | `computeSnapshotDiff` | Gets a snapshot diff report. | Supported [[5]](#footnote-5) | +| `getContentSummary` | `contentSummary` | Gets the content summary of a path. | Supported | +| `getDelegationToken` | `getDelegationToken` | Gets a delegation token. | Supported | +| `globStatus` | `listStatus` | Finds files matching a pattern. | Supported | +| `copyFromLocalFile` | `getfileinfo` | Copies a file from the local filesystem. | Supported | +| `exists` | `getfileinfo` | Checks if a path exists. | Supported | +| `getFileBlockLocations` | `open` | Gets file block locations. | Supported | +| `getTrashRoot` | `listSnapshottableDirectory`, `getEZForPath` | Gets the trash root for a path. | Supported | +| `getTrashRoots` | `listStatus`, `listEncryptionZones` | Gets all trash roots. | Supported | +| `isDirectory` | `getfileinfo` | Checks if a path is a directory. | Supported | +| `isFile` | `getfileinfo` | Checks if a path is a file. | Supported | +| `listFiles` | `listStatus` | Returns a remote iterator for files. | Supported | +| `listLocatedStatus` | `listStatus` | Returns a remote iterator for located file statuses. | Supported | +| `listStatusIterator` | `listStatus` | Returns a remote iterator for file statuses. | Supported | +| `getDefaultBlockSize` | N/A | Gets the default block size. | Supported | +| `getDefaultReplication` | N/A | Gets the default replication factor. | Supported | +| `getHomeDirectory` | N/A | Gets the user's home directory. | Supported | +| `getServerDefaults` | N/A | Gets the server default values. | Supported | +| `getWorkingDirectory` | N/A | Gets the current working directory. | Supported | +| `hasPathCapability` | N/A | Queries for a path capability. | Supported | +| `setWorkingDirectory` | N/A | Sets the current working directory. | Supported | +| `supportsSymlinks` | N/A | Checks if symbolic links are supported. | Supported | *Note: An audit log of N/A means the API is client-side only and does not access the NameNode.* @@ -296,81 +296,81 @@ The following standard `FileSystem` APIs are supported by ofs. The following standard `FileSystem` APIs are not supported by ofs. -| Operation | NameNode audit log | Description | -|--------------------|----------------------|--------------------------------| -| `append` | `append` | Appends to an existing file. | -| `setPermission` | `setPermission` | Sets the permission of a file. | -| `setOwner` | `setOwner` | Sets the owner of a file. | -| `setReplication` | `setReplication` | Sets the replication factor. | -| `createSymlink` | `createSymlink` | Creates a symbolic link. | -| `resolveLink` | `getfileinfo` | Resolves a symbolic link. | -| `setXAttr` | `setXAttr` | Sets an extended attribute. | -| `getXAttr` | `getXAttrs` | Gets an extended attribute. | -| `getXAttrs` | `getXAttrs` | Gets extended attributes. | -| `listXAttrs` | `listXAttrs` | Lists extended attributes. | -| `removeXAttr` | `removeXAttr` | Removes an extended attribute. | -| `setAcl` | `setAcl` | Sets an ACL. | -| `getAclStatus` | `getAclStatus` | Gets an ACL status. | -| `modifyAclEntries` | `modifyAclEntries` | Modifies ACL entries. | -| `removeAclEntries` | `removeAclEntries` | Removes ACL entries. | -| `removeDefaultAcl` | `removeDefaultAcl` | Removes the default ACL. | -| `removeAcl` | `removeAcl` | Removes an ACL. | -| `truncate` | `truncate` | Truncates a file. | -| `concat` | `concat` | Concatenates files. | -| `listCorruptFileBlocks` | `listCorruptFileBlocks` | List corrupted file blocks | -| `msync` | N/A | Does not have a corresponding HDFS audit log. | +| Operation | NameNode audit log | Description | +| ----------------------- | ----------------------- | --------------------------------------------- | +| `append` | `append` | Appends to an existing file. | +| `setPermission` | `setPermission` | Sets the permission of a file. | +| `setOwner` | `setOwner` | Sets the owner of a file. | +| `setReplication` | `setReplication` | Sets the replication factor. | +| `createSymlink` | `createSymlink` | Creates a symbolic link. | +| `resolveLink` | `getfileinfo` | Resolves a symbolic link. | +| `setXAttr` | `setXAttr` | Sets an extended attribute. | +| `getXAttr` | `getXAttrs` | Gets an extended attribute. | +| `getXAttrs` | `getXAttrs` | Gets extended attributes. | +| `listXAttrs` | `listXAttrs` | Lists extended attributes. | +| `removeXAttr` | `removeXAttr` | Removes an extended attribute. | +| `setAcl` | `setAcl` | Sets an ACL. | +| `getAclStatus` | `getAclStatus` | Gets an ACL status. | +| `modifyAclEntries` | `modifyAclEntries` | Modifies ACL entries. | +| `removeAclEntries` | `removeAclEntries` | Removes ACL entries. | +| `removeDefaultAcl` | `removeDefaultAcl` | Removes the default ACL. | +| `removeAcl` | `removeAcl` | Removes an ACL. | +| `truncate` | `truncate` | Truncates a file. | +| `concat` | `concat` | Concatenates files. | +| `listCorruptFileBlocks` | `listCorruptFileBlocks` | List corrupted file blocks | +| `msync` | N/A | Does not have a corresponding HDFS audit log. | ### Unsupported HDFS-Specific APIs The following APIs are specific to HDFS's `DistributedFileSystem` implementation and are not part of the generic `org.apache.hadoop.fs.FileSystem` API. Therefore, they are not supported by ofs. However, see the footnotes below for equivalent APIs. -| Operation | NameNode audit log | Description | Support | -|--------------------------------|------------------------------|-----------------------------------------------------|----------------| -| `getErasureCodingPolicy` | `getErasureCodingPolicy` | Gets the erasure coding policy of a file/dir. | Unsupported [[6]](#footnote-6)| -| `setErasureCodingPolicy` | `setErasureCodingPolicy` | Sets an erasure coding policy on a directory. | Unsupported [[6]](#footnote-6)| -| `unsetErasureCodingPolicy` | `unsetErasureCodingPolicy` | Unsets an erasure coding policy on a directory. | Unsupported [[6]](#footnote-6)| -| `addErasureCodingPolicies` | `addErasureCodingPolicies` | Adds erasure coding policies. | Unsupported [[6]](#footnote-6)| -| `getErasureCodingPolicies` | `getErasureCodingPolicies` | Gets the available erasure coding policies. | Unsupported [[6]](#footnote-6)| -| `removeErasureCodingPolicy` | `removeErasureCodingPolicy` | Removes an erasure coding policy. | Unsupported [[6]](#footnote-6)| -| `enableErasureCodingPolicy` | `enableErasureCodingPolicy` | Enables an erasure coding policy. | Unsupported [[6]](#footnote-6)| -| `disableErasureCodingPolicy` | `disableErasureCodingPolicy` | Disables an erasure coding policy. | Unsupported [[6]](#footnote-6)| -| `getErasureCodingCodecs` | `getErasureCodingCodecs` | Lists all erasure coding codecs. | Unsupported [[6]](#footnote-6)| -| `getECTopologyResultForPolicies` | `getECTopologyResultForPolicies` | Get erasure coding topology result for policies. | Unsupported [[6]](#footnote-6)| -| `getSnapshotListing` | `ListSnapshot` | List all snapshots of a snapshottable directory. | Unsupported [[6]](#footnote-6)| -| `allowSnapshot` | `allowSnapshot` | Allows snapshots to be taken on a directory. | Unsupported [[6]](#footnote-6)| -| `disallowSnapshot` | `disallowSnapshot` | Disallows snapshots to be taken on a directory. | Unsupported [[6]](#footnote-6)| -| `provisionSnapshotTrash` | `getfileinfo`, `mkdirs`, `setPermission` | Provision trash for a snapshottable directory. | Unsupported [[6]](#footnote-6)| -| `createEncryptionZone` | `createEncryptionZone` | Creates an encryption zone. | Unsupported [[6]](#footnote-6)| -| `getEZForPath` | `getEZForPath` | Gets the encryption zone for a path. | Unsupported [[6]](#footnote-6)| -| `listEncryptionZones` | `listEncryptionZones` | Lists all encryption zones. | Unsupported [[6]](#footnote-6)| -| `reencryptEncryptionZone` | `reencryptEncryptionZone` | Reencrypt an encryption zone. | Unsupported [[6]](#footnote-6)| -| `listReencryptionStatus` | `listReencryptionStatus` | List reencryption status. | Unsupported [[6]](#footnote-6)| -| `getFileEncryptionInfo` | `getfileinfo` | Get file encryption info. | Unsupported [[6]](#footnote-6)| -| `provisionEZTrash` | `getEZForPath`, `getfileinfo`, `mkdirs`, `setPermission` | Provision trash for an encryption zone. | Unsupported [[6]](#footnote-6)| -| `setQuota` | `clearQuota` or `clearSpaceQuota` or `setQuota` or `setSpaceQuota` | Sets the quota usage for a path. | Unsupported [[6]](#footnote-6)| -| `getQuotaUsage` | `quotaUsage` | Gets the quota usage for a path. | Unsupported [[6]](#footnote-6)| -| `setQuotaByStorageType` | `setSpaceQuota` | Sets quota by storage type for a path. | Unsupported [[6]](#footnote-6)| -| `unsetStoragePolicy` | `unsetStoragePolicy` | Unsets a storage policy on a file or directory. | Unsupported | -| `setStoragePolicy` | `setStoragePolicy` | Sets a storage policy on a file or directory. | Unsupported | -| `getStoragePolicy` | `getStoragePolicy` | Gets the storage policy of a file or directory. | Unsupported | -| `satisfyStoragePolicy` | `satisfyStoragePolicy` | Satisfies the storage policy of a file. | Unsupported | -| `addCachePool` | `addCachePool` | Adds a cache pool. | Unsupported | -| `modifyCachePool` | `modifyCachePool` | Modifies a cache pool. | Unsupported | -| `removeCachePool` | `removeCachePool` | Removes a cache pool. | Unsupported | -| `listCachePools` | `listCachePools` | Lists all cache pools. | Unsupported | -| `addCacheDirective` | `addCacheDirective` | Adds a cache directive. | Unsupported | -| `modifyCacheDirective` | `modifyCacheDirective` | Modifies a cache directive. | Unsupported | -| `removeCacheDirective` | `removeCacheDirective` | Removes a cache directive. | Unsupported | -| `listCacheDirectives` | `listCacheDirectives` | Lists cache directives. | Unsupported | -| `getSlowDatanodeStats` | `datanodeReport` | Get slow Datanode stats. | Unsupported | -| `saveNamespace` | `saveNamespace` | Save the namespace. | Unsupported | -| `restoreFailedStorage` | `checkRestoreFailedStorage`, `enableRestoreFailedStorage`, `disableRestoreFailedStorage` | Restore failed storage. | Unsupported | -| `refreshNodes` | `refreshNodes` | Refresh nodes. | Unsupported | -| `setBalancerBandwidth` | `setBalancerBandwidth` | Set balancer bandwidth. | Unsupported | -| `metaSave` | `metaSave` | Meta save. | Unsupported | -| `rollingUpgrade` | `queryRollingUpgrade`, `startRollingUpgrade`, `finalizeRollingUpgrade` | Rolling upgrade. | Unsupported | -| `finalizeUpgrade` | `finalizeUpgrade` | Finalize upgrade. | Unsupported [[7]](#footnote-7) | -| `listOpenFiles` | `listOpenFiles` | List open files. | Unsupported [[7]](#footnote-7) | +| Operation | NameNode audit log | Description | Support | +| -------------------------------- | ---------------------------------------------------------------------------------------- | ------------------------------------------------ | ------------------------------ | +| `getErasureCodingPolicy` | `getErasureCodingPolicy` | Gets the erasure coding policy of a file/dir. | Unsupported [[6]](#footnote-6) | +| `setErasureCodingPolicy` | `setErasureCodingPolicy` | Sets an erasure coding policy on a directory. | Unsupported [[6]](#footnote-6) | +| `unsetErasureCodingPolicy` | `unsetErasureCodingPolicy` | Unsets an erasure coding policy on a directory. | Unsupported [[6]](#footnote-6) | +| `addErasureCodingPolicies` | `addErasureCodingPolicies` | Adds erasure coding policies. | Unsupported [[6]](#footnote-6) | +| `getErasureCodingPolicies` | `getErasureCodingPolicies` | Gets the available erasure coding policies. | Unsupported [[6]](#footnote-6) | +| `removeErasureCodingPolicy` | `removeErasureCodingPolicy` | Removes an erasure coding policy. | Unsupported [[6]](#footnote-6) | +| `enableErasureCodingPolicy` | `enableErasureCodingPolicy` | Enables an erasure coding policy. | Unsupported [[6]](#footnote-6) | +| `disableErasureCodingPolicy` | `disableErasureCodingPolicy` | Disables an erasure coding policy. | Unsupported [[6]](#footnote-6) | +| `getErasureCodingCodecs` | `getErasureCodingCodecs` | Lists all erasure coding codecs. | Unsupported [[6]](#footnote-6) | +| `getECTopologyResultForPolicies` | `getECTopologyResultForPolicies` | Get erasure coding topology result for policies. | Unsupported [[6]](#footnote-6) | +| `getSnapshotListing` | `ListSnapshot` | List all snapshots of a snapshottable directory. | Unsupported [[6]](#footnote-6) | +| `allowSnapshot` | `allowSnapshot` | Allows snapshots to be taken on a directory. | Unsupported [[6]](#footnote-6) | +| `disallowSnapshot` | `disallowSnapshot` | Disallows snapshots to be taken on a directory. | Unsupported [[6]](#footnote-6) | +| `provisionSnapshotTrash` | `getfileinfo`, `mkdirs`, `setPermission` | Provision trash for a snapshottable directory. | Unsupported [[6]](#footnote-6) | +| `createEncryptionZone` | `createEncryptionZone` | Creates an encryption zone. | Unsupported [[6]](#footnote-6) | +| `getEZForPath` | `getEZForPath` | Gets the encryption zone for a path. | Unsupported [[6]](#footnote-6) | +| `listEncryptionZones` | `listEncryptionZones` | Lists all encryption zones. | Unsupported [[6]](#footnote-6) | +| `reencryptEncryptionZone` | `reencryptEncryptionZone` | Reencrypt an encryption zone. | Unsupported [[6]](#footnote-6) | +| `listReencryptionStatus` | `listReencryptionStatus` | List reencryption status. | Unsupported [[6]](#footnote-6) | +| `getFileEncryptionInfo` | `getfileinfo` | Get file encryption info. | Unsupported [[6]](#footnote-6) | +| `provisionEZTrash` | `getEZForPath`, `getfileinfo`, `mkdirs`, `setPermission` | Provision trash for an encryption zone. | Unsupported [[6]](#footnote-6) | +| `setQuota` | `clearQuota` or `clearSpaceQuota` or `setQuota` or `setSpaceQuota` | Sets the quota usage for a path. | Unsupported [[6]](#footnote-6) | +| `getQuotaUsage` | `quotaUsage` | Gets the quota usage for a path. | Unsupported [[6]](#footnote-6) | +| `setQuotaByStorageType` | `setSpaceQuota` | Sets quota by storage type for a path. | Unsupported [[6]](#footnote-6) | +| `unsetStoragePolicy` | `unsetStoragePolicy` | Unsets a storage policy on a file or directory. | Unsupported | +| `setStoragePolicy` | `setStoragePolicy` | Sets a storage policy on a file or directory. | Unsupported | +| `getStoragePolicy` | `getStoragePolicy` | Gets the storage policy of a file or directory. | Unsupported | +| `satisfyStoragePolicy` | `satisfyStoragePolicy` | Satisfies the storage policy of a file. | Unsupported | +| `addCachePool` | `addCachePool` | Adds a cache pool. | Unsupported | +| `modifyCachePool` | `modifyCachePool` | Modifies a cache pool. | Unsupported | +| `removeCachePool` | `removeCachePool` | Removes a cache pool. | Unsupported | +| `listCachePools` | `listCachePools` | Lists all cache pools. | Unsupported | +| `addCacheDirective` | `addCacheDirective` | Adds a cache directive. | Unsupported | +| `modifyCacheDirective` | `modifyCacheDirective` | Modifies a cache directive. | Unsupported | +| `removeCacheDirective` | `removeCacheDirective` | Removes a cache directive. | Unsupported | +| `listCacheDirectives` | `listCacheDirectives` | Lists cache directives. | Unsupported | +| `getSlowDatanodeStats` | `datanodeReport` | Get slow Datanode stats. | Unsupported | +| `saveNamespace` | `saveNamespace` | Save the namespace. | Unsupported | +| `restoreFailedStorage` | `checkRestoreFailedStorage`, `enableRestoreFailedStorage`, `disableRestoreFailedStorage` | Restore failed storage. | Unsupported | +| `refreshNodes` | `refreshNodes` | Refresh nodes. | Unsupported | +| `setBalancerBandwidth` | `setBalancerBandwidth` | Set balancer bandwidth. | Unsupported | +| `metaSave` | `metaSave` | Meta save. | Unsupported | +| `rollingUpgrade` | `queryRollingUpgrade`, `startRollingUpgrade`, `finalizeRollingUpgrade` | Rolling upgrade. | Unsupported | +| `finalizeUpgrade` | `finalizeUpgrade` | Finalize upgrade. | Unsupported [[7]](#footnote-7) | +| `listOpenFiles` | `listOpenFiles` | List open files. | Unsupported [[7]](#footnote-7) | **Footnotes:** diff --git a/docs/04-user-guide/01-client-interfaces/03-s3/01-s3-api.md b/docs/04-user-guide/01-client-interfaces/03-s3/01-s3-api.md index 8966fb4c57..1a97bca29b 100644 --- a/docs/04-user-guide/01-client-interfaces/03-s3/01-s3-api.md +++ b/docs/04-user-guide/01-client-interfaces/03-s3/01-s3-api.md @@ -38,49 +38,49 @@ The Ozone S3 Gateway implements a substantial subset of the Amazon S3 REST API. ### Bucket Operations -| **API Name** | **Feature** | **Note** | -| --------------------------------------------------------------------------------------------------- | ------------- | ---------- | -| ✅ [ListBuckets](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html) | Lists all buckets owned by the authenticated user. | Returns the full bucket list. | -| ✅ [CreateBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html) | Creates a new bucket. | **Non-compliant behavior:** The default bucket ACL may include extra group permissions instead of being strictly private. Bucket names must adhere to S3 naming conventions. | -| ✅ [HeadBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadBucket.html) | Checks for the existence of a bucket. | Returns a 200 status if the bucket exists. | -| ✅ [DeleteBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html) | Deletes a bucket. | Bucket must be empty before deletion. | -| ✅ [GetBucketLocation](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLocation.html) | Retrieves the location (region) of a bucket. | Typically returns a default region (e.g., `us-east-1`), which may differ from AWS if region-specific responses are expected. | +| **API Name** | **Feature** | **Note** | +| -------------------------------------------------------------------------------------------------- | -------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| ✅ [ListBuckets](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html) | Lists all buckets owned by the authenticated user. | Returns the full bucket list. | +| ✅ [CreateBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html) | Creates a new bucket. | **Non-compliant behavior:** The default bucket ACL may include extra group permissions instead of being strictly private. Bucket names must adhere to S3 naming conventions. | +| ✅ [HeadBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadBucket.html) | Checks for the existence of a bucket. | Returns a 200 status if the bucket exists. | +| ✅ [DeleteBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html) | Deletes a bucket. | Bucket must be empty before deletion. | +| ✅ [GetBucketLocation](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLocation.html) | Retrieves the location (region) of a bucket. | Typically returns a default region (e.g., `us-east-1`), which may differ from AWS if region-specific responses are expected. | ### Object Operations -| **API Name** | **Feature** | **Note** | -| ------------------------------------------------------------------------------------------- | ------------- | ---------- | -| ✅ [GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html) | Retrieves the contents of an object. | **Non-compliant behavior:** For non-existent objects, Ozone may return a generic 404 without the structured XML error body defined by AWS S3. | -| ✅ [HeadObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html) | Retrieves metadata for an object. | Similar to GET Object, error responses for missing objects might lack detailed AWS-style error XML. | -| ✅ [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) | Uploads a new object. | Supports both single PUT and multipart uploads. **Non-compliant behavior:** Any ACL headers provided in the request are ignored. | -| ✅ [DeleteObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html) | Deletes a single object. | Returns standard error codes for missing objects. | -| ✅ [DeleteObjects](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjects.html) | Deletes multiple objects in one request. | Bulk delete operation with aggregated error reporting. | -| ✅ [CopyObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html) | Copies an object (intra- or inter-bucket). | Supports metadata directives (COPY/REPLACE). **Non-compliant behavior:** Self-copying for metadata updates may differ slightly from AWS S3. | -| ✅ [ListObjectsV2](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html) | Lists objects in a bucket with filtering and pagination. | Supports prefix, delimiter, and continuation tokens. | +| **API Name** | **Feature** | **Note** | +| ------------------------------------------------------------------------------------------ | -------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | +| ✅ [GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html) | Retrieves the contents of an object. | **Non-compliant behavior:** For non-existent objects, Ozone may return a generic 404 without the structured XML error body defined by AWS S3. | +| ✅ [HeadObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html) | Retrieves metadata for an object. | Similar to GET Object, error responses for missing objects might lack detailed AWS-style error XML. | +| ✅ [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) | Uploads a new object. | Supports both single PUT and multipart uploads. **Non-compliant behavior:** Any ACL headers provided in the request are ignored. | +| ✅ [DeleteObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html) | Deletes a single object. | Returns standard error codes for missing objects. | +| ✅ [DeleteObjects](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjects.html) | Deletes multiple objects in one request. | Bulk delete operation with aggregated error reporting. | +| ✅ [CopyObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html) | Copies an object (intra- or inter-bucket). | Supports metadata directives (COPY/REPLACE). **Non-compliant behavior:** Self-copying for metadata updates may differ slightly from AWS S3. | +| ✅ [ListObjectsV2](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html) | Lists objects in a bucket with filtering and pagination. | Supports prefix, delimiter, and continuation tokens. | ### Object Tagging Operations -| **API Name** | **Feature** | **Note** | -| ------------ | ----------- | -------- | -| ✅ [PutObjectTagging](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html) | Adds or updates tags on an object. | Fully supported; updates replace any existing tag set. | -| ✅ [GetObjectTagging](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectTagging.html) | Retrieves the tag set of an object. | Returns the tag set as defined by the S3 API. | -| ✅ [DeleteObjectTagging](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html) | Removes the tag set from an object. | Clears all tags associated with the object. | +| **API Name** | **Feature** | **Note** | +| ------------------------------------------------------------------------------------------------------ | ----------------------------------- | ------------------------------------------------------ | +| ✅ [PutObjectTagging](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html) | Adds or updates tags on an object. | Fully supported; updates replace any existing tag set. | +| ✅ [GetObjectTagging](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectTagging.html) | Retrieves the tag set of an object. | Returns the tag set as defined by the S3 API. | +| ✅ [DeleteObjectTagging](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html) | Removes the tag set from an object. | Clears all tags associated with the object. | ### Multipart Upload Operations -| **API Name** | **Feature** | **Note** | -| ------------ | ----------- | -------- | -| ✅ [CreateMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html) | Starts a multipart upload session. | Returns an UploadId for subsequent parts. | -| ✅ [UploadPart](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html) | Uploads an individual part for a multipart upload. | Part numbering and ETag computation follow AWS semantics. | -| ✅ [ListMultipartUploads](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html) | Lists in-progress multipart uploads in a bucket. | Up to 1000 multipart uploads are returned in a batch by default. | -| ✅ [ListParts](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html) | Lists uploaded parts for an in-progress multipart upload. | Supports pagination if many parts exist. | -| ✅ [CompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html) | Assembles all uploaded parts into a final object. | Returns an ETag that follows AWS multipart rules. | -| ✅ [AbortMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html) | Aborts an in-progress multipart upload. | Frees up storage used by uploaded parts. Incomplete multipart uploads older than 7 days are automatically aborted by Ozone. | +| **API Name** | **Feature** | **Note** | +| -------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | +| ✅ [CreateMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html) | Starts a multipart upload session. | Returns an UploadId for subsequent parts. | +| ✅ [UploadPart](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html) | Uploads an individual part for a multipart upload. | Part numbering and ETag computation follow AWS semantics. | +| ✅ [ListMultipartUploads](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html) | Lists in-progress multipart uploads in a bucket. | Up to 1000 multipart uploads are returned in a batch by default. | +| ✅ [ListParts](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html) | Lists uploaded parts for an in-progress multipart upload. | Supports pagination if many parts exist. | +| ✅ [CompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html) | Assembles all uploaded parts into a final object. | Returns an ETag that follows AWS multipart rules. | +| ✅ [AbortMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html) | Aborts an in-progress multipart upload. | Frees up storage used by uploaded parts. Incomplete multipart uploads older than 7 days are automatically aborted by Ozone. | ### Additional Operations -| **API Name** | **Feature** | **Note** | -| -------------------------- | ------------- | ---------- | +| **API Name** | **Feature** | **Note** | +| ------------------------- | -------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ✅ Generate Presigned URL | Generates a temporary URL for accessing an object. | Uses AWS Signature V4. **Non-compliant behavior:** The generated URL may include a fixed default region rather than dynamically reflecting the bucket’s location. Ozone now supports generating presigned URLs for all major S3 operations, including `GetObject`, `PutObject`, `DeleteObject`, `HeadObject`, `HeadBucket`, `MultipartUpload`. | :::note Additional Notes @@ -92,13 +92,13 @@ The Ozone S3 Gateway implements a substantial subset of the Amazon S3 REST API. - **Lifecycle configuration, cross region replication, S3 event notifications** are being implemented and in the roadmap. - While Ozone S3 Gateway provides extensive support for common S3 operations, users should be aware of the above non-compliant behaviors and limitations when integrating with applications expecting full AWS S3 functionality. - While Ozone S3 Gateway does not support S3 Server-Side Encryption, it does support encrypted buckets using Apache Ranger KMS. For more information, see the [Transparent Data Encryption](../../../05-administrator-guide/02-configuration/03-security/05-encryption/02-transparent-data-encryption.md) documentation. -::: + ::: ## Security If security is not enabled, you can *use* **any** AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY -If security is enabled, you can get the key and the secret with the `ozone s3 getsecret` command (*Kerberos based authentication is required). +If security is enabled, you can get the key and the secret with the `ozone s3 getsecret` command (\*Kerberos based authentication is required). ```bash kinit -kt /etc/security/keytabs/testuser.keytab testuser/scm@EXAMPLE.COM diff --git a/docs/04-user-guide/01-client-interfaces/03-s3/README.mdx b/docs/04-user-guide/01-client-interfaces/03-s3/README.mdx index a8ce6af33f..9a60f72170 100644 --- a/docs/04-user-guide/01-client-interfaces/03-s3/README.mdx +++ b/docs/04-user-guide/01-client-interfaces/03-s3/README.mdx @@ -1,7 +1,7 @@ # S3 API -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents Ozone's S3 compatible API support. - + diff --git a/docs/04-user-guide/01-client-interfaces/05-httpfs.md b/docs/04-user-guide/01-client-interfaces/05-httpfs.md index fd927a7674..e31f5d28e6 100644 --- a/docs/04-user-guide/01-client-interfaces/05-httpfs.md +++ b/docs/04-user-guide/01-client-interfaces/05-httpfs.md @@ -84,7 +84,7 @@ Content-Length: 17 ```bash echo "hello" >> ./README.txt -curl -i -X PUT "http://localhost:14000/webhdfs/v1/volume1/bucket1/user/foo/README.txt?op=CREATE&data=true&user.name=hdfs" -T ./README.txt -H "Content-Type: application/octet-stream" +curl -i -X PUT "http://localhost:14000/webhdfs/v1/volume1/bucket1/user/foo/README.txt?op=CREATE&data=true&user.name=hdfs" -T ./README.txt -H "Content-Type: application/octet-stream" ``` Example Output: @@ -121,44 +121,44 @@ Here are the tables of WebHDFS REST APIs and their state of support in Ozone. ### File and Directory Operations -| Operation | Support | -|-------------------------------- | --------------------------- | -| Create and Write to a File | supported | -| Append to a File | not implemented in Ozone | -| Concat File(s) | not implemented in Ozone | -| Open and Read a File | supported | -| Make a Directory | supported | -| Create a Symbolic Link | not implemented in Ozone | -| Rename a File/Directory | supported (with limitations) | -| Delete a File/Directory | supported | -| Truncate a File | not implemented in Ozone. | -| Status of a File/Directory | supported | -| List a Directory | supported | -| List a File | supported | -| Iteratively List a Directory | unsupported | +| Operation | Support | +| ---------------------------- | ---------------------------- | +| Create and Write to a File | supported | +| Append to a File | not implemented in Ozone | +| Concat File(s) | not implemented in Ozone | +| Open and Read a File | supported | +| Make a Directory | supported | +| Create a Symbolic Link | not implemented in Ozone | +| Rename a File/Directory | supported (with limitations) | +| Delete a File/Directory | supported | +| Truncate a File | not implemented in Ozone. | +| Status of a File/Directory | supported | +| List a Directory | supported | +| List a File | supported | +| Iteratively List a Directory | unsupported | ### Other File System Operations -| Operation | Support | -| ------------------------------------- | --------------------------------------- | -| Get Content Summary of a Directory | supported | -| Get Quota Usage of a Directory | supported | -| Set Quota | not implemented in Ozone FileSystem API | -| Set Quota By Storage Type | not implemented in Ozone | -| Get File Checksum | unsupported (to be fixed) | -| Get Home Directory | unsupported (to be fixed) | -| Get Trash Root | unsupported | -| Set Permission | not implemented in Ozone FileSystem API | -| Set Owner | not implemented in Ozone FileSystem API | -| Set Replication Factor | not implemented in Ozone FileSystem API | -| Set Access or Modification Time | not implemented in Ozone FileSystem API | -| Modify ACL Entries | not implemented in Ozone FileSystem API | -| Remove ACL Entries | not implemented in Ozone FileSystem API | -| Remove Default ACL | not implemented in Ozone FileSystem API | -| Remove ACL | not implemented in Ozone FileSystem API | -| Set ACL | not implemented in Ozone FileSystem API | -| Get ACL Status | not implemented in Ozone FileSystem API | -| Check access | not implemented in Ozone FileSystem API | +| Operation | Support | +| ---------------------------------- | --------------------------------------- | +| Get Content Summary of a Directory | supported | +| Get Quota Usage of a Directory | supported | +| Set Quota | not implemented in Ozone FileSystem API | +| Set Quota By Storage Type | not implemented in Ozone | +| Get File Checksum | unsupported (to be fixed) | +| Get Home Directory | unsupported (to be fixed) | +| Get Trash Root | unsupported | +| Set Permission | not implemented in Ozone FileSystem API | +| Set Owner | not implemented in Ozone FileSystem API | +| Set Replication Factor | not implemented in Ozone FileSystem API | +| Set Access or Modification Time | not implemented in Ozone FileSystem API | +| Modify ACL Entries | not implemented in Ozone FileSystem API | +| Remove ACL Entries | not implemented in Ozone FileSystem API | +| Remove Default ACL | not implemented in Ozone FileSystem API | +| Remove ACL | not implemented in Ozone FileSystem API | +| Set ACL | not implemented in Ozone FileSystem API | +| Get ACL Status | not implemented in Ozone FileSystem API | +| Check access | not implemented in Ozone FileSystem API | ## Proxy User Configuration @@ -184,9 +184,9 @@ Replace `#USER#` with the actual username of the user who should be allowed to p List of hosts the 'knoxuser' user is allowed to perform 'doAs' operations. - + The value can be the '*' wildcard or a comma-separated list of hostnames. - + For multiple users, copy this property and replace the user name in the property name. @@ -198,9 +198,9 @@ Replace `#USER#` with the actual username of the user who should be allowed to p List of groups the 'knoxuser' user is allowed to impersonate users from to perform 'doAs' operations. - + The value can be the '*' wildcard or a comma-separated list of group names. - + For multiple users, copy this property and replace the user name in the property name. diff --git a/docs/04-user-guide/01-client-interfaces/06-java-client-api.md b/docs/04-user-guide/01-client-interfaces/06-java-client-api.md index 7929950d48..63fd3b15ec 100644 --- a/docs/04-user-guide/01-client-interfaces/06-java-client-api.md +++ b/docs/04-user-guide/01-client-interfaces/06-java-client-api.md @@ -36,7 +36,7 @@ To write data to the Ozone, you need a volume, bucket and a key. ### Creating a Volume -Once we have a client, we need to get a reference to the ObjectStore. This +Once we have a client, we need to get a reference to the ObjectStore. This is done via ```java diff --git a/docs/04-user-guide/01-client-interfaces/README.mdx b/docs/04-user-guide/01-client-interfaces/README.mdx index c7697e5e23..d3d293c32f 100644 --- a/docs/04-user-guide/01-client-interfaces/README.mdx +++ b/docs/04-user-guide/01-client-interfaces/README.mdx @@ -1,7 +1,7 @@ # Client Interfaces -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents the interfaces that clients can use to communicate with Ozone. - + diff --git a/docs/04-user-guide/02-clients/README.mdx b/docs/04-user-guide/02-clients/README.mdx index 4d8a31e397..0406a37f60 100644 --- a/docs/04-user-guide/02-clients/README.mdx +++ b/docs/04-user-guide/02-clients/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Clients # Ozone Clients -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section provides instructions to install, configure, and run various clients to read and write data to Ozone. - + diff --git a/docs/04-user-guide/03-integrations/08-hadoop-distcp.md b/docs/04-user-guide/03-integrations/08-hadoop-distcp.md index 23c2c80a97..85ebc7417d 100644 --- a/docs/04-user-guide/03-integrations/08-hadoop-distcp.md +++ b/docs/04-user-guide/03-integrations/08-hadoop-distcp.md @@ -63,7 +63,7 @@ When copying files from Ozone to HDFS, similar issues can occur due to differenc hadoop distcp \ -Ddfs.checksum.combine.mode=COMPOSITE_CRC \ -Ddfs.checksum.type=CRC32 \ - ofs://ozone1/vol1/bucket1/src hdfs://ns1/tmp/dst + ofs://ozone1/vol1/bucket1/src hdfs://ns1/tmp/dst ``` By specifying the appropriate checksum configuration or skipping the validation, you can ensure that DistCp jobs complete successfully when transferring data between HDFS and Ozone. diff --git a/docs/04-user-guide/03-integrations/README.mdx b/docs/04-user-guide/03-integrations/README.mdx index 01c133a508..a095451204 100644 --- a/docs/04-user-guide/03-integrations/README.mdx +++ b/docs/04-user-guide/03-integrations/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Integrations # Integrating Ozone Storage With Other Systems -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section provides instructions to configure other systems to use Ozone for storage. - + diff --git a/docs/04-user-guide/README.mdx b/docs/04-user-guide/README.mdx index 0033a11331..e7ec949d19 100644 --- a/docs/04-user-guide/README.mdx +++ b/docs/04-user-guide/README.mdx @@ -1,7 +1,7 @@ # User Guide -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section provides instructions for end users to read and write data to an existing Ozone system. - + diff --git a/docs/05-administrator-guide/01-installation/04-installing-binaries.md b/docs/05-administrator-guide/01-installation/04-installing-binaries.md index 88657efdce..4ca601ea75 100644 --- a/docs/05-administrator-guide/01-installation/04-installing-binaries.md +++ b/docs/05-administrator-guide/01-installation/04-installing-binaries.md @@ -11,10 +11,10 @@ First, identify the hosts where Ozone will be installed. The installation steps To obtain the Ozone binaries, you have two primary options: 1. **Official Apache Ozone Releases**: - For official releases, navigate to the [Downloads page](/download) to get the released binary tarball. Follow the instructions to verify the integrity of the tarball. + For official releases, navigate to the [Downloads page](/download) to get the released binary tarball. Follow the instructions to verify the integrity of the tarball. 2. **Build from Source**: - Alternatively, you can build Ozone from its source code. Follow the detailed instructions in the [Developer Guide: Building Ozone With Maven](../../08-developer-guide/01-build/01-maven.md). + Alternatively, you can build Ozone from its source code. Follow the detailed instructions in the [Developer Guide: Building Ozone With Maven](../../08-developer-guide/01-build/01-maven.md). ### Untar the Tarball (for released binaries) diff --git a/docs/05-administrator-guide/01-installation/README.mdx b/docs/05-administrator-guide/01-installation/README.mdx index 14e1b39015..836b757908 100644 --- a/docs/05-administrator-guide/01-installation/README.mdx +++ b/docs/05-administrator-guide/01-installation/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Installation # Installing Ozone In Production -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents how to install a production Ozone system. - + diff --git a/docs/05-administrator-guide/02-configuration/01-basic/02-environment-variables.md b/docs/05-administrator-guide/02-configuration/01-basic/02-environment-variables.md index a3a3fbf279..637100b303 100644 --- a/docs/05-administrator-guide/02-configuration/01-basic/02-environment-variables.md +++ b/docs/05-administrator-guide/02-configuration/01-basic/02-environment-variables.md @@ -12,30 +12,30 @@ The `ozone-env.sh` script, located at `$OZONE_HOME/etc/hadoop`, defines the envi These environment variables apply to all Ozone processes. -| Variable | Default Value | Description | -| :----------------- | :--------------------------------- | :---------------------------------------------------------------------------------------------------------------- | -| `JAVA_HOME` | (none) | The path to the Java installation. Must be set on most platforms, but is auto-detected on macOS. | -| `OZONE_HOME` | Auto-detected from script location | The path to the Ozone installation directory. | -| `OZONE_CONF_DIR` | `$OZONE_HOME/etc/hadoop` | The directory containing Ozone configuration files. | -| `OZONE_LOG_DIR` | `$OZONE_HOME/logs` | The directory where Ozone log files are stored. | -| `OZONE_PID_DIR` | `/tmp` | The directory where daemon PID files are stored. | -| `OZONE_OPTS` | `-Djava.net.preferIPv4Stack=true` | Universal Java options applied to all Ozone processes. | -| `OZONE_HEAPSIZE_MAX`| (JVM default) | The maximum JVM heap size (`-Xmx`). If not set, the JVM auto-scales. | -| `OZONE_HEAPSIZE_MIN`| (JVM default) | The minimum JVM heap size (`-Xms`). If not set, the JVM auto-scales. | +| Variable | Default Value | Description | +| :------------------- | :--------------------------------- | :----------------------------------------------------------------------------------------------- | +| `JAVA_HOME` | (none) | The path to the Java installation. Must be set on most platforms, but is auto-detected on macOS. | +| `OZONE_HOME` | Auto-detected from script location | The path to the Ozone installation directory. | +| `OZONE_CONF_DIR` | `$OZONE_HOME/etc/hadoop` | The directory containing Ozone configuration files. | +| `OZONE_LOG_DIR` | `$OZONE_HOME/logs` | The directory where Ozone log files are stored. | +| `OZONE_PID_DIR` | `/tmp` | The directory where daemon PID files are stored. | +| `OZONE_OPTS` | `-Djava.net.preferIPv4Stack=true` | Universal Java options applied to all Ozone processes. | +| `OZONE_HEAPSIZE_MAX` | (JVM default) | The maximum JVM heap size (`-Xmx`). If not set, the JVM auto-scales. | +| `OZONE_HEAPSIZE_MIN` | (JVM default) | The minimum JVM heap size (`-Xms`). If not set, the JVM auto-scales. | ## Role-Specific Environment Variables These environment variables apply only to certain Ozone services or roles. -| Variable | Default Value | Description | -| :----------------- | :--------------------------------- | :---------------------------------------------------------------------------------------------------------------- | -| `OZONE_SERVER_OPTS`| (none) | Options for all Ozone server daemons (appended to `OZONE_OPTS`). | -| `OZONE_CLIENT_OPTS`| (empty) | Specifies Java properties for Ozone commands and clients. | -| `OZONE_OM_OPTS` | (empty) | Specifies Java properties for the Ozone Manager (OM). | -| `OZONE_SCM_OPTS` | (empty) | Specifies Java properties for the Storage Container Manager (SCM). | -| `OZONE_DATANODE_OPTS`| (empty) | Specifies Java properties for Datanodes. | -| `OZONE_S3G_OPTS` | (empty) | Specifies Java properties for the S3 Gateway. | -| `OZONE_RECON_OPTS` | (empty) | Specifies Java properties for the Recon server. | +| Variable | Default Value | Description | +| :-------------------- | :------------ | :----------------------------------------------------------------- | +| `OZONE_SERVER_OPTS` | (none) | Options for all Ozone server daemons (appended to `OZONE_OPTS`). | +| `OZONE_CLIENT_OPTS` | (empty) | Specifies Java properties for Ozone commands and clients. | +| `OZONE_OM_OPTS` | (empty) | Specifies Java properties for the Ozone Manager (OM). | +| `OZONE_SCM_OPTS` | (empty) | Specifies Java properties for the Storage Container Manager (SCM). | +| `OZONE_DATANODE_OPTS` | (empty) | Specifies Java properties for Datanodes. | +| `OZONE_S3G_OPTS` | (empty) | Specifies Java properties for the S3 Gateway. | +| `OZONE_RECON_OPTS` | (empty) | Specifies Java properties for the Recon server. | :::note HttpFS Gateway Configuration The HttpFS Gateway does not use an `OZONE_HTTPFS_OPTS` variable. Its specific JVM properties must be added to the global `OZONE_OPTS` variable. diff --git a/docs/05-administrator-guide/02-configuration/01-basic/02-network/07-default-ports.md b/docs/05-administrator-guide/02-configuration/01-basic/02-network/07-default-ports.md index 05d8534d4a..9e6a32e87c 100644 --- a/docs/05-administrator-guide/02-configuration/01-basic/02-network/07-default-ports.md +++ b/docs/05-administrator-guide/02-configuration/01-basic/02-network/07-default-ports.md @@ -9,13 +9,13 @@ Due to its distributed nature and the requirement for high performance in handli ## **Ozone Manager (OM)** -| Default Port Number | Configuration Key | Endpoint Protocol | Purpose | -| :--- | :--- | :--- | :--- | -| 9862 | `ozone.om.address..` | Hadoop RPC | Primary RPC endpoint for Ozone clients | -| 9874 | `ozone.om.http-address..` | HTTP | Web UI for monitoring OM status and metadata | -| 9875 | `ozone.om.https-address..` | HTTPS | Secure Web UI for monitoring OM status and metadata | -| 9872 | `ozone.om.ratis.port..` | HTTP/2 | RPC endpoint for OM HA instances to form a RAFT consensus ring | -| 8981 | `ozone.om.grpc.port` | HTTP/2 | gRPC endpoint for Ozone Manager clients | +| Default Port Number | Configuration Key | Endpoint Protocol | Purpose | +| :------------------ | :---------------------------------------------- | :---------------- | :------------------------------------------------------------- | +| 9862 | `ozone.om.address..` | Hadoop RPC | Primary RPC endpoint for Ozone clients | +| 9874 | `ozone.om.http-address..` | HTTP | Web UI for monitoring OM status and metadata | +| 9875 | `ozone.om.https-address..` | HTTPS | Secure Web UI for monitoring OM status and metadata | +| 9872 | `ozone.om.ratis.port..` | HTTP/2 | RPC endpoint for OM HA instances to form a RAFT consensus ring | +| 8981 | `ozone.om.grpc.port` | HTTP/2 | gRPC endpoint for Ozone Manager clients | :::note Except for `ozone.om.grpc.port`, all the above OM properties are suffixed with `service_id.node_id`. @@ -24,16 +24,16 @@ For example: `ozone.om.address.cluster1.om1`. ## **Storage Container Manager (SCM)** -| Default Port Number | Configuration Key | Endpoint Protocol | Purpose | -| :---- | :---- | :---- | :---- | -| 9860 | `ozone.scm.client.port..` | Hadoop RPC | Communication with Ozone clients for namespace and container management. `ozone.scm.client.address` overrides it, if defined (default is empty) | -| 9863 | `ozone.scm.block.client.port..` | Hadoop RPC | Communication with Datanodes for block-level operations | -| 9861 | `ozone.scm.datanode.port..` | Hadoop RPC | Port used by Datanodes to communicate with the SCM. `ozone.scm.datanode.address` overrides it, if defined (default is empty) | -| 9961 | `ozone.scm.security.service.port..` | Hadoop RPC | SCM security server port | -| 9876 | `ozone.scm.http-address..` | HTTP | Web UI for monitoring SCM status | -| 9877 | `ozone.scm.https-address..` | HTTPS | Secure Web UI for monitoring SCM status | -| 9894 | `ozone.scm.ratis.port..` | HTTP/2 | SCM Ratis HA | -| 9895 | `ozone.scm.grpc.port..` | HTTP/2 | SCM gRPC server port | +| Default Port Number | Configuration Key | Endpoint Protocol | Purpose | +| :------------------ | :------------------------------------------------------- | :---------------- | :---------------------------------------------------------------------------------------------------------------------------------------------- | +| 9860 | `ozone.scm.client.port..` | Hadoop RPC | Communication with Ozone clients for namespace and container management. `ozone.scm.client.address` overrides it, if defined (default is empty) | +| 9863 | `ozone.scm.block.client.port..` | Hadoop RPC | Communication with Datanodes for block-level operations | +| 9861 | `ozone.scm.datanode.port..` | Hadoop RPC | Port used by Datanodes to communicate with the SCM. `ozone.scm.datanode.address` overrides it, if defined (default is empty) | +| 9961 | `ozone.scm.security.service.port..` | Hadoop RPC | SCM security server port | +| 9876 | `ozone.scm.http-address..` | HTTP | Web UI for monitoring SCM status | +| 9877 | `ozone.scm.https-address..` | HTTPS | Secure Web UI for monitoring SCM status | +| 9894 | `ozone.scm.ratis.port..` | HTTP/2 | SCM Ratis HA | +| 9895 | `ozone.scm.grpc.port..` | HTTP/2 | SCM gRPC server port | :::note All the above SCM properties are suffixed with `service_id.node_id`. @@ -42,39 +42,39 @@ For example: `ozone.scm.client.port.scmservice.scm1`. ## **Recon** -| Default Port Number | Configuration Key | Endpoint Protocol | Purpose | -| :---- | :---- | :---- | :---- | -| 9891 | `ozone.recon.address` | Hadoop RPC | RPC address for Recon to collect metadata from other Ozone services | -| 9888 | `ozone.recon.http-address` | HTTP | Web-based management and monitoring console for the entire Ozone cluster | -| 9889 | `ozone.recon.https-address` | HTTPS | Web-based management and monitoring console for the entire Ozone cluster | +| Default Port Number | Configuration Key | Endpoint Protocol | Purpose | +| :------------------ | :-------------------------- | :---------------- | :----------------------------------------------------------------------- | +| 9891 | `ozone.recon.address` | Hadoop RPC | RPC address for Recon to collect metadata from other Ozone services | +| 9888 | `ozone.recon.http-address` | HTTP | Web-based management and monitoring console for the entire Ozone cluster | +| 9889 | `ozone.recon.https-address` | HTTPS | Web-based management and monitoring console for the entire Ozone cluster | ## **S3 Gateway (S3G)** -| Default Port Number | Configuration Key | Endpoint Protocol | Purpose | -| :---- | :---- | :---- | :---- | -| 9878 | `ozone.s3g.http-address` | HTTP | S3-compatible RESTful API endpoint | -| 9879 | `ozone.s3g.https-address` | HTTPS | Secure S3-compatible RESTful API endpoint | -| 19878 | `ozone.s3g.webadmin.http-address` | HTTP | Ozone S3Gateway serves web content | -| 19879 | `ozone.s3g.webadmin.https-address` | HTTPS | Ozone S3Gateway serves web content | +| Default Port Number | Configuration Key | Endpoint Protocol | Purpose | +| :------------------ | :--------------------------------- | :---------------- | :---------------------------------------- | +| 9878 | `ozone.s3g.http-address` | HTTP | S3-compatible RESTful API endpoint | +| 9879 | `ozone.s3g.https-address` | HTTPS | Secure S3-compatible RESTful API endpoint | +| 19878 | `ozone.s3g.webadmin.http-address` | HTTP | Ozone S3Gateway serves web content | +| 19879 | `ozone.s3g.webadmin.https-address` | HTTPS | Ozone S3Gateway serves web content | ## **HttpFS Server** -| Default Port Number | Configuration Key | Endpoint Protocol | Purpose | -| :---- | :---- | :---- | :---- | -| 14000 | `httpfs.http.port` | HTTP or HTTPS | The HTTP port for HttpFS REST API. TLS is enabled if `httpfs.ssl.enabled` is true | +| Default Port Number | Configuration Key | Endpoint Protocol | Purpose | +| :------------------ | :----------------- | :---------------- | :-------------------------------------------------------------------------------- | +| 14000 | `httpfs.http.port` | HTTP or HTTPS | The HTTP port for HttpFS REST API. TLS is enabled if `httpfs.ssl.enabled` is true | ## **Datanode** -| Default Port Number | Configuration Key | Endpoint Protocol | Purpose | -| :---- | :---- | :---- | :---- | -| 9859 | `hdds.container.ipc.port` | HTTP/2 | Inter-process communication related to container operations | -| 9855 | `hdds.container.ratis.datastream.port` | TCP | Ratis data streaming for container replication (if enabled) | -| 9858 | `hdds.container.ratis.ipc.port` | HTTP/2 | Communication with embedded Ratis server for replication coordination | -| 9857 | `hdds.container.ratis.admin.port` | HTTP/2 | Administrative requests to the Ratis server | -| 9856 | `hdds.container.ratis.server.port` | HTTP/2 | Communication between Ratis peers in a replication pipeline | -| 9882 | `hdds.datanode.http-address` | HTTP | Web UI for monitoring Datanode status and resource utilization | -| 9883 | `hdds.datanode.https-address` | HTTPS | Secure Web UI for monitoring Datanode status and resource utilization | -| 19864 | `hdds.datanode.client.port` | Hadoop RPC | The port number of the Ozone Datanode client service | +| Default Port Number | Configuration Key | Endpoint Protocol | Purpose | +| :------------------ | :------------------------------------- | :---------------- | :-------------------------------------------------------------------- | +| 9859 | `hdds.container.ipc.port` | HTTP/2 | Inter-process communication related to container operations | +| 9855 | `hdds.container.ratis.datastream.port` | TCP | Ratis data streaming for container replication (if enabled) | +| 9858 | `hdds.container.ratis.ipc.port` | HTTP/2 | Communication with embedded Ratis server for replication coordination | +| 9857 | `hdds.container.ratis.admin.port` | HTTP/2 | Administrative requests to the Ratis server | +| 9856 | `hdds.container.ratis.server.port` | HTTP/2 | Communication between Ratis peers in a replication pipeline | +| 9882 | `hdds.datanode.http-address` | HTTP | Web UI for monitoring Datanode status and resource utilization | +| 9883 | `hdds.datanode.https-address` | HTTPS | Secure Web UI for monitoring Datanode status and resource utilization | +| 19864 | `hdds.datanode.client.port` | Hadoop RPC | The port number of the Ozone Datanode client service | :::note diff --git a/docs/05-administrator-guide/02-configuration/01-basic/02-network/README.mdx b/docs/05-administrator-guide/02-configuration/01-basic/02-network/README.mdx index 4ec0e1b620..246e6a81d8 100644 --- a/docs/05-administrator-guide/02-configuration/01-basic/02-network/README.mdx +++ b/docs/05-administrator-guide/02-configuration/01-basic/02-network/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Network # Network Related Configurations -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents configurations for network communication between Ozone components. - + diff --git a/docs/05-administrator-guide/02-configuration/01-basic/03-directories/README.mdx b/docs/05-administrator-guide/02-configuration/01-basic/03-directories/README.mdx index 6492445129..346ad38bb2 100644 --- a/docs/05-administrator-guide/02-configuration/01-basic/03-directories/README.mdx +++ b/docs/05-administrator-guide/02-configuration/01-basic/03-directories/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Directories # Directory Related Configurations -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents configurations for directories that Ozone components will store their data in. - + diff --git a/docs/05-administrator-guide/02-configuration/01-basic/README.mdx b/docs/05-administrator-guide/02-configuration/01-basic/README.mdx index aaa55ae227..be72d1e32f 100644 --- a/docs/05-administrator-guide/02-configuration/01-basic/README.mdx +++ b/docs/05-administrator-guide/02-configuration/01-basic/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Basic # Basic Ozone Configuration -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents the minimal set of configurations required for Ozone to run. - + diff --git a/docs/05-administrator-guide/02-configuration/02-logging/README.mdx b/docs/05-administrator-guide/02-configuration/02-logging/README.mdx index 47230e5b15..76dc87c2f2 100644 --- a/docs/05-administrator-guide/02-configuration/02-logging/README.mdx +++ b/docs/05-administrator-guide/02-configuration/02-logging/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Logging # Logging Configuration -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents configurations for various server side logs in Ozone. - + diff --git a/docs/05-administrator-guide/02-configuration/03-security/01-administrators.md b/docs/05-administrator-guide/02-configuration/03-security/01-administrators.md index cf0841e05b..5a8cac78d9 100644 --- a/docs/05-administrator-guide/02-configuration/03-security/01-administrators.md +++ b/docs/05-administrator-guide/02-configuration/03-security/01-administrators.md @@ -10,36 +10,36 @@ Ozone identifies administrators through specific configuration properties, allow These properties define the primary administrators for the Ozone cluster. -| Property Name | Description | Default Value | -|---|---|---| -| `ozone.administrators` | Comma-separated list of user names who are considered Ozone administrators. If this property is not explicitly set, the user who launches an Ozone service will be automatically designated as the initial administrator. | (empty) | -| `ozone.administrators.groups` | Comma-separated list of group names whose members are considered Ozone administrators. Users belonging to any of these groups will have administrative access. | (empty) | +| Property Name | Description | Default Value | +| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | +| `ozone.administrators` | Comma-separated list of user names who are considered Ozone administrators. If this property is not explicitly set, the user who launches an Ozone service will be automatically designated as the initial administrator. | (empty) | +| `ozone.administrators.groups` | Comma-separated list of group names whose members are considered Ozone administrators. Users belonging to any of these groups will have administrative access. | (empty) | ## Read-Only Ozone Administrators These properties define users and groups with read-only administrative access, allowing them to perform read operations without standard access checks. -| Property Name | Description | Default Value | -|---|---|---| -| `ozone.readonly.administrators` | Comma-separated list of user names who have read-only administrative access. These users can perform read operations without undergoing regular access checks. | (empty) | -| `ozone.readonly.administrators.groups` | Comma-separated list of group names whose members have read-only administrative access. Users in these groups can perform read operations bypassing normal access controls. | (empty) | +| Property Name | Description | Default Value | +| -------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | +| `ozone.readonly.administrators` | Comma-separated list of user names who have read-only administrative access. These users can perform read operations without undergoing regular access checks. | (empty) | +| `ozone.readonly.administrators.groups` | Comma-separated list of group names whose members have read-only administrative access. Users in these groups can perform read operations bypassing normal access controls. | (empty) | ## S3-Specific Administrators These properties define administrators with privileges specific to the S3 Gateway interface. -| Property Name | Description | Default Value | -|---|---|---| -| `ozone.s3.administrators` | Comma-separated list of user names who have S3-specific administrative access. These users can access admin-only information from the S3 Gateway. If this property is empty, users defined in `ozone.administrators` will automatically have S3 administrative privileges. | (empty) | -| `ozone.s3.administrators.groups` | Comma-separated list of group names whose members have S3-specific administrative access. Members of these groups can access admin-only information from the S3 Gateway. | (empty) | +| Property Name | Description | Default Value | +| -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | +| `ozone.s3.administrators` | Comma-separated list of user names who have S3-specific administrative access. These users can access admin-only information from the S3 Gateway. If this property is empty, users defined in `ozone.administrators` will automatically have S3 administrative privileges. | (empty) | +| `ozone.s3.administrators.groups` | Comma-separated list of group names whose members have S3-specific administrative access. Members of these groups can access admin-only information from the S3 Gateway. | (empty) | ## Recon Administrators These properties define administrators for the Recon service, which provides monitoring and management capabilities for the Ozone cluster. -| Property Name | Description | Default Value | -|---|---|---| -| `ozone.recon.administrators` | Comma-separated list of user names who are Recon administrators. These users can access admin-only information from Recon. Note that users defined in `ozone.administrators` will always have access to all Recon information regardless of this setting. | (empty) | -| `ozone.recon.administrators.groups` | Comma-separated list of group names whose members are Recon administrators. Users in these groups can access admin-only information from Recon. | (empty) | +| Property Name | Description | Default Value | +| ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | +| `ozone.recon.administrators` | Comma-separated list of user names who are Recon administrators. These users can access admin-only information from Recon. Note that users defined in `ozone.administrators` will always have access to all Recon information regardless of this setting. | (empty) | +| `ozone.recon.administrators.groups` | Comma-separated list of group names whose members are Recon administrators. Users in these groups can access admin-only information from Recon. | (empty) | It is enough for a user to be defined in `ozone.administrators` or be directly or indirectly in a group defined in `ozone.administrators.groups` to have full administrative access across Ozone services. diff --git a/docs/05-administrator-guide/02-configuration/03-security/02-kerberos.md b/docs/05-administrator-guide/02-configuration/03-security/02-kerberos.md index 3d087ed694..6803dc389f 100644 --- a/docs/05-administrator-guide/02-configuration/03-security/02-kerberos.md +++ b/docs/05-administrator-guide/02-configuration/03-security/02-kerberos.md @@ -54,24 +54,24 @@ S3 Gateway requires one service principal and here the configuration values need The HttpFS gateway offers an HDFS-compatible REST API (`webhdfs`). It requires Kerberos for its client-facing HTTP endpoint and for its internal connection to the Ozone Manager (which acts as an HDFS NameNode proxy). -| Property | Description | -|---|---| -| `hadoop.http.authentication.type` | Defines the authentication mechanism used by HttpFS for its HTTP clients. Valid values are `simple` or `kerberos`. Set to `kerberos` for SPNEGO. | -| `hadoop.http.authentication.kerberos.principal` | The HTTP Kerberos principal used by HttpFS for its client-facing HTTP endpoint. This MUST start with `HTTP/` (e.g., `HTTP/${httpfs.hostname}@${kerberos.realm}`). | -| `hadoop.http.authentication.kerberos.keytab` | The Kerberos keytab file for the client-facing HTTP principal. e.g., `${user.home}/httpfs.keytab`. | -| `httpfs.hadoop.authentication.type` | Defines the authentication mechanism used by HttpFS to connect to the HDFS NameNode (Ozone Manager). Valid values are `simple` (default) or `kerberos`. | -| `httpfs.hadoop.authentication.kerberos.principal` | The Kerberos principal used by HttpFS to connect to the HDFS NameNode (Ozone Manager). e.g., `${user.name}/${httpfs.hostname}@${kerberos.realm}`. | -| `httpfs.hadoop.authentication.kerberos.keytab` | The Kerberos keytab file for the principal used to connect to the HDFS NameNode (Ozone Manager). e.g., `${user.home}/httpfs.keytab`. | +| Property | Description | +| ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `hadoop.http.authentication.type` | Defines the authentication mechanism used by HttpFS for its HTTP clients. Valid values are `simple` or `kerberos`. Set to `kerberos` for SPNEGO. | +| `hadoop.http.authentication.kerberos.principal` | The HTTP Kerberos principal used by HttpFS for its client-facing HTTP endpoint. This MUST start with `HTTP/` (e.g., `HTTP/${httpfs.hostname}@${kerberos.realm}`). | +| `hadoop.http.authentication.kerberos.keytab` | The Kerberos keytab file for the client-facing HTTP principal. e.g., `${user.home}/httpfs.keytab`. | +| `httpfs.hadoop.authentication.type` | Defines the authentication mechanism used by HttpFS to connect to the HDFS NameNode (Ozone Manager). Valid values are `simple` (default) or `kerberos`. | +| `httpfs.hadoop.authentication.kerberos.principal` | The Kerberos principal used by HttpFS to connect to the HDFS NameNode (Ozone Manager). e.g., `${user.name}/${httpfs.hostname}@${kerberos.realm}`. | +| `httpfs.hadoop.authentication.kerberos.keytab` | The Kerberos keytab file for the principal used to connect to the HDFS NameNode (Ozone Manager). e.g., `${user.home}/httpfs.keytab`. | ## Recon Server Recon provides monitoring and management capabilities and can be secured using Kerberos authentication for its web UI and REST endpoints. -| Property | Description | -|---|---| -| `ozone.recon.http.auth.type` | Sets Recon's HTTP authentication type. Set to `kerberos` for SPNEGO. | +| Property | Description | +| ------------------------------------------ | ---------------------------------------------------------------------------- | +| `ozone.recon.http.auth.type` | Sets Recon's HTTP authentication type. Set to `kerberos` for SPNEGO. | | `ozone.recon.http.auth.kerberos.principal` | The service principal for the Recon HTTP endpoint. e.g., `HTTP/_HOST@REALM`. | -| `ozone.recon.http.auth.kerberos.keytab` | The keytab file for the Recon HTTP principal. e.g., `/path/to/HTTP.keytab`. | +| `ozone.recon.http.auth.kerberos.keytab` | The keytab file for the Recon HTTP principal. e.g., `/path/to/HTTP.keytab`. | Access to Recon's admin-only APIs is controlled by `ozone.administrators` or `ozone.recon.administrators` lists. Refer to [Configuring Ozone Administrators](/docs/administrator-guide/configuration/security/administrators) for more details. diff --git a/docs/05-administrator-guide/02-configuration/03-security/03-https.md b/docs/05-administrator-guide/02-configuration/03-security/03-https.md index 6090cc4cbb..bf473a474d 100644 --- a/docs/05-administrator-guide/02-configuration/03-security/03-https.md +++ b/docs/05-administrator-guide/02-configuration/03-security/03-https.md @@ -10,10 +10,10 @@ This document describes how to configure Ozone HTTP web-consoles to require user By default Ozone HTTP web-consoles (OM, SCM, S3G, Recon, Datanode) allow access without authentication based on the following default configurations. -| Property | Value | -|----------|-------| +| Property | Value | +| -------------------------------------- | ------- | | `ozone.security.http.kerberos.enabled` | `false` | -| `ozone.http.filter.initializers` | | +| `ozone.http.filter.initializers` | | If you have an SPNEGO enabled Ozone cluster and want to disable it for all Ozone services, just make sure the two key mentioned are configured as above. @@ -21,53 +21,53 @@ If you have an SPNEGO enabled Ozone cluster and want to disable it for all Ozone However, they can be configured to require Kerberos authentication using HTTP SPNEGO protocol (supported by browsers like Firefox and Chrome). To achieve that, the following keys must be configured first. -| Property | Value | -|----------|-------| -| `hadoop.security.authentication` | `kerberos` | -| `ozone.security.http.kerberos.enabled` | `true` | -| `ozone.http.filter.initializers` | `org.apache.hadoop.security.AuthenticationFilterInitializer` | +| Property | Value | +| -------------------------------------- | ------------------------------------------------------------ | +| `hadoop.security.authentication` | `kerberos` | +| `ozone.security.http.kerberos.enabled` | `true` | +| `ozone.http.filter.initializers` | `org.apache.hadoop.security.AuthenticationFilterInitializer` | After that, individual component needs to configure properly to completely enable SPNEGO or SIMPLE authentication. ## Enable SPNEGO authentication for OM HTTP -| Property | Value | -|----------|-------| -| `ozone.om.http.auth.type` | `kerberos` | -| `ozone.om.http.auth.kerberos.principal` | `HTTP/_HOST@REALM` | -| `ozone.om.http.auth.kerberos.keytab` | `/path/to/HTTP.keytab` | +| Property | Value | +| --------------------------------------- | ---------------------- | +| `ozone.om.http.auth.type` | `kerberos` | +| `ozone.om.http.auth.kerberos.principal` | `HTTP/_HOST@REALM` | +| `ozone.om.http.auth.kerberos.keytab` | `/path/to/HTTP.keytab` | ## Enable SPNEGO authentication for S3G HTTP -| Property | Value | -|----------|-------| -| `ozone.s3g.http.auth.type` | `kerberos` | -| `ozone.s3g.http.auth.kerberos.principal` | `HTTP/_HOST@REALM` | -| `ozone.s3g.http.auth.kerberos.keytab` | `/path/to/HTTP.keytab` | +| Property | Value | +| ---------------------------------------- | ---------------------- | +| `ozone.s3g.http.auth.type` | `kerberos` | +| `ozone.s3g.http.auth.kerberos.principal` | `HTTP/_HOST@REALM` | +| `ozone.s3g.http.auth.kerberos.keytab` | `/path/to/HTTP.keytab` | ## Enable SPNEGO authentication for Recon HTTP -| Property | Value | -|----------|-------| -| `ozone.recon.http.auth.type` | `kerberos` | -| `ozone.recon.http.auth.kerberos.principal` | `HTTP/_HOST@REALM` | -| `ozone.recon.http.auth.kerberos.keytab` | `/path/to/HTTP.keytab` | +| Property | Value | +| ------------------------------------------ | ---------------------- | +| `ozone.recon.http.auth.type` | `kerberos` | +| `ozone.recon.http.auth.kerberos.principal` | `HTTP/_HOST@REALM` | +| `ozone.recon.http.auth.kerberos.keytab` | `/path/to/HTTP.keytab` | ## Enable SPNEGO authentication for SCM HTTP -| Property | Value | -|----------|-------| -| `ozone.scm.http.auth.type` | `kerberos` | -| `ozone.scm.http.auth.kerberos.principal` | `HTTP/_HOST@REALM` | -| `ozone.scm.http.auth.kerberos.keytab` | `/path/to/HTTP.keytab` | +| Property | Value | +| ---------------------------------------- | ---------------------- | +| `ozone.scm.http.auth.type` | `kerberos` | +| `ozone.scm.http.auth.kerberos.principal` | `HTTP/_HOST@REALM` | +| `ozone.scm.http.auth.kerberos.keytab` | `/path/to/HTTP.keytab` | ## Enable SPNEGO authentication for Datanode HTTP -| Property | Value | -|----------|-------| -| `ozone.datanode.http.auth.type` | `kerberos` | -| `ozone.datanode.http.auth.kerberos.principal` | `HTTP/_HOST@REALM` | -| `ozone.datanode.http.auth.kerberos.keytab` | `/path/to/HTTP.keytab` | +| Property | Value | +| --------------------------------------------- | ---------------------- | +| `ozone.datanode.http.auth.type` | `kerberos` | +| `ozone.datanode.http.auth.kerberos.principal` | `HTTP/_HOST@REALM` | +| `ozone.datanode.http.auth.kerberos.keytab` | `/path/to/HTTP.keytab` | Note: Ozone Datanode does not have a default webpage, which prevents you from accessing “/” or “/index.html”. But it does provide standard servlet like `jmx/conf/jstack` via HTTP. @@ -75,45 +75,45 @@ In addition, Ozone HTTP web-console support the equivalent of Hadoop’s Pseudo/ ## Enable SIMPLE authentication for OM HTTP -| Property | Value | -|----------|-------| -| `ozone.om.http.auth.type` | `simple` | -| `ozone.om.http.auth.simple.anonymous.allowed` | `false` | +| Property | Value | +| --------------------------------------------- | -------- | +| `ozone.om.http.auth.type` | `simple` | +| `ozone.om.http.auth.simple.anonymous.allowed` | `false` | If you don’t want to specify the user.name in the query string parameter, change `ozone.om.http.auth.simple.anonymous.allowed` to true. ## Enable SIMPLE authentication for S3G HTTP -| Property | Value | -|----------|-------| -| `ozone.s3g.http.auth.type` | `simple` | -| `ozone.s3g.http.auth.simple.anonymous.allowed` | `false` | +| Property | Value | +| ---------------------------------------------- | -------- | +| `ozone.s3g.http.auth.type` | `simple` | +| `ozone.s3g.http.auth.simple.anonymous.allowed` | `false` | If you don’t want to specify the user.name in the query string parameter, change `ozone.s3g.http.auth.simple.anonymous.allowed` to true. ## Enable SIMPLE authentication for Recon HTTP -| Property | Value | -|----------|-------| -| `ozone.recon.http.auth.type` | `simple` | -| `ozone.recon.http.auth.simple.anonymous.allowed` | `false` | +| Property | Value | +| ------------------------------------------------ | -------- | +| `ozone.recon.http.auth.type` | `simple` | +| `ozone.recon.http.auth.simple.anonymous.allowed` | `false` | If you don’t want to specify the user.name in the query string parameter, change `ozone.recon.http.auth.simple.anonymous.allowed` to true. ## Enable SIMPLE authentication for SCM HTTP -| Property | Value | -|----------|-------| -| `ozone.scm.http.auth.type` | `simple` | -| `ozone.scm.http.auth.simple.anonymous.allowed` | `false` | +| Property | Value | +| ---------------------------------------------- | -------- | +| `ozone.scm.http.auth.type` | `simple` | +| `ozone.scm.http.auth.simple.anonymous.allowed` | `false` | If you don’t want to specify the user.name in the query string parameter, change `hdds.scm.http.auth.simple.anonymous.allowed` to true. ## Enable SIMPLE authentication for Datanode HTTP -| Property | Value | -|----------|-------| -| `ozone.datanode.http.auth.type` | `simple` | -| `ozone.datanode.http.auth.simple.anonymous.allowed` | `false` | +| Property | Value | +| --------------------------------------------------- | -------- | +| `ozone.datanode.http.auth.type` | `simple` | +| `ozone.datanode.http.auth.simple.anonymous.allowed` | `false` | If you don’t want to specify the user.name in the query string parameter, change `hdds.datanode.http.auth.simple.anonymous.allowed` to true. diff --git a/docs/05-administrator-guide/02-configuration/03-security/05-encryption/01-network-encryption/README.mdx b/docs/05-administrator-guide/02-configuration/03-security/05-encryption/01-network-encryption/README.mdx index ce88651403..81e7fcb8bd 100644 --- a/docs/05-administrator-guide/02-configuration/03-security/05-encryption/01-network-encryption/README.mdx +++ b/docs/05-administrator-guide/02-configuration/03-security/05-encryption/01-network-encryption/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Network Encryption # Network Encryption Configuration -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents encryption configurations for each type of network communication in Ozone. - + diff --git a/docs/05-administrator-guide/02-configuration/03-security/05-encryption/02-transparent-data-encryption.md b/docs/05-administrator-guide/02-configuration/03-security/05-encryption/02-transparent-data-encryption.md index f065b0c775..08613d3d22 100644 --- a/docs/05-administrator-guide/02-configuration/03-security/05-encryption/02-transparent-data-encryption.md +++ b/docs/05-administrator-guide/02-configuration/03-security/05-encryption/02-transparent-data-encryption.md @@ -7,20 +7,20 @@ Once the KMS is configured, users can create an encryption key and then create a ## Configuring TDE 1. **Set up a Key Management Server (KMS):** - - **Hadoop KMS:** Follow the instructions in the [Hadoop KMS documentation](https://hadoop.apache.org/docs/r3.4.1/hadoop-kms/index.html). - - **Ranger KMS:** Ranger KMS can also be used. For Ranger KMS, encryption keys can be managed via the Ranger KMS management console or its [REST API](https://ranger.apache.org/kms/apidocs/index.html), in addition to the `hadoop key` command line interface. + - **Hadoop KMS:** Follow the instructions in the [Hadoop KMS documentation](https://hadoop.apache.org/docs/r3.4.1/hadoop-kms/index.html). + - **Ranger KMS:** Ranger KMS can also be used. For Ranger KMS, encryption keys can be managed via the Ranger KMS management console or its [REST API](https://ranger.apache.org/kms/apidocs/index.html), in addition to the `hadoop key` command line interface. 2. **Configure Ozone:** - Add the following property to Ozone’s `core-site.xml`: - - ```xml - - hadoop.security.key.provider.path - kms://http@kms-host:9600/kms - - ``` + Add the following property to Ozone’s `core-site.xml`: - Replace `kms://http@kms-host:9600/kms` with the actual URI of your KMS. For example, `kms://http@kms1.example.com:9600/kms` + ```xml + + hadoop.security.key.provider.path + kms://http@kms-host:9600/kms + + ``` + + Replace `kms://http@kms-host:9600/kms` with the actual URI of your KMS. For example, `kms://http@kms1.example.com:9600/kms` ## Creating an Encryption Key @@ -32,7 +32,7 @@ hadoop key create [-size ] [-cipher ] [ - ``: The name of the encryption key. - **`-size ` (Optional):** Specifies the key bit length. The default is 128 bits (defined by `hadoop.security.key.default.bitlength`). -Ranger KMS supports both 128 and 256 bits. Hadoop KMS is also commonly used with 128 and 256 bit keys; for specific version capabilities, consult the Hadoop KMS documentation. Valid AES key lengths are 128, 192, and 256 bits. + Ranger KMS supports both 128 and 256 bits. Hadoop KMS is also commonly used with 128 and 256 bit keys; for specific version capabilities, consult the Hadoop KMS documentation. Valid AES key lengths are 128, 192, and 256 bits. - **`-cipher ` (Optional):** Specifies the cipher suite. Currently, only **`AES/CTR/NoPadding`** (the default) is supported. - `-description ` (Optional): A description for the key. @@ -67,42 +67,42 @@ The OpenSSL-based hardware acceleration discussed below is currently only suppor ::: 1. **Enable AES-NI Hardware Acceleration:** - - Install OpenSSL development libraries: On most Linux distributions, install `openssl-devel` (or `libssl-dev` on Debian/Ubuntu) to provide `libcrypto.so`, which is utilized by the Hadoop native library for hardware-accelerated encryption. - - Use servers with CPUs that support the AES-NI instruction set and RDRAND instruction (most modern Intel and AMD CPUs do) + - Install OpenSSL development libraries: On most Linux distributions, install `openssl-devel` (or `libssl-dev` on Debian/Ubuntu) to provide `libcrypto.so`, which is utilized by the Hadoop native library for hardware-accelerated encryption. + - Use servers with CPUs that support the AES-NI instruction set and RDRAND instruction (most modern Intel and AMD CPUs do) 2. **Install and Configure Native Libraries:** - - Ensure that the native `libhadoop.so` library is properly installed - - ```shell - ozone debug checknative - ``` - - - The output should show "true" for the Hadoop library - - To troubleshoot native library loading issues on Ozone Datanode and applications, configure their log level to DEBUG. The log messages below are examples, and actual paths may vary. The following log message indicates that the libhadoop native library fails to load: - - ```bash - 25/06/14 01:25:21 DEBUG util.NativeCodeLoader: Trying to load the custom-built native-hadoop library... - 25/06/14 01:25:21 DEBUG util.NativeCodeLoader: Failed to load native-hadoop with error: java.lang.UnsatisfiedLinkError: no hadoop in java.library.path - 25/06/14 01:25:21 DEBUG util.NativeCodeLoader: java.library.path=/opt/hadoop/lib/native:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib - 25/06/14 01:25:21 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable - ``` - - - And the following log message indicates OpenSSL library fails to load: - - ```bash - 25/06/14 01:18:53 DEBUG crypto.OpensslCipher: Failed to load OpenSSL Cipher. - java.lang.UnsatisfiedLinkError: Cannot load libcrypto.so (libcrypto.so: cannot open shared object file: No such file or directory)! - at org.apache.hadoop.crypto.OpensslCipher.initIDs(Native Method) - at org.apache.hadoop.crypto.OpensslCipher.(OpensslCipher.java:89) - at org.apache.hadoop.crypto.OpensslAesCtrCryptoCodec.(OpensslAesCtrCryptoCodec.java:50) - ``` + - Ensure that the native `libhadoop.so` library is properly installed + + ```shell + ozone debug checknative + ``` + + - The output should show "true" for the Hadoop library + - To troubleshoot native library loading issues on Ozone Datanode and applications, configure their log level to DEBUG. The log messages below are examples, and actual paths may vary. The following log message indicates that the libhadoop native library fails to load: + + ```bash + 25/06/14 01:25:21 DEBUG util.NativeCodeLoader: Trying to load the custom-built native-hadoop library... + 25/06/14 01:25:21 DEBUG util.NativeCodeLoader: Failed to load native-hadoop with error: java.lang.UnsatisfiedLinkError: no hadoop in java.library.path + 25/06/14 01:25:21 DEBUG util.NativeCodeLoader: java.library.path=/opt/hadoop/lib/native:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib + 25/06/14 01:25:21 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable + ``` + + - And the following log message indicates OpenSSL library fails to load: + + ```bash + 25/06/14 01:18:53 DEBUG crypto.OpensslCipher: Failed to load OpenSSL Cipher. + java.lang.UnsatisfiedLinkError: Cannot load libcrypto.so (libcrypto.so: cannot open shared object file: No such file or directory)! + at org.apache.hadoop.crypto.OpensslCipher.initIDs(Native Method) + at org.apache.hadoop.crypto.OpensslCipher.(OpensslCipher.java:89) + at org.apache.hadoop.crypto.OpensslAesCtrCryptoCodec.(OpensslAesCtrCryptoCodec.java:50) + ``` 3. **Validate Hardware Acceleration:** - - To verify if AES-NI is being utilized, check OpenSSL acceleration: - - ```shell - openssl speed -evp aes-256-ctr - ``` + - To verify if AES-NI is being utilized, check OpenSSL acceleration: + + ```shell + openssl speed -evp aes-256-ctr + ``` ## Using Transparent Data Encryption from S3G @@ -111,18 +111,18 @@ Ozone’s S3 Gateway (S3G) allows you to access encrypted buckets. However, it's When creating an encrypted bucket that will be accessed via S3G: 1. **Create the bucket under the `/s3v` volume:** - The `/s3v` volume is the default volume for S3 buckets. + The `/s3v` volume is the default volume for S3 buckets. - ```shell - ozone sh bucket create --bucketkey /s3v/ --layout=OBJECT_STORE - ``` + ```shell + ozone sh bucket create --bucketkey /s3v/ --layout=OBJECT_STORE + ``` 2. **Alternatively, create an encrypted bucket elsewhere and link it:** - ```shell - ozone sh bucket create --bucketkey // --layout=OBJECT_STORE - ozone sh bucket link // /s3v/ - ``` + ```shell + ozone sh bucket create --bucketkey // --layout=OBJECT_STORE + ozone sh bucket link // /s3v/ + ``` Note 1: An encrypted bucket cannot be created via S3 APIs. It must be done using Ozone shell commands as shown above. After creating an encrypted bucket, all the keys added to this bucket using s3g will be encrypted. diff --git a/docs/05-administrator-guide/02-configuration/03-security/05-encryption/README.mdx b/docs/05-administrator-guide/02-configuration/03-security/05-encryption/README.mdx index 9ca98d1118..1050418cb8 100644 --- a/docs/05-administrator-guide/02-configuration/03-security/05-encryption/README.mdx +++ b/docs/05-administrator-guide/02-configuration/03-security/05-encryption/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Encryption # Encryption Configuration -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents the different types of encryption supported by Ozone and how to configure them. - + diff --git a/docs/05-administrator-guide/02-configuration/03-security/05-ranger.md b/docs/05-administrator-guide/02-configuration/03-security/05-ranger.md index bfc7e6e7c9..c2fd134cc1 100644 --- a/docs/05-administrator-guide/02-configuration/03-security/05-ranger.md +++ b/docs/05-administrator-guide/02-configuration/03-security/05-ranger.md @@ -10,9 +10,9 @@ To use Apache Ranger, you must have Apache Ranger installed in your Hadoop Clust If you have a working Apache Ranger installation that is aware of Ozone, then configuring Ozone to work with Apache Ranger is trivial. You have to enable the ACLs support and set the acl authorizer class inside Ozone to be Ranger authorizer. Please add the following properties to the `ozone-site.xml`. -| Property | Value | -|----------|-------| -| `ozone.acl.enabled` | `true` | +| Property | Value | +| ---------------------------- | ------------------------------------------------------------------------ | +| `ozone.acl.enabled` | `true` | | `ozone.acl.authorizer.class` | `org.apache.ranger.authorization.ozone.authorizer.RangerOzoneAuthorizer` | To use the `RangerOzoneAuthorizer`, you also need to add the following environment variables to `ozone-env.sh`: diff --git a/docs/05-administrator-guide/02-configuration/03-security/README.mdx b/docs/05-administrator-guide/02-configuration/03-security/README.mdx index b91f8f6945..fa6fe0714a 100644 --- a/docs/05-administrator-guide/02-configuration/03-security/README.mdx +++ b/docs/05-administrator-guide/02-configuration/03-security/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Security # Security Configuration -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents how to configure a secure Ozone cluster in a production environment. - + diff --git a/docs/05-administrator-guide/02-configuration/04-performance/02-topology.md b/docs/05-administrator-guide/02-configuration/04-performance/02-topology.md index 4111053d06..793468b267 100644 --- a/docs/05-administrator-guide/02-configuration/04-performance/02-topology.md +++ b/docs/05-administrator-guide/02-configuration/04-performance/02-topology.md @@ -114,7 +114,6 @@ This policy selects a set of Datanodes to form a new pipeline. Its purpose is to The policy is configured by the `ozone.scm.pipeline.placement.impl` property in `ozone-site.xml`. - **`PipelinePlacementPolicy` (Default)** - - **Function:** This is the default and only supported policy for pipeline creation. It chooses Datanodes based on load balancing (pipeline count per node) and network topology. It filters out nodes that are too heavily engaged in other pipelines and then selects nodes to ensure rack diversity. This policy is recommended for most production environments. - **Use Cases:** General purpose pipeline creation in a rack-aware cluster. @@ -138,18 +137,15 @@ Note: When configuring these values, include the full class name prefix: for exa This is configured using the `ozone.scm.container.placement.impl` property in `ozone-site.xml` for Ratis containers. The available policies are: - **`SCMContainerPlacementRackAware` (Default)** - - **Function:** Distributes the Datanodes of a pipeline across racks for fault tolerance (e.g., for a 3-node pipeline, it aims for at least two racks). Similar to HDFS placement. [1] - **Use Cases:** Production clusters needing rack-level fault tolerance. - **Limitations:** Designed for single-layer rack topologies (e.g., `/rack/node`). Not recommended for multi-layer hierarchies (e.g., `/dc/row/rack/node`) as it may not interpret deeper levels correctly. [1] - **`SCMContainerPlacementRandom`** - - **Function:** Randomly selects healthy, available Datanodes, ignoring rack topology. [3] - **Use Cases:** Small/dev/test clusters where rack fault tolerance is not critical. - **`SCMContainerPlacementCapacity`** - - **Function:** Selects Datanodes by available capacity (favors lower disk utilization) to balance disk usage across the cluster. [4] - **Use Cases:** Heterogeneous storage clusters or where even disk utilization is key. @@ -160,7 +156,6 @@ Note: When configuring these values, include the full class name prefix: for exa For Erasure Coded (EC) containers, SCM employs a specialized placement policy to ensure data resilience and availability by distributing data and parity blocks across multiple racks. This is configured using the `ozone.scm.container.placement.ec.impl.key` property in `ozone-site.xml`. - **`SCMContainerPlacementRackScatter` (Default)** - - **Function:** This is the default policy for EC containers. It attempts to place each block (both data and parity) of an EC container on a different rack. For example, for an RS-6-3-1024k container (6 data blocks + 3 parity blocks), this policy will try to place the 9 blocks on 9 different racks. This "scatter" approach maximizes the fault tolerance, as the loss of a single rack will not impact more than one block of the container. [5] - **Use Cases:** This policy is highly recommended for production clusters using Erasure Coding to protect against rack-level failures. - **Configuration:** diff --git a/docs/05-administrator-guide/02-configuration/04-performance/04-rocksdb.md b/docs/05-administrator-guide/02-configuration/04-performance/04-rocksdb.md index c259a69d7e..c2c3b1a3de 100644 --- a/docs/05-administrator-guide/02-configuration/04-performance/04-rocksdb.md +++ b/docs/05-administrator-guide/02-configuration/04-performance/04-rocksdb.md @@ -70,45 +70,45 @@ Effective tuning of RocksDB can significantly impact Ozone's performance. Ozone Ozone provides a set of general RocksDB configurations that apply to all services (OM, SCM, and Datanodes) unless overridden by more specific settings. With the exception of `hdds.db.profile` and `ozone.metastore.rocksdb.cf.write.buffer.size`, these properties are defined in `RocksDBConfiguration.java`. -| Property | Default | Description | -|----------|---------|-------------| -| `hdds.db.profile` | `DISK` | Specifies the RocksDB profile to use, which determines the default DBOptions and ColumnFamilyOptions. Possible values include `SSD` and `DISK`. For example, setting this to `SSD` will apply tunings optimized for SSD storage. | -| `ozone.metastore.rocksdb.statistics` | `OFF` | The statistics level of the RocksDB store. If set to any value from `org.rocksdb.StatsLevel` (e.g., ALL or EXCEPT_DETAILED_TIMERS), RocksDB statistics will be exposed over JMX. Set to OFF to disable statistics collection. Note: collecting statistics can have a 5–10% performance penalty. | +| Property | Default | Description | +| ------------------------------------ | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `hdds.db.profile` | `DISK` | Specifies the RocksDB profile to use, which determines the default DBOptions and ColumnFamilyOptions. Possible values include `SSD` and `DISK`. For example, setting this to `SSD` will apply tunings optimized for SSD storage. | +| `ozone.metastore.rocksdb.statistics` | `OFF` | The statistics level of the RocksDB store. If set to any value from `org.rocksdb.StatsLevel` (e.g., ALL or EXCEPT_DETAILED_TIMERS), RocksDB statistics will be exposed over JMX. Set to OFF to disable statistics collection. Note: collecting statistics can have a 5–10% performance penalty. | **Write Options:** -| Property | Default | Description | -|----------|---------|-------------| -| `hadoop.hdds.db.rocksdb.writeoption.sync` | `false` | If set to `true`, writes are synchronized to persistent storage, ensuring durability at the cost of performance. If `false`, writes are flushed asynchronously. | -| `ozone.metastore.rocksdb.cf.write.buffer.size` | `128MB` | The write buffer (memtable) size for each column family of the RocksDB store. | +| Property | Default | Description | +| ---------------------------------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `hadoop.hdds.db.rocksdb.writeoption.sync` | `false` | If set to `true`, writes are synchronized to persistent storage, ensuring durability at the cost of performance. If `false`, writes are flushed asynchronously. | +| `ozone.metastore.rocksdb.cf.write.buffer.size` | `128MB` | The write buffer (memtable) size for each column family of the RocksDB store. | **Write-Ahead Log (WAL) Management:** -| Property | Default | Description | -|----------|---------|-------------| -| `hadoop.hdds.db.rocksdb.WAL_ttl_seconds` | `1200` | The time-to-live for WAL files in seconds. | -| `hadoop.hdds.db.rocksdb.WAL_size_limit_MB` | `0` | The total size limit for WAL files in megabytes. When this limit is exceeded, the oldest WAL files are deleted. A value of `0` means no limit. | +| Property | Default | Description | +| ------------------------------------------ | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | +| `hadoop.hdds.db.rocksdb.WAL_ttl_seconds` | `1200` | The time-to-live for WAL files in seconds. | +| `hadoop.hdds.db.rocksdb.WAL_size_limit_MB` | `0` | The total size limit for WAL files in megabytes. When this limit is exceeded, the oldest WAL files are deleted. A value of `0` means no limit. | **Logging:** -| Property | Default | Description | -|----------|---------|-------------| -| `hadoop.hdds.db.rocksdb.logging.enabled` | `false` | Enables or disables RocksDB's own logging. | -| `hadoop.hdds.db.rocksdb.logging.level` | `INFO` | The logging level for RocksDB (INFO, DEBUG, WARN, ERROR, FATAL). | -| `hadoop.hdds.db.rocksdb.max.log.file.size` | `100MB` | The maximum size of a single RocksDB log file. | -| `hadoop.hdds.db.rocksdb.keep.log.file.num` | `10` | The maximum number of RocksDB log files to retain. | +| Property | Default | Description | +| ------------------------------------------ | ------- | ---------------------------------------------------------------- | +| `hadoop.hdds.db.rocksdb.logging.enabled` | `false` | Enables or disables RocksDB's own logging. | +| `hadoop.hdds.db.rocksdb.logging.level` | `INFO` | The logging level for RocksDB (INFO, DEBUG, WARN, ERROR, FATAL). | +| `hadoop.hdds.db.rocksdb.max.log.file.size` | `100MB` | The maximum size of a single RocksDB log file. | +| `hadoop.hdds.db.rocksdb.keep.log.file.num` | `10` | The maximum number of RocksDB log files to retain. | ### Ozone Manager (OM) Specific Settings These settings, defined in `ozone-default.xml`, apply specifically to the Ozone Manager. -| Property | Default | Description | -|----------|-------------------------------------------------------------------------------------------|-------------| -| `ozone.om.db.max.open.files` | `-1` (unlimited) | The total number of files that a RocksDB can open in the OM. | -| `ozone.om.compaction.service.enabled` | `false` | Enable or disable a background job that periodically compacts RocksDB tables flagged for compaction. | -| `ozone.om.compaction.service.run.interval` | `6h` | The interval for the OM's compaction service. | -| `ozone.om.compaction.service.timeout` | `10m` | Timeout for the OM's compaction service. | -| `ozone.om.compaction.service.columnfamilies` | `keyTable`
`fileTable`
`directoryTable`
`deletedTable`
`deletedDirectoryTable`
`multipartInfoTable` | A comma-separated list of column families to be compacted by the service. | +| Property | Default | Description | +| -------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | +| `ozone.om.db.max.open.files` | `-1` (unlimited) | The total number of files that a RocksDB can open in the OM. | +| `ozone.om.compaction.service.enabled` | `false` | Enable or disable a background job that periodically compacts RocksDB tables flagged for compaction. | +| `ozone.om.compaction.service.run.interval` | `6h` | The interval for the OM's compaction service. | +| `ozone.om.compaction.service.timeout` | `10m` | Timeout for the OM's compaction service. | +| `ozone.om.compaction.service.columnfamilies` | `keyTable`
`fileTable`
`directoryTable`
`deletedTable`
`deletedDirectoryTable`
`multipartInfoTable` | A comma-separated list of column families to be compacted by the service. | ### Datanode-Specific Settings @@ -118,42 +118,42 @@ Key tuning parameters for the Datanode often involve: **Memory usage:** Configuring block cache, write buffer manager, and other memory-related settings. -| Property | Default | Description | -|----------|---------|-------------| -| `hdds.datanode.metadata.rocksdb.cache.size` | `1GB` | Configures the block cache size for RocksDB instances on Datanodes. | +| Property | Default | Description | +| ------------------------------------------- | ------- | ------------------------------------------------------------------- | +| `hdds.datanode.metadata.rocksdb.cache.size` | `1GB` | Configures the block cache size for RocksDB instances on Datanodes. | **Compaction strategies:** Optimizing how data is merged and organized on disk. For more details, refer to the [Datanode Container Schema v3 in DN Documentation](../../../system-internals/components/datanode/rocksdb-schema/). -| Property | Default | Description | -|----------|---------|-------------| -| `hdds.datanode.rocksdb.auto-compaction-small-sst-file` | `true` | Enables or disables auto-compaction for small SST files. | -| `hdds.datanode.rocksdb.auto-compaction-small-sst-file-size-threshold` | `1MB` | Threshold for small SST file size for auto-compaction. | -| `hdds.datanode.rocksdb.auto-compaction-small-sst-file-num-threshold` | `512` | Threshold for the number of small SST files for auto-compaction. | -| `hdds.datanode.rocksdb.auto-compaction-small-sst-file.interval.minutes` | `120` | Auto compact small SST files interval in minutes. | -| `hdds.datanode.rocksdb.auto-compaction-small-sst-file.threads` | `1` | Auto compact small SST files threads. | +| Property | Default | Description | +| ----------------------------------------------------------------------- | ------- | ---------------------------------------------------------------- | +| `hdds.datanode.rocksdb.auto-compaction-small-sst-file` | `true` | Enables or disables auto-compaction for small SST files. | +| `hdds.datanode.rocksdb.auto-compaction-small-sst-file-size-threshold` | `1MB` | Threshold for small SST file size for auto-compaction. | +| `hdds.datanode.rocksdb.auto-compaction-small-sst-file-num-threshold` | `512` | Threshold for the number of small SST files for auto-compaction. | +| `hdds.datanode.rocksdb.auto-compaction-small-sst-file.interval.minutes` | `120` | Auto compact small SST files interval in minutes. | +| `hdds.datanode.rocksdb.auto-compaction-small-sst-file.threads` | `1` | Auto compact small SST files threads. | **Write-ahead log (WAL) settings:** Balancing durability and write performance. -| Property | Default | Description | -|----------|---------|-------------| -| `hdds.datanode.rocksdb.log.max-file-size` | `32MB` | The max size of each user log file of RocksDB. O means no size limit. | -| `hdds.datanode.rocksdb.log.max-file-num` | `64` | The max user log file number to keep for each RocksDB. | +| Property | Default | Description | +| ----------------------------------------- | ------- | --------------------------------------------------------------------- | +| `hdds.datanode.rocksdb.log.max-file-size` | `32MB` | The max size of each user log file of RocksDB. O means no size limit. | +| `hdds.datanode.rocksdb.log.max-file-num` | `64` | The max user log file number to keep for each RocksDB. | **Logging:** -| Property | Default | Description | -|----------|---------|-------------| -| `hdds.datanode.rocksdb.log.level` | `INFO` | The user log level of RocksDB(DEBUG/INFO/WARN/ERROR/FATAL)). | +| Property | Default | Description | +| --------------------------------- | ------- | ------------------------------------------------------------ | +| `hdds.datanode.rocksdb.log.level` | `INFO` | The user log level of RocksDB(DEBUG/INFO/WARN/ERROR/FATAL)). | **Other Settings:** -| Property | Default | Description | -|----------|--------|------------| -| `hdds.datanode.db.config.path` | empty (not configured) | Path to an INI configuration file for advanced RocksDB tuning on Datanodes. | -| `hdds.datanode.container.schema.v3.enabled` | `true` | Enable container schema v3 (one RocksDB per disk). | -| `hdds.datanode.container.schema.v3.key.separator` | | | The separator between Container ID and container meta key name in schema v3. | -| `hdds.datanode.rocksdb.delete-obsolete-files-period` | `1h` | Periodicity when obsolete files get deleted. | -| `hdds.datanode.rocksdb.max-open-files` | `1024` | The total number of files that a RocksDB can open. | +| Property | Default | Description | +| ---------------------------------------------------- | ---------------------- | ---------------------------------------------------------------------------- | +| `hdds.datanode.db.config.path` | empty (not configured) | Path to an INI configuration file for advanced RocksDB tuning on Datanodes. | +| `hdds.datanode.container.schema.v3.enabled` | `true` | Enable container schema v3 (one RocksDB per disk). | +| `hdds.datanode.container.schema.v3.key.separator` | | | The separator between Container ID and container meta key name in schema v3. | +| `hdds.datanode.rocksdb.delete-obsolete-files-period` | `1h` | Periodicity when obsolete files get deleted. | +| `hdds.datanode.rocksdb.max-open-files` | `1024` | The total number of files that a RocksDB can open. | ## 4. Troubleshooting and repair tools relevant to RocksDB diff --git a/docs/05-administrator-guide/02-configuration/04-performance/08-fair-call-queue.md b/docs/05-administrator-guide/02-configuration/04-performance/08-fair-call-queue.md index 2a2cc58732..5902988094 100644 --- a/docs/05-administrator-guide/02-configuration/04-performance/08-fair-call-queue.md +++ b/docs/05-administrator-guide/02-configuration/04-performance/08-fair-call-queue.md @@ -102,8 +102,8 @@ Port used for below examples : 9862 ``` 2. **Verify Metrics**: Check that FCQ metrics are being collected (via JMX or metrics endpoint): - - `FairCallQueueSize_p` for each priority level - - `FairCallQueueOverflowedCalls_p` for overflow statistics + - `FairCallQueueSize_p` for each priority level + - `FairCallQueueOverflowedCalls_p` for overflow statistics ## Troubleshooting diff --git a/docs/05-administrator-guide/02-configuration/04-performance/README.mdx b/docs/05-administrator-guide/02-configuration/04-performance/README.mdx index 544de04af8..966e5ce60b 100644 --- a/docs/05-administrator-guide/02-configuration/04-performance/README.mdx +++ b/docs/05-administrator-guide/02-configuration/04-performance/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Performance # Performance Related Configurations -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents how to configure Ozone to optimize performance. - + diff --git a/docs/05-administrator-guide/02-configuration/06-high-availability/01-scm-ha.md b/docs/05-administrator-guide/02-configuration/06-high-availability/01-scm-ha.md index 78c48accea..7d73b8a7a2 100644 --- a/docs/05-administrator-guide/02-configuration/06-high-availability/01-scm-ha.md +++ b/docs/05-administrator-guide/02-configuration/06-high-availability/01-scm-ha.md @@ -61,7 +61,7 @@ Second and third nodes should be *bootstrapped* instead of init. These clusters ozone scm --bootstrap ``` -Note: both commands perform one-time initialization. SCM still needs to be started by running `ozone --daemon start scm`. +Note: both commands perform one-time initialization. SCM still needs to be started by running `ozone --daemon start scm`. ## SCM Leader Transfer @@ -83,7 +83,7 @@ This can be improved: primordial SCM can be configured by setting `ozone.scm.pri ``` -With this configuration both `scm --init` and `scm --bootstrap` can be safely executed on **all** SCM nodes. Each node will only perform the action applicable to it based on the `ozone.scm.primordial.node.id` and its own node ID. +With this configuration both `scm --init` and `scm --bootstrap` can be safely executed on **all** SCM nodes. Each node will only perform the action applicable to it based on the `ozone.scm.primordial.node.id` and its own node ID. Note: SCM still needs to be started after the init/bootstrap process. diff --git a/docs/05-administrator-guide/02-configuration/06-high-availability/README.mdx b/docs/05-administrator-guide/02-configuration/06-high-availability/README.mdx index a608c49510..2d515bf149 100644 --- a/docs/05-administrator-guide/02-configuration/06-high-availability/README.mdx +++ b/docs/05-administrator-guide/02-configuration/06-high-availability/README.mdx @@ -4,8 +4,8 @@ sidebar_label: High Availability # High Availability -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section covers the configuration of High Availability (HA) features in Apache Ozone. - + diff --git a/docs/05-administrator-guide/02-configuration/README.mdx b/docs/05-administrator-guide/02-configuration/README.mdx index aa1d30329c..f56f3cc895 100644 --- a/docs/05-administrator-guide/02-configuration/README.mdx +++ b/docs/05-administrator-guide/02-configuration/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Configuration # Configuring Ozone For Production -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents how to configure Ozone in a production environment. - + diff --git a/docs/05-administrator-guide/03-operations/02-upgrade-and-downgrade.md b/docs/05-administrator-guide/03-operations/02-upgrade-and-downgrade.md index 2f57cd38a8..ef8d6be5b5 100644 --- a/docs/05-administrator-guide/03-operations/02-upgrade-and-downgrade.md +++ b/docs/05-administrator-guide/03-operations/02-upgrade-and-downgrade.md @@ -11,14 +11,14 @@ Ozone supports non-rolling upgrades and downgrades, where all components are sto After upgrading components, the upgrade process is divided into two states: 1. **Pre-finalized**: When the current components are stopped and the new versions are started, they will see that the data on disk was written by a previous version of Ozone and enter a pre-finalized state. In the pre-finalized state: - - The cluster can be downgraded at any time by stopping all components and restarting with the old versions. - - Backwards incompatible features introduced in the new version will be disallowed by the cluster. - - The cluster will remain fully operational with all functionality present in the old version still allowed. - - Any data created while pre-finalized will remain readable after downgrade. + - The cluster can be downgraded at any time by stopping all components and restarting with the old versions. + - Backwards incompatible features introduced in the new version will be disallowed by the cluster. + - The cluster will remain fully operational with all functionality present in the old version still allowed. + - Any data created while pre-finalized will remain readable after downgrade. -2. **Finalized**: When a finalize command is given to OM or SCM, they will enter a finalized state. In the finalized state: - - The cluster can no longer be downgraded. - - All new features of the cluster introduced in the new version can be used. +2. **Finalized**: When a finalize command is given to OM or SCM, they will enter a finalized state. In the finalized state: + - The cluster can no longer be downgraded. + - All new features of the cluster introduced in the new version can be used. ### Querying finalization status @@ -34,49 +34,49 @@ Starting with your current version of Ozone, complete the following steps to upg 1. If using OM HA and currently running Ozone 1.2.0 or greater, prepare the Ozone Manager. If OM HA is not being used, this step can be skipped. - ```bash - ozone admin om prepare -id= - ``` + ```bash + ozone admin om prepare -id= + ``` - The `prepare` command will block the Ozone Managers from receiving all write requests. See [Ozone Manager Prepare For Upgrade](https://ozone.apache.org/docs/edge/design/omprepare.html) for more information + The `prepare` command will block the Ozone Managers from receiving all write requests. See [Ozone Manager Prepare For Upgrade](https://ozone.apache.org/docs/edge/design/omprepare.html) for more information 2. Stop all components. 3. Replace artifacts of all components with the newer versions. 4. Start the components - 1. Start the SCM and Datanodes as usual: + 1. Start the SCM and Datanodes as usual: - ```bash - ozone --daemon start scm - ozone --daemon start datanode - ``` + ```bash + ozone --daemon start scm + ozone --daemon start datanode + ``` - 2. Start the Ozone Manager using the `--upgrade` flag to take it out of prepare mode. + 2. Start the Ozone Manager using the `--upgrade` flag to take it out of prepare mode. - ```bash - ozone --daemon start om --upgrade - ``` + ```bash + ozone --daemon start om --upgrade + ``` - - There also exists a `--downgrade` flag which is an alias of `--upgrade`. The name used does not matter. - - **IMPORTANT**: All OMs must be started with the `--upgrade` or `--downgrade` flag in this step. If some of the OMs are not started with this flag by mistake, run `ozone admin om cancelprepare -id=` to make sure all OMs leave prepare mode. + - There also exists a `--downgrade` flag which is an alias of `--upgrade`. The name used does not matter. + - **IMPORTANT**: All OMs must be started with the `--upgrade` or `--downgrade` flag in this step. If some of the OMs are not started with this flag by mistake, run `ozone admin om cancelprepare -id=` to make sure all OMs leave prepare mode. - At this point, the cluster is upgraded to a pre-finalized state and fully operational. The cluster can be downgraded by repeating the above steps, but restoring the older versions of components in step 3, instead of the newer versions. To finalize the cluster to use new features, continue on with the following steps. + At this point, the cluster is upgraded to a pre-finalized state and fully operational. The cluster can be downgraded by repeating the above steps, but restoring the older versions of components in step 3, instead of the newer versions. To finalize the cluster to use new features, continue on with the following steps. - **Once the following steps are performed, downgrading will not be possible.** + **Once the following steps are performed, downgrading will not be possible.** 5. Finalize SCM - ```bash - ozone admin scm finalizeupgrade - ``` + ```bash + ozone admin scm finalizeupgrade + ``` - At this point, SCM will tell all of the Datanodes to finalize. Once SCM has finalized enough Datanodes to form a write pipeline, it will return that finalization was successful. The remaining pre-finalized Datanodes will be in a read-only state until they indicate to SCM that they have finalized. Write requests will be directed to finalized Datanodes only. + At this point, SCM will tell all of the Datanodes to finalize. Once SCM has finalized enough Datanodes to form a write pipeline, it will return that finalization was successful. The remaining pre-finalized Datanodes will be in a read-only state until they indicate to SCM that they have finalized. Write requests will be directed to finalized Datanodes only. 6. Finalize OM - ```bash - ozone admin om finalizeupgrade -id= - ``` + ```bash + ozone admin om finalizeupgrade -id= + ``` At this point, the cluster is finalized and the upgrade is complete. diff --git a/docs/05-administrator-guide/03-operations/03-node-decommissioning-and-maintenance/03-datanodes/02-datanode-maintenance.md b/docs/05-administrator-guide/03-operations/03-node-decommissioning-and-maintenance/03-datanodes/02-datanode-maintenance.md index 78a3e697f2..01a83df5a5 100644 --- a/docs/05-administrator-guide/03-operations/03-node-decommissioning-and-maintenance/03-datanodes/02-datanode-maintenance.md +++ b/docs/05-administrator-guide/03-operations/03-node-decommissioning-and-maintenance/03-datanodes/02-datanode-maintenance.md @@ -44,10 +44,10 @@ ozone admin datanode recommission [-hV] [-id=] [--scm=] [ \ No newline at end of file + diff --git a/docs/05-administrator-guide/03-operations/03-node-decommissioning-and-maintenance/README.mdx b/docs/05-administrator-guide/03-operations/03-node-decommissioning-and-maintenance/README.mdx index 95fb60ed18..d2c49da671 100644 --- a/docs/05-administrator-guide/03-operations/03-node-decommissioning-and-maintenance/README.mdx +++ b/docs/05-administrator-guide/03-operations/03-node-decommissioning-and-maintenance/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Decommissioning and Maintenance # Node Decommissioning and Maintenance -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section contains instructions to remove Ozone nodes from the cluster in a controlled manner. - + diff --git a/docs/05-administrator-guide/03-operations/04-disk-replacement/01-ozone-manager.md b/docs/05-administrator-guide/03-operations/04-disk-replacement/01-ozone-manager.md index 507dfd7602..5350dce583 100644 --- a/docs/05-administrator-guide/03-operations/04-disk-replacement/01-ozone-manager.md +++ b/docs/05-administrator-guide/03-operations/04-disk-replacement/01-ozone-manager.md @@ -15,13 +15,13 @@ sidebar_label: Ozone Manager When a disk containing the Ozone Manager (OM) metadata directory fails, proper recovery procedures are critical to maintain cluster availability and prevent data loss. This document provides comprehensive, step-by-step guidance for safely replacing failed disks on OM nodes, with distinct procedures for standalone and High-Availability (HA) configurations. Following these procedures correctly ensures minimal downtime and maintains the integrity of your Ozone cluster's metadata. - **Purpose** -This guide provides the steps required to safely replace a failed disk on an Ozone Manager (OM) node. + This guide provides the steps required to safely replace a failed disk on an Ozone Manager (OM) node. - **Impact of OM Disk Failure** -The OM disk is critical as it stores the RocksDB database containing the entire object store namespace (volumes, buckets, keys) and block locations. A failure of this disk can lead to metadata loss if not handled correctly. + The OM disk is critical as it stores the RocksDB database containing the entire object store namespace (volumes, buckets, keys) and block locations. A failure of this disk can lead to metadata loss if not handled correctly. - **Crucial Distinction: HA vs. Non-HA** -The recovery procedure depends entirely on whether your OM is a single, standalone instance or part of a High-Availability (HA) Ratis-based quorum. The HA procedure is significantly safer and results in no cluster downtime. Running a standalone OM is not recommended for production environments. + The recovery procedure depends entirely on whether your OM is a single, standalone instance or part of a High-Availability (HA) Ratis-based quorum. The HA procedure is significantly safer and results in no cluster downtime. Running a standalone OM is not recommended for production environments. --- diff --git a/docs/05-administrator-guide/03-operations/04-disk-replacement/03-datanodes.md b/docs/05-administrator-guide/03-operations/04-disk-replacement/03-datanodes.md index 528600c6df..917c545051 100644 --- a/docs/05-administrator-guide/03-operations/04-disk-replacement/03-datanodes.md +++ b/docs/05-administrator-guide/03-operations/04-disk-replacement/03-datanodes.md @@ -128,13 +128,13 @@ This configures disk checks to run every 30 minutes instead of the default 60 mi Additional properties control disk health check behavior: -| Property | Default | Description | -|----------|---------|-------------| -| `hdds.datanode.disk.check.io.test.count` | `3` | Number of IO tests required to determine failure. Set to `0` to disable IO checks. | -| `hdds.datanode.disk.check.io.failures.tolerated` | `1` | IO test failures allowed before marking volume as failed | -| `hdds.datanode.disk.check.io.file.size` | `100B` | Size of temporary file used for I/O health checks | -| `hdds.datanode.disk.check.min.gap` | `10m` | Minimum time gap between successive checks of the same volume | -| `hdds.datanode.disk.check.timeout` | `10m` | Maximum time allowed for a disk check to complete | +| Property | Default | Description | +| ------------------------------------------------ | ------- | ---------------------------------------------------------------------------------- | +| `hdds.datanode.disk.check.io.test.count` | `3` | Number of IO tests required to determine failure. Set to `0` to disable IO checks. | +| `hdds.datanode.disk.check.io.failures.tolerated` | `1` | IO test failures allowed before marking volume as failed | +| `hdds.datanode.disk.check.io.file.size` | `100B` | Size of temporary file used for I/O health checks | +| `hdds.datanode.disk.check.min.gap` | `10m` | Minimum time gap between successive checks of the same volume | +| `hdds.datanode.disk.check.timeout` | `10m` | Maximum time allowed for a disk check to complete | ## Failed Volume Handling @@ -183,7 +183,7 @@ Ozone Datanodes do not currently support hotswap of disks. To update the disk li hdds.datanode.dir /data1,/data2,/data3 - + hdds.datanode.dir diff --git a/docs/05-administrator-guide/03-operations/04-disk-replacement/README.mdx b/docs/05-administrator-guide/03-operations/04-disk-replacement/README.mdx index 95b6419937..119ae069ac 100644 --- a/docs/05-administrator-guide/03-operations/04-disk-replacement/README.mdx +++ b/docs/05-administrator-guide/03-operations/04-disk-replacement/README.mdx @@ -1,7 +1,7 @@ # Disk Replacement -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section contains instructions to replace disks on Ozone nodes. - + diff --git a/docs/05-administrator-guide/03-operations/05-data-balancing/01-container-balancer.md b/docs/05-administrator-guide/03-operations/05-data-balancing/01-container-balancer.md index 558e945ea0..77c2454376 100644 --- a/docs/05-administrator-guide/03-operations/05-data-balancing/01-container-balancer.md +++ b/docs/05-administrator-guide/03-operations/05-data-balancing/01-container-balancer.md @@ -34,20 +34,20 @@ ozone admin containerbalancer start [options] **Options:** -| Option | Description | -| ------ | ----------- | -| `-t`, `--threshold` | The percentage deviation from the average utilization of the cluster after which a Datanode will be rebalanced. Default is 10%. | -| `-i`, `--iterations` | The maximum number of consecutive iterations the balancer will run for. Default is 10. Use -1 for infinite iterations. | -| `-d`, `--maxDatanodesPercentageToInvolvePerIteration` | The maximum percentage of healthy, in-service Datanodes that can be involved in balancing in one iteration. Default is 20%. | -| `-s`, `--maxSizeToMovePerIterationInGB` | The maximum size of data in GB to be moved in one iteration. Default is 500GB. | -| `-e`, `--maxSizeEnteringTargetInGB` | The maximum size in GB that can enter a target Datanode in one iteration. Default is 26GB. | -| `-l`, `--maxSizeLeavingSourceInGB` | The maximum size in GB that can leave a source Datanode in one iteration. Default is 26GB. | -| `--balancing-iteration-interval-minutes` | The interval in minutes between each iteration of the Container Balancer. Default is 70 minutes. | -| `--move-timeout-minutes` | The time in minutes to allow a single container to move from source to target. Default is 65 minutes. | -| `--move-replication-timeout-minutes` | The time in minutes to allow a single container's replication from source to target as part of a container move. Default is 50 minutes. | -| `--move-network-topology-enable` | Whether to consider network topology when selecting a target for a source. Default is false. | -| `--include-datanodes` | A comma-separated list of Datanode hostnames or IP addresses to be included in balancing. | -| `--exclude-datanodes` | A comma-separated list of Datanode hostnames or IP addresses to be excluded from balancing. | +| Option | Description | +| ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | +| `-t`, `--threshold` | The percentage deviation from the average utilization of the cluster after which a Datanode will be rebalanced. Default is 10%. | +| `-i`, `--iterations` | The maximum number of consecutive iterations the balancer will run for. Default is 10. Use -1 for infinite iterations. | +| `-d`, `--maxDatanodesPercentageToInvolvePerIteration` | The maximum percentage of healthy, in-service Datanodes that can be involved in balancing in one iteration. Default is 20%. | +| `-s`, `--maxSizeToMovePerIterationInGB` | The maximum size of data in GB to be moved in one iteration. Default is 500GB. | +| `-e`, `--maxSizeEnteringTargetInGB` | The maximum size in GB that can enter a target Datanode in one iteration. Default is 26GB. | +| `-l`, `--maxSizeLeavingSourceInGB` | The maximum size in GB that can leave a source Datanode in one iteration. Default is 26GB. | +| `--balancing-iteration-interval-minutes` | The interval in minutes between each iteration of the Container Balancer. Default is 70 minutes. | +| `--move-timeout-minutes` | The time in minutes to allow a single container to move from source to target. Default is 65 minutes. | +| `--move-replication-timeout-minutes` | The time in minutes to allow a single container's replication from source to target as part of a container move. Default is 50 minutes. | +| `--move-network-topology-enable` | Whether to consider network topology when selecting a target for a source. Default is false. | +| `--include-datanodes` | A comma-separated list of Datanode hostnames or IP addresses to be included in balancing. | +| `--exclude-datanodes` | A comma-separated list of Datanode hostnames or IP addresses to be excluded from balancing. | ### Status @@ -75,19 +75,19 @@ ozone admin containerbalancer stop The Container Balancer can also be configured through the `ozone-site.xml` file. -| Property | Description | Default Value | -| -------- | ----------- | ------------- | -| `hdds.container.balancer.utilization.threshold` | A cluster is considered balanced if for each Datanode, the utilization of the Datanode differs from the utilization of the cluster no more than this threshold. | 10% | -| `hdds.container.balancer.datanodes.involved.max.percentage.per.iteration` | Maximum percentage of healthy, in-service Datanodes that can be involved in balancing in one iteration. | 20% | -| `hdds.container.balancer.size.moved.max.per.iteration` | The maximum size of data that will be moved by Container Balancer in one iteration. | 500GB | -| `hdds.container.balancer.size.entering.target.max` | The maximum size that can enter a target Datanode in each iteration. | 26GB | -| `hdds.container.balancer.size.leaving.source.max` | The maximum size that can leave a source Datanode in each iteration. | 26GB | -| `hdds.container.balancer.iterations` | The number of iterations that Container Balancer will run for. | 10 | -| `hdds.container.balancer.exclude.containers` | A comma-separated list of container IDs to exclude from balancing. | "" | -| `hdds.container.balancer.move.timeout` | The amount of time to allow a single container to move from source to target. | 65m | -| `hdds.container.balancer.move.replication.timeout` | The amount of time to allow a single container's replication from source to target as part of a container move. | 50m | -| `hdds.container.balancer.balancing.iteration.interval` | The interval period between each iteration of Container Balancer. | 70m | -| `hdds.container.balancer.include.datanodes` | A comma-separated list of Datanode hostnames or IP addresses. Only the Datanodes specified in this list are balanced. | "" | -| `hdds.container.balancer.exclude.datanodes` | A comma-separated list of Datanode hostnames or IP addresses. The Datanodes specified in this list are excluded from balancing. | "" | -| `hdds.container.balancer.move.networkTopology.enable` | Whether to take network topology into account when selecting a target for a source. | false | -| `hdds.container.balancer.trigger.du.before.move.enable` | Whether to send a command to all healthy and in-service data nodes to run `du` immediately before starting a balance iteration. | false | +| Property | Description | Default Value | +| ------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | +| `hdds.container.balancer.utilization.threshold` | A cluster is considered balanced if for each Datanode, the utilization of the Datanode differs from the utilization of the cluster no more than this threshold. | 10% | +| `hdds.container.balancer.datanodes.involved.max.percentage.per.iteration` | Maximum percentage of healthy, in-service Datanodes that can be involved in balancing in one iteration. | 20% | +| `hdds.container.balancer.size.moved.max.per.iteration` | The maximum size of data that will be moved by Container Balancer in one iteration. | 500GB | +| `hdds.container.balancer.size.entering.target.max` | The maximum size that can enter a target Datanode in each iteration. | 26GB | +| `hdds.container.balancer.size.leaving.source.max` | The maximum size that can leave a source Datanode in each iteration. | 26GB | +| `hdds.container.balancer.iterations` | The number of iterations that Container Balancer will run for. | 10 | +| `hdds.container.balancer.exclude.containers` | A comma-separated list of container IDs to exclude from balancing. | "" | +| `hdds.container.balancer.move.timeout` | The amount of time to allow a single container to move from source to target. | 65m | +| `hdds.container.balancer.move.replication.timeout` | The amount of time to allow a single container's replication from source to target as part of a container move. | 50m | +| `hdds.container.balancer.balancing.iteration.interval` | The interval period between each iteration of Container Balancer. | 70m | +| `hdds.container.balancer.include.datanodes` | A comma-separated list of Datanode hostnames or IP addresses. Only the Datanodes specified in this list are balanced. | "" | +| `hdds.container.balancer.exclude.datanodes` | A comma-separated list of Datanode hostnames or IP addresses. The Datanodes specified in this list are excluded from balancing. | "" | +| `hdds.container.balancer.move.networkTopology.enable` | Whether to take network topology into account when selecting a target for a source. | false | +| `hdds.container.balancer.trigger.du.before.move.enable` | Whether to send a command to all healthy and in-service data nodes to run `du` immediately before starting a balance iteration. | false | diff --git a/docs/05-administrator-guide/03-operations/05-data-balancing/02-disk-balancer.md b/docs/05-administrator-guide/03-operations/05-data-balancing/02-disk-balancer.md index 8c1174cf91..e6bf523de9 100644 --- a/docs/05-administrator-guide/03-operations/05-data-balancing/02-disk-balancer.md +++ b/docs/05-administrator-guide/03-operations/05-data-balancing/02-disk-balancer.md @@ -132,15 +132,15 @@ ozone admin datanode diskbalancer report [ ...] [--in-service- ### Command Options -| Option | Description | Example | -|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------| -| `` | One or more Datanode addresses as positional arguments. Addresses can be:
- Hostname (e.g., `DN-1`) - uses default CLIENT_RPC port (19864)
- Hostname with port (e.g., `DN-1:19864`)
- IP address (e.g., `192.168.1.10`)
- IP address with port (e.g., `192.168.1.10:19864`)
- Stdin (`-`) - reads Datanode addresses from standard input, one per line | `DN-1`
`DN-1:19864`
`192.168.1.10`
`-` | -| `--in-service-datanodes` | It queries SCM for all IN_SERVICE Datanodes and executes the command on all of them. | `--in-service-datanodes` | -| `--json` | Format output as JSON. | `--json` | -| `-t/--threshold-percentage` | Volume density threshold percentage (default: 10.0). Used with `start` and `update` commands. | `-t 5`
`--threshold-percentage 5.0` | -| `-b/--bandwidth-in-mb` | Maximum disk bandwidth in MB/s (default: 10). Used with `start` and `update` commands. | `-b 20`
`--bandwidth-in-mb 50` | -| `-p/--parallel-thread` | Number of parallel threads (default: 1). Used with `start` and `update` commands. | `-p 5`
`--parallel-thread 10` | -| `-s/--stop-after-disk-even` | Stop automatically after disks are balanced (default: true). Used with `start` and `update` commands. | `-s false`
`--stop-after-disk-even true` | +| Option | Description | Example | +| --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- | +| `` | One or more Datanode addresses as positional arguments. Addresses can be:
- Hostname (e.g., `DN-1`) - uses default CLIENT_RPC port (19864)
- Hostname with port (e.g., `DN-1:19864`)
- IP address (e.g., `192.168.1.10`)
- IP address with port (e.g., `192.168.1.10:19864`)
- Stdin (`-`) - reads Datanode addresses from standard input, one per line | `DN-1`
`DN-1:19864`
`192.168.1.10`
`-` | +| `--in-service-datanodes` | It queries SCM for all IN_SERVICE Datanodes and executes the command on all of them. | `--in-service-datanodes` | +| `--json` | Format output as JSON. | `--json` | +| `-t/--threshold-percentage` | Volume density threshold percentage (default: 10.0). Used with `start` and `update` commands. | `-t 5`
`--threshold-percentage 5.0` | +| `-b/--bandwidth-in-mb` | Maximum disk bandwidth in MB/s (default: 10). Used with `start` and `update` commands. | `-b 20`
`--bandwidth-in-mb 50` | +| `-p/--parallel-thread` | Number of parallel threads (default: 1). Used with `start` and `update` commands. | `-p 5`
`--parallel-thread 10` | +| `-s/--stop-after-disk-even` | Stop automatically after disks are balanced (default: true). Used with `start` and `update` commands. | `-s false`
`--stop-after-disk-even true` | ### Examples @@ -223,15 +223,15 @@ ozone admin datanode diskbalancer report --in-service-datanodes --json The DiskBalancer's behavior can be controlled using the following configuration properties in `ozone-site.xml`. -| Property | Default | Purpose | -|----------|--------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `hdds.datanode.disk.balancer.enabled` | `false` | If false, the DiskBalancer service on the Datanode is disabled. Configure it to true for diskBalancer to be enabled. | -| `hdds.datanode.disk.balancer.volume.density.threshold.percent` | `10.0` | A percentage (0-100). A Datanode is considered balanced if for each volume, its utilization differs from the average Datanode utilization by no more than this threshold. | -| `hdds.datanode.disk.balancer.max.disk.throughputInMBPerSec` | `10` | The maximum bandwidth (in MB/s) that the balancer can use for moving data, to avoid impacting client I/O. | -| `hdds.datanode.disk.balancer.parallel.thread` | `5` | The number of worker threads to use for moving containers in parallel. | -| `hdds.datanode.disk.balancer.service.interval` | `60s` | The time interval at which the Datanode DiskBalancer service checks for imbalance and updates its configuration. | -| `hdds.datanode.disk.balancer.stop.after.disk.even` | `true` | If true, the DiskBalancer will automatically stop its balancing activity once disks are considered balanced (i.e., all volume densities are within the threshold). | -| `hdds.datanode.disk.balancer.volume.choosing.policy` | `org.apache.hadoop.`
`ozone.container.`
`diskbalancer.policy.`
`DefaultVolumeChoosingPolicy` | The policy class for selecting source and destination volumes for balancing. | -| `hdds.datanode.disk.balancer.container.choosing.policy` | `org.apache.hadoop.`
`ozone.container.`
`diskbalancer.policy.`
`DefaultContainerChoosingPolicy` | The policy class for selecting which containers to move from a source volume to destination volume. | -| `hdds.datanode.disk.balancer.service.timeout` | `300s` | Timeout for the Datanode DiskBalancer service operations. | -| `hdds.datanode.disk.balancer.should.run.default` | `false` | If the balancer fails to read its persisted configuration, this value determines if the service should run by default. | +| Property | Default | Purpose | +| -------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `hdds.datanode.disk.balancer.enabled` | `false` | If false, the DiskBalancer service on the Datanode is disabled. Configure it to true for diskBalancer to be enabled. | +| `hdds.datanode.disk.balancer.volume.density.threshold.percent` | `10.0` | A percentage (0-100). A Datanode is considered balanced if for each volume, its utilization differs from the average Datanode utilization by no more than this threshold. | +| `hdds.datanode.disk.balancer.max.disk.throughputInMBPerSec` | `10` | The maximum bandwidth (in MB/s) that the balancer can use for moving data, to avoid impacting client I/O. | +| `hdds.datanode.disk.balancer.parallel.thread` | `5` | The number of worker threads to use for moving containers in parallel. | +| `hdds.datanode.disk.balancer.service.interval` | `60s` | The time interval at which the Datanode DiskBalancer service checks for imbalance and updates its configuration. | +| `hdds.datanode.disk.balancer.stop.after.disk.even` | `true` | If true, the DiskBalancer will automatically stop its balancing activity once disks are considered balanced (i.e., all volume densities are within the threshold). | +| `hdds.datanode.disk.balancer.volume.choosing.policy` | `org.apache.hadoop.`
`ozone.container.`
`diskbalancer.policy.`
`DefaultVolumeChoosingPolicy` | The policy class for selecting source and destination volumes for balancing. | +| `hdds.datanode.disk.balancer.container.choosing.policy` | `org.apache.hadoop.`
`ozone.container.`
`diskbalancer.policy.`
`DefaultContainerChoosingPolicy` | The policy class for selecting which containers to move from a source volume to destination volume. | +| `hdds.datanode.disk.balancer.service.timeout` | `300s` | Timeout for the Datanode DiskBalancer service operations. | +| `hdds.datanode.disk.balancer.should.run.default` | `false` | If the balancer fails to read its persisted configuration, this value determines if the service should run by default. | diff --git a/docs/05-administrator-guide/03-operations/05-data-balancing/README.mdx b/docs/05-administrator-guide/03-operations/05-data-balancing/README.mdx index a38839d8f5..f9e84f6c2f 100644 --- a/docs/05-administrator-guide/03-operations/05-data-balancing/README.mdx +++ b/docs/05-administrator-guide/03-operations/05-data-balancing/README.mdx @@ -2,8 +2,8 @@ sidebar_label: Data Balancing --- -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents about balancing data across Datanodes (Container Balancer) as well as within Datanodes (DiskBalancer) in an Ozone cluster. - \ No newline at end of file + diff --git a/docs/05-administrator-guide/03-operations/07-s3-multi-tenancy/README.mdx b/docs/05-administrator-guide/03-operations/07-s3-multi-tenancy/README.mdx index d80ef6ef37..edac38dcfc 100644 --- a/docs/05-administrator-guide/03-operations/07-s3-multi-tenancy/README.mdx +++ b/docs/05-administrator-guide/03-operations/07-s3-multi-tenancy/README.mdx @@ -4,8 +4,8 @@ sidebar_label: S3 Multi-Tenancy # S3 Multi-Tenancy -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section describes S3 Multi-Tenancy setup and operations in Ozone. - + diff --git a/docs/05-administrator-guide/03-operations/08-snapshots/01-overview.md b/docs/05-administrator-guide/03-operations/08-snapshots/01-overview.md index 87c5aa2e96..e9bbdf9bc9 100644 --- a/docs/05-administrator-guide/03-operations/08-snapshots/01-overview.md +++ b/docs/05-administrator-guide/03-operations/08-snapshots/01-overview.md @@ -26,6 +26,7 @@ When keys are changed or deleted in the live bucket, their data blocks are retai **Snapshot Data Storage:** Snapshot metadata resides in OM's RocksDB. Diff job data is stored in `ozone.om.snapshot.diff.db.dir` (defaults to OM metadata directory). + For more details, see Prashant Pogde's [Introducing Apache Ozone Snapshots](https://medium.com/@prashantpogde/introducing-apache-ozone-snapshots-af82e976142f). ## Managing Snapshots @@ -160,6 +161,7 @@ Path bucketPath = new Path("/vol1/bucket1"); ``` Handle `OMException` or `IOException`. Snapshots are in the bucket's `.snapshot` directory. + Refer to the Ozone File System API guide for more details. #### Ozone ObjectStore Client API @@ -219,6 +221,7 @@ Ozone supports native ACLs and optional Ranger policies for snapshot authorizati Ozone and HDFS snapshots are conceptually similar but differ in key aspects: + - **Granularity:** Ozone snapshots are bucket-level; HDFS snapshots can be taken at any directory level (if snapshottable). - **Metadata vs. Data Changes:** Both track key/file changes. Ozone snapshots don't version bucket metadata changes (e.g., quotas, ACLs). - **Access and Restore:** Both use a `.snapshot` path for read-only access. Restoring in Ozone is a manual copy process (e.g., using DistCp); no automatic rollback. diff --git a/docs/05-administrator-guide/03-operations/08-snapshots/02-configuration-properties.md b/docs/05-administrator-guide/03-operations/08-snapshots/02-configuration-properties.md index 99f13ba860..e217f5d3f9 100644 --- a/docs/05-administrator-guide/03-operations/08-snapshots/02-configuration-properties.md +++ b/docs/05-administrator-guide/03-operations/08-snapshots/02-configuration-properties.md @@ -8,69 +8,69 @@ These parameters, defined in `ozone-site.xml`, control how Ozone manages snapsho ### General Snapshot Management -| Property | Default Value | Description | -|----------|---------------|-------------| -| `ozone.om.fs.snapshot.max.limit` | 10000 | Max snapshots per bucket. Safety limit. | -| `ozone.om.ratis.snapshot.dir` | ratis-snapshot under OM DB dir | The directory where OM Ratis snapshots are stored. | -| `ozone.om.ratis.snapshot.max.total.sst.size` | 100000000 | The maximum total size of SST files to be included in a Ratis snapshot. | -| `ozone.om.snapshot.load.native.lib` | true | Use native RocksDB library for snapshot operations. Set to false as a workaround for native library issues. | -| `ozone.om.snapshot.checkpoint.dir.creation.poll.timeout` | 20s | Timeout for polling the creation of the snapshot checkpoint directory. | +| Property | Default Value | Description | +| -------------------------------------------------------- | ------------------------------ | ----------------------------------------------------------------------------------------------------------- | +| `ozone.om.fs.snapshot.max.limit` | 10000 | Max snapshots per bucket. Safety limit. | +| `ozone.om.ratis.snapshot.dir` | ratis-snapshot under OM DB dir | The directory where OM Ratis snapshots are stored. | +| `ozone.om.ratis.snapshot.max.total.sst.size` | 100000000 | The maximum total size of SST files to be included in a Ratis snapshot. | +| `ozone.om.snapshot.load.native.lib` | true | Use native RocksDB library for snapshot operations. Set to false as a workaround for native library issues. | +| `ozone.om.snapshot.checkpoint.dir.creation.poll.timeout` | 20s | Timeout for polling the creation of the snapshot checkpoint directory. | ### SnapshotDiff Service -| Property | Default Value | Description | -|----------|---------------|-------------| -| `ozone.om.snapshot.diff.db.dir` | OM metadata dir | Directory for SnapshotDiff job data. Use a spacious location for large diffs. | -| `ozone.om.snapshot.force.full.diff` | false | Force a full diff for all snapshot diff jobs. | -| `ozone.om.snapshot.diff.disable.native.libs` | false | Disable native libraries for snapshot diff. | -| `ozone.om.snapshot.diff.max.page.size` | 1000 | Maximum page size for snapshot diff. | -| `ozone.om.snapshot.diff.thread.pool.size` | 10 | Thread pool size for snapshot diff. | -| `ozone.om.snapshot.diff.job.default.wait.time` | 1m | Default wait time for a snapshot diff job. | -| `ozone.om.snapshot.diff.max.allowed.keys.changed.per.job` | 10000000 | Maximum number of keys allowed to be changed per snapshot diff job. | +| Property | Default Value | Description | +| --------------------------------------------------------- | --------------- | ----------------------------------------------------------------------------- | +| `ozone.om.snapshot.diff.db.dir` | OM metadata dir | Directory for SnapshotDiff job data. Use a spacious location for large diffs. | +| `ozone.om.snapshot.force.full.diff` | false | Force a full diff for all snapshot diff jobs. | +| `ozone.om.snapshot.diff.disable.native.libs` | false | Disable native libraries for snapshot diff. | +| `ozone.om.snapshot.diff.max.page.size` | 1000 | Maximum page size for snapshot diff. | +| `ozone.om.snapshot.diff.thread.pool.size` | 10 | Thread pool size for snapshot diff. | +| `ozone.om.snapshot.diff.job.default.wait.time` | 1m | Default wait time for a snapshot diff job. | +| `ozone.om.snapshot.diff.max.allowed.keys.changed.per.job` | 10000000 | Maximum number of keys allowed to be changed per snapshot diff job. | ### Snapshot Compaction and Cleanup -| Property | Default Value | Description | -|----------|---------------|-------------| -| `ozone.snapshot.key.deleting.limit.per.task` | 20000 | The maximum number of keys scanned by the snapshot deleting service in a single run. | -| `ozone.om.snapshot.compact.non.snapshot.diff.tables` | false | When enabled, allows compaction of tables not tracked by snapshot diffs after snapshots are evicted from the cache. | -| `ozone.om.snapshot.compaction.dag.max.time.allowed` | 30 days | Window for efficient SnapshotDiff. Older diffs may be slower. | -| `ozone.om.snapshot.prune.compaction.backup.batch.size` | 2000 | Batch size for pruning compaction backups. | -| `ozone.om.snapshot.compaction.dag.prune.daemon.run.interval` | 10m | Interval for the compaction DAG pruning daemon. | -| `ozone.om.snapshot.diff.max.jobs.purge.per.task` | 100 | Maximum number of snapshot diff jobs to purge per task. | -| `ozone.om.snapshot.diff.job.report.persistent.time` | 7d | Persistence time for snapshot diff job reports. | -| `ozone.om.snapshot.diff.cleanup.service.run.interval` | 1m | Interval for the snapshot diff cleanup service. | -| `ozone.om.snapshot.diff.cleanup.service.timeout` | 5m | Timeout for the snapshot diff cleanup service. | -| `ozone.om.snapshot.cache.cleanup.service.run.interval` | 1m | Interval for the snapshot cache cleanup service. | -| `ozone.snapshot.filtering.limit.per.task` | 2 | The maximum number of snapshots to be filtered in a single run of the snapshot filtering service. | -| `ozone.snapshot.deleting.limit.per.task` | 10 | The maximum number of snapshots to be deleted in a single run of the snapshot deleting service. | -| `ozone.snapshot.filtering.service.interval` | 60s | Interval for the snapshot filtering service. | -| `ozone.snapshot.deleting.service.timeout` | 300s | Timeout for the snapshot deleting service. | -| `ozone.snapshot.deleting.service.interval` | 30s | Interval for the snapshot deleting service. | -| `ozone.snapshot.deep.cleaning.enabled` | false | Enable deep cleaning of snapshots. | +| Property | Default Value | Description | +| ------------------------------------------------------------ | ------------- | ------------------------------------------------------------------------------------------------------------------- | +| `ozone.snapshot.key.deleting.limit.per.task` | 20000 | The maximum number of keys scanned by the snapshot deleting service in a single run. | +| `ozone.om.snapshot.compact.non.snapshot.diff.tables` | false | When enabled, allows compaction of tables not tracked by snapshot diffs after snapshots are evicted from the cache. | +| `ozone.om.snapshot.compaction.dag.max.time.allowed` | 30 days | Window for efficient SnapshotDiff. Older diffs may be slower. | +| `ozone.om.snapshot.prune.compaction.backup.batch.size` | 2000 | Batch size for pruning compaction backups. | +| `ozone.om.snapshot.compaction.dag.prune.daemon.run.interval` | 10m | Interval for the compaction DAG pruning daemon. | +| `ozone.om.snapshot.diff.max.jobs.purge.per.task` | 100 | Maximum number of snapshot diff jobs to purge per task. | +| `ozone.om.snapshot.diff.job.report.persistent.time` | 7d | Persistence time for snapshot diff job reports. | +| `ozone.om.snapshot.diff.cleanup.service.run.interval` | 1m | Interval for the snapshot diff cleanup service. | +| `ozone.om.snapshot.diff.cleanup.service.timeout` | 5m | Timeout for the snapshot diff cleanup service. | +| `ozone.om.snapshot.cache.cleanup.service.run.interval` | 1m | Interval for the snapshot cache cleanup service. | +| `ozone.snapshot.filtering.limit.per.task` | 2 | The maximum number of snapshots to be filtered in a single run of the snapshot filtering service. | +| `ozone.snapshot.deleting.limit.per.task` | 10 | The maximum number of snapshots to be deleted in a single run of the snapshot deleting service. | +| `ozone.snapshot.filtering.service.interval` | 60s | Interval for the snapshot filtering service. | +| `ozone.snapshot.deleting.service.timeout` | 300s | Timeout for the snapshot deleting service. | +| `ozone.snapshot.deleting.service.interval` | 30s | Interval for the snapshot deleting service. | +| `ozone.snapshot.deep.cleaning.enabled` | false | Enable deep cleaning of snapshots. | ### Performance and Resource Management -| Property | Default Value | Description | -|----------|---------------|-------------| -| `ozone.om.snapshot.rocksdb.metrics.enabled` | false | Enable detailed RocksDB metrics for snapshots. Use for debugging/monitoring. | -| `ozone.om.snapshot.cache.max.size` | 10 | Maximum size of the snapshot cache soft limit. | -| `ozone.om.snapshot.db.max.open.files` | 100 | Maximum number of open files for the snapshot database. | +| Property | Default Value | Description | +| ------------------------------------------- | ------------- | ---------------------------------------------------------------------------- | +| `ozone.om.snapshot.rocksdb.metrics.enabled` | false | Enable detailed RocksDB metrics for snapshots. Use for debugging/monitoring. | +| `ozone.om.snapshot.cache.max.size` | 10 | Maximum size of the snapshot cache soft limit. | +| `ozone.om.snapshot.db.max.open.files` | 100 | Maximum number of open files for the snapshot database. | ### Snapshot Provider (Internal) -| Property | Default Value | Description | -|----------|---------------|-------------| -| `ozone.om.snapshot.provider.socket.timeout` | 5000s | Socket timeout for the snapshot provider. | -| `ozone.om.snapshot.provider.connection.timeout` | 5000s | Connection timeout for the snapshot provider. | -| `ozone.om.snapshot.provider.request.timeout` | 5m | Request timeout for the snapshot provider. | +| Property | Default Value | Description | +| ----------------------------------------------- | ------------- | --------------------------------------------- | +| `ozone.om.snapshot.provider.socket.timeout` | 5000s | Socket timeout for the snapshot provider. | +| `ozone.om.snapshot.provider.connection.timeout` | 5000s | Connection timeout for the snapshot provider. | +| `ozone.om.snapshot.provider.request.timeout` | 5m | Request timeout for the snapshot provider. | ## Recon-Specific Settings These settings, defined in `ozone-default.xml`, apply specifically to Recon. -| Property | Default Value | Description | -|----------|---------------|-------------| -| `ozone.recon.om.snapshot.task.initial.delay` | 1m | Initial delay for the OM snapshot task in Recon. | -| `ozone.recon.om.snapshot.task.interval.delay` | 5s | Interval for the OM snapshot task in Recon. | -| `ozone.recon.om.snapshot.task.flush.param` | false | Flush parameter for the OM snapshot task in Recon. | +| Property | Default Value | Description | +| --------------------------------------------- | ------------- | -------------------------------------------------- | +| `ozone.recon.om.snapshot.task.initial.delay` | 1m | Initial delay for the OM snapshot task in Recon. | +| `ozone.recon.om.snapshot.task.interval.delay` | 5s | Interval for the OM snapshot task in Recon. | +| `ozone.recon.om.snapshot.task.flush.param` | false | Flush parameter for the OM snapshot task in Recon. | diff --git a/docs/05-administrator-guide/03-operations/08-snapshots/README.mdx b/docs/05-administrator-guide/03-operations/08-snapshots/README.mdx index 561fd3ea94..333c55632a 100644 --- a/docs/05-administrator-guide/03-operations/08-snapshots/README.mdx +++ b/docs/05-administrator-guide/03-operations/08-snapshots/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Snapshots # Snapshots -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents how to manage and configure Ozone snapshots. - + diff --git a/docs/05-administrator-guide/03-operations/09-observability/01-cli.md b/docs/05-administrator-guide/03-operations/09-observability/01-cli.md index 17fd463912..a11ec8a8ce 100644 --- a/docs/05-administrator-guide/03-operations/09-observability/01-cli.md +++ b/docs/05-administrator-guide/03-operations/09-observability/01-cli.md @@ -24,7 +24,7 @@ Available insight points: om.key-manager OM Key Manager om.protocol.client Ozone Manager RPC endpoint datanode.pipeline More information about one ratis datanode ring. -``` +``` ### Configuration diff --git a/docs/05-administrator-guide/03-operations/09-observability/02-recon/README.mdx b/docs/05-administrator-guide/03-operations/09-observability/02-recon/README.mdx index 73bcc4708c..157f78be0e 100644 --- a/docs/05-administrator-guide/03-operations/09-observability/02-recon/README.mdx +++ b/docs/05-administrator-guide/03-operations/09-observability/02-recon/README.mdx @@ -1,7 +1,7 @@ # Recon -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents Recon. Recon is Ozone's observability server that provides a web UI and REST APIs to gain insight about a running Ozone system. - + diff --git a/docs/05-administrator-guide/03-operations/09-observability/README.mdx b/docs/05-administrator-guide/03-operations/09-observability/README.mdx index 7b74befb81..8bed4d7fbe 100644 --- a/docs/05-administrator-guide/03-operations/09-observability/README.mdx +++ b/docs/05-administrator-guide/03-operations/09-observability/README.mdx @@ -1,7 +1,7 @@ # Observability -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents tools that can be used to monitor or inspect the state of a running Ozone cluster. - + diff --git a/docs/05-administrator-guide/03-operations/10-leader-transfer/README.mdx b/docs/05-administrator-guide/03-operations/10-leader-transfer/README.mdx index a46b8bc97f..3883cbeeca 100644 --- a/docs/05-administrator-guide/03-operations/10-leader-transfer/README.mdx +++ b/docs/05-administrator-guide/03-operations/10-leader-transfer/README.mdx @@ -1,7 +1,7 @@ # Leader Transfer -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section contains instructions to manually transfer the leadership to a specific node or to a randomly chosen follower. - \ No newline at end of file + diff --git a/docs/05-administrator-guide/03-operations/11-quota.md b/docs/05-administrator-guide/03-operations/11-quota.md index f895a8b35e..2866490195 100644 --- a/docs/05-administrator-guide/03-operations/11-quota.md +++ b/docs/05-administrator-guide/03-operations/11-quota.md @@ -39,7 +39,7 @@ bin/ozone sh bucket create --space-quota 5MB /volume1/bucket1 That means bucket1 allows us to use 5MB of storage. ```shell -bin/ozone sh bucket setquota --space-quota 10GB /volume1/bucket1 +bin/ozone sh bucket setquota --space-quota 10GB /volume1/bucket1 ``` This behavior changes the quota for Bucket1 to 10GB @@ -89,7 +89,7 @@ bin/ozone sh bucket create --namespace-quota 100 /volume1/bucket1 That means bucket1 allows us to use 100 of namespace. ```shell -bin/ozone sh bucket setquota --namespace-quota 1000 /volume1/bucket1 +bin/ozone sh bucket setquota --namespace-quota 1000 /volume1/bucket1 ``` This behavior changes the quota for Bucket1 to 1000. diff --git a/docs/05-administrator-guide/03-operations/13-dynamic-property-reload.md b/docs/05-administrator-guide/03-operations/13-dynamic-property-reload.md index d2c3121669..426b97a9ec 100644 --- a/docs/05-administrator-guide/03-operations/13-dynamic-property-reload.md +++ b/docs/05-administrator-guide/03-operations/13-dynamic-property-reload.md @@ -23,11 +23,11 @@ ozone admin reconfig --service=[OM|SCM|DATANODE] --address= + diff --git a/docs/05-administrator-guide/README.mdx b/docs/05-administrator-guide/README.mdx index 8ca5d523d6..c97ee8fe5b 100644 --- a/docs/05-administrator-guide/README.mdx +++ b/docs/05-administrator-guide/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Administrator Guide # Administrator Guide -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section contains instructions for administrators to install and maintain a production Ozone system. - + diff --git a/docs/06-troubleshooting/07-integrations/README.mdx b/docs/06-troubleshooting/07-integrations/README.mdx index 3264ecf3b8..9c7de92fc9 100644 --- a/docs/06-troubleshooting/07-integrations/README.mdx +++ b/docs/06-troubleshooting/07-integrations/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Integrations # Troubleshooting Ozone Integration With Other Components -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section contains guides to help troubleshoot Ozone integration with other systems. - + diff --git a/docs/06-troubleshooting/08-security/README.mdx b/docs/06-troubleshooting/08-security/README.mdx index 240b455ded..61c64a2878 100644 --- a/docs/06-troubleshooting/08-security/README.mdx +++ b/docs/06-troubleshooting/08-security/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Security # Troubleshooting Security -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section contains guides to help troubleshoot security related issues in an Ozone deployment. - + diff --git a/docs/06-troubleshooting/16-om-ha-snapshot-installation-issues.md b/docs/06-troubleshooting/16-om-ha-snapshot-installation-issues.md index 0f2decd55b..338af256bd 100644 --- a/docs/06-troubleshooting/16-om-ha-snapshot-installation-issues.md +++ b/docs/06-troubleshooting/16-om-ha-snapshot-installation-issues.md @@ -12,11 +12,11 @@ When this happens, the new OM will have to restart the snapshot download, and th To avoid this issue, you can configure the following properties on the leader OM: 1. Set `ozone.om.ratis.log.purge.preservation.log.num` to a high value (e.g. 1000000). -This property controls how many Raft logs are preserved on the leader OM. -By setting it to a high value, you can prevent the leader from purging the logs that the new OM needs to catch up. This is a more balanced approach to ensure that some logs are preserved so that they can be replicated to the slow follower (instead of installing snapshot), but if the number of logs exceeded this amount, OM leader will purge the logs to prevent disk to be full. + This property controls how many Raft logs are preserved on the leader OM. + By setting it to a high value, you can prevent the leader from purging the logs that the new OM needs to catch up. This is a more balanced approach to ensure that some logs are preserved so that they can be replicated to the slow follower (instead of installing snapshot), but if the number of logs exceeded this amount, OM leader will purge the logs to prevent disk to be full. 2. Set `ozone.om.ratis.log.purge.upto.snapshot.index` to `false`. -This property prevents the leader OM from purging any logs until all followers have installed the latest snapshot. -This ensures that the new OM will have enough time to download and install the snapshot without the logs being purged. This is a more risky approach since it might cause the Raft logs to increase indefinitely when the OM follower is down for a long time, which can cause OM metadata dir to be full. + This property prevents the leader OM from purging any logs until all followers have installed the latest snapshot. + This ensures that the new OM will have enough time to download and install the snapshot without the logs being purged. This is a more risky approach since it might cause the Raft logs to increase indefinitely when the OM follower is down for a long time, which can cause OM metadata dir to be full. :::note If `ozone.om.ratis.log.purge.preservation.log.num` is set to a non-zero number, it is recommended to keep `ozone.om.ratis.log.purge.upto.snapshot.index` to `true` (default value) since `ozone.om.ratis.log.purge.upto.snapshot.index` will override the preservation configuration. Therefore, these two properties should not be set together. diff --git a/docs/06-troubleshooting/README.mdx b/docs/06-troubleshooting/README.mdx index 88bbd41582..5ac460eb2b 100644 --- a/docs/06-troubleshooting/README.mdx +++ b/docs/06-troubleshooting/README.mdx @@ -1,7 +1,7 @@ # Troubleshooting -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section contains guides to help troubleshoot common issues in an Ozone deployment. - + diff --git a/docs/07-system-internals/01-components/01-ozone-manager/01-disk-layout.md b/docs/07-system-internals/01-components/01-ozone-manager/01-disk-layout.md index ec034d6a4b..cfc665e560 100644 --- a/docs/07-system-internals/01-components/01-ozone-manager/01-disk-layout.md +++ b/docs/07-system-internals/01-components/01-ozone-manager/01-disk-layout.md @@ -1,6 +1,7 @@ --- sidebar_label: Disk Layout --- + # Ozone Manager Disk Layout **TODO:** File a subtask under [HDDS-9862](https://issues.apache.org/jira/browse/HDDS-9862) and complete this page or section. diff --git a/docs/07-system-internals/01-components/01-ozone-manager/08-high-availability.md b/docs/07-system-internals/01-components/01-ozone-manager/08-high-availability.md index 62013f6d38..deb04deec3 100644 --- a/docs/07-system-internals/01-components/01-ozone-manager/08-high-availability.md +++ b/docs/07-system-internals/01-components/01-ozone-manager/08-high-availability.md @@ -20,7 +20,7 @@ A single Ozone Manager uses [RocksDB](https://github.com/facebook/rocksdb/) to p Client connects to the Leader Ozone Manager which process the request and schedule the replication with RAFT. When the request is replicated to all the followers the leader can return with the response. -## Implementation details +## Implementation de tails Raft can guarantee the replication of any request if the request is persisted to the RAFT log on the majority of the nodes. To achieve high throughput with Ozone Manager, it returns with the response even if the request is persisted only to the RAFT logs. diff --git a/docs/07-system-internals/01-components/01-ozone-manager/README.mdx b/docs/07-system-internals/01-components/01-ozone-manager/README.mdx index ebef042213..e8dd978d22 100644 --- a/docs/07-system-internals/01-components/01-ozone-manager/README.mdx +++ b/docs/07-system-internals/01-components/01-ozone-manager/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Ozone Manager # Ozone Manager Internals -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents the internal workings of the Ozone Manager. - + diff --git a/docs/07-system-internals/01-components/02-storage-container-manager/README.mdx b/docs/07-system-internals/01-components/02-storage-container-manager/README.mdx index 0f474274ae..f7fa8f7fc7 100644 --- a/docs/07-system-internals/01-components/02-storage-container-manager/README.mdx +++ b/docs/07-system-internals/01-components/02-storage-container-manager/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Storage Container Manager # Storage Container Manager Internals -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents the internal workings of the Storage Container Manager. - + diff --git a/docs/07-system-internals/01-components/03-datanode/README.mdx b/docs/07-system-internals/01-components/03-datanode/README.mdx index 552770900e..ad81b70c23 100644 --- a/docs/07-system-internals/01-components/03-datanode/README.mdx +++ b/docs/07-system-internals/01-components/03-datanode/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Datanode # Datanode Internals -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents the internal workings of the Datanode. - + diff --git a/docs/07-system-internals/01-components/04-recon/README.mdx b/docs/07-system-internals/01-components/04-recon/README.mdx index 7630e5a81a..6a7c5dbee1 100644 --- a/docs/07-system-internals/01-components/04-recon/README.mdx +++ b/docs/07-system-internals/01-components/04-recon/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Recon # Recon Internals -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents the internal workings of Recon. - + diff --git a/docs/07-system-internals/01-components/05-s3-gateway/README.mdx b/docs/07-system-internals/01-components/05-s3-gateway/README.mdx index 21476b54bd..8b613534f6 100644 --- a/docs/07-system-internals/01-components/05-s3-gateway/README.mdx +++ b/docs/07-system-internals/01-components/05-s3-gateway/README.mdx @@ -4,8 +4,8 @@ sidebar_label: S3 Gateway # S3 Gateway Internals -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents the internal workings of the S3 Gateway. - + diff --git a/docs/07-system-internals/01-components/06-client/README.mdx b/docs/07-system-internals/01-components/06-client/README.mdx index 73ada3382a..69f8239441 100644 --- a/docs/07-system-internals/01-components/06-client/README.mdx +++ b/docs/07-system-internals/01-components/06-client/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Client # Ozone Client Internals -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents the internal workings of the Ozone Java client. - + diff --git a/docs/07-system-internals/01-components/07-httpfs-gateway/README.mdx b/docs/07-system-internals/01-components/07-httpfs-gateway/README.mdx index 96e0449936..558f9e55cf 100644 --- a/docs/07-system-internals/01-components/07-httpfs-gateway/README.mdx +++ b/docs/07-system-internals/01-components/07-httpfs-gateway/README.mdx @@ -4,8 +4,8 @@ sidebar_label: HttpFS Gateway # HttpFS Gateway Internals -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents the internal workings of the HttpFS Gateway. - + diff --git a/docs/07-system-internals/01-components/README.mdx b/docs/07-system-internals/01-components/README.mdx index c378351363..82b06729a0 100644 --- a/docs/07-system-internals/01-components/README.mdx +++ b/docs/07-system-internals/01-components/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Components # Ozone Components -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; The internal workings of each Ozone component are documented in this section. - + diff --git a/docs/07-system-internals/02-data-operations/README.mdx b/docs/07-system-internals/02-data-operations/README.mdx index c4243e6b4b..40483abf47 100644 --- a/docs/07-system-internals/02-data-operations/README.mdx +++ b/docs/07-system-internals/02-data-operations/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Data Operations # Implementation of Data Operations -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents how read, write, and delete operations are implemented within Ozone. - + diff --git a/docs/07-system-internals/03-data-integrity/README.mdx b/docs/07-system-internals/03-data-integrity/README.mdx index f9176cc7e6..1510e7c330 100644 --- a/docs/07-system-internals/03-data-integrity/README.mdx +++ b/docs/07-system-internals/03-data-integrity/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Data Integrity # Implementation of Data Integrity Checks -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents the implementation of Ozone's data integrity checks. - + diff --git a/docs/07-system-internals/04-replication/02-data/01-write-pipelines/README.mdx b/docs/07-system-internals/04-replication/02-data/01-write-pipelines/README.mdx index bf825d8c42..3b1e9548e7 100644 --- a/docs/07-system-internals/04-replication/02-data/01-write-pipelines/README.mdx +++ b/docs/07-system-internals/04-replication/02-data/01-write-pipelines/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Write Pipelines # Write Pipeline Implementation -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents the implementation of pipelines: groups of datanodes that Ozone uses to write data. - + diff --git a/docs/07-system-internals/04-replication/02-data/02-containers/README.mdx b/docs/07-system-internals/04-replication/02-data/02-containers/README.mdx index 43d3f24634..22a42cca49 100644 --- a/docs/07-system-internals/04-replication/02-data/02-containers/README.mdx +++ b/docs/07-system-internals/04-replication/02-data/02-containers/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Containers # Storage Container Implementation -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents the implementation of storage containers: Ozone's unit of data replication. - + diff --git a/docs/07-system-internals/04-replication/02-data/README.mdx b/docs/07-system-internals/04-replication/02-data/README.mdx index 61033c2408..2924fe254b 100644 --- a/docs/07-system-internals/04-replication/02-data/README.mdx +++ b/docs/07-system-internals/04-replication/02-data/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Data # Implementation of Data Replication -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents the implementation of data replication in Ozone's block storage layer. - + diff --git a/docs/07-system-internals/04-replication/README.mdx b/docs/07-system-internals/04-replication/README.mdx index 41f587dbb8..d01974936a 100644 --- a/docs/07-system-internals/04-replication/README.mdx +++ b/docs/07-system-internals/04-replication/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Replication # Implementation of Metadata and Data Replication -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents the implementation of metadata and data replication. - + diff --git a/docs/07-system-internals/05-security/03-tokens.md b/docs/07-system-internals/05-security/03-tokens.md index a7436683e8..84a31a12e5 100644 --- a/docs/07-system-internals/05-security/03-tokens.md +++ b/docs/07-system-internals/05-security/03-tokens.md @@ -21,14 +21,12 @@ Ozone implements two types of tokens: - **Issuer:** `Ozone Manager (OM)`. The OM generates Delegation Tokens when a client initially authenticates (**typically via Kerberos**) and requests a delegation token. This is because the OM is responsible for managing the namespace and metadata operations within Ozone. - **Usage Context:** A Delegation Token is used when a client needs to perform control-plane operations (namespace/metadata operations) without repeatedly authenticating with Kerberos. For example: - 1. A client application starts and authenticates with Kerberos to the Ozone Manager. 2. The client requests a Delegation Token from the OM, which issues a token that represents the user's identity. 3. For subsequent operations like creating a volume, listing buckets, or creating keys, the client uses this Delegation Token instead of Kerberos credentials. 4. The token can be renewed before expiry, allowing long-running applications to continue operating without re-authentication. - **Information Carried (`OzoneTokenIdentifier`):** The token identifier contains: - - The owner (effective username). - The renewer (who can renew the token). - The real user (actual user if impersonation is used). @@ -46,14 +44,12 @@ Ozone implements two types of tokens: - **Granularity:** `Block-level`. A Block Token grants access to a single, specific block within a container. - **Issuer:** `Ozone Manager (OM)`. The OM generates Block Tokens when a client requests to write or read a block. This is because the OM is responsible for managing the block namespace within the object store. - **Usage Context:** A Block Token is used when a client needs to perform a data-plane operation (read/write) on a specific block. For example: - 1. A client wants to write data for key1. 2. It contacts the OM, which allocates a new block (e.g., block123) for key1. 3. The OM returns the location of block123 (which includes the Datanodes) and a unique Block Token for `block123`. 4. The client then uses this specific Block Token to write data for block123 to the Datanodes. - **Information Carried (`OzoneBlockTokenIdentifier`):** The token identifier contains: - - The user/owner ID. - The BlockID it authorizes. - The access modes it permits (e.g., READ, WRITE, DELETE). @@ -64,14 +60,12 @@ Ozone implements two types of tokens: - **Granularity:** `Container-level`. A Container Token grants access to an entire container, which can contain many blocks. - **Issuer:** `Storage Container Manager (SCM)`. The SCM generates Container Tokens. This is logical because the SCM is responsible for managing containers and their placement across Datanodes, but it is unaware of the individual blocks inside them. - **Usage Context:** A Container Token is used for operations that concern the container as a whole, often for administrative or maintenance tasks that bypass the Ozone Manager. For example: - 1. An administrator uses the `ozone debug replicas verify` command to check the integrity of replicas for a container. 2. The admin tool contacts the SCM to get a Container Token for the specified ContainerID. 3. The tool then uses this token to communicate directly with Datanodes to perform the verification. 4. Another example is when the SCM itself issues commands to Datanodes (e.g., to close a container). It generates a Container Token to authorize its own command. - **Information Carried (`ContainerTokenIdentifier`):** The token identifier contains: - - The user/owner ID. - The ContainerID it authorizes. - Expiration time. @@ -79,14 +73,14 @@ Ozone implements two types of tokens: ## Summary of Key Differences -| Feature | Delegation Token | Block Token | Container Token | -|---------|------------------|-------------|-----------------| -| **Scope of Access** | Entire namespace (all volumes, buckets, keys) | A single Block | An entire Container | -| **Generated By** | Ozone Manager (OM) | Ozone Manager (OM) | Storage Container Manager (SCM) | +| Feature | Delegation Token | Block Token | Container Token | +| -------------------- | ------------------------------------------------------------------------------------------ | ------------------------------------------------------ | ----------------------------------------------------------------- | +| **Scope of Access** | Entire namespace (all volumes, buckets, keys) | A single Block | An entire Container | +| **Generated By** | Ozone Manager (OM) | Ozone Manager (OM) | Storage Container Manager (SCM) | | **Primary Use Case** | Authorizing namespace/metadata operations (create volumes, buckets, keys, list operations) | Authorizing client data operations (read/write blocks) | Authorizing administrative or management operations on containers | -| **Typical User** | End-client applications performing namespace operations | End-client applications writing/reading keys | Ozone-internal processes (like SCM) or admin tools (ozone debug) | -| **Renewable** | Yes | No (short-lived, get new one when expired) | No (short-lived) | -| **Default Enabled** | Yes (when security enabled) | Yes (when security enabled) | No (disabled by default) | +| **Typical User** | End-client applications performing namespace operations | End-client applications writing/reading keys | Ozone-internal processes (like SCM) or admin tools (ozone debug) | +| **Renewable** | Yes | No (short-lived, get new one when expired) | No (short-lived) | +| **Default Enabled** | Yes (when security enabled) | Yes (when security enabled) | No (disabled by default) | In short, think of it like this: diff --git a/docs/07-system-internals/05-security/README.mdx b/docs/07-system-internals/05-security/README.mdx index 2cafec512b..87c5c47367 100644 --- a/docs/07-system-internals/05-security/README.mdx +++ b/docs/07-system-internals/05-security/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Security # Security Within Ozone -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents the various security features used within Ozone. - + diff --git a/docs/07-system-internals/06-network-protocols/02-client.md b/docs/07-system-internals/06-network-protocols/02-client.md index effe02703b..3a3dd690f7 100644 --- a/docs/07-system-internals/06-network-protocols/02-client.md +++ b/docs/07-system-internals/06-network-protocols/02-client.md @@ -8,16 +8,16 @@ sidebar_label: Client For each section, indicate the network protocol that is used, why it is used, and how it is secured. Some intro/explanation at the top here would be good too. -| Client | Server | Protocol | Authentication | Authorization | Encryption | Notes | -|-|-|-|-|-|-|-| -| S3 Client | S3 Gateway | HTTPS | S3 Secrets | ACLs | TLS | S3 Gateway REST API is compatible with regular S3 HTTP clients. | -| HDFS Client | Ozone Manager | Hadoop RPC | Kerberos | ACLs | SASL | HDFS client uses Ozone client jar internally to communicate with Ozone. | -| Ozone Client | Ozone Manager | Hadoop RPC | Kerberos | ACLs | SASL | Hadoop RPC is used to transfer Kerberos information. | -| Ozone Client | Storage Container Manager | | | | | | -| Ozone Client | Datanode | gRPC | | | | | -| Ozone Client | Kerberos KDC | | | | | | -| Ozone Client | Ranger KMS | | | | | | -| REST Client | HttpFS Server | | | | | | -| REST Client | Recon REST API | HTTPS | Kerberos + SPNEGO | [Configured Ozone Administrators](../../administrator-guide/configuration/security/administrators) | TLS | | -| Web Browser | Recon UI | HTTPS | Kerberos + SPNEGO/Apache Knox | [Configured Ozone Administrators](../../administrator-guide/configuration/security/administrators) | TLS | | -| Web Browser | Ozone WebUIs | HTTPS | Kerberos + SPNEGO/Apache Knox | | TLS | | +| Client | Server | Protocol | Authentication | Authorization | Encryption | Notes | +| ------------ | ------------------------- | ---------- | ----------------------------- | -------------------------------------------------------------------------------------------------- | ---------- | ----------------------------------------------------------------------- | +| S3 Client | S3 Gateway | HTTPS | S3 Secrets | ACLs | TLS | S3 Gateway REST API is compatible with regular S3 HTTP clients. | +| HDFS Client | Ozone Manager | Hadoop RPC | Kerberos | ACLs | SASL | HDFS client uses Ozone client jar internally to communicate with Ozone. | +| Ozone Client | Ozone Manager | Hadoop RPC | Kerberos | ACLs | SASL | Hadoop RPC is used to transfer Kerberos information. | +| Ozone Client | Storage Container Manager | | | | | | +| Ozone Client | Datanode | gRPC | | | | | +| Ozone Client | Kerberos KDC | | | | | | +| Ozone Client | Ranger KMS | | | | | | +| REST Client | HttpFS Server | | | | | | +| REST Client | Recon REST API | HTTPS | Kerberos + SPNEGO | [Configured Ozone Administrators](../../administrator-guide/configuration/security/administrators) | TLS | | +| Web Browser | Recon UI | HTTPS | Kerberos + SPNEGO/Apache Knox | [Configured Ozone Administrators](../../administrator-guide/configuration/security/administrators) | TLS | | +| Web Browser | Ozone WebUIs | HTTPS | Kerberos + SPNEGO/Apache Knox | | TLS | | diff --git a/docs/07-system-internals/06-network-protocols/03-server.md b/docs/07-system-internals/06-network-protocols/03-server.md index 8035e6cf27..4fab3c504c 100644 --- a/docs/07-system-internals/06-network-protocols/03-server.md +++ b/docs/07-system-internals/06-network-protocols/03-server.md @@ -8,15 +8,15 @@ sidebar_label: Server For each section, indicate the network protocol that is used, why it is used, and how it is secured. Add some intro/explanation at the top here. -| Client | Server | Protocol | Authentication | Encryption | Notes | -|-|-|-|-|-|-| -| Ozone Manager | Storage Container Manager | gRPC | Certificate | TLS | Used to allocate blocks, delete blocks, and get block locations. | -| Ozone Manager | Ranger | | | | | -| Ozone Manager | S3 Secret Store | | | | | -| Datanode | Datanode | | | | | -| Datanode | Storage Container Manager | | | | | -| Datanode | Recon | | | | | -| Recon | Ozone Manager | | | | | -| Recon | Storage Container Manager | | | | | -| All Ozone Components | Kerberos KDC | | | | | -| Prometheus | All Ozone Components | | | | | +| Client | Server | Protocol | Authentication | Encryption | Notes | +| -------------------- | ------------------------- | -------- | -------------- | ---------- | ---------------------------------------------------------------- | +| Ozone Manager | Storage Container Manager | gRPC | Certificate | TLS | Used to allocate blocks, delete blocks, and get block locations. | +| Ozone Manager | Ranger | | | | | +| Ozone Manager | S3 Secret Store | | | | | +| Datanode | Datanode | | | | | +| Datanode | Storage Container Manager | | | | | +| Datanode | Recon | | | | | +| Recon | Ozone Manager | | | | | +| Recon | Storage Container Manager | | | | | +| All Ozone Components | Kerberos KDC | | | | | +| Prometheus | All Ozone Components | | | | | diff --git a/docs/07-system-internals/06-network-protocols/README.mdx b/docs/07-system-internals/06-network-protocols/README.mdx index fbedccc279..dad18a73d3 100644 --- a/docs/07-system-internals/06-network-protocols/README.mdx +++ b/docs/07-system-internals/06-network-protocols/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Network Protocols # Network Protocols Within Ozone -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents the various network protocols used within Ozone. - + diff --git a/docs/07-system-internals/07-features/01-filesystem-optimization.md b/docs/07-system-internals/07-features/01-filesystem-optimization.md index 943a96c839..80e69f2e35 100644 --- a/docs/07-system-internals/07-features/01-filesystem-optimization.md +++ b/docs/07-system-internals/07-features/01-filesystem-optimization.md @@ -34,14 +34,14 @@ the unique identifier of its parent directory, `/`. ### Directory delete operation with prefix layout Following picture describes the OM metadata changes while performing a delete - operation on a directory. +operation on a directory. ![Prefix FSO Delete](PrefixFSO-Delete.png) ### Directory rename operation with prefix layout Following picture describes the OM metadata changes while performing a rename - operation on a directory. +operation on a directory. ![Prefix FSO Rename](PrefixFSO-Rename.png) diff --git a/docs/07-system-internals/07-features/08-om-bootstrapping-with-snapshots.md b/docs/07-system-internals/07-features/08-om-bootstrapping-with-snapshots.md index 9396f88550..b2ab0d99e3 100644 --- a/docs/07-system-internals/07-features/08-om-bootstrapping-with-snapshots.md +++ b/docs/07-system-internals/07-features/08-om-bootstrapping-with-snapshots.md @@ -21,7 +21,7 @@ When a snapshot is taken on an Ozone bucket, the following steps occur: 1. A RocksDB checkpoint of the active `om.db` is created. 2. Deleted entries are removed from the `deletedKeyTable` and `deletedDirTable` in the Active Object Store (AOS) RocksDB. -This is to just prevent the blocks from getting purged without checking for the key's presence in the correct snapshot in the snapshot chain. + This is to just prevent the blocks from getting purged without checking for the key's presence in the correct snapshot in the snapshot chain. 3. A new entry is added to the `snapshotInfoTable` in the AOS RocksDB. ### Current Bootstrap Model @@ -77,15 +77,15 @@ This approach builds the current model by introducing size thresholds to manage - Walks through AOS RocksDB, snapshot RocksDBs, and backup SST directories to identify files to transfer. - Compares against the exclude list to avoid duplicate transfers. 3. If the total size of files to be copied is more than `ozone.om.ratis.snapshot.lock.max.total.size.threshold` then the -files would be directly sent over the stream as a tarball where the name of the files is the inodeId of the file. + files would be directly sent over the stream as a tarball where the name of the files is the inodeId of the file. 4. If the total size of files to be copied is less than equal to `ozone.om.ratis.snapshot.lock.max.total.size.threshold` -then the snapshot cache lock is taken after waiting for the snapshot cache to completely get empty (No snapshot RocksDB should be open). Under the lock following operations would be performed: + then the snapshot cache lock is taken after waiting for the snapshot cache to completely get empty (No snapshot RocksDB should be open). Under the lock following operations would be performed: - Take the AOS RocksDB checkpoint. - A complete directory walk is done on AOS checkpoint RocksDB directory + all the snapshot RocksDB directories + backup sst file directory (compaction log directory) to figure out all the files to be copied and any file already present in the exclude list would be excluded. - These files are added to the tarball where again the name of the file would be the inodeId of the file. 5. As the files are being iterated the path of each file and their corresponding inodeIds would be tracked. When it is the -last batch this map would also be written as a text file in the final tarball to recreate all the hardlinks on the follower node. + last batch this map would also be written as a text file in the final tarball to recreate all the hardlinks on the follower node. #### Drawback @@ -108,11 +108,11 @@ on the number of files changed under the snapshot directory as the threshold. - Walks through AOS RocksDB, snapshot RocksDBs, and backup SST directories to identify files to transfer. - Compares against the exclude list to avoid duplicate transfers. 3. If either the total size to be copied or the total number of files under the snapshot RocksDB directory to be copied is -more than `ozone.om.ratis.snapshot.max.total.sst.size` respectively then the files would be directly sent over the stream as -a tarball where the name of the files is the inodeId of the file. + more than `ozone.om.ratis.snapshot.max.total.sst.size` respectively then the files would be directly sent over the stream as + a tarball where the name of the files is the inodeId of the file. 4. If the total file size to be copied under the snapshot RocksDB directory is less than or equal to `ozone.om.ratis.snapshot.max.total.sst.size` -then the snapshot cache lock is taken after waiting for the snapshot cache to completely get empty (No snapshot RocksDB should be open). -Under the lock following operations would be performed: + then the snapshot cache lock is taken after waiting for the snapshot cache to completely get empty (No snapshot RocksDB should be open). + Under the lock following operations would be performed: - Take the AOS RocksDB checkpoint. - A complete directory walk is done on all the snapshot RocksDB directories to figure out all the files to be copied and any file already present in the exclude list would be excluded. - Hard links of these files are added to tmp directory on the leader. @@ -150,7 +150,7 @@ in approach 2 or stream the files in batches as multiple tarball file similar to Following is the flow for creating the tarball: 1. Snapshot cache lock is taken after waiting for the snapshot cache to become completely empty (No snapshot RocksDB should be open). -Under the lock following operations would be performed: + Under the lock following operations would be performed: - Take the AOS RocksDB checkpoint. - Take RocksDB checkpoint of each and every snapshot in the system by iterating through the snapshotInfo table of AOS checkpoint RocksDB. 2. Now the files in the checkpoint directories have to be streamed to the follower as done in either approach 1 or approach 2. diff --git a/docs/07-system-internals/07-features/README.mdx b/docs/07-system-internals/07-features/README.mdx index 6d07f75edb..d70387b947 100644 --- a/docs/07-system-internals/07-features/README.mdx +++ b/docs/07-system-internals/07-features/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Features # Implementation of Ozone Features -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents the implementations of various Ozone features. - + diff --git a/docs/07-system-internals/README.mdx b/docs/07-system-internals/README.mdx index 72681f211d..74d68e7fc6 100644 --- a/docs/07-system-internals/README.mdx +++ b/docs/07-system-internals/README.mdx @@ -1,7 +1,7 @@ # System Internals -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents the internal workings of Ozone for developers. Familiarity with this section is not required for users or administrators to work with Ozone. - + diff --git a/docs/08-developer-guide/01-build/01-maven.md b/docs/08-developer-guide/01-build/01-maven.md index 09e45abd51..ff867ed10e 100644 --- a/docs/08-developer-guide/01-build/01-maven.md +++ b/docs/08-developer-guide/01-build/01-maven.md @@ -2,7 +2,6 @@ sidebar_label: Maven --- - # Building Ozone With Maven import Tabs from '@theme/Tabs'; @@ -97,7 +96,7 @@ Execute the following command to install `protoc` version 2.5.0 to the local Mav mvn install:install-file -DgroupId=com.google.protobuf -DartifactId=protoc -Dversion=${PROTOBUF_VERSION} -Dclassifier=osx-aarch_64 -Dpackaging=exe -Dfile=src/protoc ``` -If you are running Maven 3.9.x or higher, execute the following command. This command is not needed for 3.8.x or earlier: +If you are running Maven 3.9.x or higher, execute the following command. This command is not needed for 3.8.x or earlier: ```bash mv $HOME/.m2/repository/com/google/protobuf/protoc/${PROTOBUF_VERSION}/protoc-${PROTOBUF_VERSION}-osx-aarch_64 $HOME/.m2/repository/com/google/protobuf/protoc/${PROTOBUF_VERSION}/protoc-${PROTOBUF_VERSION}-osx-aarch_64.exe @@ -130,12 +129,12 @@ This command does not run acceptance tests. Refer to the [acceptance tests](/doc #### Common Maven Build Options | Command | Description | -|-------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| ----------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `-DskipTests=true` | Skip all tests | | `-Pdist` | This creates a tarball in `hadoop-ozone/dist/target` that contains all necessary files for deployment | | `-DskipRecon` | Skip building the Javascript frontend for Recon | | `-T 4` | Use 4 threads for parallel building (adjust number based on your CPU) | -| `-T 2C` | Use 2 threads per core for parallel building | +| `-T 2C` | Use 2 threads per core for parallel building | | `-am -pl :` | Build a specific module and its dependencies when run from the root of the project | | `-DskipShade` | Skip shading. This saves a ton of time by skipping the `ozone-filesystem-hadoop3` fat jar build used by the client | | `-Dmaven.artifact.threads=30` | Allow Maven to download 30 artifacts at once. The default value is 5. This could speed up the build process by a lot when the Maven cache was not previously populated. | diff --git a/docs/08-developer-guide/01-build/03-docker-images.md b/docs/08-developer-guide/01-build/03-docker-images.md index 8d5889b29b..28a2b55a31 100644 --- a/docs/08-developer-guide/01-build/03-docker-images.md +++ b/docs/08-developer-guide/01-build/03-docker-images.md @@ -6,13 +6,13 @@ sidebar_label: Docker Images # Building Ozone Docker Images -This page provides an overview of the Docker images maintained by the Apache Ozone community for developing and testing Ozone. It also describes the workflow to be followed when making changes to one of these images. +This page provides an overview of the Docker images maintained by the Apache Ozone community for developing and testing Ozone. It also describes the workflow to be followed when making changes to one of these images. ## ozone-runner [ozone-runner](https://github.com/apache/ozone-docker-runner) is the base image with tools for running and testing Ozone, but does not include any Ozone artifacts. -Developers and CI workflows rely on it heavily to run/test custom Ozone builds (using the local build via bind-mount). It also serves as the base image for `apache/ozone` (see next section). +Developers and CI workflows rely on it heavily to run/test custom Ozone builds (using the local build via bind-mount). It also serves as the base image for `apache/ozone` (see next section). Published to [Docker Hub](https://hub.docker.com/r/apache/ozone-runner) and [GitHub](https://github.com/apache/ozone-docker-runner/pkgs/container/ozone-runner). @@ -33,13 +33,13 @@ Images are tagged by date, and come in two flavors: `jdk21` (for Ozone 2.0+) and Publishing Docker tags: 1. Add a Git tag for the commit following the existing pattern (`--`, where `` starts at 1, and is incremented if multiple images need to be published the same day). -2. Push the Git tag to the origin repo (`apache/ozone-docker-testkrb5`). This will trigger a workflow run to apply the tag to the Docker image. +2. Push the Git tag to the origin repo (`apache/ozone-docker-testkrb5`). This will trigger a workflow run to apply the tag to the Docker image. ## ozone [ozone](https://github.com/apache/ozone-docker) is built on top of `ozone-runner`, adding the binaries built for official Ozone releases. -These are used for testing compatibility of various Ozone versions, and upgrade from one version to another. May also be useful for running quick experiments with specific version of Ozone, without the need to download or rebuild it. +These are used for testing compatibility of various Ozone versions, and upgrade from one version to another. May also be useful for running quick experiments with specific version of Ozone, without the need to download or rebuild it. Published to [Docker Hub](https://hub.docker.com/r/apache/ozone) and [GitHub](https://github.com/apache/ozone-docker/pkgs/container/ozone). @@ -53,7 +53,7 @@ The image can be built simply by running the helper script `build.sh`: ./build.sh ``` -This will create a single-platform image for your architecture. Build automation in GitHub Actions creates multi-platform image for `amd64` and `arm64`. +This will create a single-platform image for your architecture. Build automation in GitHub Actions creates multi-platform image for `amd64` and `arm64`. It can be customized via environment variables defined at build time. @@ -73,16 +73,16 @@ OZONE_RUNNER_VERSION ### Tagging -Images are tagged by Ozone version numbers and optional flavor. Flavor `-rocky` was introduced when `ozone-runner` was changed from CentOS to Rocky Linux due to CentOS end-of-life, to avoid breaking things for existing users. Future images will be published only with Rocky Linux, with and without flavor suffix. +Images are tagged by Ozone version numbers and optional flavor. Flavor `-rocky` was introduced when `ozone-runner` was changed from CentOS to Rocky Linux due to CentOS end-of-life, to avoid breaking things for existing users. Future images will be published only with Rocky Linux, with and without flavor suffix. Image tags are derived from branch names: push to the branch `ozone-` gets published with `` (e.g. `ozone-1.4.1 -> 1.4.1`). Publishing Docker tags: 1. Update the version-specific branch: - - The latest release version can usually be updated by fast-forwarding the branch: `git merge --ff-only origin/latest`. This allows CI workflow to tag the existing image from `latest` branch, instead of building completely new image. + - The latest release version can usually be updated by fast-forwarding the branch: `git merge --ff-only origin/latest`. This allows CI workflow to tag the existing image from `latest` branch, instead of building completely new image. - For other versions branch can be updated by cherry-picking one or more commits. -2. Push the branch to the origin repo (`apache/ozone-docker`). This will trigger a workflow run to publish the image. +2. Push the branch to the origin repo (`apache/ozone-docker`). This will trigger a workflow run to publish the image. ## ozone-testkrb5 @@ -107,4 +107,4 @@ Images are tagged by date. Publishing Docker tags: 1. Add a Git tag for the commit following existing pattern (`-`, where `` starts at 1, and is incremented if multiple images need to be published the same day). -2. Push the Git tag to the origin repo (`apache/ozone-docker-testkrb5`). This will trigger a workflow run to apply the tag to the Docker image. +2. Push the Git tag to the origin repo (`apache/ozone-docker-testkrb5`). This will trigger a workflow run to apply the tag to the Docker image. diff --git a/docs/08-developer-guide/01-build/README.mdx b/docs/08-developer-guide/01-build/README.mdx index e44a98a8c2..7a6c5506b3 100644 --- a/docs/08-developer-guide/01-build/README.mdx +++ b/docs/08-developer-guide/01-build/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Build # Building Ozone -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section provides instructions for developers to build Ozone from source. - + diff --git a/docs/08-developer-guide/02-run/02-docker-compose.md b/docs/08-developer-guide/02-run/02-docker-compose.md index 27ef38ce97..653be549d8 100644 --- a/docs/08-developer-guide/02-run/02-docker-compose.md +++ b/docs/08-developer-guide/02-run/02-docker-compose.md @@ -71,12 +71,12 @@ graph TB s3g["S3G
S3 Gateway
(Port: 9878)"] recon["Recon
Monitoring Service
(Port: 9888)"] httpfs["HttpFS
HTTP FileSystem
(Port: 14000)"] - + subgraph "Data Nodes" dn1["DataNode 1
(Port: 19864, 9882)"] dnN["DataNode N
(Port: 19864, 9882)"] end - + %% Connections scm --> dn1 scm --> dnN @@ -93,7 +93,7 @@ graph TB classDef default fill:#f9f9f9,stroke:#333,stroke-width:2px; classDef datanode fill:#e1f5fe,stroke:#0288d1,stroke-width:2px; classDef manager fill:#e8f5e9,stroke:#388e3c,stroke-width:2px; - + class dn1,dnN datanode; class scm,om manager; ``` @@ -153,7 +153,7 @@ The compose directory includes several specialized configurations for different | Configuration | Purpose | -|----------------|-----------------------------------------| +| -------------- | --------------------------------------- | | ozone-ha | High availability deployment setup | | ozonesecure | Security features with SSL and Kerberos | | ozone-topology | Rack-aware deployment configuration | diff --git a/docs/08-developer-guide/02-run/README.mdx b/docs/08-developer-guide/02-run/README.mdx index ac95aa4f04..162c0f55cb 100644 --- a/docs/08-developer-guide/02-run/README.mdx +++ b/docs/08-developer-guide/02-run/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Run # Running a Custom Ozone Build -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents various ways to run a custom build of Ozone on a local machine. - + diff --git a/docs/08-developer-guide/03-test/README.mdx b/docs/08-developer-guide/03-test/README.mdx index 45b16e2428..c5409c5302 100644 --- a/docs/08-developer-guide/03-test/README.mdx +++ b/docs/08-developer-guide/03-test/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Test # Testing Ozone -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents how to run and modify tests against Ozone. - + diff --git a/docs/08-developer-guide/04-project/02-release-guide.md b/docs/08-developer-guide/04-project/02-release-guide.md index 0f8daa01ff..20a9e11a01 100644 --- a/docs/08-developer-guide/04-project/02-release-guide.md +++ b/docs/08-developer-guide/04-project/02-release-guide.md @@ -29,17 +29,17 @@ import TabItem from '@theme/TabItem'; Install pre-requisites using Homebrew. - ```bash - brew install svn git pinentry-mac cmake gcc coreutils gpatch +```bash +brew install svn git pinentry-mac cmake gcc coreutils gpatch - sudo ln -s /usr/local/bin/gsha256sum /usr/local/bin/sha256sum - sudo ln -s /usr/local/bin/gsha512sum /usr/local/bin/sha512sum +sudo ln -s /usr/local/bin/gsha256sum /usr/local/bin/sha256sum +sudo ln -s /usr/local/bin/gsha512sum /usr/local/bin/sha512sum - # use GNU patch as patch - PATH="$HOMEBREW_PREFIX/opt/gpatch/libexec/gnubin:$PATH" - ``` +# use GNU patch as patch +PATH="$HOMEBREW_PREFIX/opt/gpatch/libexec/gnubin:$PATH" +``` -Make sure to use [GNU tar](https://www.gnu.org/software/tar/). On Mac, built-in tar includes additional metadata in the archive, which appears as extra files when extracted on other platforms. GNU tar can be installed e.g. via Homebrew: +Make sure to use [GNU tar](https://www.gnu.org/software/tar/). On Mac, built-in tar includes additional metadata in the archive, which appears as extra files when extracted on other platforms. GNU tar can be installed e.g. via Homebrew: ```bash title="Install GNU tar on Mac" brew install gnu-tar @@ -111,17 +111,17 @@ svn mv -m "ozone: adding key of to the KEYS" https://dist.apache.org/repo Add your Apache credentials to the local Maven settings `~/.m2/settings.xml`. - ```xml title="settings.xml" - - - - apache.staging.https - your_apache_id - your_apache_password - - - - ``` +```xml title="settings.xml" + + + + apache.staging.https + your_apache_id + your_apache_password + + + +``` ## Pre-Vote @@ -131,20 +131,20 @@ This provides visibility into the progress of the release for the community. Tas ### Bulk Comment on Jiras Targeting This Release -Issue a Jira query like [this](https://issues.apache.org/jira/issues/?jql=project%20%3D%20HDDS%20AND%20resolution%20%3D%20Unresolved%20AND%20(cf%5B12310320%5D%20%3D%201.3.0%20OR%20fixVersion%20%3D%201.3.0)%20ORDER%20BY%20priority%20DESC%2C%20updated%20DESC), modified for the release number you are working with, to find all unresolved Jiras that have the target version field set to this release. Note that some people incorrectly use Fix Version as the Target Version, so Fix Version is included in this search. Use the following steps to issue a bulk update to these Jiras: +Issue a Jira query like [this](), modified for the release number you are working with, to find all unresolved Jiras that have the target version field set to this release. Note that some people incorrectly use Fix Version as the Target Version, so Fix Version is included in this search. Use the following steps to issue a bulk update to these Jiras: 1. In the top right corner, click `Tools` and under `Bulk Change` , select `all ... issues`. 2. Click the top check box to select all the issues. Click `Next`. 3. Select `Edit Issues` , then click `Next`. 4. Select `Change Fix Version/s` , and in the drop down select `Clear field`. - :::note - This corrects unresolved issues which incorrectly set a fix version for this release. - ::: + :::note + This corrects unresolved issues which incorrectly set a fix version for this release. + ::: 5. Select `Change Target Version/s`, and enter the version of the release after the one you are managing. 6. Select `Change Comment`, and add a comment saying that you have moved the release field out, but if the issue is being actively worked on, is close to completion, and would like to be included in this release, to contact you by a given date, probably a week in the future. - :::note - Even though the action is called `Change Comment`, it actually adds a comment to the Jira and does not affect existing comments. - ::: + :::note + Even though the action is called `Change Comment`, it actually adds a comment to the Jira and does not affect existing comments. + ::: 7. Keep clicking through until the operation is started. It may take a while for Jira to finish the bulk update once it is started. Wait for the date specified in the Jira comments to pass and blocking issues to be resolved before proceeding with the next steps to update the master branch and cut a release branch. @@ -155,38 +155,38 @@ Protolock files are used to check backwards compatibility of protocol buffers be 1. Save and run the following script from your Ozone repo root. - ```bash title="update_protolocks.sh" - #!/usr/bin/env sh + ```bash title="update_protolocks.sh" + #!/usr/bin/env sh - for lock in $(find . -name proto.lock); do - lockdir="$(dirname "$lock")" - protoroot="$lockdir"/../proto - if protolock status --lockdir="$lockdir" --protoroot="$protoroot"; then - protolock commit --lockdir="$lockdir" --protoroot="$protoroot" - else - echo "protolock update failed for $protoroot" - fi - done - ``` + for lock in $(find . -name proto.lock); do + lockdir="$(dirname "$lock")" + protoroot="$lockdir"/../proto + if protolock status --lockdir="$lockdir" --protoroot="$protoroot"; then + protolock commit --lockdir="$lockdir" --protoroot="$protoroot" + else + echo "protolock update failed for $protoroot" + fi + done + ``` 2. Commit changes to the `proto.lock` files. - ```bash - git commit -m "Update proto.lock for Ozone $VERSION" - ``` + ```bash + git commit -m "Update proto.lock for Ozone $VERSION" + ``` - :::warning - Double check that only files called `proto.lock` are being committed, and that the changes to the files makes sense based on new features added in this release. - ::: + :::warning + Double check that only files called `proto.lock` are being committed, and that the changes to the files makes sense based on new features added in this release. + ::: - :::tip - Ozone currently uses the following protolock files: - - `hadoop-hdds/interface-client/src/main/resources/proto.lock`: Controls the protocol for clients communicating with Datanodes. - - `hadoop-hdds/interface-admin/src/main/resources/proto.lock`: Controls the protocol for clients communicating with SCM. - - `hadoop-hdds/interface-server/src/main/resources/proto.lock`: Controls the protocol for SCMs communicating with each other. - - `hadoop-ozone/interface-client/src/main/resources/proto.lock`: Controls all protocols involving the Ozone Manager. - - `hadoop-ozone/csi/src/main/resources/proto.lock`: Controls the protocol for the Ozone CSI server. - ::: + :::tip + Ozone currently uses the following protolock files: + - `hadoop-hdds/interface-client/src/main/resources/proto.lock`: Controls the protocol for clients communicating with Datanodes. + - `hadoop-hdds/interface-admin/src/main/resources/proto.lock`: Controls the protocol for clients communicating with SCM. + - `hadoop-hdds/interface-server/src/main/resources/proto.lock`: Controls the protocol for SCMs communicating with each other. + - `hadoop-ozone/interface-client/src/main/resources/proto.lock`: Controls all protocols involving the Ozone Manager. + - `hadoop-ozone/csi/src/main/resources/proto.lock`: Controls the protocol for the Ozone CSI server. + ::: 3. Submit a pull request to add the updated `proto.lock` changes to Ozone's master branch. This commit will be the parent of your release branch. @@ -272,9 +272,9 @@ If the command fails, you may need to do the following additional steps: - Tell GPG to use this program to prompt for passphrase: - ```bash - echo "pinentry-program $(which pinentry-mac)" > ~/.gnupg/gpg-agent.conf - ``` +```bash +echo "pinentry-program $(which pinentry-mac)" > ~/.gnupg/gpg-agent.conf +``` - Reload `gpg-agent`: @@ -286,9 +286,9 @@ If the command fails, you may need to do the following additional steps: - add this to `~/.gnupg/gpg.conf`: - ```bash - use-agent - ``` +```bash +use-agent +``` - add this to `~/.gnupg/gpg-agent.conf` @@ -318,9 +318,9 @@ If the command fails, you may need to do the following additional steps: Build the project to fetch dependencies. - ```bash - mvn clean install -DskipTests -Psign,dist,src -Dtar -Dgpg.keyname="$CODESIGNINGKEY" -Drocks_tools_native - ``` +```bash +mvn clean install -DskipTests -Psign,dist,src -Dtar -Dgpg.keyname="$CODESIGNINGKEY" -Drocks_tools_native +``` ### Create and Upload Maven Artifacts @@ -359,54 +359,54 @@ Before uploading the artifacts, run some basic tests on them, similar to what ot 1. Extract the contents of the source tarball and build it with an empty Maven cache by renaming your `~/.m2` directory before doing the build. 2. Check the size of the output binary tarball for significant size increase from the last release. - - A significant increase in size could indicate a dependency issue that needs to be fixed. - - The Apache svn repo has a size limit for release artifacts. If uploading svn fails because the tarball is too big, we need to contact INFRA to increase our repo size. [See here for details.](https://issues.apache.org/jira/browse/INFRA-23892) + - A significant increase in size could indicate a dependency issue that needs to be fixed. + - The Apache svn repo has a size limit for release artifacts. If uploading svn fails because the tarball is too big, we need to contact INFRA to increase our repo size. [See here for details.](https://issues.apache.org/jira/browse/INFRA-23892) 3. Verify signatures - - Download the KEYS file from https://dist.apache.org/repos/dist/release/ozone/KEYS - - Import its contents (which should include your public GPG key): + - Download the KEYS file from https://dist.apache.org/repos/dist/release/ozone/KEYS + - Import its contents (which should include your public GPG key): - ```bash - gpg --import KEYS - ``` + ```bash + gpg --import KEYS + ``` - - Verify each .tar.gz artifact: + - Verify each .tar.gz artifact: - ```bash - for x in *.tar.gz; do gpg --verify $x.asc $x; done - ``` + ```bash + for x in *.tar.gz; do gpg --verify $x.asc $x; done + ``` 4. Verify checksums - - For each artifact, verify that the checksums given by the `shasum` command match the contents of the .sha512 file and the SHA512 line in its .mds file. + - For each artifact, verify that the checksums given by the `shasum` command match the contents of the .sha512 file and the SHA512 line in its .mds file. - ```bash - shasum -a 512 *.tar.gz - ``` + ```bash + shasum -a 512 *.tar.gz + ``` 5. Make sure docs are present in the release tarball - Extract the release and open docs/index.html in your web browser, and check that the documentation website looks ok. 6. Run `bin/ozone version` from the extracted release tarball. The output of this command should contain: - - The correct release - - The correct national park tag - - A non-snapshot version of Ratis. - - A link to the [apache/ozone](https://github.com/apache/ozone) GitHub repository (not your fork). - - The git hash of the last commit the release was built on. + - The correct release + - The correct national park tag + - A non-snapshot version of Ratis. + - A link to the [apache/ozone](https://github.com/apache/ozone) GitHub repository (not your fork). + - The git hash of the last commit the release was built on. 7. Run the upgrade compatibility acceptance tests by running `test.sh` from the `compose/upgrade` directory in the extracted release tarball. - :::note - The `test.sh` file committed to the master branch only checks upgrade compatibility against the last released Ozone version to save build time. Compatibility with all past versions should be checked by uncommenting all `run_test` lines in the `test.sh` file before running it. This test matrix may take a long time to run, so it might be better to run it on GitHub Actions instead of locally. - ::: + :::note + The `test.sh` file committed to the master branch only checks upgrade compatibility against the last released Ozone version to save build time. Compatibility with all past versions should be checked by uncommenting all `run_test` lines in the `test.sh` file before running it. This test matrix may take a long time to run, so it might be better to run it on GitHub Actions instead of locally. + ::: ### Upload the Artifacts to Dev Staging 1. Upload everything from the `$RELEASE_DIR` to the dev staging area. - ```bash - svn checkout https://dist.apache.org/repos/dist/dev/ozone - cd ozone - mkdir "$VERSION-rc$RC" - cp -v "$RELEASE_DIR"/* "$VERSION-rc$RC"/ - svn add "$VERSION-rc$RC" - svn commit -m "Ozone $VERSION RC$RC" - ``` + ```bash + svn checkout https://dist.apache.org/repos/dist/dev/ozone + cd ozone + mkdir "$VERSION-rc$RC" + cp -v "$RELEASE_DIR"/* "$VERSION-rc$RC"/ + svn add "$VERSION-rc$RC" + svn commit -m "Ozone $VERSION RC$RC" + ``` 2. Check the results by opening the [dev directory](https://dist.apache.org/repos/dist/dev/ozone/) in your browser. @@ -421,7 +421,7 @@ git push origin "ozone-$VERSION-RC$RC" Send a vote email to the dev@ozone.apache.org mailing list. Include the following items in the email: - Link to the release candidate tag on Github -- Link to a Jira query showing all resolved issues for this release. Something like [this](https://issues.apache.org/jira/issues/?jql=project%20%3D%20HDDS%20AND%20status%20in%20(Resolved%2C%20Closed)%20AND%20fixVersion%20%3D%202.0.0). +- Link to a Jira query showing all resolved issues for this release. Something like [this](). - Location of the source and binary tarballs. This link will look something like https://dist.apache.org/repos/dist/dev/ozone/2.0.0-rc0 - Location where the Maven artifacts are staged. This link will look something like https://repository.apache.org/content/repositories/orgapacheozone-1029/ - Link to the public key used to sign the artifacts. This should always be in the KEYS file and you can just link to that: https://dist.apache.org/repos/dist/release/ozone/KEYS @@ -437,9 +437,9 @@ If an issue is found with the artifacts: 1. Remove the abandoned release candidate from Subversion. - ```bash - svn delete -m "Abandon Ozone $VERSION RC$RC" https://dist.apache.org/repos/dist/dev/ozone/"$VERSION-rc$RC" - ``` + ```bash + svn delete -m "Abandon Ozone $VERSION RC$RC" https://dist.apache.org/repos/dist/dev/ozone/"$VERSION-rc$RC" + ``` 2. Discard the staging repository at https://repository.apache.org/#stagingRepositories 3. Apply fixes to the release branch. @@ -489,20 +489,20 @@ The Ozone Docker image is intended for testing purposes only, not production use 1. Publish the image with the `latest` tag by fast-forwarding the `ozone-latest` branch to match the `latest` branch. - ```bash - git checkout ozone-latest - git pull - git merge --ff-only origin/latest - git push origin ozone-latest - ``` + ```bash + git checkout ozone-latest + git pull + git merge --ff-only origin/latest + git push origin ozone-latest + ``` 2. Publish the image with a version specific tag by creating a new branch with a name like `ozone-1.5.0` (replace this with the current version) from the `latest` branch and push it to [GitHub](https://github.com/apache/ozone-docker). - ```bash - git checkout ozone-latest - git checkout -b "ozone-$VERSION" - git push origin "ozone-$VERSION" - ``` + ```bash + git checkout ozone-latest + git checkout -b "ozone-$VERSION" + git push origin "ozone-$VERSION" + ``` ### Update Helm Chart (Optional) @@ -538,19 +538,19 @@ If there is a security vulnerability or critical bug uncovered in a major or min 1. Cherry pick the fix(es) on to the maintenance branch. For example, for Ozone's 1.2.0 release, this is the branch called `ozone-1.2`. 2. Run all steps from the sections [Update the Versions](#update-the-ozone-version-on-the-release-branch) through [Publish a Docker Image for the Release](#publish-a-docker-image-for-the-release), with the following modifications: - - Do not update the protolock files unless protocol buffers were changed as part of the fix. - - When updating the website, all instances of the original major/minor release should be replaced with this patch version, since we do not want users downloading the original release anymore. - - For example, any website text referring to 1.2.0 should be changed to refer to 1.2.1. - - Continuing the 1.2.0 to 1.2.1 example, the release/1.2.0 page should redirect to release/1.2.1. - - An example pull request to do this is [here](https://github.com/apache/ozone-site/pull/23). - - The docs can be added to the website normally as described above in [Update the Ozone Website](#update-the-ozone-website). The docs link for the original major/minor release can remain alongside the docs link for the patch release. - - In the event of a critical security vulnerability or seriously harmful bug with a small set of changes in the patch, PMC members may vote to forgo the usual 72 hour minimum time for a release vote and publish once there are enough binding +1s. + - Do not update the protolock files unless protocol buffers were changed as part of the fix. + - When updating the website, all instances of the original major/minor release should be replaced with this patch version, since we do not want users downloading the original release anymore. + - For example, any website text referring to 1.2.0 should be changed to refer to 1.2.1. + - Continuing the 1.2.0 to 1.2.1 example, the release/1.2.0 page should redirect to release/1.2.1. + - An example pull request to do this is [here](https://github.com/apache/ozone-site/pull/23). + - The docs can be added to the website normally as described above in [Update the Ozone Website](#update-the-ozone-website). The docs link for the original major/minor release can remain alongside the docs link for the patch release. + - In the event of a critical security vulnerability or seriously harmful bug with a small set of changes in the patch, PMC members may vote to forgo the usual 72 hour minimum time for a release vote and publish once there are enough binding +1s. 3. Remove the previous release that this patch release supersedes from the Apache distribution site: - ```bash - svn rm -m 'Ozone: delete old version 1.2.0' https://dist.apache.org/repos/dist/release/ozone/1.2.0 - ``` + ```bash + svn rm -m 'Ozone: delete old version 1.2.0' https://dist.apache.org/repos/dist/release/ozone/1.2.0 + ``` ## Update This Document diff --git a/docs/08-developer-guide/04-project/README.mdx b/docs/08-developer-guide/04-project/README.mdx index 944d4f685f..5e404ec15f 100644 --- a/docs/08-developer-guide/04-project/README.mdx +++ b/docs/08-developer-guide/04-project/README.mdx @@ -4,8 +4,8 @@ sidebar_label: Project # Project Guide -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section documents how various aspects of the Apache Ozone project are managed. - + diff --git a/docs/08-developer-guide/README.mdx b/docs/08-developer-guide/README.mdx index b75901eb7d..7470d78055 100644 --- a/docs/08-developer-guide/README.mdx +++ b/docs/08-developer-guide/README.mdx @@ -1,7 +1,7 @@ # Developer Guide -import DocCardList from '@theme/DocCardList'; +import DocCardList from "@theme/DocCardList"; This section provides a guide for developers looking to contribute to the Ozone project. - + diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000000..902f19e345 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,176 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import js from "@eslint/js"; +import globals from "globals"; +import pluginReact from "eslint-plugin-react"; +import css from "@eslint/css"; +import { defineConfig } from "eslint/config"; +import pluginPrettier from "eslint-plugin-prettier/recommended"; +import pluginDocusaurus from "@docusaurus/eslint-plugin"; +import pluginUnusedImports from "eslint-plugin-unused-imports"; +import pluginImport from "eslint-plugin-import"; + + +const apacheLicenseRule = { + meta: { + type: "problem", + docs: { + description: "Enforce Apache License header in source files" + }, + fixable: "code", + messages: { + missingHeader: "Missing Apache License header at the top of the file" + } + }, + create(context) { + const REQUIRED_HEADER = `/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */`; + + return { + Program(node) { + const sourceCode = context.sourceCode || context.getSourceCode(); + const text = sourceCode.getText(); + + if (!text.startsWith(REQUIRED_HEADER)) { + context.report({ + node, + messageId: "missingHeader", + fix(fixer) { + return fixer.insertTextBefore(node, REQUIRED_HEADER + "\n\n"); + } + }); + } + } + }; + } +}; + +export default defineConfig([ + // General + { + ignores: [ + "static/**", + "*.config*", + "node_modules/**", + "build/**", + "dist/**", + ".docusaurus/**", + ".github/**" + ] + }, + + // Prettier integration + pluginPrettier, + + // JS + { + files: ["**/*.{js,mjs,cjs,jsx}"], + ...js.configs.recommended, + languageOptions: { globals: { ...globals.browser, ...globals.node } }, + plugins: { + "unused-imports": pluginUnusedImports, + import: pluginImport + }, + rules: { + "unused-imports/no-unused-imports": "error", + // unused vars (but ignore underscore-prefixed) + "unused-imports/no-unused-vars": [ + "warn", + { + vars: "all", + varsIgnorePattern: "^_", + args: "after-used", + argsIgnorePattern: "^_" + } + ], + "import/no-duplicates": "error", + "no-unused-vars": "off" + } + }, + + // React + { + files: ["**/*.{js,jsx}"], + ...pluginReact.configs.flat.recommended, + settings: { + react: { version: "detect" } + }, + rules: { + "react/prop-types": "off", + "react/react-in-jsx-scope": "off", + "react/jsx-uses-vars": "error" + } + }, + + // CSS + { + files: ["**/*.css"], + plugins: { css }, + language: "css/css", + extends: ["css/recommended"], + rules: { + "css/no-invalid-properties": "off", + "css/no-important": "off", + "css/use-baseline": "off" + } + }, + + // Docusaurus + { + files: ["**/*.{js,mjs,cjs,jsx}"], + plugins: { "@docusaurus": pluginDocusaurus }, + rules: { + "@docusaurus/no-html-links": "error", + "@docusaurus/prefer-docusaurus-heading": "error", + "@docusaurus/string-literal-i18n-messages": "error", + // for i18n + // "@docusaurus/no-untranslated-text": ["warn", { ignoredStrings: [] }] + } + }, + + // Custom rule to enforce Apache License header + { + files: ["**/*.{js,mjs,cjs,jsx}"], + plugins: { + custom: { + rules: { "apache-license": apacheLicenseRule } + } + }, + rules: { + "custom/apache-license": "error" + } + } +]); diff --git a/package.json b/package.json index 539ea84bb1..65d5287a56 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,9 @@ "clear": "docusaurus clear", "serve": "docusaurus serve --port 3001", "write-translations": "docusaurus write-translations", - "write-heading-ids": "docusaurus write-heading-ids" + "write-heading-ids": "docusaurus write-heading-ids", + "lint": "eslint . && markdownlint .", + "lint:fix": "eslint . --fix && prettier -w \"**/*.{md,mdx}\" && markdownlint --fix ." }, "dependencies": { "@docusaurus/core": "3.7.0", @@ -32,10 +34,22 @@ "@cspell/dict-java": "^5.0.11", "@cspell/dict-markdown": "^2.0.9", "@cspell/dict-shell": "^1.1.0", + "@cspell/eslint-plugin": "^9.6.2", + "@docusaurus/eslint-plugin": "^3.9.2", "@docusaurus/module-type-aliases": "3.7.0", + "@eslint/css": "^0.14.1", + "@eslint/js": "^9.39.2", "ajv-cli": "^5.0.0", "cspell": "^8.17.5", - "markdownlint-cli": "^0.39.0" + "eslint": "^9.39.2", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-prettier": "^5.5.5", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-unused-imports": "^4.3.0", + "globals": "^17.2.0", + "markdownlint-cli": "^0.39.0", + "prettier": "3.8.1" }, "browserslist": { "production": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6225c55a51..dc34508a87 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,16 +10,16 @@ importers: dependencies: '@docusaurus/core': specifier: 3.7.0 - version: 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + version: 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) '@docusaurus/plugin-pwa': specifier: ^3.7.0 - version: 3.7.0(@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + version: 3.7.0(@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) '@docusaurus/preset-classic': specifier: 3.7.0 - version: 3.7.0(@algolia/client-search@5.21.0)(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(@types/react@19.0.12)(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.8.2) + version: 3.7.0(@algolia/client-search@5.21.0)(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(@types/react@19.0.12)(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.8.2) '@docusaurus/theme-mermaid': specifier: 3.7.0 - version: 3.7.0(@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + version: 3.7.0(@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) '@mdx-js/react': specifier: ^3.1.0 version: 3.1.0(@types/react@19.0.12)(react@18.3.1) @@ -54,18 +54,54 @@ importers: '@cspell/dict-shell': specifier: ^1.1.0 version: 1.1.0 + '@cspell/eslint-plugin': + specifier: ^9.6.2 + version: 9.6.2(eslint@9.39.2(jiti@1.21.7)) + '@docusaurus/eslint-plugin': + specifier: ^3.9.2 + version: 3.9.2(eslint@9.39.2(jiti@1.21.7))(typescript@5.8.2) '@docusaurus/module-type-aliases': specifier: 3.7.0 version: 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@eslint/css': + specifier: ^0.14.1 + version: 0.14.1 + '@eslint/js': + specifier: ^9.39.2 + version: 9.39.2 ajv-cli: specifier: ^5.0.0 version: 5.0.0 cspell: specifier: ^8.17.5 version: 8.17.5 + eslint: + specifier: ^9.39.2 + version: 9.39.2(jiti@1.21.7) + eslint-config-prettier: + specifier: ^10.1.8 + version: 10.1.8(eslint@9.39.2(jiti@1.21.7)) + eslint-plugin-import: + specifier: ^2.32.0 + version: 2.32.0(eslint@9.39.2(jiti@1.21.7)) + eslint-plugin-prettier: + specifier: ^5.5.5 + version: 5.5.5(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@1.21.7)))(eslint@9.39.2(jiti@1.21.7))(prettier@3.8.1) + eslint-plugin-react: + specifier: ^7.37.5 + version: 7.37.5(eslint@9.39.2(jiti@1.21.7)) + eslint-plugin-unused-imports: + specifier: ^4.3.0 + version: 4.3.0(eslint@9.39.2(jiti@1.21.7)) + globals: + specifier: ^17.2.0 + version: 17.2.0 markdownlint-cli: specifier: ^0.39.0 version: 0.39.0 + prettier: + specifier: 3.8.1 + version: 3.8.1 packages: @@ -725,140 +761,286 @@ packages: resolution: {integrity: sha512-b/Ntabar+g4gsRNwOct909cvatO/auHhNvBzJZfyFQzryI1nqHMaSFuDsrrtzbhQkGJ4GiMAKCXZC2EOdHMgmw==} engines: {node: '>=18'} + '@cspell/cspell-bundled-dicts@9.6.2': + resolution: {integrity: sha512-s5u/3nhQUftKibPIbRLLAf4M5JG1NykqkPCxS0STMmri0hzVMZbAOCyHjdLoOCqPUn0xZzLA8fgeYg3b7QuHpg==} + engines: {node: '>=20'} + '@cspell/cspell-json-reporter@8.17.5': resolution: {integrity: sha512-+eVFCdnda74Frv8hguHYwDtxvqDuJJ/luFRl4dC5oknPMRab0JCHM1DDYjp3NzsehTex0HmcxplxqVW6QoDosg==} engines: {node: '>=18'} + '@cspell/cspell-performance-monitor@9.6.2': + resolution: {integrity: sha512-MZuhYy59zFCVsX3PzW02/3TqPsPw87MELOJuZfpWDcGgxrweTrVjMdmJ0/w7COJ6zEAqtgGjNMAEmK4xJnrQjQ==} + engines: {node: '>=20.18'} + '@cspell/cspell-pipe@8.17.5': resolution: {integrity: sha512-VOIfFdIo3FYQFcSpIyGkqHupOx0LgfBrWs79IKnTT1II27VUHPF+0oGq0WWf4c2Zpd8tzdHvS3IUhGarWZq69g==} engines: {node: '>=18'} + '@cspell/cspell-pipe@9.6.2': + resolution: {integrity: sha512-Wt6Cf4b/E0QJ/TkbOMjXSGrccASgbc8xZq3c+8+kCXM5JT92NP2Lx67m3UA1g+BDv7E4DNPuwm1fM7o/2zum5w==} + engines: {node: '>=20'} + '@cspell/cspell-resolver@8.17.5': resolution: {integrity: sha512-5MhYInligPbGctWxoklAKxtg+sxvtJCuRKGSQHHA0JlCOLSsducypl780P6zvpjLK59XmdfC+wtFONxSmRbsuA==} engines: {node: '>=18'} + '@cspell/cspell-resolver@9.6.2': + resolution: {integrity: sha512-u7P4ErApEcSP+Si2HaeotFQXjuCopAa+wPF1fDzuJzpotPxsDwNDanGGn2qUMjOyVI4UiI84MPI6ZuGLj5EDyQ==} + engines: {node: '>=20'} + '@cspell/cspell-service-bus@8.17.5': resolution: {integrity: sha512-Ur3IK0R92G/2J6roopG9cU/EhoYAMOx2um7KYlq93cdrly8RBAK2NCcGCL7DbjQB6C9RYEAV60ueMUnQ45RrCQ==} engines: {node: '>=18'} + '@cspell/cspell-service-bus@9.6.2': + resolution: {integrity: sha512-T4LBWe3NYpKPD/fIkYAL56z5pr8Cgh//UZDl4afDTJNuTkdE6ZL93MBAUXggONHqY8B9dRXlQKrD4PD+kHabtw==} + engines: {node: '>=20'} + '@cspell/cspell-types@8.17.5': resolution: {integrity: sha512-91y2+0teunRSRZj940ORDA3kdjyenrUiM+4j6nQQH24sAIAJdRmQl2LG3eUTmeaSReJGkZIpnToQ6DyU5cC88Q==} engines: {node: '>=18'} + '@cspell/cspell-types@9.6.2': + resolution: {integrity: sha512-RsUFrSB0oQHEBnR8yarKIReUPwSu2ROpbjhdVKi4T/nQhMaS+TnIQPBwkMtb2r8A1KS2Hijw4D/4bV/XHoFQWw==} + engines: {node: '>=20'} + '@cspell/dict-ada@4.1.0': resolution: {integrity: sha512-7SvmhmX170gyPd+uHXrfmqJBY5qLcCX8kTGURPVeGxmt8XNXT75uu9rnZO+jwrfuU2EimNoArdVy5GZRGljGNg==} + '@cspell/dict-ada@4.1.1': + resolution: {integrity: sha512-E+0YW9RhZod/9Qy2gxfNZiHJjCYFlCdI69br1eviQQWB8yOTJX0JHXLs79kOYhSW0kINPVUdvddEBe6Lu6CjGQ==} + '@cspell/dict-al@1.1.0': resolution: {integrity: sha512-PtNI1KLmYkELYltbzuoztBxfi11jcE9HXBHCpID2lou/J4VMYKJPNqe4ZjVzSI9NYbMnMnyG3gkbhIdx66VSXg==} + '@cspell/dict-al@1.1.1': + resolution: {integrity: sha512-sD8GCaZetgQL4+MaJLXqbzWcRjfKVp8x+px3HuCaaiATAAtvjwUQ5/Iubiqwfd1boIh2Y1/3EgM3TLQ7Q8e0wQ==} + + '@cspell/dict-aws@4.0.17': + resolution: {integrity: sha512-ORcblTWcdlGjIbWrgKF+8CNEBQiLVKdUOFoTn0KPNkAYnFcdPP0muT4892h7H4Xafh3j72wqB4/loQ6Nti9E/w==} + '@cspell/dict-aws@4.0.9': resolution: {integrity: sha512-bDYdnnJGwSkIZ4gzrauu7qzOs/ZAY/FnU4k11LgdMI8BhwMfsbsy2EI1iS+sD/BI5ZnNT9kU5YR3WADeNOmhRg==} '@cspell/dict-bash@4.2.0': resolution: {integrity: sha512-HOyOS+4AbCArZHs/wMxX/apRkjxg6NDWdt0jF9i9XkvJQUltMwEhyA2TWYjQ0kssBsnof+9amax2lhiZnh3kCg==} + '@cspell/dict-bash@4.2.2': + resolution: {integrity: sha512-kyWbwtX3TsCf5l49gGQIZkRLaB/P8g73GDRm41Zu8Mv51kjl2H7Au0TsEvHv7jzcsRLS6aUYaZv6Zsvk1fOz+Q==} + '@cspell/dict-companies@3.1.14': resolution: {integrity: sha512-iqo1Ce4L7h0l0GFSicm2wCLtfuymwkvgFGhmu9UHyuIcTbdFkDErH+m6lH3Ed+QuskJlpQ9dM7puMIGqUlVERw==} + '@cspell/dict-companies@3.2.10': + resolution: {integrity: sha512-bJ1qnO1DkTn7JYGXvxp8FRQc4yq6tRXnrII+jbP8hHmq5TX5o1Wu+rdfpoUQaMWTl6balRvcMYiINDesnpR9Bw==} + '@cspell/dict-cpp@6.0.6': resolution: {integrity: sha512-HMV1chsExuZt5IL9rYBW7GmhNZDVdQJEd1WtFgOO6jqiNxbpTG3Is3Pkldl7FpusBQQZr4BdjMit5bnPpVRy3A==} + '@cspell/dict-cpp@7.0.2': + resolution: {integrity: sha512-dfbeERiVNeqmo/npivdR6rDiBCqZi3QtjH2Z0HFcXwpdj6i97dX1xaKyK2GUsO/p4u1TOv63Dmj5Vm48haDpuA==} + '@cspell/dict-cryptocurrencies@5.0.4': resolution: {integrity: sha512-6iFu7Abu+4Mgqq08YhTKHfH59mpMpGTwdzDB2Y8bbgiwnGFCeoiSkVkgLn1Kel2++hYcZ8vsAW/MJS9oXxuMag==} + '@cspell/dict-cryptocurrencies@5.0.5': + resolution: {integrity: sha512-R68hYYF/rtlE6T/dsObStzN5QZw+0aQBinAXuWCVqwdS7YZo0X33vGMfChkHaiCo3Z2+bkegqHlqxZF4TD3rUA==} + '@cspell/dict-csharp@4.0.6': resolution: {integrity: sha512-w/+YsqOknjQXmIlWDRmkW+BHBPJZ/XDrfJhZRQnp0wzpPOGml7W0q1iae65P2AFRtTdPKYmvSz7AL5ZRkCnSIw==} + '@cspell/dict-csharp@4.0.8': + resolution: {integrity: sha512-qmk45pKFHSxckl5mSlbHxmDitSsGMlk/XzFgt7emeTJWLNSTUK//MbYAkBNRtfzB4uD7pAFiKgpKgtJrTMRnrQ==} + '@cspell/dict-css@4.0.17': resolution: {integrity: sha512-2EisRLHk6X/PdicybwlajLGKF5aJf4xnX2uuG5lexuYKt05xV/J/OiBADmi8q9obhxf1nesrMQbqAt+6CsHo/w==} + '@cspell/dict-css@4.0.19': + resolution: {integrity: sha512-VYHtPnZt/Zd/ATbW3rtexWpBnHUohUrQOHff/2JBhsVgxOrksAxJnLAO43Q1ayLJBJUUwNVo+RU0sx0aaysZfg==} + '@cspell/dict-dart@2.3.0': resolution: {integrity: sha512-1aY90lAicek8vYczGPDKr70pQSTQHwMFLbmWKTAI6iavmb1fisJBS1oTmMOKE4ximDf86MvVN6Ucwx3u/8HqLg==} + '@cspell/dict-dart@2.3.2': + resolution: {integrity: sha512-sUiLW56t9gfZcu8iR/5EUg+KYyRD83Cjl3yjDEA2ApVuJvK1HhX+vn4e4k4YfjpUQMag8XO2AaRhARE09+/rqw==} + + '@cspell/dict-data-science@2.0.13': + resolution: {integrity: sha512-l1HMEhBJkPmw4I2YGVu2eBSKM89K9pVF+N6qIr5Uo5H3O979jVodtuwP8I7LyPrJnC6nz28oxeGRCLh9xC5CVA==} + '@cspell/dict-data-science@2.0.7': resolution: {integrity: sha512-XhAkK+nSW6zmrnWzusmZ1BpYLc62AWYHZc2p17u4nE2Z9XG5DleG55PCZxXQTKz90pmwlhFM9AfpkJsYaBWATA==} '@cspell/dict-django@4.1.4': resolution: {integrity: sha512-fX38eUoPvytZ/2GA+g4bbdUtCMGNFSLbdJJPKX2vbewIQGfgSFJKY56vvcHJKAvw7FopjvgyS/98Ta9WN1gckg==} + '@cspell/dict-django@4.1.6': + resolution: {integrity: sha512-SdbSFDGy9ulETqNz15oWv2+kpWLlk8DJYd573xhIkeRdcXOjskRuxjSZPKfW7O3NxN/KEf3gm3IevVOiNuFS+w==} + '@cspell/dict-docker@1.1.12': resolution: {integrity: sha512-6d25ZPBnYZaT9D9An/x6g/4mk542R8bR3ipnby3QFCxnfdd6xaWiTcwDPsCgwN2aQZIQ1jX/fil9KmBEqIK/qA==} + '@cspell/dict-docker@1.1.17': + resolution: {integrity: sha512-OcnVTIpHIYYKhztNTyK8ShAnXTfnqs43hVH6p0py0wlcwRIXe5uj4f12n7zPf2CeBI7JAlPjEsV0Rlf4hbz/xQ==} + + '@cspell/dict-dotnet@5.0.11': + resolution: {integrity: sha512-LSVKhpFf/ASTWJcfYeS0Sykcl1gVMsv2Z5Eo0TnTMSTLV3738HH+66pIsjUTChqU6SF3gKPuCe6EOaRYqb/evA==} + '@cspell/dict-dotnet@5.0.9': resolution: {integrity: sha512-JGD6RJW5sHtO5lfiJl11a5DpPN6eKSz5M1YBa1I76j4dDOIqgZB6rQexlDlK1DH9B06X4GdDQwdBfnpAB0r2uQ==} '@cspell/dict-elixir@4.0.7': resolution: {integrity: sha512-MAUqlMw73mgtSdxvbAvyRlvc3bYnrDqXQrx5K9SwW8F7fRYf9V4vWYFULh+UWwwkqkhX9w03ZqFYRTdkFku6uA==} + '@cspell/dict-elixir@4.0.8': + resolution: {integrity: sha512-CyfphrbMyl4Ms55Vzuj+mNmd693HjBFr9hvU+B2YbFEZprE5AG+EXLYTMRWrXbpds4AuZcvN3deM2XVB80BN/Q==} + '@cspell/dict-en-common-misspellings@2.0.10': resolution: {integrity: sha512-80mXJLtr0tVEtzowrI7ycVae/ULAYImZUlr0kUTpa8i57AUk7Zy3pYBs44EYIKW7ZC9AHu4Qjjfq4vriAtyTDQ==} + '@cspell/dict-en-common-misspellings@2.1.12': + resolution: {integrity: sha512-14Eu6QGqyksqOd4fYPuRb58lK1Va7FQK9XxFsRKnZU8LhL3N+kj7YKDW+7aIaAN/0WGEqslGP6lGbQzNti8Akw==} + + '@cspell/dict-en-gb-mit@3.1.16': + resolution: {integrity: sha512-4PPdapCJslytxAVJu35Mv97qDyGmAQxtDE790T2bWNhcqN6gvRVAc/eTRaXkUIf21q1xCxxNNqpH4VfMup69rQ==} + '@cspell/dict-en-gb@1.1.33': resolution: {integrity: sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g==} '@cspell/dict-en_us@4.3.35': resolution: {integrity: sha512-HF6QNyPHkxeo/SosaZXRQlnKDUTjIzrGKyqfbw/fPPlPYrXefAZZ40ofheb5HnbUicR7xqV/lsc/HQfqYshGIw==} + '@cspell/dict-en_us@4.4.27': + resolution: {integrity: sha512-0y4vH2i5cFmi8sxkc4OlD2IlnqDznOtKczm4h6jA288g5VVrm3bhkYK6vcB8b0CoRKtYWKet4VEmHBP1yI+Qfw==} + '@cspell/dict-filetypes@3.0.11': resolution: {integrity: sha512-bBtCHZLo7MiSRUqx5KEiPdGOmXIlDGY+L7SJEtRWZENpAKE+96rT7hj+TUUYWBbCzheqHr0OXZJFEKDgsG/uZg==} + '@cspell/dict-filetypes@3.0.15': + resolution: {integrity: sha512-uDMeqYlLlK476w/muEFQGBy9BdQWS0mQ7BJiy/iQv5XUWZxE2O54ZQd9nW8GyQMzAgoyg5SG4hf9l039Qt66oA==} + '@cspell/dict-flutter@1.1.0': resolution: {integrity: sha512-3zDeS7zc2p8tr9YH9tfbOEYfopKY/srNsAa+kE3rfBTtQERAZeOhe5yxrnTPoufctXLyuUtcGMUTpxr3dO0iaA==} + '@cspell/dict-flutter@1.1.1': + resolution: {integrity: sha512-UlOzRcH2tNbFhZmHJN48Za/2/MEdRHl2BMkCWZBYs+30b91mWvBfzaN4IJQU7dUZtowKayVIF9FzvLZtZokc5A==} + '@cspell/dict-fonts@4.0.4': resolution: {integrity: sha512-cHFho4hjojBcHl6qxidl9CvUb492IuSk7xIf2G2wJzcHwGaCFa2o3gRcxmIg1j62guetAeDDFELizDaJlVRIOg==} + '@cspell/dict-fonts@4.0.5': + resolution: {integrity: sha512-BbpkX10DUX/xzHs6lb7yzDf/LPjwYIBJHJlUXSBXDtK/1HaeS+Wqol4Mlm2+NAgZ7ikIE5DQMViTgBUY3ezNoQ==} + '@cspell/dict-fsharp@1.1.0': resolution: {integrity: sha512-oguWmHhGzgbgbEIBKtgKPrFSVAFtvGHaQS0oj+vacZqMObwkapcTGu7iwf4V3Bc2T3caf0QE6f6rQfIJFIAVsw==} + '@cspell/dict-fsharp@1.1.1': + resolution: {integrity: sha512-imhs0u87wEA4/cYjgzS0tAyaJpwG7vwtC8UyMFbwpmtw+/bgss+osNfyqhYRyS/ehVCWL17Ewx2UPkexjKyaBA==} + '@cspell/dict-fullstack@3.2.6': resolution: {integrity: sha512-cSaq9rz5RIU9j+0jcF2vnKPTQjxGXclntmoNp4XB7yFX2621PxJcekGjwf/lN5heJwVxGLL9toR0CBlGKwQBgA==} + '@cspell/dict-fullstack@3.2.8': + resolution: {integrity: sha512-J6EeoeThvx/DFrcA2rJiCA6vfqwJMbkG0IcXhlsmRZmasIpanmxgt90OEaUazbZahFiuJT8wrhgQ1QgD1MsqBw==} + '@cspell/dict-gaming-terms@1.1.0': resolution: {integrity: sha512-46AnDs9XkgJ2f1Sqol1WgfJ8gOqp60fojpc9Wxch7x+BA63g4JfMV5/M5x0sI0TLlLY8EBSglcr8wQF/7C80AQ==} + '@cspell/dict-gaming-terms@1.1.2': + resolution: {integrity: sha512-9XnOvaoTBscq0xuD6KTEIkk9hhdfBkkvJAIsvw3JMcnp1214OCGW8+kako5RqQ2vTZR3Tnf3pc57o7VgkM0q1Q==} + '@cspell/dict-git@3.0.4': resolution: {integrity: sha512-C44M+m56rYn6QCsLbiKiedyPTMZxlDdEYAsPwwlL5bhMDDzXZ3Ic8OCQIhMbiunhCOJJT+er4URmOmM+sllnjg==} + '@cspell/dict-git@3.1.0': + resolution: {integrity: sha512-KEt9zGkxqGy2q1nwH4CbyqTSv5nadpn8BAlDnzlRcnL0Xb3LX9xTgSGShKvzb0bw35lHoYyLWN2ZKAqbC4pgGQ==} + '@cspell/dict-golang@6.0.19': resolution: {integrity: sha512-VS+oinB2/CbgmHE06kMJlj52OVMZM0S2EEXph3oaroNTgTuclSwdFylQmOEjquZi55kW+n3FM9MyWXiitB7Dtg==} + '@cspell/dict-golang@6.0.26': + resolution: {integrity: sha512-YKA7Xm5KeOd14v5SQ4ll6afe9VSy3a2DWM7L9uBq4u3lXToRBQ1W5PRa+/Q9udd+DTURyVVnQ+7b9cnOlNxaRg==} + '@cspell/dict-google@1.0.8': resolution: {integrity: sha512-BnMHgcEeaLyloPmBs8phCqprI+4r2Jb8rni011A8hE+7FNk7FmLE3kiwxLFrcZnnb7eqM0agW4zUaNoB0P+z8A==} + '@cspell/dict-google@1.0.9': + resolution: {integrity: sha512-biL65POqialY0i4g6crj7pR6JnBkbsPovB2WDYkj3H4TuC/QXv7Pu5pdPxeUJA6TSCHI7T5twsO4VSVyRxD9CA==} + '@cspell/dict-haskell@4.0.5': resolution: {integrity: sha512-s4BG/4tlj2pPM9Ha7IZYMhUujXDnI0Eq1+38UTTCpatYLbQqDwRFf2KNPLRqkroU+a44yTUAe0rkkKbwy4yRtQ==} + '@cspell/dict-haskell@4.0.6': + resolution: {integrity: sha512-ib8SA5qgftExpYNjWhpYIgvDsZ/0wvKKxSP+kuSkkak520iPvTJumEpIE+qPcmJQo4NzdKMN8nEfaeci4OcFAQ==} + '@cspell/dict-html-symbol-entities@4.0.3': resolution: {integrity: sha512-aABXX7dMLNFdSE8aY844X4+hvfK7977sOWgZXo4MTGAmOzR8524fjbJPswIBK7GaD3+SgFZ2yP2o0CFvXDGF+A==} + '@cspell/dict-html-symbol-entities@4.0.5': + resolution: {integrity: sha512-429alTD4cE0FIwpMucvSN35Ld87HCyuM8mF731KU5Rm4Je2SG6hmVx7nkBsLyrmH3sQukTcr1GaiZsiEg8svPA==} + '@cspell/dict-html@4.0.11': resolution: {integrity: sha512-QR3b/PB972SRQ2xICR1Nw/M44IJ6rjypwzA4jn+GH8ydjAX9acFNfc+hLZVyNe0FqsE90Gw3evLCOIF0vy1vQw==} + '@cspell/dict-html@4.0.14': + resolution: {integrity: sha512-2bf7n+kS92g+cMKV0wr9o/Oq9n8JzU7CcrB96gIh2GHgnF+0xDOqO2W/1KeFAqOfqosoOVE48t+4dnEMkkoJ2Q==} + '@cspell/dict-java@5.0.11': resolution: {integrity: sha512-T4t/1JqeH33Raa/QK/eQe26FE17eUCtWu+JsYcTLkQTci2dk1DfcIKo8YVHvZXBnuM43ATns9Xs0s+AlqDeH7w==} + '@cspell/dict-java@5.0.12': + resolution: {integrity: sha512-qPSNhTcl7LGJ5Qp6VN71H8zqvRQK04S08T67knMq9hTA8U7G1sTKzLmBaDOFhq17vNX/+rT+rbRYp+B5Nwza1A==} + '@cspell/dict-julia@1.1.0': resolution: {integrity: sha512-CPUiesiXwy3HRoBR3joUseTZ9giFPCydSKu2rkh6I2nVjXnl5vFHzOMLXpbF4HQ1tH2CNfnDbUndxD+I+7eL9w==} + '@cspell/dict-julia@1.1.1': + resolution: {integrity: sha512-WylJR9TQ2cgwd5BWEOfdO3zvDB+L7kYFm0I9u0s9jKHWQ6yKmfKeMjU9oXxTBxIufhCXm92SKwwVNAC7gjv+yA==} + '@cspell/dict-k8s@1.0.10': resolution: {integrity: sha512-313haTrX9prep1yWO7N6Xw4D6tvUJ0Xsx+YhCP+5YrrcIKoEw5Rtlg8R4PPzLqe6zibw6aJ+Eqq+y76Vx5BZkw==} + '@cspell/dict-k8s@1.0.12': + resolution: {integrity: sha512-2LcllTWgaTfYC7DmkMPOn9GsBWsA4DZdlun4po8s2ysTP7CPEnZc1ZfK6pZ2eI4TsZemlUQQ+NZxMe9/QutQxg==} + '@cspell/dict-kotlin@1.1.0': resolution: {integrity: sha512-vySaVw6atY7LdwvstQowSbdxjXG6jDhjkWVWSjg1XsUckyzH1JRHXe9VahZz1i7dpoFEUOWQrhIe5B9482UyJQ==} + '@cspell/dict-kotlin@1.1.1': + resolution: {integrity: sha512-J3NzzfgmxRvEeOe3qUXnSJQCd38i/dpF9/t3quuWh6gXM+krsAXP75dY1CzDmS8mrJAlBdVBeAW5eAZTD8g86Q==} + '@cspell/dict-latex@4.0.3': resolution: {integrity: sha512-2KXBt9fSpymYHxHfvhUpjUFyzrmN4c4P8mwIzweLyvqntBT3k0YGZJSriOdjfUjwSygrfEwiuPI1EMrvgrOMJw==} + '@cspell/dict-latex@5.0.0': + resolution: {integrity: sha512-HUrIqUVohM6P0+5b7BsdAdb0STIv0aaFBvguI7pLcreljlcX3FSPUxea7ticzNlCNeVrEaiEn/ws9m6rYUeuNw==} + '@cspell/dict-lorem-ipsum@4.0.4': resolution: {integrity: sha512-+4f7vtY4dp2b9N5fn0za/UR0kwFq2zDtA62JCbWHbpjvO9wukkbl4rZg4YudHbBgkl73HRnXFgCiwNhdIA1JPw==} + '@cspell/dict-lorem-ipsum@4.0.5': + resolution: {integrity: sha512-9a4TJYRcPWPBKkQAJ/whCu4uCAEgv/O2xAaZEI0n4y1/l18Yyx8pBKoIX5QuVXjjmKEkK7hi5SxyIsH7pFEK9Q==} + '@cspell/dict-lua@4.0.7': resolution: {integrity: sha512-Wbr7YSQw+cLHhTYTKV6cAljgMgcY+EUAxVIZW3ljKswEe4OLxnVJ7lPqZF5JKjlXdgCjbPSimsHqyAbC5pQN/Q==} + '@cspell/dict-lua@4.0.8': + resolution: {integrity: sha512-N4PkgNDMu9JVsRu7JBS/3E/dvfItRgk9w5ga2dKq+JupP2Y3lojNaAVFhXISh4Y0a6qXDn2clA6nvnavQ/jjLA==} + '@cspell/dict-makefile@1.0.4': resolution: {integrity: sha512-E4hG/c0ekPqUBvlkrVvzSoAA+SsDA9bLi4xSV3AXHTVru7Y2bVVGMPtpfF+fI3zTkww/jwinprcU1LSohI3ylw==} + '@cspell/dict-makefile@1.0.5': + resolution: {integrity: sha512-4vrVt7bGiK8Rx98tfRbYo42Xo2IstJkAF4tLLDMNQLkQ86msDlYSKG1ZCk8Abg+EdNcFAjNhXIiNO+w4KflGAQ==} + + '@cspell/dict-markdown@2.0.14': + resolution: {integrity: sha512-uLKPNJsUcumMQTsZZgAK9RgDLyQhUz/uvbQTEkvF/Q4XfC1i/BnA8XrOrd0+Vp6+tPOKyA+omI5LRWfMu5K/Lw==} + peerDependencies: + '@cspell/dict-css': ^4.0.19 + '@cspell/dict-html': ^4.0.14 + '@cspell/dict-html-symbol-entities': ^4.0.5 + '@cspell/dict-typescript': ^3.2.3 + '@cspell/dict-markdown@2.0.9': resolution: {integrity: sha512-j2e6Eg18BlTb1mMP1DkyRFMM/FLS7qiZjltpURzDckB57zDZbUyskOFdl4VX7jItZZEeY0fe22bSPOycgS1Z5A==} peerDependencies: @@ -870,76 +1052,158 @@ packages: '@cspell/dict-monkeyc@1.0.10': resolution: {integrity: sha512-7RTGyKsTIIVqzbvOtAu6Z/lwwxjGRtY5RkKPlXKHEoEAgIXwfDxb5EkVwzGQwQr8hF/D3HrdYbRT8MFBfsueZw==} + '@cspell/dict-monkeyc@1.0.12': + resolution: {integrity: sha512-MN7Vs11TdP5mbdNFQP5x2Ac8zOBm97ARg6zM5Sb53YQt/eMvXOMvrep7+/+8NJXs0jkp70bBzjqU4APcqBFNAw==} + '@cspell/dict-node@5.0.6': resolution: {integrity: sha512-CEbhPCpxGvRNByGolSBTrXXW2rJA4bGqZuTx1KKO85mwR6aadeOmUE7xf/8jiCkXSy+qvr9aJeh+jlfXcsrziQ==} + '@cspell/dict-node@5.0.9': + resolution: {integrity: sha512-hO+ga+uYZ/WA4OtiMEyKt5rDUlUyu3nXMf8KVEeqq2msYvAPdldKBGH7lGONg6R/rPhv53Rb+0Y1SLdoK1+7wQ==} + '@cspell/dict-npm@5.1.31': resolution: {integrity: sha512-Oh9nrhgNV4UD1hlbgO3TFQqQRKziwc7qXKoQiC4oqOYIhMs2WL9Ezozku7FY1e7o5XbCIZX9nRH0ymNx/Rwj6w==} + '@cspell/dict-npm@5.2.31': + resolution: {integrity: sha512-+HoFoFe53pL0wDuSHRs5L+CcDMaG5sLfjKLPT4H0VdwNzho3HLOohTCZr6cYt7OEbXf3xi4YXBkamCy38xOpjA==} + '@cspell/dict-php@4.0.14': resolution: {integrity: sha512-7zur8pyncYZglxNmqsRycOZ6inpDoVd4yFfz1pQRe5xaRWMiK3Km4n0/X/1YMWhh3e3Sl/fQg5Axb2hlN68t1g==} + '@cspell/dict-php@4.1.1': + resolution: {integrity: sha512-EXelI+4AftmdIGtA8HL8kr4WlUE11OqCSVlnIgZekmTkEGSZdYnkFdiJ5IANSALtlQ1mghKjz+OFqVs6yowgWA==} + '@cspell/dict-powershell@5.0.14': resolution: {integrity: sha512-ktjjvtkIUIYmj/SoGBYbr3/+CsRGNXGpvVANrY0wlm/IoGlGywhoTUDYN0IsGwI2b8Vktx3DZmQkfb3Wo38jBA==} + '@cspell/dict-powershell@5.0.15': + resolution: {integrity: sha512-l4S5PAcvCFcVDMJShrYD0X6Huv9dcsQPlsVsBGbH38wvuN7gS7+GxZFAjTNxDmTY1wrNi1cCatSg6Pu2BW4rgg==} + '@cspell/dict-public-licenses@2.0.13': resolution: {integrity: sha512-1Wdp/XH1ieim7CadXYE7YLnUlW0pULEjVl9WEeziZw3EKCAw8ZI8Ih44m4bEa5VNBLnuP5TfqC4iDautAleQzQ==} + '@cspell/dict-public-licenses@2.0.15': + resolution: {integrity: sha512-cJEOs901H13Pfy0fl4dCD1U+xpWIMaEPq8MeYU83FfDZvellAuSo4GqWCripfIqlhns/L6+UZEIJSOZnjgy7Wg==} + '@cspell/dict-python@4.2.16': resolution: {integrity: sha512-LkQssFt1hPOWXIQiD8ScTkz/41RL7Ti0V/2ytUzEW82dc0atIEksrBg8MuOjWXktp0Dk5tDwRLgmIvhV3CFFOA==} + '@cspell/dict-python@4.2.25': + resolution: {integrity: sha512-hDdN0YhKgpbtZVRjQ2c8jk+n0wQdidAKj1Fk8w7KEHb3YlY5uPJ0mAKJk7AJKPNLOlILoUmN+HAVJz+cfSbWYg==} + '@cspell/dict-r@2.1.0': resolution: {integrity: sha512-k2512wgGG0lTpTYH9w5Wwco+lAMf3Vz7mhqV8+OnalIE7muA0RSuD9tWBjiqLcX8zPvEJr4LdgxVju8Gk3OKyA==} + '@cspell/dict-r@2.1.1': + resolution: {integrity: sha512-71Ka+yKfG4ZHEMEmDxc6+blFkeTTvgKbKAbwiwQAuKl3zpqs1Y0vUtwW2N4b3LgmSPhV3ODVY0y4m5ofqDuKMw==} + '@cspell/dict-ruby@5.0.8': resolution: {integrity: sha512-ixuTneU0aH1cPQRbWJvtvOntMFfeQR2KxT8LuAv5jBKqQWIHSxzGlp+zX3SVyoeR0kOWiu64/O5Yn836A5yMcQ==} + '@cspell/dict-ruby@5.1.0': + resolution: {integrity: sha512-9PJQB3cfkBULrMLp5kSAcFPpzf8oz9vFN+QYZABhQwWkGbuzCIXSorHrmWSASlx4yejt3brjaWS57zZ/YL5ZQQ==} + '@cspell/dict-rust@4.0.11': resolution: {integrity: sha512-OGWDEEzm8HlkSmtD8fV3pEcO2XBpzG2XYjgMCJCRwb2gRKvR+XIm6Dlhs04N/K2kU+iH8bvrqNpM8fS/BFl0uw==} + '@cspell/dict-rust@4.1.1': + resolution: {integrity: sha512-fXiXnZH0wOaEVTKFRNaz6TsUGhuB8dAT0ubYkDNzRQCaV5JGSOebGb1v2x5ZrOSVp+moxWM/vdBfiNU6KOEaFQ==} + '@cspell/dict-scala@5.0.7': resolution: {integrity: sha512-yatpSDW/GwulzO3t7hB5peoWwzo+Y3qTc0pO24Jf6f88jsEeKmDeKkfgPbYuCgbE4jisGR4vs4+jfQZDIYmXPA==} + '@cspell/dict-scala@5.0.9': + resolution: {integrity: sha512-AjVcVAELgllybr1zk93CJ5wSUNu/Zb5kIubymR/GAYkMyBdYFCZ3Zbwn4Zz8GJlFFAbazABGOu0JPVbeY59vGg==} + '@cspell/dict-shell@1.1.0': resolution: {integrity: sha512-D/xHXX7T37BJxNRf5JJHsvziFDvh23IF/KvkZXNSh8VqcRdod3BAz9VGHZf6VDqcZXr1VRqIYR3mQ8DSvs3AVQ==} + '@cspell/dict-shell@1.1.2': + resolution: {integrity: sha512-WqOUvnwcHK1X61wAfwyXq04cn7KYyskg90j4lLg3sGGKMW9Sq13hs91pqrjC44Q+lQLgCobrTkMDw9Wyl9nRFA==} + '@cspell/dict-software-terms@4.2.5': resolution: {integrity: sha512-CaRzkWti3AgcXoxuRcMijaNG7YUk/MH1rHjB8VX34v3UdCxXXeqvRyElRKnxhFeVLB/robb2UdShqh/CpskxRg==} + '@cspell/dict-software-terms@5.1.20': + resolution: {integrity: sha512-TEk1xHvetTI4pv7Vzje1D322m6QEjaH2P6ucOOf6q7EJCppQIdC0lZSXkgHJAFU5HGSvEXSzvnVeW2RHW86ziQ==} + '@cspell/dict-sql@2.2.0': resolution: {integrity: sha512-MUop+d1AHSzXpBvQgQkCiok8Ejzb+nrzyG16E8TvKL2MQeDwnIvMe3bv90eukP6E1HWb+V/MA/4pnq0pcJWKqQ==} + '@cspell/dict-sql@2.2.1': + resolution: {integrity: sha512-qDHF8MpAYCf4pWU8NKbnVGzkoxMNrFqBHyG/dgrlic5EQiKANCLELYtGlX5auIMDLmTf1inA0eNtv74tyRJ/vg==} + '@cspell/dict-svelte@1.0.6': resolution: {integrity: sha512-8LAJHSBdwHCoKCSy72PXXzz7ulGROD0rP1CQ0StOqXOOlTUeSFaJJlxNYjlONgd2c62XBQiN2wgLhtPN+1Zv7Q==} + '@cspell/dict-svelte@1.0.7': + resolution: {integrity: sha512-hGZsGqP0WdzKkdpeVLBivRuSNzOTvN036EBmpOwxH+FTY2DuUH7ecW+cSaMwOgmq5JFSdTcbTNFlNC8HN8lhaQ==} + '@cspell/dict-swift@2.0.5': resolution: {integrity: sha512-3lGzDCwUmnrfckv3Q4eVSW3sK3cHqqHlPprFJZD4nAqt23ot7fic5ALR7J4joHpvDz36nHX34TgcbZNNZOC/JA==} + '@cspell/dict-swift@2.0.6': + resolution: {integrity: sha512-PnpNbrIbex2aqU1kMgwEKvCzgbkHtj3dlFLPMqW1vSniop7YxaDTtvTUO4zA++ugYAEL+UK8vYrBwDPTjjvSnA==} + '@cspell/dict-terraform@1.1.1': resolution: {integrity: sha512-07KFDwCU7EnKl4hOZLsLKlj6Zceq/IsQ3LRWUyIjvGFfZHdoGtFdCp3ZPVgnFaAcd/DKv+WVkrOzUBSYqHopQQ==} + '@cspell/dict-terraform@1.1.3': + resolution: {integrity: sha512-gr6wxCydwSFyyBKhBA2xkENXtVFToheqYYGFvlMZXWjviynXmh+NK/JTvTCk/VHk3+lzbO9EEQKee6VjrAUSbA==} + '@cspell/dict-typescript@3.2.0': resolution: {integrity: sha512-Pk3zNePLT8qg51l0M4g1ISowYAEGxTuNfZlgkU5SvHa9Cu7x/BWoyYq9Fvc3kAyoisCjRPyvWF4uRYrPitPDFw==} + '@cspell/dict-typescript@3.2.3': + resolution: {integrity: sha512-zXh1wYsNljQZfWWdSPYwQhpwiuW0KPW1dSd8idjMRvSD0aSvWWHoWlrMsmZeRl4qM4QCEAjua8+cjflm41cQBg==} + '@cspell/dict-vue@3.0.4': resolution: {integrity: sha512-0dPtI0lwHcAgSiQFx8CzvqjdoXROcH+1LyqgROCpBgppommWpVhbQ0eubnKotFEXgpUCONVkeZJ6Ql8NbTEu+w==} + '@cspell/dict-vue@3.0.5': + resolution: {integrity: sha512-Mqutb8jbM+kIcywuPQCCaK5qQHTdaByoEO2J9LKFy3sqAdiBogNkrplqUK0HyyRFgCfbJUgjz3N85iCMcWH0JA==} + + '@cspell/dict-zig@1.0.0': + resolution: {integrity: sha512-XibBIxBlVosU06+M6uHWkFeT0/pW5WajDRYdXG2CgHnq85b0TI/Ks0FuBJykmsgi2CAD3Qtx8UHFEtl/DSFnAQ==} + '@cspell/dynamic-import@8.17.5': resolution: {integrity: sha512-tY+cVkRou+0VKvH+K1NXv8/R7mOlW3BDGSs9fcgvhatj0m00Yf8blFC7tE4VVI9Qh2bkC/KDFqM24IqZbuwXUQ==} engines: {node: '>=18.0'} + '@cspell/dynamic-import@9.6.2': + resolution: {integrity: sha512-DY/X6lsdK4aeJ4erPVZoU1ccEXqtnYqWCMUXZOsMeIsZlXwZz/ocNNd09A4ga9IzGj1lYsB13UG4GVe8lSMAXQ==} + engines: {node: '>=20'} + + '@cspell/eslint-plugin@9.6.2': + resolution: {integrity: sha512-OWRMahry4LNvG0qQB3Ux1ZakJw9n5VrQ+93ZL1Nw5/EjwULRRnqpfOCJNGQy5LQKx9bwoZulOTrsyy5vqIY37Q==} + engines: {node: '>=20'} + peerDependencies: + eslint: ^7 || ^8 || ^9 + '@cspell/filetypes@8.17.5': resolution: {integrity: sha512-Fj6py2Rl+FEnMiXhRQUM1A5QmyeCLxi6dY/vQ0qfH6tp6KSaBiaC8wuPUKhr8hKyTd3+8lkUbobDhUf6xtMEXg==} engines: {node: '>=18'} + '@cspell/filetypes@9.6.2': + resolution: {integrity: sha512-XYAuGZoRCUf4Y12YP+K0BpU3QUMj4Z4SkKpi08Dwx/bQlq/NqycHKkUWYhlViHLav1+MJbWxcvDIHxGNv0UIaA==} + engines: {node: '>=20'} + '@cspell/strong-weak-map@8.17.5': resolution: {integrity: sha512-Z4eo+rZJr1086wZWycBiIG/n7gGvVoqn28I7ZicS8xedRYu/4yp2loHgLn4NpxG3e46+dNWs4La6vinod+UydQ==} engines: {node: '>=18'} + '@cspell/strong-weak-map@9.6.2': + resolution: {integrity: sha512-7zpnLkpT91wsH4aU3oAprnzrURvBWKq97j5i/SWXGuNKf36XNEO4HaeaPp6L2oVq4OzdUOdm0tUK1gB0HhMWSg==} + engines: {node: '>=20'} + '@cspell/url@8.17.5': resolution: {integrity: sha512-GNQqST7zI85dAFVyao6oiTeg5rNhO9FH1ZAd397qQhvwfxrrniNfuoewu8gPXyP0R4XBiiaCwhBL7w9S/F5guw==} engines: {node: '>=18.0'} + '@cspell/url@9.6.2': + resolution: {integrity: sha512-625EiP1jUOQZ6UQuTUV1XB8Bxa18z3EtC1qA6PJyM3TqUD8PD8Tz183j9av6d/Dq52+7w0F4ovuqjUcTXTfD6g==} + engines: {node: '>=20'} + '@csstools/cascade-layer-name-parser@2.0.4': resolution: {integrity: sha512-7DFHlPuIxviKYZrOiwVU/PiHLm3lLUR23OMuEEtfEOQTOp9hzQ2JjdY6X5H18RVuUPJqSCI+qNnD5iOLMVE0bA==} engines: {node: '>=18'} @@ -1242,6 +1506,12 @@ packages: resolution: {integrity: sha512-X9GYgruZBSOozg4w4dzv9uOz8oK/EpPVQXkp0MM6Tsgp/nRIU9hJzJ0Pxg1aRa3xCeEQTOimZHcocQFlLwYajQ==} engines: {node: '>=18.0'} + '@docusaurus/eslint-plugin@3.9.2': + resolution: {integrity: sha512-LnCrmrR4EtzpSiq6aoSfiY0Lf8P0WslGbBFZJ0olKXJIMxey8dpKevT1K/+tN87Lbn2H/VrdGGSPGlfVKmihAQ==} + engines: {node: '>=20.0'} + peerDependencies: + eslint: '>=6' + '@docusaurus/logger@3.7.0': resolution: {integrity: sha512-z7g62X7bYxCYmeNNuO9jmzxLQG95q9QxINCwpboVcNff3SJiHJbGrarxxOVMVmAh1MsrSfxWkVGv4P41ktnFsA==} engines: {node: '>=18.0'} @@ -1393,12 +1663,74 @@ packages: resolution: {integrity: sha512-e7zcB6TPnVzyUaHMJyLSArKa2AG3h9+4CfvKXKKWNx6hRs+p0a+u7HHTJBgo6KW2m+vqDnuIHK4X+bhmoghAFA==} engines: {node: '>=18.0'} + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/css-tree@3.6.8': + resolution: {integrity: sha512-s0f40zY7dlMp8i0Jf0u6l/aSswS0WRAgkhgETgiCJRcxIWb4S/Sp9uScKHWbkM3BnoFLbJbmOYk5AZUDFVxaLA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + '@eslint/css@0.14.1': + resolution: {integrity: sha512-NXiteSacmpaXqgyIW3+GcNzexXyfC0kd+gig6WTjD4A74kBGJeNx1tV0Hxa0v7x0+mnIyKfGPhGNs1uhRFdh+w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.3': + resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.39.2': + resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@hapi/hoek@9.3.0': resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} '@hapi/topo@5.1.0': resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1460,6 +1792,10 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@pkgr/core@0.2.9': + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@pnpm/config.env-replace@1.1.0': resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} engines: {node: '>=12.22.0'} @@ -1524,6 +1860,9 @@ packages: rollup: optional: true + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + '@sideway/address@4.1.5': resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} @@ -1726,6 +2065,9 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/mdast@3.0.15': resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} @@ -1783,6 +2125,9 @@ packages: '@types/sax@1.2.7': resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + '@types/send@0.17.4': resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} @@ -1813,6 +2158,33 @@ packages: '@types/yargs@17.0.33': resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + '@typescript-eslint/scope-manager@5.62.0': + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/types@5.62.0': + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/typescript-estree@5.62.0': + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@5.62.0': + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@5.62.0': + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} @@ -1885,6 +2257,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + address@1.2.2: resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} engines: {node: '>= 10.0.0'} @@ -1983,6 +2360,10 @@ packages: array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + array-timsort@1.0.3: resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} @@ -1990,6 +2371,26 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + arraybuffer.prototype.slice@1.0.4: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} @@ -2278,6 +2679,10 @@ packages: resolution: {integrity: sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw==} engines: {node: '>= 6'} + comment-json@4.5.1: + resolution: {integrity: sha512-taEtr3ozUmOB7it68Jll7s0Pwm+aoiHyXKrEC8SEodL4rNpdfDLqa7PfBlrgFoCNNdR8ImL+muti5IGvktJAAg==} + engines: {node: '>= 6'} + common-path-prefix@3.0.0: resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} @@ -2387,10 +2792,18 @@ packages: resolution: {integrity: sha512-XDc+UJO5RZ9S9e2Ajz332XjT7dv6Og2UqCiSnAlvHt7t/MacLHSPARZFIivheObNkWZ7E1iWI681RxKoH4o40w==} engines: {node: '>=18'} + cspell-config-lib@9.6.2: + resolution: {integrity: sha512-VQB+xmqGqCJrt5k/o0rRG9v0X0CA96CEd9FsmBAm5+9DvNiRzXOqewZSdsOM2Y0SX7YKcvG82PfRsujhYltcfQ==} + engines: {node: '>=20'} + cspell-dictionary@8.17.5: resolution: {integrity: sha512-O/Uuhv1RuDu+5WYQml0surudweaTvr+2YJSmPSdlihByUSiogCbpGqwrRow7wQv/C5p1W1FlFjotvUfoR0fxHA==} engines: {node: '>=18'} + cspell-dictionary@9.6.2: + resolution: {integrity: sha512-J55/9+AtkRzfSVn+KaqoWxsS4O66szKP6LrDW0O2qWnuvVvO1BoAMsINynD845IIzrd1n1yTOHS/DbjmHd4//A==} + engines: {node: '>=20'} + cspell-gitignore@8.17.5: resolution: {integrity: sha512-I27fgOUZzH14jeIYo65LooB60fZ42f6OJL1lOR9Mk6IrIlDyUtzherGR+xx5KshK2katYkX42Qu4zsVYM6VFPA==} engines: {node: '>=18'} @@ -2400,23 +2813,46 @@ packages: resolution: {integrity: sha512-OXquou7UykInlGV5et5lNKYYrW0dwa28aEF995x1ocANND7o0bbHmFlbgyci/Lp4uFQai8sifmfFJbuIg2IC/A==} engines: {node: '>=18'} + cspell-glob@9.6.2: + resolution: {integrity: sha512-5j+g4JzcWjW16ZAtcPHpG138CEfpp1YmuYJoYtze3lIZLgttt+k2gXJsqyWaP/6MdVknI0Q1afGSKYRtH8mLRA==} + engines: {node: '>=20'} + cspell-grammar@8.17.5: resolution: {integrity: sha512-st2n+FVw25MvMbsGb3TeJNRr6Oih4g14rjOd/UJN0qn+ceH360SAShUFqSd4kHHu2ADazI/TESFU6FRtMTPNOg==} engines: {node: '>=18'} hasBin: true + cspell-grammar@9.6.2: + resolution: {integrity: sha512-JTH92+1VGFPb3UsDT+Ezur/ouR8t+XOZkETUkk8eoSBzli9hWgPHW7kl2T8Chcn+Dq/6FLlvezYbBvhSauqJRw==} + engines: {node: '>=20'} + hasBin: true + cspell-io@8.17.5: resolution: {integrity: sha512-oevM/8l0s6nc1NCYPqNFumrW50QSHoa6wqUT8cWs09gtZdE2AWG0U6bIE8ZEVz6e6FxS+6IenGKTdUUwP0+3fg==} engines: {node: '>=18'} + cspell-io@9.6.2: + resolution: {integrity: sha512-VRBkAfUdbaq5yDYoVMvodQF3bIdBL6Gy4tiMvf+UI9C16am47AuThg1gGXRzwi5hCEXnCfevAmuVdaQP3onkow==} + engines: {node: '>=20'} + cspell-lib@8.17.5: resolution: {integrity: sha512-S3KuOrcST1d2BYmTXA+hnbRdho5n3w5GUvEaCx3QZQBwAPfLpAwJbe2yig1TxBpyEJ5LqP02i/mDg1pUCOP0hQ==} engines: {node: '>=18'} + cspell-lib@9.6.2: + resolution: {integrity: sha512-LvValIwqDAwVp2Www+7PPJ7UbVurYtKGPddpGH7GN+0u+UWzR4oUXR80gY8lHgSrIQ3EkdLhFAItPcyMjGjzIg==} + engines: {node: '>=20'} + cspell-trie-lib@8.17.5: resolution: {integrity: sha512-9hjI3nRQxtGEua6CgnLbK3sGHLx9dXR/BHwI/csRL4dN5GGRkE5X3CCoy1RJVL7iGFLIzi43+L10xeFRmWniKw==} engines: {node: '>=18'} + cspell-trie-lib@9.6.2: + resolution: {integrity: sha512-JpCHpMdxo680yEkb6U1y3wrhZGHltgCnaQ8Zj6yKE8KE0BTLVl9UQGisP5De1wlFn4GtpPCf7WtQ8+M5aqq3YQ==} + engines: {node: '>=20'} + peerDependencies: + '@cspell/cspell-types': 9.6.2 + cspell@8.17.5: resolution: {integrity: sha512-l3Cfp87d7Yrodem675irdxV6+7+OsdR+jNwYHe33Dgnd6ePEfooYrvmfGdXF9rlQrNLUQp/HqYgHJzSq19UEsg==} engines: {node: '>=18'} @@ -2717,6 +3153,14 @@ packages: supports-color: optional: true + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -2726,6 +3170,15 @@ packages: supports-color: optional: true + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decode-named-character-reference@1.1.0: resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} @@ -2737,6 +3190,9 @@ packages: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -2812,6 +3268,10 @@ packages: resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} engines: {node: '>=6'} + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dom-converter@0.2.0: resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} @@ -2918,6 +3378,10 @@ packages: resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} engines: {node: '>= 0.4'} + es-abstract@1.24.1: + resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} + engines: {node: '>= 0.4'} + es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -2926,6 +3390,10 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} + es-iterator-helpers@1.2.2: + resolution: {integrity: sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==} + engines: {node: '>= 0.4'} + es-module-lexer@1.6.0: resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} @@ -2937,6 +3405,10 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + es-to-primitive@1.3.0: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} @@ -2970,15 +3442,114 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} + eslint-config-prettier@10.1.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-module-utils@2.12.1: + resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-import@2.32.0: + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-prettier@5.5.5: + resolution: {integrity: sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + + eslint-plugin-unused-imports@4.3.0: + resolution: {integrity: sha512-ZFBmXMGBYfHttdRtOG9nFFpmUvMtbHSjsKrS20vdWdbfiVYsO3yA2SGYy9i9XmZJDfMGBflZGBCm70SEnFQtOA==} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 + eslint: ^9.0.0 || ^8.0.0 + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.39.2: + resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -3065,10 +3636,17 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + fast-equals@5.2.2: resolution: {integrity: sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==} engines: {node: '>=6.0.0'} + fast-equals@6.0.0: + resolution: {integrity: sha512-PFhhIGgdM79r5Uztdj9Zb6Tt1zKafqVfdMGwVca1z5z6fbX7DmsySSuJd8HiP6I1j505DCS83cLxo5rmSNeVEA==} + engines: {node: '>=6.0.0'} + fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -3080,6 +3658,9 @@ packages: fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-uri@3.0.6: resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} @@ -3109,6 +3690,10 @@ packages: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + file-entry-cache@9.1.0: resolution: {integrity: sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==} engines: {node: '>=18'} @@ -3154,6 +3739,10 @@ packages: resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + flat-cache@5.0.0: resolution: {integrity: sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==} engines: {node: '>=18'} @@ -3248,6 +3837,10 @@ packages: resolution: {integrity: sha512-47Frx13aZh01afHJTB3zTtKIlFI6vWY+MYCN9Qpew6i52rfKjnhCF/l1YlC8UmEMvvntZZ6z4PiCcmyuedR2aQ==} engines: {node: '>=18'} + gensequence@8.0.8: + resolution: {integrity: sha512-omMVniXEXpdx/vKxGnPRoO2394Otlze28TyxECbFVyoSpZ9H3EO7lemjcB12OpQJzRW4e5tt/dL1rOxry6aMHg==} + engines: {node: '>=20'} + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -3318,6 +3911,14 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@17.2.0: + resolution: {integrity: sha512-tovnCz/fEq+Ripoq+p/gN1u7l6A7wwkoBT9pRCzTHzsD/LvADIzXZdjmRymh5Ztf0DYC3Rwg5cZRYjxzBmzbWg==} + engines: {node: '>=18'} + globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} @@ -3546,6 +4147,9 @@ packages: import-meta-resolve@4.1.0: resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -3707,6 +4311,10 @@ packages: is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + is-npm@6.0.0: resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3822,6 +4430,10 @@ packages: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} + jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -3860,6 +4472,10 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + jsesc@3.0.2: resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} engines: {node: '>=6'} @@ -3888,6 +4504,13 @@ packages: json-schema@0.4.0: resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -3903,6 +4526,10 @@ packages: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + katex@0.16.11: resolution: {integrity: sha512-RQrI8rlHY92OLf3rho/Ts8i/XvjgguEjOkO1BEXcU3N8BqPpSzBNwV/G0Ukr+P/l3ivvJUE/Fa/CwbS6HesGNQ==} hasBin: true @@ -3939,6 +4566,10 @@ packages: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -3982,6 +4613,9 @@ packages: lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} @@ -4111,6 +4745,9 @@ packages: mdn-data@2.0.30: resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + mdn-data@2.23.0: + resolution: {integrity: sha512-786vq1+4079JSeu2XdcDjrhi/Ry7BWtjDl9WtGPWLiIHb2T66GvIVflZTBoSNZ5JqTtJGYEVMuFA/lbQlMOyDQ==} + mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} @@ -4404,6 +5041,9 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} @@ -4476,6 +5116,22 @@ packages: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} @@ -4502,6 +5158,10 @@ packages: resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} hasBin: true + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + own-keys@1.0.1: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} @@ -4638,6 +5298,10 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + pkg-dir@7.0.0: resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} engines: {node: '>=14.16'} @@ -5041,6 +5705,19 @@ packages: resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.1: + resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} + engines: {node: '>=6.0.0'} + + prettier@3.8.1: + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + engines: {node: '>=14'} + hasBin: true + pretty-bytes@5.6.0: resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} engines: {node: '>=6'} @@ -5336,6 +6013,10 @@ packages: engines: {node: '>= 0.4'} hasBin: true + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + responselike@3.0.0: resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} engines: {node: '>=14.16'} @@ -5556,6 +6237,10 @@ packages: smob@1.5.0: resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} + smol-toml@1.6.0: + resolution: {integrity: sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==} + engines: {node: '>= 18'} + snake-case@3.0.4: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} @@ -5618,6 +6303,10 @@ packages: std-env@3.8.1: resolution: {integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==} + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -5630,6 +6319,9 @@ packages: resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} engines: {node: '>= 0.4'} + string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + string.prototype.trim@1.2.10: resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'} @@ -5667,6 +6359,10 @@ packages: resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} engines: {node: '>=0.10.0'} + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + strip-comments@2.0.1: resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} engines: {node: '>=10'} @@ -5718,6 +6414,10 @@ packages: engines: {node: '>=14.0.0'} hasBin: true + synckit@0.11.12: + resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} + engines: {node: ^14.18.0 || >=16.0.0} + tapable@1.1.3: resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} engines: {node: '>=6'} @@ -5796,9 +6496,25 @@ packages: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + type-fest@0.16.0: resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} engines: {node: '>=10'} @@ -6100,6 +6816,10 @@ packages: wildcard@2.0.1: resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + workbox-background-sync@7.3.0: resolution: {integrity: sha512-PCSk3eK7Mxeuyatb22pcSx9dlgWNv3+M8PqPaYDokks8Y5/FX4soaOqj3yhAZr5k6Q5JWTOMYgaJBpbw11G9Eg==} @@ -6207,6 +6927,11 @@ packages: engines: {node: '>= 14'} hasBin: true + yaml@2.8.2: + resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + engines: {node: '>= 14.6'} + hasBin: true + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -7144,98 +7869,257 @@ snapshots: '@cspell/dict-typescript': 3.2.0 '@cspell/dict-vue': 3.0.4 + '@cspell/cspell-bundled-dicts@9.6.2': + dependencies: + '@cspell/dict-ada': 4.1.1 + '@cspell/dict-al': 1.1.1 + '@cspell/dict-aws': 4.0.17 + '@cspell/dict-bash': 4.2.2 + '@cspell/dict-companies': 3.2.10 + '@cspell/dict-cpp': 7.0.2 + '@cspell/dict-cryptocurrencies': 5.0.5 + '@cspell/dict-csharp': 4.0.8 + '@cspell/dict-css': 4.0.19 + '@cspell/dict-dart': 2.3.2 + '@cspell/dict-data-science': 2.0.13 + '@cspell/dict-django': 4.1.6 + '@cspell/dict-docker': 1.1.17 + '@cspell/dict-dotnet': 5.0.11 + '@cspell/dict-elixir': 4.0.8 + '@cspell/dict-en-common-misspellings': 2.1.12 + '@cspell/dict-en-gb-mit': 3.1.16 + '@cspell/dict-en_us': 4.4.27 + '@cspell/dict-filetypes': 3.0.15 + '@cspell/dict-flutter': 1.1.1 + '@cspell/dict-fonts': 4.0.5 + '@cspell/dict-fsharp': 1.1.1 + '@cspell/dict-fullstack': 3.2.8 + '@cspell/dict-gaming-terms': 1.1.2 + '@cspell/dict-git': 3.1.0 + '@cspell/dict-golang': 6.0.26 + '@cspell/dict-google': 1.0.9 + '@cspell/dict-haskell': 4.0.6 + '@cspell/dict-html': 4.0.14 + '@cspell/dict-html-symbol-entities': 4.0.5 + '@cspell/dict-java': 5.0.12 + '@cspell/dict-julia': 1.1.1 + '@cspell/dict-k8s': 1.0.12 + '@cspell/dict-kotlin': 1.1.1 + '@cspell/dict-latex': 5.0.0 + '@cspell/dict-lorem-ipsum': 4.0.5 + '@cspell/dict-lua': 4.0.8 + '@cspell/dict-makefile': 1.0.5 + '@cspell/dict-markdown': 2.0.14(@cspell/dict-css@4.0.19)(@cspell/dict-html-symbol-entities@4.0.5)(@cspell/dict-html@4.0.14)(@cspell/dict-typescript@3.2.3) + '@cspell/dict-monkeyc': 1.0.12 + '@cspell/dict-node': 5.0.9 + '@cspell/dict-npm': 5.2.31 + '@cspell/dict-php': 4.1.1 + '@cspell/dict-powershell': 5.0.15 + '@cspell/dict-public-licenses': 2.0.15 + '@cspell/dict-python': 4.2.25 + '@cspell/dict-r': 2.1.1 + '@cspell/dict-ruby': 5.1.0 + '@cspell/dict-rust': 4.1.1 + '@cspell/dict-scala': 5.0.9 + '@cspell/dict-shell': 1.1.2 + '@cspell/dict-software-terms': 5.1.20 + '@cspell/dict-sql': 2.2.1 + '@cspell/dict-svelte': 1.0.7 + '@cspell/dict-swift': 2.0.6 + '@cspell/dict-terraform': 1.1.3 + '@cspell/dict-typescript': 3.2.3 + '@cspell/dict-vue': 3.0.5 + '@cspell/dict-zig': 1.0.0 + '@cspell/cspell-json-reporter@8.17.5': dependencies: '@cspell/cspell-types': 8.17.5 + '@cspell/cspell-performance-monitor@9.6.2': {} + '@cspell/cspell-pipe@8.17.5': {} + '@cspell/cspell-pipe@9.6.2': {} + '@cspell/cspell-resolver@8.17.5': dependencies: global-directory: 4.0.1 + '@cspell/cspell-resolver@9.6.2': + dependencies: + global-directory: 4.0.1 + '@cspell/cspell-service-bus@8.17.5': {} + '@cspell/cspell-service-bus@9.6.2': {} + '@cspell/cspell-types@8.17.5': {} + '@cspell/cspell-types@9.6.2': {} + '@cspell/dict-ada@4.1.0': {} + '@cspell/dict-ada@4.1.1': {} + '@cspell/dict-al@1.1.0': {} + '@cspell/dict-al@1.1.1': {} + + '@cspell/dict-aws@4.0.17': {} + '@cspell/dict-aws@4.0.9': {} '@cspell/dict-bash@4.2.0': dependencies: '@cspell/dict-shell': 1.1.0 + '@cspell/dict-bash@4.2.2': + dependencies: + '@cspell/dict-shell': 1.1.2 + '@cspell/dict-companies@3.1.14': {} + '@cspell/dict-companies@3.2.10': {} + '@cspell/dict-cpp@6.0.6': {} + '@cspell/dict-cpp@7.0.2': {} + '@cspell/dict-cryptocurrencies@5.0.4': {} + '@cspell/dict-cryptocurrencies@5.0.5': {} + '@cspell/dict-csharp@4.0.6': {} + '@cspell/dict-csharp@4.0.8': {} + '@cspell/dict-css@4.0.17': {} + '@cspell/dict-css@4.0.19': {} + '@cspell/dict-dart@2.3.0': {} + '@cspell/dict-dart@2.3.2': {} + + '@cspell/dict-data-science@2.0.13': {} + '@cspell/dict-data-science@2.0.7': {} '@cspell/dict-django@4.1.4': {} + '@cspell/dict-django@4.1.6': {} + '@cspell/dict-docker@1.1.12': {} + '@cspell/dict-docker@1.1.17': {} + + '@cspell/dict-dotnet@5.0.11': {} + '@cspell/dict-dotnet@5.0.9': {} '@cspell/dict-elixir@4.0.7': {} + '@cspell/dict-elixir@4.0.8': {} + '@cspell/dict-en-common-misspellings@2.0.10': {} + '@cspell/dict-en-common-misspellings@2.1.12': {} + + '@cspell/dict-en-gb-mit@3.1.16': {} + '@cspell/dict-en-gb@1.1.33': {} '@cspell/dict-en_us@4.3.35': {} + '@cspell/dict-en_us@4.4.27': {} + '@cspell/dict-filetypes@3.0.11': {} + '@cspell/dict-filetypes@3.0.15': {} + '@cspell/dict-flutter@1.1.0': {} + '@cspell/dict-flutter@1.1.1': {} + '@cspell/dict-fonts@4.0.4': {} + '@cspell/dict-fonts@4.0.5': {} + '@cspell/dict-fsharp@1.1.0': {} + '@cspell/dict-fsharp@1.1.1': {} + '@cspell/dict-fullstack@3.2.6': {} + '@cspell/dict-fullstack@3.2.8': {} + '@cspell/dict-gaming-terms@1.1.0': {} + '@cspell/dict-gaming-terms@1.1.2': {} + '@cspell/dict-git@3.0.4': {} + '@cspell/dict-git@3.1.0': {} + '@cspell/dict-golang@6.0.19': {} + '@cspell/dict-golang@6.0.26': {} + '@cspell/dict-google@1.0.8': {} + '@cspell/dict-google@1.0.9': {} + '@cspell/dict-haskell@4.0.5': {} + '@cspell/dict-haskell@4.0.6': {} + '@cspell/dict-html-symbol-entities@4.0.3': {} + '@cspell/dict-html-symbol-entities@4.0.5': {} + '@cspell/dict-html@4.0.11': {} + '@cspell/dict-html@4.0.14': {} + '@cspell/dict-java@5.0.11': {} + '@cspell/dict-java@5.0.12': {} + '@cspell/dict-julia@1.1.0': {} + '@cspell/dict-julia@1.1.1': {} + '@cspell/dict-k8s@1.0.10': {} + '@cspell/dict-k8s@1.0.12': {} + '@cspell/dict-kotlin@1.1.0': {} + '@cspell/dict-kotlin@1.1.1': {} + '@cspell/dict-latex@4.0.3': {} + '@cspell/dict-latex@5.0.0': {} + '@cspell/dict-lorem-ipsum@4.0.4': {} + '@cspell/dict-lorem-ipsum@4.0.5': {} + '@cspell/dict-lua@4.0.7': {} + '@cspell/dict-lua@4.0.8': {} + '@cspell/dict-makefile@1.0.4': {} + '@cspell/dict-makefile@1.0.5': {} + + '@cspell/dict-markdown@2.0.14(@cspell/dict-css@4.0.19)(@cspell/dict-html-symbol-entities@4.0.5)(@cspell/dict-html@4.0.14)(@cspell/dict-typescript@3.2.3)': + dependencies: + '@cspell/dict-css': 4.0.19 + '@cspell/dict-html': 4.0.14 + '@cspell/dict-html-symbol-entities': 4.0.5 + '@cspell/dict-typescript': 3.2.3 + '@cspell/dict-markdown@2.0.9(@cspell/dict-css@4.0.17)(@cspell/dict-html-symbol-entities@4.0.3)(@cspell/dict-html@4.0.11)(@cspell/dict-typescript@3.2.0)': dependencies: '@cspell/dict-css': 4.0.17 @@ -7245,55 +8129,116 @@ snapshots: '@cspell/dict-monkeyc@1.0.10': {} + '@cspell/dict-monkeyc@1.0.12': {} + '@cspell/dict-node@5.0.6': {} + '@cspell/dict-node@5.0.9': {} + '@cspell/dict-npm@5.1.31': {} + '@cspell/dict-npm@5.2.31': {} + '@cspell/dict-php@4.0.14': {} + '@cspell/dict-php@4.1.1': {} + '@cspell/dict-powershell@5.0.14': {} + '@cspell/dict-powershell@5.0.15': {} + '@cspell/dict-public-licenses@2.0.13': {} + '@cspell/dict-public-licenses@2.0.15': {} + '@cspell/dict-python@4.2.16': dependencies: '@cspell/dict-data-science': 2.0.7 + '@cspell/dict-python@4.2.25': + dependencies: + '@cspell/dict-data-science': 2.0.13 + '@cspell/dict-r@2.1.0': {} + '@cspell/dict-r@2.1.1': {} + '@cspell/dict-ruby@5.0.8': {} + '@cspell/dict-ruby@5.1.0': {} + '@cspell/dict-rust@4.0.11': {} + '@cspell/dict-rust@4.1.1': {} + '@cspell/dict-scala@5.0.7': {} + '@cspell/dict-scala@5.0.9': {} + '@cspell/dict-shell@1.1.0': {} + '@cspell/dict-shell@1.1.2': {} + '@cspell/dict-software-terms@4.2.5': {} + '@cspell/dict-software-terms@5.1.20': {} + '@cspell/dict-sql@2.2.0': {} + '@cspell/dict-sql@2.2.1': {} + '@cspell/dict-svelte@1.0.6': {} + '@cspell/dict-svelte@1.0.7': {} + '@cspell/dict-swift@2.0.5': {} + '@cspell/dict-swift@2.0.6': {} + '@cspell/dict-terraform@1.1.1': {} + '@cspell/dict-terraform@1.1.3': {} + '@cspell/dict-typescript@3.2.0': {} + '@cspell/dict-typescript@3.2.3': {} + '@cspell/dict-vue@3.0.4': {} + '@cspell/dict-vue@3.0.5': {} + + '@cspell/dict-zig@1.0.0': {} + '@cspell/dynamic-import@8.17.5': dependencies: '@cspell/url': 8.17.5 import-meta-resolve: 4.1.0 + '@cspell/dynamic-import@9.6.2': + dependencies: + '@cspell/url': 9.6.2 + import-meta-resolve: 4.2.0 + + '@cspell/eslint-plugin@9.6.2(eslint@9.39.2(jiti@1.21.7))': + dependencies: + '@cspell/cspell-types': 9.6.2 + '@cspell/url': 9.6.2 + cspell-lib: 9.6.2 + eslint: 9.39.2(jiti@1.21.7) + synckit: 0.11.12 + '@cspell/filetypes@8.17.5': {} + '@cspell/filetypes@9.6.2': {} + '@cspell/strong-weak-map@8.17.5': {} + '@cspell/strong-weak-map@9.6.2': {} + '@cspell/url@8.17.5': {} + '@cspell/url@9.6.2': {} + '@csstools/cascade-layer-name-parser@2.0.4(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': dependencies: '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) @@ -7591,7 +8536,7 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/bundler@3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2)': + '@docusaurus/bundler@3.7.0(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2)': dependencies: '@babel/core': 7.26.10 '@docusaurus/babel': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -7612,7 +8557,7 @@ snapshots: postcss: 8.5.3 postcss-loader: 7.3.4(postcss@8.5.3)(typescript@5.8.2)(webpack@5.98.0) postcss-preset-env: 10.1.5(postcss@8.5.3) - react-dev-utils: 12.0.1(typescript@5.8.2)(webpack@5.98.0) + react-dev-utils: 12.0.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.8.2)(webpack@5.98.0) terser-webpack-plugin: 5.3.14(webpack@5.98.0) tslib: 2.8.1 url-loader: 4.1.1(file-loader@6.2.0(webpack@5.98.0))(webpack@5.98.0) @@ -7636,10 +8581,10 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/core@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2)': + '@docusaurus/core@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2)': dependencies: '@docusaurus/babel': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/bundler': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/bundler': 3.7.0(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) '@docusaurus/logger': 3.7.0 '@docusaurus/mdx-loader': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -7666,7 +8611,7 @@ snapshots: p-map: 4.0.0 prompts: 2.4.2 react: 18.3.1 - react-dev-utils: 12.0.1(typescript@5.8.2)(webpack@5.98.0) + react-dev-utils: 12.0.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.8.2)(webpack@5.98.0) react-dom: 18.3.1(react@18.3.1) react-helmet-async: '@slorber/react-helmet-async@1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)' react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)' @@ -7710,6 +8655,15 @@ snapshots: postcss-sort-media-queries: 5.2.0(postcss@8.5.3) tslib: 2.8.1 + '@docusaurus/eslint-plugin@3.9.2(eslint@9.39.2(jiti@1.21.7))(typescript@5.8.2)': + dependencies: + '@typescript-eslint/utils': 5.62.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.8.2) + eslint: 9.39.2(jiti@1.21.7) + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + - typescript + '@docusaurus/logger@3.7.0': dependencies: chalk: 4.1.2 @@ -7770,13 +8724,13 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/plugin-content-blog@3.7.0(@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2)': + '@docusaurus/plugin-content-blog@3.7.0(@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2)': dependencies: - '@docusaurus/core': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/core': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) '@docusaurus/logger': 3.7.0 '@docusaurus/mdx-loader': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/plugin-content-docs': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) - '@docusaurus/theme-common': 3.7.0(@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/plugin-content-docs': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/theme-common': 3.7.0(@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/types': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils-common': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -7814,13 +8768,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2)': + '@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2)': dependencies: - '@docusaurus/core': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/core': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) '@docusaurus/logger': 3.7.0 '@docusaurus/mdx-loader': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/module-type-aliases': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/theme-common': 3.7.0(@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/theme-common': 3.7.0(@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/types': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils-common': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -7856,9 +8810,9 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-content-pages@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2)': + '@docusaurus/plugin-content-pages@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2)': dependencies: - '@docusaurus/core': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/core': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) '@docusaurus/mdx-loader': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/types': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -7889,9 +8843,9 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-debug@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2)': + '@docusaurus/plugin-debug@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2)': dependencies: - '@docusaurus/core': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/core': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) '@docusaurus/types': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) fs-extra: 11.3.0 @@ -7920,9 +8874,9 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-google-analytics@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2)': + '@docusaurus/plugin-google-analytics@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2)': dependencies: - '@docusaurus/core': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/core': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) '@docusaurus/types': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils-validation': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 @@ -7949,9 +8903,9 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-google-gtag@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2)': + '@docusaurus/plugin-google-gtag@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2)': dependencies: - '@docusaurus/core': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/core': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) '@docusaurus/types': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils-validation': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/gtag.js': 0.0.12 @@ -7979,9 +8933,9 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-google-tag-manager@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2)': + '@docusaurus/plugin-google-tag-manager@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2)': dependencies: - '@docusaurus/core': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/core': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) '@docusaurus/types': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils-validation': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 @@ -8008,14 +8962,14 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-pwa@3.7.0(@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2)': + '@docusaurus/plugin-pwa@3.7.0(@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2)': dependencies: '@babel/core': 7.26.10 '@babel/preset-env': 7.26.9(@babel/core@7.26.10) - '@docusaurus/bundler': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) - '@docusaurus/core': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/bundler': 3.7.0(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/core': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) '@docusaurus/logger': 3.7.0 - '@docusaurus/theme-common': 3.7.0(@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/theme-common': 3.7.0(@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/theme-translations': 3.7.0 '@docusaurus/types': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -8054,9 +9008,9 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-sitemap@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2)': + '@docusaurus/plugin-sitemap@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2)': dependencies: - '@docusaurus/core': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/core': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) '@docusaurus/logger': 3.7.0 '@docusaurus/types': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -8088,9 +9042,9 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-svgr@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2)': + '@docusaurus/plugin-svgr@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2)': dependencies: - '@docusaurus/core': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/core': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) '@docusaurus/types': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils-validation': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -8121,21 +9075,21 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/preset-classic@3.7.0(@algolia/client-search@5.21.0)(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(@types/react@19.0.12)(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.8.2)': - dependencies: - '@docusaurus/core': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) - '@docusaurus/plugin-content-blog': 3.7.0(@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) - '@docusaurus/plugin-content-docs': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) - '@docusaurus/plugin-content-pages': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) - '@docusaurus/plugin-debug': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) - '@docusaurus/plugin-google-analytics': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) - '@docusaurus/plugin-google-gtag': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) - '@docusaurus/plugin-google-tag-manager': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) - '@docusaurus/plugin-sitemap': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) - '@docusaurus/plugin-svgr': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) - '@docusaurus/theme-classic': 3.7.0(@types/react@19.0.12)(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) - '@docusaurus/theme-common': 3.7.0(@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/theme-search-algolia': 3.7.0(@algolia/client-search@5.21.0)(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(@types/react@19.0.12)(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.8.2) + '@docusaurus/preset-classic@3.7.0(@algolia/client-search@5.21.0)(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(@types/react@19.0.12)(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.8.2)': + dependencies: + '@docusaurus/core': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/plugin-content-blog': 3.7.0(@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/plugin-content-docs': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/plugin-content-pages': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/plugin-debug': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/plugin-google-analytics': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/plugin-google-gtag': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/plugin-google-tag-manager': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/plugin-sitemap': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/plugin-svgr': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/theme-classic': 3.7.0(@types/react@19.0.12)(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/theme-common': 3.7.0(@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/theme-search-algolia': 3.7.0(@algolia/client-search@5.21.0)(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(@types/react@19.0.12)(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.8.2) '@docusaurus/types': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -8168,16 +9122,16 @@ snapshots: '@types/react': 19.0.12 react: 18.3.1 - '@docusaurus/theme-classic@3.7.0(@types/react@19.0.12)(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2)': + '@docusaurus/theme-classic@3.7.0(@types/react@19.0.12)(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2)': dependencies: - '@docusaurus/core': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/core': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) '@docusaurus/logger': 3.7.0 '@docusaurus/mdx-loader': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/module-type-aliases': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/plugin-content-blog': 3.7.0(@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) - '@docusaurus/plugin-content-docs': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) - '@docusaurus/plugin-content-pages': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) - '@docusaurus/theme-common': 3.7.0(@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/plugin-content-blog': 3.7.0(@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/plugin-content-docs': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/plugin-content-pages': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/theme-common': 3.7.0(@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/theme-translations': 3.7.0 '@docusaurus/types': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -8219,11 +9173,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/theme-common@3.7.0(@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/theme-common@3.7.0(@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@docusaurus/mdx-loader': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/module-type-aliases': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/plugin-content-docs': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/plugin-content-docs': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) '@docusaurus/utils': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils-common': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/history': 4.7.11 @@ -8244,11 +9198,11 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/theme-mermaid@3.7.0(@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2)': + '@docusaurus/theme-mermaid@3.7.0(@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2)': dependencies: - '@docusaurus/core': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/core': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) '@docusaurus/module-type-aliases': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/theme-common': 3.7.0(@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/theme-common': 3.7.0(@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/types': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils-validation': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) mermaid: 10.9.3 @@ -8277,13 +9231,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/theme-search-algolia@3.7.0(@algolia/client-search@5.21.0)(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(@types/react@19.0.12)(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.8.2)': + '@docusaurus/theme-search-algolia@3.7.0(@algolia/client-search@5.21.0)(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(@types/react@19.0.12)(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.8.2)': dependencies: '@docsearch/react': 3.9.0(@algolia/client-search@5.21.0)(@types/react@19.0.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3) - '@docusaurus/core': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/core': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) '@docusaurus/logger': 3.7.0 - '@docusaurus/plugin-content-docs': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) - '@docusaurus/theme-common': 3.7.0(@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/plugin-content-docs': 3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + '@docusaurus/theme-common': 3.7.0(@docusaurus/plugin-content-docs@3.7.0(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@18.3.1))(acorn@8.14.1)(eslint@9.39.2(jiti@1.21.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/theme-translations': 3.7.0 '@docusaurus/utils': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils-validation': 3.7.0(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -8413,12 +9367,80 @@ snapshots: - uglify-js - webpack-cli + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@1.21.7))': + dependencies: + eslint: 9.39.2(jiti@1.21.7) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.21.1': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 + + '@eslint/core@0.17.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/css-tree@3.6.8': + dependencies: + mdn-data: 2.23.0 + source-map-js: 1.2.1 + + '@eslint/css@0.14.1': + dependencies: + '@eslint/core': 0.17.0 + '@eslint/css-tree': 3.6.8 + '@eslint/plugin-kit': 0.4.1 + + '@eslint/eslintrc@3.3.3': + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.39.2': {} + + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.1': + dependencies: + '@eslint/core': 0.17.0 + levn: 0.4.1 + '@hapi/hoek@9.3.0': {} '@hapi/topo@5.1.0': dependencies: '@hapi/hoek': 9.3.0 + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -8516,6 +9538,8 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@pkgr/core@0.2.9': {} + '@pnpm/config.env-replace@1.1.0': {} '@pnpm/network.ca-file@1.0.2': @@ -8578,6 +9602,8 @@ snapshots: optionalDependencies: rollup: 2.79.2 + '@rtsao/scc@1.1.0': {} + '@sideway/address@4.1.5': dependencies: '@hapi/hoek': 9.3.0 @@ -8817,6 +9843,8 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/json5@0.0.29': {} + '@types/mdast@3.0.15': dependencies: '@types/unist': 2.0.11 @@ -8878,6 +9906,8 @@ snapshots: dependencies: '@types/node': 22.13.11 + '@types/semver@7.7.1': {} + '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 @@ -8913,6 +9943,47 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 + '@typescript-eslint/scope-manager@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + + '@typescript-eslint/types@5.62.0': {} + + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.8.2)': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.4.3 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.7.1 + tsutils: 3.21.0(typescript@5.8.2) + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@5.62.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.8.2)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@1.21.7)) + '@types/json-schema': 7.0.15 + '@types/semver': 7.7.1 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.2) + eslint: 9.39.2(jiti@1.21.7) + eslint-scope: 5.1.1 + semver: 7.7.1 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + '@ungap/structured-clone@1.3.0': {} '@webassemblyjs/ast@1.14.1': @@ -9004,12 +10075,18 @@ snapshots: dependencies: acorn: 8.14.1 + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + acorn-walk@8.3.4: dependencies: acorn: 8.14.1 acorn@8.14.1: {} + acorn@8.15.0: {} + address@1.2.2: {} aggregate-error@3.1.0: @@ -9115,10 +10192,62 @@ snapshots: array-flatten@1.1.1: {} + array-includes@3.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 + array-timsort@1.0.3: {} array-union@2.1.0: {} + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.findlastindex@1.2.6: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-shim-unscopables: 1.1.0 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-shim-unscopables: 1.1.0 + + array.prototype.tosorted@1.1.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-shim-unscopables: 1.1.0 + arraybuffer.prototype.slice@1.0.4: dependencies: array-buffer-byte-length: 1.0.2 @@ -9440,6 +10569,12 @@ snapshots: has-own-prop: 2.0.0 repeat-string: 1.6.1 + comment-json@4.5.1: + dependencies: + array-timsort: 1.0.3 + core-util-is: 1.0.3 + esprima: 4.0.1 + common-path-prefix@3.0.0: {} common-tags@1.8.2: {} @@ -9554,6 +10689,13 @@ snapshots: comment-json: 4.2.5 yaml: 2.7.0 + cspell-config-lib@9.6.2: + dependencies: + '@cspell/cspell-types': 9.6.2 + comment-json: 4.5.1 + smol-toml: 1.6.0 + yaml: 2.8.2 + cspell-dictionary@8.17.5: dependencies: '@cspell/cspell-pipe': 8.17.5 @@ -9561,6 +10703,14 @@ snapshots: cspell-trie-lib: 8.17.5 fast-equals: 5.2.2 + cspell-dictionary@9.6.2: + dependencies: + '@cspell/cspell-performance-monitor': 9.6.2 + '@cspell/cspell-pipe': 9.6.2 + '@cspell/cspell-types': 9.6.2 + cspell-trie-lib: 9.6.2(@cspell/cspell-types@9.6.2) + fast-equals: 6.0.0 + cspell-gitignore@8.17.5: dependencies: '@cspell/url': 8.17.5 @@ -9573,16 +10723,31 @@ snapshots: '@cspell/url': 8.17.5 micromatch: 4.0.8 + cspell-glob@9.6.2: + dependencies: + '@cspell/url': 9.6.2 + picomatch: 4.0.3 + cspell-grammar@8.17.5: dependencies: '@cspell/cspell-pipe': 8.17.5 '@cspell/cspell-types': 8.17.5 + cspell-grammar@9.6.2: + dependencies: + '@cspell/cspell-pipe': 9.6.2 + '@cspell/cspell-types': 9.6.2 + cspell-io@8.17.5: dependencies: '@cspell/cspell-service-bus': 8.17.5 '@cspell/url': 8.17.5 + cspell-io@9.6.2: + dependencies: + '@cspell/cspell-service-bus': 9.6.2 + '@cspell/url': 9.6.2 + cspell-lib@8.17.5: dependencies: '@cspell/cspell-bundled-dicts': 8.17.5 @@ -9610,12 +10775,42 @@ snapshots: vscode-uri: 3.1.0 xdg-basedir: 5.1.0 + cspell-lib@9.6.2: + dependencies: + '@cspell/cspell-bundled-dicts': 9.6.2 + '@cspell/cspell-performance-monitor': 9.6.2 + '@cspell/cspell-pipe': 9.6.2 + '@cspell/cspell-resolver': 9.6.2 + '@cspell/cspell-types': 9.6.2 + '@cspell/dynamic-import': 9.6.2 + '@cspell/filetypes': 9.6.2 + '@cspell/strong-weak-map': 9.6.2 + '@cspell/url': 9.6.2 + clear-module: 4.1.2 + cspell-config-lib: 9.6.2 + cspell-dictionary: 9.6.2 + cspell-glob: 9.6.2 + cspell-grammar: 9.6.2 + cspell-io: 9.6.2 + cspell-trie-lib: 9.6.2(@cspell/cspell-types@9.6.2) + env-paths: 3.0.0 + gensequence: 8.0.8 + import-fresh: 3.3.1 + resolve-from: 5.0.0 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + xdg-basedir: 5.1.0 + cspell-trie-lib@8.17.5: dependencies: '@cspell/cspell-pipe': 8.17.5 '@cspell/cspell-types': 8.17.5 gensequence: 7.0.0 + cspell-trie-lib@9.6.2(@cspell/cspell-types@9.6.2): + dependencies: + '@cspell/cspell-types': 9.6.2 + cspell@8.17.5: dependencies: '@cspell/cspell-json-reporter': 8.17.5 @@ -9980,10 +11175,18 @@ snapshots: dependencies: ms: 2.0.0 + debug@3.2.7: + dependencies: + ms: 2.1.3 + debug@4.4.0: dependencies: ms: 2.1.3 + debug@4.4.3: + dependencies: + ms: 2.1.3 + decode-named-character-reference@1.1.0: dependencies: character-entities: 2.0.2 @@ -9994,6 +11197,8 @@ snapshots: deep-extend@0.6.0: {} + deep-is@0.1.4: {} + deepmerge@4.3.1: {} default-gateway@6.0.3: @@ -10069,6 +11274,10 @@ snapshots: dependencies: '@leichtgewicht/ip-codec': 2.0.5 + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + dom-converter@0.2.0: dependencies: utila: 0.4.0 @@ -10221,10 +11430,86 @@ snapshots: unbox-primitive: 1.1.0 which-typed-array: 1.1.19 + es-abstract@1.24.1: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 + es-define-property@1.0.1: {} es-errors@1.3.0: {} + es-iterator-helpers@1.2.2: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-set-tostringtag: 2.1.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + safe-array-concat: 1.1.3 + es-module-lexer@1.6.0: {} es-object-atoms@1.1.1: @@ -10238,6 +11523,10 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.2 + es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 @@ -10270,13 +11559,157 @@ snapshots: escape-string-regexp@5.0.0: {} + eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@1.21.7)): + dependencies: + eslint: 9.39.2(jiti@1.21.7) + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.16.1 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@1.21.7)): + dependencies: + debug: 3.2.7 + optionalDependencies: + eslint: 9.39.2(jiti@1.21.7) + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + + eslint-plugin-import@2.32.0(eslint@9.39.2(jiti@1.21.7)): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 9.39.2(jiti@1.21.7) + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@1.21.7)) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-prettier@5.5.5(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@1.21.7)))(eslint@9.39.2(jiti@1.21.7))(prettier@3.8.1): + dependencies: + eslint: 9.39.2(jiti@1.21.7) + prettier: 3.8.1 + prettier-linter-helpers: 1.0.1 + synckit: 0.11.12 + optionalDependencies: + '@types/eslint': 9.6.1 + eslint-config-prettier: 10.1.8(eslint@9.39.2(jiti@1.21.7)) + + eslint-plugin-react@7.37.5(eslint@9.39.2(jiti@1.21.7)): + dependencies: + array-includes: 3.1.9 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.2.2 + eslint: 9.39.2(jiti@1.21.7) + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.9 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + + eslint-plugin-unused-imports@4.3.0(eslint@9.39.2(jiti@1.21.7)): + dependencies: + eslint: 9.39.2(jiti@1.21.7) + eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint@9.39.2(jiti@1.21.7): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@1.21.7)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.3 + '@eslint/js': 9.39.2 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.6 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 1.21.7 + transitivePeerDependencies: + - supports-color + + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + esprima@4.0.1: {} + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 @@ -10399,8 +11832,12 @@ snapshots: fast-deep-equal@3.1.3: {} + fast-diff@1.3.0: {} + fast-equals@5.2.2: {} + fast-equals@6.0.0: {} + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -10415,6 +11852,8 @@ snapshots: fast-json-stable-stringify@2.1.0: {} + fast-levenshtein@2.0.6: {} + fast-uri@3.0.6: {} fastq@1.19.1: @@ -10441,6 +11880,10 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + file-entry-cache@9.1.0: dependencies: flat-cache: 5.0.0 @@ -10494,6 +11937,11 @@ snapshots: locate-path: 7.2.0 path-exists: 5.0.0 + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + flat-cache@5.0.0: dependencies: flatted: 3.3.3 @@ -10514,7 +11962,7 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - fork-ts-checker-webpack-plugin@6.5.3(typescript@5.8.2)(webpack@5.98.0): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.2(jiti@1.21.7))(typescript@5.8.2)(webpack@5.98.0): dependencies: '@babel/code-frame': 7.26.2 '@types/json-schema': 7.0.15 @@ -10531,6 +11979,8 @@ snapshots: tapable: 1.1.3 typescript: 5.8.2 webpack: 5.98.0 + optionalDependencies: + eslint: 9.39.2(jiti@1.21.7) form-data-encoder@2.1.4: {} @@ -10577,6 +12027,8 @@ snapshots: gensequence@7.0.0: {} + gensequence@8.0.8: {} + gensync@1.0.0-beta.2: {} get-intrinsic@1.3.0: @@ -10658,6 +12110,10 @@ snapshots: globals@11.12.0: {} + globals@14.0.0: {} + + globals@17.2.0: {} + globalthis@1.0.4: dependencies: define-properties: 1.2.1 @@ -10986,6 +12442,8 @@ snapshots: import-meta-resolve@4.1.0: {} + import-meta-resolve@4.2.0: {} + imurmurhash@0.1.4: {} indent-string@4.0.0: {} @@ -11124,6 +12582,8 @@ snapshots: is-module@1.0.0: {} + is-negative-zero@2.0.3: {} + is-npm@6.0.0: {} is-number-object@1.1.1: @@ -11212,6 +12672,15 @@ snapshots: isobject@3.0.1: {} + iterator.prototype@1.1.5: + dependencies: + define-data-property: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + has-symbols: 1.1.0 + set-function-name: 2.0.2 + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -11268,6 +12737,10 @@ snapshots: dependencies: argparse: 2.0.1 + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + jsesc@3.0.2: {} jsesc@3.1.0: {} @@ -11286,6 +12759,12 @@ snapshots: json-schema@0.4.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + json5@2.2.3: {} jsonc-parser@3.2.1: {} @@ -11298,6 +12777,13 @@ snapshots: jsonpointer@5.0.1: {} + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.9 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 + katex@0.16.11: dependencies: commander: 8.3.0 @@ -11327,6 +12813,11 @@ snapshots: leven@3.1.0: {} + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -11364,6 +12855,8 @@ snapshots: lodash.memoize@4.1.2: {} + lodash.merge@4.6.2: {} + lodash.sortby@4.7.0: {} lodash.uniq@4.5.0: {} @@ -11643,6 +13136,8 @@ snapshots: mdn-data@2.0.30: {} + mdn-data@2.23.0: {} + mdurl@2.0.0: {} media-typer@0.3.0: {} @@ -12166,6 +13661,8 @@ snapshots: nanoid@3.3.11: {} + natural-compare@1.4.0: {} + negotiator@0.6.3: {} negotiator@0.6.4: {} @@ -12227,6 +13724,33 @@ snapshots: has-symbols: 1.1.0 object-keys: 1.1.1 + object.entries@1.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + obuf@1.1.2: {} on-finished@2.4.1: @@ -12251,6 +13775,15 @@ snapshots: opener@1.5.2: {} + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + own-keys@1.0.1: dependencies: get-intrinsic: 1.3.0 @@ -12384,6 +13917,8 @@ snapshots: picomatch@4.0.2: {} + picomatch@4.0.3: {} + pkg-dir@7.0.0: dependencies: find-up: 6.3.0 @@ -12827,6 +14362,14 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.1: + dependencies: + fast-diff: 1.3.0 + + prettier@3.8.1: {} + pretty-bytes@5.6.0: {} pretty-error@4.0.0: @@ -12915,7 +14458,7 @@ snapshots: prop-types: 15.8.1 react: 18.3.1 - react-dev-utils@12.0.1(typescript@5.8.2)(webpack@5.98.0): + react-dev-utils@12.0.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.8.2)(webpack@5.98.0): dependencies: '@babel/code-frame': 7.26.2 address: 1.2.2 @@ -12926,7 +14469,7 @@ snapshots: escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(typescript@5.8.2)(webpack@5.98.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@1.21.7))(typescript@5.8.2)(webpack@5.98.0) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -13233,6 +14776,12 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + resolve@2.0.0-next.5: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + responselike@3.0.0: dependencies: lowercase-keys: 3.0.0 @@ -13503,6 +15052,8 @@ snapshots: smob@1.5.0: {} + smol-toml@1.6.0: {} + snake-case@3.0.4: dependencies: dot-case: 3.0.4 @@ -13566,6 +15117,11 @@ snapshots: std-env@3.8.1: {} + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -13594,6 +15150,11 @@ snapshots: set-function-name: 2.0.2 side-channel: 1.1.0 + string.prototype.repeat@1.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.23.9 + string.prototype.trim@1.2.10: dependencies: call-bind: 1.0.8 @@ -13646,6 +15207,8 @@ snapshots: strip-bom-string@1.0.0: {} + strip-bom@3.0.0: {} + strip-comments@2.0.1: {} strip-final-newline@2.0.0: {} @@ -13692,6 +15255,10 @@ snapshots: csso: 5.0.5 picocolors: 1.1.1 + synckit@0.11.12: + dependencies: + '@pkgr/core': 0.2.9 + tapable@1.1.3: {} tapable@2.2.1: {} @@ -13752,8 +15319,26 @@ snapshots: ts-dedent@2.2.0: {} + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@1.14.1: {} + tslib@2.8.1: {} + tsutils@3.21.0(typescript@5.8.2): + dependencies: + tslib: 1.14.1 + typescript: 5.8.2 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + type-fest@0.16.0: {} type-fest@0.21.3: {} @@ -14170,6 +15755,8 @@ snapshots: wildcard@2.0.1: {} + word-wrap@1.2.5: {} + workbox-background-sync@7.3.0: dependencies: idb: 7.1.1 @@ -14320,6 +15907,8 @@ snapshots: yaml@2.7.0: {} + yaml@2.8.2: {} + yocto-queue@0.1.0: {} yocto-queue@1.2.1: {} diff --git a/prettier.config.mjs b/prettier.config.mjs new file mode 100644 index 0000000000..105dd1c0fc --- /dev/null +++ b/prettier.config.mjs @@ -0,0 +1,13 @@ +// prettier.config.js, .prettierrc.js, prettier.config.mjs, or .prettierrc.mjs + +/** + * @see https://prettier.io/docs/configuration + * @type {import("prettier").Config} + */ +export default { + trailingComma: "none", + tabWidth: 2, + endOfLine: "lf", + semi: true, + singleQuote: false +}; diff --git a/src/components/AskQuestionForm/index.js b/src/components/AskQuestionForm/index.jsx similarity index 72% rename from src/components/AskQuestionForm/index.js rename to src/components/AskQuestionForm/index.jsx index b75757fe10..4b4e9d922b 100644 --- a/src/components/AskQuestionForm/index.js +++ b/src/components/AskQuestionForm/index.jsx @@ -17,36 +17,44 @@ * under the License. */ -import React, { useState } from 'react'; -import styles from './styles.module.css'; +import { useState } from "react"; +import styles from "./styles.module.css"; +import Heading from "@theme/Heading"; export default function AskQuestionForm() { - const [question, setQuestion] = useState(''); - const [title, setTitle] = useState(''); + const [question, setQuestion] = useState(""); + const [title, setTitle] = useState(""); const handleSubmit = (e) => { e.preventDefault(); - + // Create the GitHub Discussions URL with query parameters - const baseUrl = 'https://github.com/apache/ozone/discussions/new'; - const category = 'faq '; + const baseUrl = "https://github.com/apache/ozone/discussions/new"; + const category = "faq "; const titleEncoded = encodeURIComponent(title); const bodyEncoded = encodeURIComponent(question); - + const redirectUrl = `${baseUrl}?category=${category}&title=${titleEncoded}&body=${bodyEncoded}`; - + // Redirect to GitHub Discussions with the pre-filled question window.location.href = redirectUrl; }; return (
-

Ask a Question

-

Have a question about Apache Ozone? Fill out this form and we'll redirect you to GitHub Discussions with your question pre-filled.

- + + Ask a Question + +

+ Have a question about Apache Ozone? Fill out this form and we'll + redirect you to GitHub Discussions with your question pre-filled. +

+
- +
- +
- +