From 38743ab98390a6b86fe65e2212e79526e3266126 Mon Sep 17 00:00:00 2001 From: Giovanni Grano Date: Mon, 13 May 2024 15:02:24 -0400 Subject: [PATCH 01/25] adding scripts to parse catalog and derive persistence data --- .../persistence/create_persistence_docs.py | 45 +++++++++++++++++++ scripts/persistence/notion/__init__.py | 0 scripts/persistence/notion/catalog.py | 27 +++++++++++ scripts/persistence/requirements.txt | 11 +++++ 4 files changed, 83 insertions(+) create mode 100644 scripts/persistence/create_persistence_docs.py create mode 100644 scripts/persistence/notion/__init__.py create mode 100644 scripts/persistence/notion/catalog.py create mode 100644 scripts/persistence/requirements.txt diff --git a/scripts/persistence/create_persistence_docs.py b/scripts/persistence/create_persistence_docs.py new file mode 100644 index 0000000000..62deffbebe --- /dev/null +++ b/scripts/persistence/create_persistence_docs.py @@ -0,0 +1,45 @@ +import os +import json +import notion_client as n_client +from notion.catalog import PersistenceCatalog + +token = os.getenv("NOTION_TOKEN") +coverage_path = "../../data/coverage" + + +def collect_status() -> dict: + """Reads the catalog on Notion and returns the status of persistence for each service""" + notion_client = n_client.Client(auth=token) + + catalog_db = PersistenceCatalog(notion_client=notion_client) + statuses = {} + for item in catalog_db: + service = item.name.replace('_', '-') + status = item.status.lower() + statuses[service] = { + "support": status, + "test_suite": item.has_test or False + } + return statuses + + +def update_coverage_data(): + if not token: + print("Aborting, please provide a NOTION_TOKEN in the env") + statuses = collect_status() + for service, status in statuses.items(): + f = os.path.join(coverage_path, f"{service}.json") + if not os.path.exists(f): + print(f"coverage file for {service} not found; skipping") + continue + print(f"Updating persistence coverage data for {service}") + with open(f, 'r') as r_file: + content = json.load(r_file) + + content.setdefault("feature_support", {"persistence": status}) + with open(f, 'w') as w_file: + json.dump(content, w_file, indent=2) + + +if __name__ == "__main__": + update_coverage_data() diff --git a/scripts/persistence/notion/__init__.py b/scripts/persistence/notion/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/scripts/persistence/notion/catalog.py b/scripts/persistence/notion/catalog.py new file mode 100644 index 0000000000..dad688599a --- /dev/null +++ b/scripts/persistence/notion/catalog.py @@ -0,0 +1,27 @@ +"""Models for the notion service catalog https://www.notion.so/localstack/3c0f615e7ffc4ae2a034f1ed9c444bd2""" + +from notion_client import Client as NotionClient + +from notion_objects import ( + Page, + TitlePlainText, + Status, + Database, + Checkbox, + PeopleProperty +) + +DEFAULT_CATALOG_DATABASE_ID = "3c0f615e7ffc4ae2a034f1ed9c444bd2" + + +class PersistenceServiceItem(Page): + name = TitlePlainText("Name") + status = Status("Persistence") + has_test = Checkbox("Persistence Tests") + primary_owner = PeopleProperty("Primary Owner") + secondary_owner = PeopleProperty("Secondary Owner(s)") + + +class PersistenceCatalog(Database[PersistenceServiceItem]): + def __init__(self, notion_client: NotionClient, database_id: str | None = None): + super().__init__(PersistenceServiceItem, database_id or DEFAULT_CATALOG_DATABASE_ID, notion_client) diff --git a/scripts/persistence/requirements.txt b/scripts/persistence/requirements.txt new file mode 100644 index 0000000000..c7693e3ca6 --- /dev/null +++ b/scripts/persistence/requirements.txt @@ -0,0 +1,11 @@ +anyio==4.3.0 +certifi==2024.2.2 +h11==0.14.0 +httpcore==1.0.5 +httpx==0.27.0 +idna==3.7 +notion-client==2.2.1 +notion-objects==0.6.2 +python-dateutil==2.9.0.post0 +six==1.16.0 +sniffio==1.3.1 From 799300d4679e190b3ab15e52aa3132303ccf24f3 Mon Sep 17 00:00:00 2001 From: Giovanni Grano Date: Mon, 13 May 2024 18:02:41 -0400 Subject: [PATCH 02/25] fix typo --- layouts/partials/coverage/coverage_details.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layouts/partials/coverage/coverage_details.html b/layouts/partials/coverage/coverage_details.html index 00e3f1de4a..fbf159fb7c 100644 --- a/layouts/partials/coverage/coverage_details.html +++ b/layouts/partials/coverage/coverage_details.html @@ -3,7 +3,7 @@

How to read the test details?

For each operation we put up a list of the related integration test cases.
-Those operation calls have been recorded during the exeuction of the outlined test cases. +Those operation calls have been recorded during the execution of the outlined test cases. Some calls might be internal, i.e., they are not explicitly called in the test, but are triggered implicitly by the LocalStack framework.

From c45a5552bdda5d7e175f371d029b0248f161df92 Mon Sep 17 00:00:00 2001 From: Giovanni Grano Date: Mon, 13 May 2024 18:03:33 -0400 Subject: [PATCH 03/25] added function to update the frontmatter --- .../persistence/create_persistence_docs.py | 30 +++++++++++++++++++ scripts/persistence/requirements.txt | 3 ++ 2 files changed, 33 insertions(+) diff --git a/scripts/persistence/create_persistence_docs.py b/scripts/persistence/create_persistence_docs.py index 62deffbebe..3423fc6fbd 100644 --- a/scripts/persistence/create_persistence_docs.py +++ b/scripts/persistence/create_persistence_docs.py @@ -1,10 +1,13 @@ import os +from io import BytesIO import json import notion_client as n_client +import frontmatter from notion.catalog import PersistenceCatalog token = os.getenv("NOTION_TOKEN") coverage_path = "../../data/coverage" +markdown_path = "../../content/en/user-guide/aws" def collect_status() -> dict: @@ -24,6 +27,8 @@ def collect_status() -> dict: def update_coverage_data(): + """This function augments the coverage data files (one per service) by adding information + about persistence support; such data is obtained from the persistence catalog on Notion""" if not token: print("Aborting, please provide a NOTION_TOKEN in the env") statuses = collect_status() @@ -41,5 +46,30 @@ def update_coverage_data(): json.dump(content, w_file, indent=2) +def update_frontmatter(): + """Updates the frontmatter of the service page in the user guide Markdown file""" + coverage_files = [_f for _f in os.listdir(coverage_path) if _f.endswith("json")] + if not coverage_files: + print("Can't find any coverage file; something went wrong; abort") + for cov_file in coverage_files: + service = cov_file.split('.')[0] + _path = os.path.join(markdown_path, service, "index.md") + if not os.path.exists(_path): + print(f" Can't find index.md file for {service}") + continue + + # read the status of persistence from the coverage JSON data + with open(os.path.join(coverage_path, cov_file), 'r') as f: + data = json.loads(f.read()) + status = data.get("feature_support", {}).get("persistence", {}).get("status", "unknown") + + # open the markdown file and read the content + content = frontmatter.load(_path) + content.metadata["persistence"] = status + frontmatter.dump(content, _path) + + if __name__ == "__main__": update_coverage_data() + update_frontmatter() + diff --git a/scripts/persistence/requirements.txt b/scripts/persistence/requirements.txt index c7693e3ca6..24defdd43b 100644 --- a/scripts/persistence/requirements.txt +++ b/scripts/persistence/requirements.txt @@ -4,8 +4,11 @@ h11==0.14.0 httpcore==1.0.5 httpx==0.27.0 idna==3.7 +install==1.3.5 notion-client==2.2.1 notion-objects==0.6.2 python-dateutil==2.9.0.post0 +python-frontmatter==1.1.0 +PyYAML==6.0.1 six==1.16.0 sniffio==1.3.1 From bd9df42d4e515e5ca69ec29d14bdbbb8a2e940c9 Mon Sep 17 00:00:00 2001 From: Giovanni Grano Date: Mon, 13 May 2024 18:13:32 -0400 Subject: [PATCH 04/25] add step to the workflow --- .github/workflows/docs-parity-updates.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/docs-parity-updates.yml b/.github/workflows/docs-parity-updates.yml index 6502c4ecd4..ea43bbd8c7 100644 --- a/.github/workflows/docs-parity-updates.yml +++ b/.github/workflows/docs-parity-updates.yml @@ -84,6 +84,17 @@ jobs: cp -r target/updated_coverage/md/* content/en/references/coverage && rm -R target/updated_coverage/md/ mv -f target/updated_coverage/data/*.json data/coverage + - name: Update Coverage Docs with Persistence Coverage + working-diretory: docs + run: | + cd scripts/persistence + python3 -m venv .venv + source .venv/bin/activate + pip3 install -r requirements.txt + python3 create_persistence_docs.py + env: + NOTION_TOKEN: ${{ secrets.NOTION_TOKEN }} + - name: Check for changes id: check-for-changes working-directory: docs From c57cf3835d8498ff8602e069da1c3a57e99bf75a Mon Sep 17 00:00:00 2001 From: Giovanni Grano Date: Mon, 13 May 2024 18:24:08 -0400 Subject: [PATCH 05/25] typo --- .github/workflows/docs-parity-updates.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs-parity-updates.yml b/.github/workflows/docs-parity-updates.yml index ea43bbd8c7..27b2ec2b1d 100644 --- a/.github/workflows/docs-parity-updates.yml +++ b/.github/workflows/docs-parity-updates.yml @@ -85,7 +85,7 @@ jobs: mv -f target/updated_coverage/data/*.json data/coverage - name: Update Coverage Docs with Persistence Coverage - working-diretory: docs + working-directory: docs run: | cd scripts/persistence python3 -m venv .venv From 00ea455fa41dc22a766f348a5c349f7b3c62c58b Mon Sep 17 00:00:00 2001 From: Giovanni Grano Date: Tue, 14 May 2024 10:36:59 -0400 Subject: [PATCH 06/25] write persistence data into a separate json --- .../workflows/docs-persistence-updates.yml | 64 +++ data/persistence/coverage.json | 394 ++++++++++++++++++ .../persistence/create_persistence_docs.py | 49 +-- 3 files changed, 476 insertions(+), 31 deletions(-) create mode 100644 .github/workflows/docs-persistence-updates.yml create mode 100644 data/persistence/coverage.json diff --git a/.github/workflows/docs-persistence-updates.yml b/.github/workflows/docs-persistence-updates.yml new file mode 100644 index 0000000000..4161af10cc --- /dev/null +++ b/.github/workflows/docs-persistence-updates.yml @@ -0,0 +1,64 @@ +name: Update Persistence Docs +on: + schedule: + - cron: 0 5 * * MON + workflow_dispatch: + inputs: + targetBranch: + required: false + type: string + default: 'main' + +jobs: + update-persistence-docs: + name: Update Parity Docs + runs-on: ubuntu-latest + steps: + - name: Checkout docs + uses: actions/checkout@v4 + with: + fetch-depth: 0 + path: docs + ref: ${{ github.event.inputs.targetBranch || 'main' }} + + - name: Set up Python 3.11 + id: setup-python + uses: actions/setup-python@v5 + with: + python-version: "3.11" + + - name: Update Coverage Docs with Persistence Coverage + working-directory: docs + run: | + cd scripts/persistence + python3 -m venv .venv + source .venv/bin/activate + pip3 install -r requirements.txt + python3 create_persistence_docs.py + env: + NOTION_TOKEN: ${{ secrets.NOTION_TOKEN }} + + - name: Check for changes + id: check-for-changes + working-directory: docs + run: | + # Check if there are changed files and store the result in resources/diff-check.log + # Check against the PR branch if it exists, otherwise against the main + # Store the result in resources/diff-check.log and store the diff count in the GitHub Action output "diff-count" + mkdir -p resources + (git diff --name-only origin/persistence-auto-updates data/persistence/ 2>/dev/null || git diff --name-only origin/${{ github.event.inputs.targetBranch || 'main' }} data/persistence/ 2>/dev/null) | tee -a resources/diff-check.log + echo "diff-count=$(cat resources/diff-check.log | wc -l)" >> $GITHUB_OUTPUT + + - name: Create PR + uses: peter-evans/create-pull-request@v6 + if: ${{ success() && steps.check-for-changes.outputs.diff-count != '0' && steps.check-for-changes.outputs.diff-count != '' }} + with: + path: docs + title: "Update Persistence Docs" + body: "Updating Persistence Coverage Documentation based on the [Persistence Catalog](https://www.notion.so/localstack/Persistence-Catalog-a9e0e5cb89df4784adb4a1ed377b3c23) on Notion." + branch: "persistence-auto-updates" + author: "LocalStack Bot " + committer: "LocalStack Bot " + commit-message: "update generated persistence docs" + token: ${{ secrets.PRO_ACCESS_TOKEN }} + reviewers: giograno diff --git a/data/persistence/coverage.json b/data/persistence/coverage.json new file mode 100644 index 0000000000..dc8050e456 --- /dev/null +++ b/data/persistence/coverage.json @@ -0,0 +1,394 @@ +{ + "account": { + "support": "not supported", + "test_suite": false + }, + "acm": { + "support": "not supported", + "test_suite": false + }, + "acm-pca": { + "support": "supported", + "test_suite": false + }, + "amplify": { + "support": "supported", + "test_suite": true + }, + "apigateway": { + "support": "supported", + "test_suite": true + }, + "appconfig": { + "support": "unknown", + "test_suite": true + }, + "applicationautoscaling": { + "support": "not supported", + "test_suite": false + }, + "appsync": { + "support": "not supported", + "test_suite": false + }, + "athena": { + "support": "not supported", + "test_suite": false + }, + "autoscaling": { + "support": "not supported", + "test_suite": false + }, + "backup": { + "support": "supported", + "test_suite": true + }, + "batch": { + "support": "unknown", + "test_suite": true + }, + "ce": { + "support": "not supported", + "test_suite": false + }, + "cloudformation": { + "support": "not supported", + "test_suite": false + }, + "cloudfront": { + "support": "supported", + "test_suite": true + }, + "cloudtrail": { + "support": "supported", + "test_suite": true + }, + "cloudwatch": { + "support": "supported", + "test_suite": true + }, + "codecommit": { + "support": "supported", + "test_suite": true + }, + "cognito-identity": { + "support": "supported", + "test_suite": true + }, + "cognito-idp": { + "support": "supported", + "test_suite": true + }, + "config": { + "support": "supported", + "test_suite": true + }, + "dms": { + "support": "not supported", + "test_suite": false + }, + "docdb": { + "support": "not supported", + "test_suite": false + }, + "dynamodb": { + "support": "supported", + "test_suite": true + }, + "dynamodbstreams": { + "support": "not supported", + "test_suite": false + }, + "ec2": { + "support": "unknown", + "test_suite": false + }, + "ecr": { + "support": "supported", + "test_suite": true + }, + "ecs": { + "support": "not supported", + "test_suite": false + }, + "efs": { + "support": "not supported", + "test_suite": false + }, + "eks": { + "support": "not supported", + "test_suite": false + }, + "elasticache": { + "support": "supported", + "test_suite": true + }, + "elasticbeanstalk": { + "support": "not supported", + "test_suite": false + }, + "elb": { + "support": "not supported", + "test_suite": false + }, + "elbv2": { + "support": "not supported", + "test_suite": false + }, + "emr": { + "support": "not supported", + "test_suite": false + }, + "es": { + "support": "not supported", + "test_suite": false + }, + "events": { + "support": "not supported", + "test_suite": false + }, + "firehose": { + "support": "not supported", + "test_suite": false + }, + "fis": { + "support": "not supported", + "test_suite": false + }, + "glacier": { + "support": "supported", + "test_suite": true + }, + "glue": { + "support": "not supported", + "test_suite": false + }, + "iam": { + "support": "supported", + "test_suite": true + }, + "identitystore": { + "support": "unknown", + "test_suite": false + }, + "iot": { + "support": "unknown", + "test_suite": false + }, + "iot-data": { + "support": "unknown", + "test_suite": false + }, + "iotanalytics": { + "support": "unknown", + "test_suite": false + }, + "iotwireless": { + "support": "unknown", + "test_suite": false + }, + "kafka": { + "support": "supported with limitations", + "test_suite": true + }, + "kinesis": { + "support": "supported", + "test_suite": true + }, + "kinesisanalytics": { + "support": "unknown", + "test_suite": false + }, + "kinesisanalyticsv2": { + "support": "unknown", + "test_suite": false + }, + "kms": { + "support": "supported", + "test_suite": true + }, + "lakeformation": { + "support": "unknown", + "test_suite": false + }, + "lambda": { + "support": "supported with limitations", + "test_suite": true + }, + "logs": { + "support": "supported", + "test_suite": true + }, + "managedblockchain": { + "support": "unknown", + "test_suite": false + }, + "mediaconvert": { + "support": "unknown", + "test_suite": false + }, + "mediastore": { + "support": "unknown", + "test_suite": false + }, + "memorydb": { + "support": "not supported", + "test_suite": false + }, + "mq": { + "support": "not supported", + "test_suite": false + }, + "mwaa": { + "support": "unknown", + "test_suite": false + }, + "neptune": { + "support": "not supported", + "test_suite": false + }, + "opensearch": { + "support": "not supported", + "test_suite": false + }, + "organizations": { + "support": "unknown", + "test_suite": false + }, + "pinpoint": { + "support": "unknown", + "test_suite": false + }, + "pipes": { + "support": "not supported", + "test_suite": false + }, + "qldb": { + "support": "unknown", + "test_suite": false + }, + "ram": { + "support": "unknown", + "test_suite": false + }, + "rds": { + "support": "supported with limitations", + "test_suite": true + }, + "rds-data": { + "support": "unknown", + "test_suite": false + }, + "redshift": { + "support": "unknown", + "test_suite": false + }, + "resource-groups": { + "support": "unknown", + "test_suite": false + }, + "resourcegroupstaggingapi": { + "support": "unknown", + "test_suite": false + }, + "route53": { + "support": "supported", + "test_suite": true + }, + "route53resolver": { + "support": "supported", + "test_suite": false + }, + "s3": { + "support": "supported", + "test_suite": true + }, + "sagemaker": { + "support": "unknown", + "test_suite": false + }, + "scheduler": { + "support": "unknown", + "test_suite": false + }, + "secretsmanager": { + "support": "supported", + "test_suite": true + }, + "serverlessrepo": { + "support": "unknown", + "test_suite": false + }, + "servicediscovery": { + "support": "unknown", + "test_suite": false + }, + "ses": { + "support": "unknown", + "test_suite": false + }, + "sesv2": { + "support": "unknown", + "test_suite": false + }, + "sns": { + "support": "supported", + "test_suite": true + }, + "sqs": { + "support": "supported", + "test_suite": true + }, + "ssm": { + "support": "unknown", + "test_suite": false + }, + "sso-admin": { + "support": "unknown", + "test_suite": false + }, + "stepfunctions": { + "support": "not supported", + "test_suite": false + }, + "sts": { + "support": "not supported", + "test_suite": false + }, + "support": { + "support": "unknown", + "test_suite": false + }, + "swf": { + "support": "unknown", + "test_suite": false + }, + "textract": { + "support": "supported", + "test_suite": true + }, + "timestream": { + "support": "supported", + "test_suite": true + }, + "transcribe": { + "support": "supported", + "test_suite": true + }, + "transfer": { + "support": "unknown", + "test_suite": false + }, + "verifiedpermissions": { + "support": "unknown", + "test_suite": false + }, + "wafv2": { + "support": "unknown", + "test_suite": false + }, + "xray": { + "support": "unknown", + "test_suite": true + } +} \ No newline at end of file diff --git a/scripts/persistence/create_persistence_docs.py b/scripts/persistence/create_persistence_docs.py index 3423fc6fbd..f69eefe551 100644 --- a/scripts/persistence/create_persistence_docs.py +++ b/scripts/persistence/create_persistence_docs.py @@ -6,9 +6,9 @@ from notion.catalog import PersistenceCatalog token = os.getenv("NOTION_TOKEN") -coverage_path = "../../data/coverage" markdown_path = "../../content/en/user-guide/aws" - +persistence_path = "../../data/persistence" +persistence_data = os.path.join(persistence_path, "coverage.json") def collect_status() -> dict: """Reads the catalog on Notion and returns the status of persistence for each service""" @@ -23,49 +23,36 @@ def collect_status() -> dict: "support": status, "test_suite": item.has_test or False } - return statuses + return dict(sorted(statuses.items())) def update_coverage_data(): - """This function augments the coverage data files (one per service) by adding information - about persistence support; such data is obtained from the persistence catalog on Notion""" if not token: print("Aborting, please provide a NOTION_TOKEN in the env") statuses = collect_status() - for service, status in statuses.items(): - f = os.path.join(coverage_path, f"{service}.json") - if not os.path.exists(f): - print(f"coverage file for {service} not found; skipping") - continue - print(f"Updating persistence coverage data for {service}") - with open(f, 'r') as r_file: - content = json.load(r_file) - - content.setdefault("feature_support", {"persistence": status}) - with open(f, 'w') as w_file: - json.dump(content, w_file, indent=2) - - + if not os.path.exists(persistence_path): + os.mkdir(persistence_path) + + with open(persistence_data, 'w') as f: + json.dump(statuses, f, indent=2) + + def update_frontmatter(): """Updates the frontmatter of the service page in the user guide Markdown file""" - coverage_files = [_f for _f in os.listdir(coverage_path) if _f.endswith("json")] - if not coverage_files: - print("Can't find any coverage file; something went wrong; abort") - for cov_file in coverage_files: - service = cov_file.split('.')[0] + with open(persistence_data, 'r') as f: + content = f.read() + statuses = json.loads(content) + for service, values in statuses.items(): _path = os.path.join(markdown_path, service, "index.md") if not os.path.exists(_path): print(f" Can't find index.md file for {service}") continue - - # read the status of persistence from the coverage JSON data - with open(os.path.join(coverage_path, cov_file), 'r') as f: - data = json.loads(f.read()) - status = data.get("feature_support", {}).get("persistence", {}).get("status", "unknown") - + # open the markdown file and read the content content = frontmatter.load(_path) - content.metadata["persistence"] = status + desc = content.metadata["description"] + content.metadata["description"] = desc.strip() + content.metadata["persistence"] = values.get("support", "unknown") frontmatter.dump(content, _path) From dfb4ebfeca098d78621dc86098e8bb4be72289cb Mon Sep 17 00:00:00 2001 From: Giovanni Grano Date: Tue, 14 May 2024 14:02:18 -0400 Subject: [PATCH 07/25] revert changes to docs parity updates --- .github/workflows/docs-parity-updates.yml | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/.github/workflows/docs-parity-updates.yml b/.github/workflows/docs-parity-updates.yml index 27b2ec2b1d..6502c4ecd4 100644 --- a/.github/workflows/docs-parity-updates.yml +++ b/.github/workflows/docs-parity-updates.yml @@ -84,17 +84,6 @@ jobs: cp -r target/updated_coverage/md/* content/en/references/coverage && rm -R target/updated_coverage/md/ mv -f target/updated_coverage/data/*.json data/coverage - - name: Update Coverage Docs with Persistence Coverage - working-directory: docs - run: | - cd scripts/persistence - python3 -m venv .venv - source .venv/bin/activate - pip3 install -r requirements.txt - python3 create_persistence_docs.py - env: - NOTION_TOKEN: ${{ secrets.NOTION_TOKEN }} - - name: Check for changes id: check-for-changes working-directory: docs From 52235036e0a557a6fb4a9a498160aaf0fb59c280 Mon Sep 17 00:00:00 2001 From: Giovanni Grano Date: Tue, 14 May 2024 14:07:56 -0400 Subject: [PATCH 08/25] Custom YAML handler Avoids dropping the new line at the end of the file and the order changes in the YAML frontmatter --- .../persistence/create_persistence_docs.py | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/scripts/persistence/create_persistence_docs.py b/scripts/persistence/create_persistence_docs.py index f69eefe551..fc73bad7bf 100644 --- a/scripts/persistence/create_persistence_docs.py +++ b/scripts/persistence/create_persistence_docs.py @@ -3,6 +3,7 @@ import json import notion_client as n_client import frontmatter +from frontmatter.default_handlers import YAMLHandler, DEFAULT_POST_TEMPLATE from notion.catalog import PersistenceCatalog token = os.getenv("NOTION_TOKEN") @@ -10,6 +11,32 @@ persistence_path = "../../data/persistence" persistence_data = os.path.join(persistence_path, "coverage.json") + +class CustomYAMLHandler(YAMLHandler): + def export(self, metadata: dict[str, object], **kwargs: object) -> str: + """ + Settings sort keys as false to prevent sorting existing elements. + """ + kwargs.setdefault("sort_keys", False) + return super().export(metadata, **kwargs) + + def format(self, post, **kwargs): + """ + Simple customization to avoid removing the last line. + """ + start_delimiter = kwargs.pop("start_delimiter", self.START_DELIMITER) + end_delimiter = kwargs.pop("end_delimiter", self.END_DELIMITER) + + metadata = self.export(post.metadata, **kwargs) + + return DEFAULT_POST_TEMPLATE.format( + metadata=metadata, + content=post.content, + start_delimiter=start_delimiter, + end_delimiter=end_delimiter, + ).lstrip() + + def collect_status() -> dict: """Reads the catalog on Notion and returns the status of persistence for each service""" notion_client = n_client.Client(auth=token) @@ -49,7 +76,7 @@ def update_frontmatter(): continue # open the markdown file and read the content - content = frontmatter.load(_path) + content = frontmatter.load(_path, handler=CustomYAMLHandler()) desc = content.metadata["description"] content.metadata["description"] = desc.strip() content.metadata["persistence"] = values.get("support", "unknown") From b912d4c5b26e55f9f049ad91b7273a503ffeaad8 Mon Sep 17 00:00:00 2001 From: Giovanni Grano Date: Tue, 14 May 2024 14:50:27 -0400 Subject: [PATCH 09/25] special case cognito; stream down requirements --- scripts/persistence/create_persistence_docs.py | 3 +++ scripts/persistence/requirements.txt | 11 ----------- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/scripts/persistence/create_persistence_docs.py b/scripts/persistence/create_persistence_docs.py index fc73bad7bf..2ba6df4d6c 100644 --- a/scripts/persistence/create_persistence_docs.py +++ b/scripts/persistence/create_persistence_docs.py @@ -70,6 +70,9 @@ def update_frontmatter(): content = f.read() statuses = json.loads(content) for service, values in statuses.items(): + # special case for cognito: + if "cognito" in service: + service = "cognito" _path = os.path.join(markdown_path, service, "index.md") if not os.path.exists(_path): print(f" Can't find index.md file for {service}") diff --git a/scripts/persistence/requirements.txt b/scripts/persistence/requirements.txt index 24defdd43b..0498439f43 100644 --- a/scripts/persistence/requirements.txt +++ b/scripts/persistence/requirements.txt @@ -1,14 +1,3 @@ -anyio==4.3.0 -certifi==2024.2.2 -h11==0.14.0 -httpcore==1.0.5 -httpx==0.27.0 -idna==3.7 -install==1.3.5 notion-client==2.2.1 notion-objects==0.6.2 -python-dateutil==2.9.0.post0 python-frontmatter==1.1.0 -PyYAML==6.0.1 -six==1.16.0 -sniffio==1.3.1 From 3ee6c5351105e0d524f7f24716ee56db1db1e1a0 Mon Sep 17 00:00:00 2001 From: Giovanni Grano Date: Tue, 14 May 2024 14:50:57 -0400 Subject: [PATCH 10/25] update gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 07dadf6a22..c372e6fde3 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,7 @@ resources **/*.orig .hugo_build.lock -scripts/__pycache__ +**/__pycache__ +**/.venv target/ scripts/target From d10982e90def957b21cb34e7707a25e5e9f5d044 Mon Sep 17 00:00:00 2001 From: Giovanni Grano Date: Tue, 14 May 2024 15:49:41 -0400 Subject: [PATCH 11/25] collect notes from the table --- data/persistence/coverage.json | 300 ++++++++++++------ .../persistence/create_persistence_docs.py | 14 +- scripts/persistence/notion/catalog.py | 4 +- 3 files changed, 210 insertions(+), 108 deletions(-) diff --git a/data/persistence/coverage.json b/data/persistence/coverage.json index dc8050e456..e28349a4d5 100644 --- a/data/persistence/coverage.json +++ b/data/persistence/coverage.json @@ -1,394 +1,492 @@ { "account": { "support": "not supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "acm": { "support": "not supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "acm-pca": { "support": "supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "amplify": { "support": "supported", - "test_suite": true + "test_suite": true, + "notes": "" }, "apigateway": { "support": "supported", - "test_suite": true + "test_suite": true, + "notes": "" }, "appconfig": { "support": "unknown", - "test_suite": true + "test_suite": true, + "notes": "" }, "applicationautoscaling": { "support": "not supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "appsync": { "support": "not supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "athena": { "support": "not supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "autoscaling": { "support": "not supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "backup": { "support": "supported", - "test_suite": true + "test_suite": true, + "notes": "" }, "batch": { "support": "unknown", - "test_suite": true + "test_suite": true, + "notes": "" }, "ce": { "support": "not supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "cloudformation": { "support": "not supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "cloudfront": { "support": "supported", - "test_suite": true + "test_suite": true, + "notes": "" }, "cloudtrail": { "support": "supported", - "test_suite": true + "test_suite": true, + "notes": "" }, "cloudwatch": { "support": "supported", - "test_suite": true + "test_suite": true, + "notes": "" }, "codecommit": { "support": "supported", - "test_suite": true + "test_suite": true, + "notes": "" }, "cognito-identity": { "support": "supported", - "test_suite": true + "test_suite": true, + "notes": "" }, "cognito-idp": { "support": "supported", - "test_suite": true + "test_suite": true, + "notes": "" }, "config": { "support": "supported", - "test_suite": true + "test_suite": true, + "notes": "" }, "dms": { "support": "not supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "docdb": { "support": "not supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "dynamodb": { "support": "supported", - "test_suite": true + "test_suite": true, + "notes": "" }, "dynamodbstreams": { "support": "not supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "ec2": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "ecr": { "support": "supported", - "test_suite": true + "test_suite": true, + "notes": "" }, "ecs": { "support": "not supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "efs": { "support": "not supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "eks": { "support": "not supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "elasticache": { "support": "supported", - "test_suite": true + "test_suite": true, + "notes": "" }, "elasticbeanstalk": { "support": "not supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "elb": { "support": "not supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "elbv2": { "support": "not supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "emr": { "support": "not supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "es": { "support": "not supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "events": { "support": "not supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "firehose": { "support": "not supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "fis": { "support": "not supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "glacier": { "support": "supported", - "test_suite": true + "test_suite": true, + "notes": "" }, "glue": { "support": "not supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "iam": { "support": "supported", - "test_suite": true + "test_suite": true, + "notes": "" }, "identitystore": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "iot": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "iot-data": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "iotanalytics": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "iotwireless": { "support": "unknown", - "test_suite": false - }, - "kafka": { - "support": "supported with limitations", - "test_suite": true + "test_suite": false, + "notes": "" }, "kinesis": { "support": "supported", - "test_suite": true + "test_suite": true, + "notes": "" }, "kinesisanalytics": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "kinesisanalyticsv2": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "kms": { "support": "supported", - "test_suite": true + "test_suite": true, + "notes": "" }, "lakeformation": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "lambda": { "support": "supported with limitations", - "test_suite": true + "test_suite": true, + "notes": "Hot-Reloading is currently not supported (see https://github.com/localstack/localstack/issues/9974)." }, "logs": { "support": "supported", - "test_suite": true + "test_suite": true, + "notes": "" }, "managedblockchain": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "mediaconvert": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "mediastore": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "memorydb": { "support": "not supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "mq": { "support": "not supported", - "test_suite": false + "test_suite": false, + "notes": "" + }, + "msk": { + "support": "supported with limitations", + "test_suite": true, + "notes": "The Kafka instances are restored. However, their content is not." }, "mwaa": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "neptune": { "support": "not supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "opensearch": { "support": "not supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "organizations": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "pinpoint": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "pipes": { "support": "not supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "qldb": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "ram": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "rds": { "support": "supported with limitations", - "test_suite": true + "test_suite": true, + "notes": "" }, "rds-data": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "redshift": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "resource-groups": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "resourcegroupstaggingapi": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "route53": { "support": "supported", - "test_suite": true + "test_suite": true, + "notes": "" }, "route53resolver": { "support": "supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "s3": { "support": "supported", - "test_suite": true + "test_suite": true, + "notes": "" }, "sagemaker": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "scheduler": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "secretsmanager": { "support": "supported", - "test_suite": true + "test_suite": true, + "notes": "" }, "serverlessrepo": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "servicediscovery": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "ses": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "sesv2": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "sns": { "support": "supported", - "test_suite": true + "test_suite": true, + "notes": "" }, "sqs": { "support": "supported", - "test_suite": true + "test_suite": true, + "notes": "" }, "ssm": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "sso-admin": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "stepfunctions": { "support": "not supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "sts": { "support": "not supported", - "test_suite": false + "test_suite": false, + "notes": "" }, "support": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "swf": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "textract": { "support": "supported", - "test_suite": true + "test_suite": true, + "notes": "" }, "timestream": { "support": "supported", - "test_suite": true + "test_suite": true, + "notes": "" }, "transcribe": { "support": "supported", - "test_suite": true + "test_suite": true, + "notes": "" }, "transfer": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "verifiedpermissions": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "wafv2": { "support": "unknown", - "test_suite": false + "test_suite": false, + "notes": "" }, "xray": { "support": "unknown", - "test_suite": true + "test_suite": true, + "notes": "" } } \ No newline at end of file diff --git a/scripts/persistence/create_persistence_docs.py b/scripts/persistence/create_persistence_docs.py index 2ba6df4d6c..b3b7640acc 100644 --- a/scripts/persistence/create_persistence_docs.py +++ b/scripts/persistence/create_persistence_docs.py @@ -14,11 +14,11 @@ class CustomYAMLHandler(YAMLHandler): def export(self, metadata: dict[str, object], **kwargs: object) -> str: - """ - Settings sort keys as false to prevent sorting existing elements. - """ - kwargs.setdefault("sort_keys", False) - return super().export(metadata, **kwargs) + """ + Settings sort keys as false to prevent sorting existing elements. + """ + kwargs.setdefault("sort_keys", False) + return super().export(metadata, **kwargs) def format(self, post, **kwargs): """ @@ -48,7 +48,9 @@ def collect_status() -> dict: status = item.status.lower() statuses[service] = { "support": status, - "test_suite": item.has_test or False + "test_suite": item.has_test or False, + # we collect notes only for the services with some limitations + "notes": item.notes if "limit" in status else "" } return dict(sorted(statuses.items())) diff --git a/scripts/persistence/notion/catalog.py b/scripts/persistence/notion/catalog.py index dad688599a..23b2fd4224 100644 --- a/scripts/persistence/notion/catalog.py +++ b/scripts/persistence/notion/catalog.py @@ -8,7 +8,8 @@ Status, Database, Checkbox, - PeopleProperty + PeopleProperty, + Text ) DEFAULT_CATALOG_DATABASE_ID = "3c0f615e7ffc4ae2a034f1ed9c444bd2" @@ -20,6 +21,7 @@ class PersistenceServiceItem(Page): has_test = Checkbox("Persistence Tests") primary_owner = PeopleProperty("Primary Owner") secondary_owner = PeopleProperty("Secondary Owner(s)") + notes = Text("Notes about persistence") class PersistenceCatalog(Database[PersistenceServiceItem]): From 58379dcf2381e154ff3c6b918d6c0c5378e20bd4 Mon Sep 17 00:00:00 2001 From: Giovanni Grano Date: Tue, 14 May 2024 16:28:59 -0400 Subject: [PATCH 12/25] first attempt auto-generate a table --- .../state-management/support/index.md | 10 + data/persistence/coverage.json | 494 +++++++++++------- .../persistence/persistence_table.html | 16 + .../persistence/persistence_table_row.html | 14 + .../localstack_persistence_table.html | 3 + .../persistence/create_persistence_docs.py | 26 +- 6 files changed, 354 insertions(+), 209 deletions(-) create mode 100644 content/en/user-guide/state-management/support/index.md create mode 100644 layouts/partials/persistence/persistence_table.html create mode 100644 layouts/partials/persistence/persistence_table_row.html create mode 100644 layouts/shortcodes/localstack_persistence_table.html diff --git a/content/en/user-guide/state-management/support/index.md b/content/en/user-guide/state-management/support/index.md new file mode 100644 index 0000000000..932bdd18f2 --- /dev/null +++ b/content/en/user-guide/state-management/support/index.md @@ -0,0 +1,10 @@ +--- +title: Persistence Support for AWS Services +linkTitle: Persistence Support +description: Overview of the persistence support across the implemented AWS services +hide_readingtime: true +--- + +## Persistence Support Overview + +{{< localstack_persistence_table >}} diff --git a/data/persistence/coverage.json b/data/persistence/coverage.json index e28349a4d5..4d3a1fc3f0 100644 --- a/data/persistence/coverage.json +++ b/data/persistence/coverage.json @@ -1,492 +1,590 @@ -{ - "account": { +[ + { "support": "not supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "account" }, - "acm": { + { "support": "not supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "acm" }, - "acm-pca": { + { "support": "supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "acm-pca" }, - "amplify": { + { "support": "supported", "test_suite": true, - "notes": "" + "notes": "", + "service": "amplify" }, - "apigateway": { + { "support": "supported", "test_suite": true, - "notes": "" + "notes": "", + "service": "apigateway" }, - "appconfig": { + { "support": "unknown", "test_suite": true, - "notes": "" + "notes": "", + "service": "appconfig" }, - "applicationautoscaling": { + { "support": "not supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "applicationautoscaling" }, - "appsync": { + { "support": "not supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "appsync" }, - "athena": { + { "support": "not supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "athena" }, - "autoscaling": { + { "support": "not supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "autoscaling" }, - "backup": { + { "support": "supported", "test_suite": true, - "notes": "" + "notes": "", + "service": "backup" }, - "batch": { + { "support": "unknown", "test_suite": true, - "notes": "" + "notes": "", + "service": "batch" }, - "ce": { + { "support": "not supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "ce" }, - "cloudformation": { + { "support": "not supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "cloudformation" }, - "cloudfront": { + { "support": "supported", "test_suite": true, - "notes": "" + "notes": "", + "service": "cloudfront" }, - "cloudtrail": { + { "support": "supported", "test_suite": true, - "notes": "" + "notes": "", + "service": "cloudtrail" }, - "cloudwatch": { + { "support": "supported", "test_suite": true, - "notes": "" + "notes": "", + "service": "cloudwatch" }, - "codecommit": { + { "support": "supported", "test_suite": true, - "notes": "" + "notes": "", + "service": "codecommit" }, - "cognito-identity": { + { "support": "supported", "test_suite": true, - "notes": "" + "notes": "", + "service": "cognito-identity" }, - "cognito-idp": { + { "support": "supported", "test_suite": true, - "notes": "" + "notes": "", + "service": "cognito-idp" }, - "config": { + { "support": "supported", "test_suite": true, - "notes": "" + "notes": "", + "service": "config" }, - "dms": { + { "support": "not supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "dms" }, - "docdb": { + { "support": "not supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "docdb" }, - "dynamodb": { + { "support": "supported", "test_suite": true, - "notes": "" + "notes": "", + "service": "dynamodb" }, - "dynamodbstreams": { + { "support": "not supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "dynamodbstreams" }, - "ec2": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "ec2" }, - "ecr": { + { "support": "supported", "test_suite": true, - "notes": "" + "notes": "", + "service": "ecr" }, - "ecs": { + { "support": "not supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "ecs" }, - "efs": { + { "support": "not supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "efs" }, - "eks": { + { "support": "not supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "eks" }, - "elasticache": { + { "support": "supported", "test_suite": true, - "notes": "" + "notes": "", + "service": "elasticache" }, - "elasticbeanstalk": { + { "support": "not supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "elasticbeanstalk" }, - "elb": { + { "support": "not supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "elb" }, - "elbv2": { + { "support": "not supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "elbv2" }, - "emr": { + { "support": "not supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "emr" }, - "es": { + { "support": "not supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "es" }, - "events": { + { "support": "not supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "events" }, - "firehose": { + { "support": "not supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "firehose" }, - "fis": { + { "support": "not supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "fis" }, - "glacier": { + { "support": "supported", "test_suite": true, - "notes": "" + "notes": "", + "service": "glacier" }, - "glue": { + { "support": "not supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "glue" }, - "iam": { + { "support": "supported", "test_suite": true, - "notes": "" + "notes": "", + "service": "iam" }, - "identitystore": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "identitystore" }, - "iot": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "iot" }, - "iot-data": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "iot-data" }, - "iotanalytics": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "iotanalytics" }, - "iotwireless": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "iotwireless" }, - "kinesis": { + { "support": "supported", "test_suite": true, - "notes": "" + "notes": "", + "service": "kinesis" }, - "kinesisanalytics": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "kinesisanalytics" }, - "kinesisanalyticsv2": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "kinesisanalyticsv2" }, - "kms": { + { "support": "supported", "test_suite": true, - "notes": "" + "notes": "", + "service": "kms" }, - "lakeformation": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "lakeformation" }, - "lambda": { + { "support": "supported with limitations", "test_suite": true, - "notes": "Hot-Reloading is currently not supported (see https://github.com/localstack/localstack/issues/9974)." + "notes": "Hot-Reloading is currently not supported (see https://github.com/localstack/localstack/issues/9974).", + "service": "lambda" }, - "logs": { + { "support": "supported", "test_suite": true, - "notes": "" + "notes": "", + "service": "logs" }, - "managedblockchain": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "managedblockchain" }, - "mediaconvert": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "mediaconvert" }, - "mediastore": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "mediastore" }, - "memorydb": { + { "support": "not supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "memorydb" }, - "mq": { + { "support": "not supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "mq" }, - "msk": { + { "support": "supported with limitations", "test_suite": true, - "notes": "The Kafka instances are restored. However, their content is not." + "notes": "The Kafka instances are restored. However, their content is not.", + "service": "msk" }, - "mwaa": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "mwaa" }, - "neptune": { + { "support": "not supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "neptune" }, - "opensearch": { + { "support": "not supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "opensearch" }, - "organizations": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "organizations" }, - "pinpoint": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "pinpoint" }, - "pipes": { + { "support": "not supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "pipes" }, - "qldb": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "qldb" }, - "ram": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "ram" }, - "rds": { + { "support": "supported with limitations", "test_suite": true, - "notes": "" + "notes": "", + "service": "rds" }, - "rds-data": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "rds-data" }, - "redshift": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "redshift" }, - "resource-groups": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "resource-groups" }, - "resourcegroupstaggingapi": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "resourcegroupstaggingapi" }, - "route53": { + { "support": "supported", "test_suite": true, - "notes": "" + "notes": "", + "service": "route53" }, - "route53resolver": { + { "support": "supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "route53resolver" }, - "s3": { + { "support": "supported", "test_suite": true, - "notes": "" + "notes": "", + "service": "s3" }, - "sagemaker": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "sagemaker" }, - "scheduler": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "scheduler" }, - "secretsmanager": { + { "support": "supported", "test_suite": true, - "notes": "" + "notes": "", + "service": "secretsmanager" }, - "serverlessrepo": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "serverlessrepo" }, - "servicediscovery": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "servicediscovery" }, - "ses": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "ses" }, - "sesv2": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "sesv2" }, - "sns": { + { "support": "supported", "test_suite": true, - "notes": "" + "notes": "", + "service": "sns" }, - "sqs": { + { "support": "supported", "test_suite": true, - "notes": "" + "notes": "", + "service": "sqs" }, - "ssm": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "ssm" }, - "sso-admin": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "sso-admin" }, - "stepfunctions": { + { "support": "not supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "stepfunctions" }, - "sts": { + { "support": "not supported", "test_suite": false, - "notes": "" + "notes": "", + "service": "sts" }, - "support": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "support" }, - "swf": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "swf" }, - "textract": { + { "support": "supported", "test_suite": true, - "notes": "" + "notes": "", + "service": "textract" }, - "timestream": { + { "support": "supported", "test_suite": true, - "notes": "" + "notes": "", + "service": "timestream" }, - "transcribe": { + { "support": "supported", "test_suite": true, - "notes": "" + "notes": "", + "service": "transcribe" }, - "transfer": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "transfer" }, - "verifiedpermissions": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "verifiedpermissions" }, - "wafv2": { + { "support": "unknown", "test_suite": false, - "notes": "" + "notes": "", + "service": "wafv2" }, - "xray": { + { "support": "unknown", "test_suite": true, - "notes": "" + "notes": "", + "service": "xray" } -} \ No newline at end of file +] \ No newline at end of file diff --git a/layouts/partials/persistence/persistence_table.html b/layouts/partials/persistence/persistence_table.html new file mode 100644 index 0000000000..ffd443578c --- /dev/null +++ b/layouts/partials/persistence/persistence_table.html @@ -0,0 +1,16 @@ +
+ + + + + + + + + + + {{ partial "persistence/persistence_table_row" . }} + +
ServiceSupportedPersistence Test SuiteDetails
+
+
\ No newline at end of file diff --git a/layouts/partials/persistence/persistence_table_row.html b/layouts/partials/persistence/persistence_table_row.html new file mode 100644 index 0000000000..32dd1f55d3 --- /dev/null +++ b/layouts/partials/persistence/persistence_table_row.html @@ -0,0 +1,14 @@ +{{ $data := .Site.Data.persistence.coverage }} + +{{ range $data }} + + + {{ .service }} + + {{ .support }} + + {{ if (.test_suite) }} ✔️ {{ end }} + + {{ .notes }} + +{{ end }} \ No newline at end of file diff --git a/layouts/shortcodes/localstack_persistence_table.html b/layouts/shortcodes/localstack_persistence_table.html new file mode 100644 index 0000000000..eda2d62a6e --- /dev/null +++ b/layouts/shortcodes/localstack_persistence_table.html @@ -0,0 +1,3 @@ + + +{{ partial "persistence/persistence_table" . }} \ No newline at end of file diff --git a/scripts/persistence/create_persistence_docs.py b/scripts/persistence/create_persistence_docs.py index b3b7640acc..34034b393a 100644 --- a/scripts/persistence/create_persistence_docs.py +++ b/scripts/persistence/create_persistence_docs.py @@ -39,6 +39,8 @@ def format(self, post, **kwargs): def collect_status() -> dict: """Reads the catalog on Notion and returns the status of persistence for each service""" + if not token: + print("Aborting, please provide a NOTION_TOKEN in the env") notion_client = n_client.Client(auth=token) catalog_db = PersistenceCatalog(notion_client=notion_client) @@ -55,22 +57,22 @@ def collect_status() -> dict: return dict(sorted(statuses.items())) -def update_coverage_data(): - if not token: - print("Aborting, please provide a NOTION_TOKEN in the env") - statuses = collect_status() +def update_coverage_data(statuses: dict): if not os.path.exists(persistence_path): os.mkdir(persistence_path) + # transform the statuses dict into a list + _statuses = [] + for service, value in statuses.items(): + value["service"] = service + _statuses.append(value) + with open(persistence_data, 'w') as f: - json.dump(statuses, f, indent=2) + json.dump(_statuses, f, indent=2) -def update_frontmatter(): +def update_frontmatter(statuses: dict): """Updates the frontmatter of the service page in the user guide Markdown file""" - with open(persistence_data, 'r') as f: - content = f.read() - statuses = json.loads(content) for service, values in statuses.items(): # special case for cognito: if "cognito" in service: @@ -89,6 +91,8 @@ def update_frontmatter(): if __name__ == "__main__": - update_coverage_data() - update_frontmatter() + data = collect_status() + update_frontmatter(statuses=data) + update_coverage_data(statuses=data) + From 7e8f8df87b795c98e0fd391baa8ea42f2b785d42 Mon Sep 17 00:00:00 2001 From: Giovanni Grano Date: Tue, 14 May 2024 18:32:40 -0400 Subject: [PATCH 13/25] Some improvements --- config.toml | 3 +- .../state-management/persistence/index.md | 42 +- data/persistence/coverage.json | 696 ++++++++++-------- .../persistence/persistence_table.html | 2 +- .../persistence/persistence_table_row.html | 12 +- layouts/partials/taxonomy_terms_article.html | 36 + .../localstack_persistence_table.html | 2 - .../persistence/create_persistence_docs.py | 52 +- scripts/persistence/notion/catalog.py | 2 +- 9 files changed, 480 insertions(+), 367 deletions(-) create mode 100644 layouts/partials/taxonomy_terms_article.html diff --git a/config.toml b/config.toml index 368285f9b2..48c074ae9d 100644 --- a/config.toml +++ b/config.toml @@ -20,6 +20,7 @@ enableGitInfo = true [taxonomies] tag = "tags" category = "categories" +persistence_support = "persistence_support" [params.taxonomy] # set taxonomyCloud = [] to hide taxonomy clouds @@ -29,7 +30,7 @@ taxonomyCloud = [] taxonomyCloudTitle = ["Tag Cloud", "Categories"] # set taxonomyPageHeader = [] to hide taxonomies on the page headers -taxonomyPageHeader = ["tags"] +taxonomyPageHeader = ["tags", "persistence_support"] # Highlighting config diff --git a/content/en/user-guide/state-management/persistence/index.md b/content/en/user-guide/state-management/persistence/index.md index b927e96b0c..b3863f320c 100644 --- a/content/en/user-guide/state-management/persistence/index.md +++ b/content/en/user-guide/state-management/persistence/index.md @@ -101,47 +101,9 @@ $ curl -X POST localhost:4566/_localstack/state/save Although we are working to support both snapshot-based persistence and Cloud pods for all AWS services, there are some common issues, known limitations, and also services that are not well tested for persistence support. -Please help us improve persistence support by reporting bugs on our [GitHub issue tracker](https://github.com/localstack/localstack/issues/new/choose). +An overview is available [here]({{}}). -Here is a list of currently supported services and known issues. -Persistence for services that are _not_ listed here _may_ work correctly, but are untested and unsupported. - - -### Supported & tested - -* ACM -* Amplify -* API Gateway -* AppConfig -* AppSync -* CloudWatch -* Cognito -* DynamoDB -* IAM -* Kinesis -* KMS -* Lambda -* RDS: Postgres, MariaDB, MySQL -* Route53 -* S3 -* SecretsManager -* SNS -* SQS -* SSM -* Stepfunctions - -### Known limitations - -* **ElastiCache**: Redis instances are not restored -* **MSK**: Kafka brokers are not restored -* **EC2**: works for most resources, but emulated VM data is not restored -* **Firehose**: Kinesis delivery streams are not restored -* **RDS**: MSSQL database is not restored -* **Neptune**: database is not restored -* **DocDB**: database is not restored - -### Not Implemented -* MQ +Please help us improve persistence support by reporting bugs on our [GitHub issue tracker](https://github.com/localstack/localstack/issues/new/choose). ## Technical Details diff --git a/data/persistence/coverage.json b/data/persistence/coverage.json index 4d3a1fc3f0..0068c986a6 100644 --- a/data/persistence/coverage.json +++ b/data/persistence/coverage.json @@ -1,590 +1,688 @@ -[ - { +{ + "account": { + "service": "account", + "full_name": "AWS Account Management", "support": "not supported", "test_suite": false, - "notes": "", - "service": "account" + "limitations": "" }, - { + "acm": { + "service": "acm", + "full_name": "ACM (AWS Certificate Manager)", "support": "not supported", "test_suite": false, - "notes": "", - "service": "acm" + "limitations": "" }, - { + "acm-pca": { + "service": "acm-pca", + "full_name": "AWS Private Certificate Authority (CA)", "support": "supported", "test_suite": false, - "notes": "", - "service": "acm-pca" + "limitations": "" }, - { + "amplify": { + "service": "amplify", + "full_name": "Amplify", "support": "supported", "test_suite": true, - "notes": "", - "service": "amplify" + "limitations": "" }, - { + "apigateway": { + "service": "apigateway", + "full_name": "API Gateway", "support": "supported", "test_suite": true, - "notes": "", - "service": "apigateway" + "limitations": "" }, - { + "appconfig": { + "service": "appconfig", + "full_name": "AppConfig", "support": "unknown", "test_suite": true, - "notes": "", - "service": "appconfig" + "limitations": "" }, - { + "applicationautoscaling": { + "service": "applicationautoscaling", + "full_name": "applicationautoscaling", "support": "not supported", "test_suite": false, - "notes": "", - "service": "applicationautoscaling" + "limitations": "" }, - { + "appsync": { + "service": "appsync", + "full_name": "AppSync", "support": "not supported", "test_suite": false, - "notes": "", - "service": "appsync" + "limitations": "" }, - { + "athena": { + "service": "athena", + "full_name": "Athena", "support": "not supported", "test_suite": false, - "notes": "", - "service": "athena" + "limitations": "" }, - { + "autoscaling": { + "service": "autoscaling", + "full_name": "Auto Scaling", "support": "not supported", "test_suite": false, - "notes": "", - "service": "autoscaling" + "limitations": "" }, - { + "backup": { + "service": "backup", + "full_name": "Backup", "support": "supported", "test_suite": true, - "notes": "", - "service": "backup" + "limitations": "" }, - { + "batch": { + "service": "batch", + "full_name": "Batch", "support": "unknown", "test_suite": true, - "notes": "", - "service": "batch" + "limitations": "" }, - { + "ce": { + "service": "ce", + "full_name": "CE (Cost Explorer API)", "support": "not supported", "test_suite": false, - "notes": "", - "service": "ce" + "limitations": "" }, - { + "cloudformation": { + "service": "cloudformation", + "full_name": "CloudFormation", "support": "not supported", "test_suite": false, - "notes": "", - "service": "cloudformation" + "limitations": "" }, - { + "cloudfront": { + "service": "cloudfront", + "full_name": "CloudFront", "support": "supported", "test_suite": true, - "notes": "", - "service": "cloudfront" + "limitations": "" }, - { + "cloudtrail": { + "service": "cloudtrail", + "full_name": "CloudTrail", "support": "supported", "test_suite": true, - "notes": "", - "service": "cloudtrail" + "limitations": "" }, - { + "cloudwatch": { + "service": "cloudwatch", + "full_name": "CloudWatch", "support": "supported", "test_suite": true, - "notes": "", - "service": "cloudwatch" + "limitations": "" }, - { + "codecommit": { + "service": "codecommit", + "full_name": "CodeCommit", "support": "supported", "test_suite": true, - "notes": "", - "service": "codecommit" + "limitations": "" }, - { + "cognito-identity": { + "service": "cognito-identity", + "full_name": "Cognito Identity", "support": "supported", "test_suite": true, - "notes": "", - "service": "cognito-identity" + "limitations": "" }, - { + "cognito-idp": { + "service": "cognito-idp", + "full_name": "Cognito IDP (Cognito User Pools API)", "support": "supported", "test_suite": true, - "notes": "", - "service": "cognito-idp" + "limitations": "" }, - { + "config": { + "service": "config", + "full_name": "Config", "support": "supported", "test_suite": true, - "notes": "", - "service": "config" + "limitations": "" }, - { + "dms": { + "service": "dms", + "full_name": "dms", "support": "not supported", "test_suite": false, - "notes": "", - "service": "dms" + "limitations": "" }, - { + "docdb": { + "service": "docdb", + "full_name": "DocumentDB", "support": "not supported", "test_suite": false, - "notes": "", - "service": "docdb" + "limitations": "" }, - { + "dynamodb": { + "service": "dynamodb", + "full_name": "DynamoDB", "support": "supported", "test_suite": true, - "notes": "", - "service": "dynamodb" + "limitations": "" }, - { + "dynamodbstreams": { + "service": "dynamodbstreams", + "full_name": "DynamoDB Streams", "support": "not supported", "test_suite": false, - "notes": "", - "service": "dynamodbstreams" + "limitations": "" }, - { + "ec2": { + "service": "ec2", + "full_name": "EC2 (Elastic Compute Cloud)", "support": "unknown", "test_suite": false, - "notes": "", - "service": "ec2" + "limitations": "" }, - { + "ecr": { + "service": "ecr", + "full_name": "ECR (Elastic Container Registry)", "support": "supported", "test_suite": true, - "notes": "", - "service": "ecr" + "limitations": "" }, - { + "ecs": { + "service": "ecs", + "full_name": "ECS (Elastic Container Service)", "support": "not supported", "test_suite": false, - "notes": "", - "service": "ecs" + "limitations": "" }, - { + "efs": { + "service": "efs", + "full_name": "EFS (Elastic File System)", "support": "not supported", "test_suite": false, - "notes": "", - "service": "efs" + "limitations": "" }, - { + "eks": { + "service": "eks", + "full_name": "EKS (Elastic Kubernetes Service)", "support": "not supported", "test_suite": false, - "notes": "", - "service": "eks" + "limitations": "" }, - { + "elasticache": { + "service": "elasticache", + "full_name": "ElastiCache", "support": "supported", "test_suite": true, - "notes": "", - "service": "elasticache" + "limitations": "" }, - { + "elasticbeanstalk": { + "service": "elasticbeanstalk", + "full_name": "Elastic Beanstalk", "support": "not supported", "test_suite": false, - "notes": "", - "service": "elasticbeanstalk" + "limitations": "" }, - { + "elb": { + "service": "elb", + "full_name": "ELB (Elastic Load Balancer)", "support": "not supported", "test_suite": false, - "notes": "", - "service": "elb" + "limitations": "" }, - { + "elbv2": { + "service": "elbv2", + "full_name": "ELB v2 (Elastic Load Balancer v2)", "support": "not supported", "test_suite": false, - "notes": "", - "service": "elbv2" + "limitations": "" }, - { + "emr": { + "service": "emr", + "full_name": "EMR (Elastic MapReduce)", "support": "not supported", "test_suite": false, - "notes": "", - "service": "emr" + "limitations": "" }, - { + "es": { + "service": "es", + "full_name": "ES (OpenSearch, legacy Elasticsearch)", "support": "not supported", "test_suite": false, - "notes": "", - "service": "es" + "limitations": "" }, - { + "events": { + "service": "events", + "full_name": "EventBridge", "support": "not supported", "test_suite": false, - "notes": "", - "service": "events" + "limitations": "" }, - { + "firehose": { + "service": "firehose", + "full_name": "Kinesis Data Firehose", "support": "not supported", "test_suite": false, - "notes": "", - "service": "firehose" + "limitations": "" }, - { + "fis": { + "service": "fis", + "full_name": "FIS (Fault Injection Simulator)", "support": "not supported", "test_suite": false, - "notes": "", - "service": "fis" + "limitations": "" }, - { + "glacier": { + "service": "glacier", + "full_name": "Glacier (S3 Glacier)", "support": "supported", "test_suite": true, - "notes": "", - "service": "glacier" + "limitations": "" }, - { + "glue": { + "service": "glue", + "full_name": "Glue", "support": "not supported", "test_suite": false, - "notes": "", - "service": "glue" + "limitations": "" }, - { + "iam": { + "service": "iam", + "full_name": "IAM (Identity and Access Management)", "support": "supported", "test_suite": true, - "notes": "", - "service": "iam" + "limitations": "" }, - { + "identitystore": { + "service": "identitystore", + "full_name": "identitystore", "support": "unknown", "test_suite": false, - "notes": "", - "service": "identitystore" + "limitations": "" }, - { + "iot": { + "service": "iot", + "full_name": "IoT (Internet of Things)", "support": "unknown", "test_suite": false, - "notes": "", - "service": "iot" + "limitations": "" }, - { + "iot-data": { + "service": "iot-data", + "full_name": "IoT Data", "support": "unknown", "test_suite": false, - "notes": "", - "service": "iot-data" + "limitations": "" }, - { + "iotanalytics": { + "service": "iotanalytics", + "full_name": "IoT Analytics", "support": "unknown", "test_suite": false, - "notes": "", - "service": "iotanalytics" + "limitations": "" }, - { + "iotwireless": { + "service": "iotwireless", + "full_name": "IoT Wireless", "support": "unknown", "test_suite": false, - "notes": "", - "service": "iotwireless" + "limitations": "" }, - { + "kafka": { + "service": "kafka", + "full_name": "MSK (Managed Streaming for Apache Kafka)", + "support": "supported with limitations", + "test_suite": true, + "limitations": "The Kafka instances are restored. However, their content is not." + }, + "kinesis": { + "service": "kinesis", + "full_name": "Kinesis", "support": "supported", "test_suite": true, - "notes": "", - "service": "kinesis" + "limitations": "" }, - { + "kinesisanalytics": { + "service": "kinesisanalytics", + "full_name": "Kinesis Data Analytics API", "support": "unknown", "test_suite": false, - "notes": "", - "service": "kinesisanalytics" + "limitations": "" }, - { + "kinesisanalyticsv2": { + "service": "kinesisanalyticsv2", + "full_name": "Kinesis Data Analytics API v2", "support": "unknown", "test_suite": false, - "notes": "", - "service": "kinesisanalyticsv2" + "limitations": "" }, - { + "kms": { + "service": "kms", + "full_name": "KMS (Key Management Service)", "support": "supported", "test_suite": true, - "notes": "", - "service": "kms" + "limitations": "" }, - { + "lakeformation": { + "service": "lakeformation", + "full_name": "Lake Formation", "support": "unknown", "test_suite": false, - "notes": "", - "service": "lakeformation" + "limitations": "" }, - { + "lambda": { + "service": "lambda", + "full_name": "Lambda", "support": "supported with limitations", "test_suite": true, - "notes": "Hot-Reloading is currently not supported (see https://github.com/localstack/localstack/issues/9974).", - "service": "lambda" + "limitations": "Hot-Reloading is currently not supported (see https://github.com/localstack/localstack/issues/9974)." }, - { + "logs": { + "service": "logs", + "full_name": "CloudWatch Logs", "support": "supported", "test_suite": true, - "notes": "", - "service": "logs" + "limitations": "" }, - { + "managedblockchain": { + "service": "managedblockchain", + "full_name": "managedblockchain", "support": "unknown", "test_suite": false, - "notes": "", - "service": "managedblockchain" + "limitations": "" }, - { + "mediaconvert": { + "service": "mediaconvert", + "full_name": "mediaconvert", "support": "unknown", "test_suite": false, - "notes": "", - "service": "mediaconvert" + "limitations": "" }, - { + "mediastore": { + "service": "mediastore", + "full_name": "Elemental MediaStore", "support": "unknown", "test_suite": false, - "notes": "", - "service": "mediastore" + "limitations": "" }, - { + "memorydb": { + "service": "memorydb", + "full_name": "MemoryDB for Redis", "support": "not supported", "test_suite": false, - "notes": "", - "service": "memorydb" + "limitations": "" }, - { + "mq": { + "service": "mq", + "full_name": "Amazon MQ", "support": "not supported", "test_suite": false, - "notes": "", - "service": "mq" - }, - { - "support": "supported with limitations", - "test_suite": true, - "notes": "The Kafka instances are restored. However, their content is not.", - "service": "msk" + "limitations": "" }, - { + "mwaa": { + "service": "mwaa", + "full_name": "MWAA (Managed Workflows for Apache Airflow)", "support": "unknown", "test_suite": false, - "notes": "", - "service": "mwaa" + "limitations": "" }, - { + "neptune": { + "service": "neptune", + "full_name": "Neptune", "support": "not supported", "test_suite": false, - "notes": "", - "service": "neptune" + "limitations": "" }, - { + "opensearch": { + "service": "opensearch", + "full_name": "OpenSearch", "support": "not supported", "test_suite": false, - "notes": "", - "service": "opensearch" + "limitations": "" }, - { + "organizations": { + "service": "organizations", + "full_name": "Organizations", "support": "unknown", "test_suite": false, - "notes": "", - "service": "organizations" + "limitations": "" }, - { + "pinpoint": { + "service": "pinpoint", + "full_name": "pinpoint", "support": "unknown", "test_suite": false, - "notes": "", - "service": "pinpoint" + "limitations": "" }, - { + "pipes": { + "service": "pipes", + "full_name": "Pipes (EventBridge Pipes)", "support": "not supported", "test_suite": false, - "notes": "", - "service": "pipes" + "limitations": "" }, - { + "qldb": { + "service": "qldb", + "full_name": "QLDB (Quantum Ledger Database)", "support": "unknown", "test_suite": false, - "notes": "", - "service": "qldb" + "limitations": "" }, - { + "ram": { + "service": "ram", + "full_name": "ram (Resource Access Manager)", "support": "unknown", "test_suite": false, - "notes": "", - "service": "ram" + "limitations": "" }, - { + "rds": { + "service": "rds", + "full_name": "RDS (Relational Database Service)", "support": "supported with limitations", "test_suite": true, - "notes": "", - "service": "rds" + "limitations": "MSSQL does not support persistence." }, - { + "rds-data": { + "service": "rds-data", + "full_name": "RDS data (Relational Database Service Data)", "support": "unknown", "test_suite": false, - "notes": "", - "service": "rds-data" + "limitations": "" }, - { + "redshift": { + "service": "redshift", + "full_name": "Redshift", "support": "unknown", "test_suite": false, - "notes": "", - "service": "redshift" + "limitations": "" }, - { + "resource-groups": { + "service": "resource-groups", + "full_name": "Resource Groups", "support": "unknown", "test_suite": false, - "notes": "", - "service": "resource-groups" + "limitations": "" }, - { + "resourcegroupstaggingapi": { + "service": "resourcegroupstaggingapi", + "full_name": "Resource Groups Tagging API", "support": "unknown", "test_suite": false, - "notes": "", - "service": "resourcegroupstaggingapi" + "limitations": "" }, - { + "route53": { + "service": "route53", + "full_name": "Route 53", "support": "supported", "test_suite": true, - "notes": "", - "service": "route53" + "limitations": "" }, - { + "route53resolver": { + "service": "route53resolver", + "full_name": "Route 53 Resolver", "support": "supported", "test_suite": false, - "notes": "", - "service": "route53resolver" + "limitations": "" }, - { + "s3": { + "service": "s3", + "full_name": "S3 (Simple Storage Service)", "support": "supported", "test_suite": true, - "notes": "", - "service": "s3" + "limitations": "" }, - { + "sagemaker": { + "service": "sagemaker", + "full_name": "SageMaker", "support": "unknown", "test_suite": false, - "notes": "", - "service": "sagemaker" + "limitations": "" }, - { + "scheduler": { + "service": "scheduler", + "full_name": "scheduler (EventBridge Scheduler)", "support": "unknown", "test_suite": false, - "notes": "", - "service": "scheduler" + "limitations": "" }, - { + "secretsmanager": { + "service": "secretsmanager", + "full_name": "Secrets Manager", "support": "supported", "test_suite": true, - "notes": "", - "service": "secretsmanager" + "limitations": "" }, - { + "serverlessrepo": { + "service": "serverlessrepo", + "full_name": "Serverless Application Repository", "support": "unknown", "test_suite": false, - "notes": "", - "service": "serverlessrepo" + "limitations": "" }, - { + "servicediscovery": { + "service": "servicediscovery", + "full_name": "Service Discovery (Cloud Map)", "support": "unknown", "test_suite": false, - "notes": "", - "service": "servicediscovery" + "limitations": "" }, - { + "ses": { + "service": "ses", + "full_name": "SES (Simple Email Service)", "support": "unknown", "test_suite": false, - "notes": "", - "service": "ses" + "limitations": "" }, - { + "sesv2": { + "service": "sesv2", + "full_name": "SES v2 (Simple Email Service v2)", "support": "unknown", "test_suite": false, - "notes": "", - "service": "sesv2" + "limitations": "" }, - { + "sns": { + "service": "sns", + "full_name": "SNS (Simple Notification Service)", "support": "supported", "test_suite": true, - "notes": "", - "service": "sns" + "limitations": "" }, - { + "sqs": { + "service": "sqs", + "full_name": "SQS (Simple Queue Service)", "support": "supported", "test_suite": true, - "notes": "", - "service": "sqs" + "limitations": "" }, - { + "ssm": { + "service": "ssm", + "full_name": "SSM (Web Services Systems Manager)", "support": "unknown", "test_suite": false, - "notes": "", - "service": "ssm" + "limitations": "" }, - { + "sso-admin": { + "service": "sso-admin", + "full_name": "sso-admin (IAM Identity Center (successor to Single Sign-On))", "support": "unknown", "test_suite": false, - "notes": "", - "service": "sso-admin" + "limitations": "" }, - { + "stepfunctions": { + "service": "stepfunctions", + "full_name": "Step Functions", "support": "not supported", "test_suite": false, - "notes": "", - "service": "stepfunctions" + "limitations": "" }, - { + "sts": { + "service": "sts", + "full_name": "STS (Security Token Service)", "support": "not supported", "test_suite": false, - "notes": "", - "service": "sts" + "limitations": "" }, - { + "support": { + "service": "support", + "full_name": "Support API", "support": "unknown", "test_suite": false, - "notes": "", - "service": "support" + "limitations": "" }, - { + "swf": { + "service": "swf", + "full_name": "SWF (Simple Workflow Service)", "support": "unknown", "test_suite": false, - "notes": "", - "service": "swf" + "limitations": "" }, - { + "textract": { + "service": "textract", + "full_name": "textract", "support": "supported", "test_suite": true, - "notes": "", - "service": "textract" + "limitations": "" }, - { + "timestream": { + "service": "timestream", + "full_name": "timestream", "support": "supported", "test_suite": true, - "notes": "", - "service": "timestream" + "limitations": "" }, - { + "transcribe": { + "service": "transcribe", + "full_name": "Transcribe", "support": "supported", "test_suite": true, - "notes": "", - "service": "transcribe" + "limitations": "" }, - { + "transfer": { + "service": "transfer", + "full_name": "Transfer", "support": "unknown", "test_suite": false, - "notes": "", - "service": "transfer" + "limitations": "" }, - { + "verifiedpermissions": { + "service": "verifiedpermissions", + "full_name": "verifiedpermissions", "support": "unknown", "test_suite": false, - "notes": "", - "service": "verifiedpermissions" + "limitations": "" }, - { + "wafv2": { + "service": "wafv2", + "full_name": "wafv2", "support": "unknown", "test_suite": false, - "notes": "", - "service": "wafv2" + "limitations": "" }, - { + "xray": { + "service": "xray", + "full_name": "X-Ray", "support": "unknown", "test_suite": true, - "notes": "", - "service": "xray" + "limitations": "" } -] \ No newline at end of file +} \ No newline at end of file diff --git a/layouts/partials/persistence/persistence_table.html b/layouts/partials/persistence/persistence_table.html index ffd443578c..7ac7353ffe 100644 --- a/layouts/partials/persistence/persistence_table.html +++ b/layouts/partials/persistence/persistence_table.html @@ -5,7 +5,7 @@ Service Supported Persistence Test Suite - Details + Limitations diff --git a/layouts/partials/persistence/persistence_table_row.html b/layouts/partials/persistence/persistence_table_row.html index 32dd1f55d3..4dc5d23840 100644 --- a/layouts/partials/persistence/persistence_table_row.html +++ b/layouts/partials/persistence/persistence_table_row.html @@ -3,12 +3,16 @@ {{ range $data }} - {{ .service }} + {{ .full_name }} - {{ .support }} + + {{ if or (eq .support "supported") (eq .support "supported with limitations") -}} + ✔️ + {{ end }} + {{ if (.test_suite) }} ✔️ {{ end }} - - {{ .notes }} + + {{ .limitations }} {{ end }} \ No newline at end of file diff --git a/layouts/partials/taxonomy_terms_article.html b/layouts/partials/taxonomy_terms_article.html new file mode 100644 index 0000000000..c79df15c38 --- /dev/null +++ b/layouts/partials/taxonomy_terms_article.html @@ -0,0 +1,36 @@ +{{ $context := .context -}} +{{ $taxo := .taxo -}} + +{{ if not (eq $taxo "persistence_support") }} + + {{ if (gt (len ($context.GetTerms $taxo)) 0) -}} +
+
{{ humanize $taxo }}:
+ +
+ {{ end -}} +{{ else }} + + {{ $taxonomy := $context.GetTerms $taxo }} + {{ $supported := where $taxonomy ".LinkTitle" "eq" "supported" }} + {{ $supportedLimit := where $taxonomy ".LinkTitle" "eq" "supported with limitations" }} + {{ if or ($supported) ($supportedLimit) }} +
+ {{ $persistencePage := .Site.GetPage "/user-guide/state-management/support.md" }} +
Persistence:
+ +
+ {{ end -}} +{{ end -}} diff --git a/layouts/shortcodes/localstack_persistence_table.html b/layouts/shortcodes/localstack_persistence_table.html index eda2d62a6e..6e9272a897 100644 --- a/layouts/shortcodes/localstack_persistence_table.html +++ b/layouts/shortcodes/localstack_persistence_table.html @@ -1,3 +1 @@ - - {{ partial "persistence/persistence_table" . }} \ No newline at end of file diff --git a/scripts/persistence/create_persistence_docs.py b/scripts/persistence/create_persistence_docs.py index 34034b393a..f832234601 100644 --- a/scripts/persistence/create_persistence_docs.py +++ b/scripts/persistence/create_persistence_docs.py @@ -1,6 +1,7 @@ import os from io import BytesIO import json +from pathlib import Path import notion_client as n_client import frontmatter from frontmatter.default_handlers import YAMLHandler, DEFAULT_POST_TEMPLATE @@ -37,6 +38,23 @@ def format(self, post, **kwargs): ).lstrip() +def lookup_full_name(shortname: str) -> str: + """Given the short default name of a service, looks up for the full name""" + service_lookup = Path("../../data/coverage/service_display_name.json") + service_info = {} + if service_lookup.exists() and service_lookup.is_file(): + with open(service_lookup, "r") as f: + service_info = json.load(f) + + service_name_title = shortname + + if service_name_details := service_info.get(shortname, {}): + service_name_title = service_name_details.get("long_name", shortname) + if service_name_title and (short_name := service_name_details.get("short_name")): + service_name_title = f"{short_name} ({service_name_title})" + return service_name_title + + def collect_status() -> dict: """Reads the catalog on Notion and returns the status of persistence for each service""" if not token: @@ -49,34 +67,33 @@ def collect_status() -> dict: service = item.name.replace('_', '-') status = item.status.lower() statuses[service] = { + "service": service, + "full_name": lookup_full_name(service), "support": status, "test_suite": item.has_test or False, - # we collect notes only for the services with some limitations - "notes": item.notes if "limit" in status else "" + # we collect limitations notes only for the services explicitly marked with limitations + "limitations": item.limitations if "limit" in status else "" } - return dict(sorted(statuses.items())) - + statuses = dict(sorted(statuses.items())) -def update_coverage_data(statuses: dict): + # save the data if not os.path.exists(persistence_path): os.mkdir(persistence_path) - - # transform the statuses dict into a list - _statuses = [] - for service, value in statuses.items(): - value["service"] = service - _statuses.append(value) - with open(persistence_data, 'w') as f: - json.dump(_statuses, f, indent=2) - + json.dump(statuses, f, indent=2) + return statuses + def update_frontmatter(statuses: dict): """Updates the frontmatter of the service page in the user guide Markdown file""" for service, values in statuses.items(): - # special case for cognito: + + # a bunch of special cases if "cognito" in service: service = "cognito" + if service == "kafka": + service = "msk" + _path = os.path.join(markdown_path, service, "index.md") if not os.path.exists(_path): print(f" Can't find index.md file for {service}") @@ -86,13 +103,10 @@ def update_frontmatter(statuses: dict): content = frontmatter.load(_path, handler=CustomYAMLHandler()) desc = content.metadata["description"] content.metadata["description"] = desc.strip() - content.metadata["persistence"] = values.get("support", "unknown") + content.metadata["persistence_support"] = values.get("support", "unknown") frontmatter.dump(content, _path) if __name__ == "__main__": data = collect_status() update_frontmatter(statuses=data) - update_coverage_data(statuses=data) - - diff --git a/scripts/persistence/notion/catalog.py b/scripts/persistence/notion/catalog.py index 23b2fd4224..255dc92954 100644 --- a/scripts/persistence/notion/catalog.py +++ b/scripts/persistence/notion/catalog.py @@ -21,7 +21,7 @@ class PersistenceServiceItem(Page): has_test = Checkbox("Persistence Tests") primary_owner = PeopleProperty("Primary Owner") secondary_owner = PeopleProperty("Secondary Owner(s)") - notes = Text("Notes about persistence") + limitations = Text("Limitations") class PersistenceCatalog(Database[PersistenceServiceItem]): From 2853a670a08fa5a813f4245d165b92b6f6b41421 Mon Sep 17 00:00:00 2001 From: Giovanni Grano Date: Wed, 15 May 2024 17:00:36 -0400 Subject: [PATCH 14/25] fix to fetch the page site --- layouts/partials/taxonomy_terms_article.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layouts/partials/taxonomy_terms_article.html b/layouts/partials/taxonomy_terms_article.html index c79df15c38..22bc3502e0 100644 --- a/layouts/partials/taxonomy_terms_article.html +++ b/layouts/partials/taxonomy_terms_article.html @@ -20,7 +20,7 @@
{{ humanize $taxo }}:
{{ $supportedLimit := where $taxonomy ".LinkTitle" "eq" "supported with limitations" }} {{ if or ($supported) ($supportedLimit) }}
- {{ $persistencePage := .Site.GetPage "/user-guide/state-management/support.md" }} + {{ $persistencePage := $context.Site.GetPage "/user-guide/state-management/support.md" }}
Persistence:
    {{ range ($context.GetTerms $taxo) -}} From d7ff10d690fdaef8d0e225c2bf989ed2f8df9350 Mon Sep 17 00:00:00 2001 From: Giovanni Grano Date: Thu, 16 May 2024 11:52:53 -0400 Subject: [PATCH 15/25] avoid the overwrite the docsy partial --- layouts/partials/taxonomy_terms_article.html | 36 -------------------- layouts/persistence_support/taxonomy.html | 11 ++++++ 2 files changed, 11 insertions(+), 36 deletions(-) delete mode 100644 layouts/partials/taxonomy_terms_article.html create mode 100644 layouts/persistence_support/taxonomy.html diff --git a/layouts/partials/taxonomy_terms_article.html b/layouts/partials/taxonomy_terms_article.html deleted file mode 100644 index 22bc3502e0..0000000000 --- a/layouts/partials/taxonomy_terms_article.html +++ /dev/null @@ -1,36 +0,0 @@ -{{ $context := .context -}} -{{ $taxo := .taxo -}} - -{{ if not (eq $taxo "persistence_support") }} - - {{ if (gt (len ($context.GetTerms $taxo)) 0) -}} -
    -
    {{ humanize $taxo }}:
    - -
    - {{ end -}} -{{ else }} - - {{ $taxonomy := $context.GetTerms $taxo }} - {{ $supported := where $taxonomy ".LinkTitle" "eq" "supported" }} - {{ $supportedLimit := where $taxonomy ".LinkTitle" "eq" "supported with limitations" }} - {{ if or ($supported) ($supportedLimit) }} -
    - {{ $persistencePage := $context.Site.GetPage "/user-guide/state-management/support.md" }} -
    Persistence:
    - -
    - {{ end -}} -{{ end -}} diff --git a/layouts/persistence_support/taxonomy.html b/layouts/persistence_support/taxonomy.html new file mode 100644 index 0000000000..4e59e30cfd --- /dev/null +++ b/layouts/persistence_support/taxonomy.html @@ -0,0 +1,11 @@ + + + + + + Persistence Overview Redirect + + + + + \ No newline at end of file From 8fee6bb1b8e601f1c49848be9b4cc4f9751e042a Mon Sep 17 00:00:00 2001 From: Giovanni Grano Date: Thu, 16 May 2024 11:54:26 -0400 Subject: [PATCH 16/25] skip taxonomy to the front matter for unsupported services --- scripts/persistence/create_persistence_docs.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/scripts/persistence/create_persistence_docs.py b/scripts/persistence/create_persistence_docs.py index f832234601..337e93c1fd 100644 --- a/scripts/persistence/create_persistence_docs.py +++ b/scripts/persistence/create_persistence_docs.py @@ -98,7 +98,13 @@ def update_frontmatter(statuses: dict): if not os.path.exists(_path): print(f" Can't find index.md file for {service}") continue - + + support_value = values.get("support") + is_supported = support_value == "supported" or support_value == "supported with limitations" + if not is_supported: + # we don't want to modify the frontmatter for the services not supporting persistence + continue + # open the markdown file and read the content content = frontmatter.load(_path, handler=CustomYAMLHandler()) desc = content.metadata["description"] From cc0262d973280a17c316f7f7c014683858a145f7 Mon Sep 17 00:00:00 2001 From: Giovanni Grano Date: Thu, 16 May 2024 14:41:19 -0400 Subject: [PATCH 17/25] moved to ruamel to preseve quotes --- .../persistence/create_persistence_docs.py | 19 ++++++++++++++----- scripts/persistence/requirements.txt | 1 + 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/scripts/persistence/create_persistence_docs.py b/scripts/persistence/create_persistence_docs.py index 337e93c1fd..9e2d119c69 100644 --- a/scripts/persistence/create_persistence_docs.py +++ b/scripts/persistence/create_persistence_docs.py @@ -4,6 +4,7 @@ from pathlib import Path import notion_client as n_client import frontmatter +from ruamel.yaml import YAML from frontmatter.default_handlers import YAMLHandler, DEFAULT_POST_TEMPLATE from notion.catalog import PersistenceCatalog @@ -14,12 +15,20 @@ class CustomYAMLHandler(YAMLHandler): + + def load(self, fm: str, **kwargs: object): + yaml = YAML() + yaml.default_flow_style = False + yaml.preserve_quotes = True + return yaml.load(fm, **kwargs) # type: ignore[arg-type] + def export(self, metadata: dict[str, object], **kwargs: object) -> str: - """ - Settings sort keys as false to prevent sorting existing elements. - """ - kwargs.setdefault("sort_keys", False) - return super().export(metadata, **kwargs) + yaml = YAML() + yaml.default_flow_style = False + from io import StringIO + stream = StringIO() + yaml.dump(metadata, stream) + return stream.getvalue() def format(self, post, **kwargs): """ diff --git a/scripts/persistence/requirements.txt b/scripts/persistence/requirements.txt index 0498439f43..96912a1d15 100644 --- a/scripts/persistence/requirements.txt +++ b/scripts/persistence/requirements.txt @@ -1,3 +1,4 @@ notion-client==2.2.1 notion-objects==0.6.2 python-frontmatter==1.1.0 +ruamel.yaml==0.18.6 From 1fb46709841c8512c691390bb4668b4ff49036c3 Mon Sep 17 00:00:00 2001 From: Giovanni Grano Date: Thu, 16 May 2024 14:44:11 -0400 Subject: [PATCH 18/25] fix PR comment; iterate on table partial --- layouts/partials/persistence/persistence_table.html | 8 ++++++-- layouts/partials/persistence/persistence_table_row.html | 6 +----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/layouts/partials/persistence/persistence_table.html b/layouts/partials/persistence/persistence_table.html index 7ac7353ffe..e149a36cbd 100644 --- a/layouts/partials/persistence/persistence_table.html +++ b/layouts/partials/persistence/persistence_table.html @@ -8,8 +8,12 @@ Limitations - - {{ partial "persistence/persistence_table_row" . }} + + {{ $data := .Site.Data.persistence.coverage }} + + {{ range $data }} + {{ partial "persistence/persistence_table_row" . }} + {{ end -}}
    diff --git a/layouts/partials/persistence/persistence_table_row.html b/layouts/partials/persistence/persistence_table_row.html index 4dc5d23840..1f42208fff 100644 --- a/layouts/partials/persistence/persistence_table_row.html +++ b/layouts/partials/persistence/persistence_table_row.html @@ -1,6 +1,3 @@ -{{ $data := .Site.Data.persistence.coverage }} - -{{ range $data }} {{ .full_name }} @@ -14,5 +11,4 @@ {{ if (.test_suite) }} ✔️ {{ end }} {{ .limitations }} - -{{ end }} \ No newline at end of file + \ No newline at end of file From fe3ca63e692418a05778ef5f0ce66d8c16cabf9f Mon Sep 17 00:00:00 2001 From: Giovanni Grano Date: Thu, 16 May 2024 15:11:12 -0400 Subject: [PATCH 19/25] removed ambiguous refs to change taxonomy name --- config.toml | 4 ++-- content/en/references/configuration.md | 6 +++--- content/en/user-guide/aws/sqs/index.md | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/config.toml b/config.toml index 48c074ae9d..a2a9da7fe5 100644 --- a/config.toml +++ b/config.toml @@ -20,7 +20,7 @@ enableGitInfo = true [taxonomies] tag = "tags" category = "categories" -persistence_support = "persistence_support" +persistence = "persistence" [params.taxonomy] # set taxonomyCloud = [] to hide taxonomy clouds @@ -30,7 +30,7 @@ taxonomyCloud = [] taxonomyCloudTitle = ["Tag Cloud", "Categories"] # set taxonomyPageHeader = [] to hide taxonomies on the page headers -taxonomyPageHeader = ["tags", "persistence_support"] +taxonomyPageHeader = ["tags", "persistence"] # Highlighting config diff --git a/content/en/references/configuration.md b/content/en/references/configuration.md index 3bfbe25028..2bf3104854 100644 --- a/content/en/references/configuration.md +++ b/content/en/references/configuration.md @@ -30,7 +30,7 @@ Options that affect the core LocalStack system. | `GATEWAY_LISTEN`| `0.0.0.0:4566` (default in Docker mode) `127.0.0.1:4566` (default in host mode) | Configures the bind addresses of LocalStack. It has the form `:(,:)*`. LocalStack Pro adds port `443`. | | `LOCALSTACK_HOST`| `localhost.localstack.cloud:4566` (default) | This is interpolated into URLs and addresses that are returned by LocalStack. It has the form `:`. | | `USE_SSL` | `0` (default) | Whether to return URLs using HTTP (`0`) or HTTPS (`1`). Changed with 3.0.0. In earlier versions this was toggling SSL support on or off. | -| `PERSISTENCE` | `0` (default) | Enable persistence. See [Persistence Mechanism]({{< ref "persistence" >}}) and [Filesystem Layout]({{< ref "filesystem" >}}). | +| `PERSISTENCE` | `0` (default) | Enable persistence. See [Persistence Mechanism]({{< ref "user-guide/state-management/persistence" >}}) and [Filesystem Layout]({{< ref "filesystem" >}}). | | `MAIN_CONTAINER_NAME` | `localstack-main` (default) | Specify the main docker container name | | `LS_LOG` | `trace`, `trace-internal`, `debug`, `info`, `warn`, `error`, `warning`| Specify the log level. Currently overrides the `DEBUG` configuration. `trace` for detailed request/response, `trace-internal` for internal calls, too. | | `EXTERNAL_SERVICE_PORTS_START` | `4510` (default) | Start of the [External Service Port Range]({{< ref "external-ports" >}}) (inclusive). | @@ -309,13 +309,13 @@ Please check with your SMTP email service provider for the following settings. ## Persistence -To learn more about these configuration options, see [Persistence]({{< ref "persistence" >}}). +To learn more about these configuration options, see [Persistence]({{< ref "user-guide/state-management/persistence" >}}). | Variable | Valid options | Description | | - | - | - | | `SNAPSHOT_SAVE_STRATEGY` | `ON_SHUTDOWN`\|`ON_REQUEST`\|`SCHEDULED`\|`MANUAL` | Strategy that governs when LocalStack should make state snapshots | | `SNAPSHOT_LOAD_STRATEGY` | `ON_STARTUP`\|`ON_REQUEST`\|`MANUAL` | Strategy that governs when LocalStack restores state snapshots | -| `SNAPSHOT_FLUSH_INTERVAL` | 15 (default) | The interval (in seconds) between persistence snapshots. It only applies to a `SCHEDULED` save strategy (see [Persistence Mechanism]({{< ref "persistence" >}}))| +| `SNAPSHOT_FLUSH_INTERVAL` | 15 (default) | The interval (in seconds) between persistence snapshots. It only applies to a `SCHEDULED` save strategy (see [Persistence Mechanism]({{< ref "user-guide/state-management/persistence" >}}))| | `AUTO_LOAD_POD` | | Comma-separated list of Cloud Pods to be automatically loaded at startup time. This feature is disabled when snapshot persistence is set via the `PERSISTENCE` variable. | | `POD_LOAD_CLI_TIMEOUT` | 60 (default) | Timeout in seconds to wait before returning from load operations on the Cloud Pods CLI | diff --git a/content/en/user-guide/aws/sqs/index.md b/content/en/user-guide/aws/sqs/index.md index 1b9d7f53f3..3d0d2fb6b6 100644 --- a/content/en/user-guide/aws/sqs/index.md +++ b/content/en/user-guide/aws/sqs/index.md @@ -288,7 +288,7 @@ In AWS, valid values for message retention range from 60 (1 minute) to 1,209,600 In LocalStack, we do not put constraints on the value which can be helpful for test scenarios. {{< callout >}} -Note that, if you enable this option, [persistence]({{< ref "persistence" >}}) or [cloud pods]({{}}) for SQS may not work as expected. +Note that, if you enable this option, [persistence]({{< ref "user-guide/state-management/persistence" >}}) or [cloud pods]({{}}) for SQS may not work as expected. The reason is that, LocalStack does not adjust timestamps when restoring a state, so time appears to pass between LocalStack runs. Consequently, when you restart LocalStack after a period that is longer than the message retention period, LocalStack will remove all those messages when SQS starts. {{}} From bb7b8f0debc55341a55a22c5e8ad61bc1fc87422 Mon Sep 17 00:00:00 2001 From: Giovanni Grano Date: Thu, 16 May 2024 15:19:00 -0400 Subject: [PATCH 20/25] rename layouts and modify script to match new taxonomy name --- layouts/{persistence_support => persistence}/taxonomy.html | 0 scripts/persistence/create_persistence_docs.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename layouts/{persistence_support => persistence}/taxonomy.html (100%) diff --git a/layouts/persistence_support/taxonomy.html b/layouts/persistence/taxonomy.html similarity index 100% rename from layouts/persistence_support/taxonomy.html rename to layouts/persistence/taxonomy.html diff --git a/scripts/persistence/create_persistence_docs.py b/scripts/persistence/create_persistence_docs.py index 9e2d119c69..ceac0546a2 100644 --- a/scripts/persistence/create_persistence_docs.py +++ b/scripts/persistence/create_persistence_docs.py @@ -118,7 +118,7 @@ def update_frontmatter(statuses: dict): content = frontmatter.load(_path, handler=CustomYAMLHandler()) desc = content.metadata["description"] content.metadata["description"] = desc.strip() - content.metadata["persistence_support"] = values.get("support", "unknown") + content.metadata["persistence"] = values.get("support", "unknown") frontmatter.dump(content, _path) From e020a7adc7492f822de12e5a34dba06cfcd64658 Mon Sep 17 00:00:00 2001 From: Giovanni Grano Date: Thu, 16 May 2024 15:36:11 -0400 Subject: [PATCH 21/25] Marcel suggestions The only things left is the limitations in the user guides. --- .../state-management/cloud-pods/index.md | 2 +- .../state-management/support/index.md | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/content/en/user-guide/state-management/cloud-pods/index.md b/content/en/user-guide/state-management/cloud-pods/index.md index fef8c3ace6..b0cb4e9c75 100644 --- a/content/en/user-guide/state-management/cloud-pods/index.md +++ b/content/en/user-guide/state-management/cloud-pods/index.md @@ -1,6 +1,6 @@ --- title: "Cloud Pods" -weight: 1 +weight: 2 description: Get started with Cloud Pods to manage the state of your LocalStack instance state aliases: - /user-guide/cloud-pods/getting-started/ diff --git a/content/en/user-guide/state-management/support/index.md b/content/en/user-guide/state-management/support/index.md index 932bdd18f2..2e455d7d00 100644 --- a/content/en/user-guide/state-management/support/index.md +++ b/content/en/user-guide/state-management/support/index.md @@ -1,10 +1,20 @@ --- -title: Persistence Support for AWS Services -linkTitle: Persistence Support -description: Overview of the persistence support across the implemented AWS services +title: Persistence Coverage for AWS Services +linkTitle: Persistence Coverage +description: Overview of the persistence coverage across the implemented AWS services hide_readingtime: true +weight: 1 +tags: ["Pro Image"] --- -## Persistence Support Overview +## Persistence Coverage Overview {{< localstack_persistence_table >}} + +### Terminology + +- **Persistence Test Suite**: tested by LocalStack's internal persistence test suite. +To test persistence, we use an approach similar to snapshot parity test: +we first record API responses from LocalStack, we then reset and restore the snapshotted state, +and finally verify that the same API responses matches with the initial ones. + From 53b7ba7e923c61f517f8ed5d53a89576caf5188a Mon Sep 17 00:00:00 2001 From: Giovanni Grano Date: Thu, 16 May 2024 16:13:45 -0400 Subject: [PATCH 22/25] adding link to the services --- layouts/partials/persistence/persistence_table_row.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layouts/partials/persistence/persistence_table_row.html b/layouts/partials/persistence/persistence_table_row.html index 1f42208fff..633c8cf262 100644 --- a/layouts/partials/persistence/persistence_table_row.html +++ b/layouts/partials/persistence/persistence_table_row.html @@ -1,6 +1,6 @@ - {{ .full_name }} + {{ .full_name }} {{ if or (eq .support "supported") (eq .support "supported with limitations") -}} From c33180d2d50379811df634df626f9ed799db9a9c Mon Sep 17 00:00:00 2001 From: Giovanni Grano Date: Fri, 17 May 2024 10:38:44 -0400 Subject: [PATCH 23/25] adding service pages --- content/en/user-guide/aws/amplify/index.md | 5 +++-- content/en/user-guide/aws/apigateway/index.md | 5 +++-- content/en/user-guide/aws/backup/index.md | 2 ++ content/en/user-guide/aws/cloudfront/index.md | 5 +++-- content/en/user-guide/aws/cloudtrail/index.md | 5 +++-- content/en/user-guide/aws/cloudwatch/index.md | 4 +++- content/en/user-guide/aws/codecommit/index.md | 5 +++-- content/en/user-guide/aws/cognito/index.md | 5 +++-- content/en/user-guide/aws/config/index.md | 5 +++-- content/en/user-guide/aws/dynamodb/index.md | 2 ++ content/en/user-guide/aws/ecr/index.md | 5 +++-- content/en/user-guide/aws/elasticache/index.md | 7 ++++--- content/en/user-guide/aws/glacier/index.md | 2 ++ content/en/user-guide/aws/iam/index.md | 5 +++-- content/en/user-guide/aws/kinesis/index.md | 5 +++-- content/en/user-guide/aws/kms/index.md | 5 +++-- content/en/user-guide/aws/lambda/index.md | 13 +++++++------ content/en/user-guide/aws/logs/index.md | 4 +++- content/en/user-guide/aws/msk/index.md | 5 +++-- content/en/user-guide/aws/rds/index.md | 5 +++-- content/en/user-guide/aws/route53/index.md | 2 ++ content/en/user-guide/aws/route53resolver/index.md | 2 ++ content/en/user-guide/aws/s3/index.md | 5 +++-- content/en/user-guide/aws/secretsmanager/index.md | 5 +++-- content/en/user-guide/aws/sns/index.md | 5 +++-- content/en/user-guide/aws/sqs/index.md | 7 ++++--- content/en/user-guide/aws/textract/index.md | 2 ++ content/en/user-guide/aws/timestream/index.md | 7 ++++--- content/en/user-guide/aws/transcribe/index.md | 2 ++ 29 files changed, 87 insertions(+), 49 deletions(-) diff --git a/content/en/user-guide/aws/amplify/index.md b/content/en/user-guide/aws/amplify/index.md index ac52f08eca..d6dc0aed3e 100644 --- a/content/en/user-guide/aws/amplify/index.md +++ b/content/en/user-guide/aws/amplify/index.md @@ -1,9 +1,10 @@ --- title: "Amplify" linkTitle: "Amplify" -description: > - Get started with Amplify on LocalStack +description: Get started with Amplify on LocalStack tags: ["Pro image"] +persistence: supported + --- ## Introduction diff --git a/content/en/user-guide/aws/apigateway/index.md b/content/en/user-guide/aws/apigateway/index.md index a98fbe4374..265b2a59d5 100644 --- a/content/en/user-guide/aws/apigateway/index.md +++ b/content/en/user-guide/aws/apigateway/index.md @@ -1,9 +1,10 @@ --- title: "API Gateway" linkTitle: "API Gateway" -description: > - Get started with API Gateway on LocalStack +description: Get started with API Gateway on LocalStack tags: ["Pro image"] +persistence: supported + --- ## Introduction diff --git a/content/en/user-guide/aws/backup/index.md b/content/en/user-guide/aws/backup/index.md index 992c01a3ee..4144ef0b8c 100644 --- a/content/en/user-guide/aws/backup/index.md +++ b/content/en/user-guide/aws/backup/index.md @@ -3,6 +3,8 @@ title: "Backup" linkTitle: "Backup" description: Get started with Backup on LocalStack tags: ["Pro image"] +persistence: supported + --- ## Introduction diff --git a/content/en/user-guide/aws/cloudfront/index.md b/content/en/user-guide/aws/cloudfront/index.md index d4a39014fc..6c60a218fd 100644 --- a/content/en/user-guide/aws/cloudfront/index.md +++ b/content/en/user-guide/aws/cloudfront/index.md @@ -1,9 +1,10 @@ --- title: "CloudFront" linkTitle: "CloudFront" -description: > - Get started with CloudFront on LocalStack +description: Get started with CloudFront on LocalStack tags: ["Pro image"] +persistence: supported + --- ## Introduction diff --git a/content/en/user-guide/aws/cloudtrail/index.md b/content/en/user-guide/aws/cloudtrail/index.md index 71a66a8843..4d221d927d 100644 --- a/content/en/user-guide/aws/cloudtrail/index.md +++ b/content/en/user-guide/aws/cloudtrail/index.md @@ -1,9 +1,10 @@ --- title: "CloudTrail" linkTitle: "CloudTrail" -description: > - Get started with CloudTrail on LocalStack +description: Get started with CloudTrail on LocalStack tags: ["Pro image"] +persistence: supported + --- ## Introduction diff --git a/content/en/user-guide/aws/cloudwatch/index.md b/content/en/user-guide/aws/cloudwatch/index.md index 6b1022b096..6fe796e8fd 100644 --- a/content/en/user-guide/aws/cloudwatch/index.md +++ b/content/en/user-guide/aws/cloudwatch/index.md @@ -3,7 +3,9 @@ title: "CloudWatch" linkTitle: "CloudWatch" description: Get started with AWS CloudWatch on LocalStack aliases: - - /aws/cloudwatch/ +- /aws/cloudwatch/ +persistence: supported + --- CloudWatch is a comprehensive monitoring and observability service that Amazon Web Services (AWS) provides. It allows you to collect and track metrics, collect and monitor log files, and set alarms. CloudWatch provides valuable insights into your AWS resources, applications, and services, enabling you to troubleshoot issues, optimize performance, and make informed decisions. diff --git a/content/en/user-guide/aws/codecommit/index.md b/content/en/user-guide/aws/codecommit/index.md index c8e584fe00..f1ed7518a0 100644 --- a/content/en/user-guide/aws/codecommit/index.md +++ b/content/en/user-guide/aws/codecommit/index.md @@ -1,9 +1,10 @@ --- title: "CodeCommit" linkTitle: "CodeCommit" -description: > - Get started with CodeCommit on LocalStack +description: Get started with CodeCommit on LocalStack tags: ["Pro image"] +persistence: supported + --- ## Introduction diff --git a/content/en/user-guide/aws/cognito/index.md b/content/en/user-guide/aws/cognito/index.md index 5718b18128..0d0844d6e5 100644 --- a/content/en/user-guide/aws/cognito/index.md +++ b/content/en/user-guide/aws/cognito/index.md @@ -1,9 +1,10 @@ --- title: "Cognito" linkTitle: "Cognito" -description: > - Get started with Cognito on LocalStack +description: Get started with Cognito on LocalStack tags: ["Pro image"] +persistence: supported + --- ## Introduction diff --git a/content/en/user-guide/aws/config/index.md b/content/en/user-guide/aws/config/index.md index 7eba9eb452..795a2e84d8 100644 --- a/content/en/user-guide/aws/config/index.md +++ b/content/en/user-guide/aws/config/index.md @@ -1,8 +1,9 @@ --- title: "Config" linkTitle: "Config" -description: > - Get started with Config on LocalStack +description: Get started with Config on LocalStack +persistence: supported + --- ## Introduction diff --git a/content/en/user-guide/aws/dynamodb/index.md b/content/en/user-guide/aws/dynamodb/index.md index 88842bb030..476d8fa4e8 100644 --- a/content/en/user-guide/aws/dynamodb/index.md +++ b/content/en/user-guide/aws/dynamodb/index.md @@ -2,6 +2,8 @@ title: DynamoDB linkTitle: DynamoDB description: Get started with DynamoDB on LocalStack +persistence: supported + --- DynamoDB is a fully managed NoSQL database service provided by AWS. diff --git a/content/en/user-guide/aws/ecr/index.md b/content/en/user-guide/aws/ecr/index.md index 33d6ae0d43..610306d350 100644 --- a/content/en/user-guide/aws/ecr/index.md +++ b/content/en/user-guide/aws/ecr/index.md @@ -1,9 +1,10 @@ --- title: "Elastic Container Registry (ECR)" linkTitle: "Elastic Container Registry (ECR)" -description: > - Get started with Elastic Container Registry (ECR) on LocalStack +description: Get started with Elastic Container Registry (ECR) on LocalStack tags: ["Pro image"] +persistence: supported + --- ## Introduction diff --git a/content/en/user-guide/aws/elasticache/index.md b/content/en/user-guide/aws/elasticache/index.md index c7e3bd84cb..e8db1b0cb4 100644 --- a/content/en/user-guide/aws/elasticache/index.md +++ b/content/en/user-guide/aws/elasticache/index.md @@ -2,10 +2,11 @@ title: "ElastiCache" linkTitle: "ElastiCache" categories: ["LocalStack Pro"] -description: > - Get started with AWS ElastiCache on LocalStack +description: Get started with AWS ElastiCache on LocalStack aliases: - - /aws/elasticache/ +- /aws/elasticache/ +persistence: supported + --- ## Introduction diff --git a/content/en/user-guide/aws/glacier/index.md b/content/en/user-guide/aws/glacier/index.md index 2fdc559e30..3a91bb8a34 100644 --- a/content/en/user-guide/aws/glacier/index.md +++ b/content/en/user-guide/aws/glacier/index.md @@ -3,6 +3,8 @@ title: "Glacier" linkTitle: "Glacier" description: Get started with S3 Glacier on LocalStack tags: ["Pro image"] +persistence: supported + --- ## Introduction diff --git a/content/en/user-guide/aws/iam/index.md b/content/en/user-guide/aws/iam/index.md index e895222fe5..7e3f9aecf1 100644 --- a/content/en/user-guide/aws/iam/index.md +++ b/content/en/user-guide/aws/iam/index.md @@ -1,8 +1,9 @@ --- title: "Identity and Access Management (IAM)" linkTitle: "Identity and Access Management (IAM)" -description: > - Get started with AWS Identity and Access Management (IAM) on LocalStack +description: Get started with AWS Identity and Access Management (IAM) on LocalStack +persistence: supported + --- ## Introduction diff --git a/content/en/user-guide/aws/kinesis/index.md b/content/en/user-guide/aws/kinesis/index.md index ea3db6f88c..a9a6a8d255 100644 --- a/content/en/user-guide/aws/kinesis/index.md +++ b/content/en/user-guide/aws/kinesis/index.md @@ -1,8 +1,9 @@ --- title: "Kinesis" linkTitle: "Kinesis" -description: > - Get started with Kinesis on LocalStack +description: Get started with Kinesis on LocalStack +persistence: supported + --- ## Introduction diff --git a/content/en/user-guide/aws/kms/index.md b/content/en/user-guide/aws/kms/index.md index 7f12a52d05..b50b45cb83 100644 --- a/content/en/user-guide/aws/kms/index.md +++ b/content/en/user-guide/aws/kms/index.md @@ -1,8 +1,9 @@ --- title: "Key Management Service (KMS)" linkTitle: "Key Management Service (KMS)" -description: > - Get started with Key Management Service (KMS) on LocalStack +description: Get started with Key Management Service (KMS) on LocalStack +persistence: supported + --- ## Introduction diff --git a/content/en/user-guide/aws/lambda/index.md b/content/en/user-guide/aws/lambda/index.md index cbaf392af8..c3434750e0 100644 --- a/content/en/user-guide/aws/lambda/index.md +++ b/content/en/user-guide/aws/lambda/index.md @@ -1,13 +1,14 @@ --- title: "Lambda" linkTitle: "Lambda" -description: > - Get started with Lambda on LocalStack +description: Get started with Lambda on LocalStack aliases: - - /references/lambda-executors/ - - /references/lambda-provider-v2/ - - /references/lambda-asf-provider/ - - /references/lambda-v2-provider/ +- /references/lambda-executors/ +- /references/lambda-provider-v2/ +- /references/lambda-asf-provider/ +- /references/lambda-v2-provider/ +persistence: supported with limitations + --- ## Introduction diff --git a/content/en/user-guide/aws/logs/index.md b/content/en/user-guide/aws/logs/index.md index 64f3f0179c..0c02143a92 100644 --- a/content/en/user-guide/aws/logs/index.md +++ b/content/en/user-guide/aws/logs/index.md @@ -3,7 +3,9 @@ title: "CloudWatch Logs" linkTitle: "CloudWatch Logs" description: Get started with AWS CloudWatch Logs on LocalStack aliases: - - /aws/logs/ +- /aws/logs/ +persistence: supported + --- [CloudWatch Logs](https://docs.aws.amazon.com/cloudwatch/index.html) allows to store and retrieve logs. While some services automatically create and write logs (e.g. Lambda), logs can also be added manually. diff --git a/content/en/user-guide/aws/msk/index.md b/content/en/user-guide/aws/msk/index.md index 44b99537b4..71a0d886f0 100644 --- a/content/en/user-guide/aws/msk/index.md +++ b/content/en/user-guide/aws/msk/index.md @@ -1,9 +1,10 @@ --- title: "Managed Streaming for Kafka (MSK)" linkTitle: "Managed Streaming for Kafka (MSK)" -description: > - Get started with Managed Streaming for Kafka (MSK) on LocalStack +description: Get started with Managed Streaming for Kafka (MSK) on LocalStack tags: ["Pro image"] +persistence: supported with limitations + --- ## Introduction diff --git a/content/en/user-guide/aws/rds/index.md b/content/en/user-guide/aws/rds/index.md index 0f76660c6f..9d02b6869c 100644 --- a/content/en/user-guide/aws/rds/index.md +++ b/content/en/user-guide/aws/rds/index.md @@ -1,9 +1,10 @@ --- title: "Relational Database Service (RDS)" linkTitle: "Relational Database Service (RDS)" -description: > - Get started with Relational Database Service (RDS) on LocalStack +description: Get started with Relational Database Service (RDS) on LocalStack tags: ["Pro image"] +persistence: supported with limitations + --- ## Introduction diff --git a/content/en/user-guide/aws/route53/index.md b/content/en/user-guide/aws/route53/index.md index 544c269837..cf9d8fd84b 100644 --- a/content/en/user-guide/aws/route53/index.md +++ b/content/en/user-guide/aws/route53/index.md @@ -2,6 +2,8 @@ title: "Route 53" linkTitle: "Route 53" description: Get started with Route 53 on LocalStack +persistence: supported + --- ## Introduction diff --git a/content/en/user-guide/aws/route53resolver/index.md b/content/en/user-guide/aws/route53resolver/index.md index 8798117257..152bac96f0 100644 --- a/content/en/user-guide/aws/route53resolver/index.md +++ b/content/en/user-guide/aws/route53resolver/index.md @@ -2,6 +2,8 @@ title: "Route 53 Resolver" linkTitle: "Route 53 Resolver" description: Get started with Route 53 Resolver on LocalStack +persistence: supported + --- ## Introduction diff --git a/content/en/user-guide/aws/s3/index.md b/content/en/user-guide/aws/s3/index.md index 2db24bbde6..f9caf1d169 100644 --- a/content/en/user-guide/aws/s3/index.md +++ b/content/en/user-guide/aws/s3/index.md @@ -1,8 +1,9 @@ --- title: "Simple Storage Service (S3)" linkTitle: "Simple Storage Service (S3)" -description: > - Get started with Amazon S3 on LocalStack +description: Get started with Amazon S3 on LocalStack +persistence: supported + --- ## Introduction diff --git a/content/en/user-guide/aws/secretsmanager/index.md b/content/en/user-guide/aws/secretsmanager/index.md index edf502757b..c693d22cf2 100644 --- a/content/en/user-guide/aws/secretsmanager/index.md +++ b/content/en/user-guide/aws/secretsmanager/index.md @@ -1,8 +1,9 @@ --- title: "Secrets Manager" linkTitle: "Secrets Manager" -description: > - Get started with Secrets Manager on LocalStack +description: Get started with Secrets Manager on LocalStack +persistence: supported + --- ## Introduction diff --git a/content/en/user-guide/aws/sns/index.md b/content/en/user-guide/aws/sns/index.md index 8ca5553fea..938286c3ef 100644 --- a/content/en/user-guide/aws/sns/index.md +++ b/content/en/user-guide/aws/sns/index.md @@ -1,8 +1,9 @@ --- title: "Simple Notification Service (SNS)" linkTitle: "Simple Notification Service (SNS)" -description: > - Get started with Simple Notification Service (SNS) on LocalStack +description: Get started with Simple Notification Service (SNS) on LocalStack +persistence: supported + --- Simple Notification Service (SNS) is a serverless messaging service that can distribute a massive number of messages to multiple subscribers and can be used to send messages to mobile devices, email addresses, and HTTP(s) endpoints. SNS employs the Publish/Subscribe, an asynchronous messaging pattern that decouples services that produce events from services that process events. diff --git a/content/en/user-guide/aws/sqs/index.md b/content/en/user-guide/aws/sqs/index.md index 3d0d2fb6b6..d414d7c06e 100644 --- a/content/en/user-guide/aws/sqs/index.md +++ b/content/en/user-guide/aws/sqs/index.md @@ -1,9 +1,10 @@ --- title: "Simple Queue Service (SQS)" -description: > - Get started with Simple Queue Service (SQS) on LocalStack +description: Get started with Simple Queue Service (SQS) on LocalStack aliases: - - /aws/sqs/ +- /aws/sqs/ +persistence: supported + --- ## Introduction diff --git a/content/en/user-guide/aws/textract/index.md b/content/en/user-guide/aws/textract/index.md index 745255d367..e04b5cb40e 100644 --- a/content/en/user-guide/aws/textract/index.md +++ b/content/en/user-guide/aws/textract/index.md @@ -3,6 +3,8 @@ title: "Textract" linkTitle: "Textract" description: Get started with Textract on LocalStack tags: ["Pro image"] +persistence: supported + --- Textract is a machine learning service that automatically extracts text, forms, and tables from scanned documents. It simplifies the process of extracting valuable information from a variety of document types, enabling applications to quickly analyze and understand document content. diff --git a/content/en/user-guide/aws/timestream/index.md b/content/en/user-guide/aws/timestream/index.md index 27025681d2..c4ac1c7bb6 100644 --- a/content/en/user-guide/aws/timestream/index.md +++ b/content/en/user-guide/aws/timestream/index.md @@ -1,9 +1,10 @@ --- title: "Timestream" linkTitle: "Timestream" -description: > - Get started with Timestream on LocalStack +description: Get started with Timestream on LocalStack tags: ["Pro image"] +persistence: supported + --- ## Introduction @@ -71,4 +72,4 @@ The Resource Browser allows you to perform the following actions: LocalStack's Timestream implementation is under active development and only supports a limited set of operations, please refer to the API Coverage pages for an up-to-date list of implemented and tested functions within [Timestream-Query](https://docs.localstack.cloud/references/coverage/coverage_timestream-query/) and [Timestream-Write](https://docs.localstack.cloud/references/coverage/coverage_timestream-write/). -If you have a usecase that uses Timestream but doesn't work with our implementation yet, we encourage you to [get in touch](https://localstack.cloud/contact/), so we can streamline any operations you rely on. \ No newline at end of file +If you have a usecase that uses Timestream but doesn't work with our implementation yet, we encourage you to [get in touch](https://localstack.cloud/contact/), so we can streamline any operations you rely on. diff --git a/content/en/user-guide/aws/transcribe/index.md b/content/en/user-guide/aws/transcribe/index.md index 01f51cc4af..e80eb26ea4 100644 --- a/content/en/user-guide/aws/transcribe/index.md +++ b/content/en/user-guide/aws/transcribe/index.md @@ -2,6 +2,8 @@ title: "Transcribe" linkTitle: "Transcribe" description: Get started with Amazon Transcribe on LocalStack +persistence: supported + --- ## Introduction From 70989de619a7d0b21da589f3d4911a14f28e4b76 Mon Sep 17 00:00:00 2001 From: Giovanni Grano Date: Fri, 17 May 2024 10:39:19 -0400 Subject: [PATCH 24/25] removing weight --- content/en/user-guide/state-management/support/index.md | 1 - 1 file changed, 1 deletion(-) diff --git a/content/en/user-guide/state-management/support/index.md b/content/en/user-guide/state-management/support/index.md index 2e455d7d00..0c345dcc96 100644 --- a/content/en/user-guide/state-management/support/index.md +++ b/content/en/user-guide/state-management/support/index.md @@ -3,7 +3,6 @@ title: Persistence Coverage for AWS Services linkTitle: Persistence Coverage description: Overview of the persistence coverage across the implemented AWS services hide_readingtime: true -weight: 1 tags: ["Pro Image"] --- From 2990176ac4c849181d5c52cb0686ffb92d37f362 Mon Sep 17 00:00:00 2001 From: Giovanni Grano Date: Fri, 17 May 2024 10:49:51 -0400 Subject: [PATCH 25/25] explicitly mentioning that limitation is synced with docs --- scripts/persistence/notion/catalog.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/persistence/notion/catalog.py b/scripts/persistence/notion/catalog.py index 255dc92954..7481aba55d 100644 --- a/scripts/persistence/notion/catalog.py +++ b/scripts/persistence/notion/catalog.py @@ -21,7 +21,7 @@ class PersistenceServiceItem(Page): has_test = Checkbox("Persistence Tests") primary_owner = PeopleProperty("Primary Owner") secondary_owner = PeopleProperty("Secondary Owner(s)") - limitations = Text("Limitations") + limitations = Text("Limitations (synced with docs)") class PersistenceCatalog(Database[PersistenceServiceItem]):